基于Lealfet.js展示Turf.js生成的平滑曲线实践

news2024/11/28 18:55:16

目录

前言

一、问题的由来

1、创建网页框架

2、创建map对象

3、构建点位,生成路线

 二、Turf.js平滑曲线改造

1、官网方法介绍

2、0.4弯曲度曲线

3、0.85弯曲度曲线

4、0.1度弯曲曲线

5、综合对比 

总结


前言

        在很多的关于路线的gis应用中,我们经常会有展示路线的需求,比如采集关键点位的经纬度,最后连接成一条轨迹线。不知道各位朋友有没有遇到这种需求,如果只是在地图上采集一些关键点,得到的线经常是比较生硬的,尤其是在拐点的时候,展示效果更加的明显。形如下面的这种效果。

        那么有没有什么办法能让这些拐点练成的曲线实际效果看上去更加平滑呢?有的小伙会说,可以在数据采集阶段尽可能多的采集多的点位信息,通过更多点位的采集,形成一条更加平滑的曲线。从技术的角度来说,这种方式是可以的,只要将点采集的更多,那么练成的曲线一定是更加平滑的。但是这样会增加采集的工作量。有没有办法在现有的成果之上来进行数据的平滑处理呢?

         本博客给出一种解决方案,熟悉webgis开发的朋友一定知道多种解决方案。那么本文分享一款webgis的解决方案,基于Turf.js组件来动态生成平滑曲线,然后在webgis框架中进行展示。对于不熟悉或者没用过turf.js的小伙伴起到抛砖引玉的作用。对于想在Webgis中开发类似应用的小伙伴来说,可以看看这篇博客。

一、问题的由来

        众所周知,线对象是由多个点对象组合而来,把多个点两两相连即可连成一条线。因此,这里我们首先模拟构造一条虚拟的游览线路。然后使用turf.js组件生成不同程度的平滑曲线。

        为了展示最原始的线对象,我们采用Leaflet作为地图展示组件,再一起回顾一下Leaflet当中如何进行地图展示,以及集成Turf.js组件。

1、创建网页框架

        首先创建一个html页面。在页面中我们需要引入Leaflet.css和Leaflet.js两个基础组件,同时引入Turf.js这个组件。关键代码如下:

<!DOCTYPE html>
<html>
<head>
	<title>基于Leaflet和Turf生成平滑曲线实践</title>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
	<link rel="stylesheet" href="/2d/leaflet/leaflet.css" />
    <script src="/2d/leaflet/leaflet.js?v=1.0.0"></script>
	<!-- 使用unpkg -->
	<script src="https://unpkg.com/@turf/turf/turf.min.js"></script>
	<style>
        #map {
            margin: 0;
            padding: 0;
            position: absolute;
            width: 99%;
            height: 98%;
        }
    </style>
</head>
<body>
<div id="map"></div>
<script>
</script>
</body>
</html>

2、创建map对象

        在创建了基础的网页模板之后,再来定义map对象。以此在界面上绑定地图展示容器。代码如下:

var mymap = L.map('map').setView([29.052934, 104.0625], 6);

var tileLayer = L.tileLayer('http://localhost:8086/data/xxgc/q0403/{z}/{x}/{y}.png', {
	maxZoom: 7,
	minZoom:0
});
	
tileLayer.addTo(mymap); 

3、构建点位,生成路线

        这里仅为了演示效果,使用演示数据。虚拟场景为,构建一个自驾路线,从云南的保山市出发,依次经过攀枝花、昆明、成都、重庆、贵阳、长沙、赣州,最终到达福建的福州。以上城市的经纬度信息如下:

var cityPoint = new Array();
	cityPoint.push([99.116482, 25.078402]);//保山
	cityPoint.push([101.708392, 26.50289]);//攀枝花
	cityPoint.push([102.780718, 24.915559]);//昆明
	cityPoint.push([104.098757, 30.594412]);//成都
	cityPoint.push([106.559098, 29.452047]);//重庆
	cityPoint.push([106.515163, 26.461228]);//贵阳
	cityPoint.push([112.929622, 28.141659]);//长沙
	cityPoint.push([114.956049, 25.713705]);//赣州
	cityPoint.push([119.344081, 26.027307]);//福州
	

        然后,我们将这些点位数据连成一条线,在地图上展示出来。

var linestring = turf.lineString(cityPoint, {name: 'line 1'});

