【问题标题】:Find minimum distance in a set of objects in R or Python在 R 或 Python 中查找一组对象中的最小距离
【发布时间】:2016-12-08 14:14:27
【问题描述】:

我有一组县以及每个质心的纬度和经度:

county    lat       lon 
Abiline   32.134   -23.322
Cook      43.324   -32.219
Allegheny 31.949   -30.123

我还有许多医院的列表,每个医院的经度和纬度。我想找到每个县质心到最近医院的距离。

到目前为止,我已经使用 ggmap 中的 geocode() 函数来查找每个县到每个医院的距离,然后选择最小距离。但是,因为我有很多县和很多医院,这个问题很快就变得高维了,可能需要很长时间。

我想避免为此使用 arcgis - 在 R 或 Python 中是否有直接的方法来执行此操作?

【问题讨论】:

  • 你在寻找欧几里得距离吗?
  • 如果你正在寻找R中的最小欧几里距离,你可以使用min(dist(c(df$lat,df$lon)))
  • 是的,我正在寻找欧几里得距离。在您的解决方案中,df$latdf$lon 是否指每个医院和县的堆叠(纬度、经度)对?
  • 是的,它应该返回一个成对的距离矩阵

标签: python r geocoding geospatial geocode


【解决方案1】:

我认为您想要达到的目标类似于这个问题 closest pair of points 这是实现相同的完整算法和解释:

给定平面上的 n 个点的数组,问题是找出数组中最近的一对点。这个问题出现在许多应用中。例如,在空中交通管制中,您可能想要监控靠得太近的飞机,因为这可能表明可能发生碰撞。回想一下关于两点 p 和 q 之间距离的以下公式。 蛮力解决方案是 O(n^2),计算每对之间的距离并返回最小的。我们可以使用分治策略计算 O(nLogn) 时间内的最小距离。

算法

以下是 O(n (Logn)^2) 算法的详细步骤。 输入:一个 n 点数组 P[] 输出:给定数组中两点之间的最小距离。

作为预处理步骤,输入数组根据 x 坐标进行排序。

  1. 在排序后的数组中找到中间点,我们可以将P[n/2]作为中间点。
  2. 将给定数组分成两半。第一个子数组包含从 P[0] 到 P[n/2] 的点。第二个子数组包含从 P[n/2+1] 到 P[n-1] 的点。
  3. 递归查找两个子阵列中的最小距离。让距离为 dl 和 dr。求 dl 和 dr 的最小值。设最小值为 d。
  4. 递归查找两个子阵列中的最小距离。让距离为 dl 和 dr。求 dl 和 dr 的最小值。设最小值为 d。
  5. 根据y坐标对数组strip[]进行排序。这一步是 O(nLogn)。它可以通过递归排序和合并优化到 O(n)。
  6. 在 strip[] 中查找最小距离。这很棘手。乍一看,这似乎是一个 O(n^2) 的步骤,但实际上是 O(n)。可以几何证明,对于strip中的每一个点,我们最多只需要检查它后面的7个点(注意strip是按照Y坐标排序的)。
  7. 最后返回上述步骤中计算的 d 和距离的最小值(步骤 6)

实施 is here

希望这会有所帮助:)

来源:Geeksforgeeks.org

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多