座標のセットが与えられた場合、最小境界を計算するにはどうすればよいですか?


13

経度/緯度の座標セットがあります。ポリゴンを形成する少なくとも3つの順序付けられた座標が常に存在します(それらが平面に投影された場合)。有効な経度と緯度の範囲のセットとしてこれらの座標の最小境界を計算するにはどうすればよいですか?(「有効」とは、明示的にantimeridianを説明する範囲を意味します)。私が探しているものを説明するのは難しいので、写真があります。

ここに画像の説明を入力してください

写真のケースは簡単です。すべてのポイントの絶対的な最小値と最大値を見つけるだけです。ただし、これはすべての場合に機能するわけではありません。一般的な解決策はありますか?

編集:「有効」の意味を明確にするために、データセットに-76、-135、および164の3つの経度値があったとしましょう。 -180および164から180まで。

さらにいくつかの説明。点は多角形を形成するため、特定の場合、必要な範囲は-180〜+180(つまり、360度全体)になります。

ここに画像の説明を入力してください

左側の画像は、地球の「半分」にある4つの座標の経度を示しています。北極(黒い点)を見下ろしているように想像してください。ピンクは、ポリゴンを含む最小の縦方向の範囲を示しています(ポリゴンは4つのポイントの間に紫色で表示されています)。左側のケースには、[-180〜-120]と[135〜180](視覚的に推定)の2つの縦方向の範囲があります。

右側の画像は、ポイントが地球を一周する別のケースを示しています。この範囲は[-180〜180]です。


1
私はこれまでこの問題を考えたことがありません、それは素晴らしい質問です。平らな地球が私たちの仕事を楽にする別の例です!これに対するいくつかの解決策を楽しみにしています。
12

「(「有効」とは明示的にantimeridianを説明する範囲を意味します」)についてもっと明示的にする必要があると思います-最小値という単語は問題の境界の前に行く必要があると思います。
イアンタートン

画像を再度追加していただければ、問題の説明に役立つかもしれません。
マッパーズ

1
iant:「有効な」明示的に明確化されたMapperz:再追加しますか?表示されていませんか?よく見えます。
プリス

1
まあ座標は経度/緯度であり、データベースを照会して地理データを取得するために使用されます。厳密に言えば、これを純粋な数学の問題に変換できます(ただし、GISの多くのことについて言えます)
プリス

回答:


5

私が質問を正しく理解することを願っています...

経度と緯度の問題を個別に解決できるので、経度:-76、-135、および164の例を取り上げます。

最初にそれらを注文します:

-135, -76, 164

次に、左端の座標を再び右に追加します:-135 + 360 = 225

-135, -76, 164, 225

これで、座標間のギャップを計算できます。

-135 (59) -76 (240) 164 (61) 225
             .......

最大のギャップ(240)は、ボックスに属さない最小境界ボックスの境界でなければなりませ。点線は、私たちがspareしまない円の最大の部分です。この例では、境界ボックスは164で始まり、-135を含み、-76で終わります。


これは私が考えるほとんどの場合に機能します。しかし、経度を追加した(+60)[ポリの4番目のポイントとして]の例を検討してください。この場合、-180から180が必要です。この方法を使用すると、61から180と-76から-180が得られます。
プリス

@Pris-経度180 / -180(結局同じ点)を、すべての場合でボックスの一部にしたいのですが、それが最小のボックスではない場合でも?
-martinstoeckli

ここでの重要な違いは、ポイントが多角形を形成することです。編集をご覧ください。
プリス

@プリス-まあ、これは本当にトリッキーです。2つのポイント間のエッジのすべてのポイントが頂点ポイントとしてもカウントされるようです。
-martinstoeckli

1

これは、Google Maps APIを使用してJavaScriptで簡単に実行できます。以下は、そのAPIを使用してクライアント側で行う方法です。

var bounds = new google.maps.LatLngBounds();

//Recursively loop through your coordinate list
    latLng = new google.maps.LatLng(<YourLat>, <YourLon>);
    bounds.extend(latLng);
//

extentBox = new google.maps.Rectangle({
    bounds: bounds,
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#FF0000",
    fillOpacity: 0.35
});
extentBox.setMap(map);

ちょっと、答えてくれてありがとう、しかし、APIを呼び出すか、既存のソリューションを使用するのではなく、実際のメソッドを探しています。
プリス

あなたは私にbounds.extendメソッドを与えました、私はこの正確な解決策を探していたので、ありがとう!
トムソンカマー

これはポリゴンで機能しますか?長方形を使用してあなたを見ます。
ダニーG

1

私はこれを行う方法を見つけたかもしれないと思う。予備的な実装は機能しますが、見落としたエッジケースがあるかどうかはわかりません。このソリューションに問題がある場合は、指摘してください。

ポリゴンを構成するポイントだけでなく、経度/緯度の範囲を取得することに関心があることを考えると、問題を試みる1つの方法は、順序付けられた座標セットに沿って最初から最後まで実際に「歩く」ことです。開始点を指定して、地球の中心を基準として時計回りおよび反時計回りにどれだけ移動したかを追跡し、ポリゴンが完成するまで続けます。

ここに画像の説明を入力してください

出発点からCWとCCWを移動する距離の範囲を取得できます。これにより、通常の場合(画像の左)に正しい境界を導き出すのに十分な情報が得られます。ポリゴンが中心を完全に回る、または中心を横切る場合、返される移動角度は360度になります。

この方法は、ポリゴンが地球の表面を横切るのではなく、「ハグ」している場合にも機能します。トロント(lon:-79)からロンドン(lon:-5)、東京(lon:139)、そして戻る(同じ順序で)地球の表面に沿って移動する人を示すポリゴンがある場合、範囲[-79〜139]を取得します。

ポリゴンが中心を横切る場合(+90と-90の2つの隣接する点を想像してください)、これは完全なスイープ(360度)であると考えますが、どちらの方法でも可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.