バウンディングボックスは、あらゆるマッピングスタックで最もシンプルで実用的な空間プリミティブです。緯度・経度空間での矩形を表す4つの数値であり、使うほぼすべてのAPI呼び出し、GeoJSONファイル、地図ライブラリに登場します。
このガイドでは、バウンディングボックスとは何か、知っておくべきフォーマット規則、本番で役立つパターン、そしてすべての開発者が一度は引っかかる落とし穴を解説します。
定義
バウンディングボックス(bbox)は、フィーチャーまたは点のセットを含む最小の軸平行矩形です。「軸平行」とは辺が緯度・経度の軸に沿っていること、つまり矩形が回転していないことを意味します。bboxは4つの数値で表現されます。西側の経度、南側の緯度、東側の経度、北側の緯度です。
パリの公式市域bboxはおおよそ[2.224, 48.8156, 2.4699, 48.9022]です。フランス本土はおおよそ[-5.142, 41.333, 9.560, 51.089]。地球全体は[-180, -90, 180, 90]です。
bboxは常に2つの対角コーナーです。非矩形の形状を表現することはできませんが、どんな形状をも包む矩形を表現でき、高速な空間フィルタリングには十分です。
フォーマット問題
bboxのフォーマット規則はシステム間で一貫しておらず、その不一致がほとんどのbboxバグの原因です。
GeoJSON、OGC標準、ほとんどのモダンなAPI: [west, south, east, north]、同等に[minLng, minLat, maxLng, maxLat]。経度が先、緯度が後、両方ともWGS84。
一部のウェブ地図ライブラリ(Leaflet、Mapbox GL boundsオブジェクト): _southWestと_northEastコーナーを持つLatLngBoundsオブジェクト。緯度が先、経度が後。
多くの古いAPIとCSVエクスポート: [south, west, north, east](緯度が先)。仕様を読みましょう。
タイルサービスとWMS: タイルがEPSG:3857の場合、投影の単位(緯度・経度ではなくWeb Mercatorメートル)でのbbox。
防御的なルール:自分のコードでは生の4要素配列を使わないこと。名前付きフィールドを持つ型付きオブジェクト({ west, south, east, north })でラップし、順序を明示的にします。APIの境界で変換します。
バウンディングボックスが活躍する場面
bboxは最も高速な空間フィルタです。3つの古典的な使い方があります。
フィーチャーに合わせて地図をフィットさせる。 ユーザーが検索結果にたどり着いたとき、map.fitBounds(bbox)を呼び出せば、地図は適切なパディングでフィーチャーを表示するようにズームとパンを調整します。モダンなすべての地図ライブラリがこのプリミティブを持っています。
エリアでAPIクエリをフィルタリングする。 データベースエンジンと検索APIはbboxを非常に効率的にインデックスします。「このビューポート内の全スポットを表示する」というクエリは、可視bboxをサーバーに送り、サーバーが空間インデックスを使って一致するレコードのみを返します。これがビューポートベース検索の基盤です。
オートコンプリートとジオコーディングにバイアスをかける。 ユーザーの現在の地図bboxをビューポートバイアスとして渡します。ジオコーダーはbbox内の結果をより重く重み付けするため、ニューヨークのビューポートで「Liberty」と入力すると、世界中の他のどのLibertyよりも先に自由の女神が返ってきます。
4つ目の、あまり明らかでない用途:bboxはベクタータイルシステムの管理単位です。各タイルは既知のズームで既知のbboxをカバーし、レンダラーはそれらを合成して可視地図を作ります。
APIが返すもの
ほとんどのジオコーディングAPIはすべてのマッチとともにbboxを返します。マッチしたフィーチャーのサイズ(国のbboxは巨大、建物のbboxは小さい)と地図のフィット方法の両方を示すためです。「France」に対するジオコーディングレスポンスは国規模のbboxを返し、「10 Downing Street」に対するレスポンスは建物規模のbboxを返します。
返されたbboxのサイズを精度の健全性チェックに使えます。「国」精度でマッチしているのに建物サイズのbboxを返すクエリは疑わしいです。「屋根」精度でマッチしているのに都市サイズのbboxを返すクエリは壊れています。
反子午線をまたぐバウンディングボックス
微妙な落とし穴:180度の反子午線をまたぐbbox(ロシア、太平洋、フィジーなど)はwest < eastでは表現できません。回り込んでしまうためです。規則はシステムによって異なります。
- 一部のシステムはこのようなbboxを、反子午線の両側に1つずつ、2つに分割します。
- 一部のシステムは
west > eastを許可し、「回り込む」と解釈します。 - GeoJSONは回り込みを許可しますが、相互運用性のために分割を推奨しています。
ほとんどのヨーロッパや単一国のユースケースではこの問題は起きません。グローバルなプロダクト(航空路線、海運、漁業)を構築する場合は、反子午線のケースを明示的にテストしましょう。
バウンディングボックスとポリゴン
bboxは矩形です。実際のフィーチャーが矩形であることはほとんどありません。フランスのbboxには大西洋の一部とスペインが含まれます。マンハッタンのbboxにはニュージャージーとクイーンズの一部が含まれます。
矩形近似で十分な場合(地図のフィット、高速な事前フィルタリング)、bboxが適切なツールです。ポイントがフィーチャーの内部に実際にあるかどうかを確認する必要があるときは、実際の境界ジオメトリに対してポイントインポリゴン計算が必要です。一般的な本番パターン:まずbboxでフィルタリング(高速、インデックス可能、レコードの99%を排除)、次に残ったものにポイントインポリゴンを実行(低速だが正確)。この2段階アプローチが、ほとんどの空間データベースが内部でどう動作するかです。
コンピュータビジョンのバウンディングボックス
物体検出、ロボティクス、3Dレンダリングで「方向付きバウンディングボックス」を見かけることがあるかもしれません。それは別の概念です。OBBは軸平行ボックスより緊密にフィーチャーに収まるよう回転されています。地理空間の作業では軸平行bboxが標準です。クリーンにインデックスでき、タイルグリッドに収まり、オーバーラップのテストが自明だからです。方向付きbboxは回転矩形数学が必要なときに登場しますが、地図では稀でコンピュータビジョンでは一般的です。
MapAtlasでのバウンディングボックス
Geocoding APIとSearch APIのすべての結果は、GeoJSONとモダンな地図ライブラリが期待するWGS84経度・緯度順序で、マッチしたフィーチャーの範囲を持つbboxフィールドを返します。ジオコーディングをビューポートにバイアスさせるためにboundary.rect.*パラメータを渡すことができ、Isochrone APIは移動時間ポリゴンをラップするbboxとともに返すため、自分で計算することなく地図をフィットさせることができます。
GeoJSONとbboxがより大きな空間データの絵の中でどう収まるかについての実践的な入門は、GeoJSONとは何かとジオコードとは何かを参照してください。
よくある質問
バウンディングボックスとは何ですか?
バウンディングボックス(bboxと略されることが多い)は、地理的なフィーチャーまたは点のセットを含む最小の軸平行矩形です。4つの数値で表現されます。最小・最大の経度と最小・最大の緯度です。バウンディングボックスはマッピングのあらゆる場面で使われます。フィーチャーに合わせて地図をフィットさせる、エリアでデータベースクエリをフィルタリングする、タイルの範囲を定義する、ジオコーディング結果を特定地域にバイアスさせる、などの用途です。本番コードで最もシンプルで高速な空間プリミティブです。
バウンディングボックスの標準フォーマットは何ですか?
GeoJSONとほとんどのモダンなAPIは[west, south, east, north]([minLng, minLat, maxLng, maxLat]とも書く)の順序を使います。これがデフォルトとすべきフォーマットです。一部の古いAPIやCSVエクスポートは[south, west, north, east](緯度が先)を使い、4つの別フィールドを使うものもあります。使用するAPIやフォーマットのドキュメントを必ず確認しましょう。最も多いミスはlat/lngの順序の混在で、ボックスが地球の反対側に表示されてしまいます。
バウンディングボックスと方向付きバウンディングボックスの違いは何ですか?
通常のバウンディングボックスは軸平行です。辺が緯度・経度の軸に沿って走ります。方向付きバウンディングボックス(OBB、コンピュータビジョンやゲームエンジンで一般的)はフィーチャーによりぴったり収まるよう回転されており、面積は小さくなりますが計算が複雑になります。地理空間の作業では、軸平行bboxが標準です。空間データベースにクリーンにインデックスでき、タイルグリッドに収まり、オーバーラップの確認が自明です。方向付きバウンディングボックスは3Dレンダリング、物体検出、物理エンジンで登場します。
バウンディングボックスでジオコーディングAPIをフィルタリングするには?
bboxをビューポートバイアスパラメータとして渡します。MapAtlas Geocoding APIでは`boundary.rect.min_lon`、`boundary.rect.min_lat`、`boundary.rect.max_lon`、`boundary.rect.max_lat`を送ると、ジオコーダーはそのエリア内の結果をエリア外より高くランク付けします。これは地図上のオートコンプリートに不可欠です。ユーザーがパンするたびにbboxを更新することで、サジェストが見ているものと一致します。bboxバイアスがないと、'Springfield'のオートコンプリートはグローバル人気が最も高いSpringfieldを返しますが、それはたいていユーザーが意図したものではありません。

