IdentifyTask
一看到这串字母有很多人都再熟悉不过了,他的功能给我们带来了很多便利,下面让我们详细介绍一下他的概念,在GIS中它的功能体现就是拾取相应要素的信息,通俗一点讲就是当我们用鼠标点击地图上的一点时,获取该点落在的或在容差范围内的要素相关信息。
下面我们来看看相关代码:
//实例化对象,并且给实现初始化相应的值 params = new IdentifyParameters(); params.setTolerance(20); params.setDPI(98); params.setLayers(new int[]{4}); params.setLayerMode(IdentifyParameters.ALL_LAYERS); //给map添加一个点击地图的事件监听 map.setOnSingleTapListener(new OnSingleTapListener() {
private static final long serialVersionUID = 1L;
public void onSingleTap(final float x,final float y) {
if(!map.isLoaded()){ return; } //establish the identify parameters Point identifyPoint = map.toMapPoint(x, y); params.setGeometry(identifyPoint); params.setSpatialReference(map.getSpatialReference()); params.setMapHeight(map.getHeight()); params.setMapWidth(map.getWidth()); Envelope env = new Envelope(); map.getExtent().queryEnvelope(env); params.setMapExtent(env); //我们自己扩展的异步类 MyIdentifyTask mTask = new MyIdentifyTask(identifyPoint); mTask.execute(params);//执行异步操作并传递所需的参数 }
});
|
上面的代码主要生成了IdentifyParameters实例对象,并且给map添加了一个点击地图事件监听,在监听器中我们给IdentifyParameters实例初始化了一些必要的值,而后执行了一个异步请求操作,重点来了,让我们看一下在这个异步类中我们到底做哪些工作,代码如下:
private class MyIdentifyTask extends AsyncTask<IdentifyParameters, Void, IdentifyResult[]> {
IdentifyTask mIdentifyTask; Point mAnchor; MyIdentifyTask(Point anchorPoint) { mAnchor = anchorPoint; } @Override protected IdentifyResult[] doInBackground(IdentifyParameters... params) { IdentifyResult[] mResult = null; if (params != null && params.length > 0) { IdentifyParameters mParams = params[0]; try { //获取要素数据 mResult = mIdentifyTask.execute(mParams); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
} return mResult; } @Override protected void onPostExecute(IdentifyResult[] results) { // TODO Auto-generated method stub
ArrayList<IdentifyResult> resultList = new ArrayList<IdentifyResult>(); for (int index=0; index < results.length; index++){
if(results[index].getAttributes().get(results[index].getDisplayFieldName())!=null) resultList.add(results[index]); }
map.getCallout().show(mAnchor, createIdentifyContent(resultList)); }
@Override protected void onPreExecute() { //实例化一个要素识别类对象 mIdentifyTask = new IdentifyTask("http://services.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Average_Household_Size/MapServer"); } } |
在此,我们不再介绍异步类的函数执行顺序,如果有什么不懂得可以去看一下Android的官方API或者看一下前面的相关介绍。直入主题,在异步类中做了一下几件事:
1、 生成了一个IdentifyTask实例对象,并且添加服务的URL路径;
2、 取得传递过来的IdentifyParameters对象实例;
3、 执行IdentifyTask对象的execute()方法,返回结果集。
注意,获得数据是一个要素数组,为什么会不是一个要素呢,因为我们获取的要素是一个点的容差范围内的要素,所有可能有多个要素。
到此,我们的识别操作就完成,例子中其他代码就是怎样进行展示这些数据了,在此就不过多介绍了,对于开发人员有了数据,就可以任你摆布了。