package com.vividsolutions.jump.workbench.imagery.geotiff;
/*
* The Unified Mapping Platform (JUMP) is an extensible, interactive GUI
* for visualizing and manipulating spatial features with geometry and attributes.
*
* Copyright (C) 2003 Vivid Solutions
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
import java.awt.geom.AffineTransform;
import java.util.List;
import org.geotiff.image.jai.GeoTIFFDescriptor;
import org.geotiff.image.jai.GeoTIFFDirectory;
import org.libtiff.jai.codec.XTIFF;
import org.libtiff.jai.codec.XTIFFField;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jump.util.FileUtil;
public class GeoTIFFRaster extends GeoReferencedRaster
{
private final String MSG_GENERAL = "This is not a valid GeoTIFF file.";
String fileName;
boolean hoPatch = false;
/**
* Called by Java2XML
*/
public GeoTIFFRaster(String imageFileLocation)
throws Exception
{
super(imageFileLocation);
fileName = imageFileLocation;
registerWithJAI();
readRasterfile();
}
private void registerWithJAI()
{
// Register the GeoTIFF descriptor with JAI.
GeoTIFFDescriptor.register();
}
private void parseGeoTIFFDirectory(GeoTIFFDirectory dir) throws Exception
{
// Find the ModelTiePoints field
XTIFFField fieldModelTiePoints = dir.getField(XTIFF.TIFFTAG_GEO_TIEPOINTS);
if (fieldModelTiePoints == null)
throw new Exception("Missing tiepoints-tag in file.\n" + MSG_GENERAL);
// Get the number of modeltiepoints
// int numModelTiePoints = fieldModelTiePoints.getCount() / 6;
// ToDo: alleen numModelTiePoints == 1 ondersteunen.
// Map the modeltiepoints from raster to model space
// Read the tiepoints
setCoorRasterTiff_tiepointLT(new Coordinate(fieldModelTiePoints
.getAsDouble(0), fieldModelTiePoints.getAsDouble(1), 0));
setCoorModel_tiepointLT(new Coordinate(fieldModelTiePoints.getAsDouble(3),
fieldModelTiePoints.getAsDouble(4), 0));
setEnvelope();
// Find the ModelPixelScale field
XTIFFField fieldModelPixelScale = dir
.getField(XTIFF.TIFFTAG_GEO_PIXEL_SCALE);
if (fieldModelPixelScale == null)
throw new Exception("Missing pixelscale-tag in file." + "\n"
+ MSG_GENERAL);
setDblModelUnitsPerRasterUnit_X(fieldModelPixelScale.getAsDouble(0));
setDblModelUnitsPerRasterUnit_Y(fieldModelPixelScale.getAsDouble(1));
}
/**
* @return filename of the tiff worldfile
*/
private String worldFileName()
{
int posDot = fileName.lastIndexOf('.');
if (posDot == -1)
{
posDot = fileName.length();
}
return fileName.substring(0, posDot) + ".tfw";
}
private void parseWorldFile() throws Exception
{
// Get the name of the tiff worldfile.
String name = worldFileName();
// Read the tags from the tiff worldfile.
List lines = FileUtil.getContents(name);
double[] tags = new double[6];
for (int i = 0; i < 6; i++)
{
String line = (String) lines.get(i);
tags[i] = Double.parseDouble(line);
}
setCoorRasterTiff_tiepointLT(new Coordinate(0, 0) );
setCoorModel_tiepointLT(new Coordinate(0, 0) );
setAffineTransformation(new AffineTransform(tags));
}
protected void readRasterfile() throws Exception
{
// ImageCodec originalCodec = ImageCodec.getCodec("tiff");
super.readRasterfile();
// Get access to the tags and geokeys.
// First, get the TIFF directory
GeoTIFFDirectory dir = (GeoTIFFDirectory) src
.getProperty("tiff.directory");
if (dir == null)
throw new Exception("This is not a (geo)tiff file.");
try
{
// Try to parse any embedded geotiff tags.
parseGeoTIFFDirectory(dir);
} catch (Exception E)
{
// Embedded geotiff tags have not been found. Try
// to use a geotiff world file.
try
{
parseWorldFile();
} catch (Exception e)
{
throw new Exception(
"Neither geotiff tags nor valid worldfile found.\n" + MSG_GENERAL);
}
}
}
}