当前位置: 首页 > article >正文

使用Leaflet对的SpringBoot天地图路径规划可视化实践-以黄花机场到橘子洲景区为例

目录

前言

一、路径规划需求

1、需求背景

2、技术选型

3、功能简述

二、Leaflet前端可视化

1、内容布局

2、路线展示

3、转折路线展示

三、总结


前言

        在当今数字化与智能化快速发展的时代,路径规划技术已经成为现代交通管理、旅游服务以及城市规划等领域的核心工具之一。无论是日常通勤、商务出行还是旅游观光,高效、准确的路径规划都能显著提升人们的出行体验,优化资源配置,减少时间浪费和能源消耗。随着地理信息系统(GIS)技术的不断进步,结合先进的Web开发框架和地图服务,实现路径规划的可视化已经成为可能。本文旨在探讨如何利用Leaflet这一轻量级、开源的地图JavaScript库,结合Spring Boot框架和天地图服务,构建一个高效、直观的路径规划可视化系统,并以黄花机场到橘子洲景区为例,展示该技术在实际场景中的应用价值。

        在之前的系列博客中,我们曾将介绍了天地图的相关开发资源,也介绍了如何在后台利用Unihttp来进行天地图的服务调用,如何将天地图返回的xml信息快速转换成json对象,但是我们仍然缺乏对转换的JSON数据进行Web可视化。前文链接如下:

序号博文地址
1在SpringBoot中基于JAXB实现天地图路径规划结果XML转JSON实践
2在SpringBoot中使用UniHttp简化天地图路径规划调用实践

         本文将重点结合Leaflet对请求的结果进行可视化,不仅实现对规划的路径的展示,同时还展示了路线中的转折点进行标注的全面的展示。使用本方案不需要自己来实现路径规划的算法,对于在系统中集成相关的功能应用有较快的能力。

一、路径规划需求

        路径规划技术的演进历程见证了从传统的纸质地图导航到数字化地图的转变。早期的路径规划依赖于复杂的算法和庞大的计算资源,普通用户难以直接获取和使用。然而,随着互联网技术的普及和云计算的兴起,路径规划逐渐走向大众化和实用化。天地图作为国内领先的地理信息服务平台,提供了丰富的地图数据和强大的API接口,为开发者提供了强大的支持。而Spring Boot框架以其简洁、高效的特性,成为构建企业级应用的首选。Leaflet作为一款轻量级的地图库,以其易用性和高性能,成为Web开发中地图可视化的理想选择。

1、需求背景

        在旅游行业中,路径规划的可视化具有重要意义。黄花机场作为长沙的重要交通枢纽,每年接待大量国内外游客。橘子洲景区作为长沙的标志性景点,吸引着无数游客前来观光。然而,从机场到景区的路径规划往往涉及复杂的交通网络和多样的出行方式,游客在初次到达时可能会感到迷茫。通过构建一个基于Leaflet、Spring Boot和天地图的路径规划可视化系统,可以为游客提供直观、便捷的导航服务。系统不仅能够展示最优路径,还能实时更新路况信息,帮助游客避开拥堵路段,节省出行时间。同时,结合天地图的POI(兴趣点)数据,系统还能为游客推荐沿途的餐饮、住宿等服务,提升整体旅游体验。

2、技术选型

        技术实现方面,Spring Boot框架提供了稳定、高效的应用开发环境,能够快速搭建后端服务,处理用户请求和数据交互。Leaflet则负责前端的地图展示和交互功能,通过调用天地图的API获取地图数据和路径规划结果。在路径规划算法上,可以采用经典的Dijkstra算法或A*算法,结合天地图的实时路况数据,计算出最优路径。系统架构设计遵循模块化原则,将地图服务、路径规划服务和用户交互服务分离,确保系统的可扩展性和可维护性。

3、功能简述

        以黄花机场到橘子洲景区为例,该路径规划可视化系统将展示从机场出发,经过主要交通节点,最终到达景区的详细路线。系统支持多种出行方式,包括驾车、公交和步行,并根据用户选择的出行方式动态调整路径规划结果。同时,系统还提供路径长度、预计行驶时间等关键信息,并以直观的图形化方式展示在地图上。用户可以通过缩放、平移等操作查看路径细节,还可以点击查看沿途的POI信息,获取更多实用建议。

