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 ...
随机推荐
- KubeSphere 社区双周报 | 2024.01.04-01.18
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- bresenham算法(贝汉明算法)
- 选择程序设计(python)
文章目录 1.基本概念 2.程序基本结构 3.实例 3.1 判断一个人年龄属于未成年人还是成年人 3.2判断是否是闰年 1.基本概念 Python选择程序设计是通过一条或多条语句的执行结果(True或 ...
- MudBlazor:基于Material Design风格开源且强大的Blazor组件库
项目介绍 MudBlazor是一个基于Material Design风格开源.免费(MIT License).功能强大的Blazor组件框架,注重易用性和清晰的结构.它非常适合想要快速构建Web应用程 ...
- ARC151D Binary Representations and Queries
ARC151D Binary Representations and Queries 题目链接:ARC151D Binary Representations and Queries 非常好思维题. 思 ...
- 2023NOIP A层联测26 T4 abstract
2023NOIP A层联测26 T4 abstract 乱证明求性质的光速幂优化题. 思路 对于每一个节点,到该节点的子树内的叶子节点的路径中(包括路径上的点),出现的值只有 \(k\times(\l ...
- SpringMVC-Mybatis-Maven项目整合
上次不知道为什么,把写好的系列文章都搞成一样了.结果,五篇文章,都变成了最后一篇文章. 悲剧,好吧,只好重新写了. 这系列文章写的是SpringMVC-Mybatis-Maven项目整合.说白了,其实 ...
- Nodejs调试之Chrome Devtools
转载: https://mp.weixin.qq.com/s/tqGWizPUFnuVWRcXcxyv2g 俗话说:"工欲善其事,必先利其器",调试是每一个开发人员都要遇到的问题, ...
- Sublime之快捷操作
列举常用的Sublime操作,涉及操作 1.每行默认需要统一添加逗号 1)全选 ctrl + a 2) 组合键 ctrl + shift + l 即可进行操作 (这里是L哦) 之后也可以使用HOME键 ...
- 在自家的代码生成工具中,增加对跨平台WxPython项目的前端代码生成,简直方便的不得了
在经过长时间对WxPython的深入研究,并对其构建项目有深入的了解,以及完成对基础框架的完整改写后,终于在代码生成工具完全整合了基于 Python 跨平台方案项目的代码快速生成了,包括基于FastA ...