Skip to content

Commit

Permalink
Use upstream conversion for geo-traits to geo (#879)
Browse files Browse the repository at this point in the history
  • Loading branch information
kylebarron authored Nov 27, 2024
1 parent 020b8bf commit 5b0e100
Show file tree
Hide file tree
Showing 21 changed files with 85 additions and 244 deletions.
37 changes: 17 additions & 20 deletions rust/geoarrow/src/algorithm/geo/contains.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,12 @@ use crate::algorithm::native::{Binary, Unary};
use crate::array::*;
use crate::datatypes::{Dimension, NativeType};
use crate::error::GeoArrowError;
use crate::io::geo::{
geometry_collection_to_geo, geometry_to_geo, line_string_to_geo, multi_line_string_to_geo,
multi_point_to_geo, multi_polygon_to_geo, point_to_geo, polygon_to_geo,
};
use crate::trait_::{ArrayAccessor, NativeScalar};
use crate::NativeArray;
use arrow_array::builder::BooleanBuilder;
use arrow_array::BooleanArray;
use geo::Contains as _Contains;
use geo_traits::to_geo::*;
use geo_traits::{
GeometryCollectionTrait, GeometryTrait, LineStringTrait, MultiLineStringTrait, MultiPointTrait,
MultiPolygonTrait, PointTrait, PolygonTrait,
Expand Down Expand Up @@ -139,7 +136,7 @@ pub trait ContainsPoint<Rhs> {

impl<G: PointTrait<T = f64>> ContainsPoint<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = point_to_geo(rhs);
let rhs = rhs.to_point();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -149,7 +146,7 @@ macro_rules! impl_contains_point {
($array:ty) => {
impl<G: PointTrait<T = f64>> ContainsPoint<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = point_to_geo(rhs);
let rhs = rhs.to_point();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand Down Expand Up @@ -192,7 +189,7 @@ pub trait ContainsLineString<Rhs> {

impl<G: LineStringTrait<T = f64>> ContainsLineString<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = line_string_to_geo(rhs);
let rhs = rhs.to_line_string();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -203,7 +200,7 @@ macro_rules! impl_contains_line_string {
impl<G: LineStringTrait<T = f64>> ContainsLineString<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let mut output_array = BooleanBuilder::with_capacity(self.len());
let rhs = line_string_to_geo(rhs);
let rhs = rhs.to_line_string();

self.iter_geo().for_each(|maybe_point| {
let output = maybe_point.map(|point| point.contains(&rhs));
Expand Down Expand Up @@ -253,7 +250,7 @@ pub trait ContainsPolygon<Rhs> {

impl<G: PolygonTrait<T = f64>> ContainsPolygon<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = polygon_to_geo(rhs);
let rhs = rhs.to_polygon();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -263,7 +260,7 @@ macro_rules! impl_contains_polygon {
($array:ty) => {
impl<G: PolygonTrait<T = f64>> ContainsPolygon<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = polygon_to_geo(rhs);
let rhs = rhs.to_polygon();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand Down Expand Up @@ -306,7 +303,7 @@ pub trait ContainsMultiPoint<Rhs> {

impl<G: MultiPointTrait<T = f64>> ContainsMultiPoint<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = multi_point_to_geo(rhs);
let rhs = rhs.to_multi_point();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -316,7 +313,7 @@ macro_rules! impl_contains_multi_point {
($array:ty) => {
impl<G: MultiPointTrait<T = f64>> ContainsMultiPoint<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = multi_point_to_geo(rhs);
let rhs = rhs.to_multi_point();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand Down Expand Up @@ -361,7 +358,7 @@ pub trait ContainsMultiLineString<Rhs> {

impl<G: MultiLineStringTrait<T = f64>> ContainsMultiLineString<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = multi_line_string_to_geo(rhs);
let rhs = rhs.to_multi_line_string();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -371,7 +368,7 @@ macro_rules! impl_contains_multi_line_string {
($array:ty) => {
impl<G: MultiLineStringTrait<T = f64>> ContainsMultiLineString<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = multi_line_string_to_geo(rhs);
let rhs = rhs.to_multi_line_string();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand Down Expand Up @@ -416,7 +413,7 @@ pub trait ContainsMultiPolygon<Rhs> {

impl<G: MultiPolygonTrait<T = f64>> ContainsMultiPolygon<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = multi_polygon_to_geo(rhs);
let rhs = rhs.to_multi_polygon();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -426,7 +423,7 @@ macro_rules! impl_contains_multi_polygon {
($array:ty) => {
impl<G: MultiPolygonTrait<T = f64>> ContainsMultiPolygon<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = multi_polygon_to_geo(rhs);
let rhs = rhs.to_multi_polygon();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand Down Expand Up @@ -471,7 +468,7 @@ pub trait ContainsGeometry<Rhs> {

impl<G: GeometryTrait<T = f64>> ContainsGeometry<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = geometry_to_geo(rhs);
let rhs = rhs.to_geometry();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -481,7 +478,7 @@ macro_rules! impl_contains_geometry {
($array:ty) => {
impl<G: GeometryTrait<T = f64>> ContainsGeometry<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = geometry_to_geo(rhs);
let rhs = rhs.to_geometry();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand Down Expand Up @@ -524,7 +521,7 @@ pub trait ContainsGeometryCollection<Rhs> {

impl<G: GeometryCollectionTrait<T = f64>> ContainsGeometryCollection<G> for PointArray {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = geometry_collection_to_geo(rhs);
let rhs = rhs.to_geometry_collection();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand All @@ -534,7 +531,7 @@ macro_rules! impl_contains_geometry_collection {
($array:ty) => {
impl<G: GeometryCollectionTrait<T = f64>> ContainsGeometryCollection<G> for $array {
fn contains(&self, rhs: &G) -> BooleanArray {
let rhs = geometry_collection_to_geo(rhs);
let rhs = rhs.to_geometry_collection();
self.try_unary_boolean::<_, GeoArrowError>(|geom| Ok(geom.to_geo().contains(&rhs)))
.unwrap()
}
Expand Down
6 changes: 3 additions & 3 deletions rust/geoarrow/src/algorithm/geo/frechet_distance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ use crate::array::*;
use crate::chunked_array::{ChunkedArray, ChunkedLineStringArray, ChunkedNativeArray};
use crate::datatypes::{Dimension, NativeType};
use crate::error::{GeoArrowError, Result};
use crate::io::geo::line_string_to_geo;
use crate::trait_::NativeScalar;
use crate::NativeArray;
use arrow_array::Float64Array;
use geo::FrechetDistance as _FrechetDistance;
use geo_traits::to_geo::ToGeoLineString;
use geo_traits::LineStringTrait;

// ┌────────────────────────────────┐
Expand Down Expand Up @@ -95,7 +95,7 @@ impl<G: LineStringTrait<T = f64>> FrechetDistanceLineString<G> for LineStringArr
type Output = Float64Array;

fn frechet_distance(&self, rhs: &G) -> Self::Output {
let rhs = line_string_to_geo(rhs);
let rhs = rhs.to_line_string();
self.try_unary_primitive(|geom| {
Ok::<_, GeoArrowError>(geom.to_geo().frechet_distance(&rhs))
})
Expand Down Expand Up @@ -135,7 +135,7 @@ impl<G: LineStringTrait<T = f64>> FrechetDistanceLineString<G> for &dyn ChunkedN
use Dimension::*;
use NativeType::*;

let rhs = line_string_to_geo(rhs);
let rhs = rhs.to_line_string();
let result = match self.data_type() {
LineString(_, XY) => {
FrechetDistanceLineString::frechet_distance(self.as_line_string(), &rhs)
Expand Down
Loading

0 comments on commit 5b0e100

Please sign in to comment.