欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ArcGIS发布FeatureServer和在线编辑applyEdit

程序员文章站 2022-07-14 10:35:33
...

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

一.发布FeatureServer

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

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

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

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

ArcGIS发布FeatureServer和在线编辑applyEdit

打开如下:

ArcGIS发布FeatureServer和在线编辑applyEdit

点击确定,运行。

2.创建数据库连接

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

ArcGIS发布FeatureServer和在线编辑applyEdit

3.创建要素类

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

ArcGIS发布FeatureServer和在线编辑applyEdit

4.注册版本

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

ArcGIS发布FeatureServer和在线编辑applyEdit

ArcGIS发布FeatureServer和在线编辑applyEdit

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

ArcGIS发布FeatureServer和在线编辑applyEdit

5.发布服务

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

ArcGIS发布FeatureServer和在线编辑applyEdit

二.利用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下报错:

ArcGIS发布FeatureServer和在线编辑applyEdit

在IE下报错:

ArcGIS发布FeatureServer和在线编辑applyEdit

相关标签: arcgis