Folium 0.11.0: держать слой маркеров впереди - PullRequest
1 голос
/ 09 мая 2020

Я бы хотел, чтобы слой с маркерами всегда оставался впереди, но я не могу понять, как это сделать.

Как только я начинаю щелкать и снимать щелчок по слоям на панели управления слоями, слой маркеров исчезает за слоями хороплет.

Это мой код:

m = folium.Map([40.4165001, -3.7025599], zoom_start=10, tiles='CartoDB Positron', overlay=True)
# folium.TileLayer('cartodbpositron', overlay=True).add_to(m)


income=folium.Choropleth(
    geo_data=censo,
    data=df1,
    name='Household Income 2016',
    columns=['CDSSCC', 'HouseholdIncome2016'],
    key_on='feature.properties.CDSSCC',
    fill_color='BuGn',
    fill_opacity=1,
    line_opacity=0.2,
    highlight=True,
    legend=False,
).add_to(m)

pop=folium.Choropleth(
    geo_data=censo,
    data=df1,
    name='Population 2016',
    columns=['CDSSCC', 'POB_TOTAL'],
    key_on='feature.properties.CDSSCC',
    fill_color='YlOrBr',
    fill_opacity=1,
    line_opacity=0.2,
    highlight=True,
    legend=False,
).add_to(m)

# add clusters to the map
markers_colors = []
for lat, lon, poi, cluster in zip(buildingsmadrid_merged['Latitude'], buildingsmadrid_merged['Longitude'], buildingsmadrid_merged['Name'], buildingsmadrid_merged['Cluster Labels']):
    label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)
    puntos=folium.CircleMarker(
        [lat, lon],
        radius=5,
        popup=label,
        tooltip = label,
        color='YlOrBr'[cluster-1],
        fill=True,
        fill_color='YlOrBr'[cluster-1],
        fill_opacity=0.7,
        overlay=False).add_to(m)

folium.LayerControl(position='topright', collapsed=False, autoZIndex=True).add_to(m)

# m.save(os.path.join('choropleth.html'))

m

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 15 июля 2020

Folium предлагает решение этой проблемы с помощью метода m.keep_in_front.

Если вы сохраняете список markers объектов CircleMarker, вы можете использовать m.keep_in_front(*markers). Обратите внимание, что порядок элементов устанавливает их приоритет, последний - самый верхний, хотя я сомневаюсь, что это имеет значение в вашем случае.

Это решение в настоящее время работает только при переключении между слоями наложения. В случае переключения между базовыми слоями это не сработает.

Я столкнулся с аналогичной проблемой при попытке отобразить всплывающую подсказку при переключении между хороплетами.

Мои настройки немного отличались от слои choropleth имеют overlay=False, так как я предпочитаю переключаться с помощью радио-кнопок, и у меня был только один слой, который я оставил впереди.

Мне удалось решить эту проблему, используя эти 2 источника: Аналогичный вопрос по Leaflet Эта проблема из Folium github

Поскольку я переключаю базовые слои, я использовал событие baselayerchange.

from branca.element import Element

js_keep_in_front = f"""
    {m.get_name()}.on("baselayerchange", function (event) {{
      {popup.get_name()}.bringToFront();
    }});
"""
e = Element(js_keep_in_front)
html = m.get_root()
html.script.get_root().render()
# Insert new element or custom JS
html.script._children[e.get_name()] = e

В случае есть много объектов, как в вашем примере, их можно сгруппировать в folium.FeatureGroup, как в в этом примере , а затем оставить этот единственный слой впереди, используя описанный метод.

Обратите внимание на использование метода get_name внутри форматированной строки. Это важно, так как вы не знаете, какие имена будет использовать folium для карты / слоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...