几乎不使用任何数学方法来测量两点之间的 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
步骤中。
我正在编写一个应用程序,将 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
步骤中。