创建、构造和查询地理实例

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

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

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

创建或构建新的地域实例

从现有实例创建新的地域实例

geography 数据类型提供了许多内置方法,你可以使用这些方法基于现有实例创建新的 geography 实例。

在地域周围创建缓冲区
STBuffer(geography 数据类型)

在地域周围创建缓冲区,允许公差
BufferWithTolerance(geography 数据类型)

通过两个地域实例的交集创建地域
STIntersection(geography 数据类型)

通过两个地域的实例并集创建地域
STUnion(geography 数据类型)

通过一个地域中没有与另一个地域发生重叠的点创建地域
STDifference(geography 数据类型)

从熟知文本输入构造地域实例

geography 数据类型提供了若干种用开放地理空间联盟 (OGC) WKT 表示形式生成地域的内置方法。 WKT 标准是一种允许地域数据以文本形式交换的文本字符串。

用 WKT 输入构造任意类型的地域实例
STGeomFromText(geography 数据类型)

Parse(geography 数据类型)

用 WKT 输入构造地域 Point 实例
STPointFromText(geography 数据类型)

用 WKT 输入构造地域 MultiPoint 实例
STMPointFromText(geography 数据类型)

用 WKT 输入构造地域 LineString 实例
STLineFromText(geography 数据类型)

用 WKT 输入构造地域 MultiLineString 实例
STMLineFromText(geography 数据类型)

用 WKT 输入构造地域 Polygon 实例
STPolyFromText(geography 数据类型)

用 WKT 输入构造地域 MultiPolygon 实例
STMPolyFromText(geography 数据类型)

用 WKT 输入构造地域 GeometryCollection 实例
STGeomCollFromText(geography 数据类型)

从熟知二进制输入构造地域实例

WKB 是 OGC 规定的一种二进制格式,该格式允许 Geography 数据在客户端应用程序和 SQL 数据库之间进行交换。 以下函数接受使用 WKB 输入构造地域实例:

用 WKB 输入构造任意类型的地域实例
STGeomFromWKB(geography 数据类型)

用 WKB 输入构造地域 Point 实例
STPointFromWKB(geography 数据类型)

用 WKB 输入构造地域 MultiPoint 实例
STMPointFromWKB(geography 数据类型)

用 WKB 输入构造地域 LineString 实例
STLineFromWKB(geography 数据类型)

用 WKB 输入构造地域 MultiLineString 实例
STMLineFromWKB(geography 数据类型)

用 WKB 输入构造地域 Polygon 实例
STPolyFromWKB(geography 数据类型)

用 WKB 输入构造地域 MultiPolygon 实例
STMPolyFromWKB(geography 数据类型)

用 WKB 输入构造地域 GeometryCollection 实例
STGeomCollFromWKB(geography 数据类型)STGeomCollFromWKB(geography 数据类型)

用 GML 文本输入构造地域实例

geography 数据类型提供了一种用 GML( geography 实例的 XML 表示形式)生成 geography 实例的方法。 SQL Server 支持 GML 的子集。

有关地域标记语言的详细信息,请参阅 OGC 规范: OGC Specifications, Geography Markup Language(OGC 规范,地域标记语言)。

用 GML 输入构造任意类型的地域实例
GeomFromGML(geography 数据类型)

从地域实例返回熟知文本和熟知二进制

可以使用以下方法返回 WKT 或 WKB 格式的 geography 实例:

返回地域实例的 WKT 表示形式
STAsText(geography 数据类型)

ToString(geography 数据类型)

返回包括任何 Z 值和 M 值的地域实例的 WKT 表示形式
AsTextZM(geography 数据类型)

返回地域实例的 WKB 表示形式
STAsBinary(geography 数据类型)

返回地域实例的 GML 表示形式
AsGml(geography 数据类型)

查询地域实例的属性和行为

所有 geography 实例都有很多可以通过 SQL Server 提供的方法进行检索的属性。 下列主题定义了地域类型的属性和行为,并为查询每种图形定义了方法。

有效性、实例类型和 GeometryCollection 信息

构造 geography 实例后,就可以使用以下方法返回实例类型,或者,如果它是 GeometryCollection 实例,则返回特定的 geography 实例。

