没有三角函数的SQL距离查询

Ben*_*and 2 sql distance geolocation geospatial haversine

我有一个SQLite数据库,它不支持trig函数.我希望按照距离对我的表中的一组lat,lng对进行排序,与第二个lat,lng对相比.我熟悉用于按距离分类lat,lng对的标准hasrsine距离公式.

在这种情况下,我并不特别关心精度,我的点被远距离分开,所以我不介意通过将曲线视为直线来舍入距离.

我的问题是,这种查询是否有普遍接受的公式?记住没有触发功能!

Guf*_*ffa 7

如果你的点在彼此的合理距离内(即不是在世界的一半,而不是在日期线上),你可以对纬度和经度之间的差异进行校正(因为经度较短,除赤道外) ),然后计算距离,好像地球是平坦的.

由于您只想对值进行排序,您甚至不必使用平方根,只需添加差异的平方即可.

例如,如果@lat@lng是你的当前位置,并且2是差校:

select *
from Points
order by (lat - @lat) * (lat - @lat) + ((lng - @lng) * 2) * ((lng - @lng) * 2)
Run Code Online (Sandbox Code Playgroud)

您可以计算特定纬度的差异校正1 / cos(lat).


Cees Timmerman想出了这个公式,它也适用于日期线:

pow(lat-lat2, 2) + pow(2 * min(abs(lon-lon2), 360 - abs(lon-lon2)), 2)
Run Code Online (Sandbox Code Playgroud)

  • 只要你不越过两极,`pow(lat - lat2,2)+ pow(2*min(绝对(lon - lon2),abs((180 - abs(lon))+(180 - abs( lon2)))),2)`应该这样做.(从Sterling到俄罗斯的14400.0.) (2认同)

Spa*_*man 7

如果您想在模型中使用适当的空间数据,请使用SpatiaLite,这是SQLite的空间版本:

http://www.gaia-gis.it/spatialite/

它像PostGIS一样用于PostgreSQL.您的所有SQLite功能都将完美且不变地运行,您也将获得空间功能.