📄 levelset.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.util;import gov.nasa.worldwind.WWObjectImpl;import gov.nasa.worldwind.avlist.*;import gov.nasa.worldwind.geom.*;import java.net.*;import java.util.*;/** * @author tag * @version $Id: LevelSet.java 10491 2009-04-25 04:02:49Z tgaskins $ */public class LevelSet extends WWObjectImpl{ public static final class SectorResolution { private final int levelNumber; private final Sector sector; public SectorResolution(Sector sector, int levelNumber) { this.levelNumber = levelNumber; this.sector = sector; } } private final Sector sector; private final LatLon levelZeroTileDelta; private final LatLon tileOrigin; private final int numLevelZeroColumns; private final java.util.ArrayList<Level> levels = new java.util.ArrayList<Level>(); private final SectorResolution[] sectorLevelLimits; public LevelSet(AVList params) { StringBuffer sb = new StringBuffer(); Object o = params.getValue(AVKey.LEVEL_ZERO_TILE_DELTA); if (o == null || !(o instanceof LatLon)) sb.append(Logging.getMessage("term.tileDelta")).append(" "); o = params.getValue(AVKey.SECTOR); if (o == null || !(o instanceof Sector)) sb.append(Logging.getMessage("term.sector")).append(" "); int numLevels = 0; o = params.getValue(AVKey.NUM_LEVELS); if (o == null || !(o instanceof Integer) || (numLevels = (Integer) o) < 1) sb.append(Logging.getMessage("term.numLevels")).append(" "); int numEmptyLevels = 0; o = params.getValue(AVKey.NUM_EMPTY_LEVELS); if (o == null || !(o instanceof Integer) || (numEmptyLevels = (Integer) o) < 0) sb.append(Logging.getMessage("term.numEMptyLevels")).append(" "); String[] inactiveLevels = null; o = params.getValue(AVKey.INACTIVE_LEVELS); if (o != null && !(o instanceof String)) sb.append(Logging.getMessage("term.inactiveLevels")).append(" "); else if (o != null) inactiveLevels = ((String) o).split(","); SectorResolution[] sectorLimits = null; o = params.getValue(AVKey.SECTOR_RESOLUTION_LIMITS); if (o != null && !(o instanceof SectorResolution[])) { sb.append(Logging.getMessage("term.sectorResolutionLimits")).append(" "); } else if (o != null) { sectorLimits = (SectorResolution[]) o; for (SectorResolution sr : sectorLimits) { if (sr.levelNumber > numLevels - 1) { String message = Logging.getMessage("LevelSet.sectorResolutionLimitsTooHigh", sr.levelNumber, numLevels - 1); Logging.logger().warning(message); break; } } } this.sectorLevelLimits = sectorLimits; if (sb.length() > 0) { String message = Logging.getMessage("layers.LevelSet.InvalidLevelDescriptorFields", sb.toString()); Logging.logger().severe(message); throw new IllegalArgumentException(message); } this.sector = (Sector) params.getValue(AVKey.SECTOR); this.levelZeroTileDelta = (LatLon) params.getValue(AVKey.LEVEL_ZERO_TILE_DELTA); o = params.getValue(AVKey.TILE_ORIGIN); if (o != null && o instanceof LatLon) this.tileOrigin = (LatLon) o; else this.tileOrigin = new LatLon(Angle.NEG90, Angle.NEG180); params = params.copy(); // copy so as not to modify the user's params TileUrlBuilder tub = (TileUrlBuilder) params.getValue(AVKey.TILE_URL_BUILDER); if (tub == null) { params.setValue(AVKey.TILE_URL_BUILDER, new TileUrlBuilder() { public URL getURL(Tile tile, String altImageFormat) throws MalformedURLException { String service = tile.getLevel().getService(); if (service == null || service.length() < 1) return null; StringBuffer sb = new StringBuffer(tile.getLevel().getService()); if (sb.lastIndexOf("?") != sb.length() - 1) sb.append("?"); sb.append("T="); sb.append(tile.getLevel().getDataset()); sb.append("&L="); sb.append(tile.getLevel().getLevelName()); sb.append("&X="); sb.append(tile.getColumn()); sb.append("&Y="); sb.append(tile.getRow()); // Convention for NASA WWN tiles is to request them with common dataset name but without dds. return new URL(altImageFormat == null ? sb.toString() : sb.toString().replace("dds", "")); } }); } if (this.sectorLevelLimits != null) { Arrays.sort(this.sectorLevelLimits, new Comparator<SectorResolution>() { public int compare(SectorResolution sra, SectorResolution srb) { // sort order is deliberately backwards in order to list higher-resolution sectors first return sra.levelNumber < srb.levelNumber ? 1 : sra.levelNumber == srb.levelNumber ? 0 : -1; } }); } // Compute the number of level zero columns. This value is guaranteed to be a nonzero number, since there is // generally at least one level zero tile. int firstLevelZeroCol = Tile.computeColumn(this.levelZeroTileDelta.getLongitude(), this.sector.getMinLongitude(), this.tileOrigin.getLongitude()); int lastLevelZeroCol = Tile.computeColumn(this.levelZeroTileDelta.getLongitude(), this.sector.getMaxLongitude(), this.tileOrigin.getLongitude()); this.numLevelZeroColumns = Math.max(1, lastLevelZeroCol - firstLevelZeroCol + 1); for (int i = 0; i < numLevels; i++) { params.setValue(AVKey.LEVEL_NAME, i < numEmptyLevels ? "" : Integer.toString(i - numEmptyLevels)); params.setValue(AVKey.LEVEL_NUMBER, i); Angle latDelta = this.levelZeroTileDelta.getLatitude().divide(Math.pow(2, i)); Angle lonDelta = this.levelZeroTileDelta.getLongitude().divide(Math.pow(2, i)); params.setValue(AVKey.TILE_DELTA, new LatLon(latDelta, lonDelta)); this.levels.add(new Level(params)); } if (inactiveLevels != null) { for (String s : inactiveLevels) { int i = Integer.parseInt(s); this.getLevel(i).setActive(false); } } } public LevelSet(LevelSet source) { if (source == null) { String msg = Logging.getMessage("nullValue.LevelSetIsNull"); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } this.sector = source.sector; this.levelZeroTileDelta = source.levelZeroTileDelta; this.tileOrigin = source.tileOrigin; this.numLevelZeroColumns = source.numLevelZeroColumns; this.sectorLevelLimits = source.sectorLevelLimits; for (Level level : source.levels) { this.levels.add(level); // Levels are final, so it's safe to copy references. } } public final Sector getSector() { return this.sector; } public final LatLon getLevelZeroTileDelta() { return this.levelZeroTileDelta; } public final LatLon getTileOrigin() { return this.tileOrigin; } public final ArrayList<Level> getLevels() { return this.levels; } public final Level getLevel(int levelNumber) { return (levelNumber >= 0 && levelNumber < this.levels.size()) ? this.levels.get(levelNumber) : null; } public final int getNumLevels() { return this.levels.size();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -