geotiff 0.1.0

A GeoTIFF library for Rust
Documentation
use geo_types::Coord;
use tiff::{TiffError, TiffFormatError, TiffResult};

use crate::coordinate_transform::CoordinateTransform;

impl CoordinateTransform {
    pub fn from_transformation_matrix(transformation_matrix: [f64; 16]) -> TiffResult<Self> {
        let transform = [
            transformation_matrix[0],
            transformation_matrix[1],
            transformation_matrix[3],
            transformation_matrix[4],
            transformation_matrix[5],
            transformation_matrix[7],
        ];

        let det = transform[0] * transform[4] - transform[1] * transform[3];
        if det.abs() < 0.000000000000001 {
            return Err(TiffError::FormatError(TiffFormatError::Format(
                "Provided transformation matrix is not invertible".into(),
            )));
        }

        let inverse_transform = [
            transform[4] / det,
            -transform[1] / det,
            (transform[1] * transform[5] - transform[2] * transform[4]) / det,
            -transform[3] / det,
            transform[0] / det,
            (-transform[0] * transform[5] + transform[2] * transform[3]) / det,
        ];

        Ok(CoordinateTransform::AffineTransform {
            transform,
            inverse_transform,
        })
    }

    pub(super) fn transform_by_affine_transform(transform: &[f64; 6], coord: &Coord) -> Coord {
        Coord {
            x: coord.x * transform[0] + coord.y * transform[1] + transform[2],
            y: coord.x * transform[3] + coord.y * transform[4] + transform[5],
        }
    }
}