Карты Google – панорамирование и масштабирование по областям – маркеры не появляются при увеличении или панорамировании – ПОМОЩЬ!

Я реализую кластеры на граничной основе на конце маркеров для отображения на моих картах Google. То, что я делаю, это то, что у меня есть функция, которая вызывается каждый раз, когда карта перемещается или затухает или масштабируется, что берет границу карты и делает вызов ajax, который, в свою очередь, серверный скрипт запускает простой SQL-запрос для извлечения маркеров и кластеров. SO далеко от кластерной части работает хорошо, однако иногда getBounds, похоже, не посылает правильные границы, которые я чувствую.

Как будто я могу скопировать карту немного на стороне, и области, в которых раньше были маркеры, внезапно не имеют маркеров, а карта пуста. Я проверил sql-запрос и сам запрос показал, что он отличается от других, чем ожидалось.

Взгляните на регионы ниже: Orginal WitH Markers http://img.ruphp.com/php/xds4t0.jpg Нет маркеров http://img.ruphp.com/php/2r22ez4.jpg

Первый показывает все маркеры.

Следующий, однако, только немного переместился в начало и влево, но половина области такая же, как на предыдущем рисунке, но маркеров вообще нет. Я выделил проблему для функции getBounds карт.

Это мой код javascript, который получает границы и делает вызов:

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

На моем серверном коде это php, используемый для получения элементов на основе координат:

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

Я подозреваю его функцию getbounds в javascript, но вам нужно исправить ее как можно скорее. Любые идеи, пожалуйста 🙁

У меня есть страница, которая работает точно так же, как вы описали свою. Вот как я получаю оценки:

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

Затем я отправляю каждое значение на сервер. Я ранее проверял точки в пределах с такими запросами:

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

Однако недавно я обнаружил, что этот запрос не выполняется, когда область границ включает в себя международную строку дат. Это не похоже на проблему, с которой вы сталкиваетесь (вероятно, это происходит при анализе границ), но это определенно то, что вы должны учитывать. Вот как я его исправил:

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

Если это буквально скопировано из кода:

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

то проблема может быть просто в том, что вы используете одиночные кавычки, а не двойные по литералам PHP. Таким образом, интерполяция $ lbound и $ ubound не происходит, и вы используете недопустимый SQL-запрос.

Пытаться:

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

и т.п.