SQL Server将LineString列转geography列时纬度范围报错如何解决
问题原因
你当前存储的Linestring是米制单位的平面投影坐标(比如UTM、高斯克吕格这类投影坐标系的坐标,东向值几万、北向值几百万,完全符合你给出的示例特征),而SQL Server的geography类型本质是球面地理类型,仅支持单位为度的经纬度坐标(经度范围-180180,纬度范围-9090),直接强制转换必然触发范围报错。
解决办法
根据你的使用场景二选一即可:
场景1:仅需存储、做平面几何计算
直接用geometry类型替代geography类型,该类型原生支持平面坐标,不需要转换坐标系:
CREATE TABLE SpatialProvince(GlineTR geometry) -- 最简写法 INSERT INTO SpatialProvince (GlineTR) select CAST(Linestring as geometry) from provinceTR -- 推荐写法:指定原始坐标系SRID,方便后续转换使用 -- INSERT INTO SpatialProvince (GlineTR) -- select geometry::STGeomFromText(Linestring, 你的平面坐标系SRID) from provinceTR
注:原始平面坐标系的SRID是数据生成时就确定的参数,找数据源提供方获取即可,常见的UTM分带投影、国内高斯克吕格投影都有对应的标准SRID。
场景2:需要做球面距离、面积等地理计算,必须用geography类型
需要先把平面投影坐标转换为WGS84(SRID=4326)标准经纬度坐标,有两种实现方式:
方式1:GIS工具批量转换
用QGIS、ArcGIS等GIS工具导入provinceTR表的原始数据,选择对应投影坐标系后,导出为WGS84坐标系的LineString文本,再导入SQL Server即可,操作可视化不容易出错。
方式2:SQL Server内直接转换
SQL Server 2016及以上版本内置了坐标转换函数,先确认原始平面坐标系的SRID后,直接调用STTransform转换即可:
CREATE TABLE SpatialProvince(GlineTR geography) INSERT INTO SpatialProvince (GlineTR) select -- 第一步:把文本转成带原始SRID的平面几何 geometry::STGeomFromText(Linestring, 你的平面坐标系SRID) -- 第二步:转换为WGS84(SRID=4326)的球面地理坐标 .STTransform(4326) -- 可选:修正几何顺序,geography要求纬度在前经度在后,顺序反了可以加这个方法 -- .ReorientObject() -- 可选:修复无效几何 .MakeValid() from provinceTR
如果你的SQL Server版本不支持STTransform,可以安装官方的SQL Server Spatial Tools扩展来获得坐标转换能力。
注意事项
- 务必确认原始平面坐标系的SRID,否则转换后的经纬度会完全偏移
- 如果是国内的GCJ02、BD09坐标系数据,转换到WGS84还需要额外做偏移修正,添加对应偏移算法即可
- 如果转换后仍报错,检查LineString的坐标顺序,
geography类型默认要求坐标顺序为纬度在前、经度在后,顺序颠倒时调用ReorientObject()方法调整即可
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

