下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadRequest(抽象类),再派生出地形下载请求类TerrainDownloadRequest。

  当需要渲染区域的四叉树网络生成以后,就可以确定需要演案区域信息(先从本地缓存中提取文件,若存在就直接渲染,跳过以后的步骤),然后根据:tile瓦片的等级,Row、Col生成纹理和高程信息对应的URL值,传入WebDownLoad类的构造函数,加入下载队列。

下载的URL的生成由TerrainDownloadRequest(TerrainTile tile,TerrainTileService owner,int roW,int col,int targetLevel)生成,生成结果URL示例如下:

http://worldwind25.arc.nasa.gov/wwelevation/wwelevation.aspx?T=srtm30pluszip&L=0&X=16&Y=7

compressedPath:

X:\\XX\\XXX\\WorldWind\\bin\\Debug\\Cache\\Earth\\SRTM\\0\\0007\\0007_0016.bil.tmp.zip

Download.SavedFilePath:

X:\\XX\\XXX\\WorldWind\\bin\\Debug\\Cache\\Earth\\SRTM\\0\\0007\\0007_0016.bil.tmp.

tempFullPath:

X:\\XX\\XXX\\WorldWind\\bin\\Debug\\Cache\\Earth\\SRTM\\0\\0007\\0007_0016.bil

  高程数据的下载和纹理一样,只是增加了对数据的压缩,解压,所以类又往下继承了一层,压缩格式使用zip和7z两种格式:ContentTypeZip,ContentType7z。当然他们的数据传输协议都是:Http的超文本传输协议(HttpWebRequest/HttpWebResponse,请求/响应)。这些类的类图如下。

抽象基类下载请求类DownloadRequest

抽象基类下载请求类DownloadRequest各个字段和属性的含义说明如下:

internal static DownloadQueue Queue;//指定存储该下载请求对象的下载队列对象

object m_owner; //指定该下载请求的拥有者

public abstract string Key//标识该下载请求的惟一字符串键

public object Owner //指定该下载请求的拥有者

public abstract float Progress//指示该下载请求完成的进度,(0,1)之间

public abstract bool IsDownloading//标识该下载请求是否正在被下载

构造函数protected DownloadRequest(object owner)仅仅指定该下载请求的拥有者

虚方法public virtual float CalculateScore()计算下载请求的分值,用来给下载排出优先级,在派生类中北重载以给予优先次序。返回分值,或者当该下载请求不再处于活动时返回float.MinValue

抽象方法public abstract void Start()开始处理该请求,必须被派生类重载

public virtual void OnComplete()派生类需调用该虚方法来发送处理完成信号

网络下载请求类WebDownloadRequest

网络下载请求类WebDownloadRequest各个字段和属性的含义说明如下:

protected WebDownload download;//网络下载对象

protected static string TemporaryExtension = ".tmp";//网络下载文件临时扩展名

public string SaveFilePath

public override float Progress

public override string Key

public override bool IsDownloading

public override void Start()

public override float CalculateScore()

以上六个成员都是重载父类相对应的成员,详情请参见父类,不再赘述。

构造函数public WebDownloadRequest(object owner)完成给父类的请求拥有者owner成员赋值,同时用空字符串实例化网络下载对象download。重载的构造函数利用给定的下载请求url实例化网络下载对象download。

虚方法protected virtual void InternalDownloadComplete(WebDownload download)需被重载,当下载已经完成时以被通知,内部调用下面的DownloadComplete()虚函数。

虚函数protected virtual void DownloadComplete()需要在派生类中重载,此处未实现任何功能。

地理空间下载请求类GeoSpatialDownloadRequest

地理空间下载请求类GeoSpatialDownloadRequest是个抽象类,各个字段和属性的含义说明如下:

public abstract int Color//标识本图层下载信息的颜色

public abstract float South//当前请求的瓦片的南部边界,10进制的度为单位

public abstract float North//当前请求的瓦片的北部边界,10进制的度为单位

public abstract float East//当前请求的瓦片的东部边界,10进制的度为单位

public abstract float West//当前请求的瓦片的西部边界,10进制的度为单位

构造函数protected GeoSpatialDownloadRequest(object owner, string uri) : base( owner, uri )调用父类的构造函数外,还将下载类型设置为DownloadType.Wms

地形下载请求类TerrainDownloadRequest

地形下载请求类TerrainDownloadRequest各个字段和属性的含义说明如下:

public TerrainTile TerrainTile;//下载请求所要下载的地形瓦片对象

const string ContentTypeZip = "application/zip";//标识下载数据内容的压缩类型

const string ContentType7z = "application/x-7z-compressed";

const string ContentTypeXCompressed = "application/x-compressed";

public abstract int Color//以下五个成员都是重载父类相对应的成员

public abstract float South

public abstract float North

public abstract float East

public abstract float West

public override float CalculateScore()

构造函数public TerrainDownloadRequest(TerrainTile tile, TerrainTileService owner, int row, int col, int targetLevel)利用给定的瓦片对象参数赋值给瓦片变量成员,用给定的瓦片所有者、瓦片行号、瓦片列号、瓦片层级等信息构造网络下载对象的URL字符串。

方法public void DownloadInForeground()在前台下载瓦片数据。处理步骤为:先调用DownloadFile下载数据并存储到指定的目标路径里,接着调用ProcessFile函数处理已下载的数据,如果捕捉到“FileNotFoundException”异常则调用FlagBadTile创建空文件,如果捕捉到“WebException”异常,则根据HttpWebResponse响应情况调用FlagBadTile函数,其它异常则未处理。

