diff --git a/README.md b/README.md index 78a21cb..07857bc 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ La connexion à la base postgresql est configurée à l'aide des variables d'env |-----------------------|--------------------|-------------------|--------------------| | Géoportail | Flux WFS | Cadastre
RPG
Nature
WFS-Geoportail | [Geoservices](https://geoservices.ign.fr/services-web-experts) | | GPU | Flux WFS | GPU | [Géoportail de l'urbanisme](https://www.geoportail-urbanisme.gouv.fr/) | -| Base adresse nationale | v4.0.0 | Codes Postaux | [BAN](https://github.com/baseadressenationale/codes-postaux) | +| Base adresse nationale | v4.1.1 | Codes Postaux | [BAN](https://github.com/baseadressenationale/codes-postaux) | | Base des appellations viticoles | Flux WFS | Appellations viticoles | [FranceAgriMer](https://www.franceagrimer.fr/filieres-Vin-et-cidre/Vin/Professionnels/Teleprocedures) | diff --git a/controllers/cadastre/index.js b/controllers/cadastre/index.js index 5a645cc..63eed67 100644 --- a/controllers/cadastre/index.js +++ b/controllers/cadastre/index.js @@ -74,6 +74,20 @@ function createCadastreProxy(featureTypeName){ feature.properties.code_insee = feature.properties.code_dep+feature.properties.code_com; } }); + if(featureCollection.links && featureCollection.links.length) { + for(let i in featureCollection.links) { + if(featureCollection.links[i].href && featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)) { + let num = featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)[0].replace('STARTINDEX=',''); + let href = req.gppWfsClient.headers.Referer.replace(/\/api.*/, '') + req.originalUrl; + if(href.match('_start')) { + href = href.replace(/_start\=[0-9]*/, '_start=' + num); + } else { + href += '&_start=' + num; + } + featureCollection.links[i].href = href; + } + } + } return featureCollection; }) .then(function(featureCollection) { diff --git a/controllers/er/index.js b/controllers/er/index.js index 372fb49..bf3349b 100644 --- a/controllers/er/index.js +++ b/controllers/er/index.js @@ -127,7 +127,7 @@ function createErProxy(featureTypeName,typeSearch){ params.title = params.title.toUpperCase(); } if (params.zip_codes) { - params.zip_codes = '"[\\"'+ params.zip_codes.replace(',' , ',\\"') + '\\"]"'; + params.zip_codes = '["'+ params.zip_codes.replace(',' , '","') + '"]'; } } /* Value default pour _limit an _start */ diff --git a/controllers/nature/index.js b/controllers/nature/index.js index b17ddc6..f71757c 100644 --- a/controllers/nature/index.js +++ b/controllers/nature/index.js @@ -27,12 +27,31 @@ function createNaturaProxy(featureTypeName){ /* requête WFS GPP*/ req.gppWfsClient.getFeatures(featureTypeName, params) + /* uniformisation des attributs en sortie */ + .then(function(featureCollection){ + if(featureCollection.links && featureCollection.links.length) { + for(let i in featureCollection.links) { + if(featureCollection.links[i].href && featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)) { + let num = featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)[0].replace('STARTINDEX=',''); + let href = req.gppWfsClient.headers.Referer.replace(/\/api.*/, '') + req.originalUrl; + if(href.match('_start')) { + href = href.replace(/_start\=[0-9]*/, '_start=' + num); + } else { + href += '&_start=' + num; + } + featureCollection.links[i].href = href; + } + } + } + return featureCollection; + }) .then(function(featureCollection) { res.json(featureCollection); }) .catch(function(err) { res.status(500).json(err); - }); + }) + ; } ]; } diff --git a/controllers/rpg/index.js b/controllers/rpg/index.js index 909838c..a474cb7 100644 --- a/controllers/rpg/index.js +++ b/controllers/rpg/index.js @@ -5,7 +5,9 @@ import validateParams from '../../middlewares/validateParams.js'; import isGeometry from '../../checker/isGeometry.js'; import gppWfsClient from '../../middlewares/gppWfsClient.js'; import _ from 'lodash'; +import NodeCache from 'node-cache'; +const myCache = new NodeCache(); var router = new Router(); const lastYearRPG = 2022; @@ -50,24 +52,109 @@ function createRpgProxy(valeurSearch) { /* Value default pour _limit an _start */ if ( typeof params._start == 'undefined' ) {params._start = 0;} if( typeof params._limit == 'undefined') {params._limit = 1000;} - - /* requête WFS GPP*/ - req.gppWfsClient.getFeatures(featureTypeName, params) - /* uniformisation des attributs en sortie */ - .then(function(featureCollection){ - return featureCollection; - }) - .then(function(featureCollection) { - res.json(featureCollection); - }) - .catch(function(err) { - res.status(500).json(err); - }) - ; + + //recherche dans le cache + if(myCache.get(featureTypeName)) { + req.gppWfsClient.defaultGeomFieldName = myCache.get(featureTypeName)[0]; + req.gppWfsClient.defaultCRS = myCache.get(featureTypeName)[1]; + + //récupération des features + getFeat(req, res, featureTypeName, params); + } + else { + /* requête WFS GPP*/ + req.gppWfsClient.getDescribeFeatureType(featureTypeName) + //récupération du geomFieldName + .then(function(featureCollection) { + var nom_geom = false; + for(var i in featureCollection.featureTypes[0].properties) { + if(featureCollection.featureTypes[0].properties[i].name == 'geom' + || featureCollection.featureTypes[0].properties[i].name == 'the_geom') + { + nom_geom = featureCollection.featureTypes[0].properties[i].name; + break; + } + } + if(!nom_geom) { + for(var i in featureCollection.featureTypes[0].properties) { + if(featureCollection.featureTypes[0].properties[i].type.match('Point') + || featureCollection.featureTypes[0].properties[i].type.match('Polygon') + || featureCollection.featureTypes[0].properties[i].type.match('LineString')) + { + nom_geom = featureCollection.featureTypes[0].properties[i].name; + } + } + } + + req.gppWfsClient.defaultGeomFieldName = nom_geom; + + //récupération du CRS + req.gppWfsClient.getCapabilities() + .then(function(response){ + var crs = 'urn:ogc:def:crs:EPSG::4326'; + var regexp = new RegExp('' + featureTypeName + '.*?<\/DefaultCRS>'); + if(response.match(regexp)) { + var feat = response.match(regexp)[0]; + if(feat.match(/EPSG::[0-9]{4,5}/)) { + crs = feat.match(/EPSG::[0-9]{4,5}/)[0].replace('::',':'); + } + } + if(crs == 'EPSG:4326') { + crs = 'urn:ogc:def:crs:EPSG::4326'; + } + req.gppWfsClient.defaultCRS = crs; + + //maj du cache + myCache.set(featureTypeName, [nom_geom, crs]); + + //récupération des features + getFeat(req, res, featureTypeName, params); + }) + .catch(function(err) { + res.status(500).json(err); + }) + ; + + + }) + .catch(function(err) { + res.status(500).json(err); + }) + ; + } } ]; } +var getFeat = function(req, res, featureTypeName, params) { + req.gppWfsClient.getFeatures(featureTypeName, params) + /* uniformisation des attributs en sortie */ + .then(function(featureCollection){ + if(featureCollection.links && featureCollection.links.length) { + for(let i in featureCollection.links) { + if(featureCollection.links[i].href && featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)) { + let num = featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)[0].replace('STARTINDEX=',''); + let href = req.gppWfsClient.headers.Referer.replace(/\/api.*/, '') + req.originalUrl; + if(href.match('_start')) { + href = href.replace(/_start\=[0-9]*/, '_start=' + num); + } else { + href += '&_start=' + num; + } + featureCollection.links[i].href = href; + } + } + } + return featureCollection; + }) + .then(function(featureCollection) { + res.json(featureCollection); + }) + .catch(function(err) { + res.status(500).json(err); + }) + ; +}; + var corsOptionsGlobal = function(origin,callback) { var corsOptions; if (origin) { diff --git a/controllers/wfs-geoportail/index.js b/controllers/wfs-geoportail/index.js index 921aad9..5e8b83e 100644 --- a/controllers/wfs-geoportail/index.js +++ b/controllers/wfs-geoportail/index.js @@ -5,7 +5,9 @@ import validateParams from '../../middlewares/validateParams.js'; import isGeometry from '../../checker/isGeometry.js'; import gppWfsClient from '../../middlewares/gppWfsClient.js'; import _ from 'lodash'; +import NodeCache from 'node-cache'; +const myCache = new NodeCache(); var router = new Router(); @@ -19,34 +21,119 @@ function createWfsProxy() { validateParams, function(req,res){ var params = matchedData(req); - var featureTypeName= params.source; + var featureTypeName = params.source; params = _.omit(params,'source'); /* Value default pour _limit an _start */ if ( typeof params._start == 'undefined' ) {params._start = 0;} if( typeof params._limit == 'undefined') {params._limit = 1000;} - - /* requête WFS GPP*/ - req.gppWfsClient.getFeatures(featureTypeName, params) - /* uniformisation des attributs en sortie */ - .then(function(featureCollection){ - featureCollection.features.forEach(function(feature){ - if ( ! feature.properties.code_insee ){ - feature.properties.code_insee = feature.properties.code_dep+feature.properties.code_com; + + //recherche dans le cache + if(myCache.get(featureTypeName)) { + req.gppWfsClient.defaultGeomFieldName = myCache.get(featureTypeName)[0]; + req.gppWfsClient.defaultCRS = myCache.get(featureTypeName)[1]; + + //récupération des features + getFeat(req, res, featureTypeName, params); + } + else { + /* requête WFS GPP*/ + req.gppWfsClient.getDescribeFeatureType(featureTypeName) + //récupération du geomFieldName + .then(function(featureCollection) { + var nom_geom = false; + for(var i in featureCollection.featureTypes[0].properties) { + if(featureCollection.featureTypes[0].properties[i].name == 'geom' + || featureCollection.featureTypes[0].properties[i].name == 'the_geom') + { + nom_geom = featureCollection.featureTypes[0].properties[i].name; + break; + } + } + if(!nom_geom) { + for(var i in featureCollection.featureTypes[0].properties) { + if(featureCollection.featureTypes[0].properties[i].type.match('Point') + || featureCollection.featureTypes[0].properties[i].type.match('Polygon') + || featureCollection.featureTypes[0].properties[i].type.match('LineString')) + { + nom_geom = featureCollection.featureTypes[0].properties[i].name; + } + } } - }); - return featureCollection; - }) - .then(function(featureCollection) { - res.json(featureCollection); - }) - .catch(function(err) { - res.status(500).json(err); - }) - ; + + req.gppWfsClient.defaultGeomFieldName = nom_geom; + + //récupération du CRS + req.gppWfsClient.getCapabilities() + .then(function(response){ + var crs = 'urn:ogc:def:crs:EPSG::4326'; + var regexp = new RegExp('' + featureTypeName + '.*?<\/DefaultCRS>'); + if(response.match(regexp)) { + var feat = response.match(regexp)[0]; + if(feat.match(/EPSG::[0-9]{4,5}/)) { + crs = feat.match(/EPSG::[0-9]{4,5}/)[0].replace('::',':'); + } + } + if(crs == 'EPSG:4326') { + crs = 'urn:ogc:def:crs:EPSG::4326'; + } + req.gppWfsClient.defaultCRS = crs; + + //maj du cache + myCache.set(featureTypeName, [nom_geom, crs]); + + //récupération des features + getFeat(req, res, featureTypeName, params); + }) + .catch(function(err) { + res.status(500).json(err); + }) + ; + + + }) + .catch(function(err) { + res.status(500).json(err); + }) + ; + } } ]; } +var getFeat = function(req, res, featureTypeName, params) { + req.gppWfsClient.getFeatures(featureTypeName, params) + /* uniformisation des attributs en sortie */ + .then(function(featureCollection){ + featureCollection.features.forEach(function(feature){ + if ( ! feature.properties.code_insee ){ + feature.properties.code_insee = feature.properties.code_dep+feature.properties.code_com; + } + }); + if(featureCollection.links && featureCollection.links.length) { + for(let i in featureCollection.links) { + if(featureCollection.links[i].href && featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)) { + let num = featureCollection.links[i].href.match(/STARTINDEX\=[0-9]*/)[0].replace('STARTINDEX=',''); + let href = req.gppWfsClient.headers.Referer.replace(/\/api.*/, '') + req.originalUrl; + if(href.match('_start')) { + href = href.replace(/_start\=[0-9]*/, '_start=' + num); + } else { + href += '&_start=' + num; + } + featureCollection.links[i].href = href; + } + } + } + return featureCollection; + }) + .then(function(featureCollection) { + res.json(featureCollection); + }) + .catch(function(err) { + res.status(500).json(err); + }) + ; +}; + var corsOptionsGlobal = function(origin,callback) { var corsOptions; diff --git a/datasets/appellations-viticoles/config.js b/datasets/appellations-viticoles/config.js index ed78389..e79fd9e 100644 --- a/datasets/appellations-viticoles/config.js +++ b/datasets/appellations-viticoles/config.js @@ -1,5 +1,5 @@ var aocConfig = { - version: '8 mars 2023', + version: '16 mai 2024', modules: ["Appellations viticoles"], nom_url :"FranceAgriMer", url: 'https://www.franceagrimer.fr/filieres-vin-et-cidre/vin/professionnels/teleprocedures' diff --git a/datasets/base-adresse-nationale/config.js b/datasets/base-adresse-nationale/config.js index 789f2c2..2cce12d 100644 --- a/datasets/base-adresse-nationale/config.js +++ b/datasets/base-adresse-nationale/config.js @@ -1,5 +1,5 @@ var banConfig = { - version: 'v4.0.0', + version: 'v4.1.1', modules: ["Codes Postaux"], nom_url :"BAN", url: 'https://github.com/baseadressenationale/codes-postaux' diff --git a/doc/views/index.ejs b/doc/views/index.ejs index 18f63b3..f813c0c 100644 --- a/doc/views/index.ejs +++ b/doc/views/index.ejs @@ -95,7 +95,7 @@ - WFS-Geoportail (Version bêta) + WFS-Geoportail API d'accès à n'importe quel flux WFS du Géoportail diff --git a/doc/views/partial/menu.ejs b/doc/views/partial/menu.ejs index 1b0d2bb..713b823 100644 --- a/doc/views/partial/menu.ejs +++ b/doc/views/partial/menu.ejs @@ -34,7 +34,7 @@ RPG
  • - WFS-Geoportail (Version Bêta) + WFS-Geoportail
  • Nature diff --git a/doc/wfs-geoportail.yml b/doc/wfs-geoportail.yml index 86fef85..cb73ed9 100644 --- a/doc/wfs-geoportail.yml +++ b/doc/wfs-geoportail.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: - title: Module pour rechercher dans tous les flux WFS Géoportail (Version Bêta) + title: Module pour rechercher dans tous les flux WFS Géoportail description: > Ce module permet d’intersecter toute couche WFS du géoportail exprimée dans le référentiel géographique WGS84 **EPSG:4326** avec la géométrie passée en paramètre. diff --git a/package-lock.json b/package-lock.json index 1832145..06cb7ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "apicarto", - "version": "v2.7.7", + "version": "v2.7.8", "lockfileVersion": 3, "requires": true, "packages": { @@ -22,11 +22,12 @@ "ejs": "^3.1.10", "express": "^4.19.2", "express-validator": "^7.1.0", - "geoportal-wfs-client": "https://github.com/IGNF/geoportal-wfs-client#v1.0.0", + "geoportal-wfs-client": "https://github.com/IGNF/geoportal-wfs-client#v1.0.3", "handlebars": "^4.7.7", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.4", "lodash": "^4.17.21", + "node-cache": "^5.1.2", "pg": "^8.11.5", "pg-format": "^1.0.4", "shelljs": "^0.8.5", @@ -771,14 +772,6 @@ "resolved": "https://registry.npmjs.org/@terraformer/wkt/-/wkt-2.2.1.tgz", "integrity": "sha512-XDUsW/lvbMzFi7GIuRD9+UqR4QyP+5C+TugeJLMDczKIRbaHoE9J3N8zLSdyOGmnJL9B6xTS3YMMlBnMU0Ar5A==" }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, "node_modules/@turf/along": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz", @@ -2950,6 +2943,14 @@ "node": ">=8" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/codes-postaux": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/codes-postaux/-/codes-postaux-4.1.1.tgz", @@ -4085,66 +4086,23 @@ } }, "node_modules/geoportal-wfs-client": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/IGNF/geoportal-wfs-client.git#8a34ce5bd805ffea13617f94bbcbef1ddc41538d", + "version": "1.0.3", + "resolved": "git+ssh://git@github.com/IGNF/geoportal-wfs-client.git#b1b50caef6622c6bd3673eb8c03b00357494174d", "dependencies": { "@turf/flip": "^6.5.0", "@turf/meta": "6.5.0", "@turf/turf": "^6.5.0", "@xmldom/xmldom": "^0.8.2", - "axios": "^0.27.2", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", + "axios": "^1.7.2", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "net": "^1.0.2", "proj4": "^2.8.0", "terraformer-wkt-parser": "^1.1.2", + "tls": "^0.0.1", "xpath": "0.0.32" } }, - "node_modules/geoportal-wfs-client/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/geoportal-wfs-client/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/geoportal-wfs-client/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/geoportal-wfs-client/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5481,6 +5439,22 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node_modules/net": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -7278,6 +7252,11 @@ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, + "node_modules/tls": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tls/-/tls-0.0.1.tgz", + "integrity": "sha512-GzHpG+hwupY8VMR6rYsnAhTHqT/97zT45PG8WD5eTT1lq+dFE0nN+1PYpsoBcHJgSmTz5ceK2Cv88IkPmIPOtQ==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", diff --git a/package.json b/package.json index 03df7ce..e3f10ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "apicarto", - "version": "v2.7.7", + "version": "v2.7.8", "main": "index.js", "type": "module", "scripts": { @@ -35,11 +35,12 @@ "ejs": "^3.1.10", "express": "^4.19.2", "express-validator": "^7.1.0", - "geoportal-wfs-client": "https://github.com/IGNF/geoportal-wfs-client#v1.0.0", + "geoportal-wfs-client": "https://github.com/IGNF/geoportal-wfs-client#v1.0.3", "handlebars": "^4.7.7", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.4", "lodash": "^4.17.21", + "node-cache": "^5.1.2", "pg": "^8.11.5", "pg-format": "^1.0.4", "shelljs": "^0.8.5", diff --git a/test/controllers/gpu/municipality.js b/test/controllers/gpu/municipality.js index b51a0a3..9548edf 100644 --- a/test/controllers/gpu/municipality.js +++ b/test/controllers/gpu/municipality.js @@ -45,5 +45,4 @@ describe('with point at [1.654399,48.112235] (Rennes)', function() { // .end(done); // }); // }); - // });