地形瓦片类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)函数从瓦片所对应的高程数据二维数组中得到指定的经度、纬度处的高程值。