/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2003-2008, 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.coverage.grid.io; import java.util.Map; import javax.imageio.ImageWriteParam; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.coverage.grid.io.imageio.GeoToolsWriteParams; import org.geotools.factory.Hints; import org.geotools.parameter.DefaultParameterDescriptor; import org.geotools.referencing.CRS; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.coverage.grid.Format; import org.opengis.coverage.grid.GridCoverageReader; import org.opengis.coverage.grid.GridCoverageWriter; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * AbstractGridFormat is a convenience class so subclasses only need to populate * a Map class and set the read and write parameter fields. * * * * For example the ArcGridFormat has the following method which sets up all the * required information: <code>private void setInfo(){ HashMap info=new * HashMap(); info.put("name", "ArcGrid"); info.put("description", "Arc Grid * Coverage Format"); info.put("vendor", "Geotools"); info.put("docURL", * "http://gdal.velocet.ca/projects/aigrid/index.html"); info.put("version", * "1.0"); mInfo=info; readParameters=new GeneralParameterDescriptor[2]; * readParameters[0]=ArcGridOperationParameter.getGRASSReadParam(); * readParameters[0]=ArcGridOperationParameter.getCompressReadParam(); * writeParameters=new GeneralParameterDescriptor[2]; * writeParameters[0]=ArcGridOperationParameter.getGRASSWriteParam(); * writeParameters[0]=ArcGridOperationParameter.getCompressWriteParam(); * }</code> * * @author jeichar * @author Simone Giannecchini, GeoSolutions * @source $URL: * http://svn.geotools.org/geotools/branches/2.3.x/module/main/src/org/geotools/data/coverage/grid/AbstractGridFormat.java $ */ @SuppressWarnings("deprecation") public abstract class AbstractGridFormat implements Format { /** * The Map object is used by the information methods(such as getName()) as a * data source. The keys in the Map object (for the associated method) are * as follows: getName() key = "name" value type=String getDescription() key = * "description" value type=String getVendor() key = "vendor" value * type=String getDocURL() key = "docURL" value type=String getVersion() key = * "version" value type=String Naturally, any methods that are overridden * need not have an entry in the Map */ protected Map<String,String> mInfo; /** * {@link ParameterValueGroup} that controls the reading process for a * {@link GridCoverageReader} through the * {@link GridCoverageReader#read(org.opengis.parameter.GeneralParameterValue[])} * method. */ protected ParameterValueGroup readParameters; /** * {@link ParameterValueGroup} that controls the writing process for a * {@link GridCoverageWriter} through the * {@link GridCoverageWriter#write(org.opengis.coverage.grid.GridCoverage, org.opengis.parameter.GeneralParameterValue[])} * method. */ protected ParameterValueGroup writeParameters; /** * Default {@link CoordinateReferenceSystem} used by all the plugins. */ private static CoordinateReferenceSystem crs; static { try { crs = CRS.decode("EPSG:4326", true); } catch (NoSuchAuthorityCodeException e) { crs = DefaultGeographicCRS.WGS84; } catch (FactoryException e) { crs = DefaultGeographicCRS.WGS84; } } /** * This {@link GeneralParameterValue} cacn be provided to the * {@link GridCoverageReader}s through the * {@link GridCoverageReader#read(GeneralParameterValue[])} methid in order * to pick up the best matching resolution level and (soon) the best * matching area. */ public static final DefaultParameterDescriptor<GridGeometry2D> READ_GRIDGEOMETRY2D = new DefaultParameterDescriptor<GridGeometry2D>( "ReadGridGeometry2D", GridGeometry2D.class, null, null); /** * This {@link GeneralParameterValue} cacn be provided to the * {@link GridCoverageWriter}s through the * {@link GridCoverageWriter#write(org.opengis.coverage.grid.GridCoverage, GeneralParameterValue[])} * method in order to control the writing process in terms of compression, * tiling, etc.GridGeometry2D */ public static final DefaultParameterDescriptor<GeoToolsWriteParams> GEOTOOLS_WRITE_PARAMS = new DefaultParameterDescriptor<GeoToolsWriteParams>( "WriteParameters", GeoToolsWriteParams.class, null, null); /** * This {@link GeneralParameterValue} can be provided to the * {@link GridCoverageReader}s through the * {@link GridCoverageReader#read(GeneralParameterValue[])} method in order * to specify the type of image read operation requested: using a JAI * ImageRead operation (leveraging on Deferred Execution Model, * Tile Caching,...), or the direct {@code ImageReader}'s read methods. */ public static final DefaultParameterDescriptor<Boolean> USE_JAI_IMAGEREAD = new DefaultParameterDescriptor<Boolean>( Hints.USE_JAI_IMAGEREAD.toString(), Boolean.class, new Boolean[] { Boolean.TRUE, Boolean.FALSE }, Boolean.TRUE); /** * This {@link GeneralParameterValue} can be provided to the * {@link GridCoverageReader}s through the * {@link GridCoverageReader#read(GeneralParameterValue[])} method in order * to specify the policy a reader should adopt when chhosing the right * overview during a read operation. */ public static final DefaultParameterDescriptor<OverviewPolicy> OVERVIEW_POLICY = new DefaultParameterDescriptor<OverviewPolicy>( Hints.OVERVIEW_POLICY.toString(), OverviewPolicy.class, new OverviewPolicy[] { OverviewPolicy.IGNORE, OverviewPolicy.NEAREST, OverviewPolicy.QUALITY, OverviewPolicy.SPEED }, OverviewPolicy.QUALITY); /** * @see org.opengis.coverage.grid.Format#getName() */ public String getName() { return (String) mInfo.get("name"); } /** * @see org.opengis.coverage.grid.Format#getDescription() */ public String getDescription() { return (String) mInfo.get("description"); } /** * @see org.opengis.coverage.grid.Format#getVendor() */ public String getVendor() { return (String) mInfo.get("vendor"); } /** * @see org.opengis.coverage.grid.Format#getDocURL() */ public String getDocURL() { return (String) mInfo.get("docURL"); } /** * @see org.opengis.coverage.grid.Format#getVersion() */ public String getVersion() { return (String) mInfo.get("version"); } /** * Gets a {@link GridCoverageReader} for this format able to create * coverages out of the <code>source</code> object. * * <p> * In case this {@link Format} cannot reader the provided * <code>source</code> object <code>null</code> is returned. * * @param source * The source object to parse. * @return A reader for this {@link Format} or null. */ abstract public AbstractGridCoverage2DReader getReader(Object source); /** * * Gets a {@link GridCoverageReader} for this format able to create * coverages out of the <code>source</code> object using the provided * <code>hints</code>. * * <p> * In case this {@link Format} cannot reader the provided * <code>source</code> object <code>null</code> is returned. * * @param source * The source object to parse. * * @param hints * The {@link Hints} to use when trying to instantiate this * reader. * @return A reader for this {@link Format} or null. */ abstract public AbstractGridCoverage2DReader getReader(Object source, Hints hints); /** * Retrieves a {@link GridCoverageWriter} suitable for writing to the * provided <code>destination</code> with this format. * * <p> * In case no writers are availaible <code>null</code> is returned. * * @param destination * The destinatin where to write. * @return A {@link GridCoverageWriter} suitable for writing to the provided * <code>destination</code> with this format. */ abstract public GridCoverageWriter getWriter(Object destination); /** * Tells me if this {@link Format} can read the provided <code>input</code>. * * * @param input * The input object to test for suitablilty. * @return True if this format can read this object, False otherwise. */ public abstract boolean accepts(Object input); /** * @see org.geotools.data.coverage.grid.Format#equals(org.geotools.data.coverage.grid.Format) */ public boolean equals(Format f) { if (f.getClass() == getClass()) { return true; } return false; } /* * (non-Javadoc) * * @see org.opengis.coverage.grid.Format#getReadParameters() */ public ParameterValueGroup getReadParameters() { if (this.readParameters == null) throw new UnsupportedOperationException( "This format does not support usage of read parameters."); return (ParameterValueGroup) this.readParameters.clone(); } /* * (non-Javadoc) * * @see org.opengis.coverage.grid.Format#getWriteParameters() */ public ParameterValueGroup getWriteParameters() { if (this.writeParameters == null) throw new UnsupportedOperationException( "This format does not support usage of write parameters."); return (ParameterValueGroup) this.writeParameters.clone(); } /** * getDefaultCRS * * This method provides the user with a default crs WGS84 */ static public CoordinateReferenceSystem getDefaultCRS() { return crs; } /** * Returns an instance of {@link ImageWriteParam} that can be used to * control a subsequent * {@link GridCoverageWriter#write(org.opengis.coverage.grid.GridCoverage, org.opengis.parameter.GeneralParameterValue[])}; * <p> * Be careful with using the {@link ImageWriteParam} since their usage is * still experimental. * * @return an instance of {@link ImageWriteParam}. */ public abstract GeoToolsWriteParams getDefaultImageIOWriteParameters(); }