geometry インスタンスの作成、構築、およびクエリ

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

平面空間データ型の geometryは、ユークリッド (平面) 座標系のデータを表します。 この型は、SQL Server では共通言語ランタイム (CLR) のデータ型として実装されています。

geometry 型は、各データベースで使用できるように事前に定義されています。 geometry 型のテーブル列を作成し、他の CLR 型を使用するときと同じように geometry データを操作できます。

SQL Server によってサポートされている geometry データ型 (平面) は、Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0 に準拠しています。

OGC の仕様の詳細については、以下を参照してください。

SQL Server は、次のスキーマで定義されている既存の GML 3.1 標準のサブセットをサポートしています: https://schemas.microsoft.com/sqlserver/profiles/gml/SpatialGML.xsd

新しい geometry インスタンスの作成または構築

既存のインスタンスからの新しい geometry インスタンスの作成

geometry データ型には、既存のインスタンスに基づいて新しい geometry インスタンスを作成するために使用できる組み込みメソッドが数多く用意されています。

geometry の周りにバッファーを作成するには
STBuffer (geometry データ型)

BufferWithTolerance (geometry データ型)

簡素化されたバージョンの geometry を作成するには
Reduce (geometry データ型)

geometry の凸包を作成するには
STConvexHull (geometry データ型)

2 つの geometry の積集合から geometry を作成するには
STIntersection (geometry データ型)

2 つの geometry の和集合から geometry を作成するには
STUnion (geometry データ型)

一方の geometry の、もう一方の geometry と重なる部分を除いた点から geometry を作成するには
STDifference (geometry データ型)

2 つの geometry の重なる部分を除いた点から geometry を作成するには
STSymDifference (geometry データ型)

既存の geometry 上にある任意の Point インスタンスを作成するには
STPointOnSurface (geometry データ型)

Well-Known Text 入力からの geometry インスタンスの構築

geometry データ型には、Open Geospatial Consortium (OGC) WKT 表現からジオメトリを生成する組み込みのメソッドが数多く用意されています。 WKT 標準は geometry データをテキスト形式で交換できるテキスト文字列です。

WKT 入力から任意の型の geometry インスタンスを構築するには
STGeomFromText (geometry データ型)

Parse (geometry データ型)

WKT 入力から geometry Point インスタンスを構築するには
STPointFromText (geometry データ型)

WKT 入力から geometry MultiPoint インスタンスを構築するには
STMPointFromText (geometry データ型)

WKT 入力から geometry LineString インスタンスを構築するには
STLineFromText (geometry データ型)

WKT 入力から geometry MultiLineString インスタンスを構築するには
STMLineFromText (geometry データ型)

WKT 入力から geometry Polygon インスタンスを構築するには
STPolyFromText (geometry データ型)

WKT 入力から geometry MultiPolygon インスタンスを構築するには
STMPolyFromText (geometry データ型)

WKT 入力から geometry GeometryCollection インスタンスを構築するには
STGeomCollFromText (geometry データ型)

Well-Known Binary 入力からの geometry インスタンスの構築

WKB は、 geometry データをアプリケーションと SQL データベース間で交換することができる、Open Geospatial Consortium (OGC) で指定されたバイナリ形式です。 次の関数は、WKB 入力を受け入れてジオメトリを構築します。

WKB 入力から任意の型の geometry インスタンスを構築するには
STGeomFromWKB (geometry データ型)

WKB 入力から geometry Point インスタンスを構築するには
STPointFromWKB (geometry データ型)

WKB 入力から geometry MultiPoint インスタンスを構築するには
STMPointFromWKB (geometry データ型)

WKB 入力から geometry LineString インスタンスを構築するには
STLineFromWKB (geometry データ型)

WKB 入力から geometry MultiLineString インスタンスを構築するには
STMLineFromWKB (geometry データ型)

WKB 入力から geometry Polygon インスタンスを構築するには
STPolyFromWKB (geometry データ型)

WKB 入力から geometry MultiPolygon インスタンスを構築するには
STMPolyFromWKB (geometry データ型)

WKB 入力から geometry GeometryCollection インスタンスを構築するには
STGeomCollFromWKB (geometry データ型)

GML Text 入力からの geometry インスタンスの構築

geometry データ型には、GML (幾何オブジェクトの XML 表現) から geometry インスタンスを生成するメソッドが用意されています。 SQL Server では、GML のサブセットをサポートします。

GML 入力から任意の型の geometry インスタンスを構築するには
GeomFromGml (geometry データ型)

