Как проложить маршруты между парами начальных и конечных геопространственных точек, используя Folium? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть панды DataFrames с широтой и долготой начала и конца маршрута, поэтому это мои столбцы ('origin_lat,' origin_lon ', destination_lat', 'destination_lon').

Я могу наносить на карту местоположения на карте Фолиума, но я ищу способ прокладывать маршруты между каждым местоположением.

Вот код, который я использую:

m = folium.Map([16.7, 81.095], zoom_start=11)
m

# mark each origin as a point

for index, row in df.iterrows():
    folium.CircleMarker([row['origin_lat'], row['origin_lng']],
                        radius=15,
                        fill_color="#3db7e4", # divvy color
                       ).add_to(m)

for index, row in df.iterrows():
    folium.CircleMarker([row['destination_lat'], row['destination_lng']],
                        radius=15,
                        fill_color="red", # divvy color
                       ).add_to(m)

#add routes

folium.PolyLine([list(zip(df.origin_lat, df.origin_lng)),list(zip(df.destination_lat, df.destination_lng))], line_opacity = 0.5, color='white',line_weight=5).add_to(m)


Код, который я использую, соединяет все места происхождения вместе и все места назначения вместе, но я хочу вместо этого прокладывать маршруты между местами происхождения и места назначения. Как я могу это исправить?

1 Ответ

2 голосов
/ 12 июня 2019

Если я правильно понял ваш вопрос, я считаю, что у вас есть решение

Некоторые операции импорта

import pandas as pd
import numpy as np
import folium

Некоторые примеры данных

centroid_lat = 16.7
centroid_lon = 81.095

x = .1

n = 10

o_lats = np.random.uniform(low=centroid_lat - x, high=centroid_lat + x, size=(n,))
o_lons = np.random.uniform(low=centroid_lon - x, high=centroid_lon + x, size=(n,))
d_lats = np.random.uniform(low=centroid_lat - x, high=centroid_lat + x, size=(n,))
d_lons = np.random.uniform(low=centroid_lon - x, high=centroid_lon + x, size=(n,))

df = pd.DataFrame({'origin_lng' : o_lons, 'origin_lat' : o_lats,
                   'destination_lng': d_lons, 'destination_lat': d_lats})

print(df.head())
   destination_lat  destination_lng  origin_lat  origin_lng
0        16.797057        81.074000   16.660164   81.080038
1        16.615371        81.001004   16.772645   80.997770
2        16.784289        81.117082   16.670008   81.032719
3        16.686201        81.184775   16.787999   81.189585
4        16.757704        81.127280   16.720080   81.178466

Затем карта.Нет необходимости в двух циклах, и я создаю строку для каждой итерации

m = folium.Map([centroid_lat, centroid_lon], zoom_start=11)

for _, row in df.iterrows():
    folium.CircleMarker([row['origin_lat'], row['origin_lng']],
                        radius=15,
                        fill_color="#3db7e4", # divvy color
                       ).add_to(m)

    folium.CircleMarker([row['destination_lat'], row['destination_lng']],
                        radius=15,
                        fill_color="red", # divvy color
                       ).add_to(m)

    folium.PolyLine([[row['origin_lat'], row['origin_lng']], 
                     [row['destination_lat'], row['destination_lng']]]).add_to(m)
m

enter image description here

...