Gmaps距离矩阵:遍历行序列并生成距离

时间:2019-07-05 21:27:35

标签: python pandas google-maps google-distancematrix-api

当我问我的问题时,请参阅附件快照。 我有一个带有一对从不同程序进行地理编码的纬度/经度的数据框,我试图在(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

DataFrame

 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 个答案:

答案 0 :(得分:1)

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

B

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

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

下一步,您需要将其应用于每一行

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

Apply遍历数据框并应用函数。
在这种情况下,将基于每行中的2个经/纬对对每行应用“距离”。
这会添加一个新的“ Distance”列,其中包含两个位置之间的距离(以英里为单位)。

如果这是您的完整代码,我也要添加,实际上您没有在数据框中添加任何数据。