wof 1.0.0

The Who's On First rust library and command line.
Documentation
use crate::types::{MultiPolygon, Point, Polygon, Polyline};
use gdal::spatial_ref::{CoordTransform, SpatialRef};
use gdal::vector::{Geometry, OGRwkbGeometryType};

fn polygon_to_gdal_geometry(polygon: &Polygon) -> gdal::errors::Result<Geometry> {
  let mut geom = Geometry::empty(OGRwkbGeometryType::wkbPolygon)?;
  for linestring in polygon.iter() {
    let mut g = Geometry::empty(OGRwkbGeometryType::wkbLinearRing)?;
    for (i, coordinate) in linestring.iter().enumerate() {
      g.set_point_2d(i, (coordinate[0], coordinate[1]));
    }
    geom.add_geometry(g)?;
  }
  Ok(geom)
}

fn multi_polygon_to_gdal_geometry(multi_polygon: &MultiPolygon) -> gdal::errors::Result<Geometry> {
  let mut geom = Geometry::empty(OGRwkbGeometryType::wkbMultiPolygon)?;
  for polygon in multi_polygon.iter() {
    let g = polygon_to_gdal_geometry(polygon)?;
    geom.add_geometry(g)?;
  }
  Ok(geom)
}

pub fn polygon_gdal_area_m(polygon: &Polygon) -> f64 {
  let transform = CoordTransform::new(
    &SpatialRef::from_epsg(4326).unwrap(),
    &SpatialRef::from_epsg(3410).unwrap(),
  )
  .unwrap();

  polygon_to_gdal_geometry(polygon)
    .unwrap()
    .transform(&transform)
    .unwrap()
    .area()
}

pub fn multi_polygon_gdal_area_m(multi_polygon: &MultiPolygon) -> f64 {
  let transform = CoordTransform::new(
    &SpatialRef::from_epsg(4326).unwrap(),
    &SpatialRef::from_epsg(3410).unwrap(),
  )
  .unwrap();

  multi_polygon_to_gdal_geometry(multi_polygon)
    .unwrap()
    .transform(&transform)
    .unwrap()
    .area()
}