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 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 实现加载地图的更多相关文章
- 解决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 ...
随机推荐
- 【每日一题】【判断栈是否为空的方法】2022年1月9日-NC76 用两个栈实现队列的出队入队【入队简单】
描述用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能. 队列中的元素为int类型.保证操作合法,即保证pop操作时队列内已有元素 ...
- vue3 watch笔记
watchEffect 执行传入的一个函数,同时自动追踪函数中依赖到的数据,并在其依赖变更时重新运行该函数. 并且会在 组件挂载前 立即调用一次,(默认是挂载前,可通过修改 flush 属性改变,后边 ...
- 数据结构学习——BST删除特定节点
BST删除特定节点 前言 一个平常的星期三晚上,一节通选课中,在老师放的视频和极寒空调的折磨之下,想着做点别的什么的我,打开了博客园.想起来做题下午数据结构课中老师最后在讲BST删除节点的操作,并且以 ...
- form表单里的button 等元素不能使用margin: 0 auto;
记得把form和button都设为display:block; 就能用margin: 0 auto;水平居中了
- UIAutomator测试框架介绍
uiautomator简介 UiAutomator是Google提供的用来做安卓自动化测试的一个Java库,基于Accessibility服务.功能很强,可以对第三方App进行测试,获取屏幕上任意一个 ...
- 【Spring专题】「开发指南」夯实实战基础功底之解读logback-spring.xml文件的详解实现
logback的maven配置 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j- ...
- JavaScript:立即执行函数
想象一下,如果我希望某个代码块,只执行一次,就不再执行,应该怎么办? 代码块肯定是用函数来表示,执行肯定是调用函数,但是确保只执行一次,该怎么办? 我们为什么可以多次调用函数,因为函数名指向了函数的内 ...
- 【转载】【Word】项目编号应用样式后出现黑框的解决方案
本文中的宏代码来自: https://www.zhihu.com/question/38985919 Word使用项目编号后,出现黑框,如下图所示: 网上大多数解决方案在重新打开文档后,依然还是有黑框 ...
- 使用idea进行gitee代码管理
目录 1.在idea插件市场安装gitee插件 2.把本地仓库的release分支上的代码合到dev分支上 3.把本地dev分支上的代码合到远程dev分支上去 1.在idea插件市场安装gitee插件 ...
- A排列方案
递归实现排列型枚举 把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. 首先,同一行相邻两个数用 ...