SQL Server中如何交换geography类型Polygon的经纬度顺序
交换SQL Server Geography类型Polygon坐标顺序方案
方案1:自定义转换函数(全版本兼容)
你可以创建一个自定义标量函数,遍历Polygon的所有顶点,交换经纬度顺序后拼接为需要的WKT格式:
CREATE FUNCTION dbo.SwapPolygonLatLong(@geo geography) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @pointCount INT = @geo.STNumPoints(); DECLARE @result NVARCHAR(MAX) = 'POLYGON (('; DECLARE @i INT = 1; WHILE @i <= @pointCount BEGIN DECLARE @point geography = @geo.STPointN(@i); -- 按纬度在前、经度在后拼接坐标 SET @result += CONCAT(@point.Lat, ' ', @point.Long, CASE WHEN @i < @pointCount THEN ', ' ELSE '' END); SET @i += 1; END SET @result += '))'; RETURN @result; END
使用方式:
SELECT TOP 1 dbo.SwapPolygonLatLong(KMLLocation) FROM Polygon
方案2:单次查询快速转换(仅支持SQL Server 2017及以上版本)
如果不需要复用逻辑,单次查询可以直接用系统函数实现:
SELECT TOP 1 'POLYGON ((' + STRING_AGG(CONCAT(p.Lat, ' ', p.Long), ', ') + '))' AS SwappedPolygon FROM Polygon CROSS APPLY ( SELECT KMLLocation.STPointN(n.number).Lat AS Lat, KMLLocation.STPointN(n.number).Long AS Long FROM master..spt_values n WHERE n.type = 'P' AND n.number BETWEEN 1 AND KMLLocation.STNumPoints() ) t
注意事项
- 上述示例默认处理单环Polygon,如果你存储的是带内部空洞的多环Polygon,需要额外遍历
STNumGeometries获取所有内环后再做坐标交换 - Geography类型本身遵循OGC标准存储为「经度在前、纬度在后」,如果只是输出需要调整顺序,不要修改原始存储的geography字段值,避免后续空间计算、索引等功能异常
内容的提问来源于stack exchange,提问作者Keerthi Srilal
相关产品推荐
相关产品推荐

