热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WorldWind源代码解析:瓦片调度机制详解

本文深入探讨了WorldWind项目中的关键组件——瓦片调度策略。通过源代码分析,我们将了解摄像头移动时如何动态调整瓦片的加载与卸载,确保地图渲染的高效与流畅。

1. 源代码解析

本文将重点解析WorldWind中与摄像头移动相关的核心方法及其内部逻辑。

1.1 NltTerrainAccessor.GetElevationAt 方法解析

方法签名:public override float GetElevationAt(double latitude, double longitude, double targetSamplesPerDegree)。

当摄像头高度低于300公里时,系统开始显示地面的海拔高度。此方法根据摄像头的位置和视角范围,确定所需地形数据的层级和具体瓦片。随后,程序会尝试从缓存中读取相应的高程数据矩阵。若缓存中不存在所需瓦片,则自动从服务器下载并存储至缓存中,最后计算出指定坐标的海拔高度。

1.2 CameraBase.Update 方法解析

方法签名:public virtual void Update(Device device)。

此方法负责计算摄像头的视野范围。其核心算法包括弧度和度数的转换,具体计算公式分别为 abs(sin(摄像头高度/地球半径)) * 2 和 abs(sin(摄像头高度/地球半径)) * 2 * 180 / π。

1.3 QuadTileSet.Update 方法解析

方法签名:public override void Update(DrawArgs drawArgs)。

该方法定义了在特定条件下不显示瓦片的规则,例如当摄像头视野范围超过两倍的 TileDrawDistance 乘以 LevelZeroTileSizeDegrees 时,将不加载任何瓦片,并清除所有下载请求。对于不同类型的地理信息(如遥感影像、地形、国界线),LevelZeroTileSizeDegrees 的设置值各不相同,分别为2.25°、18°和36°。默认情况下,TileDrawDistance 设定为3.5,这意味着当视野覆盖超过7个0级瓦片时,将不再加载新的瓦片。考虑到摄像头的默认俯角为45°,因此0级显示的高度大约为875.149公里。

2. 瓦片调度策略

WorldWind采用了一套复杂的瓦片调度机制来优化地图渲染性能:

1) 系统启动独立线程,根据摄像头的视野动态更新地球模型。若需加载新的瓦片,则先清理掉不再处于当前视域内的瓦片,然后按照预定策略进行调度。

2) 每次瓦片更新涉及一个6x6的0级瓦片矩阵。首次更新聚焦于摄像头位置对应的瓦片,之后依次扩展到周边瓦片,遵循从左至右、从下至上的顺序。

技术分享图片

图1:瓦片更新序列示意图

3) 单个瓦片的调度流程如图2所示。

技术分享图片

图2:单瓦片调度流程图

关于图2的几点说明:

a) 地球模型包含Images和Boundaries两个主要子集,系统对这两个子集进行遍历调度。

b) 调度表记录了待渲染的所有瓦片。

c) 优先级最高的瓦片是那些在屏幕上占据较大面积的瓦片。

d) 条件a:当摄像头的视野范围小于2 * 3.5 * 块大小且到块中心的距离小于2.9 * 块大小 * 1.25,且块位于视域内时,该块将被调度。

e) 条件b:当摄像头的视野范围小于3.5 * 块大小且到块中心的距离小于2.9 * 块大小,且块位于视域内时,该块将被调度。这表明随着摄像头视野范围的减小,显示的细节层次将逐步增加;而距离摄像头较远的块,其显示的细节层次将相应降低。


推荐阅读
  • scrapyredis分布式爬虫 ... [详细]
  • A题简单判断#includeusingnamespacestd;typedeflonglongll;intt;intmain(){cint;whil ... [详细]
  • 本文基于https://major.io/2014/05/13/coreos-vs-project-atomic-a-review/的内容,对CoreOS和Atomic两个操作系统进行了详细的对比,涵盖部署、管理和安全性等多个方面。 ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • Flutter 高德地图插件使用指南
    本文档详细介绍了如何在Flutter项目中集成和使用高德地图插件,包括安装、配置及基本使用方法。 ... [详细]
  • 本文介绍了一个基于 div 标签设计的宿舍管理系统登录页面,包括用户身份选择、记住我功能以及错误信息提示。 ... [详细]
  • Iris 开发环境配置指南 (最新 Go & IntelliJ IDEA & Iris V12)
    本指南详细介绍了如何在最新的 Go 语言环境及 IntelliJ IDEA 中配置 Iris V12 框架,适合初学者和有经验的开发者。文章提供了详细的步骤说明和示例代码,帮助读者快速搭建开发环境。 ... [详细]
  • 本文通过具体示例探讨了在 C++ 中使用 extern "C" 的重要性及其作用,特别是如何影响编译后的对象文件中的符号名称。 ... [详细]
  • databasesync适配openGauss使用指导书
    一、database-sync简介database-sync作为一种开源辅助工具,用于数据库之间的表同步,更确切的说法是复制,可以从一个数据库复制表到另一个数据库该工具支持的功能如 ... [详细]
  • 本文详细介绍了如何在Arch Linux系统中安装和配置FlashTool,包括必要的依赖项安装和udev规则设置,以确保工具能够正确识别USB设备。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • 本文介绍了如何通过十折交叉验证方法评估回归模型的性能。我们将使用PyTorch框架,详细展示数据处理、模型定义、训练及评估的完整流程。 ... [详细]
  • 本文探讨了在一个UIViewController中同时存在两个或更多tableView时,若它们的初始Y坐标相同,则可能出现布局异常的问题,并深入解析了automaticallyAdjustsScrollViewInsets属性的作用及其设置方法。 ... [详细]
  • 本文章介绍了如何将阿拉伯数字形式的金额转换为中国传统的大写形式,适用于财务报告和正式文件中的金额表示。 ... [详细]
  • 随着科技的快速发展,Web前端设计也在不断创新,出现了多种新颖的布局技术。本文将重点探讨两种常见的布局方法——圣杯布局与负边距布局,旨在帮助开发者更好地掌握页面布局技巧。 ... [详细]
author-avatar
微公号莆田鞋园
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有