空間タイプ - ジオメトリ(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

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

SQL Server は、geometry 空間データ型の一連のメソッドをサポートしています。 このようなメソッドには、Open Geospatial Consortium (OGC) 標準で定義されている geometry に関するメソッド、およびこの標準に基づいた Microsoft の一連の拡張メソッドがあります。

geometry メソッドの許容誤差は、1.0e-7 * までです。 エクステントは、 ジオメトリ オブジェクトのポイント間のおおよその最大距離を指します。

ジオメトリタイプを登録します

geometry 型は、各データベースで使用できるように事前に定義されています。 geometry 型のテーブル列を作成し、他の CLR 型を使用するときと同じように geometry データを操作できます。 この型は、永続化された計算列および非永続化された計算列の両方で使用できます。

Conversion

幾何学からバイナリ、ヴァルビナリ、チャール、ヴァルチャール、ンチャール、ヌヴァルチャールへの変換は明示的でなければなりません。 CAST または CONVERT を使用します。

バイナリ、ヴァルビナリ、チャール、ヴァルチャール、ンチャル、ヌヴァルチャールから幾何学への変換は、暗黙的または明示的かのいずれかです。

ジオメトリと他のすべてのデータ型の変換は許可されていません。 これには 幾何 学と 地理学の変換が含まれます。 これら2つのタイプ間でデータを移動するには、Well-Known バイナリ(WKB)または Well-Known テキスト(WKT)メソッド、例えばSTGeomFromWKB()STAsBinary()を用いてください。

文字列タイプから ジオメトリ への変換は、 geometry::Parse()と同じルールを使用します。 文字列はテキスト Well-Known に違いない。 結果のSRIDは0です。

ジオメトリとバイナリまたはヴァービナリの変換は、SQL Serverネイティブなシリアライゼーション形式を用い、バイナリではなくジオメトリ Well-Known 使います。 Well-Known のバイナリ値はエラーを引き起こします。 バイナリへの変換やバイナリからの変換 Well-Known、 STAsBinary() と STGeomFromWKB()を使用します。

ターゲット文字列やバイナリ型が ジオメトリ 値に対して短すぎるとエラーが生じます。 値が切り詰められることはありません。

Remarks

Microsoft FabricのSQLデータベースでは、地理および地形データ型はサポートされていますが、Fabric OneLakeにミラーリングすることはできません。

Examples

A. ジオメトリデータの追加とクエリの方法を示す

次の 2 つの例は、geometry 型のデータの追加方法とクエリ方法を示しています。 最初の例では、ID 列と geometry 型の GeomCol1列を含むテーブルを作成します。 3 番目の列で、 geometry 型の列をその Open Geospatial Consortium (OGC) の Well-Known Text (WKT) 表現で示し、 STAsText() メソッドを使用します。 次に 2 つの行が挿入されます。1 つは、 LineString の geometryインスタンスを含む行で、もう 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. 2つのジオメトリインスタンスの交差を返します

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

DECLARE @geom1 AS geometry;
DECLARE @geom2 AS geometry;
DECLARE @result AS 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();

C. 計算された列でジオメトリを活用する

次の例では、geometry 型を使用して、保存される計算列を持つテーブルを作成します。

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

CREATE TABLE SpatialTable
(
    locationId INT IDENTITY (1, 1),
    location geometry,
    deliveryArea AS location.STBuffer(10) PERSISTED
);