2009-07-07 19 views
1

Ich implementiere einige Boundary-basierte Clustering auf dem Server-Ende von Markern, um auf meinen Google Maps anzuzeigen. Was ich tue, ist, dass ich eine Funktion habe, die jedes Mal aufgerufen wird, wenn die Karte bewegt oder geschwenkt oder gezoomt wird, die die Grenze der Map nimmt und einen Ajax-Aufruf ausführt, der wiederum das serverseitige Skript eine einfache SQL-Abfrage ausführt Marker und Cluster sie. Bis jetzt funktioniert der Clustering-Teil gut, aber manchmal scheint die getBounds nicht die richtigen Grenzen zu senden, die ich fühle.Google Maps - Schwenken und Zoomen in Bereiche - Marker werden beim Zoomen oder Schwenken nicht angezeigt - HILFE!

Wie ich eine Karte ein bisschen auf der Seite schwenken kann und Regionen, die früher Marker hatten, haben plötzlich keine Marker und die Karte ist leer. Ich überprüfte die SQL-Abfrage und von der Abfrage selbst zeigt es eine unerhörte andere Grenzen als was erwartet werden würde.

Werfen Sie einen Blick auf die Regionen unter: Orginal WitH Markers http://i31.tinypic.com/xds4t0.jpg No markers http://i31.tinypic.com/2r22ez4.jpg

Die erste alle Marker zeigt.

Der folgende hat sich jedoch ein wenig nach oben und links bewegt, aber die Hälfte der Region ist die gleiche wie im vorherigen Bild, aber es gibt überhaupt keine Markierungen. Ich habe das Problem isoliert, um mit der getBounds-Funktion der Karten zu sein.

Dies ist mein Javascript-Code, der die Grenzen und macht den Anruf bekommt:

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 
    } 
}); 

Auf meinem Server-Side-Code dies der php die Elemente verwendet wird, ist auf den Koordinaten basiert zu erhalten:

$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)'; 

Ich vermute, es ist die Funktion getbounds im Javascript, aber muss es so schnell wie möglich beheben. Irgendwelche Ideen bitte :(

+0

Verstanden fixiert - alle meine 20 000 Marker hatte Standorten :) Danke für alle Antworten vermasselt! – Ali

Antwort

1

ich eine Seite, die genau die gleiche Art und Weise funktioniert, die Sie Ihnen beschrieben haben hier, wie ich die Grenzen erhalten:..

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(); 

ich dann jeden Wert an den Server senden ich vorher für Punkte innerhalb der Grenzen mit einer Abfrage wie folgt geprüft:

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

Allerdings habe ich vor kurzem entdeckt, dass diese Abfrage fehlschlägt, wenn das Sperrgebiet der internationalen Datumslinie umfasst tut dies aussehen wie das Problem nicht, dass du bist. haben (es passiert wahrscheinlich in der Analyse der Grenzen), b Es ist definitiv etwas, das Sie beachten sollten. Hier ist, wie ich es fest:

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

Wenn dies buchstäblich aus dem Code kopiert wird:

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

dann das Problem einfach kann sein, dass Sie einfache Anführungszeichen verwenden, anstatt doppelt auf der PHP-Literale. Daher findet die Interpolation "$ lounded" und "$ ugound" nicht statt und Sie verwenden eine ungültige SQL-Abfrage.

Versuchen:

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

usw.

Verwandte Themen