SQL Server 利用 geography 计算地理位置距离、距我最近排序

SQL Server 有个字段类型为 geography,这个类型存经纬度,就可以利用经纬度排序了。

(注意,还有一个近似类型:geometry,这个是用来计算二维平面的,不适合经纬度)

如何往 geography 存储值?

insert into citys(cityName, geo) values('北京', geography::STPointFromText('POINT (116.555963 39.711394)', 4326));
insert into citys(cityName, geo) values('上海', geography::STPointFromText('POINT (121.560028 31.175737)', 4326));
insert into citys(cityName, geo) values('广州', geography::STPointFromText('POINT (113.465217 23.087146)', 4326));
insert into citys(cityName, geo) values('深圳', geography::STPointFromText('POINT (114.090725 22.507165)', 4326));
insert into citys(cityName, geo) values('成都', geography::STPointFromText('POINT (104.137788 30.524926)', 4326));
insert into citys(cityName, geo) values('杭州', geography::STPointFromText('POINT (120.382601 30.157892)', 4326));
insert into citys(cityName, geo) values('重庆', geography::STPointFromText('POINT (106.603025 29.532371)', 4326));
insert into citys(cityName, geo) values('武汉', geography::STPointFromText('POINT (114.403479 30.556776)', 4326));

利用的是 geography::STPointFromText()。

第一个参数 POINT() 里面再跟经度、纬度。

第二个参数 4326 代表 GCS-WGS-1984 坐标系。具体本文后面会列出相关链接。

如何查询?

declare @currentLocation geography
select @currentLocation = geography::STPointFromText('POINT (114.403479 30.556776)', 4326)
select *, geo.STDistance(@currentLocation) as 距离 from citys
    where geo.STDistance(@currentLocation) < 1000000
    order by geo.STDistance(@currentLocation)

这个 SQL 语句利用 geo.STDistance(@currentLocation)  < 1000000 限定了 1000 公里以内的数据,然后按由近到远排序。

关键词总结

  • geography::STPointFromText
  • 字段.STDistance
  • POINT

相关阅读

猜你喜欢

转载自my.oschina.net/u/200350/blog/1794111