ArcGIS发布FeatureServer和在线编辑applyEdit

本文所用软件:arcmap10.3,server10.3,Oracle 11g

一.发布FeatureServer

用ArcGIS发布在线编辑服务,需要注意将数据存放在sde中,且进行版本注册。

1.创建企业级地理信息数据库

首先创建企业级地理信息库将arcmap用到的空间表与Oracle等关联,这样就可以像操作属性表那样对空间表进行修改了。

在toolbox工具条下找到 Data Management——Geodatabase Administration——Create Enterprise Geodatabase

打开如下:

点击确定,运行。

2.创建数据库连接

在catalog标签中找到Database Connection展开,双击Add Database Connection,输入之前设置的空间表管理账户,点击确定

3.创建要素类

打开创建好的数据库连接,可以右击创建要素类,也可以先创建要素集,在要素集中创建要素类。创建要素集通常会靠前显示,如果有多个要素类,放在要素集中也方便管理。创建好的要素类如下:

4.注册版本

如果只是要素类,则右键要素类,在Manage中点击Register As Versioned,如果要素类存放在要素集中,则右键要素集。注意在弹出的确认框中打上勾。

可能点击确定后会出现如下情况,可以尝试重启license服务。

5.发布服务

注册成功后,就和正常流程一样发布服务即可:将待发布的要素类拖入arcmap中,点击File——Share As——Service,在服务属性页的Capabilities中勾选Feature Access即可。

二.利用FeatureLayer.applyEdits方法在线增改删要素

上面我们发布的服务,在Mapping和Feature Access下分别对应两个rest地址,仔细对比发现是MapServer和FeatureServer,MapServer是用于展示空间要素,需要加载到Map中,FeatureServer用于编辑要素,不需要加载到Map中。

applyEdits(adds?, updates?, deletes?, callback?, errback?)方法前三个参数分别对应增改删操作。

adds参数需要传入graphic数组,graphic只需要赋geometry和attributes即可,不需要设置symbol。

updates参数与adds类似,同样graphic数组,不需要symbol,但是attributes中还需带有OBJECTID属性

deletes参数需要传入graphic数组,graphic只需要赋attributes中的OBJECTID即可。

示例代码:

require([
		"esri/map",
		"esri/graphic",
		"esri/layers/ArcGISTiledMapServiceLayer",
		"esri/layers/FeatureLayer",
		"esri/layers/GraphicsLayer",
		"esri/SpatialReference",
		"esri/geometry/Extent",
		"esri/geometry/Point",
		"esri/symbols/TextSymbol",
		"esri/layers/LabelClass",
		"esri/symbols/SimpleFillSymbol",
		"esri/symbols/SimpleLineSymbol",
		"esri/Color",
		"esri/toolbars/draw",
		"dojo/domReady!"
	 ],function(
		Map,Graphic,ArcGISTiledMapServiceLayer,FeatureLayer,GraphicsLayer,
		SpatialReference,Extent,Point,TextSymbol,LabelClass,SimpleFillSymbol,
		SimpleLineSymbol,Color,Draw
	 ){
		var baseSpatialRef = new SpatialReference({"wkt":'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["degree",0.0174532925199433]]'});
		
		var map = new Map("map",{
// 				center:[113.03,34.69],
			showLabels : true,
			extent:new Extent({xmin:112.80,ymin:34.516,xmax:113.27,ymax:34.865,spatialReference:baseSpatialRef}),
			logo:false,
			maxZoom:17,
			minZoom:4,
			zoom:7
		});
		
		map.spatialReference = baseSpatialRef;
		var basemap = new ArcGISTiledMapServiceLayer(basemapUrl);
		var featuremap = new FeatureLayer(xmdkMapUrl,{//用于展示的MapServer
			showLabels: true,
			outFields: ["*"]
		});
		var featureLay = new FeatureLayer(xmdkFeaUrl,{//可编辑要素图层FeatureServer
			mode: FeatureLayer.MODE_SNAPSHOT,
			outFields: ["*"]
		});
		
		var graphicLayer = new GraphicsLayer({id:"graph"});
		
		//设置文字标注属性
		var statesLabel = new TextSymbol().setColor(new Color("#FF0000"));
		statesLabel.font.setSize("14pt");
		statesLabel.font.setFamily("arial");

		//设置标注属性
		//create instance of LabelClass (note: multiple LabelClasses can be passed in as an array)
		var labelClass = new LabelClass({
			labelExpressionInfo: {
				"value": "{QYMC}"
			},
			useCodedValues: false,
			labelPlacement: "always-horizontal"
		});
		labelClass.symbol = statesLabel; // symbol also can be set in LabelClass' json
		featuremap.setLabelingInfo([ labelClass ]);
		
		map.addLayers([basemap,featuremap,graphicLayer]);
		
        <!-- 新增要素 -->
		var toolbar = new Draw(map);
		toolbar.activate(Draw.POLYGON);
		toolbar.on("draw-end", function(evt){
			toolbar.deactivate();
			
			var attr = {"QYMC":"qq","QYFZR":"ww"};
			var graphic = new Graphic(evt.geometry,"",attr);

			featureLay.applyEdits([graphic],null,null);//新增要素
			
			var extent = map.getZoom();
			map.setZoom(extent-1);//通过缩放形式刷新图层
		});
		
        <!-- 编辑及删除要素 -->
		var editclick = featuremap.on("click",function(evt){
			var attr = evt.graphic.attributes;
			attr.QYMC = "AA"
			var graphic = new Graphic(evt.graphic.geometry,"",attr);
			featureLay.applyEdits(null,[graphic],null);//编辑要素
			
			//var graphic = new Graphic("","",{
			//	"OBJECTID":evt.graphic.attributes.OBJECTID
			//});
			//featureLay.applyEdits(null,null,[graphic]);//删除要素

			var extent = map.getZoom();
			map.setZoom(extent-1);//通过缩放形式刷新图层
			
			editclick.remove();
		});
	});

以上代码从项目中抠出来的,不具有运行功能,只用于展示~

需要注意有两处:

1.执行applyEdits方法后,图层是不会自动刷新的,用FeatureLayer的refresh和redraw都没用,放到applyEdits的回调函数中依旧如此,所以选用了缩放达到刷新的目的,有好办法的同学可以留言,不胜感激。

2.执行添加方法过程中,发现待入库的graphic的属性字段(除OBJECTID,shape的属性字段)内容不能出现空值。举个例子,要素服务包含OBJECTID,QYMC,QYFZR字段,组装graphic时,QYMC,QYFZR内容不能为空,否则报错。

在firefox下报错:

在IE下报错:

发布了27 篇原创文章 · 获赞 29 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/rrrrroy_Ha/article/details/81088248