ArcGIS Runtime SDK for Android 入门(15):对地图中的图形进行identify交互几何查询

        本文主要讲解如何通过触摸点击的方式,对MapView中显示的Graphics图形进行identify交互几何查询,并返回相关消息。

实现步骤:

1.创建Android项目   

2.添加Runtime SDK依赖   

3.添加权限及OpenGL ES支持

前三步本文省略,初学者可参照ArcGIS Runtime SDK for Android 入门(1):第一个地图应用程序(二维)

4.设置界面布局

布局XML代码:

    <!-- MapView控件 -->
    <com.esri.arcgisruntime.mapping.view.MapView
            android:id="@+id/mapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    </com.esri.arcgisruntime.mapping.view.MapView>

5.编写代码:

思路:要实现对MapView中触控的图形进行识别,首先要从MapView中的触控事件下手,覆写并扩展其中的事件,实现Graphics图形的识别。

步骤:在Activity中

(1)变量准备:

    //MapView控件变量
    private MapView mMapView;
    //用于在MapView中储存图形的GraphicsOverlay变量
    private GraphicsOverlay grOverlay;

(2)onCreate方法:

        // 通过layout获取MapView控件
        mMapView = (MapView) findViewById(R.id.mapView);

        // 创建一个以地形图为底图的地图对象
        ArcGISMap mMap = new ArcGISMap(Basemap.Type.TOPOGRAPHIC, 3.184710, -4.734690, 2);
        // 设置地图在MapView中被显示
        mMapView.setMap(mMap);

        // 设置与MapView进行交互的手势,这里是自定义的mMapViewTouchListener
        MapViewTouchListener mMapViewTouchListener = new MapViewTouchListener(this, mMapView);
        mMapView.setOnTouchListener(mMapViewTouchListener);

        //在地图上添加一个图形
        addGraphicsOverlay();

(3)添加Graphic图形方法:

private void addGraphicsOverlay() {
        // 创建多边形几何形状
        PolygonBuilder polygonGeometry = new PolygonBuilder(SpatialReferences.getWebMercator());
        polygonGeometry.addPoint(-20e5, 20e5);
        polygonGeometry.addPoint(20e5, 20.e5);
        polygonGeometry.addPoint(20e5, -20e5);
        polygonGeometry.addPoint(-20e5, -20e5);

        // 创建solid line symbol(实心线符号)
        SimpleFillSymbol polygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, null);
        // 通过几何形状对象(Geometry)和符号对象(Symbol)创建一个图形(Graphic)对象
        Graphic graphic = new Graphic(polygonGeometry.toGeometry(), polygonSymbol);

        // 创建GraphicsOverlay
        grOverlay = new GraphicsOverlay();
        // 创建Graphic图形列表
        ListenableList<Graphic> graphics = grOverlay.getGraphics();
        // 将Graphic添加至GraphicsOverlay
        graphics.add(graphic);
        // 将GraphicsOverlay添加到MapView中
        mMapView.getGraphicsOverlays().add(grOverlay);

(4)MapView的自定义手势监听:

    //覆写MapView的默认手势
    class MapViewTouchListener extends DefaultMapViewOnTouchListener {
        //通过指定的Context和MapView对象对DefaultMapViewOnTouchListener进行构造
        public MapViewTouchListener(Context context, MapView mapView){
            super(context, mapView);
        }

        //覆写onSingleTapConfirmed的手势方法去处理用户对MapView的触摸点击,并且当图形被选中时,还要对其进行监测
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            // 获取用户点击的屏幕点
            android.graphics.Point screenPoint = new android.graphics.Point((int)e.getX(), (int)e.getY());
            // 识别GraphicsOverlay中的Graphic
            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();
                        // 获取识别的GraphicOverlay返回的图形列表
                        List<Graphic> graphic = grOverlayResult.getGraphics();
                        // 获取结果列表的大小
                        int identifyResultSize = graphic.size();
                        if(!graphic.isEmpty()){
                            // 当识别的图形成功返回时,返回一个Toast信息提示
                            Toast.makeText(getApplicationContext(), "Tapped on " + identifyResultSize + " Graphic", Toast.LENGTH_SHORT).show();
                        }
                    }catch(InterruptedException | ExecutionException ie){
                        ie.printStackTrace();
                    }

                }
            });

            return super.onSingleTapConfirmed(e);
        }

    }

6.运行APP:当对图形进行点击,APP会返回提示。

感谢luq老师的指导

猜你喜欢

转载自blog.csdn.net/smart3s/article/details/81115714