天地图(uniapp)搜索、定位自己、获取标记点的经纬度

server/2025/2/14 1:32:14/

目录

    • 参考文章
    • 需求
    • 最终效果预览(uniapp移动端)
    • 代码(uniapp移动端)

参考文章

https://blog.csdn.net/m0_67350312/article/details/138578174
https://blog.csdn.net/weixin_36152801/article/details/145037991
天地图接口文档

需求

1、获取某个位置经纬度
2、这个位置,可以通过搜索获取。例如搜索“天安门”,打点并获取其坐标
3、允许手动打点,因为天地图的搜索并不全面
4、可以导航到指定点(能用就行,天地图不好做实时导航,只能弄个样子)
5、之所以用天地图,就是因为免费。公司没有高德这种5w一年的商用服务(已经被高德书面警告过一次,不敢再搞了)
注:原本想做页面内的导航,但h5定位不准+天地图的导航没有高德的好(大家已经用惯了),多少有落差。所以就不做了

最终效果预览(uniapp移动端)

定位页面效果(locate.vue)

uniapp天地图

代码(uniapp移动端)

index.html

<script src="https://api.tianditu.gov.cn/api?v=4.0&tk=你的天地图key"></script>

config.js

export default {// 系统名称name: "xxxxxx",...接口配置,tiandimap_key: '你的天地图key',defaultLng: 116.40969, defaultLat: 38.89945
}

locate.vue
有个算距离的km,我注释掉了,没用上
在这里插入图片描述

