2

我有一个不支持三角函数的 SQLite 数据库。与第二个 lat,lng 对相比,我想按距离对表中的一组 lat,lng 对进行排序。我熟悉按距离对 lat、lng 对进行排序的标准半正弦距离公式。

在这种情况下,我并不特别关心精度,我的点之间的距离很远,所以我不介意通过将曲线视为直线来四舍五入距离。

我的问题,这种查询是否有一个普遍接受的公式?记住没有三角函数!

4

4 回答 4

8

如果您的点彼此之间的距离在合理范围内(即不跨越半个世界,也不跨越日期变更线),您可以对纬度和经度之间的差异进行校正(因为经度更短,赤道除外),然后就像地球是平的一样计算距离。

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

例如,您当前的位置在哪里,并且@lat是差异校正:@lng2

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)
于 2011-07-01T14:11:54.823 回答
7

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

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

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

于 2011-07-01T15:05:06.730 回答
1

您总是可以截断正弦的泰勒级数展开并使用 sin^2(x)+cos^2(x)=1 的事实来获得余弦的近似值。唯一棘手的部分是使用泰勒定理来估计给定精度所需的项数

于 2011-07-01T14:24:33.463 回答
0

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

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

于 2013-05-02T13:25:44.237 回答