从ArcGIS 10开始,地图服务有了一个新的Capability——“Feature Access”,所有的要素编辑都是通过这个接口实现的。同时,在各种客户端中出现了一种新的图层名为“Feature Layer”,它可以对应到一个地图服务的某个要素图层,因此,要进行要素编辑,让我们先熟悉一下ArcGIS Android API中的Feature Layer。
ArcGIS Android API提供了一个选择要素的例子(SelectFeatures),这个例子主要演示了Feature Layer的用法,运行这个例子的效果大概是这个样子:
图 32 使用Feature Layer选择要素
当用户画定了一个范围,程序就会选中Feature Layer在这个范围中符合条件的要素,并把这些要素用粉红色高亮(其它地方显示其它颜色的要素是因为下面还叠加的一个动态地图服务,它们并不是在Feature Layer上显示的)。
从这个例子的源代码中,我们可以很容易找到最关键的几行代码,在这几行代码中,程序定义了一个Query对象用以设置过滤条件,然后简单地通过调用ArcGISFeatureLayer对象的selectFeature方法就实现了对要素的选择。
fLayer.clearSelection();
Query q = new Query();
q.setWhere("PROD_GAS='Yes'");
q.setReturnGeometry(true);
q.setInSpatialReference(map.getSpatialReference());
q.setGeometry(g.getGeometry());
q.setSpatialRelationship(SpatialRelationship.INTERSECTS);
fLayer.selectFeatures(q, SELECTION_METHOD.NEW, callback);
而在本质上,这里调用的selectFeature方法背后访问的是ArcGISFeatureLayer所对应的要素图层,通过Query对象限制的条件进行查询操作,再把查询的结果(FeatureSet)返回到客户端,并添加到ArcGISFeatureLayer上去。
至于ArcGISFeatureLayer的本质,其实它就是一个GraphicsLayer,不过它和一个服务器端的要素图层遥相呼应了而已:
Options o = new Options();
o.mode = MODE.ONDEMAND;
o.outFields = new String[] {"FIELD_KID", "APPROXACRE", "FIELD_NAME"};
fLayer = new ArcGISFeatureLayer(this,
"http://sampleserver3.arcgisonline.com/ArcGIS/rest
/services/Petroleum/KSPetro/MapServer/1",o);
注意一下,这里ArcGISFeatureLayer对应的URL地址是MapServer中的一个图层,因此在这里这个Feature Layer虽然可以选择,但是做不了编辑。要想可以进行编辑,ArcGISFeatureLayer的URL地址就必须是一个FeatureServer中的图层。