WorldWind实时确定、更新、初始化和渲染地形和纹理数据

原文链接: http://www.cnblogs.com/rainbow70626/p/5597267.html

当用户点击WorldWind中的地球时,首先响应的是WorldWindow.OnPaint()函数,后续程序的调用流程如下图所示。

零散知识点:

1、         地形瓦片类TerrainTile引用了地形瓦片服务类TerrainTileService,在TerrainTile的Initialize()函数中实例化并发起了地形下载请求类TerrainDownloadRequest对象。而在TerrainTileService类中也引用了TerrainTile类,通过GetTerrainTile()函数返回一个TerrainTile类对象。

2、         地形访问器类TerrainAccessor或其子类NltTerrainAccessor的构造函数中也引用了TerrainTileService。其中使用Hashtable对象m_tileCache存储了当前需要加载或下载的地形瓦片缓冲实体类TerrainTileCacheEntry对象,用于建立和维护一个访问下载请求队列。ConfigurationLoader类的私有成员方法private static TerrainAccessor[] getTerrainAccessorsFromXPathNodeIterator(XPathNodeIterator iter, string cacheDirectory)中采用了如下图所示代码先构造TerrainTileService类对象tts,然后再将tts作为参数之一构造TerrainAccessor类对象newTerrainAccessor。

3、         TileSizeDegree:每个瓦片覆盖的度数大小;

       SamplesPerTile: 每个瓦片的高程采样点数;

4、         星球表面渲染类WorldSurfaceRenderer和表面瓦片类SurfaceTile之间相互引用,且SurfaceTile类中定义了存储高程数据的二维数组float[,] m_HeightData = null,如果该数组为空则当层级大于2,则将TerrainTileService类二维数组public float[,] ElevationData赋值给m_HeightData,如果当前层级小于或等于2或ElevationData为空,则为m_HeightData重新分配空间。SurfaceTile.Initialize(DrawArgs drawArgs)函数调用了TerrainAccessor类的public virtual TerrainTile GetElevationArray(double north, double south, double west, double east, int samples)和SurfaceTile.buildTerrainMesh()。

5、         四叉树瓦片类QuadTile中引用了地形瓦片类TerrainTile,返回tile,而tile包含高程数组ElevationData。

6、         配置加载器类ConfigurationLoader的Load()函数从XML文件Earth.xml中解析出地形访问器类对象,并且该对象作为参数构造World对象newWorld。

7、         m_World. Update(DrawArgs drawArgs)函数内部当相机高度小于30000米时,才调用this. TerrainAccessor. GetElevationArray(B,L,S)计算出用户鼠标点击处的地形高程,具体内容为:(1)判断地形瓦片服务是否为空;(2) 判断更高分辨率数据集是否为空;(3)通过调用TerrainTileService. GetTerrainFile () 函数获取鼠标点击区域的TerrainTile 对象,然后将其加入到访问下载请求Hashtable对象m_tileCache 中;(4)判断所请求的瓦片缓存实体对象(是对TerrainTile类的进一步封装)是否已经初始化,如否则完成地形瓦片的初始化工作。所谓初始化实质上是解析扩展名为.bil的二进制文件中的数据,放入二维数组ElevationData[x,y]。其中,x=y= 150,代表150X150个格网点的高程数据;(5)调用ttce.TerrainTile. GetElevationAt(B,L)获取用户点击处经纬度的高程值,采用双线性内插方法插值得到并返回。在WorldWind V1.4.0.1版本中,上述功能代码被移入WorldWindow.cs文件的WorldWindow.Render()函数中。

