ArcGIS for Android 实现加载地图

创建第一个应用

1.前期项目准备

1.1. 创建新工程

  • 新建一个空活动项目

image

  • 选择语言、平台,修改命名等

image

1.2. 添加ArcGIS SDK

  • build.gradle (Project: <project name>)添加

    maven {
    url 'https://esri.jfrog.io/artifactory/arcgis'
    }
  • build.gradle (Module: <module name>)添加

    implementation 'com.esri.arcgisruntime:arcgis-android:100.10.0'
  • Gradle更新:Sync Project with Gradle Files

  • AndroidManifest.xml添加

    //网络权限
    <uses-permission android:name="android.permission.INTERNET" />
    //use a MapView (2D) require at least OpenGL ES 2.x:
    <uses-feature android:glEsVersion="0x00020000" android:required="true" />
  • appdbuild.gradle(Module:app)的android部分指定Java版本

    compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
    }

1.3. 添加MapView地图控件

  • 修改activity_main.xml,替换TextView

    <com.esri.arcgisruntime.mapping.view.MapView
    android:id="@+id/mapView"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    tools:ignore="MissingConstraints">
    </com.esri.arcgisruntime.mapping.view.MapView>

2.加载在线地图

2.1.设置地图

  • 添加private MapView mMapView;

  • 引用import com.esri.arcgisruntime.mapping.view.MapView; (IDE可能会自动导入)

  • onCreate事件中设置地图

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mMapView=findViewById(R.id.mapView);
    ArcGISMap map =new ArcGISMap(Basemap.Type.TOPOGRAPHIC,34.056295,-117.195800,16);
    mMapView.setMap(map);
  • 重载onPauseonResumeonDestroy事件

    @Override
    protected void onPause() {
    mMapView.pause();
    super.onPause();
    }
    @Override
    protected void onResume() {
    super.onResume();
    mMapView.resume();
    }

2.2. 编译运行

点击运行后,Android模拟器中将打开生成的App

image

3.加载离线地图

3.1 数据准备

IDEA中点击菜单中的viewtool windowsdevice file explorer,打开如下视图,找到mnt下的sdcard,这个就是我们的手机常用的存储位置。

image

sdcard中新建文件夹,并upload地图文件,此处上传shape fileTPKMMPK文件

image

3.2.加载TPK地图

3.2.1.设置地图

  • 添加变量

    private static final String TAG =MainActivity.class.getSimpleName();
    private MapView mapView;
    private MobileMapPackage mobileMapPackage;
    private TileCache tileCache;
    private final String TPKPath=Environment.getExternalStorageDirectory()+"/EXFile/YueLuShan.tpk";
  • 添加引用

    package com.example.ex02;
    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.os.Environment;
    import android.util.Log;
    import android.widget.Toast;
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import com.esri.arcgisruntime.data.TileCache;
    import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
    import com.esri.arcgisruntime.loadable.LoadStatus;
    import com.esri.arcgisruntime.mapping.ArcGISMap;
    import com.esri.arcgisruntime.mapping.Basemap;
    import com.esri.arcgisruntime.mapping.MobileMapPackage;
    import com.esri.arcgisruntime.mapping.view.MapView;
  • 重载onCreateonPauseonResumeonDestroy事件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mapView=findViewById(R.id.mapView);
    requestPermission();
    }
    @Override
    protected void onPause() {
    mMapView.pause();
    super.onPause();
    }
    @Override
    protected void onResume() {
    super.onResume();
    mMapView.resume();
    }
  • 设置权限请求

    private void requestPermission() {
    String[] reqPermission=new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
    int reqCode=2;
    if (ContextCompat.checkSelfPermission(MainActivity.this,reqPermission[0])== PackageManager.PERMISSION_GRANTED){
    loadTPK(TPKPath);
    }else {
    ActivityCompat.requestPermissions(MainActivity.this,reqPermission,reqCode);
    }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull @org.jetbrains.annotations.NotNull String[] permissions, @NonNull @org.jetbrains.annotations.NotNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
    loadTPK(TPKPath);
    }else {
    Toast.makeText(MainActivity.this,"permission denied!",Toast.LENGTH_SHORT);
    }
    }
  • 添加方法支持

    private boolean loadTPK(String path){
    try {
    tileCache=new TileCache(TPKPath);
    tileCache.loadAsync();
    tileCache.addDoneLoadingListener(()->{
    if (tileCache.getLoadStatus()== LoadStatus.LOADED){
    Basemap basemap=new Basemap(new ArcGISTiledLayer(tileCache));
    mapView.setMap(new ArcGISMap(basemap));
    }else {
    String error ="Error loading mobile map package : " + tileCache.getLoadError().getMessage();
    Log.e(TAG,error);
    Toast.makeText(this,error,Toast.LENGTH_SHORT);
    }
    });
    return true;
    }catch (Exception e){
    return false;
    }
    }

3.2.2.编译运行

点击运行后,Android模拟器中将打开生成的App

image

3.3.加载MMPK地图

