Gmaps Distance Matrix: перебор последовательности строк и генерация расстояния - PullRequest
0 голосов
/ 06 июля 2019

Пожалуйста, смотрите прикрепленный снимок, когда я задаю свой вопрос. У меня есть фрейм данных с парой широта / долгота, которые были геокодированы из другой программы, и я пытаюсь сгенерировать матрицу расстояний между (Широта1 / Долгота1) и (Широта2 / Долгота2) и т. Д., Чтобы найти расстояние между местоположениями.

Кажется, что моя программа ниже не читает все строки.

   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 Ответ

1 голос
/ 06 июля 2019

Я не использовал gmaps, но это простая формула для вычисления расстояния.
Это всего лишь математика, поэтому я не буду здесь это объяснять.Просто знайте, что вам нужно 2 местоположения в формате (широта, долгота) в качестве аргументов и нам нужно импортировать математические данные

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

Теперь нам нужно объединить 2 кадра данных Подробнее здесь

 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 пар лат / длин в каждой строке.
Это добавляет новый столбец «Расстояние» с расстоянием в милях между двумя точками.

Я бы также добавил, если это ваш полный кодвы фактически не добавляете какие-либо данные в фреймы данных.

...