Package org.geoserver.gwc.web.gridset

Source Code of org.geoserver.gwc.web.gridset.GridSetInfo

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.gwc.web.gridset;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.measure.converter.UnitConverter;
import javax.measure.quantity.Angle;
import javax.measure.quantity.Quantity;
import javax.measure.unit.NonSI;
import javax.measure.unit.Unit;

import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.measure.Units;
import org.geotools.referencing.CRS;
import org.geowebcache.grid.BoundingBox;
import org.geowebcache.grid.Grid;
import org.geowebcache.grid.GridSet;
import org.geowebcache.grid.GridSetFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.cs.CoordinateSystemAxis;

class GridSetInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;

    private String description;

    private CoordinateReferenceSystem crs;

    private ReferencedEnvelope bounds;

    private int tileWidth;

    private int tileHeight;

    private boolean alignTopLeft;

    private List<Grid> levels;

    private double pixelSize;

    private boolean internal;

    /**
     * Same as {@link GridSet#isResolutionsPreserved()}
     */
    private boolean resolutionsPreserved;

    public GridSetInfo() {
        this.internal = false;
        this.levels = new ArrayList<Grid>();
        this.tileWidth = 256;
        this.tileHeight = 256;
        this.pixelSize = GridSetFactory.DEFAULT_PIXEL_SIZE_METER;
        this.resolutionsPreserved = true;
    }

    /**
     * @param gridset
     * @param internal
     *            whether this gridset is one of the GWC internally defined ones
     */
    public GridSetInfo(final GridSet gridset, final boolean internal) {
        this.internal = internal;

        this.name = gridset.getName();
        this.description = gridset.getDescription();
        String code = "EPSG:" + gridset.getSrs().getNumber();
        final boolean longitudeFirst = true;
        try {
            this.crs = CRS.decode(code, longitudeFirst);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        BoundingBox gridsetBounds = gridset.getOriginalExtent();
        double x1 = gridsetBounds.getMinX();
        double x2 = gridsetBounds.getMaxX();
        double y1 = gridsetBounds.getMinY();
        double y2 = gridsetBounds.getMaxY();
        this.bounds = new ReferencedEnvelope(x1, x2, y1, y2, this.crs);

        this.pixelSize = gridset.getPixelSize();
        this.tileWidth = gridset.getTileWidth();
        this.tileHeight = gridset.getTileHeight();
        this.alignTopLeft = gridset.isTopLeftAligned();
        this.resolutionsPreserved = gridset.isResolutionsPreserved();

        Grid[] grids = gridset.getGridLevels();
        this.levels = new ArrayList<Grid>();

        if (grids != null) {
            for (Grid grid : grids) {
                this.levels.add(grid.clone());
            }
        }
    }

    /**
     * @see GridSet#isResolutionsPreserved()
     */
    public boolean isResolutionsPreserved() {
        return resolutionsPreserved;
    }

    /**
     * @see GridSet#isResolutionsPreserved()
     */
    public void setResolutionsPreserved(boolean resolutionsPreserved) {
        this.resolutionsPreserved = resolutionsPreserved;
    }

    /**
     * @return the pixelSize
     */
    public double getPixelSize() {
        return pixelSize;
    }

    /**
     * @param pixelSize
     *            the pixelSize to set
     */
    public void setPixelSize(double pixelSize) {
        this.pixelSize = pixelSize;
    }

    /**
     * @return {@code true} if this is a GWC internally defined GridSet
     */
    public boolean isInternal() {
        return internal;
    }

    public void setInternal(boolean internal) {
        this.internal = internal;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the description
     */
    public String getDescription() {
        return description;
    }

    /**
     * @param description
     *            the description to set
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * @return the crs
     */
    public CoordinateReferenceSystem getCrs() {
        return crs;
    }

    /**
     * @param crs
     *            the crs to set
     */
    public void setCrs(CoordinateReferenceSystem crs) {
        this.crs = crs;
    }

    /**
     * @return the bounds
     */
    public ReferencedEnvelope getBounds() {
        return bounds;
    }

    /**
     * @param bounds
     *            the bounds to set
     */
    public void setBounds(ReferencedEnvelope bounds) {
        this.bounds = bounds;
    }

    /**
     * @return the tileWidth
     */
    public int getTileWidth() {
        return tileWidth;
    }

    /**
     * @param tileWidth
     *            the tileWidth to set
     */
    public void setTileWidth(int tileWidth) {
        this.tileWidth = tileWidth;
    }

    /**
     * @return the tileHeight
     */
    public int getTileHeight() {
        return tileHeight;
    }

    /**
     * @param tileHeight
     *            the tileHeight to set
     */
    public void setTileHeight(int tileHeight) {
        this.tileHeight = tileHeight;
    }

    /**
     * @return the alignTopLeft
     */
    public boolean isAlignTopLeft() {
        return alignTopLeft;
    }

    /**
     * @param alignTopLeft
     *            the alignTopLeft to set
     */
    public void setAlignTopLeft(boolean alignTopLeft) {
        this.alignTopLeft = alignTopLeft;
    }

    /**
     * @return the levels
     */
    public List<Grid> getLevels() {
        return levels;
    }

    /**
     * @param levels
     *            the levels to set
     */
    public void setLevels(List<Grid> levels) {
        this.levels = levels;
    }

    public Double getMetersPerUnit() {
        CoordinateReferenceSystem crs = getCrs();
        Double metersPerUnit = getMetersPerUnit(crs);
        return metersPerUnit;
    }

    public Double getMetersPerUnit(CoordinateReferenceSystem crs) {
        if (crs == null) {
            return null;
        }

        final CoordinateSystemAxis axis = crs.getCoordinateSystem().getAxis(0);
        final Unit<?> unit = axis.getUnit();

        return metersPerUnit(unit);
    }

    static Double metersPerUnit(final Unit<?> unit) {
        double meters;
        final Unit<Angle> degree = NonSI.DEGREE_ANGLE;
        final Unit<Angle> dms = Units.DEGREE_MINUTE_SECOND;

        if (degree.equals(unit)) {
            meters = GridSetFactory.EPSG4326_TO_METERS;
        } else {
            Unit<? extends Quantity> metre = Unit.valueOf("m");
            try {
                meters = unit.getConverterTo(metre).convert(1);
            } catch (Exception e) {
                UnitConverter converter = unit.getConverterTo(degree);
                double toDegree = converter.convert(1);
                meters = toDegree * GridSetFactory.EPSG4326_TO_METERS;
            }
        }
        return meters;
    }

}
TOP

Related Classes of org.geoserver.gwc.web.gridset.GridSetInfo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.