Показывать разные всплывающие окна для разных полигонов в GeoJSON [Folium] [Python] [Map]

Я использую фолиум для визуализации зон в городе.

My GeoJSON - это FeatureCollection с несколькими полигонами в качестве объектов. Я хочу иметь возможность добавлять в файл разные всплывающие окна для разных полигонов. Идея состоит в том, чтобы показать имена различных полигонов в файле GEOJSON.

Мне удалось добавить всплывающее окно к полному geoJSON. Однако я хочу иметь возможность добавлять разные всплывающие окна для разных полигонов (по сути, название функции).

folium.GeoJson(gurgaon_subzone,name='geojson').add_child(folium.Popup("Gurgaon")).add_to(m)

person Abhinav Jain    schedule 08.02.2019    source источник
comment
С фолиумом это пока невозможно. Хорошая новость в том, что ожидается PR! Так что он может быть включен в будущую версию. Если вы хотите помочь, присоединяйтесь. github.com/python -visualization / folium / pull / 1023   -  person Conengmo    schedule 09.02.2019


Ответы (2)


Для этого есть обходной путь. Вам нужно перебрать каждую функцию geoJson и создать новый geojson для каждой из них. Затем добавьте всплывающее окно для каждой функции geoJson. Затем объедините все объекты в слой. В моем коде полный geoJson data_geojson_dict

layer_geom = folium.FeatureGroup(name='layer',control=False)

for i in range(len(data_geojson_dict["features"])):
    temp_geojson = {"features":[data_geojson_dict["features"][i]],"type":"FeatureCollection"}
    temp_geojson_layer = folium.GeoJson(temp_geojson,
                   highlight_function=lambda x: {'weight':3, 'color':'black'},
                    control=False,
                    style_function=lambda feature: {
                   'color': 'black',
                   'weight': 1},
                    tooltip=folium.features.GeoJsonTooltip(fields=list_tooltip_vars,
                                        aliases=[x.capitalize()+":" for x in list_tooltip_vars], 
                                          labels=True, 
                                          sticky=False))
    folium.Popup(temp_geojson["features"][0]["properties"]["productor"]).add_to(temp_geojson_layer)
    temp_geojson_layer.add_to(layer_geom)

layer_geom.add_to(m)
folium.LayerControl(autoZIndex=False, collapsed=True).add_to(m)
person David Olmo Pérez    schedule 17.02.2019

Основываясь на ответе @David Olmo Pérez, мне это показалось более интуитивным.

# Create feature group to add to folium.Map object
layer = folium.FeatureGroup(name='your layer name', show=False)

# load GEOJSON, but don't add it to anything
temp_geojson = folium.GeoJson('path/to/your/file.geojson')

# iterate over GEOJSON, style individual features, and add them to FeatureGroup
for feature in temp_geojson.data['features']:
    # GEOJSON layer consisting of a single feature
    temp_layer = folium.GeoJson(feature,
                                style_function={
                                    'color': '#000000',
                                    'opacity': 0.7,
                                })
    # lambda to add HTML
    foo = lambda name, source: f"""
        <iframe id="popupIFrame"
            title="{name}"
            width="600"
            height="500"
            align="center"
            src="{source}">
        </iframe>
        """
    # create Popup and add it to our lone feature
    # this example embeds a .png
    folium.Popup(
        html=foo('name of your IFrame',
                 f'path/to/embed/file_{feature["properties"]["some_attribute"]}.png')
    ).add_to(temp_layer)

    # consolidate individual features back into the main layer
    temp_layer.add_to(layer)

# add main layer to folium.Map object
layer.add_to(m)
person and-viceversa    schedule 20.05.2020