• arcgis for android 学习 (8) 空间查询 点击某点,选中该点所在单位区域。


         

    如上图,点击某块,然后高亮显示选中的这块区域(本例中是红色的那个块)。

    ---------------------------

    编码过程:

    1.注册 mapView的单击事件

      mMapView.setOnSingleTapListener(mOnSingleTapListener);

    2.实现单击的时间的监听器

      OnSingleTapListener mOnSingleTapListener = new OnSingleTapListener() {
    
        @Override
        public void onSingleTap(float x, float y) {
          new AsyncQueryTask().execute(x, y);
        }
      };

      我们具体在一个AsyncQueryTask里异步执行查询和显示。

         在上面的onSingleTap方法里有有两个参数 (float x, float y) ,这个是一个坐标点,表示里你点击的位置,是个屏幕坐标,在查询时,我们需要将其转成 地图坐标点,使用方法

      mMapView.toMapPoint(x,y)
    class AsyncQueryTask extends AsyncTask<Float, Void, FeatureSet> {
            String errMsg = null;
    
            @Override
            protected FeatureSet doInBackground(Float... params) {
                float x = params[0];
                float y = params[1];
                if (mMapView.isLoaded()) {
                    // AlertMsg("单击,屏幕像素坐标点:  x=%s,y=%s", x, y);
                    // Point mapPoint = mMapView.toMapPoint(new Point(x, y));
    
                    Point pt = mMapView.toMapPoint(x, y);
                    Query query = new Query();
                    query.setGeometry(pt);
                    query.setReturnGeometry(true);
                    //query.setOutFields(new String[] {"*"});
                    query.setOutFields(new String[] { "县名称_1", "乡名称_1", "村名称_1",
                            "地块名称", "统一编号" });
                    QueryTask queryTask = new QueryTask(mMapServiceUrl + "/4");//这里参数是地图的服务地址,后面的4,标识了是其中某一个图层。
                    try {
                        FeatureSet fs = queryTask.execute(query);
                        return fs;
                    } catch (Exception e) {
                        e.printStackTrace();
                        errMsg = e.getMessage();
                    }
                }
                return null;
            }

      我们构建一个 query 和 queryTask 进行查询,

      查询条件: query.setGeometry(pt);

      返回的字段内容:query.setOutFields(new String[] { "县名称_1", "乡名称_1", "村名称_1", "地块名称", "统一编号" });

      返回的结果是 FeatureSet 就是想要获得区域。

    3.从返回的结果中拿到 grphics 并绘制在一个 自定义的图层上 ,并指定绘制方式。

            @Override
            protected void onPostExecute(FeatureSet fs) {
                if (fs == null) {
                    if (errMsg != null) {
                        Toast.makeText(CT_Area_ViewActivity.this, errMsg, 0).show();
                    }
                    Toast.makeText(CT_Area_ViewActivity.this, "查询的结果为空", 0).show();
                    return;
                }
                try {
                    Toast.makeText(CT_Area_ViewActivity.this,
                            "查询到" + fs.getGraphics().length + "个结果", 0).show();
                    SimpleFillSymbol symbol = new SimpleFillSymbol(Color.RED);
                    CT_Area_ViewActivity.this.gLayer
                            .setRenderer(new SimpleRenderer(symbol));
                    CT_Area_ViewActivity.this.gLayer.removeAll();
                    CT_Area_ViewActivity.this.gLayer.addGraphics(fs.getGraphics());
    
                    if (fs.getGraphics().length > 0) {
                        Graphic graphic = fs.getGraphics()[0];
    
                        // String[] names = graphic.getAttributeNames();
    
                        String xian = getValue(graphic, "县名称_1", "");
                        String xiang = getValue(graphic, "乡名称_1", "");
                        String cun = getValue(graphic, "村名称_1", "");
                        String dikuai = getValue(graphic, "地块名称", "");
                        String id = getValue(graphic, "统一编号", "");
    
                        ShowDialog_Detail(xian + xiang + cun + "\n" + dikuai, id);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(CT_Area_ViewActivity.this, e.getMessage(), 0)
                            .show();
                }
            }
    
            String getValue(Graphic graphic, String key, String defaultVal) {
                Object obj = graphic.getAttributeValue(key);
                if (obj == null)
                    return defaultVal;
                else
                    return obj.toString();
            }
        }

    别忘了声明一些 类变量:

        com.esri.android.map.MapView mMapView;
        ArcGISDynamicMapServiceLayer agmServiceLayer;
        GraphicsLayer gLayer;
  • 相关阅读:
    ftl总结
    关于button的自动刷新
    判断json格式中是否含有key
    main方法的参数
    开发笔记--java.lang.OutOfMemoryError: PermGen space异常处理
    C/C++混合编程
    MFC 模块状态的实现
    类的私有private构造函数 ,为什么要这样做
    MFC DLL 导出函数的定义方式
    关于 AfxGetStaticModuleState ()
  • 原文地址:https://www.cnblogs.com/vir56k/p/2931627.html
Copyright © 2020-2023  润新知