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

如何使用Lambda函数为folium的TimestampedGeoJson填充要素并配置图标/标记样式?

如何使用Lambda函数为folium的TimestampedGeoJson填充要素并配置图标/标记样式?

当然可以!虽然TimestampedGeoJson不像普通的folium.GeoJson那样直接提供style_function参数,但我们可以借助lambda函数来批量生成带自定义样式的Feature要素,完全能和你之前的工作流保持一致,不用再写重复的for循环啦。

核心思路

TimestampedGeoJson需要传入一个FeatureCollection格式的数据,每个Feature的properties字段里要包含icon和iconstyle来控制标记样式。所以我们可以用lambda结合map()或者GeoDataFrame的apply()方法,批量把你的数据转换成符合要求的Feature对象,替代原来的显式for循环。

改造你的示例代码

我们把你原来的代码改成用lambda函数来生成features,同时整合所有数据(时间、坐标、颜色、弹窗):

import folium
from folium.plugins import TimestampedGeoJson

m = folium.Map(
    location=[56.096555, -3.64746],
    tiles="cartodbpositron",
    zoom_start=5,
)

# 弹窗表格内容
table = """\
<table style='width:100%'>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td> 
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td> 
    <td>94</td>
  </tr>
</table>
"""

# 原始数据整合(把时间、坐标、颜色、弹窗放在一起)
data_items = [
    {"time": "2017-06-02", "coordinates": [-2.548828, 51.467697], "color": '#e41a1c', "popup": "<h1>address1</h1>"},
    {"time": "2017-07-02", "coordinates": [-0.087891, 51.536086], "color": '#377eb8', "popup": "<h2 style='color:blue;'>address2<h2>"},
    {"time": "2017-08-02", "coordinates": [-6.240234, 53.383328], "color": '#4daf4a', "popup": "<h2 style='color:orange;'>address3<h2>"},
    {"time": "2017-09-02", "coordinates": [-1.40625, 60.261617], "color": '#984ea3', "popup": "<h2 style='color:green;'>address4<h2>"},
    {"time": "2017-10-02", "coordinates": [-1.516113, 53.800651], "color": '#ff7f00', "popup": table}
]

# 用lambda + map批量生成Feature列表
features = list(map(lambda item: {
    "type": "Feature",
    "geometry": {
        "type": "Point",
        "coordinates": item["coordinates"],
    },
    "properties": {
        "time": item["time"],
        "icon": "circle",
        "iconstyle": {
            "color": item["color"],
            "fill": "true",
            "fillOpacity": 1.0,
            "radius": 5
        },
        "popup": item["popup"]  # 弹窗也可以在这里统一配置
    },
}, data_items))

# 生成TimestampedGeoJson并添加到地图
folium.plugins.TimestampedGeoJson(
    {
        "type": "FeatureCollection",
        "features": features,
    },
    period="P7D",
    add_last_point=True,
).add_to(m)

m.save('TimestampedGeoJsonPoint.html')

适配GeoDataFrame的场景

如果你是用GeoPandas的DataFrame来处理数据,也可以用lambda结合apply()方法,和你之前配置folium.GeoJson的逻辑完全对齐:

import geopandas as gpd

# 假设你的GeoDataFrame包含这些字段:time、geometry、color、popup_text
gdf = gpd.read_file("your_data.geojson")

# 用apply + lambda生成features
features = list(gdf.apply(lambda row: {
    "type": "Feature",
    "geometry": row.geometry.__geo_interface__,  # 直接转换GeoPandas的几何对象
    "properties": {
        "time": row["time"],
        "icon": "circle",
        "iconstyle": {
            "color": row["color"],
            "fill": "true",
            "fillOpacity": 0.8,
            "radius": 6 if row["some_column"] > 10 else 4  # 还能加条件判断动态调整样式
        },
        "popup": row["popup_text"]
    }
}, axis=1))

小结

这种方式和你之前用lambda配置folium.GeoJson的style_function思路一致:都是用函数式编程的方式批量处理每个要素的样式,既保持了代码的简洁性,也能灵活实现各种自定义样式需求。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 03:04:29