瓦片数据集QuadTileSet图片存储管理涉及三个类:用于本地储存瓦片的ImageStore,用于网络瓦片服务的NltImageStore,用于WMS服务器提供瓦片的WmsImageStore。类关系图如下所示:
基类为ImageStore,两个子类有NltImageStore和WmsImageStore。
一、ImageStore
基类的属性如下:
protected string m_dataDirectory; //本地永久存储瓦片的目录
protected double m_levelZeroTileSizeDegrees = 36;//0级瓦片大小,以度为单位
protected int m_levelCount = 1; //瓦片层数
protected string m_imageFileExtension; //图像类型扩展名
protected string m_cacheDirectory; //缓存目录,本地存储不需要
protected string m_duplicateTexturePath; //备用数据存放路径.
protected string m_serverlogo; //可下载图层的服务器Logo
主要函数:
//是否是可下载的图层,本地存储都是不可下载的
public virtual bool IsDownloadableLayer
{
get
{
return false;
}
}
protected virtual void ConvertImage(Texture texture, string filePath):使用D3D将瓦片转换为DDS格式,后缀名为".dds",可以加快纹理加载速度。并删除旧文件。
public virtual void DeleteLocalCopy(QuadTile qt):删除qt对应的本地文件,先获取qt对应的本地文件目录,如果文件存在,则删除。注意可能返回的是"备用数据存放路径",为一个目录。
public virtual string GetLocalPath(QuadTile qt): 获得瓦片qt对应的本地文件名。qt的层级、行号、列号和扩展名m_imageFileExtension确定了瓦片的相对目录。
{0}\{1:D4}\{1:D4}_{2:D4}.{3}", qt.Level, qt.Row, qt.Col, m_imageFileExtension
本地m_dataDirectory不为空,且对应的文件存在,则返回。缓存目录m_ cacheDirectory为空,返回备用数据存放路径。搜索缓存目录,如果文件存在就返回,不存在再修改后缀名搜索,有效的后缀名包括 ".bmp.dds.dib.hdr.jpg.jpeg.pfm.png.ppm.tga.gif.tif"。如果存在就返回,如均不存在,则返回不存在的缓存文件文件路径。
public Texture LoadFile(QuadTile qt):加载瓦片qt所对应的图片,并返回纹理对象。获取瓦片的本地路径,如果文件不存在,且为可下载瓦片,则加入下载队列QueueDownload,返回空。如果文件存在,调用ImageHelper.LoadTexture加载纹理文件。对于下载的缓存文件,检查是否超时,超时需要重新下载。可下载瓦片还会根据设置,转换为DDS格式。
protected virtual string GetDownloadUrl(QuadTile qt):返回瓦片的下载URL网址,对于本地瓦片,如果存在备用数据存在路径则返回,否则返回空。子类会重载该函数,以返回网络下载地址。
void QueueDownload(QuadTile qt, string filePath):将瓦片添加到下载队列以下载图片。调用瓦片集的函数QuadTileSet.AddToDownloadQueue添加到下载队列,下载请求类型为GeoSpatialDownloadRequest。
二、NltImageStore
NltImageStore用来读取NLT风格存储在Web服务器上的瓦片数据。 其中,NLT是NASA Learning Technologies的首字母缩写。
string m_dataSetName;//数据集名称
string m_serverUri; //瓦片数据网址
主要函数:
//可下载的网络图层
public override bool IsDownloadableLayer
{
get
{
return true;
}
}
public NltImageStore( string dataSetName, string serverUri):构造函数,初始化两个属性。
protected override string GetDownloadUrl(QuadTile qt): 重载函数,返回瓦片qt对应的下载路径,格式为:
"{0}?T={1}&L={2}&X={3}&Y={4}", m_serverUri,m_dataSetName,
qt.Level, qt.Col, qt.Row
三、WmsImageStore
WmsImageStore用来读取遵循OGC规范的网络地图服务WMS瓦片图像。
string m_serverGetMapUrl;//获取WMS服务的URL
string m_wmsLayerName; //图层名
string m_wmsLayerStyle;//图层风格,可为空
string m_imageFormat;//图片格式,如image/jpeg
string m_version; //WMS 规范版本
int m_textureSizePixels = 512; //图片纹理大小,512*512像素,这里没有使用配置文件里的设置。
主要函数:
//可下载的网络图层
public override bool IsDownloadableLayer
{
get
{
return true;
}
}
protected override string GetDownloadUrl(WorldWind.Renderable.QuadTile qt): 重载函数,返回瓦片qt对应的下载路径。m_serverGetMapUrl有“?”时,如: http://server.net/path?imageformat=png&width={WIDTH}&north={NORTH}..., 则替换下载路径Url中的宽、高、四角点经纬度:
string url = m_serverGetMapUrl;
url = url.Replace("{WIDTH}", m_textureSizePixels.ToString(CultureInfo.InvariantCulture));
url = url.Replace("{HEIGHT}", m_textureSizePixels.ToString(CultureInfo.InvariantCulture));
url = url.Replace("{WEST}", qt.West.ToString(CultureInfo.InvariantCulture));
url = url.Replace("{EAST}", qt.East.ToString(CultureInfo.InvariantCulture));
url = url.Replace("{NORTH}", qt.North.ToString(CultureInfo.InvariantCulture));
url = url.Replace("{SOUTH}", qt.South.ToString(CultureInfo.InvariantCulture));
没有“?”时,格式化标准的WMS请求,为:
string url = string.Format(CultureInfo.InvariantCulture,
"{0}?request=GetMap&layers={1}&srs=EPSG:4326&width={2}&height={3}&bbox={4},{5},{6},{7}&format={8}&version={9}&styles={10}",
m_serverGetMapUrl,
m_wmsLayerName,
m_textureSizePixels,
m_textureSizePixels,
qt.West, qt.South, qt.East, qt.North,
m_imageFormat,
m_version,
m_wmsLayerStyle);
WMS中的坐标系统srs设置为EPSG:4326。EPSG:4326(WGS84) 是目前最流行的地理坐标系统。在国际上,每个坐标系统都会被分配一个 EPSG 代码,EPSG:4326 就是 WGS84 的代码。GPS是基于WGS84的,所以通常我们得到的坐标数据都是WGS84。
下一篇介绍场景渲染过程,程序在没有消息处理的空闲时调用WorldWindow.OnApplicationIdle,进行场景绘制。