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>
1.4 数据准备
在IDEA中点击菜单中的view、tool windows、device file explorer,打开如下视图,找到mnt下的sdcard,这个就是我们的手机常用的存储位置。

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

2.添加界面操作
2.1 定义文本
在strings.xml中完成文本的定义(规范化做法,其实也不是必须这样,这样可便于日后维护,比如更换界面语言)
<resources>
<string name="app_name">EX03</string>
<string name="btnZoomIn">放大</string>
<string name="btnZoomOut">缩小</string>
<string name="btnRotation">旋转</string>
<string name="btnScale">缩放</string>
<string name="btnLayers">图层</string>
</resources>

2.2 设计界面
打开activity_main.xml,可切换设计界面和代码界面进行设计。此处先在mapView中添加一个LinearLayout horizontal,再在LinearLayout horizontal中添加button,并修改属性。
xml文件如下:
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="@string/btnZoomIn"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1" tools:ignore="ButtonStyle"
android:id="@+id/buttonZoomIn"/>
<Button
android:text="@string/btnZoomOut"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/buttonZoomOut" android:layout_weight="1"
tools:ignore="ButtonStyle"/>
<Button
android:text="@string/btnRotation"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/buttonRotation" android:layout_weight="1"
tools:ignore="ButtonStyle"/>
<Button
android:text="@string/btnScale"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/buttonScale" android:layout_weight="1"
tools:ignore="ButtonStyle"/>
<Button
android:text="@string/btnLayers"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/buttonLayers" android:layout_weight="1"
tools:ignore="ButtonStyle"/>
</LinearLayout>

3. 添加方法支持
3.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();
} @Override
protected void onDestroy() {
mMapView.dispose();
super.onDestroy();
}

3.2 完善放大方法
添加函数
protected void registerButtonClick()在
protected void registerButtonClick()中添加代码Button buttonZoomIn=(Button)findViewById(R.id.buttonZoomIn);
buttonZoomIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMapView.setViewpointScaleAsync(mMapView.getMapScale()*0.5);
}
});在
onCreate函数中添加registerButtonClick()调用

3.3 完善缩小方法
在
protected void registerButtonClick()中添加代码Button buttonZoomOut=(Button)findViewById(R.id.buttonZoomOut);
buttonZoomOut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMapView.setViewpointScaleAsync(mMapView.getMapScale()*2.0);
}
});

3.4 完善旋转方法
在
protected void registerButtonClick()中添加代码Button buttonRotation=(Button)findViewById(R.id.buttonRotation);
buttonRotation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMapView.setViewpointRotationAsync(mMapView.getMapRotation()+10.0);
}
});

3.5 完善图层管理方法
由于上述在线加载的地图没有多图层,此处加载离线多图层地图
添加变量
private static final String TAG =MainActivity.class.getSimpleName();
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;设置权限请求
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();
Toast.makeText(this,error,Toast.LENGTH_SHORT);
}
});
return true;
}catch (Exception e){
return false;
}
}
在
onCreate中添加requestPermission()调用
运行测试
点击运行后,Android模拟器中将打开生成的App

在
protected void registerButtonClick()中添加代码Button buttonLayers=(Button)findViewById(R.id.buttonLayers);
buttonLayers.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int size=mMapView.getMap().getOperationalLayers().size();
final String[] names=new String[size];
for (int i=0;i<size;i++){
names[i]=mMapView.getMap().getOperationalLayers().get(i).getName();
} AlertDialog alertDialog=new AlertDialog.Builder(MainActivity.this)
.setTitle("请选择图层")
.setItems(names, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//设置图层操作代码,此处只是简单的移除图层
mMapView.getMap().getOperationalLayers().remove(which);
}
})
.show();
}
});

3.6 完善比例尺方法
在
protected void registerButtonClick()中添加代码Button buttonScale=(Button)findViewById(R.id.buttonScale);
buttonScale.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String[] scale=new String[]{"100000","50000","10000","5000"};
final int[] scales=new int[] {100000,50000,10000,5000};
AlertDialog alertDialog=new AlertDialog.Builder(MainActivity.this)
.setTitle("请选择比例尺")
.setItems(scale, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mMapView.setViewpointScaleAsync(scales[which]);
}
})
.show();
}
});

