GeoTiffWriter extends AbstractGridCoverageWriter implements
		GridCoverageWriter { public void write(final GridCoverage gc, final GeneralParameterValue[] params) throws IllegalArgumentException, IOException, IndexOutOfBoundsException { GeoToolsWriteParams gtParams = null; boolean writeTfw = GeoTiffFormat.WRITE_TFW.getDefaultValue(); if (params != null) { if (params != null) { Parameter param; final int length = params.length; for (int i = 0; i < length; i++) { param = (Parameter) params[i]; final ReferenceIdentifier name = param.getDescriptor().getName(); if (name.equals(AbstractGridFormat.GEOTOOLS_WRITE_PARAMS.getName())) { gtParams = (GeoToolsWriteParams) param.getValue(); } if (name.equals(GeoTiffFormat.WRITE_TFW.getName())) { writeTfw = (Boolean) param.getValue(); } } } } if (gtParams == null) gtParams = new GeoTiffWriteParams(); final GridGeometry2D gg = (GridGeometry2D) gc.getGridGeometry(); GridEnvelope2D range = gg.getGridRange2D(); final Rectangle sourceRegion = gtParams.getSourceRegion(); if (sourceRegion != null) range = new GridEnvelope2D(sourceRegion); final AffineTransform tr = (AffineTransform) gg.getGridToCRS2D(); final CoordinateReferenceSystem crs = gg.getCoordinateReferenceSystem2D(); final double inNoData = getCandidateNoData(gc); if (crs instanceof ProjectedCRS || crs instanceof GeographicCRS) { final CRS2GeoTiffMetadataAdapter adapter = new CRS2GeoTiffMetadataAdapter(crs); final GeoTiffIIOMetadataEncoder metadata = adapter.parseCoordinateReferenceSystem(); if (!Double.isNaN(inNoData)) metadata.setNoData(inNoData); if (metadataKeyValue != null && !metadataKeyValue.isEmpty()) { metadata.setTiffTagsMetadata(metadataKeyValue); } setGeoReference(crs, metadata, tr, range); writeImage(((GridCoverage2D) gc).geophysics(true).getRenderedImage(), this.outStream, metadata, gtParams); if (writeTfw && (destination instanceof File)) { final File destFile = (File) this.destination; final File tfw = new File(destFile.getParentFile(), destFile.getName().replace( "tif", "tfw")); final BufferedWriter outW = new BufferedWriter(new FileWriter(tfw)); try { outW.write(gc.getCoordinateReferenceSystem().toWKT()); } finally { try { outW.close(); } catch (Exception e) { } } } } else { throw new GeoTiffException( null, "The supplied grid coverage uses an unsupported crs! You are allowed to" + " use only projected and geographic coordinate reference systems", null); } } GeoTiffWriter(Object destination);  GeoTiffWriter(Object destination, Hints hints); @Override void setMetadataValue(String name, String value); Format getFormat(); void write(final GridCoverage gc, final GeneralParameterValue[] params);  }
