如何通过ArcGIS JS SDK的Editor Widget获取MapView中新添加要素的ID?
解决ArcGIS JavaScript SDK获取新添加要素ID的问题
问题分析
你遇到的Editor组件create事件未触发、无法获取有效要素ID的核心原因有两点:
- 你在
Editor的layerInfos中新建了独立的FeatureLayer实例,和地图中已加载的要素图层并非同一个对象,导致事件监听无法关联到实际的图层操作; - 客户端创建的要素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
相关产品推荐
相关产品推荐

