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下报错: