ArcGIS Runtime SDK for Android 入门(14):Feature要素的属性查询

        本文主要讲解如何通过ArcGIS Runtime SDK for Android进行要素图层FeatureLayer的查询。

实现步骤:

1.创建Android项目   

2.添加Runtime SDK依赖   

3.添加权限及OpenGL ES支持

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

4.设置界面布局

(1)主布局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>

(2)菜单menu布局代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/action_search"
        android:title="@string/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom" />

</menu>

5.编写代码:

思路:

        (1)创建一个ServiceFeatureTable对象,并添加到地图。

        (2)创建QueryParameters对象,并设置查询参数。

        (3)ServiceFeatureTable执行查询操作  mServiceFeatureTable.queryFeaturesAsync(queryparameter)。

        (4)处理查询结果信息   listenableFuture.addDoneListener()。

步骤:

(1)变量准备:

  //MapView控件变量
  MapView mMapView;
  //ServiceFeatureTable变量,用于创建FeatureLayer要素图层
  ServiceFeatureTable mServiceFeatureTable;
  //FeatureLayer要素图层变量
  FeatureLayer mFeaturelayer;

(2)onCreate方法中:

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

    // 以地形图为底图创建地图对象
    final ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
    // 设置地图在MapView中被显示
    mMapView.setMap(map);

    // 创建ServiceFeatureTable
    mServiceFeatureTable = new ServiceFeatureTable("https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/2");
    // 使用ServiceFeatureTable创建feature layer
    mFeaturelayer = new FeatureLayer(mServiceFeatureTable);
    mFeaturelayer.setOpacity(0.8f);
    //重写renderer渲染器
    SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 1);
    SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, lineSymbol);
    mFeaturelayer.setRenderer(new SimpleRenderer(fillSymbol));

    // 将图层添加到地图中
    map.getOperationalLayers().add(mFeaturelayer);

    // 设置一个视点
    mMapView.setViewpointCenterAsync(new Point(-11000000, 5000000, SpatialReferences.getWebMercator()), 100000000);

(3)方法支持:

  //处理搜索小部件的Intent事件
  @Override
  protected void onNewIntent(Intent intent) {
    setIntent(intent);
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String searchString = intent.getStringExtra(SearchManager.QUERY);
      //执行查询
      searchForState(searchString);
    }
  }

  public void searchForState(final String searchString) {
    // 清空所有以前的查询结果
    mFeaturelayer.clearSelection();
    // 创建一个能够根据搜索条件进行查询的对象
    QueryParameters query = new QueryParameters();
    // 设置查询不区分大小写
    query.setWhereClause("upper(STATE_NAME) LIKE '%" + searchString.toUpperCase() + "%'");

    // 调用进行要素查询
    final ListenableFuture<FeatureQueryResult> future = mServiceFeatureTable.queryFeaturesAsync(query);
    // 当查询结果返回时,使用addDoneListener触发
    future.addDoneListener(new Runnable() {
      @Override
      public void run() {
        try {
          // 调用future的get方法获取结果
          FeatureQueryResult result = future.get();

          // 检查是否查询出了结果
          if (result.iterator().hasNext()) {

            // 获取查询结果的第一个要素的地图范围,并设置地图缩放至该范围
            Feature feature = result.iterator().next();         
            //获取结果feature的几何形状变量
            Geometry geoResult=feature.getGeometry();
            //获取结果feature的几何外接矩形
            Envelope envelope = geoResult.getExtent();
            //创建用于显示查询结果的Symbol符号
            SimpleFillSymbol FillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.RED, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 2));
            //创建用于显示查询结果的Graphic图形
            Graphic  graphicResult=new Graphic(geoResult,FillSymbol);
            //创建用于显示查询结果的GraphicOverlay,并将Graphic加入其中
            GraphicsOverlay graphicsOverlay=new GraphicsOverlay();
            graphicsOverlay.getGraphics().add(graphicResult);
            //显示查询结果
            mMapView.getGraphicsOverlays().clear();
            mMapView.getGraphicsOverlays().add(graphicsOverlay);
            mMapView.setViewpointGeometryAsync(envelope, 10);           
            //查询要素
            mFeaturelayer.selectFeature(feature);

          } else {
            Toast.makeText(MainActivity.this, "No states found with name: " + searchString, Toast.LENGTH_SHORT).show();
          }
        } catch (Exception e) {
          Toast.makeText(MainActivity.this, "Feature search failed for: " + searchString + ". Error=" + e.getMessage(),
              Toast.LENGTH_SHORT).show();
          Log.e(getResources().getString(R.string.app_name),
              "Feature search failed for: " + searchString + ". Error=" + e.getMessage());
        }
      }
    });
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    //获取menu,如果它是当前项,这将把它添加到action bar中
    getMenuInflater().inflate(R.menu.menu_main, menu);

    // 获取SearchView然后设置对它进行可搜索配置
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    // 假设当前的activity是可被搜索的
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // 不要将小部件图标化,通过默认模式它进行缩放  Do not iconify the widget; expand it by default
    return true;
  }

6.运行APP:在搜索菜单中输入搜索内容,既可以进行要素查询。

感谢luq老师的指导

猜你喜欢

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