ST_Geometry 用の空間アクセサ関数
空間アクセサ関数はジオメトリのプロパティを返します。ST_Geometry フィーチャの次のプロパティを規定するアクセサ関数が用意されています。
次元性
ジオメトリの次元(ディメンション)とは、ジオメトリの空間範囲を定義するのに必要な最小限の座標(なし、X、Y)です。
ジオメトリは、0 次元、1 次元、または 2 次元です。
これらの次元は次のように定義されています。
- 0: 長さも面積もない
- 1: 長さがある(X または Y)
- 2: 面積がある(X および Y)
ポイント サブタイプとマルチポイント サブタイプは 0 次元です。0 次元のフィーチャを表すポイントは 1 つの座標でモデリングできますが、データを表すマルチポイントは接続されていない座標の集団としてモデリングしなければなりません。
ラインストリング サブタイプとマルチラインストリング サブタイプは 1 次元です。これらは、道路セグメントや河川系の分岐など、線形となるフィーチャを格納します。
ポリゴン サブタイプとマルチポリゴン サブタイプは 2 次元です。木立、土地区画、水域など、定義可能なエリアを囲む外周を持つフィーチャは、ポリゴン データ タイプまたはマルチポリゴン データ タイプのいずれかでレンダリングできます。
次元は、サブタイプのプロパティとして重要なだけでなく、2 つのフィーチャの空間リレーションシップを決定する上でも重要です。結果として得られるフィーチャの次元によって、操作を正常に行えるどうかが決まります。フィーチャの次元を調べることで、それらを比較すべき方法が決定されます。
ジオメトリの次元を評価するには、ST_Dimension 関数を使用します。この関数は ST_Geometry フィーチャを受け取り、その次元を整数として返します。この関数の構文と使用例については、「ST_Dimension」をご参照ください。
ジオメトリの座標も次元を持ちます。ジオメトリが X 座標と Y 座標しか持たない場合、座標は 2 次元です。 ジオメトリが X 座標、Y 座標、Z 座標を持つ場合、座標は 3 次元です。 ジオメトリが X 座標、Y 座標、Z 座標、M 座標を持つ場合、座標は 4 次元です。
ST_CoordDim 関数を使用して、ジオメトリの座標値の次元を確認できます。
Z 座標
一部のジオメトリには、高度や深度(3 次元)が関連付けられています。フィーチャのジオメトリを構成する各ポイントには、必要に応じて、地表面に対する高度や深度を表す Z 座標を含めることができます。
ST_Is3D 関数は、ST_Geometry を受け取り、Z 座標が存在する場合は 1(TRUE)を返し、そうでない場合は 0(FALSE)を返します。
ポイントの Z 座標は ST_Z 関数を使用して取得できます。
メジャー
メジャーは各座標に割り当てられる値です。メジャーはリニア リファレンス アプリケーションとダイナミック セグメンテーション アプリケーションで使用されます。たとえば、幹線道路沿いの距離標識の場所には、その位置を示すメジャーが含まれることがあります。メジャーの値は、倍精度数値として格納できる任意の値を表します。
ST_IsMeasured 関数は、ST_Geometry を受け取り、メジャーが含まれている場合は 1(TRUE)を返し、そうでない場合は 0(FALSE)を返します(Oracle および SQLite の ST_Geometry 実装だけで使用されます)。
ST_M 関数を使用して、ポイントのメジャー値を検索することができます。
ジオメトリ タイプ
ジオメトリ タイプは、ジオメトリック エンティティのタイプを表します。たとえば、次のものがあります。
- ポイントとマルチポイント
- ラインとマルチライン
- ポリゴンとマルチポリゴン
ST_Geometry は、さまざまなサブタイプを格納できるスーパークラスです。ジオメトリのサブタイプを判定するには、ST_GeometryType 関数または ST_Entity(Oracle および SQLite のみ)関数を使用します。
ポイント(頂点)のコレクションとポイントの数
ジオメトリは 0 個以上のポイントで構成されます。ポイントの数が 0 である場合、ジオメトリは空であるとみなされます。ポイント サブタイプは 0 または 1 個のポイントに制限される唯一のジオメトリであり、その他すべてのサブタイプは 0 個以上のポイントで構成されます。
ST_Point
ST_Point は、座標空間で場所を 1 つ占有する 0 次元のジオメトリです。ST_Point には XY 座標値が 1 つあり、常にシンプルであり、境界は NULL です。ST_Point は、油田、建造物、水質調査サイトといったフィーチャを定義するために使用されます。
ST_Point データ タイプだけを対象とする関数には、次のものがあります。
ST_MultiPoint
ST_MultiPoint は ST_Point のコレクションであり、そのエレメントと同様にディメンションは 0 です。同じ座標空間を占めるエレメントがない場合、ST_MultiPoin はシンプルです。ST_MultiPoint の境界は NULL です。ST_MultiPoint は、地上波パターンや感染症の発生ポイントなどを定義するために使用されます。
長さと面積
長さと面積は、ジオメトリの測定可能な特徴です。ラインストリングおよびマルチラインストリングのエレメントは 1 次元であり、長さを有します。ポリゴンとマルチポリゴンのエレメントは 2 次元サーフェスなので、面積の測定が可能です。ST_Length 関数と ST_Area 関数を使用して、長さと面積のプロパティを取得できます。計測単位はデータの格納方法によって変わります。
ST_LineString
ST_LineString は、線形補間されたパスを定義する連続したポイントとして格納される 1 次元オブジェクトです。ST_LineString はその内部と交わっていなければシンプルです。閉じた ST_LineString の端点(境界)は、空間内の同じポイントを占めます。ST_LineString は閉じていてシンプルである場合はリングです。ST_LineString は ST_Geometry スーパークラスから複数のプロパティを継承しており、その中には長さがあります。ST_LineString は、道路、河川、電線などの線形フィーチャを定義するためによく使用されます。
端点は、ST_LineString が閉じていなければ、通常は ST_LineString の境界を形成します。ST_LineString が閉じていれば、境界は NULL です。ST_LineString の内部は、閉じていなければ端点間を結ぶパスであり、閉じている場合は内部が連続しています。
ST_LineString を対象とする関数には、次のものがあります。
- ST_StartPoint は、指定された ST_LineString の最初のポイントを返します。
- ST_EndPoint は、ST_LineString の最後のポイントを返します。
- ST_PointN は、ST_LineString と n 番目のポイントへのインデックスを受け取り、そのポイントを返します。
- ST_Length は ST_LineString の長さを倍精度数値として返します。
- ST_NumPoints は、ST_LineString を評価し、そのポイントの数を整数として返します。
- ST_IsRing は、指定された ST_LineString がリングの場合は 1(TRUE)を返し、そうでない場合は 0(FALSE)を返します。
- ST_IsClosed は、ST_LineString が閉じている場合は 1(TRUE)を返し、閉じていない場合は 0(FALSE)を返します。
次の図は、ST_LineString オブジェクトの例を示しています。(1)はシンプルで閉じていない ST_LineString、(2)はシンプルではなく閉じていない ST_LineString、(3)は閉じていてシンプルな ST_LineString(リング)、(4)は閉じていてシンプルではない ST_LineString(リングではない)です。
ST_MultiLineString
ST_MultiLineString は、ST_LineString のコレクションです。ST_MultiLineString は、ST_LineString エレメントの端点でのみ交わる場合はシンプルです。ST_LineString エレメントの内部が交差している場合、ST_MultiLineString はシンプルではありません。
ST_MultiLineString の境界は、ST_LineString エレメントの交差していない端点です。ST_MultiLineString のすべてのエレメントのすべての端点が交差している場合、ST_MultiLineString の境界は NULL です。ST_Geometry スーパークラスから継承される他のプロパティに加えて、ST_MultiLineString には長さがあります。ST_MultiLineString は、河川や道路網など、連続していないライン フィーチャを定義するために使用されます。
次の図は、ST_MultiLineString の例を示しています。(1)はシンプルな ST_MultiLineString であり、その境界は 2 つの ST_LineString エレメントの 4 つの端点です。(2)は、ST_LineString エレメントの端点のみが交わっているため、シンプルな ST_MultiLineString です。境界は 2 つの交わっていない端点です。(3)は ST_LineString エレメントの内部の 1 つ が交わっているので、シンプルではない ST_MultiLineString です。この ST_MultiLineString の境界は、3 つの交わっていない端点です。(4)はシンプルで閉じていない ST_MultiLineString です。これが閉じていないのは、ST_LineString エレメントが閉じていないからです。これがシンプルなのは、ST_LineString エレメントの内部が 1 つも交わっていないからです。(5)はシンプルで閉じている 1 つの ST_MultiLineString です。これが閉じているのは、すべてのエレメントが閉じているためです。これがシンプルなのは、エレメントの内部が 1 つも交わっていないからです。
ST_MultiLineString を対象とする関数には、ST_Length と ST_IsClosed があります。
ST_Length 関数は、ST_MultiLineString を評価し、すべての ST_LineString エレメントの長さを累計した値を倍精度数値として返します。
ST_IsClosed は、指定された ST_MultiLineString が閉じている場合は 1(TRUE)を返し、閉じていない場合は 0(FALSE)を返します。
ST_Polygon
ST_Polygon は、一連のポイントとして格納される 2 次元サーフェスであり、外部の境界リングと 0 個以上の内部リングを定義します。ST_Polygon は常にシンプルです。ST_Polygon は、土地区画、水域、行政区域など、空間的な範囲を持つフィーチャを定義します。
次の図は、ST_Polygon オブジェクトの例を示しています。(1) は境界が外部リングによって定義される ST_Polygon です。(2) は境界が外部リングと 2 つの内部リングによって定義される ST_Polygon です。内部リングの内側にある領域は、ST_Polygon の外部の一部です。(3) は、リングが 1 つの接点で交わっているので、有効な ST_Polygon です。
外部リングと内部リングは ST_Polygon の境界を定義し、リング間で囲まれた空間は ST_Polygon の内部を定義します。ST_Polygon のリングは接点で交わる場合がありますが、決して交差しません。ST_Geometry スーパークラスから継承される他のプロパティに加えて、ST_Polygon には面積があります。
ST_Polygon を対象とする関数には、次のものがあります。
- ST_Area は ST_Polygon の面積を倍精度数値として返します。
- ST_Centroid は ST_Polygon のエンベロープの中心を表す ST_Point を返します。
- ST_ExteriorRing は ST_Polygon の外部リングを ST_LineString として返します。
- ST_InteriorRingN は、ST_Polygon とインデックスを評価し、n 番目の内部リングを ST_LineString として返します。
- ST_NumInteriorRing は ST_Polygon に含まれている内部リングの数を返します。
- ST_PointOnSurface は指定された ST_Polygon のサーフェス上にあることが保証される ST_Point を返します。
ST_MultiPolygon
ST_MultiPolygon の境界は、そのエレメントの外部リングと内部リングの長さを累積したものです。ST_MultiPolygon の内部は、そのエレメントである ST_Polygon の内郭を累積したものとして定義されます。ST_MultiPolygon のエレメントの境界は接点でのみ交わる場合があります。ST_Geometry スーパークラスから継承される他のプロパティに加えて、ST_MultiPolygon には面積があります。ST_MultiPolygon は、森林地帯や太平洋諸島のような連続していない空間的な範囲を持つフィーチャを定義します。
次の図は、ST_MultiPolygon の例を示しています。(1)は 2 つの ST_Polygon エレメントからなる ST_MultiPolygon です。境界は 2 つの外部リングと 3 つの内部リングによって定義されます。(2)は 2 つの ST_Polygon エレメントからなる ST_MultiPolygon です。境界は 2 つの外部リングと 2 つの内部リングによって定義されます。2 つの ST_Polygon エレメントは接点で交わっています。
ST_MultiPolygon を対象とする関数には、ST_Area、ST_Centroid、ST_PointOnSurface があります。
ST_Area 関数は、ST_MultiPolygon の ST_Polygon エレメントの累積 ST_Area を表す倍精度数値を返します。
ST_Centroid 関数は、ST_MultiPolygon のエンベロープの中心である ST_Point を返します。
ST_PointOnSurface 関数は、ST_MultiPolygon を評価し、その ST_Polygon エレメントのいずれかのサーフェス上にあることが保証される ST_Point を返します。
マルチパート ジオメトリのシンプル ジオメトリの数
マルチパート ジオメトリは複数のジオメトリから構成されています。
ST_MultiPoint、ST_MultiLineString、ST_MultiPolygon といったマルチパート ジオメトリに含まれる個々のジオメトリの数を取得する場合は、ST_NumGeometries 関数を使用します。この関数は、ジオメトリのコレクションに含まれる個々のエレメントの数を返します。
ST_GeometryN 関数を使用して、マルチパート ジオメトリの N 番目の位置にあるジオメトリを取得できます。ここで N は関数に指定した数値です。たとえば、マルチポイント ジオメトリの 3 番目のポイントを取得する場合、関数の実行時に 3 を指定します。
内部、外部、境界
すべてのジオメトリはその内部、外部、境界によって定義された空間内の位置を占めます。ジオメトリの外部は、そのジオメトリが占有していない空間すべてです。ジオメトリの内部は、そのジオメトリが占有している空間です。ジオメトリの境界は、その内部と外部の間に位置する場所です。サブタイプは内部プロパティと外部プロパティを直接継承しますが、境界プロパティはサブタイプごとに異なります。
ソース ST_Geometry の境界を取得するには、ST_Boundary 関数を使用します。構文と例については、「ST_Boundary」をご参照ください。
シンプルかシンプルでないか
ST_Geometry の ST_Point や ST_Polygon といったサブタイプは常にシンプルです。ただし、ST_LineString、ST_MultiPoint、ST_MultiLineString サブタイプは、シンプルな場合とシンプルでない場合があります。それらがシンプルなのは、それらに適用されるトポロジ ルールがすべて満たされている場合です。
トポロジ ルールとしては、次のようなものがあります。
- ST_LineString がシンプルなのは、その内部が交わっていない場合であり、交わっている場合はシンプルではありません。
- ST_MultiPoint がシンプルなのは、2 つのエレメントが同じ座標空間を占める(XY 座標が同じである)ことがない場合であり、そうでない場合はシンプルではありません。
- ST_MultiLineString がシンプルなのは、マルチラインストリングの内部とそのエレメントの内部が交わっていない場合であり、エレメントの内部が交わっている場合はシンプルではありません。
ST_LineString、ST_MultiPoint、ST_MultiLineString がシンプルかどうかを判断するには、ST_IsSimple 関数を使用します。ST_IsSimple 関数は、ST_Geometry を受け取り、ST_Geometry がシンプルである場合は 1(TRUE)、シンプルでない場合は 0(FALSE)を返します。この関数の構文と使用例については、「ST_IsSimple」をご参照ください。
空か空でないか
ジオメトリが空なのは、ポイントが 1 つもない場合です。空のジオメトリのエンベロープ、境界、内部、外部は null です。空のジオメトリは常にシンプルです。空のラインストリングとマルチラインストリングの長さは 0 です。空のポリゴンとマルチポリゴンの面積は 0 です。
ジオメトリが空かどうかを判断するには、ST_IsEmpty 関数を使用します。この関数は、ST_Geometry を分析して、ST_Geometry が空である場合は 1(TRUE)、空でない場合は 0(FALSE)を返します。この関数の構文と使用例については、「ST_IsEmpty」をご参照ください。
閉じているかリングか
ラインストリング ジオメトリは、閉じている場合とリングの場合があります。ラインストリングは、リングでなくても閉じていることがあります。ST_IsClosed 関数を使用して、ラインストリングが閉じているかどうかを判断できます。この関数は、ラインストリングの始点と終点が交わっている場合に TRUE を返します。リングとは、閉じていてシンプルなラインストリングです。ラインストリングがリングであるかどうかを判断するには、ST_IsRing 関数を使用します。この関数は、ラインストリングが閉じていてシンプルな場合に TRUE を返します。
構文と例については、「ST_IsClosed」および「ST_IsRing」をご参照ください。
エンベロープ
すべてのジオメトリにはエンベロープがあります。ジオメトリのエンベロープは、XY 座標の最小値と最大値によって形成される境界を示すジオメトリです。ポイント ジオメトリの場合、XY 座標の最小値と最大値は同じであるため、座標の回りに四角形すなわちエンベロープが作成されます。ライン ジオメトリの場合、ラインの両端がエンベロープの 2 辺を表し、残りの 2 辺はラインのすぐ上とすぐ下に作成されます。
ST_Envelope 関数は、ST_Geometry を受け取り、ソース ST_Geometry のエンベロープを表す ST_Geometry を返します。構文と例については、「ST_Envelope」をご参照ください。
ジオメトリの最小および最大 X、Y 座標値を個別に取得するには、ST_MinX、ST_MinY、ST_MaxX、ST_MaxY の各関数を使用します。
空間参照系
空間参照系は、各ジオメトリの座標変換マトリックスを識別します。座標系、解像度、許容値から構成されます。
ジオデータベースで認識される空間参照系はすべて spatial_references テーブルに格納されます。
ジオメトリの空間参照系に関する情報を取得するには、ST_SRID と ST_EqualSRS という 2 つの関数が使用されます。
ST_SRID 関数は、ST_Geometry を受け取り、空間参照 ID を整数として返します。
ST_EqualSRS 関数は、2 つの異なるフィーチャクラスの空間参照系が同一かどうかを判定します。
関数の構文と例については、「ST_SRID」と「ST_EqualSRS」をご参照ください。
空間参照の詳細については、「空間参照のプロパティ」をご参照ください。IBM の DBMS を使用している場合は、『IBM DB2 Spatial Extender and geodetic Extender User's Guide and Reference』または『IBM Informix Spatial DataBlade Module User's Guide』をご参照ください。
フィーチャのサイズ(PostgreSQL のみ)
フィーチャ(テーブル内の空間レコード)は一定の量(バイト単位)の格納領域を占めます。ST_GeoSize 関数を使用して、テーブル内の各フィーチャのサイズを判断できます。