Android Osmdroid + 天地图 (一)
Osmdroid + 天地图
- 前言
- 正文
- 一、配置build.gradle
- 二、配置AndroidManifest.xml
- 三、获取天地图的API Key
- ① 获取开发版SHA1
- ② 获取发布版SHA1
- 四、请求权限
- 五、显示地图
- 六、源码
前言
Osmdroid是一款完全开源的地图基本操作SDK,我们可以通过这个SDK去加一些地图API,比如腾讯、百度、高德、Google等等。天地图API也是一个地图服务提供商,不过之前还是提供Android的地图SDK的,现在就只提供了API服务了,那么为什么我们会想到这个天地图API呢?因为贫穷,贫穷使我们相遇,如果你是个人项目不上架的那种我推荐你使用高德、百度、腾讯3家,但如果你要上架的话就涉及到一个可能会被宰的问题了,这3家商业授权都是5万一年,那不是开玩笑的,如果你的应用不是主导地图的话,完全犯不上去使用,下面我们进入正文去使用天地图API,效果图如下所示:

正文
点击天地图API进入,之后完成注册登录及个人或企业开发者的认证工作,然后就到了喜闻乐见的创建Android项目的环节了。
一、配置build.gradle

这里我们就使用Empty Views Activity的模板,点击Next。

修改一下项目名和包名,这个包名在下面的获取API Key要用到的,注意这里的构建配置语言也是Kotlin的,如果你不习惯,请改成Groovy,然后运行能看到Hello World!即可。
因为我们需要使用OsmdroidSDK库,所以我们现在app模块下的build.gradle.kts文件中导入如下代码:
implementation("org.osmdroid:osmdroid-android:6.1.20")
这个库在mavenCentral()下,然后再配置viewBinding,代码如下所示:
buildFeatures {viewBinding = true}
上述代码配置如下图所示:

二、配置AndroidManifest.xml
因为用到地图自然就涉及到定位,还有API的使用就涉及到网络,而网络从Android8.0之后就默认是https请求方式,如果需要http的话则配置一下,针对上述的3个要求,我们首先配置一下权限,在AndroidManifest.xml中增加如下代码:
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
然后在res下的xml目录下创建一个network_security_config.xml文件里面代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /></trust-anchors></base-config>
</network-security-config>
这个文件的配置内容就是允许http访问,我们需要在AndroidManifest.xml中的application标签中进行配置,如下所示:
android:networkSecurityConfig="@xml/network_security_config"
上述的配置如下图所示:

三、获取天地图的API Key
相信你已经完成了我前面讲到的工作了,那么进入控制台,点击创建新应用。

可以看到这里我们需要发布版SHA1、开发版SHA1和包名,包名我们创建项目的时候就有了。
① 获取开发版SHA1
首先我们来说明一下开发版SHA1的获取方式,刚才我们运行过了,下面使用快捷键Win+R,输入cmd,进入命令窗口,输入
cd .android
回车,然后输入
keytool -list -v -keystore debug.keystore
回车,会让你输入密码,密码就是android,输入后回车就看到一大串信息,其中就有我们SHA1,注意我们使用的是debug.keystore,所以得到的就是开发版SHA1,这个值在不同的电脑上就不一样,请注意。

复制一下粘贴过去即可。
② 获取发布版SHA1
下面来获取发布版SHA1,这个稍微麻烦一点,我们需要先生成一个APK。

点击Build➡️Generate Signed App Bundle/ APK...

这里选择APK,点击Next。

点击Create new...

可以参考我这个方式去设置,这里我的两个密码都是一样的,你可以不一样,前提是你记得住,需要注意是的这个jks文件生成的位置,我是直接生成到项目的目录下了,点击OK。

勾选上Remeber passwords,点击Next。

点击Create等待生成APK。

当你在AS的右下角看到这个弹窗时,表示生成APK成功了,切换到Project模式查看一下,如下图所示:

下面就是正式获取发布版SHA1的过程了,本来上面这一大串我是不想写的,但是又考虑到是小白的话,就还是写了,点击AS底部的Terminal,打开后默认就是当前项目的目录,然后我们只要输入
keytool -list -v -keystore .\openMap.jks
keytool -list -v -keystore后面的是你的jks的文件路径,如果你不是我这么配置的请写自己的实际路径,然后回车,输入密码再回车即可看到发布版SHA1,如下图所示:

下面回到天地图那个网页,此时我们已经填好了所有需要的值。

点击提交,就是提示创建成功,如果提示创建失败的话,你再点一次,有网络延迟的问题。创建成功就得到了我们访问天地图的Key了,如下图所示:

