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
标签的集群创建Mareker
s。
接下来创建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 组层中搜索弹出文本的主要内容,如果未能解决你的问题,请参考以下文章