实战教程:Leaflet+SpringBoot 实现地图任意点位点击查看时间功能

实战教程:Leaflet+SpringBoot 实现地图任意点位点击查看时间功能

目录

前言

一、需求解析

1、地图展示

2、时区和时间的关系

3、经纬度和时区的关系

二、应用实现

1、经纬度和时区求解

2、Leaflet 实现地图点击

3、前后台交互

三、成果展示

1、亚洲地区

2、欧洲地区

3、拉美地区

4、澳洲地区

四、总结


前言

        在数字化、全球化的当下,地理位置与时间信息的结合应用,已经渗透到出行导航、跨境调度、物流追踪、国际业务展示等众多场景。用户不再满足于单纯查看地图点位,更需要点击地图任意位置,即可快速获取当地真实时间,比如针对国外新闻的展示,对于我国的用户需要知晓事件发生的时间,一般有两个时间的概念,即北京时间和当地时间。北京时间是跟我们同一时区,让我们清楚的知道在我们的时间时刻中,在何时发生。而全球是个分为多个时区的模式,因此还需要在当地是几点发生的情况。因此,这种轻量化、高实用性的交互功能,已成为 Web 地图应用的标配能力。

        在前端地图开发领域,Leaflet 凭借体积小、易用性强、兼容性好、插件丰富等优势,成为轻量级 Web 地图开发的首选框架,相比大型 GIS 框架,它更适合快速开发轻量化地图应用;在后端技术栈中,SpringBoot 以自动配置、开箱即用、生态完善等特点,成为 Java 全栈开发的主流选择,能够高效实现接口开发、数据计算、业务逻辑处理。将 Leaflet 与 SpringBoot 结合,既可以发挥前端地图交互的灵活性,又能依托后端完成精准的时区计算、时间处理等核心逻辑,避免前端纯计算带来的误差与安全问题。而地图任意点位点击查看时间功能,核心解决了「经纬度→时区→当地时间/北京时间」的转换难题,填补了纯前端无法精准获取全球时区的短板,无论是跨境项目、国际展示系统,还是个人学习全栈地图开发,都具备极高的价值。

        本文将从需求解析、核心逻辑实现、前后端交互到最终效果展示,全程手把手教学,让你快速掌握 Leaflet 地图交互与 SpringBoot 后端计算的全栈开发技能。


一、需求解析

1、地图展示

        核心需求为加载一张可缩放、可拖拽的世界地图,支持用户在任意位置点击交互,地图需加载流畅、无地域偏移,适配 PC 端浏览器,这是整个功能的基础载体。地图可以放大缩小,点击等等地图常规操作。

2、时区和时间的关系

        全球共划分 24 个时区,以本初子午线为基准,每个时区对应标准时间,同一时区内时间一致,不同时区存在时差。后端必须基于标准时区规则,计算目标点位的标准时间 / 夏令时时间,保证时间精准性。

3、经纬度和时区的关系

        时区由地理位置(经纬度)决定:经度决定时区的基准偏移,纬度辅助区分特殊时区(如跨时区国家、海外领地)。核心痛点:无法通过简单公式计算经纬度对应的时区,必须依托可靠的算法 / 库实现精准转换,这是本功能的核心难点。


二、应用实现

1、经纬度和时区求解

        后端使用纯Java实现经纬度转时区,支持全球所有国家 / 地区。核心工具类代码如下:

