level.java

来自「world wind java sdk 源码」· Java 代码 · 共 363 行

JAVA
363
字号
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.util;import gov.nasa.worldwind.avlist.*;import gov.nasa.worldwind.geom.*;/** * @author tag * @version $Id: Level.java 10491 2009-04-25 04:02:49Z tgaskins $ */public class Level implements Comparable<Level>{    private final AVList params;    private final int levelNumber;    private final String levelName; // null or empty level name signifies no data resources associated with this level    private final LatLon tileDelta;    private final int tileWidth;    private final int tileHeight;    private final String cacheName;    private final String service;    private final String dataset;    private final String formatSuffix;    private final double texelSize;    private final String path;    private final TileUrlBuilder urlBuilder;    private long expiryTime = 0;    private boolean active = true;    // Absent tiles: A tile is deemed absent if a specified maximum number of attempts have been made to retrieve it.    // Retrieval attempts are governed by a minimum time interval between successive attempts. If an attempt is made    // within this interval, the tile is still deemed to be absent until the interval expires.    private final AbsentResourceList absentTiles;    int DEFAULT_MAX_ABSENT_TILE_ATTEMPTS = 2;    int DEFAULT_MIN_ABSENT_TILE_CHECK_INTERVAL = 10000; // milliseconds    public Level(AVList params)    {        if (params == null)        {            String message = Logging.getMessage("nullValue.LevelConfigParams");            Logging.logger().severe(message);            throw new IllegalArgumentException(message);        }        this.params = params.copy(); // Private copy to insulate from subsequent changes by the app        String message = this.validate(params);        if (message != null)        {            Logging.logger().severe(message);            throw new IllegalArgumentException(message);        }        String ln = this.params.getStringValue(AVKey.LEVEL_NAME);        this.levelName = ln != null ? ln : "";        this.levelNumber = (Integer) this.params.getValue(AVKey.LEVEL_NUMBER);        this.tileDelta = (LatLon) this.params.getValue(AVKey.TILE_DELTA);        this.tileWidth = (Integer) this.params.getValue(AVKey.TILE_WIDTH);        this.tileHeight = (Integer) this.params.getValue(AVKey.TILE_HEIGHT);        this.cacheName = this.params.getStringValue(AVKey.DATA_CACHE_NAME);        this.service = this.params.getStringValue(AVKey.SERVICE);        this.dataset = this.params.getStringValue(AVKey.DATASET_NAME);        this.formatSuffix = this.params.getStringValue(AVKey.FORMAT_SUFFIX);        this.urlBuilder = (TileUrlBuilder) this.params.getValue(AVKey.TILE_URL_BUILDER);        this.expiryTime = AVListImpl.getLongValue(params, AVKey.EXPIRY_TIME, 0L);//        double averageTileSize = 0.5 * (this.tileWidth + this.tileHeight);//        double averageTileDelta =//            0.5 * (this.tileDelta.getLatitude().getRadians() + this.tileDelta.getLongitude().getRadians());        this.texelSize = this.tileDelta.getLatitude().getRadians() / this.tileHeight;        this.path = this.cacheName + "/" + this.levelName;        Integer maxAbsentTileAttempts = (Integer) this.params.getValue(AVKey.MAX_ABSENT_TILE_ATTEMPTS);        if (maxAbsentTileAttempts == null)            maxAbsentTileAttempts = DEFAULT_MAX_ABSENT_TILE_ATTEMPTS;        Integer minAbsentTileCheckInterval = (Integer) this.params.getValue(AVKey.MIN_ABSENT_TILE_CHECK_INTERVAL);        if (minAbsentTileCheckInterval == null)            minAbsentTileCheckInterval = DEFAULT_MIN_ABSENT_TILE_CHECK_INTERVAL;        this.absentTiles = new AbsentResourceList(maxAbsentTileAttempts, minAbsentTileCheckInterval);    }    /**     * Determines whether the constructor arguments are valid.     *     * @param params the list of parameters to validate.     * @return null if valid, otherwise a <code>String</code> containing a description of why it's invalid.     */    protected String validate(AVList params)    {        StringBuffer sb = new StringBuffer();        Object o = params.getValue(AVKey.LEVEL_NUMBER);        if (o == null || !(o instanceof Integer) || ((Integer) o) < 0)            sb.append(Logging.getMessage("term.levelNumber"));        o = params.getValue(AVKey.LEVEL_NAME);        if (o == null || !(o instanceof String))            sb.append(Logging.getMessage("term.levelName"));        o = params.getValue(AVKey.TILE_WIDTH);        if (o == null || !(o instanceof Integer) || ((Integer) o) < 0)            sb.append(Logging.getMessage("term.tileWidth"));        o = params.getValue(AVKey.TILE_HEIGHT);        if (o == null || !(o instanceof Integer) || ((Integer) o) < 0)            sb.append(Logging.getMessage("term.tileHeight"));        o = params.getValue(AVKey.TILE_DELTA);        if (o == null || !(o instanceof LatLon))            sb.append(Logging.getMessage("term.tileDelta"));        o = params.getValue(AVKey.DATA_CACHE_NAME);        if (o == null || !(o instanceof String) || ((String) o).length() < 1)            sb.append(Logging.getMessage("term.fileStoreFolder"));        o = params.getValue(AVKey.TILE_URL_BUILDER);        if (o == null || !(o instanceof TileUrlBuilder))            sb.append(Logging.getMessage("term.tileURLBuilder"));        o = params.getValue(AVKey.EXPIRY_TIME);        if (o != null && (!(o instanceof Long) || ((Long) o) < 1))            sb.append(Logging.getMessage("term.expiryTime"));        if (params.getStringValue(AVKey.LEVEL_NAME).length() > 0)        {            o = params.getValue(AVKey.DATASET_NAME);            if (o == null || !(o instanceof String) || ((String) o).length() < 1)                sb.append(Logging.getMessage("term.datasetName"));            o = params.getValue(AVKey.FORMAT_SUFFIX);            if (o == null || !(o instanceof String) || ((String) o).length() < 1)                sb.append(Logging.getMessage("term.formatSuffix"));        }        if (sb.length() == 0)            return null;        return Logging.getMessage("layers.LevelSet.InvalidLevelDescriptorFields", sb.toString());    }    public final AVList getParams()    {        return params;    }    public String getPath()    {        return this.path;    }    public final int getLevelNumber()    {        return this.levelNumber;    }    public String getLevelName()    {        return this.levelName;    }    public LatLon getTileDelta()    {        return this.tileDelta;    }    public final int getTileWidth()    {        return this.tileWidth;    }    public final int getTileHeight()    {        return this.tileHeight;    }    public final String getFormatSuffix()    {        return this.formatSuffix;    }    public final String getService()    {        return this.service;    }    public final String getDataset()    {        return this.dataset;    }    public final String getCacheName()    {        return this.cacheName;    }    public final double getTexelSize()    {        return this.texelSize;    }    public final boolean isEmpty()    {        return this.levelName == null || this.levelName.equals("") || !this.active;    }    public final void markResourceAbsent(long tileNumber)    {        this.absentTiles.markResourceAbsent(tileNumber);    }    public final boolean isResourceAbsent(long tileNumber)    {        return this.absentTiles.isResourceAbsent(tileNumber);    }    public final void unmarkResourceAbsent(long tileNumber)    {        this.absentTiles.unmarkResourceAbsent(tileNumber);    }    public final long getExpiryTime()    {        return this.expiryTime;    }    public final void setExpiryTime(long expTime)    {        this.expiryTime = expTime;    }    public boolean isActive()    {        return this.active;    }    public void setActive(boolean active)    {        this.active = active;    }    /**     * Returns the URL necessary to retrieve the specified tile.     *     * @param tile the tile who's resources will be retrieved.     * @param imageFormat a string identifying the mime type of the desired image format     * @return the resource URL.     * @throws java.net.MalformedURLException if the URL cannot be formed from the tile's parameters.     * @throws IllegalArgumentException       if <code>tile</code> is null.     */    public java.net.URL getTileResourceURL(Tile tile, String imageFormat) throws java.net.MalformedURLException    {        if (tile == null)        {            String msg = Logging.getMessage("nullValue.TileIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        return this.urlBuilder.getURL(tile, imageFormat);    }    public Sector computeSectorForPosition(Angle latitude, Angle longitude, LatLon tileOrigin)    {        if (latitude == null || longitude == null)        {            String message = Logging.getMessage("nullValue.LatLonIsNull");            Logging.logger().severe(message);            throw new IllegalArgumentException(message);        }        if (tileOrigin == null)        {            String message = Logging.getMessage("nullValue.TileOriginIsNull");            Logging.logger().severe(message);            throw new IllegalArgumentException(message);        }        // Compute the tile's SW lat/lon based on its row/col in the level's data set.        Angle dLat = this.getTileDelta().getLatitude();        Angle dLon = this.getTileDelta().getLongitude();        Angle latOrigin = tileOrigin.getLatitude();        Angle lonOrigin = tileOrigin.getLongitude();        int row = Tile.computeRow(dLat, latitude, latOrigin);        int col = Tile.computeColumn(dLon, longitude, lonOrigin);        Angle minLatitude = Tile.computeRowLatitude(row, dLat, latOrigin);        Angle minLongitude = Tile.computeColumnLongitude(col, dLon, lonOrigin);        return new Sector(minLatitude, minLatitude.add(dLat), minLongitude, minLongitude.add(dLon));    }    public int compareTo(Level that)    {        if (that == null)        {            String msg = Logging.getMessage("nullValue.LevelIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        return this.levelNumber < that.levelNumber ? -1 : this.levelNumber == that.levelNumber ? 0 : 1;    }    public boolean equals(Object o)    {        if (this == o)            return true;        if (o == null || getClass() != o.getClass())            return false;        final Level level = (Level) o;        if (levelNumber != level.levelNumber)            return false;        if (tileHeight != level.tileHeight)            return false;        if (tileWidth != level.tileWidth)            return false;        if (cacheName != null ? !cacheName.equals(level.cacheName) : level.cacheName != null)            return false;        if (dataset != null ? !dataset.equals(level.dataset) : level.dataset != null)            return false;        if (formatSuffix != null ? !formatSuffix.equals(level.formatSuffix) : level.formatSuffix != null)            return false;        if (levelName != null ? !levelName.equals(level.levelName) : level.levelName != null)            return false;        if (service != null ? !service.equals(level.service) : level.service != null)            return false;        //noinspection RedundantIfStatement        if (tileDelta != null ? !tileDelta.equals(level.tileDelta) : level.tileDelta != null)            return false;        return true;    }    public int hashCode()    {        int result;        result = levelNumber;        result = 29 * result + (levelName != null ? levelName.hashCode() : 0);        result = 29 * result + (tileDelta != null ? tileDelta.hashCode() : 0);        result = 29 * result + tileWidth;        result = 29 * result + tileHeight;        result = 29 * result + (formatSuffix != null ? formatSuffix.hashCode() : 0);        result = 29 * result + (service != null ? service.hashCode() : 0);        result = 29 * result + (dataset != null ? dataset.hashCode() : 0);        result = 29 * result + (cacheName != null ? cacheName.hashCode() : 0);        return result;    }    @Override    public String toString()    {        return this.path;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?