前端开发中地图定位与距离计算的应用实践

前端开发中地图定位与距离计算的应用实践

在前端开发中,地图功能的应用日益广泛,无论是用户位置的定位、目标距离的计算,还是地址的解析与展示,地图都发挥着不可替代的作用。本文将重点介绍前端开发中实现地图定位、距离计算以及地址解析的方法,并以腾讯地图API为例,详细解析其在前端实践中的应用。

一、地图定位功能的实现

前端实现地图定位主要依赖于浏览器的地理位置API以及地图服务提供商的API。在Vue框架中,我们可以使用<map>组件来嵌入地图,并通过设置经纬度来定位地图的中心点。例如,通过:latitude:longitude属性绑定,我们可以将地图中心定位到指定的位置。

同时,为了提升用户体验,我们通常会开启定位功能,让用户能够直接看到自己当前的位置。这可以通过调用浏览器的地理位置API来实现,但需要注意的是,用户需要授予权限才能进行定位。

二、距离计算的实现

在前端开发中,计算当前定位离目标位置的距离是一个常见的需求。这通常涉及到地理坐标的计算,包括经纬度之间的距离计算。我们可以利用Haversine公式或者球面三角法来计算两点之间的距离。

以Haversine公式为例,该公式可以根据地球上两个点的经纬度计算出它们之间的大圆距离。在前端开发中,我们可以封装一个函数来实现这一功能,传入两个点的经纬度坐标,即可得到它们之间的距离。

三、腾讯地图API的应用

腾讯地图API提供了丰富的地图服务,包括地图展示、定位、搜索、路线规划等。在前端开发中,我们可以利用腾讯地图API来实现更加丰富的地图功能。

其中,经纬度反向编码解析地址是腾讯地图API的一个重要功能。通过调用API接口,并传入经纬度坐标,我们可以得到对应的地址信息,包括省、市、区、街道等详细信息。这对于前端开发中的地址展示和位置识别非常有用。

四、实践案例

下面是一个简单的实践案例,展示了如何在Vue项目中使用腾讯地图API实现地图定位、距离计算和地址解析功能。

首先,我们需要在项目中引入腾讯地图API的SDK,并在Vue组件中初始化地图实例。然后,通过调用API接口获取用户的位置信息,并在地图上展示定位点。接着,我们可以利用Haversine公式计算用户位置与目标位置之间的距离,并在界面上展示。最后,通过调用腾讯地图API的经纬度反向编码接口,我们可以解析出目标位置的详细地址信息。

<template><view class="content"><scroll-view class="scrollV" scroll-y="true"><view class="inputView"><text class="leftTitle">活动内容</text></view><view class="inputView">{{"去清远古龙峡漂流"}}</view><view class="inputView"><text class="leftTitle">签到须知</text></view><view class="inputView">{{'距离活动地10km内可签到成功'}}</view><!-- App端:manifest.json的“App模块配置”中勾选“Maps(地图)”,并根据项目实际情况勾选使用的三方地图SDK:https://uniapp.dcloud.net.cn/tutorial/app-maps.html#H5端: 使用地图和定位相关,需要在 manifest.json 内配置腾讯或谷歌等三方地图服务商申请的秘钥(key)。高德地图需要额外配置 securityJsCode 或 serviceHost,若是微信小程序只需配置微信小程序权限配置):page.json配置以下// 权限设置"permission": {"scope.userLocation": {"desc": "您的位置信息将用于该活动签到"}}--><!-- scale缩放级别,取值范围为3-20 longitude:地图中心精度 latitude:地图中心纬度 markers:覆盖物 show-location:是否显示定位--><map class="mapV" :latitude="infoDict.lat" :longitude="infoDict.lon" scale='6' :markers="covers"show-location=false></map></scroll-view><view class="btnview" @tap="goSignIn">{{'签到' + distanceStr}}</view></view>
</template>

