Python - Folium 搜索插件不会在 MarkerCluster 组层中搜索弹出文本

Posted

技术标签:

【中文标题】Python - Folium 搜索插件不会在 MarkerCluster 组层中搜索弹出文本【英文标题】:Python - Folium Search Plugin Doesn't Search Popup Text in MarkerCluster Group Layer 【发布时间】:2020-08-25 14:55:37 【问题描述】:

除了实际使用搜索栏外,我的叶图、标记集群、图层控件和搜索栏都可以正常工作并显示。搜索时我有搜索插件指向的层是我的 MarkerCluster 层,folium 文档说它应该是可搜索的。我在搜索栏中输入的任何内容都会返回“找不到位置”,这让我认为它没有正确搜索 MarkerCluster 图层,或者不知道搜索包含在该图层中的 text标记的弹出窗口。

这是我现在拥有的代码:

import os 
import folium
from folium import plugins
import pandas as pd
from folium.plugins import MarkerCluster
from folium.plugins import Search

#import data including lat/lon, name of service, address of service
df = pd.read_csv('data.csv')

#Create base map zoomed in to Indiana
map=folium.Map(location=[39.80, -86.12],  tiles=None, zoom_start=7)
folium.TileLayer('cartodbpositron', name='COVID-19 Services').add_to(map)

#Make Marker Cluster Group layer
mcg = folium.plugins.MarkerCluster(control=False)
map.add_child(mcg)

#Create layer of markers
#Set marker popups to display name and address of service
for row in df.iterrows():
    row_values=row[1]
    location=[row_values['latitude'], row_values['longitude']]
    popup=popup=(row_values['name']+'<br>'+'<br>'+row_values['address_1']+
                 '<br>'+'<br>'+row_values['city']+','+' '+row_values['state']+
                 '<br>'+row_values['zip'])
    marker=folium.Marker(location=location, popup=popup, min_width=2000)
    marker.add_to(mcg)

#Add search bar
servicesearch = Search(
    layer=mcg,
    geom_type='Point',
    placeholder='Search for a service',
    collapsed=False,
).add_to(map)

#Add layer control
folium.LayerControl().add_to(map)

map

如何让搜索插件实际搜索标记弹出窗口的测试?那么,如何让地图突出显示或缩放到搜索标记的那些?非常感谢任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

这是我的解决方案:

def visualize_locations_with_marker_cluster(df, zoom=4):
    f = folium.Figure(width=1000, height=500)

    center_lat=34.686567
    center_lon=135.52000

    m = folium.Map([center_lat,center_lon], zoom_start=zoom).add_to(f)
    marker_cluster = MarkerCluster().add_to(m)

    for d in df.iterrows():
        folium.Marker(location=[d[1]["y"], d[1]["x"]], popup=d[1]["company"], name=d[1]["company"]).add_to(marker_cluster)

    servicesearch = Search(
        layer=marker_cluster,
        search_label="name",
        placeholder='Search for a service',
        collapsed=False,
    ).add_to(m)


    return m

首先创建映射,创建集群,在pd.dataframe 中循环值并为带有name 标签的集群创建Marekers。 接下来创建Search 对象并在那里添加带有search_label="name", 标签的集群。最后将其全部添加回地图

["x", "y"] 是经度和纬度,company 在我的情况下是搜索值

【讨论】:

【参考方案2】:

如果您稍微改变一下向地图添加数据的方式,搜索栏的使用会更容易。您可以将数据框中的数据更改为 GeoJSON 对象。您首先需要为您的 GeoJSON 创建一个字典并使用函数 folium.GeoJSON()

geo_json = 
  "type": "FeatureCollection",
  "features": [],

for d in df.iterrows():
    temp_dict = 
      "type": "Feature",
      "geometry": 
        "type": "Point",
        "coordinates":[d[1]["longitude"], d[1]["latitude"]],
        
      ,"properties": "name": d[1]["name"]
    
    geo_json["features"].append(temp_dict)
geojson_obj = folium.GeoJson(geo_json).add_to(map)

之后,您只需更改一点代码即可添加搜索栏:

servicesearch = Search(
    layer=geojson_obj,
    search_label="name",
    placeholder='Search for a service',
    collapsed=False,
).add_to(map)

【讨论】:

这个解决方案仍然没有解决搜索问题,现在我的标记没有聚集,也没有弹出窗口了。看起来搜索插件比 MarkerCluster 层更喜欢 GeoJson 层(尽管文档说搜索插件适用于 MarkerCluster 层),所以这是一个好的开始。关于现在如何获取这个 GeoJson 数据文件并且仍然有标记集群并且弹出窗口仍然存在的任何建议? @Pierre-Loic,我在自己的数据集上进行了尝试,它在选择搜索的“名称”后将标记从地图上映射到一个奇怪的行有什么想法吗? @onxx,您可以检查您在 geo_json 中的名称值,因为搜索栏使用此标签工作 @Pierre-Loic,我如何将它与标记联系起来? 这对于小型数据集来说是一个不错的解决方案,但在我的情况下,坐标超过 10000 个,它非常缓慢。我必须使用 MarkerCluster【参考方案3】:

我已经为此苦苦挣扎了一段时间。我相信这可能会解决它:在标记中添加一个“名称”或您想要搜索的任何内容,例如:

marker=folium.Marker(location=location, popup=popup, min_width=2000, name=name)

可能有点晚了,但总比没有好。

【讨论】:

以上是关于Python - Folium 搜索插件不会在 MarkerCluster 组层中搜索弹出文本的主要内容,如果未能解决你的问题,请参考以下文章

无法用folium绘制地图

将 folium 地图导出为 png

Python实现地图可视化 folium

Python实现地图可视化 folium

python folium 库学习

使用 Python 地图绘制工具 -- folium 全攻略