[转载]WorldWind实时确定、更新、初始化和渲染地形和纹理数据的更多相关文章

  1. WorldWind源码剖析系列:WorldWind实时确定、更新、初始化和渲染地形和纹理数据

    WorldWind实时确定.更新.初始化和渲染地形和纹理数据 当用户点击WorldWind中的地球时,首先响应的是WorldWindow.OnPaint()函数,后续程序的调用流程如下图所示. 零散知 ...

  2. JavaScript 实现textarea限制输入字数, 输入框字数实时统计更新,输入框实时字数计算移动端bug解决

    textarea称文本域,又称文本区,即有滚动条的多行文本输入控件,在网页的提交表单中经常用到.与单行文本框text控件不同,它不能通过maxlength属性来限制字数,为此必须寻求其他方法来加以限制 ...

  3. 使用清华大学开源软件镜像AOSP的“每月更新初始化包”更新指定版本的Android源码

    参照官方教程:Tsinghua Open Source Mirror 1. 下载了repo工具 mkdir  ~/bin PATH = ~/bin:$PATH curl  https://storag ...

  4. XAML实时显示更新插件LiveXAML

     XAML实时显示更新插件LiveXAML LiveXAML是Visual Studio的第三方扩展插件.该插件可以从Visual Studio Marketplace下载,也可以从官网下载http: ...

  5. linux实时查看更新日志命令

    很多时候在调试生成或正式平台服务器的时候想查看实时的日志输出,在Linux中可以使用tail 或 watch来实现. 比如我们项目中有个 app.log 的日志文件,我们普通读取都使用 vi app. ...

  6. [转]linux实时查看更新日志命令

    很多时候在调试生成或正式平台服务器的时候想查看实时的日志输出,在Linux中可以使用tail 或 watch来实现. 比如我们项目中有个 app.log 的日志文件,我们普通读取都使用 vi app. ...

  7. 实时更新Excel文档外部数据源的数据

    实时更新Excel文档外部数据源的数据 单元格区域.Excel 表.数据透视表或数据透视图均可以连接到外部数据源(数据源:用于连接数据库的一组存储的"源"信息.数据源包含数据库服务 ...

  8. WorldWind源码剖析系列:WorldWind如何确定与视点相关的地形数据的LOD层级与范围

    1.WorldWind如何确定与视点相关的地形数据的LOD层级与范围? 问题描述:WW中是如何判断LOD层次的呢,即在什么情况下获得哪一层级的数据?是否只通过相机视点的高度进行判断? 问题切入:要解决 ...

  9. 使用Python的Flask框架,结合Highchart,动态渲染图表(Ajax 请求数据接口)

    参考链接:https://www.highcharts.com.cn/docs/ajax 参考链接中的示例代码是使用php写的,这里改用python写. 需要注意的地方: 1.接口返回的数据格式,这个 ...

随机推荐

  1. 调用外部 DLL 中的函数(2. 晚绑定)

    , b, t, );end; procedure TForm1.FormDestroy(Sender: TObject);begin  FreeLibrary(inst);  {记得释放}end; e ...

  2. oracle中REF Cursor用法

    from:http://www.111cn.net/database/Oracle/42873.htm 1,什么是 REF游标 ? 动态关联结果集的临时对象.即在运行的时候动态决定执行查询. 2,RE ...

  3. Android开发之程序猿必需要懂得Android的重要设计理念2(5.20更新版)

    上篇文章介绍了Android开发的设计理念的一部分,并没有得到博友们的多大认可,仅仅看到了一位博友在以下留言期待下一篇文章的发表,为了这小小的唯一支持.我决定继续把后面的8个要点介绍一下,自己也潜心反 ...

  4. css图片宽高相等设置

    <div class="image-header"> <img src="demo.jpg"> </div> .image- ...

  5. excel中,一系列单元格中包含某一个字段的单元格数量?

    excel中,一系列单元格中包含某一个字段的单元格数量?这个怎么写公式?如:A列单元格A1-A7的内容分别为 A.AB.BC.AC.CD.AD.EA,怎么数这一列中几个单元格的内容包含A字母? 任意单 ...

  6. Swift-Swift中的全局变量和函数的创建

    解决办法: 写OC的时候常常会用到各种宏定义,但是Swift中貌似没有宏的这种定义,更多的是通过全局常量或者全局函数来实现这一效果.我们只需要建立一个文件(假设为Macro.swift),把想用的定义 ...

  7. OpenStack三个节点icehouse

    一.环境准备 1.架构 创建3台虚拟机,分别作为controll节点.network节点和compute1节点. Controller节点:1processor,2G memory,5G storag ...

  8. linux制作RPM包

    制作rpm包 1.制作流程1.1 前期工作 1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS} 建议使用普通用户,在用户家目录中创建 2)确定好制 ...

  9. django restframework 教程之Serialization(序列化)

    介绍 本教程将会通过创建一个简单的粘贴代码项目,突出显示WebAPI,过程中,会介绍组成REST框架的各种组件,让你全面了解如何配合使用. 环境设置 建议使用virtualenv建立新的虚拟环境,确保 ...

  10. struts2基础---->自定义拦截器

    这一章,我们开始struts2中拦截器的学习. 自定义拦截器