Skip to content

Commit ee90acf

Browse files
authored
Update geo-traits (#839)
Update for [georust/geo@`4764343` (#1157)](georust/geo@4764343)
1 parent b6eb8d2 commit ee90acf

File tree

117 files changed

+2230
-1657
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

117 files changed

+2230
-1657
lines changed

js/src/io/parquet/async.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::error::{GeoArrowWasmError, WasmResult};
33
use crate::io::parquet::options::JsParquetReaderOptions;
44
use arrow_wasm::{RecordBatch, Table};
55
use futures::stream::StreamExt;
6-
use geoarrow::geo_traits::{PointTrait, RectTrait};
6+
use geoarrow::geo_traits::CoordTrait;
77
use geoarrow::io::parquet::metadata::GeoParquetBboxCovering;
88
use geoarrow::io::parquet::{
99
GeoParquetDatasetMetadata, GeoParquetReaderMetadata, GeoParquetReaderOptions,
@@ -71,10 +71,10 @@ impl ParquetFile {
7171
.row_group_bounds(row_group_idx, paths.as_ref())?
7272
{
7373
Ok(Some(vec![
74-
bounds.lower().x(),
75-
bounds.lower().y(),
76-
bounds.upper().x(),
77-
bounds.upper().y(),
74+
bounds.min().x(),
75+
bounds.min().y(),
76+
bounds.max().x(),
77+
bounds.max().y(),
7878
]))
7979
} else {
8080
Ok(None)

python/geoarrow-io/src/io/parquet/async.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::io::parquet::options::create_options;
99
use crate::util::table_to_pytable;
1010

1111
use geoarrow::error::GeoArrowError;
12-
use geoarrow::geo_traits::{PointTrait, RectTrait};
12+
use geoarrow::geo_traits::CoordTrait;
1313
use geoarrow::io::parquet::metadata::GeoParquetBboxCovering;
1414
use geoarrow::io::parquet::{
1515
GeoParquetDatasetMetadata, GeoParquetReaderMetadata, GeoParquetReaderOptions,
@@ -148,10 +148,10 @@ impl ParquetFile {
148148
.row_group_bounds(row_group_idx, paths.as_ref())?
149149
{
150150
Ok(Some(vec![
151-
bounds.lower().x(),
152-
bounds.lower().y(),
153-
bounds.upper().x(),
154-
bounds.upper().y(),
151+
bounds.min().x(),
152+
bounds.min().y(),
153+
bounds.max().x(),
154+
bounds.max().y(),
155155
]))
156156
} else {
157157
Ok(None)

src/algorithm/geo/center.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ macro_rules! iter_geo_impl {
3232
fn center(&self) -> Self::Output {
3333
let mut output_array = PointBuilder::with_capacity(self.len());
3434
self.iter_geo().for_each(|maybe_g| {
35-
output_array.push_point(
35+
output_array.push_coord(
3636
maybe_g
3737
.and_then(|g| g.bounding_rect().map(|rect| rect.center()))
3838
.as_ref(),

src/algorithm/geodesy/reproject.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ impl CoordinateSet for InterleavedCoordsGeodesy<'_> {
1616
self.0.len() / 2
1717
}
1818

19-
fn dim(&self) -> crate::geo_traits::Dimension {
19+
fn dim(&self) -> crate::geo_traits::Dimensions {
2020
2
2121
}
2222

@@ -43,7 +43,7 @@ impl CoordinateSet for SeparatedCoordsGeodesy<'_> {
4343
self.x.len()
4444
}
4545

46-
fn dim(&self) -> crate::geo_traits::Dimension {
46+
fn dim(&self) -> crate::geo_traits::Dimensions {
4747
2
4848
}
4949

src/algorithm/native/bounding_rect.rs

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::ops::Add;
22

33
use crate::geo_traits::{
4-
GeometryCollectionTrait, GeometryTrait, GeometryType, LineStringTrait, MultiLineStringTrait,
5-
MultiPointTrait, MultiPolygonTrait, PointTrait, PolygonTrait, RectTrait,
4+
CoordTrait, GeometryCollectionTrait, GeometryTrait, GeometryType, LineStringTrait,
5+
MultiLineStringTrait, MultiPointTrait, MultiPolygonTrait, PointTrait, PolygonTrait, RectTrait,
66
};
77
use geo::{Coord, Rect};
88

@@ -61,10 +61,10 @@ impl BoundingRect {
6161
}
6262
}
6363

64-
pub fn add_point(&mut self, point: &impl PointTrait<T = f64>) {
65-
let x = point.x();
66-
let y = point.y();
67-
let z = point.nth(2);
64+
pub fn add_coord(&mut self, coord: &impl CoordTrait<T = f64>) {
65+
let x = coord.x();
66+
let y = coord.y();
67+
let z = coord.nth(2);
6868

6969
if x < self.minx {
7070
self.minx = x;
@@ -91,9 +91,15 @@ impl BoundingRect {
9191
}
9292
}
9393

94+
pub fn add_point(&mut self, point: &impl PointTrait<T = f64>) {
95+
if let Some(coord) = point.coord() {
96+
self.add_coord(&coord);
97+
}
98+
}
99+
94100
pub fn add_line_string(&mut self, line_string: &impl LineStringTrait<T = f64>) {
95-
for coord in line_string.points() {
96-
self.add_point(&coord);
101+
for coord in line_string.coords() {
102+
self.add_coord(&coord);
97103
}
98104
}
99105

@@ -129,15 +135,18 @@ impl BoundingRect {
129135
}
130136

131137
pub fn add_geometry(&mut self, geometry: &impl GeometryTrait<T = f64>) {
138+
use GeometryType::*;
139+
132140
match geometry.as_type() {
133-
GeometryType::Point(g) => self.add_point(g),
134-
GeometryType::LineString(g) => self.add_line_string(g),
135-
GeometryType::Polygon(g) => self.add_polygon(g),
136-
GeometryType::MultiPoint(g) => self.add_multi_point(g),
137-
GeometryType::MultiLineString(g) => self.add_multi_line_string(g),
138-
GeometryType::MultiPolygon(g) => self.add_multi_polygon(g),
139-
GeometryType::GeometryCollection(g) => self.add_geometry_collection(g),
140-
GeometryType::Rect(g) => self.add_rect(g),
141+
Point(g) => self.add_point(g),
142+
LineString(g) => self.add_line_string(g),
143+
Polygon(g) => self.add_polygon(g),
144+
MultiPoint(g) => self.add_multi_point(g),
145+
MultiLineString(g) => self.add_multi_line_string(g),
146+
MultiPolygon(g) => self.add_multi_polygon(g),
147+
GeometryCollection(g) => self.add_geometry_collection(g),
148+
Rect(g) => self.add_rect(g),
149+
Triangle(_) | Line(_) => todo!(),
141150
}
142151
}
143152

@@ -151,8 +160,8 @@ impl BoundingRect {
151160
}
152161

153162
pub fn add_rect(&mut self, rect: &impl RectTrait<T = f64>) {
154-
self.add_point(&rect.lower());
155-
self.add_point(&rect.upper());
163+
self.add_coord(&rect.min());
164+
self.add_coord(&rect.max());
156165
}
157166

158167
pub fn update(&mut self, other: &BoundingRect) {
@@ -183,24 +192,24 @@ impl Add for BoundingRect {
183192

184193
impl RectTrait for BoundingRect {
185194
type T = f64;
186-
type ItemType<'a> = Coord;
195+
type CoordType<'a> = Coord;
187196

188-
fn dim(&self) -> crate::geo_traits::Dimension {
197+
fn dim(&self) -> crate::geo_traits::Dimensions {
189198
if self.minz().is_some() && self.maxz().is_some() {
190-
crate::geo_traits::Dimension::XYZ
199+
crate::geo_traits::Dimensions::Xyz
191200
} else {
192-
crate::geo_traits::Dimension::XY
201+
crate::geo_traits::Dimensions::Xy
193202
}
194203
}
195204

196-
fn lower(&self) -> Self::ItemType<'_> {
205+
fn min(&self) -> Self::CoordType<'_> {
197206
Coord {
198207
x: self.minx,
199208
y: self.miny,
200209
}
201210
}
202211

203-
fn upper(&self) -> Self::ItemType<'_> {
212+
fn max(&self) -> Self::CoordType<'_> {
204213
Coord {
205214
x: self.maxx,
206215
y: self.maxy,

src/algorithm/native/eq.rs

Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,21 @@
11
use crate::geo_traits::{
2-
GeometryCollectionTrait, GeometryTrait, GeometryType, LineStringTrait, MultiLineStringTrait,
3-
MultiPointTrait, MultiPolygonTrait, PointTrait, PolygonTrait, RectTrait,
2+
CoordTrait, GeometryCollectionTrait, GeometryTrait, GeometryType, LineStringTrait,
3+
MultiLineStringTrait, MultiPointTrait, MultiPolygonTrait, PointTrait, PolygonTrait, RectTrait,
44
};
55
use arrow_array::OffsetSizeTrait;
66
use arrow_buffer::OffsetBuffer;
77
use geo::CoordFloat;
88

99
#[inline]
10-
pub fn point_eq<T: CoordFloat>(
11-
left: &impl PointTrait<T = T>,
12-
right: &impl PointTrait<T = T>,
13-
allow_nan_equal: bool,
10+
pub fn coord_eq<T: CoordFloat>(
11+
left: &impl CoordTrait<T = T>,
12+
right: &impl CoordTrait<T = T>,
1413
) -> bool {
1514
let left_dim = left.dim();
1615
if left_dim != right.dim() {
1716
return false;
1817
}
1918

20-
if allow_nan_equal {
21-
// Specifically check for NaN because two points defined to be
22-
// TODO: in the future add an `is_empty` to the PointTrait and then you shouldn't check for
23-
// NaN manually
24-
match left_dim {
25-
crate::geo_traits::Dimension::XY => {
26-
if left.x().is_nan()
27-
&& right.x().is_nan()
28-
&& left.y().is_nan()
29-
&& right.y().is_nan()
30-
{
31-
return true;
32-
}
33-
}
34-
crate::geo_traits::Dimension::XYZ => {
35-
if left.x().is_nan()
36-
&& right.x().is_nan()
37-
&& left.y().is_nan()
38-
&& right.y().is_nan()
39-
&& left.nth_unchecked(2).is_nan()
40-
&& right.nth_unchecked(2).is_nan()
41-
{
42-
return true;
43-
}
44-
}
45-
_ => panic!(),
46-
}
47-
}
48-
4919
for i in 0..left_dim.size() {
5020
if left.nth_unchecked(i) != right.nth_unchecked(i) {
5121
return false;
@@ -55,6 +25,18 @@ pub fn point_eq<T: CoordFloat>(
5525
true
5626
}
5727

28+
#[inline]
29+
pub fn point_eq<T: CoordFloat>(
30+
left: &impl PointTrait<T = T>,
31+
right: &impl PointTrait<T = T>,
32+
) -> bool {
33+
match (left.coord(), right.coord()) {
34+
(Some(left), Some(right)) => coord_eq(&left, &right),
35+
(None, None) => true,
36+
_ => false,
37+
}
38+
}
39+
5840
#[inline]
5941
pub fn line_string_eq<T: CoordFloat>(
6042
left: &impl LineStringTrait<T = T>,
@@ -64,12 +46,12 @@ pub fn line_string_eq<T: CoordFloat>(
6446
return false;
6547
}
6648

67-
if left.num_points() != right.num_points() {
49+
if left.num_coords() != right.num_coords() {
6850
return false;
6951
}
7052

71-
for (left_coord, right_coord) in left.points().zip(right.points()) {
72-
if !point_eq(&left_coord, &right_coord, false) {
53+
for (left_coord, right_coord) in left.coords().zip(right.coords()) {
54+
if !coord_eq(&left_coord, &right_coord) {
7355
return false;
7456
}
7557
}
@@ -128,7 +110,7 @@ pub fn multi_point_eq<T: CoordFloat>(
128110
}
129111

130112
for (left_point, right_point) in left.points().zip(right.points()) {
131-
if !point_eq(&left_point, &right_point, false) {
113+
if !point_eq(&left_point, &right_point) {
132114
return false;
133115
}
134116
}
@@ -186,11 +168,11 @@ pub fn rect_eq<T: CoordFloat>(left: &impl RectTrait<T = T>, right: &impl RectTra
186168
return false;
187169
}
188170

189-
if !point_eq(&left.lower(), &right.lower(), false) {
171+
if !coord_eq(&left.min(), &right.min()) {
190172
return false;
191173
}
192174

193-
if !point_eq(&left.upper(), &right.upper(), false) {
175+
if !coord_eq(&left.max(), &right.max()) {
194176
return false;
195177
}
196178

@@ -208,7 +190,7 @@ pub fn geometry_eq<T: CoordFloat>(
208190

209191
match (left.as_type(), right.as_type()) {
210192
(GeometryType::Point(l), GeometryType::Point(r)) => {
211-
if !point_eq(l, r, false) {
193+
if !point_eq(l, r) {
212194
return false;
213195
}
214196
}

src/algorithm/native/map_coords.rs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ impl MapCoords for LineString<'_, 2> {
6464
GeoArrowError: From<E>,
6565
{
6666
let output_coords = self
67-
.points()
68-
.map(|point| map_op(&point.coord()))
67+
.coords()
68+
.map(|coord| map_op(&coord))
6969
.collect::<std::result::Result<Vec<_>, E>>()?;
7070
Ok(geo::LineString::new(output_coords))
7171
}
@@ -150,27 +150,22 @@ impl MapCoords for Geometry<'_, 2> {
150150
F: Fn(&crate::scalar::Coord<2>) -> std::result::Result<geo::Coord, E> + Sync,
151151
GeoArrowError: From<E>,
152152
{
153+
use GeometryType::*;
154+
153155
match self.as_type() {
154-
GeometryType::Point(geom) => Ok(geo::Geometry::Point(geom.try_map_coords(&map_op)?)),
155-
GeometryType::LineString(geom) => {
156-
Ok(geo::Geometry::LineString(geom.try_map_coords(&map_op)?))
157-
}
158-
GeometryType::Polygon(geom) => {
159-
Ok(geo::Geometry::Polygon(geom.try_map_coords(&map_op)?))
160-
}
161-
GeometryType::MultiPoint(geom) => {
162-
Ok(geo::Geometry::MultiPoint(geom.try_map_coords(&map_op)?))
163-
}
164-
GeometryType::MultiLineString(geom) => Ok(geo::Geometry::MultiLineString(
156+
Point(geom) => Ok(geo::Geometry::Point(geom.try_map_coords(&map_op)?)),
157+
LineString(geom) => Ok(geo::Geometry::LineString(geom.try_map_coords(&map_op)?)),
158+
Polygon(geom) => Ok(geo::Geometry::Polygon(geom.try_map_coords(&map_op)?)),
159+
MultiPoint(geom) => Ok(geo::Geometry::MultiPoint(geom.try_map_coords(&map_op)?)),
160+
MultiLineString(geom) => Ok(geo::Geometry::MultiLineString(
165161
geom.try_map_coords(&map_op)?,
166162
)),
167-
GeometryType::MultiPolygon(geom) => {
168-
Ok(geo::Geometry::MultiPolygon(geom.try_map_coords(&map_op)?))
169-
}
170-
GeometryType::GeometryCollection(geom) => Ok(geo::Geometry::GeometryCollection(
163+
MultiPolygon(geom) => Ok(geo::Geometry::MultiPolygon(geom.try_map_coords(&map_op)?)),
164+
GeometryCollection(geom) => Ok(geo::Geometry::GeometryCollection(
171165
geom.try_map_coords(&map_op)?,
172166
)),
173-
GeometryType::Rect(geom) => Ok(geo::Geometry::Rect(geom.try_map_coords(&map_op)?)),
167+
Rect(geom) => Ok(geo::Geometry::Rect(geom.try_map_coords(&map_op)?)),
168+
Line(_) | Triangle(_) => todo!(),
174169
}
175170
}
176171
}
@@ -199,8 +194,8 @@ impl MapCoords for Rect<'_, 2> {
199194
F: Fn(&crate::scalar::Coord<2>) -> std::result::Result<geo::Coord, E> + Sync,
200195
GeoArrowError: From<E>,
201196
{
202-
let lower = self.lower();
203-
let upper = self.upper();
197+
let lower = self.min();
198+
let upper = self.max();
204199
let minx = lower[0];
205200
let miny = lower[1];
206201
let maxx = upper[0];
@@ -232,7 +227,7 @@ impl MapCoords for PointArray<2> {
232227
for maybe_geom in self.iter() {
233228
if let Some(geom) = maybe_geom {
234229
let result = geom.coord().try_map_coords(&map_op)?;
235-
builder.push_point(Some(&result));
230+
builder.push_coord(Some(&result));
236231
} else {
237232
builder.push_null()
238233
}

0 commit comments

Comments
 (0)