ArcGIS for Android 100.3.0(12):查询

可进行查询的方法:

MapView( GeoView ) - identifyLayerAsync方法:查询指定图层

MapView( GeoView ) - identifyLayersAsync方法:查询显示的所有图层

GeodatabaseFeatureTable( FeatureTable ) - queryFeaturesAsync方法

ServiceFeatureTable ( FeatureTable ) - queryFeaturesAsync方法

FeatureLayer - selectFeaturesAsync方法

这里写图片描述

MapView(GeoView)提供了对Graphics Overlays、FeatureLayer和ArcGISMapImageLayer进行空间查询的方法。

1.异步查询指定图层中的GeoElements:

identifyLayerAsync (Layer layer,Point screenPoint,double tolerance,boolean returnPopupsOnly,int maximumResults)
 参数1:要查询的图层
 参数1:屏幕指向识别
 参数1:以screenPoint为中心的圆的密度无关像素(dp)中的半径,用于识别GeoElements。值0将仅识别screenPoint处物理像素处的GeoElements。允许的最大值为100dp
 参数1:如果包含弹出窗口,但识别结果中没有地理元素,则为true; false表示包含地理元素和弹出窗口
 参数1:要返回的地理元素和/或弹出窗口的最大数量; 必须大于零,但-1可用于表示无限结果

案例:

 private MapView mMapView;

    private String world_cities = " https://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer";

    private String damage_assessment = " https://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/FeatureServer/0";

    private ArcGISMapImageLayer mMapImageLayer;
    private FeatureLayer mFeatureLayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_identify_layers_async);

        mMapView = (MapView) findViewById(R.id.mapview);

        ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
        mMapImageLayer = new ArcGISMapImageLayer(world_cities);
        mMapImageLayer.addDoneLoadingListener(new Runnable() {
            @Override
            public void run() {
                // hide Continent and World layers
                mMapImageLayer.getSubLayerContents().get(1).setVisible(false);
                mMapImageLayer.getSubLayerContents().get(2).setVisible(false);
            }
        });
        map.getOperationalLayers().add(mMapImageLayer);

        FeatureTable featureTable = new ServiceFeatureTable(damage_assessment);
        mFeatureLayer = new FeatureLayer(featureTable);
        map.getOperationalLayers().add(mFeatureLayer);

        map.setInitialViewpoint(new Viewpoint(new Point(-10977012.785807, 4514257.550369, SpatialReference.create(3857)), 68015210));
        mMapView.setMap(map);

        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()));

                //查询mFeatureLayer图层中点击范围内的所有地理要素
                final ListenableFuture<IdentifyLayerResult> identifyLayerResultListenableFuture = mMapView.identifyLayerAsync(
                        mFeatureLayer, screenPoint, 12, false, 10);
                identifyLayerResultListenableFuture.addDoneListener(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            IdentifyLayerResult identifyLayerResult = identifyLayerResultListenableFuture.get();
                            String name = identifyLayerResult.getLayerContent().getName();
                            Log.e("xyh", "run: " + name);
                            List<GeoElement> elements = identifyLayerResult.getElements();
                            for (GeoElement element : elements) {
                                Map<String, Object> attributes = element.getAttributes();
                                Geometry geometry = element.getGeometry();
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });

                return true;
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMapView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMapView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.dispose();
    }
}

2.异步查询指定图层中最顶层的可见GeoElement

identifyLayerAsync (Layer layer,Point screenPoint,double tolerance,boolean returnPopupsOnly)

使用方法和上个案例一样。

3.异步查询地图中所有显示图层上的GeoElements

identifyLayersAsync (Point screenPoint,double tolerance,boolean returnPopupsOnly,int maximumResults)

        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()));

                //查询地图中所有显示图层在点击范围内的所有地理要素。
                final ListenableFuture<List<IdentifyLayerResult>> listListenableFuture = mMapView.identifyLayersAsync(
                        screenPoint, 12, false, 10);
                listListenableFuture.addDoneListener(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //IdentifyLayerResult:每个图层的返回结果
                            List<IdentifyLayerResult> identifyLayerResults = listListenableFuture.get();
                            for (IdentifyLayerResult identifyLayerResult : identifyLayerResults) {

                                String name = identifyLayerResult.getLayerContent().getName();

                                List<GeoElement> elements = identifyLayerResult.getElements();
                                for (GeoElement element : elements) {
                                    Map<String, Object> attributes = element.getAttributes();
                                    for (String key : attributes.keySet()) {
                                        Log.e("xyh" + key, String.valueOf(attributes.get(key)));
                                    }
                                    Geometry geometry = element.getGeometry();
                                }
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                            Log.e("xyh", "Error identifying results: " + e.getMessage());
                        }
                    }
                });
                return true;
            }
        });

4.异步识别地图中所有显示图层中最顶部的可见GeoElement

identifyLayersAsync (Point screenPoint,double tolerance,boolean returnPopupsOnly)

使用方法和上个案例一样。

查询Graphic

