1

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 関数を疑っていますが、できるだけ早く修正する必要があります。どんなアイデアでもどうぞ:(

4

2 に答える 2

1

これが文字通りコードからコピーされた場合:

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

問題は、PHP リテラルで二重引用符ではなく単一引用符を使用しているということだけかもしれません。そのため、$lbound および $ubound 補間は行われず、無効な SQL クエリを使用しています。

試す:

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

于 2009-08-19T19:56:22.570 に答える
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)";
}
于 2009-07-07T15:15:15.407 に答える