Вопрос по php, javascript – Карты Google - панорамирование и масштабирование по областям - маркеры не отображаются при увеличении или панорамировании - ПОМОГИТЕ!

1

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

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

Посмотрите на регионы ниже: Оригинальные WitH Маркеры http://i31.tinypic.com/xds4t0.jpg Нет маркеров http://i31.tinypic.com/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, но нужно исправить это как можно скорее. Любые идеи, пожалуйста :(

Получил это исправлено - все мои 20 000 маркеров испортили местоположения :) спасибо за все ответы! Ali

Ваш Ответ

2   ответа
1

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

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

Пытаться:

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

и т.п.

1

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

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

Похожие вопросы