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 ...
随机推荐
- 云原生爱好者周刊:这款支持全平台的 Podman Desktop 值得一试
开源项目推荐 Podman Desktop Companion Podman 桌面客户端,支持 macOS.Windows 和 Linux 平台,后端支持原生 Podman(仅支持 Linux).Po ...
- 如何在离线的Linux服务器上部署 Ollama,并使用 Ollama 管理运行 Qwen 大模型
手动安装 Ollama 根据Linux的版本下载对应版本的 Ollama, 查看Linux CPU型号,使用下面的命令 #查看Linux版本号 cat /proc/version #查看cpu架构 l ...
- php如何解决高并发
PHP交流群 656679284 为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步! 1.应用和静态资源分离 将静态资源(js,css,图片等)放到专门的服务器中. 2.页面缓存 将应用 ...
- OpenAI使用AI编程给出了数数问题的解决方案 —— 如何解决ChatGPT不会数数的问题
总所周知的一个问题,那就是ChatGPT不会数数,不过今天突然发现OpenAI给出了一个神奇的解决方法,那就是AI编程. 问题案例如下: The text provided will be analy ...
- 3.19 Linux命令的执行过程是怎样的?(新手必读)
前面讲过,在 Linux 系统中"一切皆文件",Linux 命令也不例外.那么,当编辑完成 Linux 命令并回车后,系统底层到底发生了什么事情呢? 简单来说,Linux 命令的执 ...
- 开源 - Ideal库 -获取特殊时间扩展方法(四)
书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法. 01.获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天(周一)核心思想是一样的,只是把求周一改成求周几而 ...
- 惊爆!72.1K star 的 Netdata:实时监控与可视化的超炫神器!
在当今复杂的 IT 环境中,实时监控与可视化对于保障系统的稳定运行和性能优化至关重要. 无论是服务器.应用程序,还是网络设备,及时获取性能数据能够帮助我们快速定位问题.优化资源配置. Netdata, ...
- 从零开始的Python世界生活——内置模块(Math)
从零开始的Python世界生活--内置模块(Math) Python的math模块提供了丰富的数学函数和常数,支持基本的数学运算.三角函数.对数.指数等,适用于科学计算和工程应用. 数学常量: 注意m ...
- vue之slot和slot-scope
插槽分两类,默认插槽和具名插槽:通俗理解就是默认插槽是没有名称的插槽,具名插槽是有名称的插槽. 何时使用插槽?简单的举个栗子:有2个组件,父组件father,子组件son. 父组件 father &l ...
- golang之增加版本信息功能
在实际开发中,当开发完一个 apiserver 特性后,会编译 apiserver 二进制文件并发布到生产环境,很多时候为了定位问题和出于安全目的(不能发错版本),我们需要知道当前 apiserver ...