math - 几乎不使用任何数学来测量两点之间的 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 数据时,我可以使用所需的所有数学运算将数据转换为另一种格式,因此可以使用坐标系统转换,但对于搜索,我只能使用该功能。
解决方案
如果您有十进制度的纬度和经度差异,您可以快速计算距离。
考虑到地球的平均半径为 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))
您正在检查用户是否在同一圈内。看到我将查询从和更改为或,因为两者不必同时为真,距离高于某个阈值。
同样,这是一个非常粗略的近似值,但可能足以满足您的意图。
推荐阅读
- scala - Slick:如何使用读写参数调用存储过程
- xml - 如何访问带前缀的 XML 属性?
- android - 禁用 RecyclerView 中的搜索栏
- python - SQLAlchemy:“如果不存在则创建模式”
- ruby - 有没有一种巧妙的方法可以将一个充满方法的整个模块标记为已弃用?
- php - smsgateway.me - 短信网关 API 和 Android
- ruby-on-rails - /Sign_in 和 /Sign_up 的错误 500 在 heroku 上使用导轨设计路线
- mongodb - 如何使用 mongodb 展平顶部文档和子文档?
- powershell - 如何在保留输入大小写的同时使用不区分大小写的匹配替换 PowerShell 中的字符串
- cassandra - Cassandra 上的 Akka 持久性与事件的生存时间 (TTL)