geometry インスタンスからの Well-Known Text および Well-Known Binary の取得

次のメソッドを使用して、 geometry インスタンスの WKT 形式または WKB 形式のいずれかを取得できます。

geometry インスタンスの WKT 表現を取得するには
STAsText (geometry データ型)

ToString (geometry データ型)

geometry インスタンスの WKT 表現を Z と M の値も含めて取得するには
AsTextZM (geometry データ型)

geometry インスタンスの WKB 表現を取得するには
STAsBinary (geometry データ型)

geometry インスタンスの GML 表現を取得するには
AsGml (geometry データ型)

geometry インスタンスのプロパティと動作のクエリ

すべての geometry インスタンスには、SQL Server のメソッドを使用して取得できるいくつかのプロパティがあります。 以下のトピックでは、geometry 型のプロパティおよび動作と、geometry 型のクエリを実行するためのメソッドについて説明します。

有効性、インスタンスの型、および GeometryCollection 情報

geometry インスタンスを構築したら、次のメソッドを使用して、そのインスタンスが適切な形式であるかどうかを確認したり、インスタンスの型を取得することができます。また、コレクション インスタンスの場合は、特定の geometry インスタンスを取得できます。

geometry のインスタンスの型を取得するには
STGeometryType (geometry データ型)

geometry が特定のインスタンスの型であるかどうかを調べるには
InstanceOf (geometry データ型)

geometry インスタンスがそのインスタンスの型に対応する適切な形式であるかどうかを調べるには
STIsValid (geometry データ型)

geometry インスタンスをインスタンスの型に対応する適切な形式の geometry インスタンスに変換するには
MakeValid (geometry データ型)

geometry コレクション インスタンス内のジオメトリの数を取得するには
STNumGeometries (geometry データ型)

geometry コレクション インスタンス内の特定の geometry を取得するには
STGeometryN (geometry データ型) STGeometryN (geometry データ型)

Number of Points (ポイント数)

空でないすべての geometry インスタンスは で構成されています。 これらの点は、ジオメトリが描画される平面の X 座標と Y 座標を表します geometry には、インスタンスの点に対するクエリを実行するための組み込みメソッドが数多く用意されています。

インスタンスを構成する点の数を取得するには
STNumPoints (geometry データ型)

インスタンスの特定の点を取得するには
STPointN

インスタンス上にある任意の点を取得するには
STPointOnSurface

インスタンスの始点を取得するには
STStartPoint

インスタンスの終点を取得するには
STEndpoint

Point インスタンスの X 座標を取得するには
STX (geometry データ型)

Point インスタンスの Y 座標を取得するには
STY

Polygon、CurvePolygon、または MultiPolygon インスタンスの幾何学中心点を取得するには
STCentroid

ディメンション

空でない geometry インスタンスの次元は、0 次元、1 次元、2 次元のいずれかになります。 0 次元の ジオメトリ( PointMultiPointなど) には長さや面積はありません。 1 次元のオブジェクト ( LineString、CircularString、CompoundCurveMultiLineStringなど) には長さがあります。 2 次元のインスタンス ( PolygonCurvePolygonMultiPolygonなど) には面積と長さがあります。 空のインスタンスの次元は -1 としてレポートされます。 GeometryCollection でレポートされる面積は、その内容の型によって異なります。

インスタンスの次元を取得するには
STDimension

インスタンスの長さを取得するには
STLength

インスタンスの面積を取得するには
STArea

Empty

geometry インスタンスには点はありません。 空の LineString, CircularStringCompoundCurve、および MultiLineString インスタンスの長さは 0 です。 空の PolygonCurvePolygon、および MultiPolygon インスタンスの面積は 0 です。

インスタンスが空かどうかを調べるには
STIsEmpty

簡易

インスタンスの geometry単純であるためには、次の両方の要件が満たされている必要があります。

  • インスタンスの各図形が終点以外で自己交差していてはいけない。

  • インスタンスの 2 つの図形が、両方の図形の境界外部の点で互いに交差していてはいけない。

Note

空のジオメトリは常に単純です。

インスタンスが単純かどうかを調べるには
STIsSimple

境界、内部、および外部

geometry インスタンスの 内部 とは、インスタンスによって占有されている空間です。占有されていない空間は 外部 です。

境界 は、OGC によって次のように定義されています。

  • Point インスタンスと MultiPoint インスタンスには境界はありません。

  • LineStringMultiLineString の境界は、始点と終点 (偶数回出現するものを除く) によって形成されます。

