使用Leaflet.rotatedMaker进行航班飞行航向模拟的实践

目录

前言

一、Leaflet的不足

1、方向插件

 2、方向控制脚本说明

二、实时航向可视化实现

1、创建主体框架

2、飞机展示

3、位置和方位模拟

三、成果及分析

1、成果展示

2、方向绑定解读

总结


前言

        众所周知,物体在空间中的运动(比如飞行、跑步、开车、轮渡)等等,随着时间的推移,不仅仅是时空位置在不断的发生变化,同时其方向也是在发生变化。以飞机为例,在不同的时刻,某一时刻其是保持45度角飞行,其它时刻又是保持15度飞行。而在战斗过程当中,飞机的航向将变得更加的迅速。在航海或者自驾过程也是的,会随着河流、洋流或者道路而转向。在这些发生在时空中的运动过程当中,除了将地理空间位置结合WebGIS进行展示,同时还能展示其飞行的航向。这是今天的博文想要讲解的主题。

        上述是一张全球实时航班轨迹系统的截图,传送门, 这里就很好行的表达了此时飞机的飞行情况。通过飞机实时位置的跟踪,掌握飞机的运行状态。本文以模拟实现上述场景为例,重点讲解在Leaflet当中,如何实现飞机的航线展示,同时在不同的时刻可以展示其飞行方向。

一、Leaflet的不足

        假如没有飞行航向的需求,在一般的WebGIS系统的实现中,我们应该如何来实现上述的需求呢?在Leaflet当中,展示一条飞行航线和展示一个位置是非常简单的。只需要把PolyLine和Marker就可以实现,如果要把飞机展示出来,需要找一个飞机的小图标。在Leaflet当中,并没有对保持航向的实现进行说明。本节主要对方向控制的插件进行简单介绍。

1、方向插件

        这里我们介绍一款基于Leaflet的方向可调整插件,Leaflet Rotated Marker插件地址,这里给出的地址是基于gitee的一个版本。可以用作学习使用。

        使用git命令,将源代码clone到本地之后可以看到,其源码还是非常简单的。最主要的一个插件就是leaflet.rotatedMarker.js。脚本大小3KB,还是比较简单的。

 2、方向控制脚本说明

        为了让大家对leaflet.rotatedMarker.js有一个简单的认识,这里对其做一个简单的分析。leaflet.rotatedMarker.js是一个继承与Leaflet的marker插件。是marker的一个子类。通过扩展marker的一些属性来进行对象能力扩展。

// save these original methods before they are overwritten
var proto_initIcon = L.Marker.prototype._initIcon;
var proto_setPos = L.Marker.prototype._setPos;

          其对Marker的方法做了以下的扩展。

