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 ...
随机推荐
- Android 7.0 以上保留数据去除锁屏密码的方法
在很多情况下,由于我们的疏忽,导致忘记了锁屏密码.也没有开启 USB 调试,内置存储中还有要保留的数据.我们需要在不清除数据的情况下删除锁屏密码.接下来我们就介绍该如何做. 注意事项 首先要注意,这个 ...
- chrome-Firefox-IE浏览器兼容总结
作为一名WEB前端程序员,相信每个人对浏览器的兼容都"情有独钟",下面就一些常用的浏览器的兼容列举一二. 一.块级元素(block)一般不转化为inline-block,其实是因为 ...
- iOS设备上出现的click,live,on点击失去效果
iOS设备上出现的点击事件失效,但是在Android上可以正常使用, 1.iOS设备对标签点击限制,不认为是可点击的标签,需要给要绑定点击事件的标签加上一个样式,cursor:pointer:这样就可 ...
- VS 2015 报错 " 'unistd.h': No such file or directory" 的解决办法
使用 Visual Studio 2015 进行程序开发工作时,如果编译的是来自于Linux平台的源文件,该源文件可能会包含头文件 uninstd.h,这样会产生报错信息: "fatal e ...
- Maven安装本地jar包
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.1.0 -Dpackaging= ...
- IIS8发布Asp.net MVC程序后出现404错误,处理程序staticFile
新部署的虚拟机,运行Asp.net MVC程序,出现如下图错误: 解决方法: 添加功能和角色->添加角色->Web服务器IIS->应用程序开发->Asp.net3.5 /Asp ...
- 【Kibana】Kibana入门教程
一.Kibana简介及下载安装 Kibana是专门用来为ElasticSearch设计开发的,可以提供数据查询,数据可视化等功能. 下载地址为:https://www.elastic.co/downl ...
- Python+Selenium笔记(二):配置谷歌+IE环境
#有的时候可能要访问外国的网站下载资料或工具,这时可能出现各种问题,例如谷歌人机验证显示不了.网站打不开等,建议使用一个FQ软件 (一) 设置IE (1) http://docs.seleniu ...
- Web服务架构风格之REST
REST(Representational State Transfer)是一种Web服务的架构,其目的是创建具有良好扩展性的分布式系统.它的约束包含: 使用C/S模型.client和server之间 ...
- LeetCode题解之N-ary Tree Level Order Traversal
1.题目描述 2.问题分析 利用先进先出队列解决问题. 3.代码 vector<vector<int>> levelOrder(Node* root) { vector< ...