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

这篇具有很好参考价值的文章主要介绍了基于Lealfet.js展示Turf.js生成的平滑曲线实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、问题的由来

1、创建网页框架

2、创建map对象

3、构建点位,生成路线

 二、Turf.js平滑曲线改造

1、官网方法介绍

2、0.4弯曲度曲线

3、0.85弯曲度曲线

4、0.1度弯曲曲线

5、综合对比 

总结


前言

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

unpkg turf,leaflet,turf.js平滑曲线生成,webgis平滑曲线实践

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

         本博客给出一种解决方案,熟悉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);

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

unpkg turf,leaflet,turf.js平滑曲线生成,webgis平滑曲线实践

 二、Turf.js平滑曲线改造

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

1、官网方法介绍

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

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

        bezierSpline方法参数

参数 类型 描述
line Feature <LineString> input LineString
options Object 可选参数:见下文

        options选项

属性 类型 默认值 描述
resolution number 10000 点之间的时间(毫秒)
sharpness number 0.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弯曲度的路线设置为红色。在浏览器中查看实际效果。很明显可以看到,与原始路线相比,整条路线看起来平滑多了。

unpkg turf,leaflet,turf.js平滑曲线生成,webgis平滑曲线实践

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的弯曲度

unpkg turf,leaflet,turf.js平滑曲线生成,webgis平滑曲线实践

        我们发现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的弯曲度
	

unpkg turf,leaflet,turf.js平滑曲线生成,webgis平滑曲线实践

5、综合对比 

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

unpkg turf,leaflet,turf.js平滑曲线生成,webgis平滑曲线实践

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

序号 弯曲度 实际效果
1 0.1 与原始拟合
2 0.4 有一定弯曲
3 0.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中如何展示平滑曲线有一定的处理需求,不妨来看看这篇博客。行文仓促,难免有不当之处,欢迎各位小伙伴,各位专家批评指正。文章来源地址https://www.toymoban.com/news/detail-845271.html

到了这里,关于基于Lealfet.js展示Turf.js生成的平滑曲线实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++计算贝塞尔曲线(折线平滑为曲线)坐标方法

    效果可查看上一篇博文: js手动画平滑曲线,贝塞尔曲线拟合 【代码】js手动画平滑曲线,贝塞尔曲线拟合。 https://blog.csdn.net/qiufeng_xinqing/article/details/131711963?spm=1001.2014.3001.5502 代码如下:

    2024年02月16日
    浏览(29)
  • echarts折线图流动特效的实现(非平滑曲线)

    echarts官网:series-lines 注意:流动特效只支持非平滑曲线(smooth:false) series-lines路径图 : 用于带有起点和终点信息的线数据的绘制,主要用于地图上的航线,路线的可视化。 ECharts 2.x 里会用地图上的 markLine 去绘制迁徙效果,在 ECharts 3 里建议使用单独的 lines 类型图表。

    2024年02月14日
    浏览(34)
  • 区块链系统探索之路:基于椭圆曲线的私钥与公钥生成

    前两节我们探讨了抽象代数的重要概念:有限域,然后研究了基于椭圆曲线上点的怪异”+“操作,两者表面看起来牛马不相及,实际上两者在逻辑上有着紧密的联系,简单来说如果我们在椭圆曲线上取一点G,然后让它跟自己做”+“操作,那么所得结果形成的集合就会构成有限

    2024年02月02日
    浏览(37)
  • 【unity小技巧】使用贝塞尔曲线实现导弹随机攻击敌人,也可以用于平滑拾取物品

    参考原视频链接: 【视频】:https://www.bilibili.com/video/BV1aU4y1v7yM/ 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月13日
    浏览(26)
  • 在SpringBoot中基于CanvasLabel的地震基础信息展示实践

    目录 前言 一、数据库设计 1、数据库设计 2、sql脚本  3、数据记录 二、SpringBoot后台设计与实现 1、Mapper访问层及实体定义 2、Service层实现 3、控制层实现 三、地震信息展示 1、展示数据接入   2、最终效果 总结         在上一篇博客中,对于在Leaflet中进行矢量数据进行

    2024年01月25日
    浏览(28)
  • uni-app map路线轨迹回放功能及turf.js实现缓冲区渲染(微信小程序)

    使用uni-app中 map组件实现路线轨迹回放功能。  1、通过接口获取返回的轨迹点。 2、地图的坐标系与轨迹点的坐标系要保持一致,否则轨迹有偏差。点经纬度转换,wgs84togcj02 =》js工具类合集(utils.js) 3、绘制开始结束点,设置地图经纬度。 4、polyline,绘制路线点,属性:[

    2024年02月11日
    浏览(40)
  • 基于大数据的可视化:数据分析和展示的最佳实践

    作者:禅与计算机程序设计艺术 随着互联网、移动互联网、大数据等技术的广泛应用,用户对于各种各样的数据已经产生了海量的需求。数据呈现的形式也变得越来越多样化,包括报表、图表、地图、流程图、模型等。而如何将这些数据可视化、交流和传播,是一个重要的方

    2024年02月09日
    浏览(30)
  • 曲线生成 | 基于多项式插值的轨迹规划(附ROS C++/Python/Matlab仿真)

    🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。 🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法 多项式插值(polynomial

    2024年02月03日
    浏览(27)
  • 基于小程序的商品展示+springboot+vue.js附带文章和源代码设计说明文档ppt

    🌞 博主介绍 :✌CSDN特邀作者、985计算机专业毕业、某互联网大厂高级全栈开发程序员、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导、面试辅导、简

    2024年02月20日
    浏览(38)
  • Three.js -相机平滑移动

    一、安装 二、引入 三、使用 最后不要忘了在render中执行 TWEEN.update();

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包