2

次のJavaScript関数は、http://sg.openrice.com/js/en/sdmap.js (この外部JSファイルを含むWebページ:http://sg.openrice.com/singapore/restaurant/advancesearch)から取得されました。 htm?mapType = 1):

function showAllMarkers(data, options) {
    var markerGroups = {};
    var getcs = function (lat, lng) {
        return '' + Math.round(lat * 32768) + Math.round(lng * 32768);
    }
    for (var i = 0; i < data.length; i++) {
        if (markerList[data[i].id]) continue;
        if (!(data[i].lat == 0 && data[i]['long'] == 0)) {
            var xy = getcs(data[i].lat, data[i]['long']);
            if (markerGroups[xy]) {
                markerGroups[xy].push(data[i]);
            } else {
                markerGroups[xy] = [data[i]];
            }
        }
    }
    for (var i in markerGroups) {
        updateGroupMarker(markerGroups[i], options);
    }
}

スクリプトの実行後、この関数を使用して、重複するマーカーをクラスター化します。私はjavascript構文を完全に理解していますが、この行が何をするのか理解していません。

return '' + Math.round(lat * 32768) + Math.round(lng * 32768);

32768を掛ける特別な目的はありますか?誰かが私に説明できますか?

ありがとう!

4

1 に答える 1

0

この行は、markerGroups 配列の文字列インデックス (「ハッシュ」) を生成する方法の 1 つにすぎません。そこから学ぶべきことは、「getcs」は分かりにくい名前であり、ソース コードの読み取りが難しくなるため、意味が明確になるように関数に明確な名前を付ける必要があるということです。

とにかく:丸めはいくつかの数字を切り捨てます。作成者はおそらく多くの桁に切り詰めたくないので、影響を減らすのに十分な大きさの値で緯度/経度を乗算する必要があります。32768 は多かれ少なかれランダムな選択のようです (2^15 ですが、まだランダムに見えます)。

さて、衝突について: 互いに非常に近い 2 つの座標... 0.000001,0.000001 と 0.000002,0.000002 を指定すると、同じハッシュが生成されます。次に、作成者はこれらのハッシュを使用して、同じハッシュを持つすべてのマーカーをグループ化します。

これは非常に単純化されたアルゴリズムです。2 つのマーカーが文字通り隣り合っている場合 (それらの間の距離がミリメートルのように)、ハッシュ値が変化する境界にある場合、アルゴリズムはそれらをグループ化しないことを受け入れます。

より具体的な言葉で言えば、アルゴリズムはマップ上にグリッドを配置します。グリッドの各セルのサイズは 1°/32768 * 1°/32768 (つまり、赤道上の正方形あたり3.4*3.4 メートルです) , 3,4m * 2,2m (座標系が WGS84 の場合、ドイツ/米国/カナダの国境)。正方形のサイズは、地球上の位置によって大きく異なります)。1 つのグリッド セル内のすべてのマーカーは同じになります。ハッシュ値であり、結果としてグループ化されます。

于 2012-05-20T17:20:45.927 に答える