#1 Thu 20 July 2017 10:24
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
recuperer resultat PHP en ajax
Bonjour tt le monde,
je travaille sur un projet de webmapping, je veux afficher un ensemble de points sous forme de Markers, mes données sont dans une base postgres
et jutilise PHP et javascript comme outils de developpement, quand j'execute mon code il me donne cet erreur :
'SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data'
je vous montre mon code :
PHP :
Code:
header('content-type: text/html; charset=utf-8'); require('connexion.php'); $requete = "select nomcom,activite,adresse_geocode,longitude,latitude,st_ASGeoJSON(ST_transform(geom,2163)) as geometrie from ref_economie.commerces_boulogne_modifie"; $query = pg_query($bdd,$requete); $json_commerces = array( 'type' => 'FeatureCollection', 'crs' => array('type'=> 'name','properties'=>array('name'=> 'urn:ogc:def:crs:OGC:1.3:CRS84')), 'features' => array() ); while($row = pg_fetch_assoc($query)){ $infos = $row; unset($infos['geometrie']); $geojson_marker = array( 'type' => 'Feature', 'properties' => $infos, 'geometry' => json_decode($row['geometrie'], true) ); array_push($json_commerces['features'],$geojson_marker); } echo json_encode($json_commerces);
Javascript pour recuperer les resultats de la requete PHP ;
Code:
function affichage_commerce(){ //fonction de l'affichage des commerces $.ajax({ type : "POST", url : "../PHP/affiche_commerce.php", dataType : "JSON", error : function(){ alert("error"); }, success : function(json_commerces){ var result = JSON.parse(json_commerces); var markers = result.features; $(markers).each(function(index,elem){ var lat = markers.geometry.coordinates[0]; var lng = markers.geometry.coordinates[1]; var latlng = L.latlng(lat,lng); var commerce = new L.marker(latlng); commerce.addTo(map); }) } }); }
si quelqu'un a deja rencontré ce genre de probleme ou si vs avez une solution a me proposer je vous remercie.
Dernière modification par ghiz_geo (Thu 20 July 2017 10:33)
Hors ligne
#2 Thu 20 July 2017 11:28
- michel56
- Participant assidu
- Lieu: Lorient
- Date d'inscription: 14 Jul 2012
- Messages: 474
Re: recuperer resultat PHP en ajax
Bonjour,
Le fichier PHP généré est bien au format JSON.
Tu as vérifié son contenu?
Cordialement.
Dernière modification par michel56 (Thu 20 July 2017 11:36)
Opérateur cartographique & DAO & PHP.
Hors ligne
#3 Thu 20 July 2017 11:48
Re: recuperer resultat PHP en ajax
Bonjour,
Comme Michel l'indique, et étant donné le message d'erreur, le fichier GeoJSON est mal formé.
Vous devriez utiliser cette requête pour structurer le GeoJSON :
Code:
SELECT json_build_object( 'type', 'FeatureCollection', 'crs', json_build_object( 'type', 'name', 'properties', json_build_object( 'name', 'EPSG:2163')), 'features', json_agg( json_build_object( 'type', 'Feature', 'id', gid, 'geometry', ST_AsGeoJSON(geom)::json, 'properties', json_build_object( 'nomcom', nomcom, 'activite', activite, 'adresse_geocode', adresse_geocode, 'longitude', longitude, 'latitude', latitude, 'latitude', latitude ) ) ) ) AS objet_geosjon FROM ref_economie.commerces_boulogne_modifie;
Puis Vous appelez l'objet_geojson dans un fetch.
Un exemple est disponible sur ce lien : https://www.geomatick.com/2017/03/02/po … -la-volee/
Cdlt,
FD
Hors ligne
#4 Thu 20 July 2017 15:53
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
D'abord merci bien pour vos reponses,
pour la premiere methode de generation du fichier JSON ca donne des resultats sous format JSON
{"type":"FeatureCollection","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properieties":{"categorie":"Sante","geo_adresse":"2 BIS Rue Louis Faidherbe 62200 Boulogne-sur-Mer"},"geometry":{"type":"MultiPoint","coordinates":[[50.723675,1.602329]]}},{"type":"Feature","properieties":{"categorie":"Sante","geo_adresse":"8 Rue Salvador Allende 62200 Boulogne-sur-Mer"},"geometry":{"type":"MultiPoint","coordinates":[[50.719241,1.607992]]}},.........{"type":"Feature","properieties":{"categorie":"Enseignement","geo_adresse":"Rue Jacques Monod 62200 Boulogne-sur-Mer"},"geometry":null},{"type":"Feature","properieties":{"categorie":"Enseignement","geo_adresse":"Rue Jacques Monod 62200 Boulogne-sur-Mer"},"geometry":null}]}
,
et cela me parrait correcte.
et pou la solution que vous mavez proposé, ca marchait bien ms j'ai recuperé qu'un seul point et pas tous.
Merci
Hors ligne
#5 Thu 20 July 2017 16:01
Re: recuperer resultat PHP en ajax
Bonjour,
Pour tester les Geojson il existe geojson-lint: http://geojsonlint.com/
Le problème ... c'est "properties" et non "properieties"
Edit : Et si vos points se trouvent en France, il faut inverser les coordonnées, en geojson c'est [lng, lat]
Dernière modification par Dof (Thu 20 July 2017 16:04)
Hors ligne
#6 Thu 20 July 2017 17:06
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
oui j'ai corrigé les erreurs et jai testé les resultats sur le sites que vous m'avez donné ca s'affiche tres bien ms sur la page et avec le code de javascript il maffiche toujours l'erreur
SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
Hors ligne
#7 Thu 20 July 2017 18:24
- michel56
- Participant assidu
- Lieu: Lorient
- Date d'inscription: 14 Jul 2012
- Messages: 474
Re: recuperer resultat PHP en ajax
Pourquoi tu as des géométries null "geometry":null
Opérateur cartographique & DAO & PHP.
Hors ligne
#8 Fri 21 July 2017 09:24
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
michel56 oui ils sont comme ca dans la base jai qlques points sans geom
Hors ligne
#9 Fri 21 July 2017 14:43
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
là je suis dans la derniere etape, j'ai pu crée des resultats sous formats JSON, ms le souci si que avec le code AJAX j'arrive pas à acceder au tableau 'features' ,
"SELECT json_build_object(
'type', 'FeatureCollection',
'crs', json_build_object(
'type', 'name',
'properties', json_build_object(
'name', 'EPSG:4326')),
'features',json_agg(
json_build_object(
'type', 'Feature',
'id', id,
'geometry', st_ASGeoJSON(ST_FlipCoordinates(geom))::json,
'properties', json_build_object(
'nomcom', nomcom,
'activite', activite,
'adresse_geocode', adresse_geocode
)
)
)
) AS objet_geosjon FROM ref_economie.commerces_boulogne_modifie;";
il me donne comme erreur
geometry indefinie
.
et voila ce que j'ai mis dans le code javascript
function affichage_commerce(){ //fonction de l'affichage des commerces
$.ajax({
type : "POST",
url : "../PHP/affiche_commerce.php",
dataType : "JSON",
error : function(){
alert("error");
},
success : function(json_commerces){
var result = JSON.parse(json_commerces);
var markers = result.features;
var id = markers.id;
var activite = markers.activite;
var nomcom = markers.nomcom;
$(markers).each(function(index,elem){
var lat = markers.geometry.coordinates[0];
var lng = markers.geometry.coordinates[1];
var latlng = L.latLng(lat,lng);
var commerce = new L.marker(latlng);
commerce.bindPopup("identifiant :"+id+
"<br>Activité : "+activite+
"<br>Nom du commerce: "+nomcom);
commerce.addTo(map);
})
}
});
}
jespere que jai pu expliquer le souci, et merci de m'aider à trouver une solution.
Hors ligne
#10 Fri 21 July 2017 15:31
Re: recuperer resultat PHP en ajax
Moui, c'est pas très clair...
Déjà je ne comprends pas trop le $(markers)each, c'est du jquerry? Bref, on peut faire une boucle sans en JS.
Et je pense qu'il y a un soucis sur le format geojson. Une feature à une "geometry" et des "properties". Les attributs sont dans les properties.
un exemple d'un geojson classique, une FeatureCollection contenant des Features:
Code:
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Point", "coordinates": [-97.522259, 35.4691] } }, { "type": "Feature", "properties": {}, "geometry": { "type": "Point", "coordinates": [-97.502754, 35.463455] } }, { "type": "Feature", "properties": {}, "geometry": { "type": "Point", "coordinates": [-97.508269, 35.463245] } } ] };
Peut être que ça vous aidera :
Code:
function affichage_commerce() { //fonction de l'affichage des commerces $.ajax({ type: "POST", url: "../PHP/affiche_commerce.php", dataType: "JSON", error: function () { alert("error"); }, success: function (json_commerces) { var result = JSON.parse(json_commerces); var markers = result.features; // => tableau des features for (let i = 0; i < markers.length; i++) { let marker = marker[i]; //feature individuelle (marker) var id = marker.properties.id; // les propriétés doivent être dans ... les properties! var activite = marker.properties.activite; // dans les propretiés! var nomcom = marker.properties.nomcom; var lat = marker.geometry.coordinates[0]; var lng = marker.geometry.coordinates[1]; var latlng = L.latLng(lat, lng); var commerce = new L.marker(latlng); commerce.bindPopup("identifiant :" + id + "<br>Activité : " + activite + "<br>Nom du commerce: " + nomcom); commerce.addTo(map); } } }); }
Dernière modification par Dof (Fri 21 July 2017 15:32)
Hors ligne
#11 Fri 21 July 2017 15:49
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
DOF ouii ca
$(markers).each(function(index,elem){
pour parcourir le tableau point par point.
en fait j'ai testé la solution que vous m'aves proposé et il m'a donné la meme chose. c'est qu'il n'arrive pas a acceder aux elements du tableau 'Features',
sachant qu'il bien structuré (properties contient les infos et dans geometry il y a la geom).
Hors ligne
#12 Fri 21 July 2017 16:10
Re: recuperer resultat PHP en ajax
Bonjour,
Dans votre requête, étant donné que vous voulez représenter les données géographiques, pourquoi ne pas éliminer les géométries nulles ?
Code:
...AS objet_geosjon FROM ref_economie.commerces_boulogne_modifie where geom IS NOT NULL
Cela éliminera l'erreur
geometry indefinie
FD
Hors ligne
#13 Fri 21 July 2017 16:13
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
je pense que c'est un souci de 'JSON_agg' dans la requete de php
'features',json_agg(
json_build_object(
'type', 'Feature',
'id', id,
'geometry', st_ASGeoJSON(ST_FlipCoordinates(geom))::json,
'properties', json_build_object(
'nomcom', nomcom,
'activite', activite,
'adresse_geocode', adresse_geocode
)
parce que quand je l'enleve, il m'envois q'un seul point et et l'affiche correctement sur la carte.
est ce qu'il y a pas une methode precise pour l'acces au tableau avec 'JSON_agg'
Hors ligne
#14 Fri 21 July 2017 16:19
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
pour la geometrie null je l'avais deja teste ms toujours la meme erreur.
Hors ligne
#16 Fri 21 July 2017 16:37
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
ouii il connait pas le champs geometrie et tous les elements de 'features' (id,nomcom,activite...)
en gros il arrive pas a acceder au tableau 'features'
Hors ligne
#17 Fri 21 July 2017 16:44
Re: recuperer resultat PHP en ajax
Alors, désolé, c'est difficile sans les données sous les yeux...
Mais votre fichier GeoJSON est bien produit ou déjà la requête pose problème?
Ou alors c'est success: function (json_commerces) qui ne reconnaît pas les features?
Hors ligne
#18 Fri 21 July 2017 16:58
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
quand j'execute le fichier PHP où il y a la requete et la structuration du fichier geojson, ca marche bien et il affiche tous les informations avec l'entete du fichier et tt avec la bonne structuration du fichier Geojson.
dans le code JS, il lit les resultats du fichier php, il connait bien l'entete des resultats geojson generé
'type', 'FeatureCollection',
'crs', json_build_object(
'type', 'name',
'properties', json_build_object(
'name', 'EPSG:4326')),
mais pour le champs 'features'
'features',json_agg(
json_build_object(
'type', 'Feature',
'id', id,
'geometry', st_ASGeoJSON(ST_FlipCoordinates(geom))::json,
'properties', json_build_object(
'nomcom', nomcom,
'activite', activite,
'adresse_geocode', adresse_geocode
)
)
il definit que c'est un tableau mais il arrive pas a acceder à ses elements.
je doute ke le probleme vient de 'JSON_agg' qui bloque l'acces au tableau, parce que qu'on je l'ai enlevé il ma genere les resultats mais juste un seul point et pas tous les points. peut etre il y a une methode pour lire les donnees a linterieur de 'JSON_agg'
Hors ligne
#19 Fri 21 July 2017 17:19
Re: recuperer resultat PHP en ajax
json_agg est une fonction d’agrégation pour prendre en compte toutes vos données dans le GeoJSON... si vous l'enlevez, c'est normal qu'il n'y ait qu'une seule donnée géographique... donc je ne pense pas que ce soit le souci.
Hors ligne
#20 Fri 21 July 2017 17:23
- michel56
- Participant assidu
- Lieu: Lorient
- Date d'inscription: 14 Jul 2012
- Messages: 474
Re: recuperer resultat PHP en ajax
Voici un script PHP qui fonctionne chez moi avec Openlayers.
Code:
<?php session_start(); include "config.php"; ?> { "type": "FeatureCollection", "features": [ <?php // Connexion, sélection de la base de données $dbconn = pg_connect("host=$host port=$port dbname=$dbname user=$user password=$password") or die('Connexion impossible : ' . pg_last_error()); // Exécution de la requête SQL $query = "SELECT ST_Area(the_geom) AS surface, ST_AsGeoJSON(the_geom,3) AS coord, gid, nom_zac, insee, commune_1, type FROM zac WHERE insee='$_SESSION[Selection_Commune]' "; $result = pg_query($query) or die('Échec requête : ' . pg_last_error()); // Affichage des résultats en XML $Boucle="0"; while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) { if($Boucle!="0"){echo ",\n";} echo "{ \"type\": \"Feature\", \"properties\": { \"GID\": \"".$line[gid]."\", \"NUM_INSEE\": \"".$line[insee]."\", \"NOM_COM\": \"".$line[commune_1]."\", \"SURFACE\": \"".$line[surface]."\", \"NOM_ZAC\": \"".$line[nom_zac]."\", \"TYPE\": \"".$line[type]."\" }, \"geometry\": ".$line[coord]." }\n"; $Boucle=$Boucle+1; } // Libère le resultset pg_free_result($result); // Ferme la connexion pg_close($dbconn); ?> ] }
Dernière modification par michel56 (Fri 21 July 2017 17:32)
Opérateur cartographique & DAO & PHP.
Hors ligne
#21 Fri 21 July 2017 18:05
Re: recuperer resultat PHP en ajax
Testez cela, ça devrait fonctionner :
votre premier fichier PHP qui correspond à votre fichier affiche_commerce.php
Code:
<?php // Connection à la base de données try { $dbconn=new PDO("pgsql:host=*;dbname=*","*","*") or die('Connexion impossible'); $dbconn->exec("SET CHARACTER SET utf8"); $dbconn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // S'il existe un problème de connection, on obtient le message d'erreur } catch(PDOException $erreur) { $erreur->getMessage(); // Supprimer en production echo $erreur; } if($dbconn){ // Exécution de la requête SQL $sql="SELECT json_build_object( 'type', 'FeatureCollection', 'crs', json_build_object( 'type', 'name', 'properties', json_build_object( 'name', 'EPSG:4326')), 'features', json_agg( json_build_object( 'type', 'Feature', 'id', gid, 'geometry', ST_AsGeoJSON(ST_FlipCoordinates(geom))::json, 'properties', json_build_object( 'nomcom', nomcom, 'activite', activite, 'adresse_geocode', adresse_geocode ) ) ) ) AS objet_geosjon FROM ref_economie.commerces_boulogne_modifie;"; // where geom IS NOT NULL $req=$dbconn->prepare($sql); $req->execute(); $data=$req->fetch(); if($data){ $objet_geosjon=$data['objet_geosjon']; echo $objet_geosjon; }else{ echo "Un problème s\'est déroulé lors du chargement de la donnée."; } }
Puis votre fichier qui récupère vos données par la fonction ajax de jquery :
Code:
$.ajax({ type: "POST", url: "../PHP/affiche_commerce.php", dataType: "JSON", success: function (json_commerces) { // TESTEZ l'appel de vos résultats dans le firebug via un console.log par exemple : console.log(json_commerces.features[0].geometry.coordinates[0]); var nb_features=json_commerces.features.length; for(var i = 0; i < nb_features; i++){ //nomcom console.log(json_commerces.features[i].properties.nomcom); // ici vos coordonnées if(json_commerces.features[i].geometry != null){ console.log('coordonnées : '+json_commerces.features[i].geometry.coordinates[0]+'/'+json_commerces.features[i].geometry.coordinates[1]); } } } }).fail(function(erreur){ });
Hors ligne
#22 Mon 24 July 2017 09:53
- ghiz_geo
- Participant occasionnel
- Date d'inscription: 10 Apr 2017
- Messages: 25
Re: recuperer resultat PHP en ajax
Bonjour;
merci à vous tous pour votre aide,
maintenant ca marche bien, j'ai testé la derniere solution de FlorianD et ca reussi, il faut juste ajouter la ligne
Code:
var result = JSON.parse(json_commerces);
au debut de la fonction et apres utiliser ses resultats sinn ca marche bien
Mercii
Hors ligne