WKT と WKB データから生成する ST_Geometry
Oracle でのジオメトリの ST_Geometry タイプへの変換
次に、空間データ形式、および空間データ形式と Oracle の空間タイプの間の変換方法について説明します。
OGC WKT(Well-Known Text)表現
WKT(Well-Known Text)表現は書式設定された ASCII テキスト形式の文字列で、これによりジオメトリを ASCII テキスト形式で交換できるようになります。これらの関数は、特別なプログラム構造を必要としない第三世代言語(3GL)または第四世代言語(4GL)のプログラムで使用することができます。
空間タイプには、テキストの説明からジオメトリを生成する関数がいくつか用意されています。次のような関数があります。
- ST_GeomFromText: 任意のジオメトリ タイプの WKT 表現から ST_Geometry を作成します。
- ST_PointFromText: ポイントの WKT 表現から ST_Point を作成します。
- ST_LineFromText: ラインストリングの WKT 表現から ST_LineString を作成します。
- ST_PolyFromText: ポリゴンの WKT 表現から ST_Polygon を作成します。
- ST_MPointFromText: マルチポイントの WKT 表現から ST_MultiPoint を作成します。
- ST_MLineFromText: マルチラインストリングの WKT 表現から ST_MultiLineString を作成します。
- ST_MPolyFromText: マルチポリゴンの WKT 表現から ST_MultiPolygon を作成します。
ST_AsText 関数は、既存のジオメトリを WKT 表現に変換します。
C プログラムでの WKT 表現の使用
ジオメトリの WKT 表現は、C プログラムに組み込むことができます。次に、このような実装の構造を定義します。「{}*」という表記は、中括弧で囲まれたトークンが 0 回以上繰り返されることを示します。中括弧は出力トークン リストには含まれません。メジャーが存在する場合、最後に指定する必要があります。PointZM はサポートされますが、PointMZ はサポートされません。
<Geometry Tagged Text> :=
| <Point Tagged Text>
| <LineString Tagged Text>
| <Polygon Tagged Text>
| <MultiPoint Tagged Text>
| <MultiLineString Tagged Text>
| <MultiPolygon Tagged Text>
<Point Tagged Text> :=
POINT <Point Text>
<LineString Tagged Text> :=
LINESTRING <LineString Text>
<Polygon Tagged Text> :=
POLYGON <Polygon Text>
<MultiPoint Tagged Text> :=
MULTIPOINT <Multipoint Text>
<MultiLineString Tagged Text> :=
MULTILINESTRING <MultiLineString Text>
<MultiPolygon Tagged Text> :=
MULTIPOLYGON <MultiPolygon Text>
<Point Text> := EMPTY
| <Point>
| Z <PointZ>
| M <PointM>
| ZM <PointZM>
<Point> := <x> <y>
<x> := double precision literal
<y> := double precision literal
<PointZ> := <x> <y> <z>
<x> := double precision literal
<y> := double precision literal
<z> := double precision literal
<PointM> := <x> <y> <m>
<x> := double precision literal
<y> := double precision literal
<m> := double precision literal
<PointZM> := <x> <y> <z> <m>
<x> := double precision literal
<y> := double precision literal
<z> := double precision literal
<m> := double precision literal
<LineString Text> := EMPTY
| ( <Point Text > {, <Point Text> }* )
| Z ( <PointZ Text > {, <PointZ Text> }* )
| M ( <PointM Text > {, <PointM Text> }* )
| ZM ( <PointZM Text > {, <PointZM Text> }* )
<Polygon Text> := EMPTY
| ( <LineString Text > {,< LineString Text > }*)
<Multipoint Text> := EMPTY
| ( <Point Text > {, <Point Text > }* )
<MultiLineString Text> := EMPTY
| ( <LineString Text > {,< LineString Text>}* )
<MultiPolygon Text> := EMPTY
| ( < Polygon Text > {, < Polygon Text > }* )
SQL エディタでの WKT 表現の使用
WKT 表現はテキストなので、SQL スクリプトに入力するか、SQL エディタで直接入力することができます。テキストは関数を通じてジオメトリと相互変換されます。テキストをジオメトリに変換する関数の構文は次のとおりです。
function ('<text description>',<SRID>)
たとえば、次のようになります。
ST_PointFromText('point zm(10.01 20.04 3.2 9.5)', 1)
ST_SPATIAL_REFERENCES テーブルの主キーである空間参照 ID(SRID)は、Oracle インスタンスで有効な空間参照系を識別します。SRID は空間列の作成時に割り当てられます。ジオメトリの SRID が空間列の SRID と一致しなければ、ジオメトリを空間列に挿入することができません。
テキスト説明は、単一引用符(')で囲まれた 3 つの基本要素で構成されます。
'<geometry type> [coordinate type] [coordinate list]'
ジオメトリ タイプはポイント、ラインストリング、ポリゴン、マルチポイント、マルチラインストリング、マルチポリゴンのいずれかとして定義されます。
座標タイプはジオメトリに Z 座標および(または)メジャー値が含まれているかどうかを示します。ジオメトリにそれらの値が含まれていない場合は、引数を空のままにします。ジオメトリに Z 座標値が含まれている場合は「Z」、メジャー値が含まれている場合は「M」、両方が含まれている場合は「ZM」を指定します。
座標リストはジオメトリの倍精度頂点を定義します。座標リストはカンマ(,)で区切られ、括弧(())で囲まれます。ジオメトリが複数の要素で構成される場合は、各要素をひと組の括弧で囲む必要があります。ジオメトリが空の場合は、座標を EMPTY キーワードに置き換えます。
次に、テキスト表現のテキスト説明部分について可能なすべての順列を網羅したリストの例を示します。
ジオメトリ タイプ |
テキストの説明 |
備考 |
---|---|---|
ST_Point |
'point empty' |
空のポイント |
ST_Point |
'point z empty' |
Z 座標を持つ空のポイント |
ST_Point |
'point m empty' |
メジャーを持つ空のポイント |
ST_Point |
'point zm empty' |
Z 座標とメジャーを持つ空のポイント |
ST_Point |
'point ( 10.05 10.28 )' |
ポイント |
ST_Point |
'point z( 10.05 10.28 2.51 )' |
Z 座標を持つポイント |
ST_Point |
'point m( 10.05 10.28 4.72 )' |
メジャーを持つポイント |
ST_Point |
'point zm(10.05 10.28 2.51 4.72 )' |
Z 座標とメジャーを持つポイント |
ST_LineString |
'linestring empty' |
空のラインストリング |
ST_LineString |
'linestring z empty' |
Z 座標を持つ空のラインストリング |
ST_LineString |
'linestring m empty' |
メジャーを持つ空のラインストリング |
ST_LineString |
'linestring zm empty' |
Z 座標とメジャーを持つ空のラインストリング |
ST_LineString |
'linestring (10.05 10.28 , 20.95 20.89 )' |
ラインストリング |
ST_LineString |
'linestring z(10.05 10.28 3.09, 20.95 31.98 4.72, 21.98 29.80 3.51 )' |
Z 座標を持つラインストリング |
ST_LineString |
'linestring m(10.05 10.28 5.84, 20.95 31.98 9.01, 21.98 29.80 12.84 )' |
メジャーを持つラインストリング |
ST_LineString |
'linestring zm(10.05 10.28 3.09 5.84, 20.95 31.98 4.72 9.01, 21.98 29.80 3.51 12.84)' |
Z 座標とメジャーを持つラインストリング |
ST_Polygon |
'polygon empty' |
空のポリゴン |
ST_Polygon |
'polygon z empty' |
Z 座標を持つ空のポリゴン |
ST_Polygon |
'polygon m empty' |
メジャーを持つ空のポリゴン |
ST_Polygon |
'polygon zm empty' |
Z 座標とメジャーを持つ空のポリゴン |
ST_Polygon |
'polygon ((10 10, 10 20, 20 20, 20 15, 10 10))' |
ポリゴン |
ST_Polygon |
'polygon z((10 10 3, 10 20 3, 20 20 3, 20 15 4, 10 10 3))' |
Z 座標を持つポリゴン |
ST_Polygon |
'polygon m((10 10 8, 10 20 9, 20 20 9, 20 15 9, 10 10 8 ))' |
メジャーを持つポリゴン |
ST_Polygon |
'polygon zm((10 10 3 8, 10 20 3 9, 20 20 3 9, 20 15 4 9, 10 10 3 8 ))' |
Z 座標とメジャーを持つポリゴン |
ST_MultiPoint |
'multipoint empty' |
空のマルチポイント |
ST_MultiPoint |
'multipoint z empty' |
Z 座標を持つ空のマルチポイント |
ST_MultiPoint |
'multipoint m empty' |
メジャーを持つ空のマルチポイント |
ST_MultiPoint |
'multipoint zm empty' |
Z 座標とメジャーを持つ空のマルチポイント |
ST_MultiPoint |
'multipoint (10 10, 20 20)' |
2 つのポイントを持つマルチポイント |
ST_MultiPoint |
'multipoint z(10 10 2, 20 20 3)' |
Z 座標を持つマルチポイント |
ST_MultiPoint |
'multipoint m(10 10 4, 20 20 5)' |
メジャーを持つマルチポイント |
ST_MultiPoint |
'multipoint zm(10 10 2 4, 20 20 3 5)' |
Z 座標とメジャーを持つマルチポイント |
ST_MultiLineString |
'multilinestring empty' |
空のマルチラインストリング |
ST_MultiLineString |
'multilinestring z empty' |
Z 座標を持つ空のマルチラインストリング |
ST_MultiLineString |
'multilinestring m empty' |
メジャーを持つ空のマルチラインストリング |
ST_MultiLineString |
'multilinestring zm empty' |
Z 座標とメジャーを持つ空のマルチラインストリング |
ST_MultiLineString |
'multilinestring ((10.05 10.28 , 20.95 20.89 ),( 20.95 20.89, 31.92 21.45))' |
マルチラインストリング |
ST_MultiLineString |
'multilinestring z((10.05 10.28 3.4, 20.95 20.89 4.5),( 20.95 20.89 4.5, 31.92 21.45 3.6))' |
Z 座標を持つマルチラインストリング |
ST_MultiLineString |
'multilinestring m((10.05 10.28 8.4, 20.95 20.89 9.5), (20.95 20.89 9.5, 31.92 21.45 8.6))' |
メジャーを持つマルチラインストリング |
ST_MultiLineString |
'multilinestring zm((10.05 10.28 3.4 8.4, 20.95 20.89 4.5 9.5), (20.95 20.89 4.5 9.5, 31.92 21.45 3.6 8.6))' |
Z 座標とメジャーを持つマルチラインストリング |
ST_MultiPolygon |
'multipolygon empty' |
空のマルチポリゴン |
ST_MultiPolygon |
'multipolygon z empty' |
Z 座標を持つ空のマルチポリゴン |
ST_MultiPolygon |
'multipolygon m empty' |
メジャーを持つ空のマルチポリゴン |
ST_MultiPolygon |
'multipolygon zm empty' |
空 |
ST_MultiPolygon |
'multipolygon (((10 10, 10 20, 20 20, 20 15 , 10 10)), ((50 40, 50 50, 60 50, 60 40, 50 40)))' |
マルチポリゴン |
ST_MultiPolygon |
'multipolygon z(((10 10 7, 10 20 8, 20 20 7, 20 15 5, 10 10 7)), ((50 40 6, 50 50 6, 60 50 5, 60 40 6, 50 40 6)))' |
Z 座標を持つマルチポリゴン |
ST_MultiPolygon |
'multipolygon m(((10 10 2, 10 20 3, 20 20 4, 20 15 5, 10 10 2)), ((50 40 7, 50 50 3, 60 50 4, 60 40 5, 50 40 7)))' |
メジャーを持つマルチポリゴン |
ST_MultiPolygon |
'multipolygon zm(((10 10 7 2, 10 20 8 3, 20 20 7 4, 20 15 5 5, 10 10 7 2)), ((50 40 6 7, 50 50 6 3, 60 50 5 4, 60 40 6 5, 50 40 6 7)))' |
Z 座標とメジャーを持つマルチポリゴン |
OGC WKB 表現
ジオメトリの WKB(Well-Known Binary)表現は、OGC(Open Geospatial Consortium)の Simple Features 仕様の一部であり、XY 座標を使用してポイント フィーチャ、ライン フィーチャ、ポリゴン フィーチャのシンプルな格納モデルを実装します。ジオメトリ値の汎用的な表現が、連続的なバイト ストリームとして提供されます。これにより、ODBC クライアントとデータベースの間で、ジオメトリ値をバイナリ形式でやり取りできます。このジオメトリ値は圧縮されません。
Oracle の ST_Geometry タイプには、WKB 表現からジオメトリを生成する関数がいくつか用意されてます。次のような関数があります。
- ST_GeomFromWKB: 任意のジオメトリ タイプの WKB 表現から ST_Geometry を作成します。
- ST_PointFromWKB: ポイントの WKB 表現から ST_Point を作成します。
- ST_LineFromWKB: ラインストリングの WKB 表現から ST_LineString を作成します。
- ST_PolyFromWKB: ポリゴンの WKB 表現から ST_Polygon を作成します。
- ST_MPointFromWKB: マルチポイントの WKB 表現から ST_MultiPoint を作成します。
- ST_MLineFromWKB: マルチラインストリングの WKB 表現から ST_MultiLineString を作成します。
- ST_MPolyFromWKB: マルチポリゴンの WKB 表現から ST_MultiPolygon を作成します。
これらのジオメトリ関数を使用するには、バイナリ表現をマッピングするための C 構造の定義が必要です。これらは、3GL プログラム内での使用を意図しており、4GL 環境には適していません。
ST_AsBinary 関数は、既存のジオメトリ値を WKB 表現に変換します。
WKB 表現の詳細については、「ジオメトリの OGC WKB(Well-Known Binary)表現」をご参照ください。