由于课程需要,我查询了一些Android中的地图定位开发技术,该技术在理论课日常练习中应用到了模拟高德地图APP开发中,同时也运用到了实验课结业大作业——小农夫APP中。下面就该技术的核心内容、部分问题解集方案进行记录。希望可以供以后参考。
一、新技术简介
该项技术应用到了ArcGIS Runtime SDKfor Android,2017年初ArcGIS 10.5正式的发布,经历了几个版本ArcGIS 10.5已经成为一个智能的以web问中心的地理平台,WebGIS也越来越深入身心,随着ArcGIS的不断更新,慢慢演化出了跨平台开发产品ArcGIS Runtime。ArcGIS Runtime 100.0正式发布,新品具备更多能力及特性:支持跨平台跨设备,如Windows、Linux、Mac、iOS、Android等;采用全新的底层架构设计,能够所有SDK采用一致的功能和API;与Web GIS无缝对接,开发者可随时随地使用、制作、编辑平台资源;增强的3D体验,倾斜摄影、精细模型等全支持,并支持三维符号化、三维路径分析等;强大离线能力,支持移动地图包、底图切片包、及要素服务离线同步等多种离线模式;支持直连SDE数据库、本地栅格数据源等。
围绕在ArcGIS地理平台的Apps,特别是开发定制部分,很大程度上落到了ArcGIS Runtime的肩膀上。ArcGIS Runtime为新一代的Web GIS模式打造,其操作对象是web map和web scene模型,涵盖CS桌面程序开发和移动开发。
ArcGIS Runtime常见功能:
1、支持在线数据和离线数据。
2、在有网络连通的情况下,可以使用ArcGIS GIS Server、ArcGIS
Online等在线资源;如果在断网的情况下,可以使用本地数据包,包括MPK、GPK、GCPK等。
3、地图(2D)显示,使用新的渲染引擎,大大提高了地图浏览的速度。
4、地图(3D)显示。
5、符号化展示。
6、GPS位置追踪。可连接GPS设备实时定位追踪,也支持本地GPS文件位置回放。
7、支持数据编辑。
8、支持地理处理工具。
9、支持地理编码和反地理编码。
10、支持空间分析、网络分析及3D分析。
11、支持Windows、Linux、Mac OS X桌面环境。
12、支持Android、iOS和 Windows Phone等移动设备。
13、提供编辑同步功能。
14、进一步加强离线的数据分析(网络分析,地理编码分析和查询)。
15、支持静态和动态模式的符号图层(Graphics overlays)。
16、此外还将提供更多的离线的分析,对本地矢量数据和栅格数据的支持,以及3D功能。
17、支持本地文件地理数据库。
18、集成Portal for ArcGIS图层。
二、开发环境
1、基础GIS软件环境
基础GIS软件环境是为了给安卓开发准备地图资源(如果有在线的地图资源使用,可以忽略此部分。 )
ArcGIS桌面软件高级版(ArcGIS Desktop 10.5 Advanced-S)
ArcGIS企业级平台软件高级版套件(ArcGIS Enterprise 10.5 Advanced 4 Cores)
下载地址:http://pan.baidu.com/s/1qYuc6jM
2、参考前面的博文,配置Android开发环境。
三、创建一个地图应用程序
1、创建一个新工程(File > New > New Project)
2、输入工程名:(随意取,但是要遵守命名规则)
3、修改Company Domain 和 Project Location
4、修改Package name
5、点击下一步,勾选“Phone and Tablet”
6、选择合适的SDK
7、点击下一步,选择“Empty Activity”
8、点击下一步,输入Activity Name。
9、输入Layout Name(可采用默认)。
10、单击完成,等待工程初始化完成。
11、于(project)的build.gradle文件中在相应的地方添加:url ‘https://esri.bintray.com/arcgis’
代码:buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
}
}
allprojects {
repositories {
jcenter()
// Add the Esri public Bintray Mavenrepository
maven {
url 'https://esri.bintray.com/arcgis'
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
12、于appmodule的build.gradle文件中在相应的地方添加:
compile ‘com.esri.arcgisruntime:arcgis-Android:100.0.0’
代码:apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "esrichina.hymn.setmapinitiallocation"
minSdkVersion 23
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.esri.arcgisruntime:arcgis-android:100.0.0'
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile
('com.android.support.test.espresso:espresso-core:2.2.2', {
'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.0'
testCompile 'junit:junit:4.12'
}
13、在android Studio toolbar中,单击 “Sync Project with Gradle Files” (要有好网络,否则等待漫长的下载)
14、在“Androidproject view”中打开“AndroidManifest.xml”(app > manifests)
添加:
*
package="esrichina.hymn.setmapinitiallocation"> android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> 15、在Layout(res > layout:activity_main.xml)文件中添加MapView。 "1.0" encoding="utf-8"?> xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="esrichina.hymn.setmapinitiallocation.MainActivity"> <com.esri.arcgisruntime.mapping.view.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" > com.esri.arcgisruntime.mapping.view.MapView> .support.constraint.ConstraintLayout> 16、初始化MapView。进入“MainActivity”(Java > [package name]),于相应处编码。 package esrichina.hymn.setmapinitiallocation; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.esri.arcgisruntime.mapping.ArcGISMap; import com.esri.arcgisruntime.mapping.Basemap; import com.esri.arcgisruntime.mapping.view.MapView; public class MainActivityextends AppCompatActivity { private MapView mMapView; @Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMapView = (MapView) findViewById(R.id.mapView); ArcGISMap map = new ArcGISMap (Basemap.Type.TOPOGRAPHIC, 34.056295, -117.195800, 16); mMapView.setMap(map); } } 17、运行程序,选择设备,得到结果。
*