basictiledimagelayer.java
来自「world wind java sdk 源码」· Java 代码 · 共 946 行 · 第 1/3 页
JAVA
946 行
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.layers;import com.sun.opengl.util.texture.*;import gov.nasa.worldwind.WorldWind;import gov.nasa.worldwind.avlist.*;import gov.nasa.worldwind.formats.dds.DDSCompressor;import gov.nasa.worldwind.geom.*;import gov.nasa.worldwind.render.DrawContext;import gov.nasa.worldwind.retrieve.*;import gov.nasa.worldwind.util.*;import java.io.*;import java.net.*;import java.nio.ByteBuffer;import java.nio.channels.ClosedByInterruptException;import java.util.*;/** * @author tag * @version $Id: BasicTiledImageLayer.java 10814 2009-05-04 01:41:43Z patrickmurris $ */public class BasicTiledImageLayer extends TiledImageLayer implements BulkRetrievable{ private final Object fileLock = new Object(); private AVList creationParams; public BasicTiledImageLayer(LevelSet levelSet) { super(levelSet); } public BasicTiledImageLayer(AVList params) { this(new LevelSet(params)); this.setValue(AVKey.CONSTRUCTION_PARAMETERS, params); this.creationParams = params.copy(); } public BasicTiledImageLayer(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); } 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); String s = rs.getStateValueAsString("Layer.Name"); if (s != null) this.setName(s); 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()); } } } } protected 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.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.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); 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); LatLon ll = rs.getStateValueAsLatLon(AVKey.LEVEL_ZERO_TILE_DELTA); if (ll != null) params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, ll); ll = rs.getStateValueAsLatLon(AVKey.TILE_ORIGIN); if (ll != null) params.setValue(AVKey.TILE_ORIGIN, ll); Sector sector = rs.getStateValueAsSector(AVKey.SECTOR); if (sector != null) params.setValue(AVKey.SECTOR, sector); return params; } private RestorableSupport makeRestorableState(AVList params) { RestorableSupport rs = RestorableSupport.newRestorableSupport(); // Creating a new RestorableSupport failed. RestorableSupport logged the problem, so just return null. if (rs == null) return null; for (Map.Entry<String, Object> p : params.getEntries()) { if (p.getValue() == null) continue; if (p.getValue() instanceof LatLon) { rs.addStateValueAsLatLon(p.getKey(), (LatLon) p.getValue()); } else if (p.getValue() instanceof Sector) { rs.addStateValueAsSector(p.getKey(), (Sector) p.getValue()); } else { rs.addStateValueAsString(p.getKey(), p.getValue().toString()); } } rs.addStateValueAsBoolean("Layer.Enabled", this.isEnabled()); rs.addStateValueAsDouble("Layer.Opacity", this.getOpacity()); rs.addStateValueAsDouble("Layer.MinActiveAltitude", this.getMinActiveAltitude()); rs.addStateValueAsDouble("Layer.MaxActiveAltitude", this.getMaxActiveAltitude()); rs.addStateValueAsBoolean("Layer.NetworkRetrievalEnabled", this.isNetworkRetrievalEnabled()); rs.addStateValueAsString("Layer.Name", this.getName()); rs.addStateValueAsBoolean("TiledImageLayer.UseMipMaps", this.isUseMipMaps()); rs.addStateValueAsBoolean("TiledImageLayer.UseTransparentTextures", this.isUseTransparentTextures()); RestorableSupport.StateObject so = rs.addStateObject("avlist"); for (Map.Entry<String, Object> p : this.getEntries()) { if (p.getValue() == null) continue; if (p.getKey().equals(AVKey.CONSTRUCTION_PARAMETERS)) continue; rs.addStateValueAsString(so, p.getKey(), p.getValue().toString()); } return rs; } public String getRestorableState() { if (this.creationParams == null) return null; return this.makeRestorableState(this.creationParams).getStateAsXml(); } public void restoreState(String stateInXml) { String message = Logging.getMessage("RestorableSupport.RestoreRequiresConstructor"); Logging.logger().severe(message); throw new UnsupportedOperationException(message); } protected void forceTextureLoad(TextureTile tile) { final URL textureURL = WorldWind.getDataFileStore().findFile(tile.getPath(), true); if (textureURL != null && !this.isTextureFileExpired(tile, textureURL)) { this.loadTexture(tile, textureURL); } } protected void requestTexture(DrawContext dc, TextureTile tile) { Vec4 centroid = tile.getCentroidPoint(dc.getGlobe()); if (this.getReferencePoint() != null) tile.setPriority(centroid.distanceTo3(this.getReferencePoint())); RequestTask task = new RequestTask(tile, this); this.getRequestQ().add(task); } private static class RequestTask implements Runnable, Comparable<RequestTask> { private final BasicTiledImageLayer layer; private final TextureTile tile; private RequestTask(TextureTile tile, BasicTiledImageLayer layer) { this.layer = layer; this.tile = tile; } public void run() { // TODO: check to ensure load is still needed final java.net.URL textureURL = WorldWind.getDataFileStore().findFile(tile.getPath(), false); if (textureURL != null && !this.layer.isTextureFileExpired(tile, textureURL)) { if (this.layer.loadTexture(tile, textureURL)) { layer.getLevels().unmarkResourceAbsent(tile); this.layer.firePropertyChange(AVKey.LAYER, null, this); return; } else { // Assume that something's wrong with the file and delete it. gov.nasa.worldwind.WorldWind.getDataFileStore().removeFile(textureURL); layer.getLevels().markResourceAbsent(tile); String message = Logging.getMessage("generic.DeletedCorruptDataFile", textureURL); Logging.logger().info(message); } } this.layer.downloadTexture(this.tile); } /** * @param that the task to compare * @return -1 if <code>this</code> less than <code>that</code>, 1 if greater than, 0 if equal * @throws IllegalArgumentException if <code>that</code> is null */ public int compareTo(RequestTask that) { if (that == null) { String msg = Logging.getMessage("nullValue.RequestTaskIsNull"); Logging.logger().severe(msg);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?