【问题标题】:Python - Folium Search Plugin Doesn't Search Popup Text in MarkerCluster Group LayerPython - Folium 搜索插件不会在 MarkerCluster 组层中搜索弹出文本
【发布时间】: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

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

【问题讨论】:

    标签: python search folium


    【解决方案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)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多