DECLARE @g geometry;  
SET @g = geometry::Parse('MULTILINESTRING((0 1, 0 0, 1 0, 0 1), (1 1, 1 0))');  
SELECT @g.STBoundary().ToString();  

Polygon インスタンスや MultiPolygon インスタンスの境界は、そのリングの集合です。

DECLARE @g geometry;  
SET @g = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))');  
SELECT @g.STBoundary().ToString();  

インスタンスの境界を取得するには
STBoundary

Envelope

geometry インスタンスの エンベロープ ( 境界ボックスとも呼ばれます) とは、インスタンスの最小および最大の (X,Y) 座標によって形成される軸に沿った四角形です。

インスタンスのエンベロープを取得するには
STEnvelope

クロージャ

閉じているgeometry インスタンスは、始点と終点が同じである図形です。 Polygon インスタンスは閉じていると見なされます。 Point インスタンスは閉じていないと見なされます。

リングは、単純な閉じている LineString インスタンスです。

インスタンスが閉じているかどうかを調べるには
STIsClosed

インスタンスがリングかどうかを調べるには
STIsRing

Polygon インスタンスの外部リングを取得するには
STExteriorRing

Polygon の内部リングの数を取得するには
STNumInteriorRing

Polygon の指定した内部リングを取得するには
STInteriorRingN

SRID (spatial reference ID)

SRID (spatial reference ID) は、 geometry インスタンスがどの座標系で表されているかを示す識別子です。 SRID が異なる 2 つのインスタンスを比較することはできません。

インスタンスの SRID を設定または取得するには
STSrid

Note

このプロパティは変更できます。

geometry インスタンス間の関係の特定

geometry データ型には、2 つの geometry インスタンスの関係を調べるために使用できる組み込みメソッドが数多く用意されています。

2 つのインスタンスが同じ点の集合で構成されているかどうかを調べるには
STEquals

2 つのインスタンスが互いに離れているかどうかを調べるには
STDisjoint

2 つのインスタンスが交差するかどうかを調べるには
STIntersects

2 つのインスタンスが相互に接しているかどうかを調べるには
STTouches

2 つのインスタンスが重なっているかどうかを調べるには
STOverlaps

2 つのインスタンスが交わるかどうかを調べるには
STCrosses

あるインスタンスが別のインスタンスに含まれているかどうかを調べるには
STWithin

あるインスタンスが別のインスタンスを含んでいるかどうかを調べるには
STContains

あるインスタンスが別のインスタンスと重なっているかどうかを調べるには
STOverlaps

2 つのインスタンスが空間的に関連するかどうかを調べるには
STRelate

2 つのジオメトリの点の間の最短距離を調べるには
STDistance

geometry インスタンスの既定の SRID は 0

SQL Server の geometry インスタンスの既定の SRID は 0 です。 geometry 空間データでは、空間インスタンスに特定の SRID がなくても計算を実行できます。したがって、インスタンスは未定義の平面空間に存在することができます。 SQL Server データベース エンジンでは、geometry データ型のメソッドの計算で未定義の平面空間を表すために SRID 0 が使用されます。

次の 2 つの例は、geometry 型のデータの追加方法とクエリ方法を示しています。

例 A.

この例では、ID 列と geometry 型の GeomCol1 列を含むテーブルを作成します。 3 番目の列で、 geometry 型の列をその Open Geospatial Consortium (OGC) の Well-Known Text (WKT) 表現で示し、 STAsText() メソッドを使用します。 次に 2 つの行が挿入されます。1 つは、 LineStringgeometryインスタンスを含む行で、もう 1 つは Polygon インスタンスを含む行です。

IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL   
DROP TABLE dbo.SpatialTable;  
GO  

CREATE TABLE SpatialTable   
  ( id int IDENTITY (1,1),  
    GeomCol1 geometry,   
    GeomCol2 AS GeomCol1.STAsText() 
  );  
GO  

INSERT INTO SpatialTable (GeomCol1)  
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));  

INSERT INTO SpatialTable (GeomCol1)  
VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));  
GO  

例 B。

この例では、STIntersection() メソッドを使用して、前の例で挿入した 2 つの geometry インスタンスが交差する点を返します。

DECLARE @geom1 geometry;  
DECLARE @geom2 geometry;  
DECLARE @result geometry;  

SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1;  
SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2;  
SELECT @result = @geom1.STIntersection(@geom2);  
SELECT @result.STAsText();  

参照

空間データ (SQL Server)