这个Key我们在项目中需要用到的,我们可以在com.llw.openmap下创建一个Config类,这里面配置这个Key,代码如下所示:
object Config {const val MAP_KEY = "f951c7d1b85975379f6ee20bb264abba"
}
四、请求权限
进入MainActivity,增加代码如下所示:
// 定位权限private val permissions = arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.WRITE_EXTERNAL_STORAGE,android.Manifest.permission.READ_EXTERNAL_STORAGE)// 权限申请private val permissionLauncher =registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->if (!result.containsValue(false)) initMap() else requestPermission()}
首先我们定义了定位权限和权限请求返回,使用ActivityResult API的方式,然后我们需要写initMap()和checkPermission()函数,代码如下所示:
/*** 初始化地图*/private fun initMap() {}/*** 检查权限*/private fun checkPermission() {permissions.forEach { permission ->if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {// 请求权限requestPermission()return}}// 初始化地图initMap()}/*** 请求权限*/private fun requestPermission() {permissionLauncher.launch(permissions)}
最后我们在onResume()生命周期中检查权限,调用checkPermission(),代码如下所示:
override fun onResume() {super.onResume()// 检查权限checkPermission()}
目前为止整个页面代码如下图所示:

为什么我要贴图呢,因为是真的有人把代码写错位置,然后问我为什么报错?现在我们运行一下,你会发现弹窗请求权限,同意之后会看到都是格子,因为我们还没有加载地图API的,这里我们就要加载天地图。
五、显示地图
要显示地图就需要用到Osmdroid了,在Config中添加如下代码:
// 默认GeoPointval defaultGeoPoint = GeoPoint(39.909, 116.39742)/*** 天地图 有标注电子地图*/var TDTCIA_W: OnlineTileSourceBase = object : XYTileSource("Tian Di Tu CIA",0, 20, 256, "",arrayOf("http://t0.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t1.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t2.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t3.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t4.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t5.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t6.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t7.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY")) {override fun getTileURLString(pMapTileIndex: Long) =("$baseUrl&X=${MapTileIndex.getX(pMapTileIndex)}&Y=${MapTileIndex.getY(pMapTileIndex)}&L=${MapTileIndex.getZoom(pMapTileIndex)}")}
添加了一个默认的经纬度坐标,然后通过Osmdroid去加载天地图的在线瓦片资源,然后回到MainActivity,这里首先我们用上ViewBinding,代码如下所示:
private lateinit var binding: ActivityMainBinding
然后在onCreate中配置代码,如下所示:
binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)
位置如下图所示:

下面进入initMap()中去配置地图,代码如下所示:
private fun initMap() {binding.mapView.apply {setTileSource(Config.TDTCIA_W) // 设置瓦片地图资源minZoomLevel = 5.0 // 最小缩放级别maxZoomLevel = 20.0 // 最大缩放级别isTilesScaledToDpi = true // 图块是否缩放到 DPI// 设置默认的地图中心点controller.apply {setZoom(12.0)setCenter(Config.defaultGeoPoint)}zoomController.setVisibility(Visibility.NEVER)setMultiTouchControls(true)overlayManager.tilesOverlay.isEnabled = true}}
下面可以运行一下,我从头开始运行一下:

虽然可能效果不是特别好,但是起码是个地图啊,免费的你还要什么自行车。
六、源码
如果对你有所帮助的话,不妨欢迎Star和Fork。
源码地址:OpenMap
APK下载地址:OpenMap1.0.apk
相关文章:
Android Osmdroid + 天地图 (一)
Osmdroid 天地图 前言正文一、配置build.gradle二、配置AndroidManifest.xml三、获取天地图的API Key① 获取开发版SHA1② 获取发布版SHA1 四、请求权限五、显示地图六、源码 前言 Osmdroid是一款完全开源的地图基本操作SDK,我们可以通过这个SDK去加一些地图API&am…...
浅谈:基于三维场景的视频融合方法
视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 , 现实的漫游效果不是从摄像机的角度来看 , 但其仍然存在很多困难 。基于三维场景的视频融合 , 因其直观等特效在视频监控等相关领域有着…...
PostgreSQL序列:创建、管理与高效应用指南
一、引言 在PostgreSQL中,序列(Sequence)是一种用于生成唯一标识符的数据库对象。它们常常被用于为主键字段提供连续且唯一的值,特别是在创建新记录时。序列提供了一种机制,能够确保每次调用都能返回一个唯一的值&…...
部署安装jdk8\redis\mysql8\nginx
安装jdk8 linux安装jdk8详细步骤_linux jdk8安装-CSDN博客 安装redis 安装redis 后台启动命令 cd /ra/redis-6.0.0/src ./redis-server --daemonize yes安装mysql8.0(自定义目录安装) 1、创建自己的mysql-8.0,解压mysql安装包 tar -zxv…...
重要通知:Sedex 旧平台即将关闭
我们正在对 Sedex 平台进行一些重要更新,这些更新将更好地提升您的用户体验。 作为更新计划的⼀部分,我们将在 2025 年 2 ⽉关闭 Sedex Advance 平台(即,Sedex 旧平台)。旧平台的⼀些功能将转移到当前的平台上。这些改…...
Windows配置NTP时间同步
Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具:w32tm3.2 控制面板中的设置 4. 高级设置(Windows Server 环境)5.调整时间同步的间隔5.1 通过组策略调整时…...
学Linux的第八天
目录 管理进程 概念 程序、进程、线程 进程分类 进程前后台调用 查看进程 ps命令 unix 风格 bsd风格 GNU风格 top命令 格式 统计信息区 进程信息区:显示了每个进程的运行状态 kill命令 作用 格式 管理进程 概念 程序、进程、线程 程序&#x…...
2024IJCAI | MetalISP: 仅用1M参数的RAW到RGB高效映射模型
文章标题是:《MetaISP:Effcient RAW-to-sRGB Mappings with Merely 1M Parameters》 MetaISP收录于2024IJCAI,是新加坡国立大学(Xinchao Wang为通讯作者)和华为联合研发的新型ai-isp。 原文链接:MetaISP 【1】论文的…...
aws-athena查询语句总结
完全归于本人mysql语句小白,是一点也写不出来,故汇总到此 1. cloudtrail ## 查询事件排序 SELECT eventname,eventtime,count(eventname) as num FROM your_athena_tablename where eventtime between 2024-11-10 and 2024-11-11 group by eventname…...
电信网关配置管理后台 upload_channels.php 任意文件上传漏洞复现
0x01 产品描述: 电信网关配置管理后台是用于管理和配置电信网关的设备,提供了一系列功能来帮助用户监控和管理网络设备。以下是电信网关配置管理后台的主要功能和操作方法。0x02 漏洞描述: 电信网关配置管理系统/bak_manager/upload_channels.php 接口存在文件上传…...
Vue全栈开发旅游网项目(11)-用户管理前端接口联调
联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址:src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…...
react 中 useContext Hook 作用
useContext是一个用于在组件之间共享数据的重要钩子函数 一、跨组件数据共享 1. 简化多层级组件数据传递 例如:在一个具有多层级菜单结构的应用中,如果要将用户权限数据从根组件传递到最深层的菜单项组件,可能需要经过多个中间组件的 prop…...
【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)
从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…...
前 K 个高频元素
前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1]提示: 1 < nums.le…...
【ubuntu】Geogebra
Geogebra 几何作图工具 是一款跨平台的几何作图工具软件, 目前已经覆盖了, windows,android, mac, linux 等操作系统。 Ubuntu 现状 Ubuntu 自带应用市场 Ubuntu 自带应用市场目前只有 Geogebra 4.0 版本, 不能画立…...
vue2和vue3的区别详解
vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…...
一文读懂LEED绿建
LEED绿建,即获得LEED(Leadership in Energy and Environmental Design)认证的建筑,是一个旨在提高建筑环境性能和健康性能的评估体系。以下是对LEED绿建的详细解读: 一、LEED体系概述 定义:LEED是由美国绿…...
git上feature合并到development分支
git上从development分支拉了一个feature分支开发新内容,development也有新内容在开发,feature分支内容开发完毕后,如何合并feature分支新内容到development分支,要确保不会覆盖development分支的新内容 以下是将 feature 分支的新…...
NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备:大华IPC摄像头局域网访问异常解决办法
在当今社会,安全监控已成为各类场所不可或缺的一部分。无论是家庭、学校、商业场所还是公共场所,安全监控设备都扮演着至关重要的角色。在众多监控品牌中,大华IPC摄像头凭借其高清画质、强大功能和卓越稳定性,赢得了市场的广泛认可…...
校园二手交易网站毕业设计基于SpringBootSSM框架
目录 一、引言 二、需求分析 2.1用户需求分析 2.1.1学生用户 2.1.2管理员 2.2系统功能需求 2.3系统非功能需求 2.4技术需求 2.4.1 技术选择 2.4.2系统架构 三、详细设计 3.1系统架构设计 3.2前端设计 3.3后端设计 3.4数据库设计 本文介绍…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