1.identifyGraphicsOverlaysAsync(Point screenPoint,double tolerance,boolean returnPopupsOnly,int maximumResults)
在此视图中的所有图形叠加层中,在给定屏幕点异步识别可见图形。

2.identifyGraphicsOverlaysAsync(Point screenPoint,double tolerance,boolean returnPopupsOnly)
在给定的屏幕点,异步识别此视图中每个图形叠加层中最顶部的可见图形。

3.identifyGraphicsOverlayAsync( GraphicsOverlay graphicsOverlay,Point screenPoint,double tolerance,boolean returnPopupsOnly,int maximumResults)
在给定的屏幕点,异步识别给定图形叠加层中的可见图形。

4.identifyGraphicsOverlayAsync( GraphicsOverlay graphicsOverlay,Point screenPoint,double tolerance,boolean returnPopupsOnly)
在给定的屏幕点,异步识别给定图形叠加层中最顶部的可见图形。

这几个方法用法都一样,看官方案例就行了

public class IdentifyGraphicsActivity extends AppCompatActivity {

    private MapView mMapView;

    private GraphicsOverlay grOverlay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_identify_graphics);

        mMapView = (MapView) findViewById(R.id.mapView);
        ArcGISMap mMap = new ArcGISMap(Basemap.Type.TOPOGRAPHIC, 3.184710, -4.734690, 2);
        mMapView.setMap(mMap);

        // set up gesture for interacting with the MapView
        MapViewTouchListener mMapViewTouchListener = new MapViewTouchListener(this, mMapView);
        mMapView.setOnTouchListener(mMapViewTouchListener);

        addGraphicsOverlay();
    }


    private void addGraphicsOverlay() {
        // create the polygon
        PolygonBuilder polygonGeometry = new PolygonBuilder(SpatialReferences.getWebMercator());
        polygonGeometry.addPoint(-20e5, 20e5);
        polygonGeometry.addPoint(20e5, 20.e5);
        polygonGeometry.addPoint(20e5, -20e5);
        polygonGeometry.addPoint(-20e5, -20e5);

        // create solid line symbol
        SimpleFillSymbol polygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, null);
        // create graphic from polygon geometry and symbol
        Graphic graphic = new Graphic(polygonGeometry.toGeometry(), polygonSymbol);

        // create graphics overlay
        grOverlay = new GraphicsOverlay();
        // create list of graphics
        ListenableList<Graphic> graphics = grOverlay.getGraphics();
        // add graphic to graphics overlay
        graphics.add(graphic);
        // add graphics overlay to the MapView
        mMapView.getGraphicsOverlays().add(grOverlay);
    }

    /**
     * Override default gestures of the MapView
     */
    class MapViewTouchListener extends DefaultMapViewOnTouchListener {

        /**
         * Constructs a DefaultMapViewOnTouchListener with the specified Context and MapView.
         *
         * @param context the context from which this is being created
         * @param mapView the MapView with which to interact
         */
        public MapViewTouchListener(Context context, MapView mapView) {
            super(context, mapView);
        }

        /**
         * Override the onSingleTapConfirmed gesture to handle tapping on the MapView
         * and detected if the Graphic was selected.
         *
         * @param e the motion event
         * @return true if the listener has consumed the event; false otherwise
         */
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            // get the screen point where user tapped
            android.graphics.Point screenPoint = new android.graphics.Point((int) e.getX(), (int) e.getY());

            // identify graphics on the graphics overlay
            final ListenableFuture<IdentifyGraphicsOverlayResult> identifyGraphic = mMapView.identifyGraphicsOverlayAsync(
                    grOverlay, screenPoint, 10.0, false, 2);

            identifyGraphic.addDoneListener(new Runnable() {
                @Override
                public void run() {
                    try {
                        IdentifyGraphicsOverlayResult grOverlayResult = identifyGraphic.get();
                        // get the list of graphics returned by identify graphic overlay
                        List<Graphic> graphic = grOverlayResult.getGraphics();
                        // get size of list in results
                        int identifyResultSize = graphic.size();
                        for (Graphic gra : graphic) {
                            Map<String, Object> attributes = gra.getAttributes();
                            Geometry geometry = gra.getGeometry();
                        }
                        if (!graphic.isEmpty()) {
                            // show a toast message if graphic was returned
                            Toast.makeText(getApplicationContext(), "Tapped on " + identifyResultSize + " Graphic", Toast.LENGTH_SHORT).show();
                        }
                    } catch (InterruptedException | ExecutionException ie) {
                        ie.printStackTrace();
                    }

                }
            });

            return super.onSingleTapConfirmed(e);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMapView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMapView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.dispose();
    }
}

ServiceFeatureTable

