• 【高德地图】Android搭建3D高德地图详细教


    📖第1章 高德地图介绍

    ✅了解高德地图

    高德地图是一款由中国高德软件开发的地图应用程序,提供了包括地图、导航、公交、步行、骑行、出行、地理编码、逆地理编码、地图搜索、路径规划、天气预报、地图 SDK 等多种功能。

    其中,Android 地图 SDK 是一套地图开发调用接口,开发者可以轻松地在自己的 Android 应用中加入地图相关的功能,包括:地图显示(含室内、室外地图)、与地图交互、在地图上绘制、兴趣点搜索、地理编码、离线地图等功能。

    高德地图开放平台:https://lbs.amap.com/

    image-20231205214240294

    接下来的Android高德地图实战会经常参考官网中Android平台的高德地图相关文档。

    image-20231205214437595

    ✅2D地图与3D地图

    2D地图和3D地图是两种不同类型的地图呈现方式

    • 2D 地图(二维地图): 以平面方式呈现地理信息,通常包括经度和纬度坐标。这类地图是平面的,类似于传统的纸质地图,其中只有 x 和 y 轴。

    • 3D 地图(三维地图): 则以三维方式呈现地理信息,通常包括经度、纬度和高度坐标。这类地图更加真实地模拟了地球表面的地形和建筑物。

    在高德地图中,2D地图在2019-11-14起便停止维护了,版型停留在V6.0.0 ,而3D地图和搜索一直在维护更新中, 所以后面的案例都是围绕3D地图展开。

    image-20231208003151686

    3D地图截止本篇文章编写时最近一次更新在2023-08-15,版本V9.8.2 。

    image-20231208003406882

    📖第2章 搭建3D地图并显示

    image-20231229003926846

    2D地图和3D地图搭建差不多,只是3D地图需要添加so库,而2D地图无需这一步骤,详细步骤参考如下:

    ✅第 1 步:创建 Android 项目

    本篇案例使用的环境如下:

    • 编译器:Android Studio Giraffe | 2022.3.1
    • JDK:JDK11
    • Gradle插件版本7.2.1,Gradle版本7.3.3
    • SDK28,相当于android 9.0

    2022.3.1的Android Studio对应的Gradle插件版本在3.2-8.1之间都可以,可以参考官网:

    https://developer.android.google.cn/studio/releases/gradle-plugin?hl=zh-cn

    image-20231205222707730

    ✅第 2 步:获取高德Key

    这里默认你已经创建好了高德开发平台账号,如果没有注册,则先注册一下

    **第1步:**创建新应用。进入到控制台,点击应用管理->我的应用->创建新应用

    image-20231205223600785image-20231205223946843

    第2步: 添加Key

    image-20231205231655378

    image-20231206215554779

    **第3步:**获取SHA1安全码

    获取SHA1安全码只需要一行命令:keytool -v -list -keystore keystore的文件路径

    这行命令的本质就是使用JDK的bin目录下的keytool.exe文件来执行keytool 指令,根据keystore来生成SHA1安全码。

    说明keystore 文件为 Android 签名证书文件。

    注意: keystore有开发模式(debug)和发布模式(release),两种模式获取的SHA1值是不同的,发布 apk时 需要根据发布apk对应的keystore重新配置Key。而debug.keystore是在SDK的安装路径.android\下可以找到。

    image-20231206221808857

    所以只要有JDK环境和keystore文件即可生成SHA1安全码,下面提供两种方式:

    • Android Studio获取SHA1
    • JDK自带工具获取SHA1

    🚩方式一:通过Android Studio获取SHA1

    • 打开Android StudioTerminal工具,在控制台直接输入下面命令
    //1. 输入指令: 
    keytool -v -list -keystore E:\software\Android\AndroidSdk\.android\debug.keystore
        
    //2. 输入密钥库口令: 默认密码是android
    
    • 1
    • 2
    • 3
    • 4

    image-20231206232157181

    🚩方式一:使用 keytool(jdk自带工具)获取SHA1(了解)

    1. win+R运行,输入cmd进入控制台:

    image-20231206234027036

    1. 在弹出的控制台窗口中输入 cd .android 定位到 .android 文件夹:

    image-20231206233855096

    注意:

    .android文件夹是在SDK安装路径,是你安装Android Studio一同安装的,如果你没有选择在其他位置,那就默认在C盘,直接使用cd .android即可,下面图片是我安装在其他位置。

    **第4步:**生产key

    将SHA1安全码在第二步进行输入并提交即可获取key

    image-20231206234733859

    提交后就能看到我们生成的调试版本key

    image-20231206235030288

    ✅第 3 步:下载地图SDK

    官网地址:https://lbs.amap.com/api/android-sdk/download/

    image-20231207001758935

    ✅第 4 步:添加地图 SDK

    🚩通过拷贝添加SDK开发包

    1、添加 jar 文件:

    将下载的地图 SDK 的 jar包复制到工程(此处截图以官方示例Demo为例子)的 libs 目录下,如果有老版本 jar 包在其中,请删除。如图所示:

    image-20231207003956790

    2、添加 so 库:

    说明3D地图才需要添加so库,2D地图无需这一步骤。

    保持project查看方式,以下介绍两种导入so文件的方法。

    将下载文件的 armeabi 文件夹复制到 libs 目录,如果有这个目录,请将下载的 so 库复制到这个目录。

    image-20231207004342554

    然后打开build.gradle,找到 sourceSets 标签,在里面增加一项配置,如图所示:

    image-20231207004604478

    没有则添加

        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    🚩通过Gradle集成SDK

    1、在Project的``settings.gradle中添加国内mavenjcenter`仓库地址

    在2022年1月的Gradle7.1.0版本做了更新,将buildscriptallprojects的仓库配置被挪到Project下的setting.gradle里面了,所以不在build.gradle文件中配置了。

        repositories {
            maven { url 'https://maven.aliyun.com/repository/public/' }
            maven { url 'https://maven.aliyun.com/repository/google/' }
            maven { url 'https://maven.aliyun.com/repository/jcenter' }
            google()
            mavenCentral()
            gradlePluginPortal()
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20231207214709757

    2、在主工程的build.gradle文件配置dependencies

    根据项目需求添加SDK依赖。引入各个SDK功能最新版本, dependencies 配置方式如下:

    SDK引入代码
    3D地图compile ‘com.amap.api:3dmap:latest.integration’
    2D地图compile ‘com.amap.api:map2d:latest.integration’
    导航compile ‘com.amap.api:navi-3dmap:latest.integration’
    搜索compile ‘com.amap.api:search:latest.integration’
    定位compile ‘com.amap.api:location:latest.integration’

    主工程的build.gradle文件在Project目录中位置:

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.amap.api:3dmap:latest.integration'
        implementation 'com.amap.api:search:latest.integration'
        implementation 'com.amap.api:location:latest.integration'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意:

    • 3D地图 SDK 和导航 SDK,5.0.0 版本以后全面支持多平台 so 库(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64),开发者可以根据需要选择。同时还需要注意的是:如果您涉及到新旧版本更替请移除旧版本的 so 库之后替换新版本 so 库到工程中。
    • navi导航SDK 5.0.0以后版本包含了3D地图SDK,所以请不要同时引入 map3d 和 navi SDK。
    • 如果build失败提示com.amap.api:XXX:X.X.X 找不到,请确认拼写及版本号是否正确,如果访问不到jcenter可以切换为maven仓库尝试一下。
    • 依照上述方法引入 SDK 以后,不需要在libs文件夹下导入对应SDK的 so 和 jar 包,会有冲突。

    ✅第 5 步:项目添加Key

    AndroidManifest.xmlapplication标签中配置Key:

    <application
             android:icon="@drawable/icon"
             android:label="@string/app_name" >
             <meta-data
                android:name="com.amap.api.v2.apikey"
                android:value="请输入您的用户Key"/>
                ……
    </application>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20231207221617001

    ✅第 6 步:项目配置权限

    AndroidManifest.xml中配置权限:

    地图SDK:

    
    <uses-permission android:name="android.permission.INTERNET" />  
    
    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    
    
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    
    
    
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
    
    
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    
    
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    
    
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />  
    
    
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    搜索SDK:

    
    <uses-permission android:name="android.permission.INTERNET" />  
    
    
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    
    
    
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
    
    
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    
    
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />  
    
    
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    可以更具需求来添加权限配置:

    image-20231207215830030

    ✅第 7 步:显示地图

    分为三个步骤:

    • 在布局文件中添加地图控件
    • 在activity或fragment中初始化地图容器
    • 使用AMap地图控制器类来显示并操作地图
    1. activity_main.xml布局文件中添加MapView组件:
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        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=".MainActivity">
    
        <com.amap.api.maps.MapView
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        com.amap.api.maps.MapView>
    
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. activity中初始化地图容器
            MapsInitializer.updatePrivacyShow(this,true,true);//隐私合规接口
            MapsInitializer.updatePrivacyAgree(this,true);//隐私合规接口
         
            MapView mapView = findViewById(R.id.map); //获取地图视图对象
            mapView.onCreate(savedInstanceState);//创建地图
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 获取地图对象并显示
          
            if (aMap == null) {
                aMap = mMapView.getMap();  //获取地图对象并显示
            }
    
    • 1
    • 2
    • 3
    • 4

    注意:

    初始化地图容器之前必须进行隐私合规接口的检查,否则可能不能正常显示map,或者地图将白屏,这是因为近几年来关于用户隐私问题越来被重视。

    完整示例代码如下:

    public class  MainActivity extends AppCompatActivity {
        private MapView mMapView  = null;//地图容器
        private AMap aMap;//地图对象AMap
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           //初始化地图定位
            initMap(savedInstanceState);  
        }
        /**
         * 初始化地图
         * @param savedInstanceState
         */
        private void initMap(Bundle savedInstanceState) {
            MapsInitializer.updatePrivacyShow(this, true, true);//隐私合规接口
            MapsInitializer.updatePrivacyAgree(this, true);//隐私合规接口
            AMapLocationClient.updatePrivacyAgree(this, true);
            AMapLocationClient.updatePrivacyShow(this, true, true);
            mMapView = findViewById(R.id.map); //获取地图视图对象
            mMapView.onCreate(savedInstanceState);//创建地图
            if (aMap == null) {
                aMap = mMapView.getMap();
            }
        }
        /**
         * 生命周期-onDestroy
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mMapView.onDestroy(); //销毁地图
        }
        /**
         * 生命周期-onResume
         */
        @Override
        protected void onResume() {
            super.onResume();
            mMapView.onResume(); //重新绘制加载地图
        }
        /**
         * 生命周期-onPause
         */
        @Override
        protected void onPause() {
            super.onPause();
            mMapView.onPause();//暂停地图的绘制
        }
        /**
         * 生命周期-onSaveInstanceState
         */
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            mMapView.onSaveInstanceState(outState);//保存地图当前的状态
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    在项目中使用地图的时候需要注意,需要合理的管理地图生命周期,这非常的重要。

    image-20231207224940224


    在这里插入图片描述

    第1,2章 Android搭建3D高德地图详细教
    第 3 章 初始化定位并显示小蓝点
    第 4 章Android高德地图绘制标记点Marker
    第 5 章Android高德地图控件交互详细介绍

  • 相关阅读:
    4-8岁儿童EEG微状态研究:年龄和性别的影响
    贴片天线的HFSS和CST仿真对比
    BLOB, TEXT, GEOMETRY or JSON column ‘xxxx‘ can‘t have a default value
    [C]qsort的使用和实现
    OpenAI:我们暂停了ChatGPT Plus新用户注册
    推荐一款数据mock框架,无需任何依赖,贼牛逼
    [每日学习]算法学习1——数组二分
    基于Python实现的特征选择的遗传算法(GA)
    SQL必会知识点(一)
    问题随记 —— PyCharm 连接远程服务器的 Python 环境
  • 原文地址:https://blog.csdn.net/mjh1667002013/article/details/136245215