参照記事は思慮深いです。ただし、「シンプルでエレガントな」ソリューションがあると思います。地理データセットには、2種類の境界ボックスがあります。+ -180子午線にまたがらないものは、通常どおり保存および検索できます。+ -180子午線をまたぐものは、半相補的な形式で保存できます。つまり、通常どおり緯度の範囲を保存しますが、代わりに、ボックスに含まれていない経度の範囲を保存します(ビットを切り替えて、どの形式かを示しますのストレージが使用されています)。基本的に、地理的インデックスや検索ツリー構造に変更を加える必要はありません。検索アルゴリズムに必要な変更はわずかです。
とにかく、ここに質問自体の解決策があります。
入力が一連の境界ボックス記述子((LLx、LLy)、(URx、URy))であると予想していると思います。ここで、
出力では、すべての入力の和集合を含む最小の境界ボックスのパラメーターが必要です。
明らかに、最小バウンディングボックス(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を東方向に拡張する必要があります。
ボックスのすべてのx座標を抽出し、それらを360を法として計算し(-180..180の範囲に配置するため)、昇順で並べ替え、最初の値(360度ずつ増加)を最後に追加して折り返します周り:
-149, -90, -81, -77, -69, -36, 77, 156, 211
(211と-149は同じ子午線であることに注意してください。)
各x座標は、先行する座標(ただし、先行する値は含まない)とその座標の間の間隔を表すものと考えてください。たとえば、-77は-81から-77までのすべての値を表しますが、-81は含みません。最初の後にこれらのそれぞれについて、その間隔を含むボックスの数を数えます。
1, 0, 1, 0, 1, 0, 1, 0
たとえば、最初の「1」は、1つのボックスが-149から-90までの間隔をカバーすることを意味します。(3番目のボックスです。)
最適化として、x間隔をカバーするボックスを見つけたらすぐにカウントを停止し、次のx間隔に進むことができます。私たちは、どのボックスでもカバーされない可能性のある間隔を特定しようとしているだけです。
(1)で並べ替えられたx座標の最初の差を計算します。
59, 9, 4, 8, 33, 113, 79, 55
これらを(2)のカバレッジカウントと一致させます。カバレッジカウントが0である最大の差を見つけます。ここで113
は、前の配列の6番目の要素であると等しくなっています。 これは、ボックスのコレクションによって残された経度の最大のギャップです。
(興味深いことに、最大値が複数の場所で発生する可能性は、ソリューションが必ずしも一意であるとは限らないことを示しています。ボックスのセットに対して複数のMBRが存在する可能性があります。必須などの追加条件を追加することにより、一意のMBRを定義できますMBR内の+ -180子午線までの平均距離は可能な限り大きくなるようにしてください。同点を解決するには、最東端のソリューションを選択します(たとえば)。
対応する間隔を見つけます。ここでは、-36〜77です。これは、MBRにない経度の範囲です。したがって、その補数を-180から180の範囲で取得します。ここで、補数は2つの互いに素な区間で、1つは-180から-36まで、もう1つは77から180までです。 -180度子午線:ここでは-283から-36まで(または、77から324まで)。
MBRのコーナーには、y値の最小値と最大値を使用します。
((-283, -85), (-36, 81))