Search in sources :

Example 1 with XTIFFField

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);
}
Also used : XTIFFField(org.libtiff.jai.codec.XTIFFField)

Example 2 with XTIFFField

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;
        }
    }
}
Also used : GeometryFactory(com.revolsys.geometry.model.GeometryFactory) LinearUnit(com.revolsys.geometry.cs.unit.LinearUnit) CoordinateSystem(com.revolsys.geometry.cs.CoordinateSystem) ProjectedCoordinateSystem(com.revolsys.geometry.cs.ProjectedCoordinateSystem) GeographicCoordinateSystem(com.revolsys.geometry.cs.GeographicCoordinateSystem) ProjectedCoordinateSystem(com.revolsys.geometry.cs.ProjectedCoordinateSystem) XTIFFField(org.libtiff.jai.codec.XTIFFField) CoordinateOperationMethod(com.revolsys.geometry.cs.CoordinateOperationMethod) GeographicCoordinateSystem(com.revolsys.geometry.cs.GeographicCoordinateSystem) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) IntHashMap(com.revolsys.collection.map.IntHashMap)

Example 3 with XTIFFField

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;
}
Also used : XTIFFField(org.libtiff.jai.codec.XTIFFField) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

XTIFFField (org.libtiff.jai.codec.XTIFFField)3 LinkedHashMap (java.util.LinkedHashMap)2 IntHashMap (com.revolsys.collection.map.IntHashMap)1 CoordinateOperationMethod (com.revolsys.geometry.cs.CoordinateOperationMethod)1 CoordinateSystem (com.revolsys.geometry.cs.CoordinateSystem)1 GeographicCoordinateSystem (com.revolsys.geometry.cs.GeographicCoordinateSystem)1 ProjectedCoordinateSystem (com.revolsys.geometry.cs.ProjectedCoordinateSystem)1 LinearUnit (com.revolsys.geometry.cs.unit.LinearUnit)1 GeometryFactory (com.revolsys.geometry.model.GeometryFactory)1 Map (java.util.Map)1