Domanda

Sono l'attuazione di alcune di clustering basate confine sul lato server di marcatori per visualizzare le mie mappe di Google. Quello che sto facendo è che ho una funzione che viene chiamata ogni volta che la mappa è si muove o stroncato o zoomata che prende il legato della mappa e fa una chiamata AJAX che a sua volta lo script lato server esegue una semplice query SQL per recuperare il marcatori e li cluster. Finora teh parte di clustering sta lavorando bene ma a volte le getBounds non sembra essere l'invio i confini corretti mi sento.

Come posso Panoramica di una mappa un po 'sul lato e le regioni che usato per avere marcatori ora tutto ad un tratto non hanno i marcatori e la mappa è vuota. Ho controllato la query SQL e dalla query stessa mostra un scandalosamente diversi limiti rispetto a quanto ci si aspetterebbe.

Date un'occhiata regioni sottostanti: Orginal con i marcatori Nessun marcatori

La prima mostra tutti i marcatori.

Quello seguente tuttavia si è appena trasferita un po 'verso l'alto ea sinistra, ma la metà della regione è la stessa come nella foto precedente tuttavia non ci sono marcatori a tutti. Ho isolato il problema di essere con la funzione getBounds delle mappe.

Questo è il mio codice JavaScript che ottiene i limiti e fa la chiamata:

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

Il mio codice lato server questo è il php utilizzato per ottenere gli elementi sulla base delle coordinate:

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

Sono sospettare la sua funzione getBounds in javascript, ma hanno bisogno di risolvere il problema al più presto. Tutte le idee per favore: (

È stato utile?

Soluzione

Ho una pagina che funziona esattamente allo stesso modo che hai descritto il vostro. Ecco come ottenere i limiti:

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

Ho poi mando ogni valore al server. Ho già controllato per i punti all'interno dei limiti con una query come questa:

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

Tuttavia, di recente ho scoperto che questa query ha esito negativo quando l'area limiti include la linea di data internazionale. Questo non sembra il problema che si sta avendo (è probabilmente accadendo in analisi i limiti), ma è sicuramente qualcosa che si dovrebbe prendere in considerazione. Ecco come ho riparato:

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

Altri suggerimenti

Se questo è letteralmente copiato dal codice:

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

allora il problema potrebbe essere semplicemente che si sta utilizzando le virgolette singole, piuttosto che doppio sui letterali PHP. Come tale, il $ LBound e $ UBound interpolazione non accade, e si sta utilizzando una query SQL non valido.

Prova:

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

ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top