Package org.geoserver.wcs2_0.util

Source Code of org.geoserver.wcs2_0.util.EnvelopeAxesLabelsMapper

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2002-2011, 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.geoserver.wcs2_0.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;

import org.geotools.referencing.cs.DefaultCoordinateSystemAxis;
import org.geotools.util.Utilities;
import org.geotools.util.logging.Logging;
import org.opengis.geometry.Envelope;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.GeographicCRS;
import org.opengis.referencing.cs.CoordinateSystem;
import org.opengis.referencing.cs.CoordinateSystemAxis;

/**
* Retain a unique mapping between {@link Envelope} axes and their names.
*
* @author Simone Giannecchini, GeoSolutions
* TODO caching depending on CRS?
* TODO handle composite CRS
*/
public class EnvelopeAxesLabelsMapper {
      
    /** Logger for this class*/
    private final static Logger LOGGER= Logging.getLogger(EnvelopeAxesLabelsMapper.class);
   
    public List<String> getAxesNames(Envelope envelope, boolean swapAxes){
        Utilities.ensureNonNull("envelope", envelope);
        final CoordinateReferenceSystem crs= envelope.getCoordinateReferenceSystem();
       
        // handle axes switch for geographic crs
        final boolean axesSwitch= crs instanceof GeographicCRS &&swapAxes;
       
        // additional fields for CRS
        final CoordinateSystem cs=crs.getCoordinateSystem();
       
        final int dimension=cs.getDimension();
        // loop through dimensions
        final ArrayList<String> retValue=new ArrayList<String>();
        if (!axesSwitch) {
            for (int i = 0; i < dimension; i++) {
                CoordinateSystemAxis axis = cs.getAxis(i);
                retValue.add(getAxisLabel(axis)); // use axis abbreviation
            }
        } else {
            int northing=-1, easting=-1;
            for (int i = 0; i < dimension; i++) {
                final CoordinateSystemAxis axis = cs.getAxis(i);
                if (Math.abs(DefaultCoordinateSystemAxis.getAngle(axis.getDirection(), DefaultCoordinateSystemAxis.LONGITUDE.getDirection()))<1E-6) {
                    easting = i;
                } else if (Math.abs(DefaultCoordinateSystemAxis.getAngle(axis.getDirection(), DefaultCoordinateSystemAxis.LATITUDE.getDirection()))<1E-6){
                    northing = i;
                }
                retValue.add(getAxisLabel(axis)); // use axis abbreviation
            }      
           
            // now switch them
            retValue.add(northing, retValue.remove(easting));
           
        }

        return retValue;
    }
   
    private String getAxisLabel(CoordinateSystemAxis axis) {
        // some default axis have weird abbreviations (greek letters), handle them separately
        String label = axis.getAbbreviation();
        if(label.equals(DefaultCoordinateSystemAxis.LONGITUDE.getAbbreviation())) {
            return "Long";
        } else if(label.equals(DefaultCoordinateSystemAxis.LATITUDE.getAbbreviation())) {
            return "Lat";
        } else {
           
            return label;
        }
    }

    public int getAxisIndex(final Envelope envelope, final String axisAbbreviation){
        final int[] val= getAxesIndexes(envelope, Arrays.asList(axisAbbreviation));
        return (val==null?-1:val[0]);
    }
   
    public int[] getAxesIndexes(final Envelope envelope, final List<String> axesAbbreviations){
        Utilities.ensureNonNull("envelope", envelope);
        Utilities.ensureNonNull("dimensionNames", axesAbbreviations);

        final CoordinateReferenceSystem crs= envelope.getCoordinateReferenceSystem();
        final CoordinateSystem cs=crs.getCoordinateSystem();
        final int crsDimension=cs.getDimension();
               
        final int dimension=axesAbbreviations.size();
        final int[] retValue= new int[dimension];
        for (int i = 0; i < dimension; i++) {
           
            // abbreviation we are looking for
            final String axisAbbreviation=axesAbbreviations.get(i);
            int pos=-1;
            // search for this dimension in cs axes
            for(int j=0;j<crsDimension;j++){
                // check exact abbreviation
                CoordinateSystemAxis axis = cs.getAxis(j);
                if(getAxisLabel(axis).equals(axisAbbreviation)){
                    pos=j; // FOUND!!!
                    break;
                }
            }
           
            // found?
            if(pos<0){
                // NOT FOUND
                return null;
            }
           
            // yes!!!
            retValue[i]=pos;
        }           
        return retValue;
    }

}
TOP

Related Classes of org.geoserver.wcs2_0.util.EnvelopeAxesLabelsMapper

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.