3.3.1.设置地图

  • 添加变量

    private static final String TAG =MainActivity.class.getSimpleName();
    private MapView mapView;
    private MobileMapPackage mobileMapPackage;
    private final String MMPKPath= Environment.getExternalStorageDirectory() +"/EXFile/Yellowstone.mmpk";
  • 添加引用

    package com.example.ex02;
    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.os.Environment;
    import android.util.Log;
    import android.widget.Toast;
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import com.esri.arcgisruntime.data.TileCache;
    import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
    import com.esri.arcgisruntime.loadable.LoadStatus;
    import com.esri.arcgisruntime.mapping.ArcGISMap;
    import com.esri.arcgisruntime.mapping.Basemap;
    import com.esri.arcgisruntime.mapping.MobileMapPackage;
    import com.esri.arcgisruntime.mapping.view.MapView;
  • 重载onCreateonPauseonResumeonDestroy事件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mapView=findViewById(R.id.mapView);
    requestPermission();
    }
    @Override
    protected void onPause() {
    mMapView.pause();
    super.onPause();
    }
    @Override
    protected void onResume() {
    super.onResume();
    mMapView.resume();
    }
  • 设置权限请求

    private void requestPermission() {
    String[] reqPermission=new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
    int reqCode=2;
    if (ContextCompat.checkSelfPermission(MainActivity.this,reqPermission[0])== PackageManager.PERMISSION_GRANTED){
    loadMMPK(MMPKPath);
    }else {
    ActivityCompat.requestPermissions(MainActivity.this,reqPermission,reqCode);
    }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull @org.jetbrains.annotations.NotNull String[] permissions, @NonNull @org.jetbrains.annotations.NotNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
    loadMMPK(MMPKPath);
    }else {
    Toast.makeText(MainActivity.this,"permission denied!",Toast.LENGTH_SHORT);
    }
    }
  • 添加方法支持

    private boolean loadMMPK(String path){
    try {
    mobileMapPackage = new MobileMapPackage(path);
    mobileMapPackage.loadAsync();
    mobileMapPackage.addDoneLoadingListener(()->{
    if (mobileMapPackage.getLoadStatus()== LoadStatus.LOADED && !mobileMapPackage.getMaps().isEmpty()){
    mapView.setMap(mobileMapPackage.getMaps().get(0));
    }else {
    String error ="Error loading mobile map package : " + mobileMapPackage.getLoadError().getMessage();
    Log.e(TAG,error);
    Toast.makeText(this,error,Toast.LENGTH_SHORT);
    }
    });
    return true;
    }catch (Exception e){
    return false;
    }
    }

3.3.2.编译运行

点击运行后,Android模拟器中将打开生成的App

image

3.4.加载shape file地图

3.4.1.设置地图

  • 添加变量
private MapView mMapView;
private final static String TAG = MainActivity.class.getSimpleName();
  • 添加引用

    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.os.Environment;
    import android.util.Log;
    import android.widget.Toast;
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import com.esri.arcgisruntime.data.ShapefileFeatureTable;
    import com.esri.arcgisruntime.layers.FeatureLayer;
    import com.esri.arcgisruntime.loadable.LoadStatus;
    import com.esri.arcgisruntime.mapping.ArcGISMap;
    import com.esri.arcgisruntime.mapping.Basemap;
    import com.esri.arcgisruntime.mapping.Viewpoint;
    import com.esri.arcgisruntime.mapping.view.MapView;
    import java.io.File;
  • onCreate事件中设置地图

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mMapView=findViewById(R.id.mapView);
    ArcGISMap map =new ArcGISMap(Basemap.createStreetsVector());
    mMapView.setMap(map);
    requestReadPermission();
    }
  • 重载onPauseonResumeonDestroy事件

    @Override
    protected void onPause() {
    mMapView.pause();
    super.onPause();
    }
    @Override
    protected void onResume() {
    super.onResume();
    mMapView.resume();
    }
  • 添加方法支持

    // 请求设备读写权限并加载数据
    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) {
    // 加载数据
    featureLayerShapefile();
    } 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) {
    // 加载数据
    featureLayerShapefile();
    } else {
    // 报告给用户权限请求被拒绝
    Toast.makeText(MainActivity.this, getResources().getString(R.string.arcgisruntime_error_null_value_not_allowed),
    Toast.LENGTH_SHORT).show();
    }
    }
    // 加载shapefile
    private void featureLayerShapefile() {
    // 获取本地shapefile文件
    String path = getSDCardPath()+"/EXFile/GeorgiaEduc.shp";
    ShapefileFeatureTable shapefileFeatureTable = new ShapefileFeatureTable(path);
    shapefileFeatureTable.loadAsync();
    shapefileFeatureTable.addDoneLoadingListener(() -> {
    if (shapefileFeatureTable.getLoadStatus() == LoadStatus.LOADED) {
    // 利用shapefile文件创建一个FeatureLayer文件
    FeatureLayer shapefileFeatureLayer = new FeatureLayer(shapefileFeatureTable);
    // 将shapefile图层添加到业务图层
    mMapView.getMap().getOperationalLayers().add(shapefileFeatureLayer);
    // 缩放到shapefile范围
    mMapView.setViewpointAsync(new Viewpoint(shapefileFeatureLayer.getFullExtent()));
    } else {
    String error = "Shapefile feature table failed to load: " + shapefileFeatureTable.getLoadError().toString();
    Toast.makeText(MainActivity.this, error, Toast.LENGTH_LONG).show();
    Log.e(TAG, error);
    }
    });
    }
    // 获取SD卡路径
    public String getSDCardPath()
    {
    return Environment.getExternalStorageDirectory().getAbsolutePath()
    + File.separator;
    }

3.4.2.编译运行

点击运行后,Android模拟器中将打开生成的App

image

posted @   当时明月在曾照彩云归  阅读(638)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
目录导航
目录导航
ArcGIS for Android 实现加载地图
创建第一个应用
1.前期项目准备
1.1. 创建新工程
1.2. 添加ArcGIS SDK
1.3. 添加MapView地图控件
2.加载在线地图
2.1.设置地图
2.2. 编译运行
3.加载离线地图
3.1 数据准备
3.2.加载TPK地图
3.2.1.设置地图
3.2.2.编译运行
3.3.加载MMPK地图
3.3.1.设置地图
3.3.2.编译运行
3.4.加载shape file地图
3.4.1.设置地图
3.4.2.编译运行
发布于 2021-06-04 21:09