L.Marker.addInitHook(function () {var iconOptions = this.options.icon && this.options.icon.options;var iconAnchor = iconOptions && this.options.icon.options.iconAnchor;if (iconAnchor) {iconAnchor = (iconAnchor[0] + 'px ' + iconAnchor[1] + 'px');}this.options.rotationOrigin = this.options.rotationOrigin || iconAnchor || 'center bottom' ;this.options.rotationAngle = this.options.rotationAngle || 0;// Ensure marker keeps rotated during draggingthis.on('drag', function(e) { e.target._applyRotation(); });});
参数类型默认值描述
rotationAngleNumber0Rotation angle, in degrees, clockwise,单位是度
rotationOriginStringbottom centerThe rotation center, as a [`transform-origin`]CSS rule

        与新增的属性控制相同,与此一并新增还有控制的方法:

setRotationAngle: function(angle) {this.options.rotationAngle = angle;this.update();return this;},setRotationOrigin: function(origin) {this.options.rotationOrigin = origin;this.update();return this;
}

        这两个方法主要是用于控制航向的参数。对核心展示方法的介绍到此。代码比较简单,容易掌握。下面进行实例的开发。

二、实时航向可视化实现

        本节主要以实战的方式对航向可视化进行重点讲解。对于一些重复的代码不进行过多的讲述。这里展示的数据为模拟的虚拟数据,不代表实际运行数据。如果大家有公开的飞行数据,可以在评论区告知一下博主,万分感谢。

1、创建主体框架

        需要对地图展示对象及飞行航线及实时轨迹进行展示的主体框架。关键代码如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><title>leaflet.rotatedMarker实现飞行航向跟踪</title><link rel="stylesheet" href="/2d/leaflet/leaflet.css" /><style>* { margin: 0; padding: 0; }html, body { height: 100%; }#map { width:100%; height:100%; }</style><script src="/2d/leaflet/leaflet.js?v=1.0.0"></script><script src="leaflet.rotatedMarker.js"></script></head><body><div id="map"></div><script>var map = L.map('map', {center: [29.113775, 112.609863],zoom: 6,layers: [L.tileLayer('http://localhost:8086/data/xxgc/q0403/{z}/{x}/{y}.png', {attribution: '&copy; <a href="http://osm.org/copyright">yelangking</a> contributors'})]});</body>
</html>

        在上述的代码中,将地图对象和展示的map容器绑定在了一起。同时通过代码创建了一个map对象,并进行了基础图层的绑定设置。

2、飞机展示

        在leaflet中,我们可以自定义marker对象的icon属性来设置不同的图表。可以到icon网站上下载飞机的png图片,png背景是透明的,叠加到地图上效果比较好。通过下面的代码进行定义。

var blueIcon = L.icon({iconUrl: './air1.png',iconSize:     [30, 30], // icon的大小iconAnchor:   [16, 15], // icon的渲染的位置(相对与marker)shadowAnchor: [0, 0],  // shadow的渲染的位置(相对于marker)popupAnchor:  [0, 0] //若是绑定了popup的popup的打开位置(相对于icon)
});

3、位置和方位模拟

        这里采用模拟数据的方式对位置和方位进行模拟,在实际项目中,如果可以接入实时位置,就可以实现动态位置和方位了。模拟数据包含两个部分,第一个是模拟一条飞行航线的所有点,代表是从【昆明】飞往【温州】的一条航线,另一个是实时的飞机位置和方位数据。

//航线飞行
var data = [{'lat':24.846565,'lng':102.65625,'name':"昆明市",'ang':75,"title":"东航6523"},{'lat':26.470573,'lng':106.655273,'name':"贵阳市",'ang':80,"title":"东航6523"},{'lat':27.469287,'lng':110.01709,'name':"怀化市",'ang':80,"title":"东航6523"},{'lat':28.149503,'lng':112.983398,'name':"长沙市",'ang':80,"title":"东航6523"},{'lat':28.632747,'lng':115.883789,'name':"南昌市",'ang':100,"title":"东航6523"},{'lat':27.858504,'lng':120.739746,'name':"温州市",'ang':120,"title":"东航6523"}];
 //实时位置
var currentFly =[{'lat':29.53523,'lng':106.54541,'ang':25,"title":"国航3265"},{'lat':30.637912,'lng':104.040527,'ang':-32,"title":"川航2369"},{'lat':26.352498,'lng':111.665039,'ang':-80,"title":"东航6573"},{'lat':24.706915,'lng':113.598633,'ang':-50,"title":"上航6023"},{'lat':30.183122,'lng':120.256348,'ang':100,"title":"海航5002"},{'lat':30.543339,'lng':114.279785,'ang':120,"title":"厦航6523"} ];

        位置添加和方位展示核心代码如下:

var lineArray = new Array();
for(var i = 0;i<data.length;i++){var item = data[i];var m = L.marker(L.latLng(item.lat, item.lng),{icon: blueIcon,title:item.title,rotationAngle: item.ang,draggable: true});lineArray.push([item.lat, item.lng]);m.addTo(map).bindPopup("飞行城市:" +item.name + "<br/>位置:【" + item.lng + "," + item.lat +"】" );
}var polyline = L.polyline(lineArray, {color: 'red'}).addTo(map);
for(var i = 0;i<currentFly.length;i++){var item = currentFly[i];var m = L.marker(L.latLng(item.lat, item.lng),{icon: blueIcon,title:item.title,rotationAngle: item.ang,draggable: true});m.addTo(map).bindPopup("位置:【" + item.lng + "," + item.lat +"】" );
}

        rotationAngle这个属性即表示最重要的方向。通过这个属性就能展示实时方向。以上代码就完成了飞行航线和方向的可视化。下面来看一下实际的效果与最开始我们的期望是否一致。

三、成果及分析

        这是本文的第三节,将对实例的最终成果进行展示,同时结合代码进行简单的分析。让读者更详细的掌握实现原理。

1、成果展示

飞行航线整体展示示意图 

点击信息提示示意图 

2、方向绑定解读

        这里结合源码对方向的绑定和初始化进行简单解读,依然采用熟悉的debug调试的模式。

        在点进行初始化的时候,会自动将方向传入到初始方法中,直接对属性进行赋值。 

         在展示过程中,会对浏览器进行识别,需要调用不同的样式设置对方向进行设置来完成飞机航向的控制。

总结

         以上就是本文的主要内容,本文以模拟实现上述场景为例,重点讲解在Leaflet当中,如何实现飞机的航线展示,同时在不同的时刻可以展示其飞行方向。行文仓促,难免有不足之处,欢迎各位专家朋友批评指正。

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

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

相关文章

Windows11 使用 VirtualBox 安装创建 Ubuntu虚拟机

〇、背景 开发者大比例习惯都是Windows下编辑代码&#xff0c;比如使用Windows的Visual Studio Code进行代码的开发。但不管是AOSP还是鸿蒙开发&#xff0c;目前都不支持windows本地环境编译的&#xff0c;建议使用Ubuntu操作系统环境对源码进行编译。 因此&#xff0c;没有U…

redis集群配置(精华版):主从复制模式

主从复制模式 概念&#xff1a;作用&#xff1a;为什么使用集群&#xff1a;动手实操1、环境准备2、配置redis.conf配置文件3、再次查看主从节点信息4、验证主从模式 概念&#xff1a; ​ 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器…

Manjaro 安装全新 Linux 版微信,从此告别 Wine

目前已经基本上使用 Manjaro 来工作&#xff0c;而工作离不开微信作为日常的工作沟通工具。因为微信官方一直没有 Linux 版本的&#xff0c;所以之前都只能够使用 Wine 版本&#xff0c;然后踩了不少坑&#xff0c;但还算能勉强使用。 最近听说微信终于要发布 Linux 版本的&am…

网络层/数据链路层/其他协议/ARP/NAT

网络层 IP协议 前置认识 我们之前详谈过TCP协议&#xff0c;TCP协议主要是提供一种可靠的传输策略&#xff0c;但是并不能直接将报文发送给对方主机&#xff0c;而IP协议的本质就是提供一种将数据跨网络从A主机送到B主机的能力&#xff0c;而用户需要的是一种将数据 可靠的 跨…

git 代码冲突处理

在多人共同维护一个 git 项目的时候, 合并代码难免会遇到冲突的情况. 假设当前分支是 tmp 分支, 以 git merge dev 为例, 把 dev 的代码合并到 tmp 分支 处理冲突大致有3种情况: 使用 tmp 的代码使用 dev 的代码根据具体冲突的行进行处理 建议在遇到代码冲突的时候, 每个冲…

containerd快速安装指南

1 containerd快速安装指南&#x1f680; 本指南旨在提供一个简洁有效的方法来安装containerd。我们将通过一份易于理解的脚本步骤&#xff0c;指导您完成安装&#x1f527;。请根据您的实际需求&#xff0c;适当调整containerd版本及其相关依赖。 注意事项&#xff1a; 本安装…

题目 1414: 最大的字母

题目描述: 多组数据&#xff0c;每组输入一串字符串&#xff0c;对于输入的每个字符串&#xff0c;查找其中的最大字母&#xff0c;并在该字母后面插入字符串“(DJTU)”。 代码: package lanqiao;import java.util.*; public class Main {public static void main(String[] …

【数据结构】新篇章 -- 顺序表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

银行监管报送系统介绍(八):银行业大额交易和可疑交易报告数据报送

依据《金融机构大额交易和可疑交易报告管理办法》&#xff1a; 第五条 金融机构应当报告下列大额交易&#xff1a; &#xff08;一&#xff09;当日单笔或者累计交易人民币5万元以上&#xff08;含5万元&#xff09;、外币等值1万美元以上&#xff08;含1万美元&#xff09;的…

AI大模型引领金融创新变革与实践【文末送书-46】

文章目录 AI大模型的定义与特点AI大模型在金融领域的应用 01 大模型在金融领域的 5 个典型应用场景02 大模型在金融领域应用所面临的风险及其防范03 AIGC 技术的科林格里奇困境04 金融机构使用 AIGC 技术的 4 条可能路径AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践…

短剧小程序开发微视频短剧系统搭建

开发短剧小程序微视频短剧系统需要以下几个步骤&#xff1a; 1. **需求分析**&#xff1a;确定小程序的主要功能&#xff0c;包括但不限于观看视频、点赞、评论、分享、收藏等功能。同时要考虑系统的兼容性和可扩展性&#xff0c;确保将来可能的更新和维护。 2. **选择合适的后…

农学院智慧农业产教融合基地解决方案

第一章 背 景 1.1国际数字农业发展概况 随着全球信息化、智能化技术的快速发展&#xff0c;数字农业作为现代农业发展的重要方向&#xff0c;正日益受到国际社会的广泛关注。数字农业依托物联网、大数据、云计算、人工智能等现代信息技术&#xff0c;实现农业生产全过程的智能…

上采样技术在语义分割中的应用

目录 概要 一、概述 二、实现方法 1.转置卷积 2.反池化 3.双线性插值法 三、在经典网络中的的应用 1.U-Net 2.FCN 总结 概要 上采样是用于深度学习中提高语义分割精度的技术&#xff0c;可以实现图像放大和像素级别标注 一、概述 神经网络的基本结构为&#xff1a;…

解决MySQL登陆报错:Unable to load authentication plugin ‘caching_sha2_password‘.

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; 问题&#xff1a;使用工具登录mysql时若报错&#xff1a;Unable to load authentication plugin caching_sha2_password. 分析&#xff1a;无法识别密码引擎&#xff0c;这时需要去查看所需登陆用户的密码…

解决MySQL日期字段类型不匹配导致的时间区间查询异常

前言 在今天的开发过程中&#xff0c;我碰到了一个关于时间查询的bug。在使用MyBatis Plus的Lambda表达式进行时间区间查询时&#xff0c;发现某些满足条件的数据无法被正确检索出来。经过一番分析&#xff0c;发现问题根源在于查询条件与数据库实际存储的时间格式不匹配。 问…

我是如何在学术界占有一席之地的——专注于我的写作

罗伯特纽贝克 “作为一个移民&#xff0c;你是怎么发表这么多文章的&#xff1f;”意识到我不是以英语为母语的人&#xff0c;当我去年面试教职时&#xff0c;人们无数次问过这个问题。我知道披露我的挣扎不太可能让我找到工作&#xff0c;所以我会笑着说&#xff1a;“我喜欢…

设计模式88

一、创建型模式&#xff08;5种&#xff09; 1、工厂方法模式 同一类产品的生产 2、抽象工厂模式 将同一个具体工厂所生产的位于不同等级的一组产品称为产品族&#xff0c;例如&#xff08;衣服鞋子帽子&#xff09; 同一级别 3、单例模式 4、建造者模式 建造者和指挥者…

Python实现VMware自动化资源巡检

推送效果&#xff1a; E:\PYPJ1\Scripts\python.exe C:\Users\PycharmProjects\pythonProject\main.py 自动化巡检-执行时间&#xff1a;2024-03-25 14:47:04 Connected to vCenter Found datacenter: CN-SH-Datacenter----------存储资源指标---------- 资源总容量&#xff…

实验报告-04

实验名称&#xff1a;实验四 递推问题&#xff08;一&#xff09; 实验目的&#xff1a;熟练掌握一些递推问题的处理方法&#xff1a;仔细分析&#xff0c;不断尝试推理&#xff0c;充分利用数学知识&#xff0c;找出问题中的内在规律&#xff0c;抽象出递推的数学模型。 实验…

【c 语言 】malloc函数详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…