WorldWind Java 版学习:2、地型数据获取

1、Future 设计模式

Future 模式是说在请求发生时,会先产生一个 Future 对象给发出请求的客户。它的作用类似于代理对象,而同时所代理的真正目标对象的生成是由一个新的线程持续进行。真正的目标对象生成之后,将之设置到 Future 对象之中,而当客户端真正需要目标对象时,目标对象也已经准备好,可以让客户提取使用。在 Java 中实现 Future 模式,会使用到 java.util.concurrent 包下的 Callable 和 Future 类。

 

2、WorldWind 地型数据获取

WorldWind 在获取地型数据时,采用了 Future 的设计模式,相关的文件位于 src\gov\nasa\worldwind\retrieve,相关的接口是 RetrievalService、Retriever、RetrieverFactory、RetrievalFuture 和 RetrievalPostProcessor。

RetrievalService 在整体上控制数据获取,Retriever 可以看做是真正的目标对象,RetrieverFactory 是其工厂类,RetrievalFuture 是其代理对象, RetrievalPostProcessor 负责获取到真正目标对象之后的处理。

具体到实现的类,在 WorldWind 中,实现了 RetrievalService 的 BasicRetrievalService 类有两个成员变量,(RetrievalExecutor executor)和(ConcurrentLinkedQueue<RetrievalTask> activeTasks),其中 executor 是真正的执行对象,负责执行 activeTasks 以及执行前后的队列管理操作,而 RetrievalTask 对象是 RetrievalFuture 的实现,在这里是代理对象的角色,Retriever 对象通过调用 RetrievalService 类的 runRetriever(Retriever retriever) 方法传入,而后被包装为 RetrievalTask 后最终由 RetrievalExecutor 执行。

对于 Retriever 而言,在 WorldWind 中主要的实现类是 URLRetriever 及其子类 HTTPRetriever,URLRetriever 类包含两个重要的成员,一个是(URL url),一个是(RetrievalPostProcessor postProcessor),两个都是由构造函数赋值的,url 是服务器端的 URL 地址,postProcessor 对象包含有 Tile 对象成员,通过调用 tile 的 getPath 方法可以获得本地文件路径,最后在 URLRetriever 类的 call 方法中依次进行了打开 URL 连接,获取数据和保存数据至本地文件的操作。

 

3、WorldWind 地型数据下载过程

WorldWind 启动时会构造 WWPanelImpl 对象,在 WWPanelImpl 构造函数中,会构造 Model 对象,在此处是 BasicModel 对象,在 BasicModel 构造函数中,会构造 Globe 类对象,在此处是 Earth 对象,Earth 类包含有(ElevationModel elevationModel)和(Tessellator tessellator)两个成员变量,负责地型方面的操作。

BasicElevationModel 类有 requestTile(TileKey key) 方法,当程序中需要获取 Tile 时,会以 TileKey 为参数调用该方法,然后构造一个 RequestTask 对象并添加到任务队列中,当执行到 RequestTask 的 run 方法时,首先按照 tile.getPath() 路径查找 tile 文件是否存在,如果不存在则调用 downloadElevations 方法,继而将要下载的 tile 对象和新构造一个 DownloadPostProcessor 对象作为参数调用 retrieveElevations 方法,继而调用 retrieveRemoteElevations 方法,在该方法中,首先调用 tile.getResourceURL() 方法,实际上是调用 URLBuilder 类的 getURL 方法得到 tile 的服务器端 URL 地址,然后将此 URL 和之前构造的 DownloadPostProcessor 对象作为参数构造了 HTTPRetriever 对象,然后添加到任务队列中,最后通过调用 URLRetriever 类的 doRead 方法,继而调用 readNonSpecificStream 方法得到真正的地型数据,然后调用 DownloadPostProcessor 父类 AbstractRetrievalPostProcessor 类的 run 方法,继而依次调用了 handleSuccessfulRetrieval、handleContent、handleApplicationContent,然后调用 saveBuffer(ByteBuffer buffer) 方法将地型数据保存为本地文件。

posted on 2012-11-02 10:38  redfler  阅读(639)  评论(0编辑  收藏  举报

导航