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

GEODATA DAYS 2024

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

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

 

Pied de page des forums

Powered by FluxBB