/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2009, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * */ package org.geotools.arcsde.raster.info; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.Point2D; import org.geotools.geometry.jts.ReferencedEnvelope; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * Represents one level in an ArcSDE pyramid. Holds information about a given pyramid level, like * resolution, x/y offsets, number of tiles high/wide, total pixel size and total envelope covered * by this level. * * @author sfarber * */ final class PyramidLevelInfo { private int pyramidLevel, xTiles, yTiles; Point2D extentOffset; Point imageOffset; private double xRes, yRes; private ReferencedEnvelope envelope; public Dimension size; /** * * @param level * the level index * @param extent * the geographical extent the level covers * @param imgOffset * the offset of the image at this level * @param extOffset * the offset of the image extent at this level * @param numTilesWide * @param numTilesHigh * @param levelSize * the size of the actual image inside the tiled pixel range */ PyramidLevelInfo(int level, ReferencedEnvelope extent, Point imgOffset, Point2D extOffset, int numTilesWide, int numTilesHigh, Dimension levelSize) { this.pyramidLevel = level; this.xRes = extent.getWidth() / levelSize.width; this.yRes = extent.getHeight() / levelSize.height; this.envelope = extent; this.imageOffset = imgOffset; this.extentOffset = extOffset; this.xTiles = numTilesWide; this.yTiles = numTilesHigh; this.size = levelSize; } /** * @return Which level in the pyramid this object represents */ public int getLevel() { return pyramidLevel; } /** * @return The X and Y resolution in units/pixel for pixels at this level */ public double getXRes() { return xRes; } /** * @return The X and Y resolution in units/pixel for pixels at this level */ public double getYRes() { return yRes; } /** * @return DOCUMENT ME!!! */ public int getXOffset() { return imageOffset.x; } /** * @return DOCUMENT ME!!! */ public int getYOffset() { return imageOffset.y; } /** * @return The total number of tiles covering the width of this level */ public int getNumTilesWide() { return xTiles; } /** * @return The total number of tiles covering the height of this level */ public int getNumTilesHigh() { return yTiles; } /** * The envelope covering the image grid range inside fully tiled image at this pyramid level * * @return The geographical area covered by the {@link #getImageRange() grid range} of the * raster at this pyramid level */ public ReferencedEnvelope getImageEnvelope() { final double deltaX = extentOffset.getX(); final double deltaY = extentOffset.getY(); double minx = this.envelope.getMinX() - deltaX; double miny = this.envelope.getMinY() - deltaY; double maxx = minx + this.envelope.getWidth(); double maxy = miny + this.envelope.getHeight(); CoordinateReferenceSystem crs = this.envelope.getCoordinateReferenceSystem(); ReferencedEnvelope imageExtent = new ReferencedEnvelope(minx, maxx, miny, maxy, crs); return imageExtent; } /** * @return The total number of pixels in the image at this level as whole tiles */ public Dimension getSize() { return size; } /** * The rectangle covering the actual raster data inside the tiled space * * @return */ public Rectangle getImageRange() { final int offsetX = getXOffset(); final int offsetY = getYOffset(); /* * get the range of actual data pixels in this pyramid level in pixel space, offset and * trailing no data pixels to fill up the tile space do not count */ final Rectangle levelRange = new Rectangle(offsetX, offsetY, size.width, size.height); return levelRange; } @Override public String toString() { return "[level: " + pyramidLevel + " size: " + size.width + "x" + size.height + " xRes: " + xRes + " yRes: " + yRes + " xOffset: " + getXOffset() + " yOffset: " + getYOffset() + " extent: " + envelope.getMinX() + "," + envelope.getMinY() + " " + envelope.getMaxX() + "," + envelope.getMaxY() + " tilesWide: " + xTiles + " tilesHigh: " + yTiles + "]"; } }