В Python Leaflet / folium Maps есть способ сделать поиск, приводящий к открытию всплывающего окна соответствующего маркера вместо выделения? - PullRequest
0 голосов
/ 01 мая 2019

Я использую Folium / Leaflet в Python для построения маркеров точек.

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

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

Как я могу это сделать?

enter image description here

Для создания всплывающих окон и поиска мне пришлось использовать два разных типа маркеров -

folium.Marker (потому что это может иметь HTML-контент)

folium.GeoJson (потому что поиск может быть создан на основе этого)

Изображения:

Вот код:

######################################################################
# Part 1 - Creating map

m_search = folium.Map(location=[28.6003435, 77.21952300000001],zoom_start=11
              )   

#######################################################################
# Part 2 - Creating folium markers on map with html text, images 
# etc dynamically for multiple points using for-loop


for plot_numb in range(gdf.shape[0]):

    icon = folium.Icon(color="blue", icon="cloud", icon_color='white')
    tooltip = 'Click to view more about: '+gdf.iloc[plot_numb,0]

    var_name = gdf.iloc[plot_numb,0] 
    var_loc = gdf.iloc[plot_numb,2] 
    pic = base64.b64encode(open('Images/'+gdf.iloc[plot_numb,5],'rb').read()).decode()    

    html = f'''<img ALIGN="Right" src="data:image/png;base64,{pic}">\
    <strong>Name: </strong>{var_name}<br /><br />\
    <strong>Location: </strong>{var_loc}<br /><br />\
    '''
    html 

    iframe = IFrame(html, width=300+180, height=300)
    popup = folium.Popup(iframe, max_width=650) 

    marker = folium.Marker(location=gdf.iloc[plot_numb,1], popup=popup, tooltip=tooltip, icon=icon).add_to(m_search)


########################################################################
# Part 3 - Creating Markers using GeoJson, creating search  

# creating folium GeoJson objects from out GeoDataFrames
pointgeo = folium.GeoJson(gdf,name='group on map', show=False,
                      tooltip=folium.GeoJsonTooltip(fields=['Name', 'Relation', 'City'], aliases=['Name','Relation', 'City'],
                        localize=True)).add_to(m_search)

# Add some Search boxes to the map that reference the GeoDataFrames with some different parameters passed to the 
# arguments.

pointsearch = Search(layer=pointgeo, geom_type='Point', 
                 placeholder='Search for contacts', collapsed=False,
                 search_label='Name').add_to(m_search)


# To Add a LayerControl add below line
folium.LayerControl().add_to(m_search)

m_search 

Ниже приведен пример фрейма данных gdf:

    Name    Location    City    Relation    Relation Detail Image   Lat Lon geometry
0   abc [28.562193, 77.387073]  Noida   Cousin  Cousin  1.png   28.562193   77.387073   POINT (77.387073 28.562193)
1   def [28.565282027743955, 77.44913935661314] Noida   Cousin  Cousin Brother  2.png   28.565282   77.449139   POINT (77.44913935661314 28.56528202774395)
3   ghi [28.6206996683473, 77.42576122283936]   Noida   Cousin  Cousin Brother  4.png   28.620700   77.425761   POINT (77.42576122283936 28.6206996683473)
...