虚函数protected override void DownloadComplete()重载祖父类的方法,是瓦片下载完成时的回调函数,内部调用了下面两个方法。当下载完成时先验证数据的有效性。

方法void FlagBadTile()如果服务器没有所请求的数据,则创建一个空文件来标识这个缺失的文件,并发送“由于某种原因当前请求永久性地不可用”的信号,避免用重复的请求敲打服务器发。地形瓦片将会处理移除这个空文件,并重新向服务器发起请求。

方法protected void ProcessFile()根据下载数据内容的压缩类型进行不同的处理。三大类压缩类型具体处理方式为:Zip压缩类型用ICSharpCode.SharpZipLib.dll程序集中FastZip类来处理,7z或XCompressed压缩类型用Process和ProcessStartInfo类启动\System\7za.exe程序来处理。

WorldWind源码剖析系列:下载请求类DownloadRequest的更多相关文章

  1. WorldWind源码剖析系列:设置类SettingsBase

    PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...

  2. WorldWind源码剖析系列:挂件类Widgets

    WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...

  3. WorldWind源码剖析系列:BMNG类构造函数深入分析

    BMNG构造函数深入分析 一.主要类图 二.主要功能: 1)        BMNG类 BMNG类将包含以“Blue Marble”为主题的所有可渲染影像的根节点添加到当前星球的可渲染对象列表中,包括 ...

  4. WorldWind源码剖析系列:插件类Plugin、插件信息类PluginInfo和插件编译器类PluginCompiler

    插件类Plugin是所有由插件编译器加载的插件子类的抽象父类,提供对插件的轻量级的访问控制功能. 插件信息类PluginInfo用来存储关于某个插件的信息的类,可以理解为对插件类Plugin类的进一步 ...

  5. WorldWind源码剖析系列:日志类Log

    Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs ...

  6. WorldWind源码剖析系列:缓冲类Cache

    缓冲类Cache主要用于在最小的限制条件下保存从远程服务器通过网络下载下来的地理空间数据,以便当用户处于离线状态时能够使用这些已经缓冲好的数据.Google Earth也采用类似机制处理用户离线浏览漫 ...

  7. WorldWind源码剖析系列:相机类CameraBase

    相机基类CameraBase PluginSDK中的相机类CameraBase是三维计算机图形学中的概念.观察者在三维场景中漫游时,通过眼睛看到的场景和相机拍摄过程非常一致.实际上,Direct3D和 ...

  8. WorldWind源码剖析系列:角度类Angle

    PluginSDK中的角度结构体Angle类图如下所示. 角度结构体主要定义了一个弧度表示角度值的字段:double Radians.还有几个表示角度最大值.最小值.非数值和零角度等字段.定义了一个D ...

  9. WorldWind源码剖析系列:四元数类Quaternion

    PluginSDK中的Quaternion4d类可能是感觉Microsoft.DirectX. Quaternion类不太实用或不够用,自己有重新写的. 四元数是英国数学家哈密顿(W.R.Hamilt ...

  10. WorldWind源码剖析系列:星球球体的加载与渲染

    WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...

随机推荐

  1. 设计模式-生成器(Builder)

     一.概念 将一个复杂对像的构建与它的表示分离,使得同样的构建过程创建不同的表示,又叫建造模式. 生成器模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用.采用不同的构建实现,产生不 ...

  2. layui实现复选框全选,反选

    html <div class="layui-input-inline"> <input type="checkbox" class=&quo ...

  3. js-ES6学习笔记-数组的扩展

    1.Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map). 实际应用中 ...

  4. 高性能JavaScript(编程实践)

    避免双重求值JavaScript 允许你在程序中提取一个包含代码的字符串,然后动态执行,有四种方法可以实现,eval(),Function() 构造函数 settimeout 和 setinterva ...

  5. Dynamics CRM2016 如何删除Word/Excel Templates

    创建模板的方式有两种,一种是创建个人级别的模板,如下面这种创建一个excel的模板 一种是在设置-模板中创建,但这需要管理员权限,从下图中可以看出个人级的模板在设置中是看不到的 那就涉及到一个问题了, ...

  6. React Native - TextInput详细解说

    1,TextInput组件介绍 TextInput 组件除了作为输入框实现基本的输入功能外,它还提供了许多其他功能,比如自动校验.占位符以及指定弹出不同的键盘类型等. 2,组件的属性 (1)autoC ...

  7. Asp.Net Core使用System.Drawing.Common部署到docker报错问题

    Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心 ...

  8. python的函数(二)

    1,函数的变量 2,函数的返回值 1,函数的变量 1.0,函数的变量分为局部变量和全局变量. def fun(): x = 100 print x 这个x是局部变量,函数执行完后,x的变量就会销毁,只 ...

  9. Sqlserver的Transaction做Rollback的时候要小心(转载)

    仔细研究了下,发现sql server里面的explicit transaction(显示事务)还是有点复杂的.以下是有些总结: Commit transaction 会提交所有嵌套的transact ...

  10. jboss eap6.1(1)

    最近决定把公司的项目从jboss3.x迁移出来,先试着摸索一下最新的jboss服务器,从jboss官网上下了一份jboss-eap-6.1,然后找资料准备学习,同时将此次迁移过程记录下来,以备后续复习 ...