二、Leaflet前端可视化

        本节将重点讲解如何使用Leaflet来实现对路径规划的结果进行展示,后台的实现可以翻阅之前的示例代码。首先介绍内容布局,然后介绍规划路径的Web可视化,最后介绍如何对转折路线的展示。

1、内容布局

        首先来介绍一下页面的内容布局,参考一般的导航软件,可以看到对于路径规划的结果一般会包含以下的主要信息。首先会包含路线信息,其次会将重要的转折点进行展示,再者还有对重点路段的信息进行说明,帮助在进行行进时有指向性提示,在展示的时候分为左右结构。如下图所示:

        因此下面将着重从以下两个方面的实现来进行展示。 

2、路线展示

首先使用Leaflet对天地图接口返回的路线信息进行综合展示,打开访问接口,在网络请求中查看返数据,接口返回如下:

        在返回结果中,routelatlon字段表示具体的规划路径,这表示连续的坐标点,每个坐标点使用分号隔开,经纬度之间用逗号分隔。因此在解析时,首先实现需要将字符串按照表示分隔,然后将坐标点添加到一个数组中。关键代码如下:

var routingArray = new Array();
var routelatlonStr = result.data.routelatlon;		        		
var routelatlonStrArray = routelatlonStr.split(";");
for(var i = 0;i<routelatlonStrArray.length;i++){var _tempStr = routelatlonStrArray[i];if(_tempStr == "") continue;routingArray.push([_tempStr.split(",")[1],_tempStr.split(",")[0]]);
}
L.polyline([ [routingArray]],{color: '#1890ff'}).addTo(showBaseGroup);

         为了方便的展示起始点位置,需要自定义两个mark,分开采用两个自定义的icon图片来进行图片的绑定,关键代码如下:

//开始图标
var startIcon = L.icon({iconUrl: ctx + '/img/start_point_48.png',iconSize: [40, 40], // 设置图片大小 宽度32.高度32iconAnchor: [25, 35]
});	
//结束图标
var endIcon = L.icon({iconUrl: ctx + '/img/end_point_48.png',iconSize: [40, 40], // 设置图片大小 宽度32.高度32iconAnchor: [12, 10]
});
//添加起点
L.marker(new L.latLng(result.data.orig.split(",")[1],result.data.orig.split(",")[0]), {icon: startIcon}).addTo(showBaseGroup);
//添加终点
L.marker(new L.latLng(result.data.dest.split(",")[1],result.data.dest.split(",")[0]), {icon: endIcon}).addTo(showBaseGroup);

        这样添加了路线之后,就可以在路线的起止位置展示不同的起始点位置信息。效果如下所示:

3、转折路线展示

        最后在页面的左边需要显示这条路线的分支路线信息,这里采用原生html动态拼接实现方式,循环数据,然后东通过Jquery来实现动态元素的创建,代码如下:

var index = 0;
for(var i=0;i < result.data.routes.items.length;i++){var dataInfo = result.data.routes.items[i];var _li = "<li class='info-element'>";_li += dataInfo.strguide;_li += "<div class='agile-detail'>"_li += "<a href='#' class='pull-right btn btn-xs btn-white'>标记</a>";_li += "<i class='fa fa-clock-o'></i> 行驶15分钟";_li += "</div>";_li += "</li>";$("#routing_ul").append(_li);
}

        使用动态拼接生成之后,页面效果如下:

        这就是路径规划结果的WebGIS可视化。通过本实例,大家都可以掌握如何对天地图的路径规划结果进行可视化展示,同时展示不同的路段的基本信息。 

三、总结

        以上就是本文的主要内容,本文旨在探讨如何利用Leaflet这一轻量级、开源的地图JavaScript库,结合Spring Boot框架和天地图服务,构建一个高效、直观的路径规划可视化系统,并以黄花机场到橘子洲景区为例,展示该技术在实际场景中的应用价值。总之,本研究不仅具有重要的理论意义,还具有广泛的实际应用价值。通过结合Leaflet、Spring Boot和天地图,构建一个高效、直观的路径规划可视化系统,可以为旅游行业提供技术支持,为游客提供便捷服务,同时也为城市交通管理和规划提供参考。随着技术的不断发展和完善,路径规划可视化系统将在更多领域发挥重要作用,为人们的出行和生活带来更大的便利。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。

