您的位置:首页 > Web前端 > JavaScript

ArcGIS API for Javascript 实现在线要素编辑(二)

2014-12-06 23:11 706 查看

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 可选项 如果有错误发生将会返回一个错误对象。

例子:

require([
"esri/layers/FeatureLayer", ...
], function(FeatureLayer, ... ) {
var firePerimeterFL = new FeatureLayer( ... );
var targetGraphic = firePerimeterFL.getSelectedFeatures()[0].setGeometry(reshapedGeometry);
firePerimeterFL.applyEdits(null, [targetGraphic], null);
...
});


3、增加要素

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

1)将底图添加到Map中

myMap = new Map("mapDiv");

var myTiledMapServiceLayer = new ArcGISDynamicMapServiceLayer(
"http://localhost:6080/arcgis/rest/services/XZAirportBaseMap/MapServer");

myTiledMapServiceLayer.setDisableClientCaching(true);

myMap.addLayer(myTiledMapServiceLayer);


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

var myFeatureLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/MyMapService/FeatureServer/0", {
outFields: ["属性1", "属性2", "属性3"]
});

myMap.addLayers([myFeatureLayer]);

myMap.on("layers-add-result", initSelectToolbar);



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

myFeatureLayer.on("edits-complete", function() {
myTiledMapServiceLayer.refresh();
})


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

var drawToolbar = new Draw(myMap);
on(dom.byId("addFence"), "click", function(evt) {
drawToolbar.activate(Draw.POLYGON);
});


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

function initSelectToolbar(evt) {
var petroFieldsFL = evt.layers[0].layer;

drawToolbar.on("draw-end", function(evt) {
drawToolbar.deactivate();
//获取要素个数
currentGraphciNo = petroFieldsFL.graphics.length;
//获取最后一个要素的OBJECTID,并转为数值类型
currentObj = Number(petroFieldsFL.graphics[currentGraphciNo - 1].attributes['OBJECTID']);
//设置新增Graphic的属性,OBJECTID必须设置,其余可以设为NULL
var attr = {
"OBJECTID": currentObj + 1
};
//产生新的Graphic
var newGraphic = new Graphic(evt.geometry, null, attr);
//使用applyEdits函数将Graphic保存到FeatureLayer中
petroFieldsFL.applyEdits([newGraphic], null, null);
});
}


4、删除要素

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

function initSelectToolbar(evt) {
var petroFieldsFL = evt.layers[0].layer;

petroFieldsFL.on("dbl-click", function(evt) {
event.stop(evt);
petroFieldsFL.applyEdits(null, null, [evt.graphic]);
});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