Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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 wink
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 tongue

Merci d'avance et bonne journée

Hors ligne

 

#2 Tue 15 March 2016 10:12

Dof
Participant assidu
Lieu: Grenoble
Date d'inscription: 28 Oct 2009
Messages: 317
Site web

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 wink 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 wink

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 ! wink

Hors ligne

 

#4 Wed 16 March 2016 08:49

Dof
Participant assidu
Lieu: Grenoble
Date d'inscription: 28 Oct 2009
Messages: 317
Site web

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

 

Pied de page des forums

Powered by FluxBB