查找距给定 Lat Lng 位置一定距离内的所有纬度经度位置的算法

2024-01-06

给定具有纬度 + 经度位置的地点数据库(例如 40.8120390、-73.4889650),我如何找到特定位置给定距离内的所有位置?

从数据库中选择所有位置,然后一一遍历它们,获取距起始位置的距离,看看它们是否在指定距离内,这似乎不是很有效。有没有好的方法来缩小数据库中最初选择的位置范围?一旦我有了(或没有?)一组缩小的位置,我是否仍然要逐一检查它们以检查距离,还是有更好的方法?

我用什么语言来做这件事并不重要。谢谢!


首先比较纬度之间的距离。每个纬度相距约 69 英里(111 公里)。范围从赤道处的 68.703 英里(110.567 公里)到两极处的 69.407 英里(111.699 公里)不等(由于地球略呈椭圆形)。两个位置之间的距离将等于或大于其纬度之间的距离。

请注意,对于经度而言并非如此 - 每个经度的长度取决于纬度。但是,如果您的数据仅限于某个区域(例如单个国家/地区) - 您也可以计算经度的最小和最大范围。


继续进行低精度、快速距离计算,假设地球是球形的:

坐标为 {lat1,lon1} 和 {lat2,lon2} 的两点之间的大圆距离 d 由下式给出:

d = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))

数学上等效的公式(对于短距离较少受舍入误差影响)为:

d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
    cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))

d 是以弧度表示的距离

distance_km ≈ radius_km * distance_radians ≈ 6371 * d

(6371公里是地球平均半径 http://m.wolframalpha.com/input/?i=radius%20of%20the%20earth)

这种方法的计算要求是最低的。然而,对于小距离,结果非常准确。


然后,如果它在给定距离内,或多或少,请使用更准确的方法。

地理图书馆 http://sourceforge.net/projects/geographiclib/不过,这是我所知道的最准确的实现文森特逆公式 http://en.wikipedia.org/wiki/Vincenty%27s_formulae也可以使用。


如果您使用的是 RDBMS,请将纬度设置为主键,将经度设置为辅助键。如上所述,查询纬度范围或纬度/经度范围,然后计算结果集的精确距离。

请注意,所有主要 RDBMS 的现代版本都原生支持地理数据类型和查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找距给定 Lat Lng 位置一定距离内的所有纬度经度位置的算法 的相关文章

  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑
  • 如何对对象进行排序? (画家算法)

    所以我有 4 个矩形形状 我正在尝试应用排序算法 画家算法 https en wikipedia org wiki Painter 27s algorithm 来知道我需要先绘制哪些形状 在 3d 中 然后绘制哪个形状 Note 相机位于右
  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • 如何在Android地图上更改位置时删除标记并重新绘制它

    编辑前 我正在使用下面的代码在android地图上重绘一个标记 实际上它重绘了一个标记 但它并没有删除旧的标记 我尝试过 mapView invlaidate 但它并没有删除旧的 这是 onLocationChanged 函数 Overri
  • 我正在尝试寻找“调酒师算法”

    我正在解决旧编程竞赛中的一些示例问题 在这个问题中 我们输入了我们有多少调酒师以及他们知道哪种配方 每杯鸡尾酒的制作时间为 1 分钟 我们需要计算是否可以在 5 分钟内使用所有调酒师完成订单 解决这个问题的关键是尽可能高效地分配鸡尾酒 这就
  • 从 1 到 20 亿,像 (23,29) 这样相差 6 的连续素数对的数量

    如何在考虑时间复杂度的情况下从 1 到 20 亿 使用任何编程语言且不使用任何外部库 找到像 23 29 这样相差 6 的连续素数对的数量 尝试过埃拉托色尼筛 但获得连续素数是一个挑战 使用了生成器 但时间复杂度非常高 代码是 def ge
  • 使用到达时间差对信号进行三边测量

    我在寻找或实现寻找信号源的算法时遇到一些麻烦 我的工作目标是找到声音发射器的位置 为了实现这一点 我使用了三个麦克风 我正在使用的技术是多点定位这是基于到达时间差 The 到达时间差使用发现每个麦克风之间互相关接收到的信号 我已经实现了算法
  • 如何使用 python 有效地找到两个大文件的交集?

    我有两个大文件 它们的内容如下所示 134430513125296589151963957125296589 该文件包含未排序的 id 列表 某些 id 可能会在单个文件中出现多次 现在我想找到路口两个文件的一部分 这就是两个文件中都出现的
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 优先连接,Matlab 中的复杂网络

    大家好 我现在正在 MATLAB 中研究优先附件模型 在理解以下内容时遇到一些困难 假设我一开始有 4 个节点 连接如下 time 0 1 lt gt 2 3 lt gt 4 在下一个时间步骤中 我添加一个节点和 4 个连接 然后添加另一个
  • 在矩阵/位图中查找质量簇

    这是此处发布的问题的延续 在 2D 位图上查找质心 https stackoverflow com questions 408358 finding the center of mass on a 2d bitmap正如给出的例子 它讨论了
  • GpsStatusListener:尽管状态为 GpsStatus.GPS_EVENT_FIRST_FIX,但修复中未使用卫星

    我向我的位置管理器添加了一个 GPS 状态侦听器 以便查看何时获得第一个修复 当我收到 GPS EVENT FIRST FIX 时 我会循环遍历所有卫星 但为什么修复中没有使用它们 usedInFix 我的日志对所有卫星都显示 错误 fin
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List

随机推荐