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(),
}
}
}