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

如何通过ArcGIS JS SDK的Editor Widget获取MapView中新添加要素的ID?

解决ArcGIS JavaScript SDK获取新添加要素ID的问题

问题分析

你遇到的Editor组件create事件未触发、无法获取有效要素ID的核心原因有两点:

  1. 你在Editor的layerInfos中新建了独立的FeatureLayer实例,和地图中已加载的要素图层并非同一个对象,导致事件监听无法关联到实际的图层操作;
  2. 客户端创建的要素ID是临时值,只有提交到服务器后返回的服务器持久化ID才是需要存入数据库的有效ID。

解决方案

1. 修正Editor配置,复用地图中已有的要素图层

确保Editor使用地图中已加载的要素图层实例,而非重新创建,这样事件才能正确绑定到实际的编辑操作。

2. 监听要素图层的edits事件获取服务器ID

图层的edits事件会在编辑操作提交到服务器后触发,返回的结果中包含新增要素的服务器分配ID,这才是需要存入数据库的有效ID。

完整代码示例

const addEditor = () => {
    // 获取地图中已有的要素图层
    const featureLayer = map.layers.find(layer => layer.type === 'feature');
    if (!featureLayer) {
        console.error("未找到目标要素图层");
        return;
    }

    // 监听图层编辑完成事件,获取服务器返回的有效ID
    featureLayer.on("edits", (editsResult) => {
        // 新增要素的结果存储在addResults数组中
        editsResult.addResults.forEach(result => {
            if (result.success) {
                // objectId即为服务器分配的持久化要素ID
                const newFeatureServerId = result.objectId;
                console.log("新要素的服务器ID:", newFeatureServerId);
                // 在此处将ID存入你的数据库
            } else {
                console.error("要素提交失败:", result.error);
            }
        });
    });

    const editor = new Editor({
        view: mapView,
        allowedWorkflows: 'create',
        layerInfos: [
            {
                layer: featureLayer // 复用地图中已有的要素图层实例
            }
        ]
    });

    // 可选:监听Editor的create事件(仅能获取客户端临时ID,不建议存入数据库)
    editor.on('create', (e) => {
        const tempId = e.features[0].attributes[featureLayer.objectIdField];
        console.log("客户端临时要素ID:", tempId);
    });

    mapView.ui.add(editor, 'top-right');
};

关键说明

  • 禁止在Editor中重新创建FeatureLayer实例,必须复用地图中已加载的图层,否则事件监听会失效;
  • 客户端临时ID仅用于本地操作,不具备持久化意义,务必使用edits事件返回的objectId作为存入数据库的有效ID。

内容的提问来源于stack exchange,提问作者Joshua Abbott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:27:52