2009-07-07 9 views
1

Googleマップに表示するマーカーのサーバー側に境界ベースのクラスタリングを実装しています。私がやっているのは、マップが移動またはパンまたはズームされるたびに呼び出される関数がマップの境界をとり、サーバー側のスクリプトが単純なSQLクエリを実行してajax呼び出しを実行してマーカーとそれらをクラスタリングする。だから、クラスタリングの部分はうまく動作していますが、時にはgetBoundsが正しい境界を送信しているようには見えません。Googleマップ - パンニングとズームイン - ズームインまたはパンするとマーカーが表示されない - HELP!

私は、マーカーを持っていた側と地域のビットを突然パンすることがあります。突然すべてがマーカーを持たず、地図は空です。私はSQLクエリをチェックし、クエリ自体からは予想外の境界を示しています。

の下に地域を見てみましょう:最初のものは、すべてのマーカーを示し Orginal WitH Markers http://i31.tinypic.com/xds4t0.jpg No markers 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)'; 

私はjavascriptでgetbounds関数を疑っていますが、できるだけ早く修正する必要があります。すべてのアイデアは、私はあなたがあなたが記載されているとまったく同じように動作するページを持っている

+0

はそれが固定ガット - すべての私の20個の000マーカーは、すべての返信の場所:)おかげで台無しにしていました! – Ali

答えて

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

私は、サーバーへの各値を送信する前にI。このようなクエリとの境界内のポイントをチェック:

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

しかし、私は最近、境界領域は、国際日付変更線を含む場合、このクエリが失敗したことを発見した。これは、あなたがしている問題のようには見えません。 (おそらく境界を解析する際に起こっている)bそれは間違いなくあなたが考えるべきものです。ここで私はそれを固定方法は次のとおりです。

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

これは文字通りコードからコピーされている場合:

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

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

試してみてください。

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

など

関連する問題