几乎不使用任何数学方法来测量两点之间的 GPS 距离? (根本不需要准确性)

Measure GPS distance between two points without using almost any math? (accuracy is not needed at all)

我正在编写一个应用程序,将 GPS 位置(纬度和经度)保存到每个用户信息中。我需要搜索最近的用户,我只能使用数据库提供的 between() 函数进行搜索,此函数仅检查数字是否在最小值和最大值之间,这是一个非常有限的工具。

我可以用它来寻找附近的用户吗?

这是我可以做的伪代码示例,此示例发现用户与目标用户相比,他们的纬度和经度值不大于或小于 2:

lon.is(between(user.lon - 2, user.lon + 2).and(
lat.is(between(user.lat - 2, user.lat + 2))

我不关心准确性,我只想得到最近的用户,最大距离大约是一个城市大小,这就是我所需要的。

这行得通吗?我不熟悉一般的地理定位数学和坐标问题。

当我存储 GPS 数据时,我可以毫无问题地使用所需的所有数学将数据转换为另一种格式,因此可以使用坐标系转换,但对于搜索我只能使用该功能。

如果经纬度有十进制度数差异,可以快速计算距离。

考虑到地球平均半径为 6,371 公里,这意味着每一度大约涵盖:

                          (2*pi*6371)/360 = 111.19 Km, 

你所要做的就是将经纬度差的结果取为:

                        sqrt((lat1-lat2)^2 + (lon1-lon2)^2), 

并将它乘以 119.19 得到以公里为单位的距离。

按照您的要求,这是一个非常粗略的计算,但如果我们谈论的是城市级精度,应该足够了。

更新:

您的伪代码如下所示:

    #City radius in Km
    city_radius = 60 

    #City radius in degrees
    city_radius_degree = 60/111.19

    lon.is.NOT(between(user.lon - city_radius_degree, user.lon + city_radius_degree).or(
    lat.is.NOT(between(user.lat - city_radius_degree, user.lat + city_radius_degree))

您正在检查用户在任何方向上是否在同一个圈子内。看到我将查询从 or 更改为 or,因为两者不必同时为真才能使距离超过特定阈值。

同样,这是一个非常粗略的近似值,但可能足以满足您的意图。

首先,Gremlin 确实支持使用 math 步骤进行复杂的数学计算。

为简单起见,我使用了 Equirectangular approximation formula

x = Δλ ⋅ cos φm
y = Δφ
d = R ⋅ √x² + y²

要获取用户 (id = 0) 与其连接的用户之间的距离,假设 GPS 坐标以度数存储,您可以使用此查询:

g.V(0).as("ln1","lt1").out().as("ln2","lt2")
 .math("sqrt (((ln2 - ln1) * 3.141 / 180 * cos ((lt1 + lt2) * 3.141 / 360))^2 + ((lt2 - lt1) * 3.141 / 180)^2) * 6371")
 .by("lon").by("lon").by("lat").by("lat")

其中3.141代表圆周率,6371是地球的平均半径(公里)。

如果 GPS 值以弧度 (R = D * PI / 180) 存储,它会变得更清晰:

g.V(0).as("ln1","lt1").out().as("ln2","lt2")
 .math("sqrt (((ln2 - ln1) * cos ((lt1 + lt2) / 2))^2 + (lt2 - lt1)^2) * 6371")
 .by("lon").by("lon").by("lat").by("lat")

最后,要仅获取特定距离(即 20 公里)内的那些,您可以将 .is(lt(20)) 附加到查询。要获取用户顶点,您可以将 math 步骤移到 where 步骤中。