<script>import Vue from 'vue'export default {data() {return {// 覆盖物covers: [],// 目标经纬度信息infoDict: {'lon': '113.17','lat': '23.8'},// 我的定位经纬度信息myPinInfo: {},// 默认距离为负数distance: -9999,distanceStr: ''}},onShow() {// 获取当前位置this.getlocation();},methods: {getlocation() {let myThis = this;console.log('获取位置开始');uni.getLocation({type: 'gcj02',success: function(res) {myThis.myPinInfo = res;console.log('当前位置的经度:' + res.longitude);console.log('当前位置的纬度:' + res.latitude);myThis.covers = [{latitude: myThis.infoDict.lat,longitude: myThis.infoDict.lon,width: 30,height: 30,id: 20000,iconPath: '../../static/activity_pin.png'},{latitude: myThis.myPinInfo.latitude,longitude: myThis.myPinInfo.longitude,width: 30,height: 30,id: 20001,iconPath: '../../static/people_pin.png'}];myThis.distance = myThis.getDistance(myThis.infoDict.lat, myThis.infoDict.lon, myThis.myPinInfo.latitude, myThis.myPinInfo.longitude)myThis.distanceStr = '(当前距离' + myThis.distance + '米)';}});},// 计算两点距离getDistance(lat1, lng1, lat2, lng2) {let EARTH_RADIUS = 6378.137;let radLat1 = this.rad(lat1);let radLat2 = this.rad(lat2);let a = radLat1 - radLat2;let b = this.rad(lng1) - this.rad(lng2);let 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 = s * EARTH_RADIUS;//s = Math.round(s * 10000d) / 10000d;s = Math.round(s * 10000) / 10000;s = s * 1000; //乘以1000是换算成米return s;},// 弧度计算rad(d) {return d * Math.PI / 180.0;},// 立即签到goSignIn(e) {if (this.distance > 10000) {uni.showModal({title: '温馨提示',content: '您的当前位置距离活动目的地太远, 无法签到',showCancel: false})return;} else if (this.distance < 0) {uni.showModal({title: '温馨提示',content: '您的定位权限未打开, 请点击小程序右上角···菜单按钮, 然后点击设置,打开定位权限',showCancel: false})return}},}}
</script>

五、总结与展望

前端开发中地图功能的应用不仅提升了用户体验,也为开发者提供了更多的可能性。通过合理利用地图服务提供商的API,我们可以实现丰富的地图功能,满足各种业务需求。

未来,随着前端技术的不断发展和地图服务的不断完善,我们相信地图在前端开发中的应用将会更加广泛和深入。同时,我们也期待更多的开发者能够参与到地图开发的行列中来,共同推动前端技术的发展和创新。

小程序体验地址(已上线)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署前后端分离项目

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftWindow.cs using UnityEngine.UI; using TMPro; using UnityEngin…

CentOS7.9创建本地yum源操作步骤报错解决方法

1.基础信息 CentOS7.9-mini最小化安装的系统&#xff0c;在离线安装rpm时候需要大量依赖&#xff0c;需要花费大量时间去查找依赖包。受于环境限制无法接入互联网使用公开yum源&#xff0c;于是便有了搭建本机yum源的想法&#xff0c;在网上下载CentOS7.9标准版“CentOS-7-x86_…

windows 系统下 mysql 数据库的下载与安装(包括升级安装)

windows 系统下 mysql 数据库的下载与安装&#xff08;包括升级安装&#xff09; 一、mysql 介绍&#xff1a; MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。 MySQL 是最流行的关系型数据库管理系统之一&#xf…

pyqt5 QScrollArea组件

本示例中&#xff0c;演示了QScrollArea的使用&#xff0c;以及QScrollBar的样式设定&#xff0c;在代码中使用setStyleSheet设置样式&#xff0c;记得要优先设置scrollArea&#xff0c;再设置窗口的样式&#xff0c;不然QScrollBar的样式会不起作用&#xff0c;使用QSS设置没有…

hadoop103: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

分析&#xff1a; 在启动hadoop服务的时候&#xff0c;遇到了这个问题&#xff1a; hadoop103: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 这个一看就是&#xff0c;密钥问题 于是ssh 主机名就行测试 需要输入密码&#xff0c;就说明这里有问…

A Note on LoRA

A Note on LoRA 摘要Additional InsightsPractical ImprovementsLooking Ahead 摘要 LoRA已成为一种首选的方法&#xff0c;用以高效地适应大型语言模型&#xff08;LLM&#xff09;&#xff0c;其简便性和有效性令人瞩目。本文档扩展了原始LoRA论文&#xff0c;提供了最初未讨…

MySQL进阶之(七)EXPLAIN 详解

七、EXPLAIN 详解 7.1 查询性能那些事7.1.1 查看系统性能参数7.1.2 统计 SQL 的查询成本7.1.3 定位执行慢的 SQL&#xff1a;慢查询日志01、开启慢查询日志参数02、关闭慢查询日志03、删除慢查询日志 7.1.4 查看 SQL 执行成本&#xff1a;SHOW PROFILE 7.2 EXPLAIN 语句输出中各…

java程序 .exe启动nginx防止重复启动,已解决

java代码生成好的.exe启动nginx服务程序 根据nginx占用端口来解决nginx服务重复启动问题&#xff08;下面代码了解代码逻辑后根据自己的业务需求修改即可&#xff09; 代码&#xff1a; package org.example;import javax.swing.*; import java.awt.*; import java.io.*; …

蓝桥杯——16

学习视频&#xff1a;17-深搜的剪枝策略视频讲解_哔哩哔哩_bilibili #include<iostream> #include<cstring> using namespace std; int n, m; string maze[110]; bool vis[110][110]; int dir[4][2] { {0,1},{0,-1},{1,0},{-1,0} }; int ans 100000; bool in(in…

利用Python ARM网关仓储物流AGV小车控制器

在现代智慧物流体系中&#xff0c;高效的信息管理系统是物流中心实现精准跟踪货物、科学管理库存及优化配送路线的关键环节。通过采用ARM架构的工控机或网关&#xff0c;并结合Python的二次开发能力&#xff0c;可以有效集成并强化物流管理系统的数据处理与通信功能&#xff0c…

基于springboot+vue实现的的成人教育教务系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

2024年河北省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;775454947 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技能提升&#xff0c;受赋能的客户院校均…

jvm中jdk常用的几个命令总结

1.jmap 此命令可以用来查询内存信息&#xff0c;实例个数及占用内存大小 1.1 查看堆内存概要信息&#xff08;内存分配统计&#xff09; jmap -histo[:live] <pid> .-histo&#xff1a;显示堆中对象的统计信息&#xff0c;包括每个类的实例数量、占用内存大小等 :live…

Redis高级-分布式缓存RDB原理

分布式缓存 1.1.2.RDB原理 bgsave开始时会fork主进程得到子进程&#xff0c;子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。 fork采用的是copy-on-write技术&#xff1a; 当主进程执行读操作时&#xff0c;访问共享内存&#xff1b;当主进程执行写操…

MT3022 召唤神龙

思路&#xff1a;二分答案 。check():检查组p套卡是否成立&#xff0c;即检查r卡是否足够组成p套卡。 &#xff08;易错点&#xff1a;check的思路&#xff0c;开long long&#xff09; #include <bits/stdc.h> using namespace std; long long int n, m; long long int…

ht1622不显示无反应问题解决

如果你正在写ht1622 驱动时&#xff0c;怎么看程序都没问题&#xff0c;抓取波形&#xff0c;示波器分析波形&#xff0c;如果都没有问题&#xff0c;那么很大可能是硬件问题&#xff0c;检测看看 ht1622 RD是不是接地了。 RD 低会进入读取模式&#xff0c;所以不用RD 请将RD悬…

Docker篇(二)— Docker架构介绍

目录 一、Docker和虚拟机的区别二、Docker架构镜像和容器DockerHubDocker架构 小结 一、Docker和虚拟机的区别 Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机&#xff0c;也能在一个操作系统中&#xff0c;运行另外一个操作系统&#xff0c;保…

IntelliJ IDEA 2024 for Mac/Win:引领Java开发新纪元的高效集成环境

在日新月异的软件开发领域&#xff0c;一款高效、智能的集成开发环境&#xff08;IDE&#xff09;无疑是程序员们不可或缺的神兵利器。今天&#xff0c;我要为大家介绍的&#xff0c;正是这样一款集大成之作——IntelliJ IDEA 2024。无论是Mac用户还是Windows用户&#xff0c;只…

在vite中限制node版本

1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…