I. 查询和识别
仅仅在客户端进行交互是不够的,用户大多数的时候都需要和服务交互,而最基础的需求就是对服务进行查询,涉及到空间查询、属性查询、要素识别等。
空间查询和属性查询
在这里,我想首先让用户在屏幕上绘制一个几何对象,至于怎么绘制这在上面的《通过交互绘制几何对象》一节中已经了解了,所以,这里我们可以简化一点:比如我们现在需要在屏幕上画了一个点,然后想用这个点做一个空间查询。
在这里,我把这些工作都放在屏幕长按的事件监听中,当用户在屏幕上长按时,我们认为用户在屏幕上画了一个点,取到这个点以后我们就可以将其作为Query对象的几何对象进行查询。在这里出现的Query和QueryTask对象如果你接触过ArcGIS Server开发想必是非常的眼熟,使用的方法也是非常类似。在下面高亮的代码中,我们可以看到对Query进行一定设置后,再执行QueryTask的execute方法,执行成功后就可以得到这次空间查询的结果:FeatureSet。
this.map.setOnLongPressListener(new OnLongPressListener() {
public void onLongPress(float x, float y) {
Point pt = AgsQuery.this.map.toMapPoint(x, y);
Query query = new Query("http://server.arcgisonline.com/ArcGIS/rest/services
/Demographics/USA_1990-2000_Population_Change/MapServer/4");
query.setGeometry(pt);
query.setReturnGeometry(true);
query
.setSpatialRelationship(Query.SpatialRelationship.INTERSECTS);
QueryTask queryTask = new QueryTask(query);
try {
FeatureSet fs = queryTask.execute();
SimpleFillSymbol symbol = new SimpleFillSymbol(Color.BLACK);
AgsQuery.this.gLayer
.setRenderer(new SimpleRenderer(symbol));
AgsQuery.this.gLayer.clear();
AgsQuery.this.gLayer.addGraphics(fs.getGraphics());
AgsQuery.this.gLayer.postInvalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
});
FeatureSet对象中包含了所有结果Graphic的集合,这个集合甚至可以被直接批量添加到GraphicsLayer上去。这个例子运行的结果是这样的:
图 26 通过一个点进行空间查询
同样,使用QueryTask同样可以进行属性查询,比如我们稍微修改一下,只使用一个属性过滤:
Query query = new Query(queryUrl);
query.setWhere("RATE_POP<0.2");
query.setReturnGeometry(true);
QueryTask queryTask = new QueryTask(query);
这样的查询可能就会有多个结果返回了,同样,把所有的结果绘制到GraphicsLayer上,得到的结果就是这个样子的:
图 27 通过表达式进行属性查询