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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Mon 19 September 2016 01:39

Louiszen
Juste Inscrit !
Date d'inscription: 12 Jul 2016
Messages: 9

Générer du Geojson avec postgresql 9.5

Bonjour,
J'essaie de récupérer les données tirées d'une table postgis en Geojson sans succès avec la version 9.5 de postgreslq et postgis 2.22. La requête affiche pourtant bien les données, mais la colone dédiée à la géométrie est vide ("null"). Mon code, le voi-ci:
<?php
header ('Content-type: text/html; charset=utf-8');
$dbconn = pg_connect("host=localhost port=5432 dbname=cihreh user=postgres password=poppop");
$requete = 'SELECT  objectid,commune,nom,ST_ASGEOJSON(geom) AS geojson  FROM points_deau';
$result = pg_query($dbconn,$requete);
//Je créé le tableau phpo associatif avec structure GeoJson mais sans Fatures pour l'instant
$Resultats = array('type'=> 'FeatureCollection', 'features' => array());
$compteur = 0;
while ($row = pg_fetch_assoc($result)) {
    //Je rajoute un feature avec geométrie et propriétés nulles pour l'instant
    $Resultats['features'][$compteur] = array('type' => 'feature', 'id'=> $row[objectid], 'geometry' => Null, 'properties' => Null);
   
        //Je rajoute les propriétés
    $Resultats['features'][$compteur]['properties']['objectid'] = array ($row['objectid']);
    $Resultats['features'][$compteur]['properties']['commune'] = array ($row['commune']);
    $Resultats['features'][$compteur]['properties']['nom'] = array ($row['nom']);
   
    $compteur ++; //Incrémentation du compteur
   
    //Je rajoute la géométrie
    $Resultats['features'][$compteur]['geometry'] = array ($row['geosjon']);
   
}
pg_close($dbconn);
//Affichage de json grâce à la fonction magique
echo json_encode($Resultats);
?>

Hors ligne

 

#2 Mon 19 September 2016 14:30

Cornet Jérémie
Participant assidu
Lieu: Nouméa
Date d'inscription: 6 Apr 2008
Messages: 229

Re: Générer du Geojson avec postgresql 9.5

Bonjour,
Le problème est la position de l' incrémentation du compteur qui devrait être en fin de boucle.
Ici, à chaque tour vous écrivez la géométrie après l'incrementation du compteur donc dans le feature suivant. Au début du tour suivant, la géométrie est alors écrasée.

Hors ligne

 

#3 Mon 19 September 2016 18:06

Louiszen
Juste Inscrit !
Date d'inscription: 12 Jul 2016
Messages: 9

Re: Générer du Geojson avec postgresql 9.5

Merci bien, mais jusque là ça n'affiche toujours pas du geojson. J'ai testé le fichier généré même en déplaçant le compteur et en le mettant à la fin sous QGIS et ça m'affiche juste une table bizarre. Auriez-vous un script à cet effet pour que je puisse l'adapter à ma base SVP?

Hors ligne

 

#4 Tue 20 September 2016 10:24

Cornet Jérémie
Participant assidu
Lieu: Nouméa
Date d'inscription: 6 Apr 2008
Messages: 229

Re: Générer du Geojson avec postgresql 9.5

En regardant plus, le (geo)json est effectivement mal construit dans votre script.

Le json est un format sous la forme de paires clé/valeur emboîtées.
Pour reproduire çà en php, on utilise des tableaux associatifs (et donc aussi des paires clé/valeur emboîtées) qui sont convertit en json via json_encode
Il vous faut donc reproduire dans le méga tableau associatif ($Resultats) la structure du geojson.

Ici, le problème est dans les valeurs d'attributs et dans la géométrie (pourquoi le array pour renseigner une valeurs d'attributs) ?

Voilà donc une version corrigée (mais non testée) que je fais suivre d'une version plus simple à comprendre (j'espère).


Code:

<?php
// Le header est une bonne pratique mais le content-type était mauvais pour du (geo)json
header ('Content-type: application/json; charset=utf-8'); 
$dbconn = pg_connect("host=localhost port=5432 dbname=cihreh user=postgres password=poppop");
$requete = 'SELECT  objectid,commune,nom,ST_ASGEOJSON(geom) AS geojson  FROM points_deau';
$result = pg_query($dbconn,$requete);

//Je créé le tableau php associatif avec structure GeoJson mais sans Features pour l'instant (tableau de features vide pour le moment)
$Resultats = array('type'=> 'FeatureCollection', 'features' => array());
$compteur = 0;
while ($row = pg_fetch_assoc($result)) {
    //Je rajoute dans le tableau de features un feature avec geométrie et propriétés vides pour l'instant
    $Resultats['features'][$compteur] = array('type' => 'feature', 'id'=> $row['objectid'], 'geometry' => Null, 'properties' => array());
   
    //Je resseigne les attributs (properties)
    $Resultats['features'][$compteur]['properties']['objectid'] = $row['objectid'];
    $Resultats['features'][$compteur]['properties']['commune'] = $row['commune'];
    $Resultats['features'][$compteur]['properties']['nom'] = $row['nom'];
   
    //Je rajoute la géométrie (NB : je transformela sortie de ma requete qui est du json en forme de texte sous forme de tableau associatif sinon mon geojson sera invalide)
    $Resultats['features'][$compteur]['geometry'] = json_decode($row['geojson']);
    
    $compteur ++; //Incrémentation du compteur   
}
pg_close($dbconn);

//Affichage de json grâce à la fonction magique qui transforme un tableau associatif php en json texte
echo json_encode($Resultats);

Code:

<?php
// Le header est une bonne pratique mais le content-type était mauvais pour du (geo)json
header ('Content-type: application/json; charset=utf-8'); 
$dbconn = pg_connect("host=localhost port=5432 dbname=cihreh user=postgres password=poppop");
$requete = 'SELECT  objectid,commune,nom,ST_ASGEOJSON(geom) AS geojson  FROM points_deau';
$result = pg_query($dbconn,$requete);

//Je créé le tableau php associatif avec structure GeoJson mais sans Features pour l'instant (tableau de features vide pour le moment)
$Resultats = array('type'=> 'FeatureCollection', 'features' => array());
while ($row = pg_fetch_assoc($result)) {
    //je cree un tableau associatif pour mon feature avec la structure attendue par le format geojson
    $feature = array(
        "type" => "feature",
        "id" => row["objectid"],
        "geometry" => json_decode(row["geojson"]),
        "properties" => array(
            "objectid" => row["objectid"],
            "commune" => row["commune"],
            "nom" => row["nom"]
        )
    );
    
    //Je rajoute ce feature dans mon tableau geojson global (ajout d'une nouvelle entrée dans la liste de features)
    $Resultats['features'][] = $feature;
}
pg_close($dbconn);

//Affichage du geojson grâce à la fonction magique qui transforme un tableau associatif php en json texte
echo json_encode($Resultats);

Dernière modification par Cornet Jérémie (Tue 20 September 2016 13:41)

Hors ligne

 

#5 Wed 21 September 2016 15:41

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9853
Site web

Re: Générer du Geojson avec postgresql 9.5

Bonjour,

Utiliser un GeoServer ou MapServer ne vous serait pas plus utile plutôt que de vouloir redévelopper un script PHP ?

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

Pied de page des forums

Powered by FluxBB