在R或Python中查找一组对象的最小距离

在R或Python中查找一组对象的最小距离,python,r,geocoding,geospatial,geocode,Python,R,Geocoding,Geospatial,Geocode,我有一组县以及每个质心的纬度和经度: county lat lon Abiline 32.134 -23.322 Cook 43.324 -32.219 Allegheny 31.949 -30.123 我还列出了许多医院,以及每家医院的经度和纬度。我想找出每个县中心到最近医院的距离 到目前为止,我已经使用ggmap中的geocode()函数来查找每个县到每个医院的距离,然后选择最小距离。然而,因为我有许多县和许多医院,这个问题很快就会变得高度复杂

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

county    lat       lon 
Abiline   32.134   -23.322
Cook      43.324   -32.219
Allegheny 31.949   -30.123
我还列出了许多医院,以及每家医院的经度和纬度。我想找出每个县中心到最近医院的距离

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


我希望避免使用arcgis来实现这一点——在R或Python中有没有一种简单的方法来实现这一点

我认为你想要达到的目标类似于这个问题 以下是实现相同目的的完整算法和说明:

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

算法

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

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

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

    希望这有帮助:)


    资料来源:geeksforgeks.org

    我认为你想要达到的目标类似于这个问题 以下是实现相同目的的完整算法和说明:

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

    算法

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

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

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

    希望这有帮助:)


    来源:geeksforgeks.org

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