ArcGIS Runtime SDK For Android 10.2.x版本空间查询和属性查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wjk343977868/article/details/72895925

引言

arcgis查询包括空间查询和属性查询,其中空间查询包括点击查询、多边形查询等。

一、空间查询

1、点击查询

通过重写MapView的OnSingleTapListener事件,对地图点击事件进行处理。主要有三种实现方式:(1)根据点击的x、y坐标,直接调用FeatureLayer的getFeatureIDs(float x, float y, int tolerance)方法查询得到要素的objectid;(2)编写QueryParameters查询参数,设置其查询geometry为当前点,调用FeatureLayer的selectFeatures方法或者FeatureTable的queryFeatures方法进行查询;(3)结合Query和QueryTask进行查询,但该方式只适合地图服务的查询。具体代码如下:

mMapView.setOnSingleTapListener(new OnSingleTapListener() {
    @Override
    public void onSingleTap(float x, float y) {
        if (!mMapView.isLoaded())
            return;

        Point identifyPoint = mMapView.toMapPoint(x, y);

        try {
            highLightLayer.removeAll();

            Layer[] mapLayers = mMapView.getLayers();
            for (int i = mapLayers.length; i > 0; --i) {
                Layer item = mapLayers[i - 1];
                if (item instanceof FeatureLayer) {
                    FeatureLayer featureLayer = ((FeatureLayer) item);
                    //方式一
                    /*long[] objectIDs = featureLayer.getFeatureIDs(x, y, 10);

                    if (objectIDs != null && objectIDs.length > 0) {
                        Feature feature = featureLayer.getFeature(objectIDs[0]);//取第一个选中的要素
                        renderFeature(mMapView, feature, highLightLayer);
                        //initMapViewCallout(feature, identifyPoint);
                        break;
                    }*/

                    //方式二
                    QueryParameters queryParameters = new QueryParameters();
                    queryParameters.setGeometry(identifyPoint);
                    queryParameters.setReturnGeometry(true);
                    //queryParameters.setWhere("1=1");
                    //queryParameters.setSpatialRelationship(SpatialRelationship.INTERSECTS);
                    //SpatialReference sr = SpatialReference.create(102100);
                    //queryParameters.setInSpatialReference(featureLayer.getSpatialReference());
                    //queryParameters.setOutSpatialReference(sr);
                    //queryParameters.setOutFields(new String[]{"*"});
                    featureLayer.selectFeatures(queryParameters, FeatureLayer.SelectionMode.NEW, new CallbackListener<FeatureResult>() {
                        @Override
                        public void onCallback(FeatureResult result) {
                            if (result != null) {
                                Iterator<Object> it = result.iterator();
                                while (it.hasNext()) {
                                    Feature feature = (Feature) it.next();
                                    try {
                                        //featureLocated(feature);
                                        renderFeature(mMapView, feature, highLightLayer);
                                        break;
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }

                        @Override
                        public void onError(Throwable throwable) {

                        }
                    });
                    /*featureLayer.getFeatureTable().queryFeatures(queryParameters, new CallbackListener<FeatureResult>() {
                        @Override
                        public void onError(Throwable e) {
                            Log.e("Test", "Unable to perform query", e);
                        }

                        @Override
                        public void onCallback(FeatureResult result) {
                            if (result != null) {
                                Iterator<Object> it = result.iterator();
                                while (it.hasNext()) {
                                    Feature feature = (Feature) it.next();
                                    try {
                                        //featureLocated(feature);
                                        renderFeature(mMapView, feature, highLightLayer);
                                        break;
                                    } catch (Exception e) {ArcGIS Android API 应用开发之图形绘制与长度面积量算
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                    });*/
                }
            }
        } catch (Exception ex) {
            Log.i("test", ex.getMessage());
        }
    }
});

2、多边形查询

首先需要绘制一个多边形,绘制多边形的代码可以参考ArcGIS Android API应用开发之图形绘制与长度面积量算。通过绘制得到geometry之后,即可用点击查询中的方法2进行查询。

二、属性查询

类似点击查询的方式二,只不过需要手动设置where条件,例如:name = '项目1'等。一般查询到要素之后,需要将该要素定位到地图视图的中部,此时可以调用featurelocated方法,见三。

三、上文用到的函数

/**
* 在这里我们进行要素的高亮显示,也就是要素渲染工作    *
*
* @param feature 要渲染的要素
* @return 返回要素的中心点位置
*/
private Point renderFeature(MapView mMapView, Feature feature, GraphicsLayer highLightLayer) {
    highLightLayer.removeAll();
    Geometry geometry = feature.getGeometry();
    String typeName = geometry.getType().name();
    Envelope env = new Envelope();
    geometry.queryEnvelope(env);

    Graphic highlightGraphic = null;
    int color = Color.rgb(19, 255, 234);
    if (typeName.equalsIgnoreCase("point")) {
        SimpleMarkerSymbol sms = new SimpleMarkerSymbol(color, 20, SimpleMarkerSymbol.STYLE.CIRCLE);
        highlightGraphic = new Graphic(geometry, sms);
    } else if (typeName.equalsIgnoreCase("polyline")) {
        SimpleLineSymbol sls = new SimpleLineSymbol(color, 5);
        highlightGraphic = new Graphic(geometry, sls);
    } else if (typeName.equalsIgnoreCase("polygon")) {
        SimpleFillSymbol sfs = new SimpleFillSymbol(color);
        sfs.setAlpha(0);
        sfs.setOutline(new SimpleLineSymbol(color, 5));
        highlightGraphic = new Graphic(geometry, sfs);
    }

    highLightLayer.setMaxScale(mMapView.getMaxScale());
    highLightLayer.setMinScale(mMapView.getMinScale());
    highLightLayer.addGraphic(highlightGraphic);
    //mMapView.centerAt(env.getCenter(), true);
    return env.getCenter();
}
 
 
/**
* 根据项目对象定位项目要素
*/
private void featureLocated(Feature feature) {
    //点击列表中项目行,定位到地图中的项目数据,并高亮显示
    if (feature != null) {
        highLightLayer.removeAll();
        Point mapPoint = renderFeature(mMapView, feature, highLightLayer);
        Point pt = mMapView.toScreenPoint(mapPoint);//渲染图层,并取得渲染点屏幕位置
        pt.setY(pt.getY() - 100);
        mMapView.centerAt(mMapView.toMapPoint(pt), true);
        initMapViewCallout(feature, mapPoint);
    }
}

参考资料:http://blog.csdn.net/vaecer/article/details/8814071

猜你喜欢

转载自blog.csdn.net/wjk343977868/article/details/72895925