#1 Thu 03 June 2010 14:13
- K_Gonza
- Juste Inscrit !
- Date d'inscription: 3 Jun 2010
- Messages: 2
[google map V2] Clusterisation
Bonjour à toutes et à tous,
Je suis en stage depuis un petit moment et je dois faire une carte de google map qui affiche en fonction des coordonnées stockés un marqueur. Le problème c'est qu'il y en tout 2500 marqueurs et je dois limiter ma requete pour pas faire saturé le navigateur.
J'ai donc penser à la méthode de clusterisation. En suivant un tutoriel j'ai pu comprendre le principe de fonctionnement mais je bloque. C'est la 1er fois que je fais des SIG (je ne savais même pas ce que c'etait avant mon stage) et je ne connais pas le fonctionnement des requetes pour les données spatials. J'ai bien sur consulté différentes documentations avant de poster comme le site de l'openGIS mais compréhension est trop sommaire pour réaliser la clusterisation.
Il faut savoir que j'utilise MySQL et que c'est la version 4.
Voici le code avec des commentaires pour aider à la compréhension :
Actuellement mon code ressemble à ceci :
Code:
<?php header("content-type: application/xml"); include('config.php'); /// Partie en XML qui contient toutes les infos pour les marqueurs (longitude, latitude)/// echo'<?xml version="1.0" encoding="UTF-8"?>'; echo "\n<markers> \n"; $sql2 = "select Y(coord_scene),X(coord_scene),id_scene,trace_scene FROM scene sc LIMIT 20"; $resultats2 = mysql_query($sql2); while ($ligne2=mysql_fetch_array($resultats2)) { echo ' <marker lat=" '. $ligne2['Y(coord_scene)'] .' " long=" '. $ligne2['X(coord_scene)'] .' " nom=" '. $ligne2['id_scene'] .' " url=" '. $ligne2['trace_scene'] .' " />'; } echo "\n</markers>\n"; // Les différentes variables pour connaitre la taille de la carte//// $extendPercent = 50 / 100; $cluster_number = 5; $pas = 10; $addExtendY = ($_GET['maxY'] - $_GET['minY']) * $extendPercent; $addExtendX = ($_GET['maxX'] - $_GET['minX']) * $extendPercent; ($_GET['maxY'] > 0 ) ? ((($_GET['maxY'] + $addExtendY) > 90) ? $maxY = 90 : $maxY = $_GET['maxY'] + $addExtendY ) : $maxY = $_GET['maxY'] - $addExtendY ; ($_GET['maxX'] > 0 ) ? ((($_GET['maxX'] + $addExtendX) > 180) ? $maxX = 180 : $maxX = $_GET['maxX'] + $addExtendX ) : $maxX = $_GET['maxX'] - $addExtendX ; ($_GET['minY'] > 0 ) ? $minY = $_GET['minY'] - $addExtendY : ((($_GET['minY'] - $addExtendY) < -90) ? $minY = -90 : $minY = $_GET['minY'] - $addExtendY) ; ($_GET['minX'] > 0 ) ? $minX = $_GET['minX'] - $addExtendX : ((($_GET['minX'] - $addExtendX) < -180) ? $minX = -180 : $minX = $_GET['minX'] - $addExtendX) ; /// Calcul de la hauteur est de la largeur de la carte/// $largeur = $maxX - $minX; $hauteur = $maxY - $minY; $pas_largeur = $largeur / $pas; $pas_hauteur = $hauteur / $pas; for ($i=0;$i<$pas;$i++){ for ($j=0;$j<$pas;$j++){ $temp1 = $minY + $pas_hauteur * $i; $temp2 = $minX + $pas_largeur * $j; $temp3 = $minY + $pas_hauteur * ($i + 1); $temp4 = $minX + $pas_largeur * ($j + 1); $coord1 = strval($temp2)." ".strval($temp1); $coord2 = strval($temp4)." ".strval($temp1); $coord3 = strval($temp4)." ".strval($temp3); $coord4 = strval($temp2)." ".strval($temp3); /// La requete pour sélectionner les coordonnées qui sont contenu dans la partie visible de la carte. $sql = "SELECT X(coord_scene), Y(coord_scene)FROM scene sc WHERE "; $sql .= "Contains (PolygonFromText('POLYGON(($coord1,$coord2,$coord3,$coord4,$coord1'))))"; $res = mysql_query($sql)or exit(mysql_error()); $nb_object = mysql_num_rows($res); // Les requêtes conditionnels qui permettent de creer les clusters ou les marqueurs selon le cas. /// if ($nb_object <> 0){ if ($nb_object > $cluster_number){ $polygone = "POLYGON(("; $a = 0; while ($result = mysql_fetch_array($res)){ if ($a == 0){ $firstPoint = $result['x']." ".$result['y']; } $polygone .= $result['x']." ".$result['y'].","; $a++; } $polygone .= $firstPoint; $polygone .= "))"; $sql2 = "select x(Centroid(GeometryFromText('".$polygone."',4326))) as x, y(Centroid(GeometryFromText('".$polygone."',4326))) as y"; $res2 = mysql_query($sql2); $result2 = mysql_fetch_array($res2); $lat = $result2['y']; $lng = $result2['x']; } } } } } ?>
Cependant j'ai une erreur de code lors de $sql = "SELECT X(coord_scene), Y(coord_scene)FROM scene sc WHERE ";
$sql .= "Contains (PolygonFromText('POLYGON(($coord1,$coord2,$coord3,$coord4,$coord1'))))";
Apparemment c'est une erreur de parenthèse mais il y a autant d'accolade ouvrante que fermante.
EDIT: N'arrivant à trouver la solution j'ai trouvé une autre idée. J'ai un fichier en .BDF qui s'ouvre dans excel. Je l'ai ensuite enregistré en.CSV J'ai ensuite voulu l'importer dans une base MySQL mais une erreur survient.
Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Pays' at line 1
Le 'pays' qui est désigné comme source d'erreur n'est pourtant que le nom de la colonne qui contient tous les noms des pays.
En vous remerciant par avance de votre aide,
K-gonza
En vous remerciant d'avance.
Dernière modification par K_Gonza (Mon 07 June 2010 13:58)
Hors ligne
#2 Thu 24 June 2010 11:58
- indyada
- Juste Inscrit !
- Date d'inscription: 17 Sep 2008
- Messages: 6
Re: [google map V2] Clusterisation
Cependant j'ai une erreur de code lors de $sql = "SELECT X(coord_scene), Y(coord_scene)FROM scene sc WHERE ";
$sql .= "Contains (PolygonFromText('POLYGON(($coord1,$coord2,$coord3,$coord4,$coord1'))))";
Apparemment c'est une erreur de parenthèse mais il y a autant d'accolade ouvrante que fermante.
Le nombre ne suffit pas, il faut encore respecter la syntaxe
Tu devrais essayer :
SELECT X(coord_scene), Y(coord_scene) FROM scene WHERE ";$sql .= "Contains (PolygonFromText('POLYGON($coord1,$coord2,$coord3,$coord4,$coord1)'))
Dernière modification par indyada (Thu 24 June 2010 12:02)
Hors ligne