Картография.Визуализация скорости движения с цветовой гаммой на карте в Python - PullRequest
0 голосов
/ 28 октября 2018

У меня есть 3 основных значения (долгота, широта и скорость) в CSV.Используя библиотеку Folium, я могу отобразить местоположение с помощью lon и lat градусов. Мой текущий код:

import pandas as pd
from geopy.geocoders import Nominatim
import folium
from pandas import *
import numpy as np
from matplotlib import cm
import folium

df = DataFrame({'lon': [9.899193, 9.899236, 9.899292, 9.899331, 9.899372, 9.899411, 9.89946, 9.899518, 9.899393, 9.899409, 9.899456, 9.899498, 9.89952, 9.899558, 9.8996, 9.899625, 9.899646, 9.899659, 9.899678, 9.899707, 9.899745, 9.899778], 'lat': [48.849231, 48.849201, 48.849163, 48.849128, 48.84909, 48.849056, 48.84901, 48.848968, 48.849018, 48.849014, 48.848979, 48.848949, 48.848926, 48.84888, 48.848831, 48.848789,48.848762, 48.848735, 48.848712, 48.848686,48.848655, 48.848632 ], 'speed' : [15, 25, 32, 45, 50, 75, 64, 32, 13, 23, 42, 13, 23, 42, 64, 32, 13, 23, 42, 13, 23, 42]})
ave_lt = sum(df['lat'])/len(df)
ave_lg = sum(df['lon'])/len(df)
points = zip(df['lat'], df['lon'])
points = list(points)
my_map = folium.Map(location=[ave_lt, ave_lg], zoom_start=14) 
folium.PolyLine(points, color="red", weight=2.5, opacity=1).add_to(my_map)
my_map

до тех пор, пока здесь он не работает хорошо и выдает мне следующий результат: enter image description here, ноТеперь я хочу также добавить атрибут скорости из CSV для создания цветовой шкалы (на основе значений скорости) на текущей карте.например, если скорость находится в диапазоне от 0 до 20, эта часть линии имеет красный цвет, если скорость находится в диапазоне от 20 до 60 желтого цвета, если скорость выше 60, то линия является зеленой.Возможно ли сделать это в Python?Кто-нибудь может мне помочь с этим? Я хотел бы получить вывод, как это:

enter image description here

Извините за этот вопрос, но я новичок в Python, и я действительнонужно сделать это, заранее спасибо !!Буду очень признателен за вашу помощь!

1 Ответ

0 голосов
/ 28 октября 2018

Попробуйте:

Сначала напишите следующие две функции

def draw_polylines(points, speeds, map):
    colors = [speed_color(x) for x in speeds]
    n = len(colors)
    # Need to have a corresponding color for each point
    if n != len(points):
        raise ValueError
    i = 0
    j = 1
    curr = colors[0]
    while i < n and j < n:
        if colors[i] != colors[j]:
            line = folium.PolyLine(points[i:j], color=curr, weight=2.5, opacity=1)
            line.add_to(map)
            curr = colors[j]
            i = j
        j += 1
    if i < j:
        folium.PolyLine(points[i:j], color=curr, weight=2.5, opacity=1).add_to(map)


def speed_color(speed):
    if speed < 0:
        raise ValueError
    elif speed >= 0 and speed < 20:
        return 'red'
    elif speed >= 20 and speed < 60:
        return 'yellow'
    else:
        return 'green'

Затем, после строки

my_map = folium.Map(location=[ave_lt, ave_lg], zoom_start=14) 

сделайте этот вызов

draw_polylines(points, df['speed'], my_map)

Я попробовал это на ваших данных, и это, похоже, сработало.Обязательно проверьте это сами.

По существу, цвета отрезков определяются по точкам, используя соответствующую скорость для каждого.Если для каждой точки не определена скорость или отрицательная скорость (напишите более подробное тестирование ошибок; данные обычно не чистые!), Этот код выдаст ошибку.

...