使用网络数据源的优势在于它的无线扩充性,以及一次部署就可以为全部联网的应用提供数据服务,包括数据的更新和处理都可以在服务器端完成,大大简化了系统部署过程。
可见光数据及扩展
WMSTiledImageLayer类是BasicTiledImageLayer类的子类,它实现了LAyer接口,World Wind Java使用WMSTiledImageLayer图层类表现可见光影响数据,一个WMSTiledImageLayer图层只能对应一个WMS服务。使用WMS服务时首先创建WMS元数据描述类WMSCapabilities,在通过它的retrieve方法获取WMS服务上发布的WMS元数据,在知道要使用的图层名称后,通过AVList指定要显示的图层,最后利用元数据(WMSCapabilities)和图层定义(AVList)共同创建WMSTiledImageLayer类,最后将WMSTiledImageLayer类加载到Layers上,完成WMS图层的引用。
代码如下:
package wwjTest;
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.worldwind.wms.WMSTiledImageLayer.URLBuilder;
public class wwjWMS extends wwjBasics{
private static final long serialVersionUID = 1L;
protected WMSTiledImageLayer wmsTiledImageLayer;
public boolean AddWMSData(String uri, String serverName,String title){
boolean rtnResult = false;
try{
WMSCapabilities caps;
URI serverURI = new URI(uri);
caps = WMSCapabilities.retrieve(serverURI);
caps.parse();
AVList params = new AVListImpl();
params.setValue(AVKey.LAYER_NAMES, serverName);
params.setValue(AVKey.GET_MAP_URL, uri);
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/BlueMarble");
params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder(params));
wmsTiledImageLayer = new WMSTiledImageLayer(caps,params);
wmsTiledImageLayer.setName(title);
wmsTiledImageLayer.setEnabled(true);
wmsTiledImageLayer.setOpacity(1d);
wmsTiledImageLayer.setMaxActiveAltitude(5000000000d);
this.worldWindowGLCanvas.getModel().getLayers().add(wmsTiledImageLayer);
rtnResult = true;
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
return rtnResult;
}
public wwjWMS(){
AddWMSData("https://data.worldwind.arc.nasa.gov/wms","bmng200410","Blue Marble NG 2004.10");
this.layerPanel.update(this.worldWindowGLCanvas);
}
public static void main(String[] args) {
String strTitle = "显示WMS文件";
wwjWMS wwjRun = new wwjWMS();
wwjRun.setTitle(strTitle);
}
}
结果如图所示:
结果不太理想,似乎加载的 位置有些正确,不过能证明确实已经加载了网络地图。等到后续的章节中,会搭建自己的WMS服务,我会继续验证这个问题。
PlaceName
World Wind Java接受的PlaceName是基于WFS服务提供的,NASA已经提供了网络地址为:http://worldwind22.arc.nasa.gov/geoserver/wfs的PlaceName服务,所以还是先用已有的资源完成程序,后续再自己搭建服务。
World Wind Java使用PlaceNameLayer图层类表示PlaceName数据,一个PlaceNameLayer图层只能对应一个PlaceNameServiceSet,PlaceName服务器将地名标签分为海洋、大陆、国家、山脉、水系等多个分类,再根据数据量的大小分为不同大小的网格,每个类可以理解为一个子图层,这个子图层使用PlaceNameService来定义,多个PlaceNameService被实现了AVList接口的PlaceNameServiceSet类集成在一起,就形成了PlaceName图层的定义,利用这个PlaceName图层定义形成PlaceNameService类。
代码如下:
import gov.nasa.worldwind.geom.Angle;
import gov.nasa.worldwind.geom.LatLon;
import gov.nasa.worldwind.geom.Sector;
import gov.nasa.worldwind.layers.placename.PlaceNameLayer;
import gov.nasa.worldwind.layers.placename.PlaceNameService;
import gov.nasa.worldwind.layers.placename.PlaceNameServiceSet;
public class wwjPlaceName extends wwjBasics{
protected static final LatLon GRID_1X1 =
new LatLon(Angle.fromDegrees(180d),Angle.fromDegrees(360d));
protected static final double LEVEL_A = 0x1<<25;
protected PlaceNameLayer placeNameLayer;
public wwjPlaceName(){
this.modelEarth.getLayers().remove(this.modelEarth.getLayers().getLayerByName("Place Names"));
AddPlaceNameLayer("http://worldwind22.arc.nasa.gov/geoserver/wfs","topp:wpl_oceans","Earth/PlaceNames/WFSPlaceNamesVersion1.0","全球大洋");
this.layerPanel.update(this.worldWindowGLCanvas);
}
public boolean AddPlaceNameLayer(String WMSServer,String ServiceName,String FileCache, String Title){
boolean rtnResult = false;
try{
PlaceNameServiceSet placeNameServiceSet = new PlaceNameServiceSet();
PlaceNameService placeNameService = new PlaceNameService(WMSServer,ServiceName,FileCache,
Sector.FULL_SPHERE,this.GRID_1X1,java.awt.Font.decode("Arial-BOLDITALIC-12"),false);
placeNameService.setColor(new java.awt.Color(200, 200, 200));
placeNameService.setMinDisplayDistance(0d);
placeNameService.setMaxDisplayDistance(this.LEVEL_A);
placeNameServiceSet.addService(placeNameService, false);
placeNameLayer = new PlaceNameLayer(placeNameServiceSet);
placeNameLayer.setName(Title);
this.worldWindowGLCanvas.getModel().getLayers().add(placeNameLayer);
rtnResult = true;
}catch(Exception ex){
System.out.println(ex.getMessage());
}
return rtnResult;
}
public static void main(String[] args){
String strTitle ="PlaceName服务";
wwjPlaceName wwjRun = new wwjPlaceName();
wwjRun.setTitle(strTitle);
}
}
结果如下: