#1 Mon 14 March 2016 16:35
- RaphaelC
- Juste Inscrit !
- Lieu: Nice
- Date d'inscription: 21 Mar 2015
- Messages: 3
Connexion BDD PostGre-PostGIS et Leaflet
Bonjour à tous,
Premier message sur le fofo, en Licence pro Géomatique et Aménagement, je suis donc encore un jeune débutant
Actuellement en stage, je dois réaliser un portail cartographique web avec Leaflet et Angular JS (c'est un framwork).
Pour le moment je fonctionne avec une instal en local
J'ai déjà réussi à me connecter à une base de données PostGreSQL 9.4 avec PostGis 2.1 (en local donc...) afin de récupérer différentes couches dans Leaflet.
Jusque la pas de problème, puisque je récupère uniquement la géométrie dans le geoJson, et cela fonctionne !
Seulement dés que je veut récupérer des champs (fields) sur mes tables afin de créer des infobulles, j'ai quelques petites difficultés.
En fait je créé un service (dans Angular) qui se charge de se connecter à la BDD (avec le fameux fichier postgis_geojson.php : https://gist.github.com/bmcbride/1913855/). Ensuite il se charge de récupérer différents paramètres à intégrer dans le fichier geoJson :
Code:
.service('api', function($http){ var service = this; var baseUrl = 'postgis_geojson.php'; service.getJsonLayer = function(couche, srid, geomfield) { var params = { "geotable": couche, "srid": srid || "4326", "geomfield": geomfield || "geom" } return $http.get(baseUrl, {params: params}); }; })
Jusque la comme je disais pas de soucis, j'arrive bien à afficher mes couches.
Par contre dés que je rajoute une ligne dans les paramètres pour récupérer mes champs
"fields": fields.join(',')
Code:
.service('api', function($http){ var service = this; var baseUrl = 'postgis_geojson.php'; service.getJsonLayer = function(couche, fields, srid, geomfield) { var params = { "geotable": couche, "fields": fields.join(','), "srid": srid || "4326", "geomfield": geomfield || "geom" } return $http.get(baseUrl, {params: params}); }; })
j'ai un retour négatif dans la console de Chrome :
Code:
TypeError: Cannot read property 'join' of undefined at service.getJsonLayer (postgis.html:37) at new (postgis.html:64) at invoke (angular.js:3956) at Object.instantiate (angular.js:3967) at Object. (angular.js:3835) at Object.invoke (angular.js:3956) at angular.js:3798 at getService (angular.js:3920) at invoke (angular.js:3947) at Object.instantiate (angular.js:3967)
La ligne 64 de mon fichier html correspondant au moment ou j'appel ma couche et le champ "nom" :
Code:
api.getJsonLayer('limregl.pnm_coeur_25topo', ['nom']) .then(function(response)
Quelqu'un aurait il une idée sur la façon de procéder pour récupérer des champs pck je sèche la
Merci d'avance et bonne journée
Hors ligne
#2 Tue 15 March 2016 10:12
Re: Connexion BDD PostGre-PostGIS et Leaflet
Bonjour
Ici vous avez 4 paramètres:
Code:
service.getJsonLayer = function(couche, fields, srid, geomfield)
Et 2 ici.
Code:
api.getJsonLayer('limregl.pnm_coeur_25topo', ['nom'])
Hors ligne
#3 Tue 15 March 2016 15:23
- RaphaelC
- Juste Inscrit !
- Lieu: Nice
- Date d'inscription: 21 Mar 2015
- Messages: 3
Re: Connexion BDD PostGre-PostGIS et Leaflet
Bonjour Dof,
Et bien la solution n'était pas tout a fait ça, mais tu m'as mis sur la bonne piste !
Le SRID et le geomfield ne sont pas vraiment des paramètres à part entière puisqu'ils font partie de la couche pour la géométrie, ce n'est donc pas la peine de les rappeler à chaque fois.
En fait le problème venait d'autres couches plus bas dans mon code pour lesquelles je ne récupérait que la géométrie et aucune information de leur table attributaire.
Il faut de toute façon, même si on ne s'en sert pas, récupérer un champs. C'est tout de même assez étrange puisque ça surcharge le GeoJson, à creuser donc Mais tel quel ça marche.
Exemple pour cette couche ou je ne demandais que la géométrie et rien de plus :
Code:
return api.getJsonLayer('limregl.pnm_aa_25topo');
Comme ça, ça marche mieux
Code:
return api.getJsonLayer('limregl.pnm_aa_25topo', ['surface']);
Donc merci puisque sinon j'y serais peut être encore !
Au passage, j'ai fait un tour sur ton site (et ton git), pas mal d'infos intéressantes, j'y retournerai quand j'aurai un peu de temps !
Hors ligne
#4 Wed 16 March 2016 08:49
Re: Connexion BDD PostGre-PostGIS et Leaflet
Bonjour,
Le code attend un array "fields" que l'on va transformer en string (avec le .join) sinon il va il va faire un : null.join() ce qui va bien sûr faire une erreur...
Il faut modifier un peu le code afin de l'éviter, par exemple:
Code:
var params = { .... "fields": (fields) ? (fields.join(',') : null,
en utilisant l'opérateur ternaire : si fields existe (non null, non undefined...) => feilds: fields.join(), Sinon => fields:null
Hors ligne
#5 Wed 16 March 2016 11:54
- RaphaelC
- Juste Inscrit !
- Lieu: Nice
- Date d'inscription: 21 Mar 2015
- Messages: 3
Re: Connexion BDD PostGre-PostGIS et Leaflet
Effectivement, cela marche comme ceci :
Code:
"fields": (fields ? fields.join(',') : null),
Et dans son contexte :
Code:
.service('api', function($http){ var service = this; var baseUrl = 'postgis_geojson.php'; service.getJsonLayer = function(couche, fields, srid, geomfield) { var params = { "geotable": couche, "fields": (fields ? fields.join(',') : null), "srid": srid || "4326", "geomfield": geomfield || "geom" } return $http.get(baseUrl, {params: params}); }; })
Hors ligne