Arcgis 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. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值