WorldWind学习系列:3、瓦片图片图片存储管理ImageStore

本文介绍了一种瓦片数据集的管理与存储方法,包括ImageStore、NltImageStore和WmsImageStore三个核心类。ImageStore作为基类负责基本的存储逻辑,而NltImageStore和WmsImageStore分别针对网络瓦片服务和WMS服务器提供具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

瓦片数据集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,进行场景绘制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值