我有一个不支持三角函数的 SQLite 数据库。与第二个 lat,lng 对相比,我想按距离对表中的一组 lat,lng 对进行排序。我熟悉按距离对 lat、lng 对进行排序的标准半正弦距离公式。
在这种情况下,我并不特别关心精度,我的点之间的距离很远,所以我不介意通过将曲线视为直线来四舍五入距离。
我的问题,这种查询是否有一个普遍接受的公式?记住没有三角函数!
我有一个不支持三角函数的 SQLite 数据库。与第二个 lat,lng 对相比,我想按距离对表中的一组 lat,lng 对进行排序。我熟悉按距离对 lat、lng 对进行排序的标准半正弦距离公式。
在这种情况下,我并不特别关心精度,我的点之间的距离很远,所以我不介意通过将曲线视为直线来四舍五入距离。
我的问题,这种查询是否有一个普遍接受的公式?记住没有三角函数!
如果您的点彼此之间的距离在合理范围内(即不跨越半个世界,也不跨越日期变更线),您可以对纬度和经度之间的差异进行校正(因为经度更短,赤道除外),然后就像地球是平的一样计算距离。
由于您只想对值进行排序,您甚至不必使用平方根,您只需添加差异的平方即可。
例如,您当前的位置在哪里,并且@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)
如果您想在模型中使用适当的空间数据,请使用 SpatiaLite,它是 SQLite 的空间启用版本:
http://www.gaia-gis.it/spatialite/
它就像 PostGIS 一样适用于 PostgreSQL。您的所有 SQLite 功能都将完美运行且不变,您还将获得空间功能。
您总是可以截断正弦的泰勒级数展开并使用 sin^2(x)+cos^2(x)=1 的事实来获得余弦的近似值。唯一棘手的部分是使用泰勒定理来估计给定精度所需的项数。
用“/”更改“*”对我有用:
select * from Points order by (lat - @lat) * (lat - @lat) + ((lng - @lng) / 2) * ((lng - @lng) / 2)