向FeatureLayer添加多边形报错,请求修正含applyEdit的代码
问题解析与代码修正
错误原因
控制台报错:
Object { name: "feature-layer:missing-parameters", details: undefined, message: "'addFeatures', 'updateFeatures', 'deleteFeatures', 'addAttachments', 'updateAttachments' or 'deleteAttachments' parameter is required" }
该错误源于调用applyEdits时参数格式错误,同时创建Graphic的方式也存在问题。
修正后的完整代码
require(["esri/config", "esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer", "esri/layers/TileLayer", "esri/layers/VectorTileLayer", "esri/layers/GraphicsLayer", "esri/widgets/Search", "esri/widgets/Sketch/SketchViewModel", "esri/geometry/geometryEngineAsync", "esri/Graphic", ], function (esriConfig, Map, MapView, FeatureLayer, TileLayer, VectorTileLayer, GraphicsLayer, Search, SketchViewModel, geometryEngineAsync, Graphic) { esriConfig.apiKey = "AAPK3f43082c24ae493196786c8b424e9f43HJcMvP1NYaqIN4p63qJnCswIPsyHq8TQHlNtMRLWokqJIWYIJjga9wIEzpy49c9v"; const graphicsLayer = new GraphicsLayer(); const streetmapTMLayer = new TileLayer({ url: streetmapURL }); const streetmapLTMLayer = new VectorTileLayer({ url: streetmapLebelsURL }); const lyrwholeMeters = new FeatureLayer({ url: MetersWholeURL, outFields: ["*"], }); const lyrMeters = new FeatureLayer({ url: MetersURL, outFields: ["*"], }); const lyrpermitAreaUrl = new FeatureLayer({ url: PermitAreaURL, outFields: ["*"], }); console.log(lyrMeters); const map = new Map({ basemap: "arcgis-topographic", // Basemap layer service layers: [streetmapTMLayer, streetmapLTMLayer, lyrpermitAreaUrl, lyrMeters, lyrwholeMeters, graphicsLayer] }); const view = new MapView({ map: map, center: [-95.9406, 41.26], zoom: 16, maxZoom: 21, minZoom: 13, container: "viewDiv" // Div element }); view.when(() => { const polygonSymbol = { type: "simple-fill", // autocasts as new SimpleFillSymbol() color: [207, 34, 171, 0.5], outline: { // autocasts as new SimpleLineSymbol() color: [247, 34, 101, 0.9], } }; const sketchViewModel = new SketchViewModel({ view: view, layer: graphicsLayer, polygonSymbol: polygonSymbol, }); sketchViewModel.create("polygon", { mode: "hybrid" }); // 用户完成绘制多边形后执行 sketchViewModel.on("create", async (event) => { if (event.state === "complete") { // 合并绘制的所有多边形几何 const geometries = graphicsLayer.graphics.map(graphic => graphic.geometry); const queryGeometry = await geometryEngineAsync.union(geometries.toArray()); // 正确创建Graphic:geometry直接传入union后的几何,attributes按需设置 const newGraphic = new Graphic({ geometry: queryGeometry, // 直接使用合并后的多边形几何 attributes: { // 这里添加FeatureLayer所需的属性字段,比如PERMIT_AREA对应的属性,根据你的图层定义调整 // 例如: NAME: "自定义区域" } }); const addEdits = { addFeatures: [newGraphic] // addFeatures要求是数组类型 }; selectFeatures(addEdits); } }); }); // 执行编辑操作的函数 function selectFeatures(editParams) { console.log(editParams); // 直接传入editParams,不需要额外包裹对象 lyrpermitAreaUrl.applyEdits(editParams).then((editsResult) => { console.log(editsResult); if (editsResult.addFeatureResults.length > 0) { console.log(editsResult.addFeatureResults.length); console.log(editsResult.addFeatureResults[0].objectId); } }).catch(error => { console.error("编辑失败:", error); }); } });
关键修正点
- Graphic创建错误:原代码中
geometry属性错误设置PERMIT_AREA: queryGeometry,应直接将合并后的几何赋值给geometry字段。 - addFeatures格式错误:
applyEdits的addFeatures参数要求是Graphic数组,原代码传入单个Graphic,需用数组包裹。 - applyEdits参数传递错误:原代码调用
applyEdits({ geometryabc })错误,应直接传入编辑参数对象,无需额外嵌套。 - 添加错误捕获:新增
catch块处理编辑失败情况,便于排查问题。 - 属性字段补充:创建Graphic时需根据FeatureLayer的字段定义添加对应的
attributes,否则可能导致添加失败(需根据图层实际字段调整)。
内容的提问来源于stack exchange,提问作者Adam-KER
相关产品推荐
相关产品推荐

