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

如何为Python的folium创建GeoJson并按id_区分LineString颜色?

用Folium给不同ID的LineString设置不同颜色的解决方案

当然可以实现你的需求!Folium完全支持根据每个LineString的ID来动态设置不同的颜色,我帮你梳理下问题并给出修正方案:

先解答你的两个问题

  1. 能不能实现? 绝对可以!Folium的style_function就是用来做这种动态样式设置的,完全支持根据Feature的属性(比如你的id_)来区分样式。
  2. 怎么修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:16