相关文章:

使用Leaflet对的SpringBoot天地图路径规划可视化实践-以黄花机场到橘子洲景区为例

目录 前言 一、路径规划需求 1、需求背景 2、技术选型 3、功能简述 二、Leaflet前端可视化 1、内容布局 2、路线展示 3、转折路线展示 三、总结 前言 在当今数字化与智能化快速发展的时代&#xff0c;路径规划技术已经成为现代交通管理、旅游服务以及城市规划等领域的…...

【小兔鲜】day02 Pinia、项目起步、Layout

【小兔鲜】day02 Pinia、项目起步、Layout 1. Pinia2. 添加Pinia到Vue项目3. 案例&#xff1a;Pinia-counter基础使用3.1 Store 是什么&#xff1f;3.2 应该在什么时候使用 Store? 4. Pinia-getters和异步action4.1 getters4.2 action如何实现异步 1. Pinia Pinia 是 Vue 的专…...

PyTorch 激活函数

激活函数是神经网络中至关重要的组成部分&#xff0c;它们为网络引入了非线性特性&#xff0c;使得神经网络能够学习复杂模式。PyTorch 提供了多种常用的激活函数实现。 常用激活函数 1. ReLU (Rectified Linear Unit) 数学表达式: PyTorch实现: torch.nn.ReLU(inplaceFals…...

魔塔社区使用llamafactory微调AI阅卷试题系统

启动 LLaMA-Factory 1. 安装 LLaMA-Factory 执行安装指令 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]"解决依赖冲突 如果遇到依赖冲突&#xff0c;可使用以下命令安装&#xff0c;不…...

Java面试黄金宝典29

1. 什么是普通索引和唯一性索引 定义&#xff1a; 普通索引&#xff1a;是最基本的索引类型&#xff0c;它为数据表中的某一列或多列建立索引&#xff0c;以加快数据的查询速度。它不限制索引列的值重复&#xff0c;允许存在多个相同的值。唯一性索引&#xff1a;在普通索引的基…...

git `switch` 命令详解与实用示例

文章目录 git switch 命令详解与实用示例git switch vs git checkoutgit switch 用法1. 切换到已有分支2. 创建并切换到新分支3. 切换到上一个分支4. 切换到远程分支&#xff08;自动创建本地分支并追踪远程&#xff09;5. 放弃未提交的修改并切换分支 总结 git switch 命令详解…...

Oracle中文一二三四排序【失败】

原文地址&#xff1a; Oracle数据库如何对中文的一二三四五六七八九十数进行正序排列排序_中文数字排序-CSDN博客 自定义排序函数 -- 自定义中文映射阿拉伯数字函数 CREATE OR REPLACE FUNCTION P_ORDER_CHINESE_TO_ARABIC(V_NUM VARCHAR2) RETURN NUMBER IS BEGIN-- 根据…...

AWS S3 和 Lambda 使用

目录&#xff1a; AWS概述 EMR Serverless AWS VPC及其网络 关于AWS网络架构的思考 AWS S3 和 Lambda 使用 本文将通过一个实例来说明如何使用 AWS S3 和 Lambda。 使用场景&#xff1a;通过代码将文件上传到S3&#xff0c;该文件需要是公开访问的&#xff0c;并对上传的文件进…...

Mysql 在什么样的情况下会产生死锁?

在 MySQL 中&#xff0c;死锁是指两个或多个事务相互等待对方释放锁&#xff0c;导致所有相关事务无法继续执行的情况。死锁会影响数据库的并发性能&#xff0c;因此需要及时检测并处理。假设有两个事务 T1 和 T2&#xff1a; 事务 T1 首先锁定 表 A 的行 1。然后尝试锁定 表 B…...

符号秩检验

