📄 wmstiledimagelayer.java
字号:
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.wms;import gov.nasa.worldwind.avlist.*;import gov.nasa.worldwind.geom.*;import gov.nasa.worldwind.layers.*;import gov.nasa.worldwind.util.*;import org.w3c.dom.*;import java.net.*;import java.util.*;/** * @author tag * @version $Id: WMSTiledImageLayer.java 10310 2009-04-17 22:17:34Z dcollins $ */public class WMSTiledImageLayer extends BasicTiledImageLayer{ private AVList creationParams; public static AVList xmlStateToParams(String stateInXml) { if (stateInXml == null) { String message = Logging.getMessage("nullValue.StringIsNull"); Logging.logger().severe(message); throw new IllegalArgumentException(message); } RestorableSupport rs; try { rs = RestorableSupport.parse(stateInXml); } catch (Exception e) { // Parsing the document specified by stateInXml failed. String message = Logging.getMessage("generic.ExceptionAttemptingToParseStateXml", stateInXml); Logging.logger().severe(message); throw new IllegalArgumentException(message, e); } AVList params = new AVListImpl(); String s = rs.getStateValueAsString(AVKey.IMAGE_FORMAT); if (s != null) params.setValue(AVKey.IMAGE_FORMAT, s); s = rs.getStateValueAsString(AVKey.DATA_CACHE_NAME); if (s != null) params.setValue(AVKey.DATA_CACHE_NAME, s); s = rs.getStateValueAsString(AVKey.SERVICE); if (s != null) params.setValue(AVKey.SERVICE, s); s = rs.getStateValueAsString(AVKey.TITLE); if (s != null) params.setValue(AVKey.TITLE, s); s = rs.getStateValueAsString(AVKey.DATASET_NAME); if (s != null) params.setValue(AVKey.DATASET_NAME, s); s = rs.getStateValueAsString(AVKey.FORMAT_SUFFIX); if (s != null) params.setValue(AVKey.FORMAT_SUFFIX, s); s = rs.getStateValueAsString(AVKey.LAYER_NAMES); if (s != null) params.setValue(AVKey.LAYER_NAMES, s); s = rs.getStateValueAsString(AVKey.STYLE_NAMES); if (s != null) params.setValue(AVKey.STYLE_NAMES, s); Integer i = rs.getStateValueAsInteger(AVKey.NUM_EMPTY_LEVELS); if (i != null) params.setValue(AVKey.NUM_EMPTY_LEVELS, i); i = rs.getStateValueAsInteger(AVKey.NUM_LEVELS); if (i != null) params.setValue(AVKey.NUM_LEVELS, i); i = rs.getStateValueAsInteger(AVKey.TILE_WIDTH); if (i != null) params.setValue(AVKey.TILE_WIDTH, i); i = rs.getStateValueAsInteger(AVKey.TILE_HEIGHT); if (i != null) params.setValue(AVKey.TILE_HEIGHT, i); Long lo = rs.getStateValueAsLong(AVKey.EXPIRY_TIME); if (lo != null) params.setValue(AVKey.EXPIRY_TIME, lo); Double lat = rs.getStateValueAsDouble(AVKey.LEVEL_ZERO_TILE_DELTA + ".Latitude"); Double lon = rs.getStateValueAsDouble(AVKey.LEVEL_ZERO_TILE_DELTA + ".Longitude"); if (lat != null && lon != null) params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, LatLon.fromDegrees(lat, lon)); Double minLat = rs.getStateValueAsDouble(AVKey.SECTOR + ".MinLatitude"); Double minLon = rs.getStateValueAsDouble(AVKey.SECTOR + ".MinLongitude"); Double maxLat = rs.getStateValueAsDouble(AVKey.SECTOR + ".MaxLatitude"); Double maxLon = rs.getStateValueAsDouble(AVKey.SECTOR + ".MaxLongitude"); if (minLat != null && minLon != null && maxLat != null && maxLon != null) params.setValue(AVKey.SECTOR, Sector.fromDegrees(minLat, maxLat, minLon, maxLon)); params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder(rs.getStateValueAsString("wms.Version"), params)); return params; } public static WMSTiledImageLayer fromRestorableState(String stateInXml) { return new WMSTiledImageLayer(stateInXml); } public WMSTiledImageLayer(String stateInXml) { this(xmlStateToParams(stateInXml)); RestorableSupport rs; try { rs = RestorableSupport.parse(stateInXml); } catch (Exception e) { // Parsing the document specified by stateInXml failed. String message = Logging.getMessage("generic.ExceptionAttemptingToParseStateXml", stateInXml); Logging.logger().severe(message); throw new IllegalArgumentException(message, e); } String s = rs.getStateValueAsString("Layer.Name"); if (s != null) this.setName(s); Boolean b = rs.getStateValueAsBoolean("Layer.Enabled"); if (b != null) this.setEnabled(b); Double d = rs.getStateValueAsDouble("Layer.Opacity"); if (d != null) this.setOpacity(d); d = rs.getStateValueAsDouble("Layer.MinActiveAltitude"); if (d != null) this.setMinActiveAltitude(d); d = rs.getStateValueAsDouble("Layer.MaxActiveAltitude"); if (d != null) this.setMaxActiveAltitude(d); b = rs.getStateValueAsBoolean("Layer.NetworkRetrievalEnabled"); if (b != null) this.setNetworkRetrievalEnabled(b); b = rs.getStateValueAsBoolean("TiledImageLayer.UseMipMaps"); if (b != null) this.setUseMipMaps(b); b = rs.getStateValueAsBoolean("TiledImageLayer.UseTransparentTextures"); if (b != null) this.setUseTransparentTextures(b); RestorableSupport.StateObject so = rs.getStateObject("avlist"); if (so != null) { RestorableSupport.StateObject[] avpairs = rs.getAllStateObjects(so, ""); if (avpairs != null) { for (RestorableSupport.StateObject avp : avpairs) { if (avp != null) this.setValue(avp.getName(), avp.getValue()); } } } } public WMSTiledImageLayer(AVList params) { super(params); this.creationParams = params.copy(); } public WMSTiledImageLayer(Capabilities caps, AVList params) { super(initParams(caps, params)); this.setUseTransparentTextures(true); this.setName( makeTitle(caps, params.getStringValue(AVKey.LAYER_NAMES), params.getStringValue(AVKey.STYLE_NAMES))); this.creationParams = params.copy(); } private static AVList initParams(Capabilities caps, AVList params) { if (caps == null) { String message = Logging.getMessage("nullValue.WMSCapabilities"); Logging.logger().severe(message); throw new IllegalArgumentException(message); } if (params == null) { String message = Logging.getMessage("nullValue.LayerConfigParams"); Logging.logger().severe(message); throw new IllegalArgumentException(message); } String layerNames = params.getStringValue(AVKey.LAYER_NAMES); if (layerNames == null || layerNames.length() == 0) { String message = Logging.getMessage("nullValue.WMSLayerNames"); Logging.logger().severe(message); throw new IllegalArgumentException(message); } String[] names = layerNames.split(","); if (names == null || names.length == 0) { String message = Logging.getMessage("nullValue.WMSLayerNames"); Logging.logger().severe(message); throw new IllegalArgumentException(message); } for (String name : names) { if (caps.getLayerByName(name) == null) { String message = Logging.getMessage("WMS.LayerNameMissing", name); Logging.logger().severe(message); throw new IllegalArgumentException(message); } } Long lastUpdate = caps.getLayerLatestLastUpdateTime(caps, names); if (lastUpdate != null) params.setValue(AVKey.EXPIRY_TIME, lastUpdate); params.setValue(AVKey.DATASET_NAME, layerNames); String mapRequestURIString = caps.getGetMapRequestGetURL(); mapRequestURIString = WWXML.fixGetMapString(mapRequestURIString); if (params.getValue(AVKey.SERVICE) == null) params.setValue(AVKey.SERVICE, mapRequestURIString); mapRequestURIString = params.getStringValue(AVKey.SERVICE); if (mapRequestURIString == null || mapRequestURIString.length() == 0) { Logging.logger().severe("WMS.RequestMapURLMissing"); throw new IllegalArgumentException(Logging.getMessage("WMS.RequestMapURLMissing")); } String styleNames = params.getStringValue(AVKey.STYLE_NAMES); if (params.getValue(AVKey.DATA_CACHE_NAME) == null) { try { URI mapRequestURI = new URI(mapRequestURIString); String cacheName = WWIO.formPath(mapRequestURI.getAuthority(), mapRequestURI.getPath(), layerNames, styleNames); params.setValue(AVKey.DATA_CACHE_NAME, cacheName); } catch (URISyntaxException e) { String message = Logging.getMessage("WMS.RequestMapURLBad", mapRequestURIString); Logging.logger().severe(message); throw new IllegalArgumentException(message); } } // Determine image format to request. if (params.getStringValue(AVKey.IMAGE_FORMAT) == null) { String imageFormat = chooseImageFormat(caps); params.setValue(AVKey.IMAGE_FORMAT, imageFormat); } if (params.getStringValue(AVKey.IMAGE_FORMAT) == null) { Logging.logger().severe("WMS.NoImageFormats"); throw new IllegalArgumentException(Logging.getMessage("WMS.NoImageFormats")); } // Determine bounding sector. Sector sector = (Sector) params.getValue(AVKey.SECTOR); if (sector == null) { for (String name : names) { BoundingBox bb = caps.getLayerGeographicBoundingBox(caps.getLayerByName(name)); if (bb == null) { Logging.logger().log(java.util.logging.Level.SEVERE, "WMS.NoGeographicBoundingBoxForLayer", name); continue; } sector = Sector.union(sector, Sector.fromDegrees( clamp(bb.getMiny(), -90d, 90d), clamp(bb.getMaxy(), -90d, 90d), clamp(bb.getMinx(), -180d, 180d), clamp(bb.getMaxx(), -180d, 180d))); } if (sector == null) { Logging.logger().severe("WMS.NoGeographicBoundingBox"); throw new IllegalArgumentException(Logging.getMessage("WMS.NoGeographicBoundingBox")); } params.setValue(AVKey.SECTOR, sector); } if (params.getValue(AVKey.LEVEL_ZERO_TILE_DELTA) == null) { Angle delta = Angle.fromDegrees(36); params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(delta, delta)); } if (params.getValue(AVKey.TILE_WIDTH) == null) params.setValue(AVKey.TILE_WIDTH, 512); if (params.getValue(AVKey.TILE_HEIGHT) == null) params.setValue(AVKey.TILE_HEIGHT, 512); if (params.getValue(AVKey.FORMAT_SUFFIX) == null) params.setValue(AVKey.FORMAT_SUFFIX, ".dds"); if (params.getValue(AVKey.NUM_LEVELS) == null) params.setValue(AVKey.NUM_LEVELS, 19); // approximately 0.1 meters per pixel if (params.getValue(AVKey.NUM_EMPTY_LEVELS) == null) params.setValue(AVKey.NUM_EMPTY_LEVELS, 0); // TODO: adjust for subsetable, fixedimage, etc. params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder(caps.getVersion(), params)); return params; } private static double clamp(double v, double min, double max) { return v < min ? min : v > max ? max : v; } private static String makeTitle(Capabilities caps, String layerNames, String styleNames) { String[] lNames = layerNames.split(","); String[] sNames = styleNames != null ? styleNames.split(",") : null; StringBuilder sb = new StringBuilder(); for (int i = 0; i < lNames.length; i++) { if (sb.length() > 0) sb.append(", "); String layerName = lNames[i]; Element layer = caps.getLayerByName(layerName); String layerTitle = caps.getLayerTitle(layer); sb.append(layerTitle != null ? layerTitle : layerName); if (sNames == null || sNames.length <= i) continue; String styleName = sNames[i]; Element style = caps.getLayerStyleByName(layer, styleName); if (style == null) continue; sb.append(" : "); String styleTitle = caps.getStyleTitle(layer, style); sb.append(styleTitle != null ? styleTitle : styleName); } return sb.toString(); } private static final String[] formatOrderPreference = new String[] { "image/dds", "image/png", "image/jpeg"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -