SqlServer geography 空间类型数据
🏷️ SQL Server
geography
空间数据类型 geography
用来表示圆形地球空间坐标系中的数据,如 GPS 经纬度坐标。
SqlServer 提供一些列方法用于创建、构造和查询这些数据。具体信息请参照 MSDN 文档 。
下面是两个摘自 MSDN 的示例:
其中 4326 是 SQL Server 默认的 SRID,它将映射到 WGS 84 空间引用系统。
Example A
sql
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Example B
sql
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();
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
最短距离
查询某个位置最近的记录是比较常见的需求,这个需要用到 STDistance 函数,返回的是两个坐标之间的距离(单位是米)。
下面示例返回距离坐标点 -121.626 47.8315 最近的七条记录,使用 ToString() 方法获取坐标的字符串。
sql
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
1
2
3
4
2
3
4