ArcGIS for Android 实现加载地图
创建第一个应用
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 FilesAndroidManifest.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 实现加载地图的更多相关文章
- 解决ArcGIS API for Silverlight 加载地图的内外网访问问题
原文:解决ArcGIS API for Silverlight 加载地图的内外网访问问题 先上一个类,如下: public class BaseClass { public static string ...
- ArcGIS API For JavaScript 加载地图,设置地图中心点
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- arcgis for android 无法加载本地jpg影像解决办法
因为jpg影像没有生成金子塔文件*.rrd 一个完整的JPG影像必须包括如下文件: K-50-96-(16).aux 辅助文件K-50-96-(16).jgw 坐标信息K-50-96-(16).j ...
- ArcGIS API for Silverlight 加载google地图
原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...
- ArcGIS API for Silverlight加载google地图(后续篇)
原文:ArcGIS API for Silverlight加载google地图(后续篇) 之前在博客中(http://blog.csdn.net/taomanman/article/details/8 ...
- ArcGis API for JavaScript学习——加载地图
ArcGis API for JavaScript开发笔记——加载地图 在这个例子中使用的离线部署的API(请参见 http://note.youdao.com/noteshare?id=f42865 ...
- Arcgis for Js之加载wms服务
概述:本节讲述Arcgis for Js加载ArcgisServer和GeoServer发布的wms服务. 1.定义resourceInfo var resourceInfo = { extent: ...
- Android动态加载技术初探
一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...
- Android之Fresco(facebook的强大Android图片加载的框架)
Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络.本地存储和本地资源中加载图片.其中的Drawees可以显示占位符,直到图片加载完成.而当图片从屏幕 ...
- (转载)arcgis for js - 解决加载天地图和WMTS服务,WMTS服务不显示的问题,以及wmts服务密钥。
1 arcgis加载天地图和wmts服务 arcgis for js加载天地图的例子网上有很多,这里先不写了,后期有空再贴代码,这里主要分析下WMTS服务为什么不显示,怎么解决. 条件:这里的WMTS ...
随机推荐
- 微软宣布 S2C2F 已被 OpenSSF 采用
开源供应链安全对大多数 IT 领导者来说是个日益严峻的挑战,围绕确保开发人员在构建软件时如何使用和管理开源软件 (OSS) 依赖项的稳健策略至关重要.Microsoft 发布安全供应链消费框架 (S2 ...
- linux系统部署微服务项目
**:如果使用阿里云linux服务器 1.设置容器镜像服务 在阿里云平台搜索 "容器镜像服务" 选择"CentOS" 安装/升级Docker客户端 配置镜像加速 ...
- 铁威马NAS如何开启二次验证提高系统安全性
想到登录TNAS时更安全?直接开启OTP二次验证,通过 TNAS mobile生成的一次性密码登录NAS存储,简单设置,提升TOS系统访问安全性给你TNAS双重保护. 1.首先,确认你的TOS系统在5 ...
- web项目部署上线(无虚拟主机,待学习)
购买阿里云服务器 阿里云服务器ECS 系统镜像使用Ubuntu 20.04 LTS 使用ssh连接服务器,终端或者CMD中执行:$ssh root@x.x.x(阿里云服务器账号名@公网地址) 输入账号 ...
- 历时9个月重构iNeuOS工业互联网操作系统,打造工业领域的“Office”
目 录 1. 概述... 1 2. 整体介绍... 2 3. 主要功能简介... 5 1. 概述 历时9个月的时间,对iNeuOS工业互联网操作系统进行全 ...
- 希腊字母表及latex代码
希腊字母表及latex代码 字母大写 字母小写 英文名称 latex大写代码 latex小写代码 \(\Alpha\) \(\alpha\) alpha \Alpha \alpha \(\Beta\) ...
- [OpenCV实战]25 使用OpenCV进行泊松克隆
目录 1 Seamless Cloning实现 1.1 Seamless Cloning实例 1.2 正常克隆(NORMAL_CLONE)与混合克隆(MIXED_CLONE) 1.2.1 Normal ...
- [常用工具] 基于psutil和GPUtil获取系统状态信息
本文主要介绍在Python3中利用psutil库获取系统状态,利用GPUtil获取gpu状态. psutil (process and system utilities)(进程和系统实用程序)是一个跨 ...
- 迁移学习(IIMT)——《Improve Unsupervised Domain Adaptation with Mixup Training》
论文信息 论文标题:Improve Unsupervised Domain Adaptation with Mixup Training论文作者:Shen Yan, Huan Song, Nanxia ...
- MAC中Flutter下载和安装
Flutter官网 https://flutter.dev/docs/development/tools/sdk/releases?tab=macos 一.终端下配置系统环境变量和镜像 我的mac ...