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

LeafletJS添加地图覆盖层后导出数据被篡改,原因不明求解决

问题根因

1. 依赖冲突

你的代码中重复引入了两个不同版本的Leaflet(1.7.1和1.0.1),版本冲突会导致地图交互、图层处理逻辑产生不可预期的异常,首先需要移除冗余的重复引入,统一使用同一个稳定版本的Leaflet。

2. 原始数据被直接修改

这是导致导出数据损坏的核心原因:
你在loadCoverageData函数中直接将传入的coverage数据的引用存入了导出用的dataArray数组,而CovJSON.read()以及leaflet-coverage的图层处理逻辑,会直接修改传入的原始数据对象,附加大量运行时属性、内部方法和转换后的数据结构,这些附加内容不属于标准CoverageJSON格式,自然无法被正常导入解析。
哪怕你后续移除了地图图层,已经被修改的原始数据对象也不会恢复为初始状态,因此导出的内容始终是损坏的。

修复方案

修改loadCoverageData逻辑,不要直接将原始数据引用存入导出数组,也不要直接把原始数据传给CovJSON处理,全程使用原始数据的深拷贝做分离处理:

// 适配你现有Map序列化逻辑的深拷贝函数
function deepCopy(obj) {
  return JSON.parse(JSON.stringify(obj, replacer), reviver);
}

function loadCoverageData(data) {
    console.log("Attempting to load: \n", data);
    // 原始数据的拷贝存入导出数组,完全和后续处理逻辑隔离
    const exportData = deepCopy(data);
    dataArray.push(exportData);
    // 另一份拷贝传给CovJSON做图层处理,修改不会影响导出数据
    const processData = deepCopy(data);
    CovJSON.read(processData)
        .then((coverage) => {
            let dataLayer = C.dataLayer(coverage, {parameter: Object.keys(data.parameters)[0]})
                .on('afterAdd', () => {
                    if (dataLayer.palette) {
                        C.legend(dataLayer).addTo(map)
                    }
                    if (dataLayer.timeSlices) {
                        new C.TimeAxis(dataLayer).addTo(map)
                    }
                })
            controlLayers.addOverlay(dataLayer, Object.keys(data.parameters)[0]);
        });
}

修改后导出用的dataArray中的数据永远和初始导入/加载的原始数据一致,不受图层处理逻辑的修改影响,导出的JSON文件可以正常被导入使用。

内容的提问来源于stack exchange,提问作者Jay Cork

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:06:03