ESRI在JAVA ADF中做了很多的工作,其中很重要的一个部分是WebQuery。WebQuery用来对ArcGISServer和ArcIMS进行查询,然后在ADF这一端对地图进行渲染。比如说高亮显示,用图片进行渲染等等。
我们来看一个简单的选中,并把选中结果进行高亮显示的开发过程。
事实上选中可以用两种方法,第一种是空间选择,第二种是文本查询,这两种选中都可以。ESRI也提供了进行这两种查询的两个类,这两个类都继承自同一个接口,我们来看一下:
这个类是IdentifyCriteria, TextCriteria,接口是QueryCriteria,QueryCriteria可以设置一些比如最大返回记录,是否返回记录的详细信息等设置。如名所示,IdentifyCriteria用来对数据进行空间查询,我们来看一下,如何使用这个类:
IdentifyCriteria ic = new IdentifyCriteria(geom);
geom是一个WebGeometry类的实例,它可以从客户端触发的MapEvent类中得到。
创建了这个IdentifyCriteria之后,就可以进行查询了,查询是由WebQuery来完成的,所以先要得到WebQuery:
大家打开faces-config.xml,mapContext里面由没有query,如果有,用上面的代码就可以得到WebQuery。
得到了WebQuery,就可以大干一场了,可以用下面的办法进行空间查询:
ic就是IdentifyCriteria,lyrList是一个查询目标层的列表,目标层可以是一个,也可以是多个,比如可以用下面的方法得到所有可以查到的图层:
public ArrayList getQueryLayers(){
if(layers != null) return layers;
layers= new ArrayList();
WebQuery wQuery = this.context.getWebQuery();
WebLayerInfo layerInfo = null;
if(wQuery != null){
List layerList = wQuery.getQueryLayers();
for(Iterator iter = layerList.iterator(); iter.hasNext(); ) {
Object item = (Object) iter.next();
if(item instanceof WebLayerInfo){
layerInfo = (WebLayerInfo)item;
layers.add(new SelectItem(layerInfo, layerInfo.getName()));
}
}
}
return layers;
}
当然,如果你不想查所有的图层,也可以让用户进行选择,选择哪个需要查询的图层。
现在来说说查询返回的结果,我们可以看到结果是一个List,List里面是什么?List里面的对象是QueryResult.
你可以循环得到里面的每一个QueryResult,并把它们高亮显示:
for(int ii=0;ii<results.size();ii++){
result = (QueryResult) results.get(ii);
result.highlight();
}
Highlight采用什么颜色,什么标志进行高亮显示,也是我们可以自己控制的,我个人的喜好是用红色,跟张艺谋一个水准,我们可以把显示符合加到query里面:
WebSimpleMarkerSymbol markers = query.getPointGraphicSymbol();
if (markers == null ) {
markers = new WebSimpleMarkerSymbol();
query.setPointGraphicSymbol(markers);
}
markers.setAntialiasing(true);
markers.setColor("255,0,0");
markers.setOutlineColor("255,0,0");
markers.setMarkerType(WebSimpleMarkerSymbol.CIRCLE);
同样,你可以设置线的颜色和多边形的颜色。这样就可以按照你需要的颜色进行高亮显示了。
当然QueryResult的功能不止能高亮显示,你还可以得到查询结果集的每一个字段的值,用result.getDetails()方法即可得到一个Map,里面有所有结果的字段名和字段值。
最后有说明的是,以上所有的代码对于ArcGIS Server和ArcIMS都同样适用,Enjoy。