cartography 0.10.0

Cartography is a map rendering library for Geographic features expressed using [georust](https://georust.org/) libraries.
Documentation
//! geojson integration

use geo::Intersects as _;

use crate::{BoxedImageDataRef, Feature, FeaturesVecLayer, ImageFeature, IntoLayer};

impl crate::Feature for geojson::Feature
{
  fn geometry(&self) -> Option<geo::Geometry>
  {
    self
      .geometry
      .to_owned()
      .map(|x| x.value.try_into().unwrap())
  }
  fn image(&self) -> Option<ImageFeature<BoxedImageDataRef<'_>>>
  {
    None
  }
  fn geometry_type(&self) -> crate::geometry::GeometryType
  {
    match &self.geometry
    {
      Some(geom) => match &geom.value
      {
        geojson::GeometryValue::Point { coordinates: _ } => crate::geometry::GeometryType::Point,
        geojson::GeometryValue::LineString { coordinates: _ } =>
        {
          crate::geometry::GeometryType::LineString
        }
        geojson::GeometryValue::Polygon { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Polygon
        }
        geojson::GeometryValue::MultiPoint { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Collection
        }
        geojson::GeometryValue::MultiLineString { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Collection
        }
        geojson::GeometryValue::MultiPolygon { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Collection
        }
        geojson::GeometryValue::GeometryCollection { geometries: _ } =>
        {
          crate::geometry::GeometryType::Collection
        }
      },
      None => crate::geometry::GeometryType::Invalid,
    }
  }
  fn element_geometry_type(&self) -> crate::geometry::GeometryType
  {
    match &self.geometry
    {
      Some(geom) => match &geom.value
      {
        geojson::GeometryValue::Point { coordinates: _ } => crate::geometry::GeometryType::Invalid,
        geojson::GeometryValue::LineString { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Invalid
        }
        geojson::GeometryValue::Polygon { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Invalid
        }
        geojson::GeometryValue::MultiPoint { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Point
        }
        geojson::GeometryValue::MultiLineString { coordinates: _ } =>
        {
          crate::geometry::GeometryType::LineString
        }
        geojson::GeometryValue::MultiPolygon { coordinates: _ } =>
        {
          crate::geometry::GeometryType::Polygon
        }
        geojson::GeometryValue::GeometryCollection { geometries: _ } =>
        {
          crate::geometry::GeometryType::Invalid
        }
      },
      None => crate::geometry::GeometryType::Invalid,
    }
  }
  fn intersects(&self, rect: geo::Rect) -> bool
  {
    self.geometry().is_some_and(|g| g.intersects(&rect))
  }
}

impl<TFeature> IntoLayer<TFeature> for geojson::GeoJson
where
  TFeature: From<geojson::Feature> + Feature,
{
  type Layer = FeaturesVecLayer<TFeature>;
  fn into_layer(self) -> Self::Layer
  {
    match self
    {
      geojson::GeoJson::Feature(f) => vec![f.into()].into(),
      geojson::GeoJson::Geometry(g) => vec![
        geojson::Feature {
          geometry: Some(g),
          ..Default::default()
        }
        .into(),
      ]
      .into(),
      geojson::GeoJson::FeatureCollection(col) => col
        .features
        .into_iter()
        .map(Into::<TFeature>::into)
        .collect(),
    }
  }
}