IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

formatage GeoJson par PHP [PostgreSQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut formatage GeoJson par PHP
    Bonjour,

    J'extrais des données d'une base Postgis que je converti en GeoJson avec ce script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    $conn = pg_connect($conn_string) or die ("erreur de connexion base"); 
     
    # Build SQL SELECT statement and return the geometry as a GeoJSON element
    $sql = 'SELECT pt_id, pt_name, public.ST_AsGeoJSON(public.ST_Transform((pt_geo),4326),6) AS geojson FROM point';
     
    $req = pg_query($sql);
    if (!$req) {
      echo "Une erreur s'est produite.\n";
      exit;
    }
     
    # Build GeoJSON feature collection array
    $geojson = array(
       'type'      => 'FeatureCollection',
       'features'  => array()
    );
     
    # Loop through rows to build feature arrays
    while ($row = pg_fetch_row($req)) {
        $properties = $row;
    	# Remove geojson and geometry fields from properties
        unset($properties['geojson']);
        unset($properties['geom']);	
        $feature = array(
             'type' => 'Feature',
             'geometry' => json_decode($row['geojson'], true),
             'properties' => $properties
        );
        # Add feature arrays to feature collection array
        array_push($geojson['features'], $feature);
    }
     
    header('Content-type: application/json');
    echo json_encode($geojson, JSON_NUMERIC_CHECK);
     
    pg_close();
    J'ai validé le GeoJson de sortie avec JSONLint, il est OK.
    Ensuite, je veux lire ce fichier GeoJson dans une interface de webmapping, mais il est mal formaté.
    Exemple :
    Voici le GeoJson formaté par PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {
    	"type": "FeatureCollection",
    	"features": [{
    		"type": "Feature",
    		"geometry": null,
    		"properties": [2, "Point test", "{\"type\":\"Point\",\"coordinates\":[-4.5,48]}"]
    	}]
    }
    Voici le formatage qui permettrait qu'il soit lu dans l'interface webmapping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
    	"type": "FeatureCollection",
    	"features": [{
    		"type": "Feature",
    		"geometry": {"type":"Point","coordinates":[-4.5,48]},
    		"properties": [2, "Point test"]}]
    }
    Dans le formatage PHP, la geométrie est à null et est mise dans les properties.

    Est-ce qu'il faut formater "à la main" le GeoJson dans le script PHP?
    Comment faire pour avoir dans les properties le nom des variables correspondant aux données ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "properties": ["ID":2, "Nom":"Point test"]

    Merci,
    Nico

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Est-ce que tu as vraiment tous les \" dans ta colonne geojson ?
    Parce que visiblement ton json_decode() pour 'geometry' ne fonctionne pas et s'il ya tout ce merdier c'est normal
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut
    oui la commande echo json_encode($geojson, JSON_NUMERIC_CHECK) renvoie exactement ceci :

    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    {"type":"FeatureCollection","features":[{"type":"Feature","geometry":null,"properties":[2,"Point test","{\"type\":\"Point\",\"coordinates\":[-4.5,48]}"]}]}

    je suis avec php 5.6.18, le script vient de github ici

    Nico

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut
    En decodant le résultat de la requete avec un pg_fetch_array() au lieu d'un pg_fetch_row(), ça met la geometry au bon endroit.

    Pour les propriétés, j'ai bien les noms de variables, mais elles sont en double, et la geometry y est toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    {
    	"type": "FeatureCollection",
    	"features": [{
    		"type": "Feature",
    		"geometry": {
    			"type": "Point",
    			"coordinates": [-4.5, 48]
    		},
    		"properties": {
    			"0": 2,
    			"pt_id": 2,
    			"1": "Point test",
    			"pt_name": "Point test",
    			"2": "{\"type\":\"Point\",\"coordinates\":[-4.5,48]}"
    		}
    	}]
    }
    si je visualise le tableau propriétés après la commande unset, il me donne une dimension de tableau de 5, m'affiche 3 éléments et 2 messages d'erreur !

    le code modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($row = pg_fetch_array($req)) {
        $properties = $row;
     
    	# Remove geojson and geometry fields from properties
        unset($properties['geojson']);
    	echo count($properties)."\n";
    	for ($i = 0; $i < count($properties); $i++) {
        echo $properties[$i]."\n";
    }
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    2
    Point test
    {"type":"Point","coordinates":[-4.5,48]}
    et pour les 2 éléments de fin de tableau, j'ai des messages d'erreur :
    Notice: Undefined offset: 3
    Notice: Undefined offset: 4

    Nico

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    c'est plutôt pg_fetch_assoc() qu'il faut si tu veux avoir les noms de colonne en clef.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut
    avec pg_fetch_assoc(), ça marche nikel !

    Merci,
    Nico

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Datagrid > Formatage des données reçues par PHP
    Par purple21 dans le forum Flash
    Réponses: 3
    Dernier message: 28/06/2007, 11h33
  2. comment acceder a une base active directory par php???
    Par vincenttt dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 08/06/2007, 15h31
  3. [FLASH MX] photo par php
    Par guy2004 dans le forum Flash
    Réponses: 19
    Dernier message: 09/02/2005, 09h36
  4. Réponses: 2
    Dernier message: 06/01/2005, 21h09
  5. [type MIME] css généré par php -> probleme
    Par prgasp77 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 23/09/2004, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo