本文主要讲解如何借助ArcGIS Runtime SDK for Android显示本地GeoPackage文件。
实现步骤:
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.READ_EXTERNAL_STORAGE" />
<!--写入外部存储权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
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)获取GeoPackage文件路径。
(3)通过路径创建GeoPackage对象,并对其进行异步加载。
(4)获取GeoPackage对象中的所有GeoPackageFeatureTable对象。
(5)对所有GeoPackageFeatureTable对象进行循环获取FeatureTable。
(6)通过FeatureTable对象创建FeatureLayer对象。
(7)将FeatureLayer对象添加到MapView中的操作图层中以便显示。
准备:在Android设备的内置SD卡中创建ArcGIS文件夹,放入testGeoPackage.gpkg文件。
步骤:
(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:可以对GeoPackage中的地理数据进行简单的浏览
感谢luq老师的指导