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/10/6 6:55:14 阅读更多 →
2026国内企业级AI编程平台都有哪些:15款主流企业AI代码开发工具对比

2026国内企业级AI编程平台都有哪些:15款主流企业AI代码开发工具对比

一、行业整体发展趋势与权威报告依据 2026 年被行业普遍定义为 AI 编程智能体开发平台规模化落地元年,AI 编程平台正式告别单点代码补全工具形态,迈入智能体自主驱动软件全生命周期开发阶段。结合 Gartner《2026 Enterprise AI Coding Agents 魔力象限报…

2026/10/17 11:55:30 阅读更多 →
理论力学笔记:从核心概念到建模实战的完整知识体系构建

理论力学笔记:从核心概念到建模实战的完整知识体系构建

1. 项目概述:为什么我们需要一份“活”的理论力学笔记?理论力学,这门被无数工科生戏称为“天书”的课程,是连接物理世界与数学描述的桥梁。从牛顿的经典定律到拉格朗日、哈密顿的优美框架,它不仅是后续学习分析力学、量…

2026/10/14 6:37:20 阅读更多 →

最新新闻

深度学习内容算法综述落地指南:Embedding、注意力与双塔召回实战

深度学习内容算法综述落地指南:Embedding、注意力与双塔召回实战

简介:面向深度学习研究者与算法工程师,这份演示文稿围绕信息过载时代如何借助深度神经网络提升内容分类、推荐与识别效率,系统梳理了基于深度学习的内容算法体系。内容覆盖基本原理、研究现状与发展趋势三大模块,详细讲解文本分类…

2026/10/17 22:44:42 阅读更多 →
AI论文网站怎么选?MBA论文写作的9个实用工具与避坑指南

AI论文网站怎么选?MBA论文写作的9个实用工具与避坑指南

前两天有位做项目管理方向的MBA学员深夜给我发来一条消息:网上说有个AI网站,五分钟能生成一篇MBA论文,真的假的?我看了一眼那个宣传页,心里想,这要是能过答辩,那导师们这些年审过的论文怕是都要…

2026/10/17 22:44:42 阅读更多 →
基于PLC与组态王的机械手控制系统设计:从选型到联调避坑指南

基于PLC与组态王的机械手控制系统设计:从选型到联调避坑指南

简介:这份毕业设计文档面向电气自动化、机电一体化等专业的学生与指导教师,围绕基于S7-200 PLC与组态王的机械手控制系统展开,可帮助读者完成从选题到答辩的完整设计流程。资源为单个doc文件,压缩包约2.88MB,文档结构完…

2026/10/17 22:44:42 阅读更多 →
C++实现仿OllyDbg调试器:断点机制与事件循环实战解析

C++实现仿OllyDbg调试器:断点机制与事件循环实战解析

简介:这套调试器源码使用C/C在VS2015下开发,基于Windows 10环境实现了一个类似OllyDebug的可运行调试工具,面向软件开发人员、逆向工程师和安全研究人员,可帮助他们完成程序调试纠错、软件行为剖析与恶意样本分析等任务。包体共72…

2026/10/17 22:44:42 阅读更多 →
容器化Kafka跨网闸接入实战:advertised.listeners与IP映射对齐指南

容器化Kafka跨网闸接入实战:advertised.listeners与IP映射对齐指南

最近刚帮一个客户处理了典型的跨网段Kafka接入问题。现场的情况是这样的:核心应用区里用容器跑了一套三节点的Kafka,但同一栋楼里另一个网段的数据分析平台需要实时消费这边的业务消息。两个网段之间横着一台安全隔离网关(业内习惯叫“网闸”…

2026/10/17 22:44:42 阅读更多 →
相位偏折成像:破解镜面与高光表面微小缺陷检测难题

相位偏折成像:破解镜面与高光表面微小缺陷检测难题

1. 相位偏折成像到底解决什么问题做工业视觉检测的朋友应该都有同感:2D相机拍镜面、高光、类镜面表面时,怎么布光都不对劲。反光处一片惨白,划痕若隐若现,轻微压伤更是完全看不出来。某次我们接了一个手机玻璃后盖的检测项目&…

2026/10/17 22:43:42 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →