Googleマップに表示するマーカーのサーバー側に境界ベースのクラスタリングを実装しています。私がやっていることは、マップが移動、パン、またはズームされるたびに呼び出される関数を持っていることです。これは、マップの境界を取得し、サーバー側のスクリプトが単純な sql クエリを実行して取得する ajax 呼び出しを行います。マーカーとそれらをクラスター化します。これまでのところ、クラスタリング部分はうまく機能していますが、getBounds が正しい境界を送信していないように見えることがあります。
マップを少し横にパンすると、以前はマーカーがあった地域に突然マーカーがなくなり、マップが空白になります。私はSQLクエリをチェックし、クエリ自体から、予想とは非常に異なる境界を示しています。
以下の地域を見てください。
最初のものはすべてのマーカーを示しています。
ただし、次のものは少し上と左に移動しただけですが、領域の半分は前の図と同じですが、マーカーはまったくありません。マップの 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)';
javascript の getbounds 関数を疑っていますが、できるだけ早く修正する必要があります。どんなアイデアでもどうぞ:(