免费的 H5/PC 地图打卡 —— 功能代码及实现指南/功能代码已上传

在本文中,我们将通过天地图(Tianditu)实现一个简单的 H5/PC 版地图打卡功能。通过实时获取用户的位置,检测其与打卡点的距离,来决定是否可以完成打卡。代码已上传,本文将逐步介绍如何实现这一功能。

效果图:

准备工作

**天地图(Tianditu)**是一款提供免费使用的在线地图服务,适用于 H5 和 PC 端,且提供了详细的 API 文档和丰富的功能支持。在开发中,我们使用了天地图 API 来完成地图展示和用户位置打卡功能。

申请天地图 API Key

首先,进入天地图官网申请 API Key,这是使用天地图服务的必需步骤。申请完成后,记下你的 Key,稍后会在代码中用到。

加载天地图资源

一旦获取到 API Key,接下来我们将使用该 Key 来加载天地图的外部资源。将下面的代码直接复制到你的项目中,并替换为你申请的 Key:

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

实现步骤

我们将从地图的初始化开始,逐步构建打卡功能。

1. 初始化项目结构

在项目中,我们使用了 Vue.js 来构建前端页面。以下是最基本的 Vue 组件结构,包含地图容器以及打卡按钮。

<template><view><div id="mapDiv" style="position: absolute; width: 100%; height: 93%"></div><div class="dkBtn" @click="test">打卡</div></view>
</template>

在这个结构中,#mapDiv 用于显示天地图,而 .dkBtn 则是打卡按钮。

2. 使用 VConsole 调试工具

为了方便在移动端进行调试,我们引入了 VConsole:

<script module="vconsole" lang="renderjs">  import VConsole from 'vconsole'  new VConsole();  
</script>

VConsole 是一个轻量级的移动端开发调试工具,方便我们在手机浏览器上查看日志输出。

3. 引入 Proj4 库处理坐标系转换

由于天地图使用的是 CGCS2000 坐标系,而设备默认的 GPS 使用 WGS84 坐标系,因此我们需要用 proj4 库进行坐标转换。

import proj4 from 'proj4';const WGS84 = '+proj=longlat +datum=WGS84 +no_defs';
const CGCS2000 = '+proj=longlat +datum=CGCS2000 +no_defs';

proj4 库帮助我们将 WGS84 转换为 CGCS2000 坐标,使用户的位置能正确显示在天地图上。

4. 组件数据和生命周期管理

接下来定义数据和生命周期钩子,用于加载地图并定时获取用户位置:

