Récupération des données depuis ma base de donnée

Messages postés
7
Date d'inscription
vendredi 30 juin 2017
Statut
Membre
Dernière intervention
27 janvier 2019
-
Bonjour,

Je suis étudiant, et dans le cadre de projet je dois développer une carte avec 2 types de marqueurs pour différencier 2 "cas" (positif et négatif)

Après de longue heures de recherche j'ai réussi à obtenir ma carte avec une conversion de l'adresse de la base de donnée en coordonnées gps (logi, lagi).

Il me reste la dernière étape, réussir à afficher tous mes marqueurs sur la carte. J'arrive à en afficher un (la première ligne du résultat de ma requête). Il faudrait donc faire une boucle, j'avais pensé à stocker le résultat de ma requête dans un tableau, puis l'extraire au moment de var positif, ou var negatif comme je vais avoir après une autre requête mais ça reste le même principe. Donc si quelqu'un peut me donner des idées, j'ai passé pas mal de temps en vain, je n'ai jamais réussi.

Merci d'avance,

<?php

 include ('./../script/connexion.php');
   $requete = "select adresse_cheptel, code_postal, commune_cheptel, nom_eleveur, count(*) 
            from qualyse1_cheptel c, qualyse1_prelevement p 
            where c.id_cheptel=p.id_cheptel 
            and resultat='neg' 
            group by adresse_cheptel, code_postal, commune_cheptel, nom_eleveur
            LIMIT 1
            ";
echo $requete;
         $result = $connexion -> query($requete);
         $res = $result -> fetch();

echo $res['adresse_cheptel'];


echo $res['code_postal'];

echo $res['commune_cheptel'];

$nom=$res['nom_eleveur'];
echo $nom;

$data = array(
  'postalcode' => $res['code_postal'],
  'city'       => $res['commune_cheptel'],
  'country'    => 'france',
  'format'     => 'json',
);
$url = 'https://nominatim.openstreetmap.org/?' . http_build_query($data);
echo $url;


$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mettre ici un user-agent adéquat');
$geopos = curl_exec($ch);
curl_close($ch);

$resp = json_decode($geopos, true);


// get the important data
echo $lati = $resp[0]['lat'];

echo $longi = $resp[0]['lon'];




?>


<!DOCTYPE html>
<html>
 <head>
        <meta charset="utf-8">
        <!-- Nous chargeons les fichiers CDN de Leaflet. Le CSS AVANT le JS -->
        <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ=="
            crossorigin="" />
        <script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet.js" integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw=="
            crossorigin=""></script>
  <script type="text/javascript">
  
        // Nous initialisons une liste de marqueurs, les cheptels positifs
var positif = {
 <?php echo '"'.$nom.'"' ?> : { "lat": <?php echo $lati ?>, "lon": <?php echo $longi ?> },
 "Brest": { "lat": 48.383, "lon": -4.500 },
 "Quimper": { "lat": 48.000, "lon": -4.100 },
 "Bayonne": { "lat": 43.500, "lon": -1.467 }
};