L.geoJSON(linestring,{style:{color:"blue",wight:2,fill:false}}).addTo(mymap);

        先来看一下原始的曲线效果,请注意各个拐点的实际效果。通过以下结果可以看到,原始的路线展示确实不够平滑。

 二、Turf.js平滑曲线改造

        首先对turf.js对于平滑曲线改造的方法进行一个简单的介绍。首先来看一下Turf.js官网对多线段平滑的方法说明。

1、官网方法介绍

        turf.js是使用bezierSpline()进行多线段平滑的构建支持的。其原理是接受一条线,通过应用贝塞尔样条算法返回一个弯曲的版本。关于白塞尔曲线的的创建原理,有兴趣的朋友可以去查询相关搜索引擎。里面还是有一点知识点的。

        我们先来看一下这个方法:

        bezierSpline方法参数

参数类型描述
lineFeature <LineString>input LineString
optionsObject可选参数:见下文

        options选项

属性类型默认值描述
resolutionnumber10000点之间的时间(毫秒)
sharpnessnumber0.85衡量样条路径应该有多弯曲的一个度量

方法的返回值是Feature <LineString> - 弯曲的线。

2、0.4弯曲度曲线

        了解了上面的方法后,在我们的应用当中调用生成方法。弯曲度的设置这里,首先我们设置成0.4,来看一下在0.4的弯曲度下,生成的平滑曲线是什么效果。

var curved = turf.bezierSpline(linestring,{sharpness:0.4,resolution:10000});//0.4的弯曲度
	
L.geoJSON(curved,{style:{color:"red",wight:2,fill:false}}).addTo(mymap);

        为了与原始的路线进行差异对比,我们将0.4弯曲度的路线设置为红色。在浏览器中查看实际效果。很明显可以看到,与原始路线相比,整条路线看起来平滑多了。

3、0.85弯曲度曲线

        在弯曲度0.4的情况下,曲线已经明显发生光滑。来看一下0.85的弯曲度下是什么效果。

L.geoJSON(turf.bezierSpline(linestring,{sharpness:0.85,resolution:10000}),{style:{color:"green",wight:2,fill:false}}).addTo(mymap);//0.85的弯曲度

        我们发现0.85的曲线,其弯曲度处理的更大了,与实际效果有一定的差异。 

4、0.1度弯曲曲线

        最后再来看一下0.1度弯曲的曲线是什么效果。

L.geoJSON(turf.bezierSpline(linestring,{sharpness:0.1,resolution:10000}),{style:{color:"yellow",wight:2,fill:false}}).addTo(mymap);//0.1的弯曲度
	

5、综合对比 

        为了比较不同弯曲度下,曲线的平滑程度。为了直观的展示效果,将三种平滑度同时叠加。

         通过效果可以看到,弯曲度系数越大,曲线的平滑程度也是比较大。黄色表示0.1的弯曲度,红色表示0.4的弯曲度,绿色表示0.85的弯曲度。

序号弯曲度实际效果
10.1与原始拟合
20.4有一定弯曲
30.85弯曲较大

        最后给出完整的示例代码,请注意在运行时替换本地图源地址。

<!DOCTYPE html>
<html>
<head>
	<title>基于Leaflet和Turf生成平滑曲线实践</title>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
	<link rel="stylesheet" href="/2d/leaflet/leaflet.css" />
    <script src="/2d/leaflet/leaflet.js?v=1.0.0"></script>
	<!-- 使用unpkg -->
	<script src="https://unpkg.com/@turf/turf/turf.min.js"></script>
	<style>
        #map {
            margin: 0;
            padding: 0;
            position: absolute;
            width: 99%;
            height: 98%;
        }
    </style>
</head>
<body>
<div id="map"></div>
<script>
    var mymap = L.map('map').setView([29.052934, 104.0625], 6);

	var tileLayer = L.tileLayer('http://localhost:8086/data/xxgc/q0403/{z}/{x}/{y}.png', {
		maxZoom: 7,
		minZoom:0
	});
	
    tileLayer.addTo(mymap); 
	
	var cityPoint = new Array();
		cityPoint.push([99.116482, 25.078402]);
		cityPoint.push([101.708392, 26.50289]);
		cityPoint.push([102.780718, 24.915559]);
		cityPoint.push([104.098757, 30.594412]);
		cityPoint.push([106.559098, 29.452047]);
		cityPoint.push([106.515163, 26.461228]);
		cityPoint.push([112.929622, 28.141659]);
		cityPoint.push([114.956049, 25.713705]);
		cityPoint.push([119.344081, 26.027307]);
	
	var linestring = turf.lineString(cityPoint, {name: 'line 1'});
	
	L.geoJSON(linestring,{style:{color:"blue",wight:2,fill:false}}).addTo(mymap);
	
	var curved = turf.bezierSpline(linestring,{sharpness:0.4,resolution:10000});//0.4的弯曲度
	
	L.geoJSON(curved,{style:{color:"red",wight:2,fill:false}}).addTo(mymap);
	
	L.geoJSON(turf.bezierSpline(linestring,{sharpness:0.85,resolution:10000}),{style:{color:"green",wight:2,fill:false}}).addTo(mymap);//0.85的弯曲度
	
	L.geoJSON(turf.bezierSpline(linestring,{sharpness:0.1,resolution:10000}),{style:{color:"yellow",wight:2,fill:false}}).addTo(mymap);//0.1的弯曲度
	

