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

FlorianD
Membre
Date d'inscription: 22 Dec 2016
Messages: 90
Site web

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 smile

Hors ligne

 

#5 Thu 20 July 2017 16:01

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

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.
smile smile

Hors ligne

 

#10 Fri 21 July 2017 15:31

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

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

FlorianD
Membre
Date d'inscription: 22 Dec 2016
Messages: 90
Site web

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

 

#15 Fri 21 July 2017 16:35

FlorianD
Membre
Date d'inscription: 22 Dec 2016
Messages: 90
Site web

Re: recuperer resultat PHP en ajax

Votre erreur est toujours "geometry indefinie", on est d'accord?

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

FlorianD
Membre
Date d'inscription: 22 Dec 2016
Messages: 90
Site web

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

FlorianD
Membre
Date d'inscription: 22 Dec 2016
Messages: 90
Site web

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

FlorianD
Membre
Date d'inscription: 22 Dec 2016
Messages: 90
Site web

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

Hors ligne

 

Pied de page des forums

Powered by FluxBB