SQL Server中Geography Point类型经纬度顺序问题咨询
问题解答
这不是你的操作错误,是文档表述的歧义导致的误解——文档里说的“先传入纬度”针对的是**geography::Point()构造函数**的参数顺序,而非直接使用WKT(Well-Known Text)字符串赋值的顺序。
核心原因:两种创建方式的参数规则不同
SQL Server的geography类型遵循OGC(开放地理空间信息联盟)标准:
- 使用WKT字符串创建:
POINT的语法是POINT(<经度> <纬度>),第一个值是经度,第二个是纬度。 - 使用
Point()构造函数创建:语法是geography::Point(<纬度>, <经度>, <SRID>),第一个参数是纬度,第二个是经度,这才是文档里描述的“先传纬度”的场景。
对应你的测试案例
你使用的是WKT字符串赋值:
DECLARE @g geography = 'POINT(51.486625 5.380910)'; select @g.Lat as lat,@g.Long as long
这里第一个值51.486625被解析为经度,第二个值5.380910被解析为纬度,所以查询结果里lat是5.38091、long是51.486625,完全符合WKT的规则。
如果颠倒WKT里的顺序,写成:
DECLARE @g geography = 'POINT(5.380910 51.486625)'; select @g.Lat as lat,@g.Long as long
此时lat会返回51.486625,long返回5.380910,和你预期的一致。
如果用文档描述的构造函数方式,写法应该是:
DECLARE @g geography = geography::Point(51.486625, 5.380910, 4326); -- 4326是常用的WGS84坐标系SRID select @g.Lat as lat,@g.Long as long
这时候结果就会和文档描述一致,lat为51.486625,long为5.380910。
总结
文档的描述没有覆盖WKT字符串的场景,仅针对Point()构造函数,属于表述不够全面导致的混淆,你的测试结果是正确的,并非操作错误。
内容的提问来源于stack exchange,提问作者Connor Stoop
相关产品推荐
相关产品推荐