返回地域的实例类型
STGeometryType(geography 数据类型)

确定地域是否为给定的实例类型
InstanceOf(geography 数据类型)

确定地域实例对其实例类型而言格式是否正确
STNumGeometries(geography 数据类型)

返回 GeometryCollection 实例中的特定地域
STGeometryN(geography 数据类型)STGeometryN(geography 数据类型)

点数

所有非空 geography 实例都由“点” 组成。 这些点表示球体的纬度和经度坐标,在其上可绘制 geography 实例。 geography 数据类型提供了许多用于查询实例点的内置方法。

返回构成实例的点数。
STNumPoints(geography 数据类型)

返回实例中的特定点
STPointN(geometry 数据类型)

返回实例的起始点
STStartPoint(geography 数据类型)

返回实例的终点
STEndpoint(geography 数据类型)

维度

非空 geography 实例可以为零维、一维或二维。 零维 geography 实例(如 PointMultiPoint)没有长度或面积。 一维对象(如 LineString、CircularStringCompoundCurveMultiLineString)有长度。 二维实例(如 Polygon、CurvePolygonMultiPolygon)有面积和长度。 空实例会报告 -1 维,并且 GeometryCollection 会报告其内容的最大维度。

返回实例的维度
STDimension(geography 数据类型)

返回实例的长度
STLength(geography 数据类型)

返回实例的面积
STArea(geography 数据类型)

geography 实例不包含任何点。 空的 LineString, CircularStringCompoundCurveMultiLineString 实例的长度为 0。 空的 Polygon, CurvePolygonMultiPolygon 实例的面积为 0。

确定实例是否为空
STIsEmpty(geography 数据类型)

结尾

闭合的 geography 实例是指起始点和终点相同的图形。 Polygon 实例被视为闭合的。 Point 实例不是闭合的。

环是一个简单、闭合的 LineString 实例。

确定实例是否闭合
STIsClosed(geography 数据类型)

返回多边形实例的环数
NumRings(geography 数据类型)

返回地域实例的指定环
RingN(geography 数据类型)

空间引用标识符 (SRID)

空间引用标识符 (SRID) 是指定 geography 实例所在的椭球坐标系的标识符。 两个拥有不同 SRID 的 geography 实例是不可比的。

设置或返回实例的 SRID
STSrid(geography 数据类型)

此属性可以进行修改。

确定地域实例之间的关系

geography 数据类型提供了许多内置方法,你可以使用这些方法确定两个 geography 实例之间的关系。

确定两个实例是否包含相同的点集
STEquals(geometry 数据类型)

确定两个实例是否不相接
STDisjoint(geometry 数据类型)

确定两个实例是否相交
STIntersects(geometry 数据类型)

确定两个实例的交点
STIntersection(geography 数据类型)

确定两个地域实例中点之间的最短距离
STDistance(geometry 数据类型)

确定两个地域实例之间点的不同
STDifference(geography 数据类型)

派生一个地域实例相比于另一个地域实例的余集或唯一点
STSymDifference(geography 数据类型)

地域实例必须使用支持的 SRID

SQL Server 支持基于 EPSG 标准的 SRID。 在执行计算或将方法与地理空间数据一起使用时,必须使用 geography 实例的 SQL Server 支持的 SRID。 SRID 必须与 sys.spatial_reference_systems 目录视图中显示的 SRID 中的一个匹配。 如前所述,在使用 geography 数据类型对空间数据执行计算时,结果将取决于在创建数据时使用的是哪个椭圆体,因为为每个椭圆体都分配了一个特定空间引用标识符 (SRID)。

geography 实例使用方法时,SQL Server 使用默认 SRID 4326,它将映射到 WGS 84 空间引用系统。 如果要使用 WGS 84(或 SRID 4326)之外的某个空间引用系统中的数据,你需要确定地域空间数据的特定 SRID。

示例

以下示例说明如何添加和查询地理数据。

示例 A。

此示例创建了一个带有标识列和 geographyGeogCol1 的表。 第三列将 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 geography;  
DECLARE @geog2 geography;  
DECLARE @result 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();  

另请参阅

空间数据 (SQL Server)