OpenLayers3, 航线动画实现


一、前言

本文基于OpenLayers3,实现航线动画的功能。

二、代码实现

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>航线动画</title>
    <link href="../../libs/ol3/ol.css" rel="stylesheet" type="text/css" />
    <script src="../../libs/ol/ol.js" type="text/javascript"></script>
    <script src="../../libs/arc.js" type="text/javascript"></script>
</head>
<body>
    <div id="map" style="width: 100%; height: 95%; position: absolute;">
    </div>
    <script type="text/javascript">
    var tdttk = '*****' // tdttk 为天地图密钥
        var map = new ol.Map({
     
     
            layers: [
              new 
### 使用 OpenLayers 绘制行路径 为了在地图上绘制并展示机的行路径,可以利用 `VectorLayer` 和 `VectorSource` 来创建图层,并通过设置样式来增强视觉效果。下面是一个具体的实现方法: #### 创建矢量源和图层 首先定义一个用于存储行数据的矢量源对象,接着基于此源构建一个新的矢量图层实例。 ```javascript const flightsSource = new ol.source.Vector({ features: [] // 初始为空,稍后会填充特征 }); const flightsLayer = new ol.layer.Vector({ source: flightsSource, style: new ol.style.Style({ stroke: new ol.style.Stroke({ color: &#39;rgba(0, 0, 255, 0.8)&#39;, width: 3 }) }) }); map.addLayer(flightsLayer); ``` 上述代码片段展示了如何初始化一个名为 `flightsSource` 的矢量源以及相应的 `flightsLayer` 图层[^2]。 #### 添加行路线的数据点 接下来要做的就是向这个矢量源中加入表示行路径的一系列坐标点。这些点通常由时间序列组成,代表了机随时间变化的位置信息。 假设有一个包含多个地理位置的对象数组 `flightPathData` ,其中每个元素都具有经度 (`lng`) 和纬度 (`lat`) 属性,则可以通过遍历该数组并将每一对经纬度转换成几何对象(如线串),再将其作为要素添加至矢量源内。 ```javascript // 假设 flightPathData 是预先准备好的行路径数据集 let lineStringCoordinates = []; for (let i = 0; i < flightPathData.length; ++i) { let coordinate = ol.proj.fromLonLat([flightPathData[i].lng, flightPathData[i].lat]); lineStringCoordinates.push(coordinate); if ((i + 1 === flightPathData.length || Math.random() > 0.9)) { // 随机决定何时结束当前线段 const feature = new ol.Feature(new ol.geom.LineString(lineStringCoordinates)); flightsSource.addFeature(feature); // 清空坐标列表以便开始新的线段 lineStringCoordinates = []; } } if (lineStringCoordinates.length !== 0){ const lastSegment = new ol.Feature(new ol.geom.LineString(lineStringCoordinates)); flightsSource.addFeature(lastSegment); } ``` 这段脚本负责处理给定的行路径数据,并按照一定逻辑分隔出不同的线段,最终形成完整的行轨迹。 #### 实现动态动画效果 为了让用户能够直观感受到机沿既定路径移动的过程,还可以引入动画机制。这涉及到定时更新视图中心位置以及其他可能影响用户体验的因素,比如缩放级别等。 对于简单的动画来说,在特定的时间间隔里逐步改变地图视角即可达到目的;而对于更复杂的场景则需考虑更多细节,例如模拟真实的行速度、方向调整等等。 ```javascript function animateFlight(pathCoords, duration=6000){ // 默认持续时间为6秒 var start = Date.now(); function frame(){ var elapsed = Date.now() - start; var n = pathCoords.length; if(elapsed >= duration){ view.setCenter(pathCoords[n-1]); // 结束时停留在最后一个坐标处 return; } var progress = elapsed / duration * (n-1)|0; view.setCenter(pathCoords[Math.min(progress,n-1)]); requestAnimationFrame(frame); } frame(); } animateFlight([ ...lineStringCoordinates.flat().reduce((acc,val,idx,arr)=>{ if(idx%2===0 && idx<arr.length-1){ acc.push([val, arr[idx+1]]); } return acc; },[]) ], 6000); // 动态播放整个行过程 ``` 以上函数实现了基本的地图平移动画功能,它接收一组二维坐标参数 `pathCoords` 及可选的总时长 `duration` 。内部采用递归调用的方式不断刷新地图中央位置直至完成全部行程[^1]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gis分享者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值