WebGIS开发入门到进阶 | 高德地图打卡功能实现教程
前面我们学习了监听地图的click事件实现了在地图上点击新增热门标记点的功能。那么这节前面我们学习了监听地图的click事件实现了在地图上点击新增热门标记点的功能。那么这节课我们利用上一节 GeoJSON 数据持久化来实现标记点的保存功能以实现打卡功能——能在标记点显示打卡次数标记点不会消失就算重启浏览器也能保存。那么怎么来实现打卡功能呢这就需要监听标记点的点击事件了。今天我们要实现的是监听标记点的点击事件语法与监听地图点击事件非常相似。一、监听标记点的点击事件现在就来实现下监听标记点的点击事件一样的语法marker.on(click, function(e) { // 点击标记时执行的代码 })当点击标记时就能启动 function 中的代码。这里的marker就是我们创建或已有的标记点对象。为了保存打卡次数需要对标记点进行属性赋值这时候就需要对 GeoJSON 进行修改。在创建标记时我们通过extData来添加自定义属性var marker new AMap.Marker({ // 创建标记 position: e.lnglat, extData: { _geoJsonProperties: { gid: geojson.getOverlays().length 1, click: 0, } } })这里设置了gid就是标记序号属性从 1 开始还有点击属性click用来记录点击次数初始值为 0。需要注意的是_geoJsonProperties是 GeoJSON 数据中用来存储自定义属性的标准字段名高德地图 SDK 在导入导出 GeoJSON 时会自动识别这个字段。二、为新标记点绑定点击事件创建 marker 后还要给 marker 创建绑定事件。注意这是写在map.on(click)事件中的。语法就是上面的写法map.on(click, function(e) { // 创建标记 var marker new AMap.Marker({ position: e.lnglat, extData: { _geoJsonProperties: { gid: geojson.getOverlays().length 1, click: 0, } } }) // 为新标记绑定点击事件 marker.on(click, function(e) { // 点击时执行的逻辑 }) })这样就只有对新创建的 marker 才绑定了点击事件。每次用户点击地图新增一个标记时这个新标记就拥有了点击打卡的功能。三、为旧标记点绑定点击事件但是对于已有的 marker 就没办法监听了。因为上面这种方式只对新创建的标记有效那些已经保存在本地、重启浏览器后重新加载出来的旧标记点还没有绑定点击事件。这时候还要对已有的 marker 绑定。已有的 marker 都是通过importData的方式拿到的。这时候就需要在导入的时候就对这些已有的数据进行绑定点击事件// 导入数据 if (JSON.stringify(getData()) ! []) { // 判断 localStorage 是否有数据 geojson.importData(getData()) // 导入数据 geojson.eachOverlay(function(item) { // 遍历所有标记 item.on(click, function(e) { // 为每个标记绑定点击事件 console.log(e) }) }) map.add(geojson) // 将 geojson 添加到地图 }函数里的item就是旧的数据的每一项这样就给每个 marker 都绑定点击事件了。这里eachOverlay是 GeoJSON 对象提供的一个遍历方法它会依次处理 geojson 中的每一个覆盖物即每一个标记点。四、实现打卡次数累加逻辑设置好事件后就需要实现当用户点击标记时点击属性加 1。这时候就在事件中实现var ext marker.getExtData() // 获取扩展数据 var click ext._geoJsonProperties.click // 点击次数加 1这个意思就是先获取 extData 属性值赋予 ext 变量然后从中提取click属性当点击时候就加 1然后赋值给 click 变量。同样的内容也得给旧标记点再来一次复制过去即可item.on(click, function(e) { var ext item.getExtData() var click ext._geoJsonProperties.click }这就实现了新旧点在点击时都能让click属性加 1。注意如果调试时需要先把已有的 geojson 存储删除因为这里已经改变了 geojson 的结构已有的数据是没有这些属性的。可以在浏览器控制台执行localStorage.removeItem(geoData)来清除旧数据。五、数据持久化保存实现上述步骤后还有个问题就是click的值并没有实现在本地存储 geojson 数组中的保存。也就是说虽然点击时内存中的click值增加了但如果刷新页面打卡次数会丢失。所以还得加上一句saveData(geojson.toGeoJSON())这样才能实现在 localStorage 中的保存。geojson.toGeoJSON()方法会将当前所有标记点及其属性数据导出为标准 GeoJSON 格式然后通过saveData函数存储到浏览器本地。同样的这个操作也需要在新旧标记都要进行一遍新标记的点击事件marker.on(click, function(e) { var ext marker.getExtData() var click ext._geoJsonProperties.click saveData(geojson.toGeoJSON()) // 保存到本地 })旧标记的点击事件item.on(click, function(e) { var ext item.getExtData() var click ext._geoJsonProperties.click saveData(geojson.toGeoJSON()) // 保存到本地 })六、使用信息窗口显示打卡次数这样就实现了打卡功能但是打卡次数现在是在控制台输出的如何让用户看见呢这样就需要使用信息框了。思路就是把console.log替换成消息框的显示模式// 使用消息提示框 var infowindow new AMap.InfoWindow({ anchor: top-center, // 信息窗口锚点位置 content: div打卡了${click}次/div // 模板字符串显示打卡次数 })这里使用了 ES6 的模板字符串语法将click变量的值动态嵌入到 HTML 内容中。anchor: top-center表示信息窗口的锚点位于顶部中间位置。这样来实现消息的显示注意这个也是在map.on里实现的。接下来就是显示// 打开信息窗 infowindow.open(map, marker.getPosition())就是实现了消息窗在哪里显示。marker.getPosition()获取标记点的经纬度坐标信息窗口就会在这个位置弹出。当然新旧标记都要来实现一遍新标记的完整点击事件marker.on(click, function(e) { var ext marker.getExtData() var click ext._geoJsonProperties.click saveData(geojson.toGeoJSON()) var infowindow new AMap.InfoWindow({ anchor: top-center, content: div打卡了${click}次/div }) infowindow.open(map, marker.getPosition()) })旧标记的完整点击事件item.on(click, function(e) { var ext item.getExtData() var click ext._geoJsonProperties.click saveData(geojson.toGeoJSON()) var infowindow new AMap.InfoWindow({ anchor: top-center, content: div打卡了${click}次/div }) infowindow.open(map, item.getPosition()) })七、常见问题解答7.1 为什么点击标记时候不会触发地图的 click 事件这是一个容易被忽略的问题。在高德地图中点击标记点时事件被标记捕获并处理不会冒泡到地图层。因此map.on(click)事件不会被触发。这正是为什么我们需要单独为标记点绑定click事件来处理打卡逻辑。7.2 调试时需要注意什么如果调试时发现旧标记点点击没有反应或者打卡次数不显示可能是因为之前存储的 GeoJSON 数据中没有_geoJsonProperties这个属性结构。建议在调试前先清除已有的本地存储数据然后在控制台执行location.reload()刷新页面重新添加标记点进行测试。八、总结通过本节课的学习我们实现了以下功能✅ 通过marker.on(click)监听标记点的点击事件✅ 使用extData._geoJsonProperties为标记点添加click属性记录打卡次数✅ 通过geojson.eachOverlay()遍历旧标记点并绑定点击事件✅ 使用geojson.toGeoJSON()和saveData()实现数据的持久化保存✅ 使用AMap.InfoWindow在标记点位置显示打卡次数信息至此一个完整的打卡功能就实现了。用户添加的每个标记点都支持打卡记录次数会累加显示并且所有数据在浏览器重启后依然存在。大家可以先自己上手尝试看看。如果有不明白或者看不懂的地方戳我WebGIS开发零基础入门系列教程持续更新中关注我们不错过后面的内容更新

相关新闻

2026年揭秘!余姚专业靠谱、备受称赞的雾化香水喷头公司究竟哪家强?

2026年揭秘!余姚专业靠谱、备受称赞的雾化香水喷头公司究竟哪家强?

在化妆品包材领域,雾化香水喷头作为关键组件,其质量、性能和供应服务至关重要。对于化妆品包材采购商而言,找到一家专业靠谱的供应商并非易事。在余姚,众多的供应商让人眼花缭乱,而宁波微旺塑业有限公司凭借着多方面的…

2026/7/30 9:09:25阅读更多 →
2024求职全攻略:主流与垂直招聘平台深度解析与高效使用策略

2024求职全攻略:主流与垂直招聘平台深度解析与高效使用策略

1. 项目概述:为什么需要一份“全网最全”的招聘网站清单? 又到一年求职季,或者说,对于很多朋友而言,每一天都可能是求职季的开始。无论是刚毕业的应届生,还是寻求新机会的职场人,甚至是准备跳槽…

2026/7/30 9:07:25阅读更多 →
FPGA设计实战:从需求分析到调试的四大核心权衡点

FPGA设计实战:从需求分析到调试的四大核心权衡点

这类主题最容易写成空泛的概念介绍,但真正做过 FPGA 开发的人都知道,它的“设计本质”不是理论,而是如何在资源、时序、功耗和功能之间做权衡。如果你正在评估 FPGA 能不能解决你的问题,或者已经从单片机转到 FPGA 但总觉得没抓住…

2026/7/30 9:07:25阅读更多 →
基于大数据的共享单车调度优化与热力分析

基于大数据的共享单车调度优化与热力分析

1. 项目概述:当共享单车遇上大数据去年夏天,我在杭州街头连续三天看到同一辆共享单车停在小区门口,车篮里积满了雨水。这个画面让我意识到,共享单车的调度问题远比想象中复杂。这正是我们团队选择"基于大数据的共享单车数据分…

2026/7/30 10:15:39阅读更多 →
2026年大数据分析软件推荐:性能与安全对比

2026年大数据分析软件推荐:性能与安全对比

大数据分析早已不是大厂的专属需求。随着企业数据量普遍增长,越来越多中型企业也面临同样的挑战:数据量上了亿级、数据源从三五个变成了十几个、分析场景从几张固定报表变成了多部门并发自助查询。此时选一款能扛得住数据量和并发压力、同时满足安全合规…

2026/7/30 10:15:39阅读更多 →
vscode 可视化 git history commit 对比两个特定 commit

vscode 可视化 git history commit 对比两个特定 commit

vscode 的可视化 git history commit 只能看单个 commit 的修改。 我想看到从 commit1 -> commit 100 的整合修改,但又不想用 git rebase 去 squash 这些 commits,有办法吗? 回答,首先在可视化 git history 那里,选…

2026/7/30 10:15:39阅读更多 →
告别手动保存:Python微博图片批量下载工具,让你的收藏效率提升10倍

告别手动保存:Python微博图片批量下载工具,让你的收藏效率提升10倍

告别手动保存:Python微博图片批量下载工具,让你的收藏效率提升10倍 【免费下载链接】weibo-image-spider 微博图片爬虫,极速下载、高清原图、多种命令、简单实用。 项目地址: https://gitcode.com/gh_mirrors/we/weibo-image-spider 还…

2026/7/30 10:15:38阅读更多 →
ChatGPT镜像站安全吗?域名、请求链路与隐私风险检查指南

ChatGPT镜像站安全吗?域名、请求链路与隐私风险检查指南

ChatGPT镜像站安全吗?域名、请求链路与隐私风险检查指南 搜索“ChatGPT镜像”时,经常能看到界面相似、功能描述相近的第三方网页。这些页面是否安全,不能靠页面长相、回复速度或浏览器地址栏里的小锁判断。比较可靠的做法是检查域名归属、TL…

2026/7/30 10:15:38阅读更多 →
C语言项目实战:从零构建几何体体积计算器

C语言项目实战:从零构建几何体体积计算器

1. 项目概述:从零到一构建一个C语言计算器如果你刚开始学习C语言,或者已经学了一段时间语法,但总觉得代码是零散的,不知道怎么把它们组合成一个“像样”的东西,那么这个项目就是为你准备的。我们这次要做的&#xff0c…

2026/7/30 10:13:38阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →