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 + -
显示快捷键?