适用于:SQL Server
Azure 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
);