如何为Python的folium创建GeoJson并按id_区分LineString颜色?
用Folium给不同ID的LineString设置不同颜色的解决方案
当然可以实现你的需求!Folium完全支持根据每个LineString的ID来动态设置不同的颜色,我帮你梳理下问题并给出修正方案:
先解答你的两个问题
- 能不能实现? 绝对可以!Folium的
style_function就是用来做这种动态样式设置的,完全支持根据Feature的属性(比如你的id_)来区分样式。 - 怎么修正GeoJSON和代码? 你的代码里有几个小问题(比如坐标顺序、GeoJSON结构、颜色赋值逻辑),我一步步给你修正:
第一步:修正GeoJSON数据结构
首先,GeoJSON的规范里,属性信息(比如id)应该放在properties里,而不是geometry里——geometry只用来存储空间坐标信息。另外,你还犯了一个容易忽略的错误:GeoJSON的坐标顺序是**[经度, 纬度]**,你原来写反成[纬度, 经度]了,这会导致你的线条显示在错误的位置!
假设你的filteredData是按id分组后的数据集(每个id对应一组坐标,组成一个LineString),修正后的Feature生成代码如下:
import pandas as pd # 先按id分组,每个组对应一个LineString features = [] for group_id, group in filteredData.groupby('id'): # 注意GeoJSON坐标顺序是 经度在前,纬度在后! cords = list(zip(group.lon.tolist(), group.lat.tolist())) feature = { 'type': 'Feature', 'geometry': { 'type': 'LineString', 'coordinates': cords }, 'properties': { 'id_': group_id, # 把id放到properties里,方便后续调用 'stroke-width': 5, 'stroke-opacity': 0.4 } } features.append(feature) # 把所有Feature包装成FeatureCollection,这是Folium期望的GeoJSON格式 data = {'type': 'FeatureCollection', 'features': features}
第二步:给每个ID生成唯一颜色
因为你有81+个唯一ID,手动给每个ID设置颜色太麻烦,我们可以用matplotlib的颜色映射来自动生成区分度高的颜色:
import matplotlib.cm as cm import matplotlib.colors as colors # 获取所有唯一的id unique_ids = filteredData['id'].unique() # 创建颜色映射(这里用viridis色系,你也可以换成其他的比如plasma、inferno) norm = colors.Normalize(vmin=0, vmax=len(unique_ids)-1) cmap = cm.get_cmap('viridis') # 生成id到颜色的映射字典 id_to_color = {id_: colors.rgb2hex(cmap(norm(idx))) for idx, id_ in enumerate(unique_ids)}
第三步:用style_function动态设置颜色
现在在Folium的GeoJson组件里,通过style_function读取每个Feature的id_,然后映射到对应的颜色:
import folium m1 = folium.Map(location=[36.862317, -76.3151], zoom_start=6) folium.GeoJson( data, style_function=lambda x: { 'color': id_to_color[x['properties']['id_']], # 根据id获取对应颜色 'weight': x['properties']['stroke-width'], 'opacity': x['properties']['stroke-opacity'] } ).add_to(m1) # 显示地图 m1
额外说明
- 对于LineString来说,
fillColor是没用的——这个属性是给Polygon(面状要素)设置填充色的,LineString只需要设置color(线条颜色)就可以了。 - 如果你想要更自定义的颜色,也可以把
id_to_color改成手动指定的字典,比如{1: '#ff0000', 2: '#00ff00', ...},但自动生成的色系会更协调。
内容的提问来源于stack exchange,提问作者id101112
相关产品推荐
相关产品推荐

