WorldWind源码剖析系列:WorldWind瓦片调度策略说明
1 基于源码的分析
首先我们来看WorldWind中摄像头变化相关的几个方法的内部逻辑。
1.1 NltTerrainAccessor. GetElevationAt
方法声明:public override float GetElevationAt(double latitude, double longitude, double targetSamplesPerDegree)。
当摄像头高度低于30万米时,才开始显示地面海拔高度值。根据摄像头的经纬度和视野范围(100/视野范围作为计算级别的标准,即每度坐标代表的高程数据跨度)计算取哪个级别、哪个瓦片的地形数据。进而得到该块的cache存放目录,读取cache文件得到高程矩阵。如果cache中没有该瓦片则从服务下载瓦片到cache中。最后计算当前经纬度的海拔高度值。
1.2 CameraBase. Update
方法声明:public virtual void Update(Device device)。
摄像头的视野范围算法,其中弧度计算公式为abs(sin(摄像头的高度/球的半径))*2;度计算公式为abs(sin(摄像头的高度/球的半径))*2*180/3.14。
1.3 QuadTileSet. Update
方法声明:public override void Update(DrawArgs drawArgs)。
如果摄像头的视野范围大于2* TileDrawDistance *LevelZeroTileSizeDegrees,则不显示任何瓦片,同时清空下载请求列表。遥感影像的LevelZeroTileSizeDegrees设置为2.25,地形为18,国界线为36,单位均为度。TileDrawDistance的值系统默认为3.5,即当视野的范围大于7个0级瓦片时,不进行加载显示。因为摄像头的前俯视角度默认为45度,所以图像的0级显示高度为2.25*7*111.13*0.5=875.149km(估算)。
2 调度策略
WorldWind按如下策略调度瓦片:
1) 启动新线程对球体进行遍历更新,根据摄像头的视野范围判断是否需要加载瓦片。如果需要,清空瓦片调度表里面不在当前显示区域范围内的瓦片,并进行瓦片调度
2) 瓦片更新跨度为4,即每次更新的瓦片队列为一个0级的6*6的瓦片矩阵,如下图所示。第一轮,更新加载摄像头经纬度所在瓦片,即下图中0所示瓦片;第二轮、三轮、四轮依次更新数字为1、2、3的瓦片。每轮的策略均为从左到右,从下到上。

图1瓦片更新轮次图
3) 更新单个瓦片的调度流程如下图所示。

图2单瓦片调度流程图
对于上图,在此做以下说明:
a) 初始时,在earth中有Images和Boundaries两种子集。系统对这两个子集遍历调度;
b) 调度表为系统要渲染的瓦片集合;
c) 下载最优算法:在屏幕中占有面积最大的瓦片优先调度下载;
d) 条件a:镜头的视野范围小于2*3.5*块大小并且镜头到块的中心点的距离要小于2.9*块大小*1.25并且块在显示区域范围内;
e) 条件b:镜头的视野范围小于3.5*块大小并且镜头到块的中心点的距离小于2.9*块大小并且块在显示区域范围内。该条件的业务含义是镜头视野范围每缩小一倍,显示级别增加一级,离镜头距离大于2.9个块大小的块,显示级别要低一级。
————————————————
版权声明:本文为CSDN博主「李明子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/free1985/article/details/77440207
WorldWind源码剖析系列:WorldWind瓦片调度策略说明的更多相关文章
- WorldWind源码剖析系列:星球类World
星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球.火星等.该类的类图如下. 需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的.经纬网格的渲染 ...
- WorldWind源码剖析系列:星球球体的加载与渲染
WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...
- WorldWind源码剖析系列:表面瓦片类SurfaceTile
表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...
- WorldWind源码剖析系列:星球表面渲染类WorldSurfaceRenderer
星球表面渲染类WorldSurfaceRenderer描述如何渲染星球类(如地球)表面影像纹理.该类的类图如下. 星球类World包含的主要的字段.属性和方法如下: public const int ...
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...
- WorldWind源码剖析系列:表面影像类SurfaceImage
表面影像类SurfaceImage描述星球类(如地球)表面纹理影像.该类的类图如下. 表面影像类SurfaceImage包含的主要的字段.属性和方法如下: string m_ImageFilePath ...
- WorldWind源码剖析系列:设置类SettingsBase
PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...
- WorldWind源码剖析系列:挂件类Widgets
WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...
- WorldWind源码剖析系列:四叉树瓦片集合类QuadTileSet
四叉树瓦片集合类QuadTileSet是影像瓦片渲染的主要类.使用地形管理器来为3D地形渲染查询高程值.依赖于用来刷新基于经度.纬度.视角范围瓦片的更新线程.该类继承自可渲染对象类Renderable ...
- WorldWind源码剖析系列:四叉树瓦片类QuadTile
四叉树瓦片类QuadTile提供了对影像和地形数据的四叉树访问模型.该类的类图如下. 四叉树瓦片类QuadTile提供的主要字段.属性和方法简要描述如下: public QuadTileSet Qua ...
随机推荐
- docker存储配置与管理--项目三
一.Docker存储概念 1.容器本地存储与Docke存储驱动 容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储.采用的是联合文件系统.通过存 储驱动进行管理. 容器本地存储空间:分层结构 ...
- python之执行shell命令
python 执行shell命令,且执行完后将shell端的输出返回 subprocess import subprocess # 要执行的命令 command = "ls -lrt&quo ...
- ARC127E Priority Queue
ARC127E Priority Queue 分析性质+dp. 思路 由于每次加入的数肯定是一个 \(a\) 的排列,但这个角度不好考虑. 设 \(\{a\}\) 为最终状态的集合,其中 \(a_i& ...
- vim 编辑 运行 shell 文件
Vi/Vim 是所有 Unix/Linux 操作系统默认配备的编辑器.因其强大的功能和高效的操作,Vi/Vim 也成为众多 Unix/Linux 用户.管理员必须掌握并熟练使用的编辑工具之一.尤其是在 ...
- KnowledgeManagement
知识管理建议 总则 总参 从无知到有知 资料收集的习惯 发表是最好的记忆 Wiki 使用 建议: Blog 写作 Discuss 搜索技巧 回复:Yibie的知识管理流程与工具选择 一.个人知识管理的 ...
- 0-JavaScript入门
1.1 JS用途 JavaScript属于一门脚本语言,可用于前端给网页添加一些动态效果. 也可用于node平台,开发服务器 React.Vue框架底层也是通过JS实现 1.2 JS组成 前端分为三层 ...
- ZCMU-1101
这个题不怎么难,就是当时没有理解到字典序的意思:我一直以为是自己元素间的比较,后再同学帮助下明白这里是与其他比,这样就很简单了.就是要求当前那个最小就可以了. 对这道题我有点吐槽明明自己都说了最后一组 ...
- k8s~service和deployment中的spec.selector
service和deployment中的spec.selector 在 Kubernetes 中,Service 和 Deployment 的 spec.selector 在使用上是有一些不同之处的, ...
- 自底向上的语法分析,闭包、GOTO函数
自底向上的语法分析 一.一个串ω归约(reduction)为文法开始符号的过程 关键问题: 1.何时进行规约,2.用哪个产生式规约 句柄右边的串ω一定只包含终结符号. 如果文法是无二义性的,那么文法的 ...
- .NET静态代码编织——肉夹馍(Rougamo)5.0
肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件.相比动态代理AOP需要在应用启动时进行初始化,编译时完成代码编织的肉夹馍减少 ...