内容来源 非参数统计&#xff08;第2版&#xff09; 清华大学出版社 王星 褚挺进 编著 符号秩检验 在符号检验的基础上&#xff0c;增加了数据绝对值大小的信息 检验统计量 用一个简单的例子来说明 样本数据 X i , i 1 , ⋯ , 6 X_i,i1,\cdots,6 Xi​,i1,⋯,6 如下 X …...

RainbowDash 的 Robot

H RainbowDash 的 Robot - 第七届校赛正式赛 —— 补题 题目大意&#xff1a; 给一个 n ∗ m n*m n∗m 的二维网格&#xff0c;在第 i i i 列中&#xff0c;前 a i a_i ai​ 单元格被阻断&#xff0c;无法通行&#xff0c;即 [ 1 , a i ] [1,a_i] [1,ai​] 。 一个机器人正…...

yum repolist all全部禁用了 怎么办

文章目录 步骤思考解决yum仓库全部被禁用的问题步骤思考: 检查仓库状态:运行yum repolist all,查看所有仓库的启用状态。 被禁用的仓库会显示为disabled。 启用所有仓库:可以逐一启用,或者使用命令批量启用。 例如使用yum-config-manager --enable ‘*’,但需要注意是否有…...

SQL WHERE 与 HAVING

WHERE 和 HAVING 都是 SQL 中用于筛选数据的子句&#xff0c;但它们有重要的区别 WHERE 子句 在 分组前 过滤数据 作用于 原始数据行 不能使用聚合函数 执行效率通常比 HAVING 高 SELECT column1, column2 FROM table WHERE condition; HAVING 子句 在 分组后 过滤数据 …...

如何在 Unity3D 导入 Spine 动画

一、前言 《如何在 Unity3D 项目中导入 Spine 动画》&#xff0c;虽然在网上有很多这种文章&#xff0c;直接将问题交给 DeepSeek 也能得到具体的操作流程&#xff0c;但是照着他们提供的方法还是能遇到几个问题&#xff0c;比如&#xff1a; AI 回答没有提到 Unity 无法识别.…...

子网划分2

子网分配的问题&#xff0c;下列vlsm如何设置&#xff1f; 某公司申请了一个C类202.60.31.0的IP地址&#xff0c;要求设置三个子网&#xff0c;一个为100台主机&#xff0c;一个为50台主机&#xff0c;另一个为50台主机&#xff0c;用VLSM如何设置&#xff1f; 哪位高手指教一…...

C++的UDP连接解析域名地址错误

背景 使用c开发一个udp连接功能的脚本&#xff0c;可以接收发送数据&#xff0c;而且地址是经过内网穿透到外网的 经过 通常发送数据给目标地址&#xff0c;需要把目的地址结构化&#xff0c;要么使用inet_addr解析ip地址&#xff0c;要么使用inet_pton sockaddr_in target…...

23种设计模式中的观察者模式

定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖者都会收到通知并自动更新。 观察者模式是一种发布-订阅模式。它让发送通知的一方&#xff08;被观察者&#xff09;和接收通知的一方&#xff08;观察者&#xff09;能够解耦&#xf…...

论文笔记:ASTTN模型

研究现状 现有研究大多通过分别考虑空间相关性和时间相关性或在滑动时间窗口内对这种时空相关性进行建模&#xff0c;而未能对直接的时空相关性进行建模。受最近图领域Transformer成功的启发&#xff0c;该模型提出利用局部多头自关注&#xff0c;在自适应时空图上直接建立跨时…...

Java单例模式详解

单例模式详解 一、单例模式概述 单例模式(Singleton Pattern)是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。 核心特点 唯一实例&#xff1a;保证一个类只有一个实例存在全局访问&#xff1a;提供统一的访问入…...

Linux命令-tar

tar 命令的完整参数列表&#xff1a; 参数 描述 -c 创建新的归档文件 -x 解压归档文件 -t 列出归档文件内容 -r 追加文件到归档文件 -u 更新归档文件中的文件 -d 从归档文件中删除文件 -f 指定归档文件的名称 -v 显示详细信息&#xff08;verbose&#xff09; -z 使用 gzip 压缩…...

深入解析 Git Submodule:从基础到高级操作指南

