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

news2024/11/15 7:08:47

📖Android搭建3D高德地图详细教程

    • 📖第1章 高德地图介绍
      • ✅了解高德地图
      • ✅2D地图与3D地图
    • 📖第2章 搭建3D地图并显示
      • ✅第 1 步:创建 Android 项目
      • ✅第 2 步:获取高德Key
      • ✅第 3 步:下载地图SDK
      • ✅第 4 步:添加地图 SDK
        • 🚩通过拷贝添加SDK开发包
        • 🚩通过Gradle集成SDK
      • ✅第 5 步:项目添加Key
      • ✅第 6 步:项目配置权限
      • ✅第 7 步:显示地图

📖第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

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']
        }
    }
🚩通过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()
    }

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'
}

注意:

  • 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>

image-20231207221617001

✅第 6 步:项目配置权限

AndroidManifest.xml中配置权限:

地图SDK:

<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" />  

<!--允许获取粗略位置,若用GPS实现定位小蓝点功能则必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

<!--允许获取设备和运营商信息,用于问题排查和网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />    

<!--允许获取网络状态,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    

<!--允许获取wifi网络信息,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

<!--允许获取wifi状态改变,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<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" /> 

搜索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" />    

<!--允许获取wifi网络信息-->
<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" /> 

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

image-20231207215830030

✅第 7 步:显示地图

分为三个步骤:

  • 在布局文件中添加地图控件
  • 在activity或fragment中初始化地图容器
  • 使用AMap地图控制器类来显示并操作地图
  1. activity_main.xml布局文件中添加MapView组件:
<?xml version="1.0" encoding="utf-8"?>
<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. activity中初始化地图容器
        MapsInitializer.updatePrivacyShow(this,true,true);//隐私合规接口
        MapsInitializer.updatePrivacyAgree(this,true);//隐私合规接口
     
        MapView mapView = findViewById(R.id.map); //获取地图视图对象
        mapView.onCreate(savedInstanceState);//创建地图
  1. 获取地图对象并显示
      
        if (aMap == null) {
            aMap = mMapView.getMap();  //获取地图对象并显示
        }

注意:

初始化地图容器之前必须进行隐私合规接口的检查,否则可能不能正常显示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);//保存地图当前的状态
    }
}

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

image-20231207224940224


在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1464518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023 龙蜥操作系统大会演讲实录:《兼容龙蜥的云原生大模型数据计算系统——πDataCS》

本文主要分三部分内容&#xff1a;第一部分介绍拓数派公司&#xff0c;第二部分介绍 πDataCS 产品&#xff0c;最后介绍 πDataCS 与龙蜥在生态上的合作。 杭州拓数派科技发展有限公司&#xff08;简称“拓数派”&#xff0c;英文名称“OpenPie”&#xff09;是国内基础数据计…

Android platform tool中d8.bat不生效

d8.bat因找不到java_exe文件&#xff0c;触发EOF d8.bat中之前代码为&#xff1a; set java_exe if exist "%~dp0..\tools\lib\find_java.bat" call "%~dp0..\tools\lib\find_java.bat" if exist "%~dp0..\..\tools\lib\find_java.bat" …

【教3妹学编程-算法题】匹配模式数组的子数组数目 II

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到上海女老师出轨男学生的瓜啊。 2哥 : 看到 了&#xff0c;真的是太毁三观了&#xff01; 3妹&#xff1a;是啊&#xff0c; 老师本是教书育人的职业&#xff0c;明确规定不能和学生谈恋爱啊&#xff0c;更何况是出轨。 2哥 : 是啊…

petalinux_zynq7 驱动DAC以及ADC模块之一:建立IP

0. 环境 - ubuntu18 - vivado 2018.3 - mizar z7010 ada106模块 1. vivado 1.1 创建vivado工程 运行vivado source /tools/Xilinx/Vivado/2018.3/settings64.sh vivado& 创建vivado工程 Vivado -> Create Project -> Next -> -> Project name: …

【论文阅读笔记】Revisiting RCAN: Improved Training for Image Super-Resolution

论文地址&#xff1a;https://arxiv.org/abs/2201.11279 代码地址&#xff1a;https://github.com/zudi-lin/rcan-it 论文小结 本文的工作&#xff0c;就是重新审视之前的RCAN&#xff0c;然后做实验来规范化SR任务的训练流程。 此外&#xff0c;作者得出一个结论&#xff1a;…

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…

linux增加物理磁盘并挂载到文件系统