@Test @Ignore public void testWriteCroppedCoverage() throws IllegalArgumentException, IOException, UnsupportedOperationException, ParseException, FactoryException, TransformException { final File readdir = TestData.file(GeoTiffWriterTest.class, ""); final File writedir = new File(new StringBuilder(readdir.getAbsolutePath()).append( "/testWriter/").toString()); writedir.mkdir(); final File tiff = new File(readdir, "latlon.tiff"); assert tiff.exists() && tiff.canRead() && tiff.isFile(); if (TestData.isInteractiveTest()) logger.info(tiff.getAbsolutePath()); final GeoTiffFormat format = new GeoTiffFormat(); GridCoverageReader reader = format.getReader(tiff); assertNotNull(reader); GridCoverage2D gc = (GridCoverage2D) reader.read(null); if (TestData.isInteractiveTest()) { logger.info(new StringBuilder("Coverage before: ").append("\n") .append(gc.getCoordinateReferenceSystem().toWKT()) .append(gc.getEnvelope().toString()).toString()); } final CoordinateReferenceSystem sourceCRS = gc.getCoordinateReferenceSystem2D(); final GeneralEnvelope sourceEnvelope = (GeneralEnvelope) gc.getEnvelope(); final GridGeometry2D sourcedGG = (GridGeometry2D) gc.getGridGeometry(); final MathTransform sourceG2W = sourcedGG.getGridToCRS(PixelInCell.CELL_CENTER); double xc = sourceEnvelope.getMedian(0); double yc = sourceEnvelope.getMedian(1); double xl = sourceEnvelope.getSpan(0); double yl = sourceEnvelope.getSpan(1); final GeneralEnvelope cropEnvelope = new GeneralEnvelope(new double[] { xc - xl / 4.0, yc - yl / 4.0 }, new double[] { xc + xl / 4.0, yc + yl / 4.0 }); final CoverageProcessor processor = new CoverageProcessor(); final ParameterValueGroup param = processor.getOperation("CoverageCrop").getParameters(); param.parameter("Source").setValue(gc); param.parameter("Envelope").setValue(cropEnvelope); final GridCoverage2D cropped = (GridCoverage2D) processor.doOperation(param); final GridGeometry2D croppedGG = (GridGeometry2D) cropped.getGridGeometry(); final GridEnvelope2D croppedGR = (GridEnvelope2D) croppedGG.getGridRange(); final MathTransform croppedG2W = croppedGG.getGridToCRS(PixelInCell.CELL_CENTER); final GeneralEnvelope croppedEnvelope = (GeneralEnvelope) cropped.getEnvelope(); assertTrue("min x do not match after crop", 29 == croppedGR.x); assertTrue("min y do not match after crop", 30 == croppedGR.y); assertTrue("max x do not match after crop", 90 == croppedGR.getMaxX()); assertTrue("max y do not match after crop", 91 == croppedGR.getMaxY()); assertTrue("The Grdi2World tranformations of the original and the cropped covearage do not match", sourceG2W.equals(croppedG2W)); final GeneralEnvelope expectedEnvelope = new GeneralEnvelope(croppedGR, PixelInCell.CELL_CENTER, croppedG2W, cropped.getCoordinateReferenceSystem2D()); assertTrue("Expected envelope is different from the computed one", expectedEnvelope.equals(croppedEnvelope, XAffineTransform.getScale((AffineTransform) croppedG2W) / 2.0, false)); final File writeFile = new File(writedir.getAbsolutePath() + File.separatorChar + cropped.getName().toString() + ".tiff"); final GridCoverageWriter writer = format.getWriter(writeFile); try { writer.write(cropped, null); } catch (IOException e) { } finally { try { writer.dispose(); } catch (Throwable e) { } } cropped.dispose(true); gc.dispose(true); if (reader != null) { try { reader.dispose(); } catch (Throwable e) { } } try { reader = new GeoTiffReader(writeFile, null); assertNotNull(reader); gc = (GridCoverage2D) reader.read(null); assertNotNull(gc); final CoordinateReferenceSystem targetCRS = gc.getCoordinateReferenceSystem2D(); assertTrue("Source and Target coordinate reference systems do not match", CRS.equalsIgnoreMetadata(sourceCRS, targetCRS)); assertEquals("Read-back and Cropped envelopes do not match", cropped.getEnvelope(), croppedEnvelope); if (TestData.isInteractiveTest()) { logger.info(new StringBuilder("Coverage after: ").append("\n") .append(gc.getCoordinateReferenceSystem().toWKT()) .append(gc.getEnvelope().toString()).toString()); gc.show(); } else { gc.getRenderedImage().getData(); } } finally { if (reader != null) { try { reader.dispose(); } catch (Throwable e) { } } if (!TestData.isInteractiveTest()) { gc.dispose(true); } } }
@Test @Ignore public void testWriteGoogleMercator() throws Exception { final String google= "PROJCS[\"WGS84 / Google Mercator\", GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", SPHEROID[\"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.017453292519943295], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Mercator (1SP)\", AUTHORITY[\"EPSG\",\"9804\"]], PARAMETER[\"semi_major\", 6378137.0], PARAMETER[\"semi_minor\", 6378137.0], PARAMETER[\"latitude_of_origin\", 0.0], PARAMETER[\"central_meridian\", 0.0], PARAMETER[\"scale_factor\", 1.0], PARAMETER[\"false_easting\", 0.0], PARAMETER[\"false_northing\", 0.0], UNIT[\"m\", 1.0], AUTHORITY[\"EPSG\",\"900913\"]]"; final CoordinateReferenceSystem googleCRS= CRS.parseWKT(google); final File testFile = TestData.file(GeoTiffReaderTest.class, "latlon.tiff"); final AbstractGridFormat format = new GeoTiffFormat(); assertTrue(format.accepts(testFile)); GeoTiffReader reader = new GeoTiffReader(testFile); GridCoverage2D coverage = (GridCoverage2D) reader.read(null); assertNotNull(coverage); assertNotNull(coverage.getCoordinateReferenceSystem()); assertEquals(CRS.lookupIdentifier(coverage.getCoordinateReferenceSystem(), true), "EPSG:4267"); reader.dispose(); coverage=(GridCoverage2D) Operations.DEFAULT.resample(coverage, googleCRS); final File mercator = new File(TestData.file(GeoTiffReaderTest.class, "."),"wms_900913.tif"); GeoTiffWriter writer = new GeoTiffWriter(mercator); writer.write(coverage,null ); writer.dispose(); reader = new GeoTiffReader(mercator); GridCoverage2D coverageMercator = (GridCoverage2D) reader.read(null); assertNotNull(coverageMercator); assertNotNull(coverageMercator.getCoordinateReferenceSystem()); assertTrue(CRS.equalsIgnoreMetadata(coverage.getCoordinateReferenceSystem(),googleCRS)); assertTrue(coverage.getEnvelope2D().getFrame().equals(coverageMercator.getEnvelope2D().getFrame())); reader.dispose(); coverage.dispose(true); coverage.dispose(true); }
@Test @Ignore public void testWriteTFW() throws Exception { final File noCrs = TestData.file(GeoTiffReaderTest.class, "no_crs.tif"); final AbstractGridFormat format = new GeoTiffFormat(); assertTrue(format.accepts(noCrs)); final CoordinateReferenceSystem crs = CRS.decode("EPSG:32632", true); final Hints hint = new Hints(); hint.put(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, crs); GeoTiffReader reader = new GeoTiffReader(noCrs, hint); GridCoverage2D coverage = (GridCoverage2D) reader.read(null); assertNotNull(coverage); assertNotNull(coverage.getCoordinateReferenceSystem()); assertEquals(CRS.lookupIdentifier(coverage.getCoordinateReferenceSystem(), true), "EPSG:32632"); reader.dispose(); final File noCrsTFW = new File(TestData.file(GeoTiffReaderTest.class, "."), "no_crs_tfw.tif"); GeoTiffWriter writer = new GeoTiffWriter(noCrsTFW); final ParameterValue<Boolean> tfw = GeoTiffFormat.WRITE_TFW.createValue(); tfw.setValue(true); writer.write(coverage, new GeneralParameterValue[] { tfw }); writer.dispose(); coverage.dispose(true); final File finalTFW = new File(noCrsTFW.getParent(), noCrsTFW.getName().replace("tif", "tfw")); assertTrue(finalTFW.canRead()); }