九、WorldWindJava2.0加载影像问题

来源:互联网 发布:上师大网络课程 编辑:程序博客网 时间:2024/05/17 06:01

我们此章主要讨论WorldWind WMS发布地图服务,打开网址:NASA WorldWind Server,我们借鉴该篇文章对WorldWindServer的安装、地图资源的配置、服务的运行以及功能测试问题进行研究。

一、WorldWindServer安装
运行WorldWindServer服务器,我们电脑上需要有JDK(1.6或以上),JOGL以及GDAL。WorldWindServer压缩包当然也不能少。下面为安装步骤:安装过程比较简单
1、FWTools(版本2.3.0)安装。FWTools是一套处理GIS和遥感数据的开源工具,核心来源于GDAL组件。
2、JDK(版本1.8.0_60)安装。
3、JOGL安装。将jogl.dll、jogl_awt.dll、jogl_cg.dll、gluegen-rt.dll复制到以下两个目录。
1)%JAVA_HOME%\jre\bin目录:支持客户机和服务器应用运行。
2)%JAVA_HOME%\bin目录:支持eclipse开发。
4、下载解压版的WorldWindServer(版本0.6)并解压到D:\OceanPlatform\WMSServer,并在该文件夹下创建空的文件夹TMP。

二、地图资源的配置
打开WorldWindServer安装文件夹,WEB-INF中web.xml文件,依次修改下面几项
▷ GDAL.Path ☞ C:\Program Files (x86)\FWTools2.3.0\bin
▷ TMP 临时文件 ☞ D:\OceanPlatform\WMSServer\TMP
▷ Server.Capabilities.OnlineResource ☞ http://127.0.0.1:8000/wms
▷ Server.RedirectTo ☞ http://127.0.0.1:8000/wms?REQUEST=GetCapabilities
完成上述工作后,理论上WorldWindServer便可以运行了。此时我们在WorldWindServer目录下找到startWMS.bat,双击运行,然后在浏览器中输入 http://127.0.0.1:8000/wms?REQUEST=GetCapabilities&Service=WMS,如果能看到xml文件,则表示已经正常工作了。
2、地图资源的配置
在 NASA WorldWind Server 网页中,对地图资源(BMNG、I3、Elevation、DTED)的加载方式已经描述的很详细,此处不再赘述。下面以加载自己下载的高清谷歌地图(瓦片地图)为依据,对WorldWindJava2.0加载地图资源做讨论。
首先需要把地图资源进行发布,发布地图数据有两种方法,一种是如该网址介绍这般,在 wms.config.xml 文件中用 <mapsource>标签调用,我们这里简单介绍第二种方法:
▷ 保存地图数据于D:\OceanPlatform\WMSServer\WorldWindData\Imagery文件夹中。
▷ 打开并编辑WMSServer\WEB-INF文件夹中wms.DataFileStore.xml
▷ 在 readLocations 和 writeLocations 节中都增加<location property="" wwDir="D:\OceanPlatform\WMSServer\WorldWindData\Imagery"/>
▷ 重新启动WMS,浏览器中输入 http://127.0.0.1:8000/wms?REQUEST=GetCapabilities&Service=WMS 便可以在该xml文件中看到加载的 earth 图层了,如下图。
这里写图片描述
下面来讨论一下影像数据的加载,加载影像数据同样有两种方法。
1)通过WorldWindJava的config文件进行配置。打开src->config,worldwind.layers.xml文件,添加图层

<!-- 自定义影像 -->        <Layer href="config/Earth/CustomImage.xml" actuate="onLoad">            <Property name="Name" value="Images"></Property>        </Layer>

然后在congig.Earth中新建xml文件,CustomImage.xml,编写该xml文件

<?xml version="1.0" encoding="UTF-8"?><!--$Id: LandsatI3WMSLayer.xml 1 2011-07-16 23:22:47Z dcollins $--><Layer version="1" layerType="TiledImageLayer">    <DisplayName>earth</DisplayName>    <Service serviceName="OGC:WMS" version="1.3">        <GetCapabilitiesURL>http://127.0.0.1:8000/wms</GetCapabilitiesURL>        <GetMapURL>http://127.0.0.1:8000/wms</GetMapURL>        <LayerNames>earth</LayerNames>    </Service>    <RetrievePropertiesFromService>true</RetrievePropertiesFromService>    <DataCacheName>Earth/earth</DataCacheName>    <ImageFormat>image/dds</ImageFormat>    <AvailableImageFormats>        <ImageFormat>image/jpg</ImageFormat>        <ImageFormat>image/dds</ImageFormat>    </AvailableImageFormats>    <FormatSuffix>.dds</FormatSuffix>    <NumLevels count="16" numEmpty="0"/>    <TileOrigin>        <LatLon units="degrees" latitude="-90" longitude="-180"/>    </TileOrigin>    <LevelZeroTileDelta>        <LatLon units="degrees" latitude="36" longitude="36"/>    </LevelZeroTileDelta>    <TileSize>        <Dimension width="256" height="256"/>    </TileSize>    <Sector>        <SouthWest>            <LatLon units="degrees" latitude="-90" longitude="-180"/>        </SouthWest>        <NorthEast>            <LatLon units="degrees" latitude="90" longitude="180"/>        </NorthEast>    </Sector>    <UseTransparentTextures>true</UseTransparentTextures>    <!--<ScreenCredit creditType="ScreenImage">-->    <!--<FileName>images/32x32-icon-nasa.png</FileName>-->    <!--<Link>http://worldwind.arc.nasa.gov/java</Link>-->    <!--</ScreenCredit>-->    <RetrievalTimeouts>        <ReadTimeout>            <Time units="milliseconds" value="200000"/>        </ReadTimeout>    </RetrievalTimeouts></Layer>