</script>

</body>
</html>

总结

        以上就是本文的主要内容,那么本文分享一款webgis的解决方案,基于Turf.js组件来动态生成平滑曲线,然后在webgis框架中进行展示。对于不熟悉或者没用过turf.js的小伙伴起到抛砖引玉的作用。如果您对在webgis中如何展示平滑曲线有一定的处理需求,不妨来看看这篇博客。行文仓促,难免有不当之处,欢迎各位小伙伴,各位专家批评指正。

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

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

相关文章

使用甘特图实现高效时间规划

甘特图虽然看似简单,却蕴含着规划时间的奥秘。它将复杂的工序分解成逻辑严密的任务链条,每个短小的条形图块都清晰地道出一个任务的起始、持续和终止。就像指挥家挥舞手中的棒,每个动作都精确拍着节奏,确保各个乐手分工合作、行云流水。择一个好用的甘特图制作工具,会让你事半功…

web前端之不一样的下拉菜单、不选中第一个元素的样式效果、伪类排除第一个元素、符号选择器、hover、not、first、child

MENU 效果图htmlcssJShtmlcss 效果图 htmlcssJS html <nav><ul><li class"navli"><h4>HTML5</h4><ul class"ulson"><li class"lison">HTML5</li></ul></li><li class"na…

论文解读—— 基于边缘梯度方向插值和 Zernike 矩的亚像素边缘检测

论文&#xff1a;《 Subpixel edge detection based on edge gradient directional interpolation and Zernike moment》 地址&#xff1a; http://www.dpi-proceedings.com/index.php/dtcse/article/view/24488 摘要 在本文中&#xff0c;我们提出了一种基于边缘梯度方向插值…

【双指针】算法例题

目录 二、双指针 25. 验证回文数 ① 26. 判断子序列 ① 27. 两数之和II - 输入有序数组 ② 28. 盛最多水的容器 ② 29. 三数之和 ② 二、双指针 25. 验证回文数 ① 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一…

奥特曼剧透GPT-5,将在高级推理功能上实现重大进步

奥特曼&#xff1a;“GPT-5的能力提升幅度将超乎人们的想象...” 自 Claude 3 发布以来&#xff0c;外界对 GPT-5 的期待越来越强。毕竟Claude 3已经全面超越了 GPT-4&#xff0c;成为迄今为止最强大模型。 而且距离 GPT-4 发布已经过去了整整一年时间&#xff0c;2023年3月1…

Nebula Graph-01-Nebula Graph简介和安装以及客户端连接

前言 NoSQL 数据库 图数据库并不是可以克服关系型数据库缺点的唯一替代方案。现在市面上还有很多非关系型数据库的产品&#xff0c;这些产品都可以叫做 NoSQL。NoSQL 一词最早于上世纪 90 年代末提出&#xff0c;可以解释为“非 SQL” 或“不仅是 SQL”&#xff0c;具体解释要…

服务器版本命令查看

1、# uname &#xff0d;a &#xff08;Linux查看版本当前操作系统内核信息&#xff09; 2、# cat /proc/version &#xff08;Linux查看当前操作系统版本信息&#xff09; 3、# cat /etc/issue 或 cat /etc/redhat-release &#xff08;Linux查看版本当前操作系统发行版信息&…

python车辆故障管理系统的设计与实现flask-django-nodejs-php

随着时代的进步&#xff0c;信息科技的不断发展。人类的不断研究、开发&#xff0c;互联网时代已经来临。人们消费的水平也在不断的提高&#xff0c;车辆维修从无到有&#xff0c;慢慢的步入人们的生活&#xff0c;快速的发展&#xff0c;成为新型的消费。网络发展前景无限&…

计算机视觉综述

历史发展 计算机视觉是通过分析、研究让计算机的智能化达到类似人类的双眼“看”的一门科学。更直接地说&#xff0c;计算机视觉就是让摄像机、电脑这些科技设备成为计算机的“眼睛”&#xff0c;让其可以拥有人类的双眼所具有的分割、分类、识别、跟踪、判别决策等功能。   …

