Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

arcgis api for javascript要素画图编辑


教程目录

1、获取要素服务地址

发布服务MyMapService后,可以在ArcGIS Server的Services Directory中可以看到一个名为MyMapService
(FeatureServer)服务,括号中的FeatureServer表明该服务为要素服务


点击进入后可以看到其中包含的Layer如下


点击其中的GeoFences图层,该网页地址即为后续程序中用到的服务地址。


并且看到详细信息,其中属性信息和图层编辑能力均可以看到。

 

2、FeatureLayer.applyEdits函数说明

 

applyEdits函数是FeatureLayer类中的一个方法,主要作用是修改featurelayer的要素,但仅对要素服务(feature
service)

函数形式:applyEdits(adds?,
updates?, deletes?, callback?, errback?)

返回类型:dojo.Deferred

参数表:

1)<Graphic[]> adds 可选项 要被添加到要素服务中的图层中的要素数组。新要素通常由Draw工具条创建。

2)<Graphic[]>
updates 可选项 几何对象和属性有所改变的要素数组。要素必须有一个有效的OBJECTID。要素的几何对象通常由Edit工具条修改。属性使用Attribute Inspector修改。

3)<Graphic[]>
deletes 可选项 待删除的要素数组,这些要素必须有有效的OBJECTID。

4)<Function> callback 可选项 当操作完成时本函数会被调用。传给本函数的参数和onEditsComplete事件中的一样。

5)<Function>
callback 可选项 如果有错误发生将会返回一个错误对象。

例子:

[javascript] view
plain
 copy

在CODE上查看代码片派生到我的代码片

  1. require([  
  2.   “esri/layers/FeatureLayer”, …   
  3. ], function(FeatureLayer, … ) {  
  4.   var firePerimeterFL = new FeatureLayer( … );  
  5.   var targetGraphic = firePerimeterFL.getSelectedFeatures()[0].setGeometry(reshapedGeometry);  
  6.   firePerimeterFL.applyEdits(null, [targetGraphic], null);  
  7.   …  
  8. });  



 

3、增加要素

 

参照ESRI网站例子,但并没有使用TemplatePicker而是直接用Draw来画Graphic增加要素。这里仅以增加面状要素为例,主要步骤如下:
1)将底图添加到Map中

[javascript] view
plain
 copy

在CODE上查看代码片派生到我的代码片

  1. myMap = new Map(“mapDiv”);  
  2.   
  3. var myTiledMapServiceLayer = new ArcGISDynamicMapServiceLayer(  
  4.     “http://localhost:6080/arcgis/rest/services/XZAirportBaseMap/MapServer”);  
  5.   
  6. myTiledMapServiceLayer.setDisableClientCaching(true);  
  7.   
  8. myMap.addLayer(myTiledMapServiceLayer);  



2)由要素服务创建FeatureLayer,使用Map类中的addLayers函数添加到Map中,在Map执行完成addLayers函数后会响应layers-add-result事件,执行initSelectToolbar

[javascript] view
plain
 copy

在CODE上查看代码片派生到我的代码片

  1. var myFeatureLayer = new FeatureLayer(“http://localhost:6080/arcgis/rest/services/MyMapService/FeatureServer/0”, {  
  2.     outFields: [“属性1”“属性2”“属性3”]  
  3. });  
  4.   
  5. myMap.addLayers([myFeatureLayer]);  
  6.   
  7. myMap.on(“layers-add-result”, initSelectToolbar);  

3)在FeatureLayer的edits-complete事件中完成底图刷新工作

[javascript] view
plain
 copy

在CODE上查看代码片派生到我的代码片

  1. myFeatureLayer.on(“edits-complete”function() {  
  2.     myTiledMapServiceLayer.refresh();  
  3. })  

4),此时响应相应按钮点击事件,启动Draw工具

[javascript] view
plain
 copy

在CODE上查看代码片派生到我的代码片

  1. var drawToolbar = new Draw(myMap);  
  2.         on(dom.byId(“addFence”), “click”function(evt) {  
  3.             drawToolbar.activate(Draw.POLYGON);  
  4.         });  


5)在draw-end事件响应中使用FeatureLayer.applyEdits函数将Graphic保存到FeatureLayer中,需要注意的是必须为Graphic添加OBJECTID属性,并且类型为数值型

[javascript] view
plain
 copy

在CODE上查看代码片派生到我的代码片

  1. function initSelectToolbar(evt) {  
  2.             var petroFieldsFL = evt.layers[0].layer;  
  3.   
  4.             drawToolbar.on(“draw-end”function(evt) {  
  5.                 drawToolbar.deactivate();  
  6.                 //获取要素个数  
  7.                 currentGraphciNo = petroFieldsFL.graphics.length;  
  8.                 //获取最后一个要素的OBJECTID,并转为数值类型  
  9.                 currentObj = Number(petroFieldsFL.graphics[currentGraphciNo – 1].attributes[‘OBJECTID’]);  
  10.                 //设置新增Graphic的属性,OBJECTID必须设置,其余可以设为NULL  
  11.                 var attr = {  
  12.                     “OBJECTID”: currentObj + 1  
  13.                 };  
  14.                 //产生新的Graphic  
  15.                 var newGraphic = new Graphic(evt.geometry, null, attr);  
  16.                 //使用applyEdits函数将Graphic保存到FeatureLayer中  
  17.                 petroFieldsFL.applyEdits([newGraphic], nullnull);  
  18.             });  
  19.         }  

4、删除要素

删除要素和增加要素类似,同样使用FeatureLayer.applyEdits函数.前两步和增加要素中的1)2)相同,这里规定双击删除要素,因此在FeatureLayer的dbl-click事件中使用如下代码:


[javascript] view
plain
 copy

在CODE上查看代码片派生到我的代码片

  1. function initSelectToolbar(evt) {  
  2.     var petroFieldsFL = evt.layers[0].layer;  
  3.   
  4.     petroFieldsFL.on(“dbl-click”function(evt) {            
  5.             event.stop(evt);  
  6.             petroFieldsFL.applyEdits(nullnull, [evt.graphic]);      
  7.     });  
  8.   
  9. }

转载自:https://blog.csdn.net/xcymorningsun/article/details/52709833