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

时间:2011-07-01 13:57:59

标签: sql geolocation geospatial distance haversine

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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

示例,其中@lat@lng是您当前的位置,2是差异更正:

select *
from Points
order by (lat - @lat) * (lat - @lat) + ((lng - @lng) * 2) * ((lng - @lng) * 2)

您可以将特定纬度的差异修正计算为1 / cos(lat)


Cees Timmerman提出了这个公式,该公式也适用于日期行:

pow(lat-lat2, 2) + pow(2 * min(abs(lon-lon2), 360 - abs(lon-lon2)), 2)

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:1)

你总是可以截断正弦的Taylor series expansion并使用sin ^ 2(x)+ cos ^ 2(x)= 1的事实来得到余弦的近似值。唯一棘手的部分是using Taylor's theorem to estimate the number of terms that you'd need for a given amount of precision

答案 3 :(得分:0)

用“/”更改“*”对我有用:

选择* 来自积分 订购者(lat - @lat)*(lat - @lat)+((lng - @lng)/ 2)*((lng - @lng)/ 2)