SQL Server 有个字段类型为 geography,这个类型存经纬度,就可以利用经纬度排序了。
(注意,还有一个近似类型:geometry,这个是用来计算二维平面的,不适合经纬度)
如何往 geography 存储值?
利用的是 geography::STPointFromText()。
第一个参数 POINT() 里面再跟经度、纬度。
第二个参数 4326 代表 GCS-WGS-1984 坐标系。具体本文后面会列出相关链接。
如何查询?
这个 SQL 语句利用 geo.STDistance(@currentLocation) < 1000000 限定了 1000 公里以内的数据,然后按由近到远排序。
关键词总结
坐标系
WGS84,World Geodetic System 1984,世界大地坐标系。长半轴:a = 6378137.0 m,扁率:1/298.257223565。
CGCS2000,China Geodetic Coordinate System 2000,国家大地坐标系。是中国新一代大地坐标系,21 世纪初已在中国正式实施。长半轴:a=6378137.0 m,扁率f=1/298.257222101。
WGS84 与 CGCS2000 实质是一样的,都是对准 ITRF(国际地球参考框架)。可以说两者相容至 cm 级水平,对于当前的应用水平来说,完全忽略。
1954 北京坐标系。20 世纪 50 年代,为满足测绘工作的迫切需要而设立。
1980 西安坐标系。随着天文大地网布设任务的完成,通过天文大地网整体平差,于 20 世纪 80 年代建立。
2018 年 7 月 1 日起全面使用 2000 国家大地坐标系,北京 54 和西安 80 坐标系正式退出历史舞台
GCJ-02,GCJ 是国家测绘局的拼音首字母,这个被戏称为火星坐标系(其实叫偏移算法更准确),国内出版的各种地图系统(包括电子形式),必须至少采用 GCJ-02 对地理位置进行首次加密,经偏移算法处理的地图数据偏差一般为 300~500 米,腾讯地图、高德地图就是用的这个。网上传的这段加密代码仅仅 13 行,但是意义重大。百度地图、搜狗地图有自己的二次加密。
相关阅读