如何使用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
相关产品推荐
相关产品推荐

