ArcGIS for Android 之IdentifyTask初步认识和使用

来源:互联网 发布:python 做个静态网页 编辑:程序博客网 时间:2024/06/01 08:13

        对于ArcGIS的查询功能,这在开发当中是必不可少的功能,所以今天就操作了一天的identify。现在对其的基本操作已经有所了解,至少当需要这个功能时,能操作出来。所以笔记是每天必不可少的的。至少对自己的学习经历负责。我选用的例子,自然是Sample中的IdentifyTask的例子。还有参考一篇非常棒的博文:

http://blog.csdn.net/arcgis_mobile/article/details/8263412   (说它棒,是因为它能让我这样的小白看懂)

首先,了解API中的介绍:(根据个人能力进行的翻译,有错误,请指正!)

IdentifyParameters

IdentifyParameters是对于输入参数中所使用的实例化IdentifyTask对象

IdentifyResult

IdentifyTask的查询后的返回结果集(是个数组)

IdentifyTask

基于Parameters的查询任务IdentifyTask


IdentifyParameters的constants介绍

int

ALL_LAYERS   

查询所有服务上的图层

int

TOP_MOST_LAYER    

查询在服务的最上面的图层

int

VISIBLE_LAYERS   

查询可见图层

然后,要明白IdentifyTask是用来识别图层中的要素的,而QueryTask是用来做图层要素查询的。
下面是我将Demo里面的代码进行简化后的代码,只是实现在点击地图上的某个地方时,跳出一个空的callout提示框。
package com.esri.arcgis.android.samples.identifytask;import java.util.ArrayList;import android.app.Activity;import android.content.Context;import android.os.AsyncTask;import android.os.Bundle;import android.widget.ImageButton;import com.esri.android.map.MapView;import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;import com.esri.android.map.event.OnSingleTapListener;import com.esri.core.geometry.Envelope;import com.esri.core.geometry.Point;import com.esri.core.tasks.ags.identify.IdentifyParameters;import com.esri.core.tasks.ags.identify.IdentifyResult;import com.esri.core.tasks.ags.identify.IdentifyTask;public class Identify extends Activity {MapView map = null;IdentifyParameters params;/** Called when the activity is first created. */public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);map = new MapView(this);ArcGISTiledMapServiceLayer basemap = new ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer");map.addLayer(basemap);ArcGISTiledMapServiceLayer layer = new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Average_Household_Size/MapServer");map.addLayer(layer);// Create an extent for initial extentEnvelope env = new Envelope(-19332033.11, -3516.27, -1720941.80,11737211.28);// Set the MapView initial extentmap.setExtent(env);setContentView(map);params = new IdentifyParameters();params.setTolerance(20);params.setDPI(98);params.setLayers(new int[] { 4 });params.setLayerMode(IdentifyParameters.ALL_LAYERS);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 parametersPoint 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);}});}@Overrideprotected void onPause() {super.onPause();map.pause();}@Overrideprotected void onResume() {super.onResume();map.unpause();}/* * 异步执行查询任务 */private class MyIdentifyTask extendsAsyncTask<IdentifyParameters, Void, IdentifyResult[]> {IdentifyTask mIdentifyTask;Point mAnchor;// 用于定位callout显示的位置MyIdentifyTask(Point anchorPoint) {mAnchor = anchorPoint;}@Overrideprotected 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 blocke.printStackTrace();}}return mResult;}@Overrideprotected void onPostExecute(IdentifyResult[] results) {// TODO Auto-generated method stubArrayList<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]);}Context context = null;ImageButton btn;btn = new ImageButton(context);btn.setBackgroundResource(R.drawable.mm4);map.getCallout().show(mAnchor, btn);}@Overrideprotected void onPreExecute() {mIdentifyTask = new IdentifyTask("http://services.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Average_Household_Size/MapServer");}}}
实现的效果:

大家根据自己的需求去给地图添加不同的功能,和给callout内部增加不同的内容。
从代码中,可以了解到,创建一个identifytask查询:
1.创建需要识别的参数对象identifyParameters;
2.设置识别的条件;
3.定义MyIdentifyTask类并继承AsyncTask;

4.在MyIdentifyTask的doInBackground()方法中IdentifyTask的execute()。


原创粉丝点击