问题描述
除了实际使用搜索栏之外,我的大叶贴图,标记群集,图层控件和搜索栏都可以正常工作并正确显示。搜索时指向搜索插件的层是我的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
如何获取搜索插件以实际搜索标记弹出窗口的测试?然后,如何使地图突出显示或缩放到搜索标记的位置?非常感谢您的帮助,谢谢!
解决方法
如果稍微更改将数据添加到地图的方式,将更易于使用搜索栏。您可以将数据框中的数据更改为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)
,
我已经为此苦苦挣扎了一段时间。我相信这可能会解决它:在标记中添加一个“名称”或任何你想要搜索的内容,例如:
def __init__(self,bot):
self.bot = bot
for key in command_image_dict:
setattr(self,key,commands.command(memefunction))
有点晚了,但总比没有好。
,这是我的解决方案:
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,).add_to(m)
return m
首先创建地图,创建集群,循环 pd.dataframe
中的值,并为带有 Mareker
标签的集群创建 name
。
接下来创建 Search
对象并在那里添加带有 search_label="name",
标签的集群。最后将其全部添加回地图
["x","y"]
是经度和纬度,company
是我的搜索值