WorldWind源码剖析系列:地形瓦片类TerrainTile和地形瓦片服务类TerrainTileService
地形瓦片类TerrainTile 用来抽象封装用户漫游中所请求的地形瓦片数据类型。
地形瓦片服务类TerrainTileService提供了从BIL(Binary Interleaved by Line,按行交叉存储二进制文件)地形文件获取高程的功能。该类主要是用来返回用户漫游中所请求的地形瓦片对象。和影像数据类似,也是先判断所需要的高程数据是否存在,高程数据存储在类TerrainTile类中,TerrainTileFilePath是当前高程数据路径,if(!File.Exists(Ten'ainTileFilePath))就会构造一个下载的TerrainDownloadRequest类:TerrainDownloadRequest(this,m_ownel,Row,Col,TargetLevel)加入下载队列,下载高度信息文件bil的压缩包,并解压到分配的目录,然后可以通过函数GetElevationAt(doublelatitude,doublelongitude)返回float的高度信息。这两个类类图如下。

地形瓦片服务类TerrainTileService各个字段的含义说明如下:
string m_serverUrl;//地形瓦片服务的统一资源定位符字符串
string m_dataSet; //地形瓦片服务的数据集字符串
double m_levelZeroTileSizeDegrees; //零级地形瓦片的大小度数(取double型)
int m_samplesPerTile; //每块地形瓦片的采样数(取int型)
int m_numberLevels; //地形瓦片的划分层级数目
string m_fileExtension; //地形瓦片文件的扩展名
string m_terrainTileDirectory; //地形瓦片的目录
TimeSpan m_terrainTileRetryInterval; //地形瓦片服务请求重试时间间隔
string m_dataType; //地形瓦片数据类型:浮点型或16位整形
该类的构造函数public TerrainTileService()通过给上面成员赋值,完成初始化实例。
public static int GetRowFromLatitude(double latitude, double tileSize)
public static int GetColFromLongitude(double longitude, double tileSize)
这两个静态函数计算并返回指定的经度或纬度值在给定的瓦片大小层级中所对应的列号或行号值。
函数public TerrainTile GetTerrainTile(double latitude, double longitude, double samplesPerDegree)用指定的每一度的采样数构建包含指定坐标的地形瓦片。其中一个重要的逻辑是:通过指定每一度的采样数,来计算瓦片合适的目标层级。因为如果目标层级太高的话,不满足该层级每一度所包含的采样数不小于指定的每一度采样数。然后根据合适的瓦片目标层级计算并返回指定的经度或纬度值在该瓦片目标层级中所对应的列号或行号值,接着就可以利用前面的列号或行号值构建地形瓦片文件路径字符串。其格式为:地形瓦片目录\瓦片层级\瓦片行号\瓦片行号_瓦片列号.文件扩展名。其中“瓦片行号_瓦片列号”表明统一层级瓦片中同一行的瓦片文件都存储在同一行号的文件夹下面。最后再指定或计算所请求的瓦片对象的每一度的采样数、瓦片大小度数、瓦片北部边界度数、瓦片南部边界度数、瓦片西部边界度数、瓦片东部边界度数。最有返回构建好的瓦片对象。可以参阅下面的示意图理解上面的过程。

NASA World Wind 地图瓦片系统
地形瓦片类TerrainTile各个字段的含义说明如下:
public string TerrainTileFilePath; //地形瓦片文件路径
public double TileSizeDegrees; //地形瓦片大小度数
public int SamplesPerTile; //每块地形瓦片的采样数(取int型)
public double South; //瓦片北部边界度数
public double North; //瓦片南部边界度数
public double West; //瓦片西部边界度数
public double East; //瓦片东部边界度数
public int Row;//瓦片行号
public int Col;//瓦片列号
public int TargetLevel; //瓦片目标层级
public TerrainTileService m_owner; //拥有该瓦片的地形瓦片服务类
public bool IsInitialized; //瓦片是否被初始化
public bool IsValid; //瓦片是否有效
public float[,] ElevationData; //瓦片所对应的高程数据二维数组,即存放当前瓦片所有样本点高程值的数值,这是通过TerrainTileService.cs文件总的TerrainTile类的函数Initialize()中读取DEM(.bil)文件来获取的。
protected TerrainDownloadRequest request; //所发出地形瓦片下载请求
该类的构造函数public TerrainTile( TerrainTileService owner )仅仅完成指定拥有该瓦片的地形瓦片服务类。
初始化函数public void Initialize()初始化地形瓦片添加开关,初始化浮点型或16位整形的瓦片。
public float GetElevationAt(double latitude, double longitude)函数从瓦片所对应的高程数据二维数组中得到指定的经度、纬度处的高程值。
WorldWind源码剖析系列:地形瓦片类TerrainTile和地形瓦片服务类TerrainTileService的更多相关文章
- WorldWind源码剖析系列:星球类World
星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球.火星等.该类的类图如下. 需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的.经纬网格的渲染 ...
- WorldWind源码剖析系列:星球球体的加载与渲染
WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...
- WorldWind源码剖析系列:表面瓦片类SurfaceTile
表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...
- WorldWind源码剖析系列:四叉树瓦片类QuadTile
四叉树瓦片类QuadTile提供了对影像和地形数据的四叉树访问模型.该类的类图如下. 四叉树瓦片类QuadTile提供的主要字段.属性和方法简要描述如下: public QuadTileSet Qua ...
- WorldWind源码剖析系列:地形访问器类TerrainAccessor
地形访问器类TerrainAccessor 地形访问器类TerrainAccessor提供了对地形(高程)Terrain (elevation)访问的各种接口interface,是NltTerrain ...
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...
- WorldWind源码剖析系列:星球表面渲染类WorldSurfaceRenderer
星球表面渲染类WorldSurfaceRenderer描述如何渲染星球类(如地球)表面影像纹理.该类的类图如下. 星球类World包含的主要的字段.属性和方法如下: public const int ...
- WorldWind源码剖析系列:四叉树瓦片集合类QuadTileSet
四叉树瓦片集合类QuadTileSet是影像瓦片渲染的主要类.使用地形管理器来为3D地形渲染查询高程值.依赖于用来刷新基于经度.纬度.视角范围瓦片的更新线程.该类继承自可渲染对象类Renderable ...
- WorldWind源码剖析系列:设置类SettingsBase
PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...
随机推荐
- 愿你走出半生,归来仍是Java Parser
几天前,我的一个朋友给了我一个Haskell问题 Hey, MK,假设我有个BNF,并且我在Haskell中有个这个BNF的parser.现在,我想给这个BNF改一行,有没有办法不用动这个BNF pa ...
- 星系炸弹-2015省赛C语言A组第二题
星系炸弹 在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标.每个炸弹都可以设定多少天之后爆炸.比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸. ...
- 放苹果(poj1664递归)
ti放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24392 Accepted: 15513 Descripti ...
- MVC Helper Methods
在.net MVC中经常会见到特别的写法 比如 @Url.Action( ) @Url.Conyent( ) @Html.Displayfor( )等等 这些 写法就是我们这里要讲的 Helper ...
- php魔术方法__tostring的应用
当echo一个对象的时候,会报错误 Object of class Person could not be converted to string 我们可以通过魔术方法__tostring() 把对 ...
- 百度智能小程序弹窗组件wcPop|智能小程序自定义model弹窗模板
百度智能小程序自定义弹窗组件wcPop|百度小程序model对话框|智能小程序弹窗界面模板 最近百度也推出了自己的智能小程序,如是就赶紧去试了下,官方提供的api还不是狠完整.而且官方提供的弹窗组件也 ...
- [TJOI2015]弦论
我们先求出该字符串的\(SA\)和\(Ht\) 然后分类讨论 \(T=0\)时,每次去掉\(Ht\)往后扫就行 \(T=1\)时,我们考虑\(lcp\)对答案的影响 既然用到\(lcp\),那就要用\ ...
- js之面向对象
本文的面向对象分为ES6和ES6之前的,重点学习ES6的===============================一.面向对象 1.什么是面向对象 a)什么是对象:万物都可以抽象成对象 时间对象 ...
- Expo大作战(一)--什么是expo,如何安装expo clinet和xde,xde如何使用
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- Expo大作战(十八)--expo如何发布成独立应用程序,打包成apk或者ipa,发布到对应应用商店
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...