ArcGIS for Android示例解析之要素识别-----IdentifyTask

 

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()方法,返回结果集。

注意,获得数据是一个要素数组,为什么会不是一个要素呢,因为我们获取的要素是一个点的容差范围内的要素,所有可能有多个要素。

到此,我们的识别操作就完成,例子中其他代码就是怎样进行展示这些数据了,在此就不过多介绍了,对于开发人员有了数据,就可以任你摆布了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值