public ListenableFuture<FeatureQueryResult> queryFeaturesAsync(QueryParameters query) {

空间查询参数:

 QueryParameters query = new QueryParameters();

QueryParameters(com.esri.arcgisruntime.data.QueryParameters)是queryFeaturesAsync、selectFeaturesAsync的查询参数。

setGeometry:进行空间范围查询的Geometry对象
setMaxFeatures:最大返回值
setOutSpatialReference:查询返回结果的空间参考
setReturnGeometry:是否在查询结果中包含结合对象
setSpatialRelationship:进行空间查询的空间关系设置
setWhereClause:查询语句

 private MapView mMapView;

    private String sample_service_url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/2";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_query_features_async);

        mMapView = (MapView) findViewById(R.id.mapview);

        ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
        mMapView.setMap(map);


        final ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(sample_service_url);
        final FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable);

        SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 1);
        SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, lineSymbol);
        featureLayer.setRenderer(new SimpleRenderer(fillSymbol));
        featureLayer.setSelectionColor(Color.RED);
        featureLayer.setSelectionWidth(5);

        map.getOperationalLayers().add(featureLayer);

        mMapView.setViewpointCenterAsync(new Point(-11000000, 5000000, SpatialReferences.getWebMercator()), 100000000);

        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point mapPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                featureLayer.clearSelection();

                QueryParameters query = new QueryParameters();
                query.setGeometry(mapPoint);
                final ListenableFuture<FeatureQueryResult> featureQueryResult = serviceFeatureTable.queryFeaturesAsync(query);
                featureQueryResult.addDoneListener(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            FeatureQueryResult result = featureQueryResult.get();
                            Iterator<Feature> iterator = result.iterator();
                            while (iterator.hasNext()) {
                                Feature feature = iterator.next();
                                featureLayer.selectFeature(feature);
                                Map<String, Object> attributes = feature.getAttributes();
                                Geometry geometry = feature.getGeometry();
                                 Envelope envelope = geometry.getExtent();
                                mMapView.setViewpointGeometryAsync(envelope);
                            }
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        } catch (ExecutionException e1) {
                            e1.printStackTrace();
                        }
                    }
                });

                return super.onSingleTapConfirmed(e);
            }
        });

    }

    @Override
    protected void onPause() {
        super.onPause();
        // pause MapView
        mMapView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // resume MapView
        mMapView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // dispose MapView
        mMapView.dispose();
    }
}

空间查询 - FeatureLayer

public ListenableFuture<FeatureQueryResult> selectFeaturesAsync(QueryParameters query, FeatureLayer.SelectionMode selectionMode) {

FeatureLayer的selectFeaturesAsync方法从本质上讲数据要素选择,但从实现结果上来说相当于空间查询。同时,查询的结果会被高亮显示。高亮显示可以通过FeatureLayer设置颜色和宽度(厚度):

setSelectionColor:设置选中要素的颜色
setSelectionWidth:设置选中要素的边缘宽度(厚度)
 private MapView mMapView;

    private String sample_service_url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/2";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_features_async);
        mMapView = (MapView) findViewById(R.id.mapview);

        ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
        mMapView.setMap(map);


        final ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(sample_service_url);
        final FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable);

        SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 1);
        SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, lineSymbol);
        featureLayer.setRenderer(new SimpleRenderer(fillSymbol));
        featureLayer.setSelectionColor(Color.RED);
        featureLayer.setSelectionWidth(5);

        map.getOperationalLayers().add(featureLayer);

        mMapView.setViewpointCenterAsync(new Point(-11000000, 5000000, SpatialReferences.getWebMercator()), 100000000);

        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                featureLayer.clearSelection();

                int tolerance = 1;
                double mapTolerance = tolerance * mMapView.getUnitsPerDensityIndependentPixel();
                SpatialReference spatialReference = mMapView.getSpatialReference();
                Envelope envelope = new Envelope(clickPoint.getX() - mapTolerance, clickPoint.getY() - mapTolerance,
                        clickPoint.getX() + mapTolerance, clickPoint.getY() + mapTolerance, spatialReference);
                QueryParameters query = new QueryParameters();
                query.setGeometry(envelope);
                query.setSpatialRelationship(QueryParameters.SpatialRelationship.WITHIN);
                final ListenableFuture<FeatureQueryResult> featureQueryResult = featureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.NEW);
                featureQueryResult.addDoneListener(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            FeatureQueryResult result = featureQueryResult.get();

                            Iterator<Feature> iterator = result.iterator();
                            while (iterator.hasNext()) {
                                Feature feature = iterator.next();
                                featureLayer.selectFeature(feature);
                                Map<String, Object> attributes = feature.getAttributes();
                                Geometry geometry = feature.getGeometry();
                                Envelope envelope = geometry.getExtent();
                                mMapView.setViewpointGeometryAsync(envelope);
                            }
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        } catch (ExecutionException e1) {
                            e1.printStackTrace();
                        }
                    }
                });

                return super.onSingleTapConfirmed(e);
            }
        });

    }

    @Override
    protected void onPause() {
        super.onPause();
        // pause MapView
        mMapView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // resume MapView
        mMapView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // dispose MapView
        mMapView.dispose();
    }

猜你喜欢

转载自blog.csdn.net/qq_36699930/article/details/82494132