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

folium.GeoJson中style_function触发IndexError的原因及原理咨询

folium.GeoJson中style_function触发IndexError的原因及原理咨询

嗨,我来帮你拆解这个问题:

一、为什么会触发IndexError?

你的错误根源在于列表索引不匹配:

  • 你定义的colors列表是["yellow", "red"],它的有效索引是0和1(列表索引从0开始计数)。
  • 但你的GeoDataFrame里type列的值是1和2,当你在style_function里用colors[x['properties']['type']]时,相当于尝试取colors[1](没问题,对应red)和colors[2](这就超出列表范围了,因为列表只有2个元素,最大索引是1),所以直接触发了IndexError: list index out of range。

二、style_function到底在做什么?

简单来说,style_function是folium提供的动态样式回调函数:

  • 它会遍历你传入的GeoJson数据(也就是你的GeoDataFrame每一行),把每一行的特征数据(包含几何信息和属性列)作为参数x传入函数。
  • x['properties']对应的就是你GeoDataFrame里除了geometry列之外的所有属性(这里就是type列),你可以根据这些属性值来动态设置标记的样式,比如不同类型用不同颜色。
  • 函数返回的字典(比如{"fillColor": ...})会被应用到当前这个特征对应的标记上,实现个性化样式。

三、修正方案

推荐用字典映射来替代列表索引,这样更直观也不容易出错:

import geopandas
from shapely.geometry import Point
import folium

d = {'type': [1, 2], 'geometry': [Point(9.59, 49.29), Point(9.65, 49.35)]}
gdf = geopandas.GeoDataFrame(d, crs="EPSG:4326")

# 用字典直接映射type值和颜色
colors = {1: "yellow", 2: "red"}

m = folium.Map(location=[51, 10], zoom_start=7, tiles="cartodb voyager")

folium.GeoJson(
    gdf,
    marker=folium.Circle(radius=10, fill_opacity=0.4, color="black", weight=1),
    style_function=lambda x: {
        "fillColor": colors[x['properties']['type']],
    }
).add_to(m)

m

如果坚持用列表,那需要把type列的值改成从0开始的索引(比如[0,1]),这样和colors列表的索引对应上。

备注:内容来源于stack exchange,提问作者Norbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:54:32