空间类型 - 地理

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

地理空间数据类型 geography 是作为 SQL Server 中的 .NET 公共语言运行时 (CLR) 数据类型实现的。 此类型表示圆形地球坐标系中的数据。 SQL Server geography 数据类型用于存储椭球体(地球表面)数据,例如 GPS 纬度和经度坐标。

Note

在 Fabric SQL 数据库中,允许使用空间类型的列,但不会镜像到 Fabric OneLake。

SQL Server 支持 geography 空间数据类型的一组方法。 这些方法包括开放地理空间信息联盟 (OGC) 标准和对该标准的一组 Microsoft 扩展所定义的 geography 方法。

geography 方法的容错可高达 1.0e-7 * extents。 盘区是指 地理 对象点之间的近似最大距离。

注册地理类型

geography 类型已进行预定义,可在每个数据库中使用。 你可以创建 geography 类型的表列并对 geography 数据进行操作,就像使用其他系统提供的数据类型一样。 该类型可用于持久化和非持久计算列。

Conversion

从 地理 到 二元、 varbinary、 char、 varchar、 nchar 和 nvarchar 的转换必须是显式的。 使用 CAST 或 CONVERT。

从二元、变异、char、varchar、nchar 和 nvarchar 转换为地理学可以是隐式的,也可以是显式的。

不允许在 地理和 所有其他数据类型之间转换。 这包括地理与几何之间的转换。 要在这两种类型之间移动数据,可以使用 Well-Known 二进制(WKB)或 Well-Known 文本(WKT)方法,例如STAsBinary()。STGeomFromWKB()

字符串类型转换为 地理类型 使用与 geography::Parse()相同的规则。 字符串必须是 Well-Known 文本。 结果的SRID为4326。

地理与二进制或变进制之间的转换使用地理SQL Server本地序列化格式,而非 Well-Known 二进制。 Well-Known 二进制值会导致错误。 要转换为或从二进制转换 Well-Known,请使用 STAsBinary() 和 STGeomFromWKB()。

如果目标字符串或二进制类型对 地理 值来说过短,就会发生错误。 价值没有被截断。

备注

在 Microsoft Fabric 的 SQL 数据库中,支持地理和几何数据类型,但无法镜像到 Fabric OneLake。

Examples

答: 展示如何添加和查询地理数据

以下示例说明如何添加和查询地理数据。 第一个示例创建包含一个标识列和一个 geography 列 GeogCol1 的表。 第三列将 geography 列呈现为其开放地理空间信息联盟 (OGC) 熟知文本 (WKT) 表示形式,并使用 STAsText() 方法。 接下来将插入两行:一行包含 LineString 类型的 geography实例,一行包含 Polygon 实例。

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

CREATE TABLE SpatialTable
(
    id INT IDENTITY (1, 1),
    GeogCol1 geography,
    GeogCol2 AS GeogCol1.STAsText()
);
GO

INSERT INTO SpatialTable
(
    GeogCol1
)
VALUES (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326));

INSERT INTO SpatialTable
(
    GeogCol1
)
VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326));
GO

B. 返回两个地理实例的交集

下面的示例使用 STIntersection() 方法返回以前插入的两个 geography 实例相交的点。

DECLARE @geog1 AS geography;

DECLARE @geog2 AS geography;

DECLARE @result AS geography;

SELECT @geog1 = GeogCol1
FROM SpatialTable
WHERE id = 1;

SELECT @geog2 = GeogCol1
FROM SpatialTable
WHERE id = 2;

SELECT @result = @geog1.STIntersection(@geog2);

SELECT @result.STAsText();

C. 在计算列中使用地理

下面的示例使用 geography 类型创建具有持久化计算列的表。

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

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