// Nous initialisons une liste de marqueurs, les cheptels négatifs
var positif = {
var negatif = {
 <?php echo '"'.$nom.'"' ?> : { "lat": <?php echo $lati ?>, "lon": <?php echo $longi ?> },
 "Brest": { "lat": 49.383, "lon": -4.500 },
 "Quimper": { "lat": 46.000, "lon": -4.100 },
 "Bayonne": { "lat": 44.500, "lon": -1.467 }
};
   // On initialise la latitude et la longitude de Niort (centre de la carte)
   var lat = 46.323780;
   var lon = -0.457087;
   var macarte = null;
   // Fonction d'initialisation de la carte
   function initMap() {
    // Créer l'objet "macarte" et l'insèrer dans l'élément HTML qui a l'ID "map"
                macarte = L.map('map').setView([lat, lon], 11);
                // Leaflet ne récupère pas les cartes (tiles) sur un serveur par défaut. Nous devons lui préciser où nous souhaitons les récupérer. Ici, openstreetmap.fr
                L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {
                    // Il est toujours bien de laisser le lien vers la source des données
                    attribution: 'données © <a href="//osm.org/copyright">OpenStreetMap</a>/ODbL - rendu <a href="//openstreetmap.fr">OSM France</a>',
                    minZoom: 1,
                    maxZoom: 20
                }).addTo(macarte);
                
// Nous parcourons la liste des cheptels positifs
 for (ville in positif) {
    // Nous définissons l'icône à utiliser pour le marqueur, sa taille affichée (iconSize), sa position (iconAnchor) et le décalage de son ancrage (popupAnchor)
  var myIconpos = L.icon({
   iconUrl: "./marq.png",
   iconSize: [50, 50],
   iconAnchor: [25, 50],
   popupAnchor: [-3, -76],
  });
  var marker = L.marker([positif[ville].lat, positif[ville].lon], { icon: myIconpos }).addTo(macarte);
        // Nous ajoutons la popup. A noter que son contenu (ici la variable ville) peut être du HTML
 marker.bindPopup(ville);
 }    
    
    
// Nous parcourons la liste des cheptels négatifs
    for (ville in negatif) {
    // Nous définissons l'icône à utiliser pour le marqueur, sa taille affichée (iconSize), sa position (iconAnchor) et le décalage de son ancrage (popupAnchor)
  var myIconneg = L.icon({
   iconUrl: "./marqeur.png",
   iconSize: [50, 50],
   iconAnchor: [25, 50],
   popupAnchor: [-3, -76],
  });
  var marker = L.marker([negatif[ville].lat, negatif[ville].lon], { icon: myIconneg }).addTo(macarte);
        // Nous ajoutons la popup. A noter que son contenu (ici la variable ville) peut être du HTML
 marker.bindPopup(ville);
 }      
            }
   window.onload = function(){
    // Fonction d'initialisation qui s'exécute lorsque le DOM est chargé
    initMap(); 
   };
  </script>
  <style type="text/css">
   #map{ /* la carte DOIT avoir une hauteur sinon elle n'apparaît pas */
    height:400px;
   }
  </style>
  <title>Carte</title>
 </head>
 <body>
  <div id="map">
   <!-- Ici s'affichera la carte -->
  </div>
 </body>
</html>


EDIT : correction des balises de code
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
26529
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 octobre 2019
1834
1
Merci
Bonjour,

Tu as plusieurs valeurs dans ta variable $resp ?
car pour l'instant.. tu ne récupères, comme tu le dis, que la première ligne.. puisque tu pointes sur la ligne 0
// get the important data
echo $lati = $resp[0]['lat'];
echo $longi = $resp[0]['lon'];

(au passage... les echo ici sont inutiles !!)

et donc..oui.. il suffit de faire une boucle sur ta variable $resp ..

et pour convertir un array PHP en JS ...
https://www.codexworld.com/how-to/convert-php-array-to-javascript-array/
var resp = <?php echo json_encode($resp); ?>;


Ensuite, tu n'as plus qu'à boucler dessus en JAVASCRIPT
par exemple (à adapter à ton code)
 for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(resp[i]['lat'], resp[i]['lon']),
        map: macarte
      });
  }