package com.yelang.common.utils.zone; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import com.yelang.common.utils.StringUtils; /** * - 时区时间计算工具类 * @author 夜郎king * */ public class ZoneUtils { // 创建一个日期时间格式化器 private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static String getTimeFormart(String zoneIdStr,long currentTimeMillis) { ZoneId zoneId = StringUtils.isNotEmpty(zoneIdStr) ? ZoneId.of(zoneIdStr) : ZoneId.systemDefault(); // 将时间戳转换为Instant对象 Instant instant = Instant.ofEpochMilli(currentTimeMillis); // 将Instant转换为ZonedDateTime ZonedDateTime zonedDateTime = instant.atZone(zoneId); // 格式化日期时间 String formattedDateTime = zonedDateTime.format(formatter); // 输出格式化后的日期时间 return formattedDateTime; } /** * - 根据位置精度获得时区id * @param currentLon * @return */ public static int calculateTimeZone(double currentLon) { int timeZone; int shangValue = (int) (currentLon / 15); double yushuValue = Math.abs(currentLon % 15); if (yushuValue <= 7.5) { timeZone = shangValue; } else { timeZone = shangValue + (currentLon > 0 ? 1 : -1); } return timeZone; } }

2、Leaflet 实现地图点击

        关于如何使用Leaflet集成地图展示,非常简单。如果对Leaflet集成地图有疑问的,可以查看之前的博文,也可以在评论区留言交流。前端在引入 Leaflet 之后,初始化地图,绑定点击事件,获取点击点位的经纬度。核心代码如下:

function onMapClick(e) { var title = "坐标信息展示"; parent.layer.open({ type: 2, title: [title,'font-size:16px;text-align:center;font-weight: bold;'], scrollbar:false, area: ['45%', '50%'], content: ctx + "/eq/wcountry/globaldetail?lng=" + e.latlng.lng + "&lat=" + e.latlng.lat, btn:[], yes:function(index,layero){}, cancel: function(index, layero){ parent.layer.close(index); return false; } }); } mymap.on('click', onMapClick);

        值得注意的是,在这里我们使用Layui来实现打开一个新窗口。因此在页面开发时需要注意引入依赖资源。

3、前后台交互

        后端 Controller主要为实现页面的跳转以及时区时间信息展示,在实现具体时区展示时,自动计算时间信息,并与北京时间进行对比。Java代码如下:

/** * - 全球信息可视化,集成北京时间、当地时间、所属时区、未来可以扩展天气和国家、首都信息 * @return */ @RequiresPermissions("eq:capital:globalinfo") @GetMapping("/globalinfo") public String globalinfo(){ return prefix + "/globalinfo"; } /** * - 全球信息可视化,集成北京时间、当地时间、所属时区、未来可以扩展天气和国家、首都信息 * @return */ @RequiresPermissions("eq:capital:globaldetail") @GetMapping("/globaldetail") public String globaldetail(String lng,String lat,ModelMap mmap){ mmap.put("lng", lng); mmap.put("lat", lat); // 获取当前时间戳 long currentTimeMillis = System.currentTimeMillis(); String beijingTime = ZoneUtils.getTimeFormart(null,currentTimeMillis);//北京时间 mmap.put("beijingTime", beijingTime); //根据经度求解时区偏移,然后计算时间 int timeZoneOffset = ZoneUtils.calculateTimeZone(Double.parseDouble(lng)); //获取时区偏移 String offset = (timeZoneOffset < 0 ? "-" : "+") + Math.abs(timeZoneOffset); String zongIdStr = "UTC" + offset; mmap.put("zongIdStr", zongIdStr); String localTime = ZoneUtils.getTimeFormart(zongIdStr,currentTimeMillis); mmap.put("localTime", localTime); return prefix + "/globaldetail"; }

        前端请求页面展示时区及时间信息,前端使用Thymeleaf来进行页面构建。核心代码如下:

<table> <tbody> <tr> <td>经度</td> <td>[[${lng}]]</td> </tr> <tr> <td>纬度</td> <td>[[${lat}]]</td> </tr> <tr> <td>北京时间</td> <td>[[${beijingTime}]] &nbsp;【UTC+8 】</td> </tr> <tr> <td>当地时间</td> <td>[[${localTime}]] &nbsp;【[[${zongIdStr}]]】</td> </tr> </tbody> </table>

三、成果展示

        本节将对直接对页面进行展示,将成果给大家呈现出来。启动 SpringBoot 项目,访问前端页面,在全球不同区域点击测试,效果如下:

1、亚洲地区

  • 点击中国北京:弹出东八区标准时间,与时区完全匹配;
  • 点击日本东京:显示东九区时间,时差 1 小时,结果精准。

2、欧洲地区

  • 点击英国伦敦:显示零时区 / 夏令时时间;
  • 点击法国巴黎:显示东零区时间,时差匹配无误。

3、拉美地区

  • 点击巴西里约:显示西三区时间,符合南美时区规则;
  • 点击墨西哥城:显示西七区时间,计算结果无偏差。

4、澳洲地区

  • 点击澳大利亚悉尼:显示东十区时间;
  • 点击新西兰奥克兰:显示东十二区时间,跨区域计算精准。

        以上所有点位点击响应速度快,时间 100% 准确,无偏移、无错误。证明我们的计算无误。


四、总结

        以上就是本文的主要内容。文章通过Leaflet+SpringBoot技术栈,完整实现了「地图任意点位点击查看当地时间」功能,核心完成了三大模块开发:

  1. 基于 Leaflet 实现世界地图加载与点位点击交互,前端简洁高效;
  2. 依托Java语言解决经纬度转时区的核心难题,保证时间精准性;
  3. 通过前后端分离接口实现数据交互,架构清晰、易于扩展。

        本项目可直接应用于跨境系统、可视化大屏、物流地图、国际业务平台等场景,也可在此基础上扩展历史时间查询、时区对比、多语言展示等功能。Leaflet 轻量化的特性搭配 SpringBoot 高效的后端能力,是中小型 Web 地图项目的最佳实践之一。行文仓促,难免有许多不足之处,如果在实操中遇到问题,欢迎在评论区交流~。

Read more

Libvio.link爬虫技术技术

Libvio.link爬虫技术技术

Libvio.link爬虫技术详细解析        先明确核心:Libvio.link本质是一个「网页数据采集工具」(爬虫),和我们平时用浏览器看网页、存内容的逻辑一样,只是它能自动、批量地去访问目标网站,把网站里的内容(比如视频链接、文本、图片)爬下来,整理后展示在自己的平台上,供人直接查看/下载。         全程不用懂复杂代码,重点搞懂「它怎么爬、爬什么、为什么能爬、会遇到什么问题」,看完就能明白Libvio.link爬虫的核心逻辑,也能理解同类爬虫的工作原理。 一、先搞懂:Libvio.link爬虫到底是什么?(通俗比喻)         你想把一个视频网站的所有电影链接都存下来,一个个点开网页、复制链接、粘贴保存,要花几个小时甚至几天;而Libvio.link爬虫,就相当于一个「自动打工的机器人」,你给它设定好要爬的网站(比如某视频站),它就会自动点开每一个网页,自动识别里面的视频链接、标题、简介,自动复制保存,全程不用你动手,

By Ne0inhk

跨境电商 AI 数据中台架构实战:接入卖家精灵 MCP,打通“选品—投放—供应链—合规”的闭环

1. 背景与目标 跨境电商公司做 AI,最容易踩的坑不是模型不够强,而是 数据割裂、口径不统一、工具链不可复用、产出无法闭环。典型现状包括: * 运营数据散落在 Amazon SP-API、ERP/WMS、广告平台、客服工单、第三方选品工具(如卖家精灵)等多个系统; * 业务问题(选品/关键词/广告/补货/合规)彼此耦合,但数据链路却是断的; * LLM 生成内容(Listing、广告词、客服话术)可用性不稳定,缺少可追踪评测与回滚机制; * 文件类知识(SOP、合规条款、合同、类目规范)难以被 AI 高质量引用,导致“幻觉”和合规风险。 本文给出一套“可落地”的

By Ne0inhk
Flutter 组件 spinify 适配鸿蒙 HarmonyOS 实战:实时消息管道,构建全场景高性能 WebSocket 长连接架构

Flutter 组件 spinify 适配鸿蒙 HarmonyOS 实战:实时消息管道,构建全场景高性能 WebSocket 长连接架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 spinify 适配鸿蒙 HarmonyOS 实战:实时消息管道,构建全场景高性能 WebSocket 长连接架构 前言 在鸿蒙(OpenHarmony)生态迈向万物互联、涉及高频实时交互、流式数据同步或多人协同编辑的场景下,如何建立一套稳定、高效且具备自动愈合能力的长连接通道,已成为提升应用实时性体验的“关键枢轴”。在鸿蒙设备这类强调分布式协同与严苛能效管理的移动终端上,如果直接使用原生的 WebSocket 进行裸奔(Bare Metal)开发,由于由于缺乏完善的心跳机制、重连策略与频道管理,极易由于由于网络波动导致连接频繁断档,进而引发业务状态的不一致。 我们需要一种能够深度封装协议细节、支持大规模并发频道订阅且具备毫秒级重连恢复能力的实时通讯引擎。 spinify 为 Flutter 开发者提供了与 Centrifugo(高性能实时消息服务器)交互的高级客户端。它支持全双工通信、自动重连计数与消息序列确认(ACK)。在适配到鸿

By Ne0inhk
金仓数据库 V9 体验测评:AI 时代国产数据库 “融合” 架构的真实观察

金仓数据库 V9 体验测评:AI 时代国产数据库 “融合” 架构的真实观察

【非广告声明】本文源于作者针对金仓数据库V9所做的真实部署考察和技术分析,并无商业合作背景,未曾得到品牌方的推广委托或者费用赞助,其写作重点在于分享国产数据库在“融合架构”“ AI助力”“平滑迁移”等重要场景中的实际应用感受,包含技术要点,解决落地难点的效果以及行业契合情况,仅仅给那些关心国产数据库选型,数据库迁移或者AI + 数据库技术的开发者以及企业IT工作者赋予客观参照,而不形成产品推销或者商业导向。 引言:数字浪潮汹涌,谁在托举万千业务的底座? 地铁口扫码进站,医院自助机立刻打印检查结果,电商页面上支付回执即刻显现出来,这些场景背后依靠的是数据库,它就像城市供水系统的泵站,日夜不停地工作,把数据这股“活水”按照需求,时间以及安全等级输送到各个业务端口。 以前,很多关键数据库大多依靠国外厂家,但是现在,数据成了生产要素,“自主可控”由可选变成必要选项,关键技术被别人控制,不但会提升成本,而且会引发安全问题,影响业务连续性,造成合规风险,于是,国产数据库便加快了超越的步伐。 中电科金仓(以下简称“金仓”)较早涉足该领域,一直专注于数据库行业达二十余年,深入钻研这项“看似平

By Ne0inhk