<template><view class="container"><u-navbar back-text="返回" title="企业定位"></u-navbar><view id="mapDiv" style="width: 100%; height: 50%;"></view><view class="btn-groups"><u-input v-model="searchText" :border="true" maxlength="20" placeholder="输入企业名搜索" /><view class="btn" @click="search()">搜索</view><view class="btn" @click="locateMyself()">定位自己</view><view class="btn" @click="comfirm()">确定</view></view><view id="result" style="margin: 20px;"></view></view>
</template><script>import config from '@/config.js'export default {data() {return {searchText: '',longitude: null,latitude: null,localsearch: null,myCurrentLongitude: null,myCurrentLatitude: null,map: null}},onReady() {// 页面加载完成后初始化地图this.initMap();},methods: {initMap() {// 引入天地图API脚本const script = document.createElement('script');script.src = "http://api.tianditu.gov.cn/api?v=4.0&tk=" + config.tiandimap_key; // 替换为你的天地图密钥script.onload = () => {this.createMap();};document.body.appendChild(script);},createMap() {// 初始化地图this.map = new T.Map('mapDiv');this.map.centerAndZoom(new T.LngLat(config.defaultLng, config.defaultLat), 11); // 设置中心点和缩放级别// 添加点击事件监听this.map.addEventListener('click', (event) => {this.map.clearOverLays(); // 清空全部覆盖物const lngLat = event.lnglat; // 获取点击位置的经纬度this.longitude = lngLat.getLng()this.latitude = lngLat.getLat()console.log('经度:', lngLat.getLng(), '纬度:', lngLat.getLat());//创建标注对象var marker = new T.Marker(new T.LngLat(lngLat.getLng(), lngLat.getLat()));//向地图上添加标注this.map.addOverLay(marker);});//创建搜索对象this.localsearch = new T.LocalSearch(this.map, {pageCapacity: 10, //每页显示的数量onSearchComplete: this.localSearchResult //接收数据的回调函数})},comfirm() {if (!this.longitude || !this.latitude) {this.$toast('请先选择一个位置,再点【确定】')return null}// TODO 用接口保存经纬度信息},search() {if (!this.searchText) {this.$toast('请先输入内容')return null}this.localsearch.search(this.searchText, 4)},// 接收数据的回调函数localSearchResult(result) {//清空地图及搜索列表this.clearAll()//解析建议词信息this.suggests(result.getSuggests())},clearAll() {// map.clearOverLays()document.getElementById("result").innerHTML = ""document.getElementById("result").style.display = "none"},//解析建议词信息suggests(obj) {console.log(obj)if (obj) {//建议词提示,如果搜索类型为公交规划建议词或公交站搜索时,返回结果为公交信息的建议词。var divMarker = document.createElement("div");// 	// let km = this.getDistance(this.myCurrentLatitude, this.myCurrentLongitude, lonlatarr[1], lonlatarr[0])// 	suggestsHtml += ` <li data-lat=${lonlatarr[1]} data-lon=${lonlatarr[0]}>// 					<a class='dizhiname' data-lat=${lonlatarr[1]} data-lon=${lonlatarr[0]}>${obj[i].name}</div>// 					<div class='dizhichengshi' data-lat=${lonlatarr[1]} data-lon=${lonlatarr[0]}>${obj[i].address}</div>// 					</li>`// }const that = thisfor (let i = 0; i < obj.length; i++) {(function(i) {let a = document.createElement("a")a.href = "javascript://"a.innerHTML = `${obj[i].name}(${obj[i].address})`a.onclick = function() {that.map.clearOverLays(); // 清空全部覆盖物let lngLat = obj[i].lonlat.split(',')//创建标注对象var marker = new T.Marker(new T.LngLat(lngLat[0], lngLat[1]));that.longitude = lngLat[0];that.latitude = lngLat[1];//向地图上添加标注that.map.addOverLay(marker);that.map.centerAndZoom(new T.LngLat(lngLat[0], lngLat[1]), 15)}divMarker.appendChild(document.createTextNode((i + 1) + ". "))divMarker.appendChild(a)divMarker.appendChild(document.createElement("br"))})(i)}document.getElementById("result").appendChild(divMarker)document.getElementById("result").style.display = "block"} else {document.getElementById("result").style.display = "block"document.getElementById("result").innerHTML = '未查到信息'}},// 定位自己(不太准)locateMyself() {const that = thisthat.map.clearOverLays();var lo = new T.Geolocation();const fn = function(e) {if (this.getStatus() == 0) {that.map.centerAndZoom(e.lnglat, 15)var marker = new T.Marker(e.lnglat);that.map.addOverLay(marker);}if (this.getStatus() == 1) {that.map.centerAndZoom(e.lnglat, e.level)var marker = new T.Marker(e.lnglat);that.map.addOverLay(marker);}}lo.getCurrentPosition(fn);},//计算距离/*** 通过经纬度获取两点距离* @param lat1lng1* @param lat2lng2* @returns 距离单位 km*/getDistance(lat1, lng1, lat2, lng2) {const radLat1 = (lat1 * Math.PI) / 180.0const radLat2 = (lat2 * Math.PI) / 180.0const a = radLat1 - radLat2const b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0let s =2 *Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +Math.cos(radLat1) *Math.cos(radLat2) *Math.pow(Math.sin(b / 2), 2)))s *= 6378.137 // EARTH_RADIUS;s = Math.round(s * 100) / 100return s // 调用 return的距离单位为km}}};
</script><style lang="scss" scoped>.container {// display: flex;// justify-content: center;// align-items: center;height: 100%;background-color: #fff;.btn-groups {display: flex;.btn {display: flex;justify-content: center;align-items: center;color: #1890FF;background-color: #fff;border: 1rpx solid #1890FF;border-radius: 10rpx;font-size: 30rpx;text-align: center;width: 150rpx;}}}
</style>

http://www.ppmy.cn/server/167483.html

相关文章

Kafka因文件句柄数过多导致挂掉的排查与解决

一、问题现象 在k8s集群中部署了多个服务&#xff0c;包括Kafka、TDengine集群和Java等。这些服务使用NFS作为持久化存储方案。最近遇到了一个问题&#xff1a;Kafka频繁报错并最终挂掉。错误日志如下&#xff1a; 2025-02-09T09:39:07,022] INF0 [LogLoader partition__cons…

flutter本地推送 flutter_local_notifications的使用记录

flutter_local_notifications 效果 安卓配置(AndroidManifest.xml) <uses-permission android:name"com.android.alarm.permission.SET_ALARM"/> <uses-permission android:name"android.permission.SCHEDULE_EXACT_ALARM" /> <us…

PHP 中的除以零错误

除以零错误&#xff08;Division by zero&#xff09;是指数字除以零的情况&#xff0c; 这在数学上是未定义的。在 PHP 中&#xff0c;处理这种错误的方式取决于 PHP 版本&#xff1a; PHP 7&#xff1a; 使用 / 运算符会产生一个警告 (E_WARNING) 并返回 false。 使用 intd…

centos安装Nexus Repository OSS(Maven私服)

1. 下载链接&#xff1a;https://help.sonatype.com/en/download.html 2. 注意页面下载页面中的要求&#xff1a;JDK17&#xff08;启动时提示最低JDK1.8最高JDK17&#xff0c;但是使用JDK1.8无法正常启动&#xff09; 3. mkdir /opt/nexus 将压缩包上传到该目录并解压。 tar …

堆、方法区、虚拟机栈、本地方法栈 和 程序计数器

在 Java 中&#xff0c;内存区域是 JVM&#xff08;Java 虚拟机&#xff09;管理的关键部分&#xff0c;主要包括 堆、方法区、虚拟机栈、本地方法栈 和 程序计数器。这些内存区域各自有不同的职责&#xff0c;共同支持 Java 程序的运行。以下是它们的详细解释&#xff1a; 1. …

汇编知识点汇总

汇编的组成 汇编指令 数据处理指令 数据搬移指令数据位移指令位运算指令算术运算指令比较指令 跳转指令内存读写指令状态寄存器传送指令异常产生指令协处理器指令 伪操作 在程序编译过程中起到编译引导作用的内容 .text .global .if .else .endif 伪指令 不是汇编指令&…

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站&#xff0c;www.mnxz.fun&#xff08;当然现在没啥流量&#xff09; 为例&#xff0c;详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…

网络安全要学python 、爬虫吗

网络安全其实并不复杂&#xff0c;只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分&#xff1a;web安全和二进制逆向安全。web安全是网络安全的入门方向&#xff0c;内容简单&#xff0c;就…