Skip to content

Commit

Permalink
Update for latest geo-traits (#831)
Browse files Browse the repository at this point in the history
### Change list

- Change to logical type returned from `dim()`.
- Some method renames, e.g. `coord()` to `point()`

Ref georust/geo#1157 (comment)
  • Loading branch information
kylebarron authored Oct 21, 2024
1 parent 0b6715c commit b6eb8d2
Show file tree
Hide file tree
Showing 89 changed files with 889 additions and 537 deletions.
50 changes: 38 additions & 12 deletions src/algorithm/geodesy/reproject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ impl CoordinateSet for InterleavedCoordsGeodesy<'_> {
self.0.len() / 2
}

fn dim(&self) -> usize {
fn dim(&self) -> crate::geo_traits::Dimension {
2
}

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

fn dim(&self) -> usize {
fn dim(&self) -> crate::geo_traits::Dimension {
2
}

Expand All @@ -57,7 +57,11 @@ impl CoordinateSet for SeparatedCoordsGeodesy<'_> {
}
}

fn reproject_coords(coords: &CoordBuffer<2>, definition: &str, direction: Direction) -> Result<CoordBuffer<2>> {
fn reproject_coords(
coords: &CoordBuffer<2>,
definition: &str,
direction: Direction,
) -> Result<CoordBuffer<2>> {
let mut context = Minimal::new();
// TODO: fix error handling
let operation = context.op(definition).unwrap();
Expand All @@ -67,17 +71,27 @@ fn reproject_coords(coords: &CoordBuffer<2>, definition: &str, direction: Direct
let mut cloned_coords = coords.coords.to_vec();

let mut geodesy_coords = InterleavedCoordsGeodesy(&mut cloned_coords);
context.apply(operation, direction, &mut geodesy_coords).unwrap();
context
.apply(operation, direction, &mut geodesy_coords)
.unwrap();

CoordBuffer::Interleaved(InterleavedCoordBuffer::new(cloned_coords.into()))
}
CoordBuffer::Separated(separated_coords) => {
let mut x_coords = separated_coords.buffers[0].to_vec();
let mut y_coords = separated_coords.buffers[1].to_vec();

let mut geodesy_coords = SeparatedCoordsGeodesy { x: &mut x_coords, y: &mut y_coords };
context.apply(operation, direction, &mut geodesy_coords).unwrap();
CoordBuffer::Separated(SeparatedCoordBuffer::new([x_coords.into(), y_coords.into()]))
let mut geodesy_coords = SeparatedCoordsGeodesy {
x: &mut x_coords,
y: &mut y_coords,
};
context
.apply(operation, direction, &mut geodesy_coords)
.unwrap();
CoordBuffer::Separated(SeparatedCoordBuffer::new([
x_coords.into(),
y_coords.into(),
]))
}
};

Expand All @@ -88,31 +102,43 @@ fn reproject_coords(coords: &CoordBuffer<2>, definition: &str, direction: Direct
///

// NOTE: In the future this should probably take care to _not_ reproject coordinates that are set to null via the arrow validity bitmask. That could probably lead to
pub fn reproject<O: OffsetSizeTrait>(array: &GeometryArray<O>, definition: &str, direction: Direction) -> Result<GeometryArray<O>> {
pub fn reproject<O: OffsetSizeTrait>(
array: &GeometryArray<O>,
definition: &str,
direction: Direction,
) -> Result<GeometryArray<O>> {
match array {
GeometryArray::Point(arr) => {
let new_coords = reproject_coords(&arr.coords, definition, direction)?;
Ok(GeometryArray::Point(arr.clone().with_coords(new_coords)))
}
GeometryArray::LineString(arr) => {
let new_coords = reproject_coords(&arr.coords, definition, direction)?;
Ok(GeometryArray::LineString(arr.clone().with_coords(new_coords)))
Ok(GeometryArray::LineString(
arr.clone().with_coords(new_coords),
))
}
GeometryArray::Polygon(arr) => {
let new_coords = reproject_coords(&arr.coords, definition, direction)?;
Ok(GeometryArray::Polygon(arr.clone().with_coords(new_coords)))
}
GeometryArray::MultiPoint(arr) => {
let new_coords = reproject_coords(&arr.coords, definition, direction)?;
Ok(GeometryArray::MultiPoint(arr.clone().with_coords(new_coords)))
Ok(GeometryArray::MultiPoint(
arr.clone().with_coords(new_coords),
))
}
GeometryArray::MultiLineString(arr) => {
let new_coords = reproject_coords(&arr.coords, definition, direction)?;
Ok(GeometryArray::MultiLineString(arr.clone().with_coords(new_coords)))
Ok(GeometryArray::MultiLineString(
arr.clone().with_coords(new_coords),
))
}
GeometryArray::MultiPolygon(arr) => {
let new_coords = reproject_coords(&arr.coords, definition, direction)?;
Ok(GeometryArray::MultiPolygon(arr.clone().with_coords(new_coords)))
Ok(GeometryArray::MultiPolygon(
arr.clone().with_coords(new_coords),
))
}
GeometryArray::Rect(_arr) => todo!(),
}
Expand Down
10 changes: 5 additions & 5 deletions src/algorithm/native/bounding_rect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ impl BoundingRect {
}

pub fn add_line_string(&mut self, line_string: &impl LineStringTrait<T = f64>) {
for coord in line_string.coords() {
for coord in line_string.points() {
self.add_point(&coord);
}
}
Expand All @@ -117,7 +117,7 @@ impl BoundingRect {
&mut self,
multi_line_string: &impl MultiLineStringTrait<T = f64>,
) {
for linestring in multi_line_string.lines() {
for linestring in multi_line_string.line_strings() {
self.add_line_string(&linestring);
}
}
Expand Down Expand Up @@ -185,11 +185,11 @@ impl RectTrait for BoundingRect {
type T = f64;
type ItemType<'a> = Coord;

fn dim(&self) -> usize {
fn dim(&self) -> crate::geo_traits::Dimension {
if self.minz().is_some() && self.maxz().is_some() {
3
crate::geo_traits::Dimension::XYZ
} else {
2
crate::geo_traits::Dimension::XY
}
}

Expand Down
14 changes: 7 additions & 7 deletions src/algorithm/native/eq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pub fn point_eq<T: CoordFloat>(
// TODO: in the future add an `is_empty` to the PointTrait and then you shouldn't check for
// NaN manually
match left_dim {
2 => {
crate::geo_traits::Dimension::XY => {
if left.x().is_nan()
&& right.x().is_nan()
&& left.y().is_nan()
Expand All @@ -31,7 +31,7 @@ pub fn point_eq<T: CoordFloat>(
return true;
}
}
3 => {
crate::geo_traits::Dimension::XYZ => {
if left.x().is_nan()
&& right.x().is_nan()
&& left.y().is_nan()
Expand All @@ -46,7 +46,7 @@ pub fn point_eq<T: CoordFloat>(
}
}

for i in 0..left_dim {
for i in 0..left_dim.size() {
if left.nth_unchecked(i) != right.nth_unchecked(i) {
return false;
}
Expand All @@ -64,11 +64,11 @@ pub fn line_string_eq<T: CoordFloat>(
return false;
}

if left.num_coords() != right.num_coords() {
if left.num_points() != right.num_points() {
return false;
}

for (left_coord, right_coord) in left.coords().zip(right.coords()) {
for (left_coord, right_coord) in left.points().zip(right.points()) {
if !point_eq(&left_coord, &right_coord, false) {
return false;
}
Expand Down Expand Up @@ -145,11 +145,11 @@ pub fn multi_line_string_eq<T: CoordFloat>(
return false;
}

if left.num_lines() != right.num_lines() {
if left.num_line_strings() != right.num_line_strings() {
return false;
}

for (left_line, right_line) in left.lines().zip(right.lines()) {
for (left_line, right_line) in left.line_strings().zip(right.line_strings()) {
if !line_string_eq(&left_line, &right_line) {
return false;
}
Expand Down
4 changes: 2 additions & 2 deletions src/algorithm/native/map_coords.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ impl MapCoords for LineString<'_, 2> {
GeoArrowError: From<E>,
{
let output_coords = self
.coords()
.points()
.map(|point| map_op(&point.coord()))
.collect::<std::result::Result<Vec<_>, E>>()?;
Ok(geo::LineString::new(output_coords))
Expand Down Expand Up @@ -118,7 +118,7 @@ impl MapCoords for MultiLineString<'_, 2> {
GeoArrowError: From<E>,
{
let lines = self
.lines()
.line_strings()
.map(|line_string| line_string.try_map_coords(&map_op))
.collect::<Result<Vec<_>>>()?;
Ok(geo::MultiLineString::new(lines))
Expand Down
8 changes: 4 additions & 4 deletions src/array/linestring/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,8 +232,8 @@ impl<const D: usize> LineStringBuilder<D> {
value: Option<&impl LineStringTrait<T = f64>>,
) -> Result<()> {
if let Some(line_string) = value {
let num_coords = line_string.num_coords();
for coord in line_string.coords() {
let num_coords = line_string.num_points();
for coord in line_string.points() {
self.coords.push_point(&coord);
}
self.try_push_length(num_coords)?;
Expand Down Expand Up @@ -270,8 +270,8 @@ impl<const D: usize> LineStringBuilder<D> {
match value.as_type() {
GeometryType::LineString(g) => self.push_line_string(Some(g))?,
GeometryType::MultiLineString(ml) => {
if ml.num_lines() == 1 {
self.push_line_string(Some(&ml.line(0).unwrap()))?
if ml.num_line_strings() == 1 {
self.push_line_string(Some(&ml.line_string(0).unwrap()))?
} else {
return Err(GeoArrowError::General("Incorrect type".to_string()));
}
Expand Down
2 changes: 1 addition & 1 deletion src/array/linestring/capacity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ impl LineStringCapacity {

#[inline]
fn add_valid_line_string(&mut self, line_string: &impl LineStringTrait) {
self.coord_capacity += line_string.num_coords();
self.coord_capacity += line_string.num_points();
}

#[inline]
Expand Down
12 changes: 6 additions & 6 deletions src/array/multilinestring/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,10 @@ impl<const D: usize> MultiLineStringBuilder<D> {
// - Push ring's coords to self.coords

self.ring_offsets
.try_push_usize(line_string.num_coords())
.try_push_usize(line_string.num_points())
.unwrap();

for coord in line_string.coords() {
for coord in line_string.points() {
self.coords.push_point(&coord);
}

Expand All @@ -266,7 +266,7 @@ impl<const D: usize> MultiLineStringBuilder<D> {
) -> Result<()> {
if let Some(multi_line_string) = value {
// Total number of linestrings in this multilinestring
let num_line_strings = multi_line_string.num_lines();
let num_line_strings = multi_line_string.num_line_strings();
self.geom_offsets.try_push_usize(num_line_strings)?;

// For each ring:
Expand All @@ -275,12 +275,12 @@ impl<const D: usize> MultiLineStringBuilder<D> {
// - Push ring's coords to self.coords

// Number of coords for each ring
for line_string in multi_line_string.lines() {
for line_string in multi_line_string.line_strings() {
self.ring_offsets
.try_push_usize(line_string.num_coords())
.try_push_usize(line_string.num_points())
.unwrap();

for coord in line_string.coords() {
for coord in line_string.points() {
self.coords.push_point(&coord);
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/array/multilinestring/capacity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ impl MultiLineStringCapacity {
if let Some(line_string) = maybe_line_string {
// A single line string
self.ring_capacity += 1;
self.coord_capacity += line_string.num_coords();
self.coord_capacity += line_string.num_points();
}
}

Expand All @@ -61,11 +61,11 @@ impl MultiLineStringCapacity {
self.geom_capacity += 1;
if let Some(multi_line_string) = multi_line_string {
// Total number of rings in this polygon
let num_line_strings = multi_line_string.num_lines();
let num_line_strings = multi_line_string.num_line_strings();
self.ring_capacity += num_line_strings;

for line_string in multi_line_string.lines() {
self.coord_capacity += line_string.num_coords();
for line_string in multi_line_string.line_strings() {
self.coord_capacity += line_string.num_points();
}
}
}
Expand Down
16 changes: 8 additions & 8 deletions src/array/multipolygon/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ impl<const D: usize> MultiPolygonBuilder<D> {

// TODO: support empty polygons
let ext_ring = polygon.exterior().unwrap();
for coord in ext_ring.coords() {
for coord in ext_ring.points() {
self.coords.push_point(&coord);
}

Expand All @@ -237,15 +237,15 @@ impl<const D: usize> MultiPolygonBuilder<D> {

// Number of coords for each ring
self.ring_offsets
.try_push_usize(ext_ring.num_coords())
.try_push_usize(ext_ring.num_points())
.unwrap();

for int_ring in polygon.interiors() {
self.ring_offsets
.try_push_usize(int_ring.num_coords())
.try_push_usize(int_ring.num_points())
.unwrap();

for coord in int_ring.coords() {
for coord in int_ring.points() {
self.coords.push_point(&coord);
}
}
Expand Down Expand Up @@ -275,7 +275,7 @@ impl<const D: usize> MultiPolygonBuilder<D> {
// Here we unwrap the exterior ring because a polygon inside a multi polygon should
// never be empty.
let ext_ring = polygon.exterior().unwrap();
for coord in ext_ring.coords() {
for coord in ext_ring.points() {
self.coords.push_point(&coord);
}

Expand All @@ -286,15 +286,15 @@ impl<const D: usize> MultiPolygonBuilder<D> {

// Number of coords for each ring
self.ring_offsets
.try_push_usize(ext_ring.num_coords())
.try_push_usize(ext_ring.num_points())
.unwrap();

for int_ring in polygon.interiors() {
self.ring_offsets
.try_push_usize(int_ring.num_coords())
.try_push_usize(int_ring.num_points())
.unwrap();

for coord in int_ring.coords() {
for coord in int_ring.points() {
self.coords.push_point(&coord);
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/array/multipolygon/capacity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,11 @@ impl MultiPolygonCapacity {

// Number of coords for each ring
if let Some(exterior) = polygon.exterior() {
self.coord_capacity += exterior.num_coords();
self.coord_capacity += exterior.num_points();
}

for int_ring in polygon.interiors() {
self.coord_capacity += int_ring.num_coords();
self.coord_capacity += int_ring.num_points();
}
}
}
Expand All @@ -99,11 +99,11 @@ impl MultiPolygonCapacity {

// Number of coords for each ring
if let Some(exterior) = polygon.exterior() {
self.coord_capacity += exterior.num_coords();
self.coord_capacity += exterior.num_points();
}

for int_ring in polygon.interiors() {
self.coord_capacity += int_ring.num_coords();
self.coord_capacity += int_ring.num_points();
}
}
}
Expand Down
Loading

0 comments on commit b6eb8d2

Please sign in to comment.