緯度/経度で複数のレイヤーの境界ボックスを計算する方法は?


11

主にAGS 9.x、AGS 10、WMS 1.xなど、あらゆる種類のマップサービスのパフォーマンステストを行うアプリケーションを作成しています。

アプリケーションの一部には、サービスの全範囲内で、個々のリクエストに対してランダムな境界ボックスを生成することが含まれます。この部分は、(たとえば、AGSサービスのfullExtentプロパティを通じて)サービスの全範囲が既知である場合、地理座標系と投影座標系で正常に機能します。

私の問題はWMSにあります。GetCapabilities応答の各レイヤーは、境界領域を1以上のCRSで定義できます。アプリケーションの一部では、サービスのCRSが地理的であるか投影されているかを知る必要があるため、WMSで曖昧さを取り除くために、常に定義されているレイヤーのLatLonBoundingBoxとEPSG:4326を常に使用しています。次に、個別のリクエスト(ランダム化された)に入るすべてのレイヤーに基づいて、完全なサービス境界ボックスを計算する必要があります。ここがトリッキーになります。

緯度/経度の境界ボックスごとに、LLx(左下の経度)はURx(右上の経度)よりも大きいまたは小さい可能性があるため、迷子になっています。四角形または円形の図を描き始めるたびに、私はアプローチを考え出したと思い、それを台無しにして私の脳がドロドロになるケースを見つけます。

私はそれが機能するまでそれをスラッシュし続けます、そして私がここにそれを投稿する解決策を手に入れたら、私の人生を容易にする受け入れられた完全にテストされたアプローチがあるはずだと確信しています。今は見つかりません。


この記事ではそうです。stonybrook.edu / libmap / coordinates / seriesa / no2 / a2.htm(グローバルゴッチャのセクション)「残念ながら、グローバルゴッチャを解決するためのシンプルでエレガントなソリューションはありません」と読みました。すべてのレイヤー範囲をスキャンすることを考えています。URx<LLxの場合、範囲を単に-180 +180に設定します。同じ記事は、ほとんどのGISがこれらの座標を持つポリゴンを2つの別々のフィーチャに分割することを示唆しています。
tomfumb

この優れた投稿をもう一度見つけるのに苦労した検索エンジンのキーワード:最小境界ボックス、複数の境界ボックスのマージ、国際日付変更線、不連続性、最小円セグメント
letmaik

回答:


6

参照記事は思慮深いです。ただし、「シンプルでエレガントな」ソリューションがある思います。地理データセットには、2種類の境界ボックスがあります。+ -180子午線にまたがらないものは、通常どおり保存および検索できます。+ -180子午線をまたぐものは、半相補的な形式で保存できます。つまり、通常どおり緯度の範囲を保存しますが、代わりに、ボックスに含まれていない経度の範囲を保存します(ビットを切り替えて、どの形式かを示しますのストレージが使用されています)。基本的に、地理的インデックスや検索ツリー構造に変更を加える必要はありません。検索アルゴリズムに必要な変更はわずかです。

とにかく、ここに質問自体の解決策があります。


入力が一連の境界ボックス記述子((LLx、LLy)、(URx、URy))であると予想していると思います。ここで、

  • -540 <= LLx、-180 <= URx、LLx <= 180、およびURx <=180。また、-90 <= LLy <= URy <= 90。

  • (経度、緯度)=(x、y)のポイントは、次の場合にのみ、BB内にあると見なされます。

    1. LLy <= y <= URyおよび

    2. いずれか LLX <= X <= URX 又は LLX - 360 <= X <= URX。

出力では、すべての入力の和集合を含む最小の境界ボックスのパラメーターが必要です。

明らかに、最小バウンディングボックス(MBR)のy制限は、y値の最小値と最大値になります。x制限については、ラインスイープを使用して最大のギャップを見つけます。

アルゴリズムの説明は次のとおりです。それを説明するために、入力が4つのボックスで構成されているとします。

((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))

以下は、最初のボックス、次に最初の2つ、最初の3つ、すべてのボックスのボックス(赤)とMBR(黒)の図です。

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

2番目のステップで、東半球と西半球のボックスが、+-180度の子午線を横切るMBRで囲まれ、このマップ上で2つの別個のボックスとして表示されることに注目してください。最後のステップでは、南アメリカと南極大陸の間の小さなボックスを収容するために、そのMBRを東方向に拡張する必要があります。

  1. ボックスのすべてのx座標を抽出し、それらを360を法として計算し(-180..180の範囲に配置するため)、昇順で並べ替え、最初の値(360度ずつ増加)を最後に追加して折り返します周り:

    -149, -90, -81, -77, -69, -36, 77, 156, 211
    

    (211と-149は同じ子午線であることに注意してください。)

  2. 各x座標は、先行する座標(ただし、先行する値は含まない)とその座標の間の間隔を表すものと考えてください。たとえば、-77は-81から-77までのすべての値を表しますが、-81は含みません。最初の後にこれらのそれぞれについて、その間隔を含むボックスの数を数えます。

    1, 0, 1, 0, 1, 0, 1, 0
    

    たとえば、最初の「1」は、1つのボックスが-149から-90までの間隔をカバーすることを意味します。(3番目のボックスです。)

    最適化として、x間隔をカバーするボックスを見つけたらすぐにカウントを停止し、次のx間隔に進むことができます。私たちは、どのボックスでもカバーされない可能性のある間隔を特定しようとしているだけです。

  3. (1)で並べ替えられたx座標の最初の差を計算します。

     59, 9, 4, 8, 33, 113, 79, 55
    

    これらを(2)のカバレッジカウントと一致させます。カバレッジカウントが0である最大の差を見つけます。ここで113は、前の配列の6番目の要素であると等しくなっています。 これは、ボックスのコレクションによって残された経度の最大のギャップです。

    (興味深いことに、最大値が複数の場所で発生する可能性は、ソリューションが必ずしも一意であるとは限らないことを示しています。ボックスのセットに対して複数のMBRが存在する可能性があります。必須などの追加条件を追加することにより、一意のMBRを定義できますMBR内の+ -180子午線までの平均距離は可能な限り大きくなるようにしてください。同点を解決するには、最東端のソリューションを選択します(たとえば)。

  4. 対応する間隔を見つけます。ここでは、-36〜77です。これは、MBRにない経度の範囲です。したがって、その補数を-180から180の範囲で取得します。ここで、補数は2つの互いに素な区間で、1つは-180から-36まで、もう1つは77から180までです。 -180度子午線:ここでは-283から-36まで(または、77から324まで)。

  5. MBRのコーナーには、y値の最小値と最大値を使用します。

    ((-283, -85), (-36, 81))
    

ポイント4の最後の文で、「-283から-36まで」と書くのはなぜですか。なぜ77から-36ではないのですか?
letmaik

1
@neo「77から-36」は空の間隔であるため。(定義により、間隔[a、b]は、a <= x <= bとなるようなすべての数値xで構成されます。a= 77およびb = -36の場合、そのような数値はありません。) 、経度に関する限り、77から-36は完全に明確です。」問題は、そうではないということです。77から180 = -180まで進み、-36まで続くのでしょうか、それとも77から-36 まで下がりますか?そのようなあいまいさを避けるために、私は注意することを選びました。
whuber

私はあなたの答えをすばやく実装しました(gistを参照)。ボックスに間隔が含まれているかどうかを確認するには、ボックスの経度のラップを解除する必要がありました。それ以外の場合は、不連続点を横切るボックスに対しては機能しません。初心者であるため、これは私には完全には明らかではありませんでした:)
letmaik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.