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

Leaflet 1.6.0中如何正确对GeoJSON图层使用setStyle修改样式?

问题原因

Leaflet 的 setStyle 方法仅修改 GeoJSON 图层内每个矢量要素的实际渲染样式,不会更新图层实例 options 中存储的初始样式配置,因此你每次读取 obj.options.style.color 拿到的都是初始化时的固定值,无法触发状态切换。另外你原代码中存在笔误:else 分支里的 fillColor: "back" 应为 fillColor: "black",否则填充色会失效。

解决方法

推荐两种可行方案,第二种更加简洁易维护:

方案1:手动同步实例样式配置

每次调用 setStyle 后主动更新 options.style 的值,保证读取的状态和实际渲染一致:

geo_json = L.geoJSON(geo, {
    style: {
        stroke: true,
        color: "black",
        fillColor: "blue"
    }
}).addTo(map);

function high(obj) {
    const current_color = obj.options.style.color
    if (current_color == "black") {
        const newStyle = {
            color: "blue",
            fillColor: "yellow",
            stroke: true
        }
        obj.setStyle(newStyle)
        // 同步更新配置
        obj.options.style = newStyle
    } else {
        const newStyle = {
            color: "black",
            fillColor: "black",
            stroke: true
        }
        obj.setStyle(newStyle)
        obj.options.style = newStyle
    }
}
// 建议把间隔调整为1000ms,100ms切换过快人眼难以分辨
var inter = setInterval(high, 1000, geo_json)

方案2:独立变量维护切换状态(推荐)

不用依赖图层实例的内部配置,单独用变量存储当前样式状态,逻辑更清晰,也不会修改实例原有配置:

geo_json = L.geoJSON(geo, {
    style: {
        stroke: true,
        color: "black",
        fillColor: "blue"
    }
}).addTo(map);

// 单独维护状态标识
let isBlackStyle = true
function high() {
    if (isBlackStyle) {
        geo_json.setStyle({
            color: "blue",
            fillColor: "yellow",
            stroke: true
        })
    } else {
        geo_json.setStyle({
            color: "black",
            fillColor: "black",
            stroke: true
        })
    }
    // 翻转状态
    isBlackStyle = !isBlackStyle
}

var inter = setInterval(high, 1000)

内容的提问来源于stack exchange,提问作者Itération 122442

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:27:04