Typy przestrzenne – geometria (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Typ danych przestrzennych planarnych, geometria, jest implementowany jako typ danych środowiska uruchomieniowego języka wspólnego (CLR) w programie SQL Server. Ten typ reprezentuje dane w układzie współrzędnych euklidesowych (płaskich).

Program SQL Server obsługuje zestaw metod dla typu danych przestrzennych geometrii . Metody te obejmują metody geometrii zdefiniowane przez standard Open Geospatial Consortium (OGC) i zestaw rozszerzeń firmy Microsoft do tego standardu.

Tolerancja błędów dla metod geometrycznych może być tak duża, jak 1,0e-7 * zakresów. Zakresy odnoszą się do przybliżonej maksymalnej odległości między punktami obiektu geometrii .

Rejestruj typ geometrii

Typ geometrii jest wstępnie zdefiniowany i dostępny w każdej bazie danych. Możesz tworzyć kolumny tabeli geometrii typu i działać na danych geometrycznych w taki sam sposób, jak w przypadku innych typów CLR. Typ ten może być używany zarówno w kolumnach trwałych, jak i nietrwałych.

Conversion

Przekształcenie z geometrii na binarną, warbinarną, char, varchar, nchar i nvarchar musi być jednoznaczne. Użyj CAST lub CONVERT.

Konwersja z binarnych, varbinary, char, varchar, nchar i nvarchar na geometrię może być zarówno domyślna, jak i jawna.

Konwersja między geometrią a wszystkimi innymi typami danych jest zabroniona. Obejmuje to konwersję geometrii i geografii. Aby przenosić dane między tymi dwoma typami, użyj metod Well-Known Binary (WKB) lub Well-Known Text (WKT), na przykład STAsBinary() z .STGeomFromWKB()

Konwersja z typu ciągu do geometrii wykorzystuje te same zasady co geometry::Parse(). Ciąg musi być Well-Known tekstu. SRID tego wyniku wynosi 0.

Konwersja między geometrią a binarną lub varbinarną wykorzystuje SQL Server natywny format serializacji geometrii, a nie Well-Known binarny. Wartość binarna Well-Known powoduje błąd. Aby przeprowadzić konwersję do lub z Well-Known binarnym, użyj STAsBinary() i .STGeomFromWKB()

Jeśli docelowy ciąg lub typ binarny jest zbyt krótki względem wartości geometrycznej , występuje błąd. Wartość nie jest obcięta.

Remarks

W bazie danych SQL w Microsoft Fabric obsługiwane są typy danych geograficzne i geometryczne, ale nie można ich lustrzanego odbicia do Fabric OneLake.

Examples

A. Pokaż, jak dodawać i zapytywać dane geometryczne

W poniższych dwóch przykładach pokazano, jak dodawać dane geometryczne i wykonywać zapytania o nie. Pierwszy przykład tworzy tabelę z kolumną tożsamości i kolumną geometry . GeomCol1 Trzecia kolumna renderuje kolumnę geometry w swojej reprezentacji Open Geospatial Consortium (OGC) Well-Known Text (WKT) i używa STAsText() metody . Następnie wstawiane są dwa wiersze: jeden wiersz zawiera LineString wystąpienie geometry, a jeden wiersz zawiera Polygon wystąpienie.

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. Zwróć przecięcie dwóch instancji geometrycznych

W drugim przykładzie STIntersection() użyto metody , aby zwrócić punkty, w których dwa wcześniej wstawione geometry wystąpienia przecinają się.

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. Użyj geometrii w obliczonej kolumnie

Poniższy przykład tworzy tabelę z utrwałą kolumną obliczeniową przy użyciu typu geometrii .

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
);