ArcGIS for Android 实现地图基本操作的更多相关文章
- ArcGIS Engine开发之地图基本操作(3)
地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...
- ArcGIS Engine开发之地图基本操作(2)
地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多 ...
- ArcGIS Engine开发之地图基本操作(1)
ArcGIS提供的各类数据形式以及相应接口 1. 空间数据 在GIS软件中,空间数据有多种不同的形式存在.按照不同的划分标准可以分为矢量数据和栅格数据.GIS格式数据和非GIS格式数据(CAD格式). ...
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
- 创建一个ArcGIS for Android 新项目并显示出本地的地图
1.准备工作:首先要配置好android的开发环境,然后在Eclipse中安装ArcGIS for Android的开发控件:在ArcCatalog中发布好本地的地图服务. 2.安装完ArcGIS f ...
- ArcGIS for Android地图控件的5大常见操作
GIS的开发中,什么时候都少不了地图操作.ArcGIS for Android中,地图组件就是MapView,MapView是基于Android中ViewGroup的一个类(参考),也是ArcGIS ...
- arcgis for android访问arcgis server上自己制作部署的地图服务
转自:http://gaomw.iteye.com/blog/1110437 本项目的开发环境是eclipse3.5 + ADT11插件+arcgis for andorid 插件 + arcgis ...
- ArcGIS for Android地图上实际距离与对应的屏幕像素值计算
本篇文章主要介绍了"ArcGIS for Android地图上实际距离与对应的屏幕像素值计算",主要涉及到ArcGIS for Android地图上实际距离与对应的屏幕像素值计算方 ...
- Arcgis For Android之离线地图实现的几种方式
为什么要用,我想离线地图的好处是不言而喻的,所以很多人做系统的时候都会考虑用离线地图.在此,我给大家介绍几种Arcgis For Android下加载离线地图的方式. 在Arcgis For Andr ...
- 【Arcgis for android】保存地图截图到sd卡
关键词:arcgis for android ,截图,bitmap,sd卡 参考文章:http://blog.csdn.net/wozaifeiyang0/article/details/767972 ...
随机推荐
- Jenkins&&gitlab2
Jenkins slave 添加jenkins slave节点: jenkins slave节点创建工作目录与基本环境配置,如果jenkins slave节点需要clone代码和执行java 代码编 ...
- 获取VIP歌曲
""" 分析需求 1,确定目标网址 2,获取目标网址的所有数据 3,筛选我们想要的数据 4,下载歌曲保存 """ import os imp ...
- 绿色版MySQL8.0.26安装流程
下载 5.7 8.0 官网 https://dev.mysql.com/downloads/mysql/ 国内镜像网站 https://developer.aliyun.com/mirror/ ...
- Web3区块链DAS域名注册教程 tron trx链波卡钱包地址解析 用户名转账 ENS
而在去中心化系统中,大部分人充值.转账时,使用的都是区块链原生的长地址,比如: ETH 的地址: 0x9euo8sHip*******dHld90 CKB 的地址: ckHUEI829D******* ...
- linux硬盘分区挂载
这里使用手动挂载方式,还有其他挂载方式请百度 检查网站的磁盘状态,确认是否有没有分区的磁盘. fdisk -l 如图所示,这个服务器有两个硬盘第一个299.0G,第二个20000.0G.这种情况说明硬 ...
- toastr.js 便捷弹框怎么用?怎么本地化?
〇.简介 toastr.js 是一个非常简洁的弹窗消息插件,主要原因就是其脚本和样式文件较小. 并且可以根据自己的需求,修改样式文件,可以应用在多种不同的场景. https://codeseven.g ...
- Ubuntu 安装 SSH
sudo apt install openssh-server sudo systemctl status ssh sudo ufw allow ssh
- 精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
前提介绍 很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴 ...
- py教学之元组
元组介绍 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. tup1 = ...
- Kubernetes(k8s)密码管理:Secret
目录 一.系统环境 二.前言 三.Secret概览 四.Secret 的类型 五.各种类型的secret使用实例 5.1 创建kubernetes.io/service-account-token类型 ...