Можно ли нарисовать линии стрелками на карте Фолиума?

Я использую 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% длины между точками является правильной шкалой).

Пример результата:График положения + стрелки направления

Надеюсь, это может помочь

Другие вопросы по тегам