4

マップの緯度/経度座標の配列を比較して、「クラスター」またはグループがあるかどうかを確認しようとしています。近すぎるものを削除したいので、マップ上で 4 ~ 5 個のスタックが重なり合っている場合、もう少しズームインするまでは 1 つしか表示されず、すべてが再計算されます。 .

配列をそれ自体と比較してみましたが、一貫した結果が得られないようです。誰かが前にこのようなことを試みたことがありますか?

JSON の例:

[
{
    Latitude = "44.033843";
    Longitude = "-79.48865499999999";
},
{
    Latitude = "44.033843";
    Longitude = "-79.48865499999999";
}]
4

2 に答える 2

2

ノードを反復し、ズームレベルの場合、互いに設定された距離を超えているノードのみを表示します。半正矢関数は実装するのに十分単純です:ここのJSの例。

http://www.movable-type.co.uk/scripts/latlong.html

効率の面では、反復ごとに一時リストに対してリスト全体を計算したくない場合があります。これにより、最初のレベルで単純な丸めが機能します(すべての角度が互いに約60マイル離れています)...丸めから始めます。ズームインすると、最も近い5度、次に1、次に10、100などになります。これらのリストを並べ替え、最初に一意の配列値を取得してから、結果のリストから距離を計算します。

それを行うためのアルゴリズムは他にもたくさんありますが、ある時点で距離を計算する必要があります。

于 2012-10-14T17:05:06.173 に答える
0

編集: これは、あなたが物事を少しごまかして喜んでいると仮定し、地球上のポイント間の実際の距離を心配する代わりに、緯度/経度座標の「マンハッタン」距離を見ます。それは、どれだけ正確である必要があるか、および地球の極の近くにポイントがあるかどうかによって異なります。しかし、ほとんどの実用的な目的では、この仮定で問題ありません。

希望する精度が小数点以下 1 桁であるとします。次に、配列を反復処理して、キーが丸められた座標であり、値が対応するキーに丸められる緯度と経度のペアの配列である has を作成します。

hash = Hash.new
latLongArray.each { |point|
  key = [point.lat.round(1), point.long.round(1)]
  hash[key] = Array(hash[key]) + [point.lat, point.long]
}

このようにしてそれらをクラスター化すると、実際には、キー自体によって指定された座標にマーカーを配置するだけで済みます。

于 2012-10-14T17:10:17.883 に答える