centos7增加物理磁盘并挂载到文件系统 1、查看所有磁盘情况 fdisk -l2、创建挂载路径 mkdir /data3、格式化磁盘 #磁盘filesystem(上图标红处) mkfs.xfs -f /dev/sda建议 与其它磁盘文件系统保持一致&#xff0c;我这里是xfs 可通过 cat /dev/sda查看 4、挂载 mount /dev/…

5个精美的wordpress中文企业主题模板

元宇宙WordPress主题模板 简洁大气的元宇宙 Metaverse WordPress主题模板&#xff0c;适合元宇宙行业的企业官网使用。 https://www.jianzhanpress.com/?p3292 职业技术培训WordPress主题模板 简洁大气的职业技术培训WordPress主题&#xff0c;适合用于搭建教育培训公司官方…

3个wordpress中文企业主题模板

农业畜牧养殖wordpress主题 简洁大气的农业畜牧养殖wordpress主题&#xff0c;农业农村现代化&#xff0c;离不开新农人、新技术。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主题 浅绿色简洁实用的老年公寓wordpress主题&#xff0c;适合做养老业务的老年公…

37.仿简道云公式函数实战-数学函数-SIN

1. SIN函数 SIN 函数可用于计算角度的正弦值&#xff0c;返回 -1 到 1 之间的数值。 2. 函数用法 SIN(弧度) 使用该函数时&#xff0c;需要将角度转化为弧度参与计算&#xff0c;可通过 RADIANS 函数 将角度转化为弧度。 3. 函数示例 如计算 SIN(30) 的值&#xff0c;可设…

【linux进程间通信(二)】共享内存详解以及进程互斥概念

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程间通信 1. 前言2. 共享内…

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…

MLflow【部署 01】MLflow官网Quick Start实操安装、模型训练、数据预测(一篇学会部署使用MLflow)

一篇学会部署使用MLflow 1.版本及环境2.官方步骤Step 1 - Get MLflowStep 2 - Start a Tracking ServerStep 3 - Train a model and prepare metadata for loggingStep 4 - Log the model and its metadata to MLflowStep 5 - Load the model as a Python Function (pyfunc) an…

yolov5导出onnx转engine推理

yolov5导出注意事项 配置 需要提供配置文件和权重文件&#xff0c;不然导出模型不能正常推理。 默认提供检测头。 ModuleNotFoundError: No module named ‘tensorrt’安装TensorRT-python发现报错 由于ModuleNotFoundError: No module named ‘tensorrt’安装TensorRT-pyt…

备战蓝桥杯—— 双指针技巧巧答链表1

对于单链表相关的问题&#xff0c;双指针技巧是一种非常广泛且有效的解决方法。以下是一些常见问题以及使用双指针技巧解决&#xff1a; 合并两个有序链表&#xff1a; 使用两个指针分别指向两个链表的头部&#xff0c;逐一比较节点的值&#xff0c;将较小的节点链接到结果链表…

【学习iOS高质量开发】——协议与分类

文章目录 一、通过委托与数据源协议进行对象间通信1.委托模式2.要点 二、将类的实现代码分散到便于管理的数个分类之中1.如何实现2.要点 三、总是为第三方类的分类名称加前缀1.为什么总是为第三方类的分类名称加前缀2.要点 三、勿在分类中声明属性1.勿在分类中声明属性的原因2.…

OpenAI文生视频大模型Sora概述

Sora&#xff0c;美国人工智能研究公司OpenAI发布的人工智能文生视频大模型&#xff08;但OpenAI并未单纯将其视为视频模型&#xff0c;而是作为“世界模拟器” &#xff09;&#xff0c;于2024年2月15日&#xff08;美国当地时间&#xff09;正式对外发布。 Sora可以根据用户…

三维测量技术及应用

接触式测量&#xff08;Contact Measurement&#xff09;&#xff1a; 坐标测量机&#xff08;CMM, Coordinate Measuring Machine&#xff09;&#xff1a;通过探针直接接触物体表面获取三维坐标数据。优点是精度高&#xff0c;但速度慢&#xff0c;对软质材料测量效果不佳&am…

qt 软件发布(Windows)

1. 开发环境 QtCreator MSVC编译器 2. 源码编译 生成release或者debug版本的exe可执行文件(x64或x86) 3. windeployqt 打包 ①左下角开始菜单栏找到QT的命令交互对话框&#xff0c;如下图MSVC 2017 64-bit(根据第二步编译的类型选择64位或者32位)。 ②cd 切换到第二步可…

igolang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct