空間リレーションシップ
GIS の主要な目的は、あるフィーチャ同士が重なり合うのか、一方が他方に包含されているのか、一方が他方と交差しているのかといった、フィーチャ間の空間リレーションシップの判断です。
ジオメトリの空間的な関係はさまざまなものが考えられます。以下に、ジオメトリが別のジオメトリとの間にどのような空間リレーションシップをもつことができるかの例を示します。
- ジオメトリ B を通過するジオメトリ A。
- ジオメトリ B に完全に包含されたジオメトリ A。
- ジオメトリ B を完全に包含したジオメトリ A。
- 互いに交差または接触しないジオメトリ。
- 完全に一致するジオメトリ。
- 相互に重なり合うジオメトリ。
- 一点で接触するジオメトリ。
こうしたリレーションシップの有無を判断するには、空間リレーションシップ関数を実行します。この種の関数では、クエリで指定したジオメトリについて次のプロパティが比較されます。
- ジオメトリによって占有されていないすべての空間である、ジオメトリ外部(E)
- ジオメトリによって占有されているすべての空間である、ジオメトリ内部(I)
- ジオメトリの内部と外部の境界である、ジオメトリ境界(B)
空間リレーションシップのクエリを構築する際は、検索する空間リレーションシップのタイプおよび比較の対象となるジオメトリを指定します。このクエリでは、指定した空間リレーションシップにジオメトリが相互に参加しているか、参加していないかが true または false として返されます。多くの場合、空間リレーションシップのクエリを WHERE 句に設定することで、結果セットにフィルタを適用するために使用します。
たとえば、提案されている開発用地の位置が格納されたテーブル、および考古学的に重要な場所の位置が格納されたテーブルがある場合には、開発用地のテーブルのフィーチャが考古学的な場所に交差していないことを確認することが考えられます。このようなときには、考古学的な場所に交差する開発用地がないことを確認し、交差がある場合は該当する開発案の ID を返すクエリを発行するとよいでしょう。この例では、ST_Disjoint 関数を使用しています。
SELECT d.projname,a.siteid
FROM dev d, archsites a
WHERE sde.st_disjoint(d.shape,a.shape)= 'f'
projname siteid
bow wow chow A1009
このクエリでは、分断されていない、つまり互いに交差している用地である開発の名前と考古学的な場所の ID が返されます。考古学的な場所である A1009 に交差する 1 つの開発プロジェクト Bow Wow Chow が返されます。
Oracle や PostgreSQL で空間リレーションシップを評価する ST_Geometry については、「ST_Geometry 用の空間リレーションシップ関数」をご参照ください。IBM DB2、IBM Informix、Oracle Spatial、PostGIS、または Microsoft SQL Server の各空間タイプで使用する空間リレーションシップ関数については、各データ管理システムのドキュメントをご参照ください。