然后运行examples包中ApplicationTemplate.java,即可以把该影像地图加载到球体上。
这里写图片描述
2)通过WMSTiledImageLayer类进行加载。我们在此简单的新建一个java文件验证,ImageryTest.java,代码如下:

package test;import java.net.URI;import gov.nasa.worldwind.avlist.AVKey;import gov.nasa.worldwind.avlist.AVList;import gov.nasa.worldwind.avlist.AVListImpl;import gov.nasa.worldwind.ogc.wms.WMSCapabilities;import gov.nasa.worldwind.wms.WMSTiledImageLayer;import gov.nasa.worldwindx.examples.ApplicationTemplate;public class Imagerytest extends ApplicationTemplate{    public static class AppFrame extends ApplicationTemplate.AppFrame{        private static final long serialVersionUID=1l;        public AppFrame(){            try {                String url="http://127.0.0.1:8000/wms";                WMSCapabilities caps;                URI serverURI=new URI(url);                caps=WMSCapabilities.retrieve(serverURI);                caps.parse();                AVList params=new AVListImpl();                params.setValue(AVKey.LAYER_NAMES, "earth");                params.setValue(AVKey.SERVICE_NAME,"OGC:WMS");                params.setValue(AVKey.GET_MAP_URL,url);                params.setValue(AVKey.DATA_CACHE_NAME,"Earth/earth02");                params.setValue(AVKey.TILE_URL_BUILDER,new WMSTiledImageLayer.URLBuilder(params));                WMSTiledImageLayer imageLayer =new WMSTiledImageLayer(caps,params);                imageLayer.setName("earth");                imageLayer.setEnabled(false);                imageLayer.setOpacity(1);                imageLayer.setMaxActiveAltitude(33500000);                getWwd().getModel().getLayers().add(imageLayer);                getLayerPanel().update(getWwd());            } catch (Exception e) {                e.printStackTrace();            }        }    }    public static void main(String[] args) {        ApplicationTemplate.start("WMS",Imagerytest.AppFrame.class);    }}

可以得到如图
这里写图片描述
当出现这种问题的时候,我也非常纳闷,本以为是代码问题,仔仔细细的检查很多遍,然后清除缓存,重新加载,仍是这样,我也不知道解决方法在哪呢。这是WorldWindJava2.0源码问题还是我的代码调用有问题?
为了进一步验证,我换用了低版本的WorldWindJava1.2,同样经过上述步骤(注:旧版本在编写ImageryTest.java时影像缓存地址应改变。params.setValue(AVKey.DATA_CACHE_NAME,"Earth/earth03");
结果却得到了正常显示的影响。
仔细查看了这三种情况的缓存文件夹中的earth.xml文件,对比发现采用第二种方法得到基于两个不同版本的缓存xml文件基本相同,我们与第一种方法得到的xml文件对比,并添加代码使三者缓存所得earth.xml文件相同。
在ImageryTest.java文件中添加代码:

params.setValue(AVKey.NUM_LEVELS,16);params.setValue(AVKey.TILE_HEIGHT,256);params.setValue(AVKey.TILE_WIDTH,256);params.setValue(AVKey.RETRIEVE_PROPERTIES_FROM_SERVICE,true);params.setValue(AVKey.AVAILABLE_IMAGE_FORMATS,new String[]{"image/dds","image/jpg"});

此时清除缓存后再去运行文件,发现结果与之前并无不同。
所以我个人觉得所编写的代码并无错误。难道真的是WorldWindJava2.0中的WMSTiledImageLayer类添加影像的内部机制出现错误?

可是,为了再次求证,我舍弃了WorldWindServer,采用Geoserver发布的Shp文件进行测试,更改ImageryTest.java文件中 url参数为 http://127.0.0.1:8000/geoserver/cq/wms ,然后将 LAYER_NAMES 、 DATA_CACHE_NAME 都更改为world,然后运行该文件,却能得到匹配的结果图,如下图,
这里写图片描述

唉,头大啊,求解答。

0 0