export default {name: "MapComponent",data() {return {map: null,zoom: 17,timer: null,user: {userLng: null,userLat: null},userMarker: null, // 保存用户位置的标记};},mounted() {this.loadScript().then(() => {this.initMap();this.timer = setInterval(() => {this.getLocation();}, 1000); // 每秒获取一次用户位置}).catch((error) => {console.error("加载天地图脚本失败:", error);});},beforeDestroy() {clearInterval(this.timer); // 清除定时器,避免内存泄漏},
};

mounted 生命周期钩子中,我们加载了天地图的脚本,并在地图初始化后每秒获取一次用户位置。

5. 获取用户位置并更新地图标记

使用浏览器的 Geolocation API 获取用户的 WGS84 坐标,再转换为 CGCS2000 坐标并在地图上更新标记。

getLocation() {if (navigator.geolocation) {navigator.geolocation.getCurrentPosition((position) => {const userLng = position.coords.longitude;const userLat = position.coords.latitude;// 转换为 CGCS2000 坐标const cgcs2000Coordinates = proj4(WGS84, CGCS2000, [userLng, userLat]);this.user.userLng = cgcs2000Coordinates[0];this.user.userLat = cgcs2000Coordinates[1];const centerPoint = new T.LngLat(this.user.userLng, this.user.userLat);if (this.userMarker) {this.map.removeOverLay(this.userMarker); // 清除之前的标记}// 添加新的用户位置标记this.userMarker = new T.Marker(centerPoint);this.map.addOverLay(this.userMarker);}, (error) => {console.error("获取位置失败:", error);});} else {console.log("浏览器不支持获取地理位置");}
},

6. 实现打卡功能

打卡功能的核心是检测用户与目标打卡点的距离。如果用户在 200 米范围内,则允许打卡。

test() {const userPosition = new T.LngLat(this.user.userLng, this.user.userLat);const centerPoint = new T.LngLat(117.0953, 31.833); // 预设打卡点const distance = this.map.getDistance(centerPoint, userPosition); // 计算距离if (distance <= 200) {uni.showToast({title:"打卡成功"});} else {uni.showToast({title:"未在打卡范围内"});}
},

通过 T.Map 提供的 getDistance 方法,我们可以轻松计算用户与打卡点的距离,并通过判断是否小于 200 米来确定是否成功打卡。 

7. 加载天地图脚本

通过动态加载天地图的 API 脚本,可以更灵活地处理地图功能的初始化。

loadScript() {return new Promise((resolve, reject) => {const script = document.createElement("script");script.src = "https://api.tianditu.gov.cn/api?v=4.0&tk=你的key值";script.onload = resolve;script.onerror = reject;document.head.appendChild(script);});
},

8. 地图初始化与标记

在地图初始化时,我们会在中心点添加一个标记,并创建 200 米的打卡范围:

initMap() {this.map = new T.Map("mapDiv");const centerPoint = new T.LngLat(117.0953, 31.833);this.map.centerAndZoom(centerPoint, this.zoom);this.map.enableScrollWheelZoom();this.addMarkerWithLabel(centerPoint, "打卡点");
},

结语

通过天地图的免费 API 和 Vue.js 框架,我们可以轻松实现一个 H5/PC 端的打卡功能。本项目中的关键功能包括用户位置获取、坐标转换、距离计算和地图标记等,适用于需要位置打卡功能的业务场景。

github地址:https://github.com/dashen-lvweijie/tian-map-demo.git

代码已上传,欢迎交流和优化。

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

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

相关文章

EDI简化,两剂初免效果好

EDI简化&#xff0c;两剂初免效果好 大家好&#xff0c;疫苗是防控传染病的重要工具。但对于一些如HIV等病原体&#xff0c;有效疫苗的研发仍面临诸多挑战。在疫苗接种中&#xff0c;生发中心起着关键作用。近期研究表明——《Two-dose priming immunization amplifies humoral…

[数据集][目标检测]基于yolov5增强数据集算法mosaic来扩充自己的数据集自动生成增强图片和对应标注无需重新标注

【算法介绍】 YOLOv5最引人注目的增强技术之一是马赛克增强&#xff0c;它将四张不同的图像拼接成一张图像。 思路&#xff1a;首先&#xff0c;从数据集中随机选择四张图像&#xff0c;然后将它们缩放、随机裁剪&#xff0c;并按马赛克模式拼接在一起。这种方式允许模型看到…

为什么AI不会夺去软件工程师的工作?

▼ 自从AI大模型爆火以来&#xff0c;我每天的工作中&#xff0c;已经有大量的真实代码是通过AI完成的。人工智能辅助下的编程&#xff0c;确实大幅减轻了我的工作负担&#xff0c;大大提高了生产力。 大语言模型是如此成功&#xff0c;以至于无可避免地在开发者社区中引起了…

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录 抽象工厂模式 思维导图 接口&#xff08;抽象类&#xff09; 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 &#xff08;1&#xff09;产品接口&#xff0c;生成具体人物 &#xff08;2&#xff09;武器接口&#xff0c;生成具体…

mapboxGL 离线部署或者说去除token最简单得方法

找到本项目中得node_modules包管理器中得mapbox-gl包 找打dist文件夹下得mapbox-gl-dev.js 相比于mapbox-gl.js得压缩文件 mapbox-gl-dev.js没有压缩&#xff0c;好修改&#xff0c;也无需要编译 在mapbox-gl-dev.js找到 this._authenticate()&#xff0c;注释或者去除即可 最…

【Proteus仿真】基于51单片机的简易电压表制作(可串口远程调控)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;设计一个简易电压表&#xff1a; 采用3位LED数码管显示被测电压值&#xff1a;基本测量范围是 0-5V&#xff1b;测量误差为士0.02V。开机或复位后&#xff0c;在 LED 最…

三角型电动采光排烟天窗的高效排烟设计优势

三角型电动采光排烟天窗的排烟效果在多个方面均展现出了显著的优势&#xff0c;主要体现在以下几个方面。一、设计原理与结构特性 三角型电动采光排烟天窗采用三角形构造&#xff0c;这种设计在结构上具有显著的稳定性&#xff0c;能够抵御不同气候条件及风压的影响。同时减少了…

网站建设合同怎么写

网站建设合同成为企业与网站开发服务提供商之间不可或缺的法律文书。一份明晰而全面的网站建设合同不仅有助于规范双方权责&#xff0c;还能有效防范潜在的合同纠纷。以下是一份网站建设合同的范本&#xff0c;旨在提供参考。 一、合同双方信息 甲方&#xff08;委托方&#x…

QT| “无法粘贴窗口部件”错误以及customplot安装使用

“无法粘贴窗口部件”错误以及customplot “无法粘贴窗口部件”错误customplot下载添加到项目中使用QCustomPlot常用的代码 “无法粘贴窗口部件”错误 情景&#xff1a;使用QT设计界面&#xff0c;很多部分比较类似&#xff0c;可以复制另一个界面的ui&#xff0c;但是粘粘的时…

TS-AI:一种用于多模态个体化脑区划分的深度学习管道,并结合任务对比合成|文献速递-Transformer架构在医学影像分析中的应用

Title 题目 TS-AI: A deep learning pipeline for multimodal subject-specific parcellation with task contrasts synthesis TS-AI&#xff1a;一种用于多模态个体化脑区划分的深度学习管道&#xff0c;并结合任务对比合成 01 文献速递介绍 人类大脑在结构和功能组织上表…

武汉正向科技 格雷母线检测方式 :车检,地检

正向科技|格雷母线原理运用-车检&#xff0c;地检 地上检测方式 地址编码器和天线箱安装在移动站上&#xff0c;通过天线箱发射地址信号&#xff0c;地址解码器安装在固定站&#xff08;地面&#xff09;上&#xff0c;在固定站完成地址检测。 车上检测方式 地址编码器安装在…

单域名、多域名、通配符SSL证书,该如何选择?

随着《网络安全法》《数据安全法》相关法律法规的发布&#xff0c;履行数据保护义务&#xff0c;做好数据安全保护是每个企业的重要工作。其中&#xff0c;SSL证书作为企业网站实现HTTPS加密保护数据传输安全的必备措施&#xff0c;根据域名保护数量&#xff0c;可以分为单域名…

拼团活动开发秘籍:PHP+Redis实现暂存成团信息,提升效率!

在用户发起成团&#xff0c;与用户入团时需要保存其成团信息&#xff08;主要是活动id与团长、团员openid&#xff09;&#xff0c;暂存在redis中&#xff0c;后期需要保存到sql中&#xff0c;以便查询。 tuan_redis.php<?php include_once(/opt/*****ub/redis.php);//red…

Java语言程序设计基础篇_编程练习题**18.35(H 树分形)

目录 题目&#xff1a;**18.35(H 树分形) 代码示例 代码解释 输出结果 题目&#xff1a;**18.35(H 树分形) 一个H 树分形(本章开始部分介绍过&#xff0c;如图18-1)如下定义: 1)从字母H开始。H的三条线长度一样&#xff0c;如图 18-1a 所示。 2)字母H(以它的 sans-serif …

若依vue3.0表格的增删改查文件封装

一、因若依生成的文件没进行封装&#xff0c;维护起来比较麻烦。所以自己简单的进行封装了一下 gitee代码&#xff08;文件&#xff09;地址&#xff1a;https://gitee.com/liu_yu_ting09/ruo_yi.git 二、封装的方法&#xff08;下面绿色按钮进行全局封装一个JeecgListMixin.js…

如何在局域网下测试vue项目

同一局域网下&#xff0c;通俗讲&#xff0c;就是电脑和手机等其他设备连接的是同一个 wifi 1 修改 vue 项目的 host 地址 vue项目一般使用 npm run dev 或者 npm run server 来运行如果是 webpack 构建的项目&#xff0c;在config文件夹下有一个index.js文件&#xff0c;找到…

汽车HMI:UI设计进入了3D时代,设计师准备好了吗?

汽车HMI中的低模是通过使用简化的图形和界面元素来实现的。这些低模通常是通过减少细节和精细度来实现的&#xff0c;以便在有限的处理能力和内存资源下实现更流畅的用户体验。 对UI设计师来说&#xff0c;低模的实现可能会带来一些挑战。 首先&#xff0c;他们需要考虑如何在…

基于51单片机的模拟8层电梯运行proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1i_h6TnziwnPKKo37zlwWAg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

建立分支提交代码

git分支 git branch 产看当前分支 git branch -a 查看所有分支 git checkout 分支名 切换分支 git checkout -b 分支名 建立分支&#xff08;仅仅是在本地建立了&#xff0c;并没有关联线上&#xff09; git push --set-upstream origin 分支名 把本地分支推到先线上 建立分支…

SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法

目录 0 问题场景 1 数据准备 2 问题分析 2.1 需求一 2.2需求二 3 小结 想要进一步了解SQL这门艺术语言的&#xff0c;可以订阅我的专栏数字化建设通关指南&#xff0c;将在该专栏进行详细解析。 专栏 原价99&#xff0c;现在活动价39.9&#xff0c;按照阶梯式增长&…