use of org.libtiff.jai.codec.XTIFFField in project com.revolsys.open by revolsys.
the class TiffImage method addGeoKey.
private static void addGeoKey(final Map<Integer, Object> geoKeys, final XTIFFDirectory dir, final int keyId, final int tiffTag, final int valueCount, final int valueOrOffset) {
int type = XTIFFField.TIFF_SHORT;
Object value = null;
if (tiffTag > 0) {
// Values are in another tag:
final XTIFFField values = dir.getField(tiffTag);
if (values != null) {
type = values.getType();
if (type == XTIFFField.TIFF_ASCII) {
final String string = values.getAsString(0).substring(valueOrOffset, valueOrOffset + valueCount - 1);
value = string;
} else if (type == XTIFFField.TIFF_DOUBLE) {
final double number = values.getAsDouble(valueOrOffset);
value = number;
}
} else {
throw new IllegalArgumentException("GeoTIFF tag not found");
}
} else {
// value is SHORT, stored in valueOrOffset
type = XTIFFField.TIFF_SHORT;
value = (short) valueOrOffset;
}
geoKeys.put(keyId, value);
}
use of org.libtiff.jai.codec.XTIFFField in project com.revolsys.open by revolsys.
the class TiffImage method loadGeoTiffMetaData.
private boolean loadGeoTiffMetaData(final XTIFFDirectory directory) {
try {
final int xResolution = (int) getFieldAsDouble(directory, TAG_X_RESOLUTION, 1);
final int yResolution = (int) getFieldAsDouble(directory, TAG_Y_RESOLUTION, 1);
setDpi(xResolution, yResolution);
} catch (final Throwable e) {
Logs.error(this, e);
}
GeometryFactory geometryFactory = null;
final Map<Integer, Object> geoKeys = getGeoKeys(directory);
int coordinateSystemId = Maps.getInteger(geoKeys, PROJECTED_COORDINATE_SYSTEM_ID, 0);
if (coordinateSystemId == 0) {
coordinateSystemId = Maps.getInteger(geoKeys, GEOGRAPHIC_COORDINATE_SYSTEM_ID, 0);
if (coordinateSystemId != 0) {
geometryFactory = GeometryFactory.floating2d(coordinateSystemId);
}
} else if (coordinateSystemId <= 0 || coordinateSystemId == 32767) {
final int geoSrid = Maps.getInteger(geoKeys, GEOGRAPHIC_COORDINATE_SYSTEM_ID, 0);
if (geoSrid != 0) {
if (geoSrid > 0 && geoSrid < 32767) {
final GeographicCoordinateSystem geographicCoordinateSystem = EpsgCoordinateSystems.getCoordinateSystem(geoSrid);
final String name = "unknown";
final CoordinateOperationMethod coordinateOperationMethod = getProjection(geoKeys);
final Map<ParameterName, ParameterValue> parameters = new LinkedHashMap<>();
addDoubleParameter(parameters, ParameterNames.STANDARD_PARALLEL_1, geoKeys, STANDARD_PARALLEL_1_KEY);
addDoubleParameter(parameters, ParameterNames.STANDARD_PARALLEL_2, geoKeys, STANDARD_PARALLEL_2_KEY);
addDoubleParameter(parameters, ParameterNames.CENTRAL_MERIDIAN, geoKeys, LONGITUDE_OF_CENTER_2_KEY);
addDoubleParameter(parameters, ParameterNames.LATITUDE_OF_ORIGIN, geoKeys, LATITUDE_OF_CENTER_2_KEY);
addDoubleParameter(parameters, ParameterNames.FALSE_EASTING, geoKeys, FALSE_EASTING_KEY);
addDoubleParameter(parameters, ParameterNames.FALSE_NORTHING, geoKeys, FALSE_NORTHING_KEY);
final LinearUnit linearUnit = getLinearUnit(geoKeys);
final ProjectedCoordinateSystem coordinateSystem = new ProjectedCoordinateSystem(coordinateSystemId, name, geographicCoordinateSystem, coordinateOperationMethod, parameters, linearUnit);
final CoordinateSystem epsgCoordinateSystem = EpsgCoordinateSystems.getCoordinateSystem(coordinateSystem);
geometryFactory = GeometryFactory.floating2d(epsgCoordinateSystem.getCoordinateSystemId());
}
}
} else {
geometryFactory = GeometryFactory.floating2d(coordinateSystemId);
}
if (geometryFactory != null) {
setGeometryFactory(geometryFactory);
}
final XTIFFField tiePoints = directory.getField(XTIFF.TIFFTAG_GEO_TIEPOINTS);
if (tiePoints == null) {
final XTIFFField geoTransform = directory.getField(XTIFF.TIFFTAG_GEO_TRANS_MATRIX);
if (geoTransform == null) {
return false;
} else {
final double x1 = geoTransform.getAsDouble(3);
final double y1 = geoTransform.getAsDouble(7);
final double pixelWidth = geoTransform.getAsDouble(0);
final double pixelHeight = geoTransform.getAsDouble(5);
final double xRotation = geoTransform.getAsDouble(4);
final double yRotation = geoTransform.getAsDouble(1);
setResolution(pixelWidth);
// TODO rotation
setBoundingBox(x1, y1, pixelWidth, pixelHeight);
return true;
}
} else {
final XTIFFField pixelScale = directory.getField(XTIFF.TIFFTAG_GEO_PIXEL_SCALE);
if (pixelScale == null) {
return false;
} else {
final double rasterXOffset = tiePoints.getAsDouble(0);
final double rasterYOffset = tiePoints.getAsDouble(1);
if (rasterXOffset != 0 && rasterYOffset != 0) {
// These should be 0, not sure what to do if they are not
throw new IllegalArgumentException("Exepectig 0 for the raster x,y tie points in a GeoTIFF");
}
// double rasterZOffset = fieldModelTiePoints.getAsDouble(2);
// setTopLeftRasterPoint(new PointDouble(
// rasterXOffset,
// rasterYOffset));
// Top left corner of image in model coordinates
final double x1 = tiePoints.getAsDouble(3);
final double y1 = tiePoints.getAsDouble(4);
// double modelZOffset = fieldModelTiePoints.getAsDouble(5);
// setTopLeftModelPoint(new PointDouble(
// modelXOffset,
// modelYOffset));
final double pixelWidth = pixelScale.getAsDouble(0);
final double pixelHeight = pixelScale.getAsDouble(1);
setResolution(pixelWidth);
setBoundingBox(x1, y1, pixelWidth, -pixelHeight);
return true;
}
}
}
use of org.libtiff.jai.codec.XTIFFField in project com.revolsys.open by revolsys.
the class TiffImage method getGeoKeys.
private static Map<Integer, Object> getGeoKeys(final XTIFFDirectory dir) {
final Map<Integer, Object> geoKeys = new LinkedHashMap<>();
final XTIFFField geoKeyTag = dir.getField(XTIFF.TIFFTAG_GEO_KEY_DIRECTORY);
if (geoKeyTag != null) {
final char[] keys = geoKeyTag.getAsChars();
for (int i = 4; i < keys.length; i += 4) {
final int keyId = keys[i];
final int tiffTag = keys[i + 1];
final int valueCount = keys[i + 2];
final int valueOrOffset = keys[i + 3];
addGeoKey(geoKeys, dir, keyId, tiffTag, valueCount, valueOrOffset);
}
}
return geoKeys;
}
Aggregations