查询检索在ArcGIS Runtime for Android中是不可或缺的一部分,本节将介绍两种常用的查询检索任务:IdentifyTask和QueryTask。IdentifyTask是用来识别图层中的要素的,而QueryTask是用来做图层要素查询的。
IdentifyTask通过字面理解就是一个识别任务类,简单来说就是当我们通过手指点击地图时获取地上的要素信息,当然如果想正常获取要素的相关信息,在识别操作前必须为IdentifyTask事先设置好一组参数信息,IdentifyTask接受的输入参数必须是IdentifyParameters类型的对象,在参数IdentifyParameters对象中我们可以设置相应的识别条件。
IdentifyTask是针对于服务中的多个图层的识别,返回的结果是IdentifyResult[]数组,并且该任务存在三种模式:
l ALL_LAYERS
该模式表示在识别时检索服务上的所有图层的要素。
l VISIBLE_LAYERS
该模式表示在识别时只检索服务上的可见图层的要素。
l TOP_MOST_LAYER
该模式表示在识别时只检索服务上最顶层的要素。
IdentifyParameters常用接口介绍:
序号 |
接口 |
说明 |
1 |
setDPI |
设置map的分辨率值 |
2 |
setGeometry |
设置空间几何对象 |
3 |
setLayerMode |
设置模型,主要有三种模型:ALL_LAYERS、VISIBLE_LAYERS和TOP_MOST_LAYER |
4 |
setLayers |
设置识别的图层数组 |
5 |
setMapExtent |
设置当前地图的范围 |
6 |
setMapHeight |
设置地图的高 |
7 |
setMapWidth |
设置地图的宽 |
8 |
setReturnGeometry |
指定是否返回几何对象 |
9 |
setSpatialReference |
设置空间参考 |
10 |
setTolerance |
设置识别的容差值 |
下面我们通过示例代码来介绍IdentifyTask的具体用法:
params = new IdentifyParameters();//识别任务所需参数对象 params.setTolerance(20);//设置容差 params.setDPI(98);//设置地图的DPI 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 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); } }); ……………………… 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 onPreExecute() { mIdentifyTask = new IdentifyTask("http://services.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Average_Household_Size/MapServer");// } }
通过上面代码我们可以知道,在执行识别任务我们需要以下几个步骤:
1) 创建识别任务所需的参数对象IdentifyParameters
2) 为参数对象设置识别条件
3) 定义MyIdentifyTask类并继承AsyncTask
4) 在MyIdentifyTask的doInBackground()方法中执IdentifyTask的execute();
注:在上面示例中,我们的识别任务是在AsyncTask的子类中执行的,因为识别任务请求是一个不定时操作,为了不影响UI中的操作所以使用该类来异步执行识别任务。
QueryTask指的是一个查询任务,这也是我开发过程中经常使用的一种查询方式,QueryTask查询任务使用非常简单,而且该任务只是针对服务中的一个图层进行查询。在执行QueryTask任务前它需要一个Query参数对象,该参数主要包含了查询的一些条件设置。通过QueryTask我们可以对图层进行属性查询、空间查询以及属性与空间联合查询。
Query常用接口介绍:
序号 |
接口 |
说明 |
1 |
setGeometry |
设置空间几何对象 |
2 |
setInSpatialReference |
设置输入的空间参考 |
3 |
setObjectIds |
设置要查询要素的ObjectID数组 |
4 |
setOutFields |
设置返回字段的数组 |
5 |
setOutSpatialReference |
设置输出的空间参考 |
6 |
setReturnGeometry |
设置是否返回几何对象 |
7 |
setReturnIdsOnly |
设置是否只返回ObjiectID字段 |
8 |
setSpatialRelationship |
设置查询的空间关系 |
9 |
setWhere |
设置设置查询的条件 |
下面通过示例代码我来看一下QueryTask的使用方法:
targetServerURL = "http://services.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Average_Household_Size/MapServer"; String targetLayer = targetServerURL.concat("/3");//服务图层 String[] queryParams = { targetLayer, "AVGHHSZ_CY>3.5" }; AsyncQueryTask ayncQuery = new AsyncQueryTask(); ayncQuery.execute(queryParams); private class AsyncQueryTask extends AsyncTask<String, Void, FeatureSet> { protected FeatureSet doInBackground(String... queryParams) { if (queryParams == null || queryParams.length <= 1) return null; String url = queryParams[0]; Query query = new Query();//创建查询参数对象 String whereClause = queryParams[1]; SpatialReference sr = SpatialReference.create(102100); query.setGeometry(new Envelope(-20147112.9593773, 557305.257274575, -6569564.7196889, 11753184.6153385));//设置空间查询条件 query.setOutSpatialReference(sr);//设置输出坐标系 query.setReturnGeometry(true);//指定是否返回几何对象 query.setWhere(whereClause);//设置属性查询条件 QueryTask qTask = new QueryTask(url); FeatureSet fs = null; try { fs = qTask.execute(query);//执行查询任务 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return fs; } return fs; } } }
通过上面代码我们可以清晰的了解的QueryTask查询任务使用起来非常简单,步骤如下:
1) 创建Query参数对象
2) 为参数对象设定查询条件
3) 通过AsyncTask的子类来执行查询任务