概述
空间查询是地理信息中的一个概念,指的是通过空间数据进行空间数据库的查询操作。
在ArcGIS for Android里,通常采用FeatureTable类来展示空间数据,每个空间表包含了一系列的字段,一个图形和一个空间参考系。而空间数据的来源主要包括在线获取,离线的geodatabase数据、VTPK数据和MMPK数据的读取等。
目前来说离线数据还是以geodatabase数据,所以我们以geodatabase数据为例说明下如何在ArcGIS for Android Runtime 100里进行空间查询。
之前我写过一篇基于Runtime 10.2.9的空间查询的例子,博客地址是:http://blog.csdn.net/bit_kaki/article/details/76429910,可以参考下。其实在Runtime 100里,对于空间查询的方法变化并不大,最大的变化就是在Runtime 100里对于异步统一采用了ListenableFuture接口来进行表达。
Query方法查询(对FeatureTable类查询)
用Query方法查询是ArcGIS for Android里最常用的查询方法,在Runtime 100里,依然是通过先构造一个QueryParameters实例,然后对其填充所需的查询参数,最后把这些参数传递给一个对FeatureTable类的Query查询方法即可。其官方API如下:
简单示例如下:
mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) { @Override public boolean onSingleTapConfirmed(MotionEvent v) { android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY())); Point clickPoint = mMapView.screenToLocation(screenPoint); QueryParameters query = new QueryParameters(); query.setGeometry(clickPoint);// 设置空间几何对象 FeatureTable mTable = dataFeatureLayer.getFeatureTable();//得到查询属性表 final ListenableFuture<FeatureQueryResult> featureQueryResult = mTable.queryFeaturesAsync(query); featureQueryResult.addDoneListener(new Runnable() { @Override public void run() { try { FeatureQueryResult featureResul = featureQueryResult.get(); for (Object element : featureResul) { if (element instanceof Feature) { Feature mFeatureGrafic = (Feature) element; Map<String, Object> mQuerryString = mFeatureGrafic.getAttributes(); for(String key : mQuerryString.keySet()){ Log.i("==============="+key,String.valueOf(mQuerryString.get(key))); } } } }catch (Exception e){ e.printStackTrace(); } } }); return true; } });
运行的结果贴图:
Select方法查询(对FeatureLayer类查询)
前面我们说了在ArcGIS for Android里,通常采用FeatureTable类来展示空间数据,而直接加载geodatabase数据的却是一个要素图层FeatureLayer。对于它,我们也可以通过Select的方法进行查询,其方法依然是通过先构造一个QueryParameters实例,然后对其填充所需的查询参数,最后把这些参数传递给一个对FeatureLayer类的Select查询方法即可:
mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) { @Override public boolean onSingleTapConfirmed(MotionEvent v) { android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY())); Point clickPoint = mMapView.screenToLocation(screenPoint); QueryParameters query = new QueryParameters(); query.setGeometry(clickPoint);// 设置空间几何对象 final ListenableFuture<FeatureQueryResult> featureQueryResult = dataFeatureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.ADD); featureQueryResult.addDoneListener(new Runnable() { @Override public void run() { try { FeatureQueryResult featureResul = featureQueryResult.get(); for (Object element : featureResul) { if (element instanceof Feature) { Feature mFeatureGrafic = (Feature) element; Map<String, Object> mQuerryString = mFeatureGrafic.getAttributes(); for(String key : mQuerryString.keySet()){ Log.i("==============="+key,String.valueOf(mQuerryString.get(key))); } } } }catch (Exception e){ e.printStackTrace(); } } }); return true; } });
效果图和Query完全相同。
不过注意的是它有三种Select模式,分别是ADD,NEW和SUBTRACT,代表向选择集增加图形,新建选择集以及删除当前选择集图形。
Identify方法查询(对FeatureLayer类查询)
我们都知道,FeatureLayer是加载在MapView上的,所以我们也可以对MapView进行查询,而对MapView进行控件查询的方法就是Identify。因为一个MapView会加载多层FeatureLayer,所以在查询的方法里需要加入数据的层数来判断是对那个FeatureLayer进行查询,其API是:
以其中一个方法为例子是:
mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) { @Override public boolean onSingleTapConfirmed(MotionEvent v) { android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY())); Point clickPoint = mMapView.screenToLocation(screenPoint); QueryParameters query = new QueryParameters(); query.setGeometry(clickPoint);// 设置空间几何对象 final ListenableFuture<IdentifyLayerResult> featureQueryResult = mMapView.identifyLayerAsync(dataFeatureLayer,screenPoint,0,false); featureQueryResult.addDoneListener(new Runnable() { @Override public void run() { try { for (Object element : featureQueryResult.get().getElements()) { if (element instanceof Feature) { Feature mFeatureGrafic = (Feature) element; Map<String, Object> mQuerryString = mFeatureGrafic.getAttributes(); for(String key : mQuerryString.keySet()){ Log.i("==============="+key,String.valueOf(mQuerryString.get(key))); } } } }catch (Exception e){ e.printStackTrace(); } } }); return true; } });
效果图依然如上所示。
最后
以上就是舒服月亮为你收集整理的ArcGIS for Android Runtime100 基本操作(三)——离线数据空间查询的全部内容,希望文章能够帮你解决ArcGIS for Android Runtime100 基本操作(三)——离线数据空间查询所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复