创建第一个应用

1.前期项目准备

1.1. 创建新工程

  • 新建一个空活动项目

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

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);
  • 重载onPause、onResume与onDestroy事件

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

2.2. 编译运行

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

3.加载离线地图

3.1 数据准备

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

在sdcard中新建文件夹,并upload地图文件,此处上传shape file、TPK、MMPK文件

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;
  • 重载onCreate、onPause、onResume、onDestroy事件

        @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

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;
  • 重载onCreate、onPause、onResume、onDestroy事件

        @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

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();
    }
  • 重载onPause、onResume与onDestroy事件


    @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

ArcGIS for Android 实现加载地图的更多相关文章

  1. 解决ArcGIS API for Silverlight 加载地图的内外网访问问题

    原文:解决ArcGIS API for Silverlight 加载地图的内外网访问问题 先上一个类,如下: public class BaseClass { public static string ...

  2. ArcGIS API For JavaScript 加载地图,设置地图中心点

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. arcgis for android 无法加载本地jpg影像解决办法

    因为jpg影像没有生成金子塔文件*.rrd 一个完整的JPG影像必须包括如下文件: K-50-96-(16).aux  辅助文件K-50-96-(16).jgw  坐标信息K-50-96-(16).j ...

  4. ArcGIS API for Silverlight 加载google地图

    原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...

  5. ArcGIS API for Silverlight加载google地图(后续篇)

    原文:ArcGIS API for Silverlight加载google地图(后续篇) 之前在博客中(http://blog.csdn.net/taomanman/article/details/8 ...

  6. ArcGis API for JavaScript学习——加载地图

    ArcGis API for JavaScript开发笔记——加载地图 在这个例子中使用的离线部署的API(请参见 http://note.youdao.com/noteshare?id=f42865 ...

  7. Arcgis for Js之加载wms服务

    概述:本节讲述Arcgis for Js加载ArcgisServer和GeoServer发布的wms服务. 1.定义resourceInfo var resourceInfo = { extent: ...

  8. Android动态加载技术初探

    一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...

  9. Android之Fresco(facebook的强大Android图片加载的框架)

    Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络.本地存储和本地资源中加载图片.其中的Drawees可以显示占位符,直到图片加载完成.而当图片从屏幕 ...

  10. (转载)arcgis for js - 解决加载天地图和WMTS服务,WMTS服务不显示的问题,以及wmts服务密钥。

    1 arcgis加载天地图和wmts服务 arcgis for js加载天地图的例子网上有很多,这里先不写了,后期有空再贴代码,这里主要分析下WMTS服务为什么不显示,怎么解决. 条件:这里的WMTS ...

随机推荐

  1. FP6397S5 高效、高频同步DC-DC降压变频器IC

    FP6397是一种高效.高频同步DC-DC降压变频器.100%占空比功能提供了低退出操作,延长了便携式系统的电池寿命. 内部同步开关提高了效率,并消除了对外部肖特基二极管的需要.在停机模式下,输入电源 ...

  2. adb安装电视apk

    adb 是什么? 百度说明:adb工具即Android Debug Bridge(安卓调试桥) tools.它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在某些特殊的情况下进入不了系统 ...

  3. php的可变变量覆盖漏洞

    题目如下: <?php highlight_file('source.txt'); echo "<br><br>"; $flag = 'xxxxxxx ...

  4. 【基础篇】一文带你掌握 Redis

    一.摘要 谈起 Redis,相信大家都不会陌生,做过云平台开发的程序员多多少少会接触到它,Redis 英文全称:Remote Dictionary Server,也被称之为远程字典服务. 从官方的定义 ...

  5. kafka详解(03) - kafka JAVA API

    kafka详解(03) - kafka JAVA API Producer (生产者)API 消息发送流程 Kafka的Producer发送消息采用的是异步发送的方式.在消息发送的过程中,涉及到了两个 ...

  6. Hadoop详解(08) - Hadoop企业优化方案.docx

    Hadoop详解(08) - Hadoop企业优化方案.docx MapReduce优化 MapReduce 跑的慢的原因 计算机性能:CPU.内存.磁盘健康.网络 I/O 操作优化 (1)数据倾斜 ...

  7. BST查找结构与折半查找方法的实现与实验比较

    简介 作业:查找结构与排序方法 作业题目: BST 查找结构与折半查找方法的实现与实验比较 要求编写程序实现 BST 存储结构的建立(插入).删除.查找和排序算法: 实现折半查找算法:比较 BST 查 ...

  8. Matplotlib学习笔记2 - 循序渐进

    Matplotlib学习笔记2 - 循序渐进 调整"线条" 在Matplotlib中,使用plot函数绘制的线条其实是一种特定的类,matplotlib.lines.Line2D. ...

  9. Svelte框架实现表格协同文档

    首先,从框架搭建上,本篇示例采用当下流行的前后端分离的开发方式,前端使用npm作为脚手架搭建Svelte框架. 后端使用Java的SpringBoot作为后端框架. 首先,介绍下在前端Svelte框架 ...

  10. 通过Docker启动DB2,并在Spring Boot整合DB2

    1 简介 DB2是IBM的一款优秀的关系型数据库,简单学习一下. 2 Docker安装DB2 为了快速启动,直接使用Docker来安装DB2.先下载镜像如下: docker pull ibmcom/d ...