2009-07-07 8 views
1

Je suis en train de mettre en place un clustering basé sur les limites de l'extrémité serveur des marqueurs à afficher sur mes google maps. Ce que je fais est que j'ai une fonction qui est appelée à chaque fois que la carte est déplacée ou panoramique ou zoomée qui prend la limite de la carte et fait un appel ajax qui à son tour le script côté serveur exécute une simple requête sql pour récupérer le marqueurs et les clusters. Jusqu'à présent, la partie cluster fonctionne bien, mais parfois, le getBounds ne semble pas envoyer les limites correctes que je ressens.Google Maps - Panoramique et zoom dans les zones - les marqueurs n'apparaissent pas lorsque j'effectue un zoom avant ou un panoramique - HELP!

Comme je peux faire un panoramique sur une carte un peu sur le côté et les régions qui avaient auparavant des marqueurs n'ont tout d'un coup pas de marqueurs et la carte est vide. J'ai vérifié la requête sql et à partir de la requête elle-même, elle montre des limites outrageusement différentes de ce qui serait attendu.

Jetez un oeil sur les régions ci-dessous: Orginal WitH Markers http://i31.tinypic.com/xds4t0.jpg No markers http://i31.tinypic.com/2r22ez4.jpg

Le premier montre tous les marqueurs.

Celui qui suit vient cependant de se déplacer un peu en haut et à gauche mais la moitié de la région est la même que sur l'image précédente mais il n'y a aucun marqueur du tout. J'ai isolé le problème pour être avec la fonction getBounds des cartes.

Ceci est mon code javascript qui obtient les limites et fait l'appel:

var bounds = map.getBounds(); 
var southWest = bounds.getSouthWest(); 

var northEast = bounds.getNorthEast(); 
var data = {ne:northEast.toUrlValue(), sw:southWest.toUrlValue(), zoom:map.getZoom()}; 
//something getting messed up in the code above this point 

$.ajax({ 
    type: "POST", 
    url: 'maps/get-markers', 
    data: {object:$.toJSON(data)}, 
    dataType: 'json', 

    success: function(response) { 
     //code to add markers 
    } 
}); 

Sur mon code côté serveur c'est le php utilisé pour obtenir les éléments basés sur les coordonnées:

$data = Zend_Json::decode(stripslashes($this->_request->getParam('object'))); 

//retrieve the variables from the GET vars 
list($nelat, $nelng) = explode(',', $data['ne']); 
list($swlat, $swlng) = explode(',',$data['sw']); 

//clean the data 
$nelng = (float)$nelng; 
$swlng = (float)$swlng; 
$nelat = (float)$nelat; 
$swlat = (float)$swlat; 

$ubound = $swlng > $nelng ? $swlng : $nelng; 
$lbound = $swlng > $nelng ? $nelng : $swlng; 

$sql = 'SELECT `a`.* FROM `locations` AS `a` WHERE (a.`longitude` > $lbound) AND (a.`longitude` < $ubound) AND'; 

$ubound = $swlat > $nelat ? $swlat : $nelat; 
$lbound = $swlat > $nelat ? $nelat : $swlat; 


$sql .= ' (a.`latitude` >= $lbound) AND (a.`latitude` <= $ubound)'; 

Je soupçonne que c'est la fonction getbounds dans le javascript, mais que vous devez corriger dès que possible. Toutes les idées s'il vous plaît :(

+0

Got it fixe - tous mes 20 000 marqueurs ont foiré les remerciements emplacements pour toutes les réponses! – Ali

Répondre

1

J'ai une page qui fonctionne exactement de la même façon que vous avez décrit la vôtre Voici comment je reçois les limites:..

var bounds = map.getBounds(); 
var sw = bounds.getSouthWest(); 
var ne = bounds.getNorthEast(); 
var s = sw.lat(); 
var w = sw.lng(); 
var n = ne.lat(); 
var e = ne.lng(); 

j'envoie ensuite chaque valeur au serveur I précédemment vérifié pour les points dans les limites d'une requête comme ceci:

WHERE (lat BETWEEN $sBound AND $nBound) AND (lng BETWEEN $wBound AND $eBound) 

Cependant, j'ai récemment découvert que cette requête échoue lorsque la zone de bornes comprend la ligne de changement de date cela ne ressemble pas le problème que vous êtes. avoir (ça se passe probablement en analysant les limites), b C'est certainement quelque chose que vous devriez considérer. Voici comment je l'ai fixé:

if ($wBound > $eBound) { // if bounds includes the intl. date line 
    $sql .= "WHERE (lat BETWEEN $sBound AND $nBound) AND ((lng BETWEEN -180 AND $eBound) OR (lng BETWEEN $w AND 180))"; 
} else { 
    $sql .= "WHERE (lat BETWEEN $sBound AND $nBound) AND (lng BETWEEN $wBound AND $eBound)"; 
} 
1

Si cela est littéralement copié du code:

$sql .= ' (a.`latitude` >= $lbound) AND (a.`latitude` <= $ubound)'; 

alors le problème peut être simplement que vous utilisez des guillemets simples plutôt que doubler sur les littéraux PHP. En tant que tel, l'interpolation $ lbound et $ ubuntu ne se produit pas, et vous utilisez une requête SQL non valide.

Essayez:

$sql .= " (a.`latitude` >= $lbound) AND (a.`latitude` <= $ubound)"; 

etc.

Questions connexes