Можно ли нарисовать линии стрелками на карте Фолиума?
Я использую Folium 0.2.1'с Python 2.7.11 на Jupyter Notebook Server 4.2.1
Я пытаюсь нанести на карту линии, на которых есть стрелки для указания направления.
import folium
#DFW, LGA coordinates
coordinates=[(32.900908, -97.040335),(40.768571, -73.861603)]
m = folium.Map(location=[32.900908, -97.040335], zoom_start=4)
#line going from dfw to lga
aline=folium.PolyLine(locations=coordinates,weight=2,color = 'blue')
m.add_children(aline)
3 ответа
Вы можете использовать обычный маркер многоугольника, чтобы нарисовать треугольник в конечной точке...
folium.RegularPolygonMarker(location=(32.900908, -97.040335), fill_color='blue', number_of_sides=3, radius=10, rotation=???).add_to(m)
Вы должны будете использовать некоторую тригонометрию, чтобы вычислить угол поворота треугольника, чтобы он указывал в правильном направлении. Начальная точка любого такого маркера указывает на восток.
Возможно, я немного опоздаю на вечеринку, но у меня есть другие предложения для других людей, которых беспокоит эта проблема. Я бы предложил использовать класс Geod пакета pyproj , который может выполнять геодезические вычисления и вычисления большого круга. Мы можем использовать его для получения прямого и обратного азимута части LineString. Затем для каждой части мы добавляем небольшой маркер многоугольника (или что-то подобное) на одном конце.
from pyproj import Geod
# loop your lines
for line in lines.itertuples():
# format coordinates and draw line
loc = [[j for j in reversed(i)] for i in line.geometry.coords]
folium.PolyLine(loc, color="red").add_to(m)
# get pieces of the line
pairs = [(loc[idx], loc[idx-1]) for idx, val in enumerate(loc) if idx != 0]
# get rotations from forward azimuth of the line pieces and add an offset of 90°
geodesic = Geod(ellps='WGS84')
rotations = [geodesic.inv(pair[0][1], pair[0][0], pair[1][1], pair[1][0])[0]+90 for pair in pairs]
# create your arrow
for pair, rot in zip(pairs, rotations):
folium.RegularPolygonMarker(location=pair[0], color='red', fill=True, fill_color='red', fill_opacity=1,
number_of_sides=3, rotation=rot).add_to(m)
Надеюсь, кто-то сочтет этот фрагмент полезным. Хорошего дня! знак равно
Я нашел решение этой проблемы: я вычисляю свои собственные точки стрелки с помощью тригонометрии, а затем вызываю функцию полилинии, используя эти точки.
def arrow_points_calculate(self, ini_lat, ini_long, heading):
lenght_scale = 0.00012
sides_scale = 0.000025
sides_angle = 25
latA= ini_lat
longA = ini_long
latB = lenght_scale * math.cos(math.radians(heading)) + latA
longB = lenght_scale * math.sin(math.radians(heading)) + longA
latC = sides_scale * math.cos(math.radians(heading + 180 - sides_angle)) + latB
longC = sides_scale * math.sin(math.radians(heading + 180 - sides_angle)) + longB
latD = sides_scale * math.cos(math.radians(heading + 180 + sides_angle)) + latB
longD = sides_scale * math.sin(math.radians(heading + 180 + sides_angle)) + longB
pointA = (latA, longA)
pointB = (latB, longB)
pointC = (latC, longC)
pointD = (latD, longD)
point = [pointA, pointB, pointC, pointD, pointB]
return point
folium.PolyLine(locations=points, color="purple").add_to(
position_plot)
Переменные Lenght_scale и Side_scale должны быть изменены в зависимости от желаемого размера стрелки. Если у вас есть координаты начала и конца стрелки, просто используйте конечные координаты как точку B и рассчитайте масштаб стороны относительно длины между этими точками (на мой взгляд, 20% длины между точками является правильной шкалой).
Пример результата:График положения + стрелки направления
Надеюсь, это может помочь