卷积神经网络五:GoogleNet

在2014年的ImageNet图像识别大赛中&#xff0c;一个名叫GoogleNet的网络架构大放异彩。GoogleNet使用了一种叫作Inception的结构。其实GoogleNet本质上就是一种Inception网络&#xff0c;而一个Inception网络又是由多个Inception模块和少量的汇聚层堆叠而成。 Inception模块 …

HTML_CSS学习:超链接、列表、表格、表格常用属性

一、超链接_唤起指定应用 1.相关代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>超链接_唤起指定应用</title> </head> <body><a href"tel:10010">电话联…

docker入门(四)—— docker常用命令详解

docker 常用命令 基本命令 # 查看 docker 版本 docker version # 查看一些 docker 的详细信息 docker info 帮助命令&#xff08;–help&#xff09;&#xff0c;linux必须要会看帮助文档 docker --help[rootiZbp15293q8kgzhur7n6kvZ /]# docker --helpUsage: docker [OPTI…

dockerfile文件编写

文章目录 dockerfile是什么Dockerfile常用指令1. FROM2. MAINTAINER3. WORKDIR4.COPY5.ADD6.ENV7.RUN8.CMD9.ENTRYPOINT dockerfile是什么 Dockerfile是一个文本配置文件&#xff0c;用于自动化构建Docker镜像。 Dockerfile是由一系列命令和参数构成的脚本&#xff0c;它指导D…

在Ubuntu20.04(原为cuda12.0, gcc9.几版本和g++9.几版本)下先安装cuda9.0后再配置gcc-5环境

因为自己对Linux相关操作不是很熟悉&#xff0c;所以因为之前的代码报错之后决定要安cuda9.0&#xff0c;于是先安装了cuda9.0。里面用到的一些链接&#xff0c;链接文件夹时直接去copy它的路径&#xff0c;就不那么容易错了。 今天运行程序之后发现gcc环境不太匹配cuda9.0&am…

杰发科技AC7801——Keil编译的Hex大小如何计算

编译结果是Keil里面前三个数据的总和&#xff1a; 即CodeRoDataRWData的总和。 通过ATCLinkTool工具查看内存&#xff0c;发现最后一个字节正好是5328 注意读内存数据时候需要强转成32位&#xff0c;加1000的 增加1024的地址只需要加256即可

【Unity投屏总结】投屏方案总结

【背景】 想方便自己在VR中工作&#xff0c;打算做一个能够挂多个屏幕的远程控制VR桌面。研究下来发现细分场景有很多&#xff0c;有点鱼和熊掌不可兼得的意味&#xff0c;细分如下。 【投屏场景与解决方案】 希望多人能够同时观看我的屏幕&#xff0c;也就是一屏投多屏&…

备战蓝桥杯---0/1Trie模板

最近学校作业有点多被迫参加学校的仪仗队当帕鲁&#xff0c;有许多题还没有补&#xff08;尤其是牛客&#xff0c;寒假时没有怎么管&#xff0c;现在后悔了qaq),蓝桥杯也快来了&#xff0c;一下子事情多了起来&#xff0c;反而不知道要看什么了&#xff0c;在此先立个flag----蓝…

C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码

1 无向连通图中长度为n环 给定一个无向连通图和一个数n,计算图中长度为n的环的总数。长度为n的循环仅表示该循环包含n个顶点和n条边。我们必须统计存在的所有这样的环。 为了解决这个问题,可以有效地使用DFS(深度优先搜索)。使用DFS,我们可以找到特定源(或起点)的长度…

Acrobat Pro DC 2023:PDF编辑与管理的全新体验

Acrobat Pro DC 2023是一款功能强大且全面的PDF编辑和管理软件&#xff0c;旨在为用户提供卓越的PDF处理体验。以下是关于Acrobat Pro DC 2023软件功能特色的详细介绍&#xff1a; PDF编辑和管理&#xff1a;Acrobat Pro DC 2023拥有强大的PDF编辑功能&#xff0c;可以对PDF文…

Grok-1:参数量最大的开源大语言模型

Grok-1&#xff1a;参数量最大的开源大语言模型 项目简介 由马斯克领衔的大型模型企业 xAI 正式公布了一项重要动作&#xff1a;开源了一个拥有 3140 亿参数的混合专家模型&#xff08;MoE&#xff09;「Grok-1」&#xff0c;连同其模型权重和网络架构一并公开。 此举将 Gro…