深入解析 Git Submodule&#xff1a;从基础到高级操作指南 一、Git Submodule 是什么&#xff1f; git submodule 是 Git 提供的一个强大功能&#xff0c;允许在一个 Git 仓库&#xff08;主仓库&#xff09;中嵌入另一个独立的 Git 仓库&#xff08;子模块&#xff09;。主仓…...

2025-4-2 蓝桥杯刷题情况(分布式队列)

1.题目描述 小蓝最近学习了一种神奇的队列:分布式队列。简单来说&#xff0c;分布式队列包含 N 个节点(编号为0至N-1&#xff0c;其中0号为主节点)&#xff0c;其中只有一个主节点&#xff0c;其余为副节点。 主/副节点中都各自维护着一个队列&#xff0c;当往分布式队列中添加…...

C/C++指针核心难点全解析:从内存模型到实战避坑指南

引言&#xff1a;指针为何被称为C/C的“灵魂”&#xff1f; 指针是C/C语言中最强大的工具之一&#xff0c;也是开发者通往底层编程的必经之路。它直接操作内存地址的能力&#xff0c;赋予了程序极高的灵活性和性能优势。然而&#xff0c;指针的复杂性也让无数初学者“折戟沉沙…...

ray.rllib-入门实践-12-2:在自定义policy中注册使用自定义model(给自定义model新增参数)

建议先看博客 ray.rllib-入门实践-12-1&#xff1a;在自定义policy中注册使用自定义model &#xff0c; 本博客与之区别在于可以给自定义的 model 新增自定义的参数&#xff0c;并通过 config.model["custom_model_config"] 传入自定义的新增参数。 环境配置&#xf…...

【Java中级】10章、内部类、局部内部类、匿名内部类、成员内部类、静态内部类的基本语法和细节讲解配套例题巩固理解【5】

❤️ 【内部类】干货满满&#xff0c;本章内容有点难理解&#xff0c;需要明白类的实例化&#xff0c;学完本篇文章你会对内部类有个清晰的认知 &#x1f495; 内容涉及内部类的介绍、局部内部类、匿名内部类(重点)、成员内部类、静态内部类 &#x1f308; 跟着B站一位老师学习…...

swift-7-汇编分析闭包本质

一、汇编分析 fn1里面存放的东西 func testClosure2() {class Person {var age: Int 10}typealias Fn (Int) -> Intvar num 0func plus(_ i: Int) -> Int {num ireturn num}return plus} // 返回的plus和num形成了闭包var fn1 getFn()print(fn1(1)) // 1print(fn1(…...

Linux: 进程信号初识

目录 一 前言 二 信号的感性认识 三 信号处理常见方式 四 系统信号列表 五 信号的保存 六 信号的产生 1. 通过终端按键产生信号 2. 通过系统调用向进程发送信号 3. 硬件异常产生信号 4. 软件条件产生信号 一 前言 在Linux操作系统中&#xff0c;进程信号是一个非常重…...

python 项目怎么通过docker打包

python 项目怎么通过docker打包 1. 编写Dockerfile 在Python项目的根目录下创建一个名为 Dockerfile 的文件,其内容示例如下: # 使用Python基础镜像 FROM python:3.9-slim# 设置工作目录 WORKDIR /app# 将当前目录下的所有文件复制到工作目录 COPY . /app# 安装项目依赖 R…...

MySQL-- 函数(单行函数):数值函数, 字符串函数

目录 1.数值函数 2. 字符串函数 1.数值函数 ABS:绝对值 ; SIGN&#xff1a;数字正负&#xff0c;正返回1&#xff0c;负返回-1 , 0返回0 ; CEIL,CEILING:取数上面的数 &#xff1b;FLOOR:取数下面的数 &#xff1b; MOD&#xff1a;取余 #基本的操作 SELECT ABS(-123),ABS…...

CSS--解决float: right在空间不够时会自动往下移的问题

原文网址&#xff1a;CSS--解决float: right在空间不够时会自动往下移的问题-CSDN博客 简介 众所周知&#xff0c;float: right在空间不够时会自动往下移。那么怎样让它不要往下移呢&#xff1f;本文介绍解决方案。 需求 我想写一个无需列表&#xff0c;每个列表后边跟一个…...