地图距离矩阵:如何迭代数据框中的行序列并计算距离

Posted

技术标签:

【中文标题】地图距离矩阵:如何迭代数据框中的行序列并计算距离【英文标题】:Gmaps Distance Matrix : How to iterate over sequence of rows in data frame and calculate distance 【发布时间】:2019-07-05 21:27:35 【问题描述】:

当我问我的问题时,请查看随附的快照。 我有一个数据框,其中包含一对从不同程序进行地理编码的纬度/经度,我正在尝试生成(Latitude1/Longitude1)和(Latitude2/Longitude2)之间的距离矩阵等以查找位置之间的距离。

我下面的程序似乎没有读取所有行。

   import pandas as pd
   import googlemaps
   import requests, json

   gmaps = googlemaps.Client(key='123)

   source = pd.DataFrame('Latitude': df['Latitude1'] ,'Longitude': df['Longitude1'])
   destination = pd.DataFrame('Latitude': df['Latitude2'] ,'Longitude': df['Longitude2'])

   source = source.reset_index(drop=True)
   destination = destination.reset_index(drop=True)

   for i in range(len(source)):
   result = gmaps.distance_matrix(source, destination)
   print(result)

预期输出

   Distance
   12 Miles
   10 Miles
   5 Miles
   1 Mile

数据帧

 Key Latitude1  Longitude1   Latitude2    Longitude#2
 1    42             -91          40           -92
 2    39             -94.35       38           -94
 3    37             -120         36           -120
 4    28.7           -90          35           -90
 5    40             -94          38           -90
 6    30             -90          25           -90

【问题讨论】:

【参考方案1】:

我没有用过 gmap,但这是一个计算距离的简单公式。 这只是数学,所以我不会在这里解释。 只知道您需要 2 个格式为 (lat, lon) 的位置作为参数,并且需要导入数学

def distance(origin, destination):
    lat1, lon1 = origin
    lat2, lon2 = destination
    radius = 3959 # mi

    dlat = math.radians(lat2-lat1)
    dlon = math.radians(lon2-lon1)
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
        * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    d = radius * c

    return d

现在我们需要合并两个数据框More detail here

 maindf = pd.merge(source, destination , left_index=True, right_index=True)

接下来你需要将它应用到每一行

maindf['Distance'] = maindf.apply(lambda row: distance((row.Latitude1,row.Longditude1),(row.Latitude2,row.Longditude2)), axis=1)

在数据帧上应用循环并应用函数。 在这种情况下,它根据每行中的 2 个纬度/经度对将“距离”应用于每一行。 这会添加一个新列“距离”,其中包含两个位置之间的距离(以英里为单位)。

我还要补充一点,如果这是您的完整代码,您实际上并没有向数据帧添加任何数据。

【讨论】:

虽然这是正确的,但它没有考虑到现实世界的变量,例如道路、建筑物等等。我认为使用 gmaps api 会更好。

以上是关于地图距离矩阵:如何迭代数据框中的行序列并计算距离的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中计算动态时间扭曲距离

地图上的两点怎样计算距离

如何计算百度地图上两点的距离

如何计算质心和数据矩阵之间的距离(用于 kmeans 算法)

如何在android中的谷歌地图上绘制路线并计算多个标记之间的距离

查找大矩阵的行之间的最小距离:分配限制错误