Autre petit souci je pense...
// Nous initialisons une liste de marqueurs, les cheptels négatifs
var positif = {
var negatif = {

tu redéclares positif .. alors que tu l'as déjà initialisé quelques lignes plus haut.... mais là.. c'est un souci côté javascript et non php...(donc.. autre forum )



Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 64099 internautes nous ont dit merci ce mois-ci

luckycky
Messages postés
7
Date d'inscription
vendredi 30 juin 2017
Statut
Membre
Dernière intervention
27 janvier 2019
-
Bonjour,
Merci de ta réponde rapide!
Oui j'ai plusieurs variables dans mon $resp, mais il s'agit de la conversion d'une adresse en coordonnées GPS, voici un exemple de ce que j'ai à partir de
https://nominatim.openstreetmap.org/?postalcode=86400&city=CHAMPNIERS&country=france&format=json

[{"place_id":"198159545","licence":"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright","osm_type":"relation","osm_id":"135520","boundingbox":["46.1925486","46.2390537","0.2858084","0.3700597"],"lat":"46.217558","lon":"0.3374014","display_name":"Champniers, Montmorillon, Vienne, Nouvelle-Aquitaine, France métropolitaine, 86400, France","class":"boundary","type":"administrative","importance":0.5040168450086261,"icon":"https://nominatim.openstreetmap.org/images/mapicons/poi_boundary_administrative.p.20.png"}]


Je ne peux donc pas bouclé dans sur ma variable $resp
Les echo c'est juste pour moi pour afficher pour être sur que ça marche, je les enlèverai après.



Donc j'ai voulu créer des array pour chaque adresse (chaque résultat de ma requête) dans ma boucle while, (voir ci dessous, $liste+$i en sachant que mon $i augmente de un à chaque tour, ce qui me permet d'avoir $liste1, $liste2... pour chaque adresse différent si je ne me trompe pas), j'arrive bien à les extraire dans ma boucle while, mais si j'essaye de les extraire à l'extérieur avec une boucle for sur $i, mes tableaux renvoient à rien.
<code php><!DOCTYPE html>

<?php

include ('./../script/connexion.php');
// $requete = "select adresse_cheptel, code_postal, commune_cheptel, nom_eleveur from qualyse1_cheptel ";
$requete="select adresse_cheptel, code_postal, commune_cheptel, nom_eleveur, count(*)
from qualyse1_cheptel c, qualyse1_prelevement p
where c.id_cheptel=p.id_cheptel
and resultat='neg'
group by adresse_cheptel, code_postal, commune_cheptel, nom_eleveur";
$result = $connexion -> query($requete);
$res = $result -> fetch();


$i = 1;

while($res)
{

$data = array(
'postalcode' => $res['code_postal'],
'city' => $res['commune_cheptel'],
'country' => 'france',
'format' => 'json',
);

$url = 'https://nominatim.openstreetmap.org/?' . http_build_query($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mettre ici un user-agent adéquat');
$geopos = curl_exec($ch);
curl_close($ch);

$resp = json_decode($geopos, true);


// get the important data
echo $lati = $resp[0]['lat'];
echo'</br>';
echo $longi = $resp[0]['lon'];
echo'</br>';

$liste.''.$i =array( $longi, $lati, $res['nom_eleveur']);

echo $liste.''.$i[0];

echo $liste.''.$i[1];

echo $liste.''.$i[2];

$i++;
$res = $result->fetch();
}



for ($i=0; $i<10; $i++) {
?>
<?php echo '"'.$liste.''.$i[2].'"' ?>: { "lat": <?php echo $liste.''.$i[1] ?>, "lon": <?php echo $liste.''.$i[0] ?> },

<?php

}
?>
</code>


C'est une erreur de ma part pour le doublon de la var positif,
jordane45
Messages postés
26529
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 octobre 2019
1834 -
Déjà... ce n'est pas
while($res)

mais directement
while($res =  $result -> fetch())

(et tu retires les deux autres
 $res =  $result -> fetch()
que tu as mis dans ton code.

Puis... apprend à utiliser les array..... tu nous fais une tambouilles bizarre...

regarde, par exemple, ce que fait (j'insiste..ce n'est qu'un exemple de manipulation d'array pas la réponse à ta question directement ! ) :
$liste = array();
for($i=0; $i<=10;$i++){
  $liste[] = array('ligne'=>$i);
}
print_r($liste);

Codekila
Messages postés
1
Date d'inscription
mercredi 10 juillet 2019
Statut
Membre
Dernière intervention
10 juillet 2019
-
Hi,
As you have two option either create seprate variable and initialize only geo coordinate to it at server side.
while ( $ res  =   $ result  ->  fetch ())

And you can also do it on at client side by converting your php array to js array.

var resp =  <? php echo json_encode ( $ resp );  ?>

You can check here how to convert php array to javascript array -
http://codekila.com/convert-php-array-into-javascript-array/
for  ( i =  0 ; i < resp . length ; i ++)  {   
      marker =  new google . maps . Marker ( { 
          position :  new google . Maps . LatLngs ( resp [ i ] [ 'lat' ], respectively [ i ] [ 'lon' ]), 
         map : myMap
       } ); 
  }
Commenter la réponse de jordane45