ArcGIS Runtime SDK for Android 入门(21):显示本地地图数据---Geodatabase文件

      本文主要讲解如何借助ArcGIS Runtime SDK for Android显示本地Geodatabase文件。

实现步骤:

1.创建Android项目   

2.添加Runtime SDK依赖   

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

3.添加权限及OpenGL ES支持

在AndroidManifest.xml中添加:

    <!--联网权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--写入外部存储权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!---OpenGL ES支持-->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

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.编写代码

思路:

(1)请求文件读写权限(Android 6.0及以上版本)。

(2)获取Geodatabase文件路径。

(3)通过路径创建Geodatabase对象,并对其进行异步加载。

(4)获取Geodatabase对象中的所有GeodatabaseFeatureTable对象。

(5)对所有GeodatabaseFeatureTable对象进行循环获取并对其进行异步加载。

(6)通过GeodatabaseFeatureTable对象创建FeatureLayer对象。

(7)将FeatureLayer对象添加到MapView中的操作图层中以便显示。

准备:在Android设备的内置SD卡中创建ArcGIS文件夹,放入test.geodatabase文件。

步骤:

(1)变量准备:

  //log.e的标志变量
  private static final String TAG = MainActivity.class.getSimpleName();
  // 存储读写权限
  private final String[] reqPermission = new String[] { Manifest.permission.READ_EXTERNAL_STORAGE };
  // MapView控件变量
  private MapView mMapView;

(2)onCreate方法:

    // 创建一个地图并将它添加到MapView中显示
    ArcGISMap map = new ArcGISMap(Basemap.createStreets());
    mMapView = findViewById(R.id.mapView);
    mMapView.setMap(map);
    // 请求读写权限并加载数据
    requestReadPermission();

(3)方法支持:

  //请求设备读写权限并加载数据
  private void requestReadPermission() {
    // 定义请求权限
    String[] reqPermission = new String[] { Manifest.permission.READ_EXTERNAL_STORAGE };
    int requestCode = 2;
    // 在API23版本以上中,权限需要在运行时进行请求
    if (ContextCompat.checkSelfPermission(MainActivity.this,
            reqPermission[0]) == PackageManager.PERMISSION_GRANTED) {
      //加载数据
      loadGeodatabase();
    } else {
      // 请求权限
      ActivityCompat.requestPermissions(MainActivity.this, reqPermission, requestCode);
    }
  }

  // 处理权限请求响应,用户选择完权限后响应
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      // 加载数据
      loadGeodatabase();
    } else {
      // 报告给用户权限请求被拒绝
      Toast.makeText(MainActivity.this, "读写权限被拒绝", Toast.LENGTH_SHORT).show();
    }
  }

  // 读取geodatabase
  private void loadGeodatabase() {
    // 本地geodatabase文件路径
    String path = getSDCardPath() + "/ArcGIS/test.geodatabase";
    // 创建geodatabase
    final Geodatabase geodatabase = new Geodatabase(path);
    // 异步加载geodatabase
    geodatabase.loadAsync();
    // 当geodatabase读取成功后将geodatabase加载到数据库
    geodatabase.addDoneLoadingListener(() -> {
      if (geodatabase.getLoadStatus() == LoadStatus.LOADED) {

        List<GeodatabaseFeatureTable> geodatabaseFeatureTables = geodatabase.getGeodatabaseFeatureTables();
        for (int i=0;i<geodatabaseFeatureTables.size();i++){
          GeodatabaseFeatureTable geodatabaseFeatureTable = geodatabaseFeatureTables.get(i);
          geodatabaseFeatureTable.loadAsync();
          //创建要素图层
          final FeatureLayer featureLayer = new FeatureLayer(geodatabaseFeatureTable);
          featureLayer.addDoneLoadingListener(() -> {
            if (featureLayer.getLoadStatus() == LoadStatus.LOADED) {
              // 设置MapView的视点为FeatureLayer的分布范围
              mMapView.setViewpointAsync(new Viewpoint(featureLayer.getFullExtent()));
            } else {
              Toast.makeText(MainActivity.this, "Feature Layer failed to load!", Toast.LENGTH_LONG).show();
              Log.e(TAG, "Feature Layer failed to load!");
            }
          });
          // 添加到地图
          mMapView.getMap().getOperationalLayers().add(featureLayer);
        }

      } else {
        Toast.makeText(MainActivity.this, "Geodatabase failed to load!", Toast.LENGTH_LONG).show();
        Log.e(TAG, "Geodatabase failed to load!");
      }
    });
  }

  // 获取SD卡路径
  public String getSDCardPath()
  {
    return Environment.getExternalStorageDirectory().getAbsolutePath()
            + File.separator;
  }

6.运行APP:可以对Geodatabase中的地理数据进行简单的浏览

感谢luq老师的指导

猜你喜欢

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