ArcGIS for Android Runtime100 基本操作(三)——离线数据空间查询

      空间查询是地理信息中的一个概念,指的是通过空间数据进行空间数据库的查询操作。

      在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;
    }
});

      效果图依然如上所示。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值