首页 > 解决方案 > 几乎不使用任何数学来测量两点之间的 GPS 距离?(完全不需要精度)

问题描述

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

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

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

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

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

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

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

标签: mathgeolocationgpsgremlingoogle-geolocation

解决方案


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

考虑到地球的平均半径为 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))

您正在检查用户是否在同一圈内。看到我将查询从和更改为或,因为两者不必同时为真,距离高于某个阈值。

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


推荐阅读