You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为folium地图添加支持多字段搜索的Search插件?

问题:Folium地图实现多字段搜索(id/name/density)

我正在尝试使用folium plugins为folium地图添加搜索栏。当前地图仅支持按美国州名称搜索,希望实现基于density、id、name的多字段搜索。

数据处理代码

import geopandas

states = geopandas.read_file(
    "https://raw.githubusercontent.com/PublicaMundi/MappingAPI/master/data/geojson/us-states.json",
    driver="GeoJSON",
)

states_sorted = states.sort_values(by="density", ascending=False)
states_sorted.head(5).append(states_sorted.tail(5))[["name", "density"]]

def rd2(x):
    return round(x, 2)

minimum, maximum = states["density"].quantile([0.05, 0.95]).apply(rd2)
mean = round(states["density"].mean(), 2)

import branca

colormap = branca.colormap.LinearColormap(
    colors=["#f2f0f7", "#cbc9e2", "#9e9ac8", "#756bb1", "#54278f"],
    index=states["density"].quantile([0.2, 0.4, 0.6, 0.8]),
    vmin=minimum,
    vmax=maximum,
)

colormap.caption = "Population Density in the United States"

数据样例

id  name        density  geometry
0   01  Alabama     94.650   POLYGON ((-87.35930 35.00118, -85.60667 34.984...
1   02  Alaska      1.264    MULTIPOLYGON (((-131.60202 55.11798, -131.5691...
2   04  Arizona     57.050   POLYGON ((-109.04250 37.00026, -109.04798 31.3...
3   05  Arkansas    56.430   POLYGON ((-94.47384 36.50186, -90.15254 36.496...
4   06  California  241.700  POLYGON ((-123.23326 42.00619, -122.37885 42.0...

Folium地图代码

import folium
from folium.plugins import Search

m = folium.Map(location=[38, -97], zoom_start=4)

def style_function(x):
    return {
        "fillColor": colormap(x["properties"]["density"]),
        "color": "black",
        "weight": 2,
        "fillOpacity": 0.5,
    }

stategeo = folium.GeoJson(
    states,
    name="US States",
    style_function=style_function,
    tooltip=folium.GeoJsonTooltip(
        fields=["name", "density"], aliases=["State", "Density"], localize=True
    ),
).add_to(m)

statesearch = Search(
    layer=stategeo,
    geom_type="Polygon",
    placeholder="Search for a US State",
    collapsed=False,
    search_label="name",
    weight=3,
).add_to(m)

folium.LayerControl().add_to(m)
colormap.add_to(m)

m

解决方案

可以实现多字段搜索,推荐以下两种方案:

方法1:创建组合搜索字段(简单易实现)

在数据处理阶段,给GeoDataFrame添加一个包含id、name、density的组合字段,让搜索插件基于这个字段匹配所有内容:

修改数据处理代码,新增组合字段:

# 创建包含多字段的搜索文本
states['search_combined'] = states.apply(
    lambda row: f"{row['id']} | {row['name']} | {row['density']}",
    axis=1
)

然后修改地图代码中的Search配置,将search_label指向这个新字段:

statesearch = Search(
    layer=stategeo,
    geom_type="Polygon",
    placeholder="搜索州ID/名称/人口密度",
    collapsed=False,
    search_label="search_combined",  # 使用组合字段作为搜索目标
    weight=3,
).add_to(m)

这样用户输入任意字段的内容(比如01、Alabama、94.65),都能匹配到对应的州。

方法2:自定义搜索逻辑(进阶)

如果不想修改原始数据,可以通过重写Search插件的JavaScript匹配逻辑实现多字段搜索。核心思路是自定义filter函数,同时检查id、name、density三个字段是否包含搜索关键词,但需要编写额外的JS代码,复杂度较高,适合有前端基础的用户。


内容的提问来源于stack exchange,提问作者Ailurophile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:15:48