Skip to content

Commit ae84b52

Browse files
authored
refactor(pyo3-geoarrow): Move Python data type constructors out of pyo3-geoarrow (#1379)
These are Python-only constructors and not relevant to the _interop_ part of python geoarrow bindings, so they shouldn't live in `pyo3-geoarrow` For now the existing types are deprecated but not removed so not a breaking change.
1 parent 31bb27e commit ae84b52

File tree

7 files changed

+155
-25
lines changed

7 files changed

+155
-25
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
use std::sync::Arc;
2+
3+
use geoarrow_schema::{
4+
BoxType, GeoArrowType, GeometryCollectionType, GeometryType, LineStringType, Metadata,
5+
MultiLineStringType, MultiPointType, MultiPolygonType, PointType, PolygonType, WkbType,
6+
WktType,
7+
};
8+
use pyo3::prelude::*;
9+
10+
use pyo3_geoarrow::{PyCoordType, PyCrs, PyDimension, PyEdges, PyGeoType};
11+
12+
macro_rules! impl_native_type_constructor {
13+
($fn_name:ident, $geoarrow_type:ty) => {
14+
#[allow(missing_docs)]
15+
#[pyfunction]
16+
#[pyo3(
17+
signature = (dimension, *, coord_type = PyCoordType::Separated, crs=None, edges=None),
18+
text_signature = "(dimension, *, coord_type='separated', crs=None, edges=None)"
19+
)]
20+
pub fn $fn_name(
21+
dimension: PyDimension,
22+
coord_type: PyCoordType,
23+
crs: Option<PyCrs>,
24+
edges: Option<PyEdges>,
25+
) -> PyGeoType {
26+
let edges = edges.map(|e| e.into());
27+
let metadata = Arc::new(Metadata::new(crs.unwrap_or_default().into(), edges));
28+
<$geoarrow_type>::new(dimension.into(), metadata)
29+
.with_coord_type(coord_type.into())
30+
.into()
31+
}
32+
};
33+
}
34+
35+
impl_native_type_constructor!(point, PointType);
36+
impl_native_type_constructor!(linestring, LineStringType);
37+
impl_native_type_constructor!(polygon, PolygonType);
38+
impl_native_type_constructor!(multipoint, MultiPointType);
39+
impl_native_type_constructor!(multilinestring, MultiLineStringType);
40+
impl_native_type_constructor!(multipolygon, MultiPolygonType);
41+
impl_native_type_constructor!(geometrycollection, GeometryCollectionType);
42+
43+
#[pyfunction]
44+
#[pyo3(signature = (dimension, *, crs=None, edges=None))]
45+
pub fn r#box(dimension: PyDimension, crs: Option<PyCrs>, edges: Option<PyEdges>) -> PyGeoType {
46+
let edges = edges.map(|e| e.into());
47+
let metadata = Arc::new(Metadata::new(crs.unwrap_or_default().into(), edges));
48+
BoxType::new(dimension.into(), metadata).into()
49+
}
50+
51+
#[pyfunction]
52+
#[pyo3(
53+
signature = (*, coord_type = PyCoordType::Separated, crs=None, edges=None),
54+
text_signature = "(*, coord_type='separated', crs=None, edges=None)"
55+
)]
56+
pub fn geometry(coord_type: PyCoordType, crs: Option<PyCrs>, edges: Option<PyEdges>) -> PyGeoType {
57+
let edges = edges.map(|e| e.into());
58+
let metadata = Arc::new(Metadata::new(crs.unwrap_or_default().into(), edges));
59+
GeometryType::new(metadata)
60+
.with_coord_type(coord_type.into())
61+
.into()
62+
}
63+
64+
macro_rules! impl_wkb_wkt {
65+
($method_name:ident, $type_constructor:ty, $variant:expr) => {
66+
#[allow(missing_docs)]
67+
#[pyfunction]
68+
#[pyo3(signature = (*, crs=None, edges=None))]
69+
pub fn $method_name(crs: Option<PyCrs>, edges: Option<PyEdges>) -> PyGeoType {
70+
let edges = edges.map(|e| e.into());
71+
let metadata = Arc::new(Metadata::new(crs.unwrap_or_default().into(), edges));
72+
$variant(<$type_constructor>::new(metadata)).into()
73+
}
74+
};
75+
}
76+
77+
impl_wkb_wkt!(wkb, WkbType, GeoArrowType::Wkb);
78+
impl_wkb_wkt!(large_wkb, WkbType, GeoArrowType::LargeWkb);
79+
impl_wkb_wkt!(wkb_view, WkbType, GeoArrowType::WkbView);
80+
impl_wkb_wkt!(wkt, WktType, GeoArrowType::Wkt);
81+
impl_wkb_wkt!(large_wkt, WktType, GeoArrowType::LargeWkt);
82+
impl_wkb_wkt!(wkt_view, WktType, GeoArrowType::WktView);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub mod array;
2+
pub mod data_type;

python/geoarrow-core/src/interop/shapely/from_shapely.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::sync::Arc;
22

3-
use crate::constructors::{
3+
use crate::constructors::array::{
44
linestrings, multilinestrings, multipoints, multipolygons, points, polygons,
55
};
66
use crate::interop::shapely::utils::import_shapely;

python/geoarrow-core/src/lib.rs

Lines changed: 63 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,39 +43,78 @@ fn _rust(py: Python, m: &Bound<PyModule>) -> PyResult<()> {
4343
m.add_class::<pyo3_geoarrow::PyGeoScalar>()?;
4444
m.add_class::<pyo3_geoarrow::data_type::PyGeoType>()?;
4545

46-
// Type constructors
46+
// DataType constructors
4747

48-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::point, m)?)?;
49-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::geometry, m)?)?;
48+
m.add_function(wrap_pyfunction!(crate::constructors::data_type::point, m)?)?;
5049
m.add_function(wrap_pyfunction!(
51-
pyo3_geoarrow::data_type::geometrycollection,
50+
crate::constructors::data_type::geometry,
5251
m
5352
)?)?;
54-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::linestring, m)?)?;
5553
m.add_function(wrap_pyfunction!(
56-
pyo3_geoarrow::data_type::multilinestring,
54+
crate::constructors::data_type::geometrycollection,
5755
m
5856
)?)?;
59-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::multipoint, m)?)?;
60-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::multipolygon, m)?)?;
61-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::point, m)?)?;
62-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::polygon, m)?)?;
63-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::wkb, m)?)?;
64-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::large_wkb, m)?)?;
65-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::wkb_view, m)?)?;
66-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::wkt, m)?)?;
67-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::large_wkt, m)?)?;
68-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::wkt_view, m)?)?;
69-
m.add_function(wrap_pyfunction!(pyo3_geoarrow::data_type::r#box, m)?)?;
57+
m.add_function(wrap_pyfunction!(
58+
crate::constructors::data_type::linestring,
59+
m
60+
)?)?;
61+
m.add_function(wrap_pyfunction!(
62+
crate::constructors::data_type::multilinestring,
63+
m
64+
)?)?;
65+
m.add_function(wrap_pyfunction!(
66+
crate::constructors::data_type::multipoint,
67+
m
68+
)?)?;
69+
m.add_function(wrap_pyfunction!(
70+
crate::constructors::data_type::multipolygon,
71+
m
72+
)?)?;
73+
m.add_function(wrap_pyfunction!(crate::constructors::data_type::point, m)?)?;
74+
m.add_function(wrap_pyfunction!(
75+
crate::constructors::data_type::polygon,
76+
m
77+
)?)?;
78+
m.add_function(wrap_pyfunction!(crate::constructors::data_type::wkb, m)?)?;
79+
m.add_function(wrap_pyfunction!(
80+
crate::constructors::data_type::large_wkb,
81+
m
82+
)?)?;
83+
m.add_function(wrap_pyfunction!(
84+
crate::constructors::data_type::wkb_view,
85+
m
86+
)?)?;
87+
m.add_function(wrap_pyfunction!(crate::constructors::data_type::wkt, m)?)?;
88+
m.add_function(wrap_pyfunction!(
89+
crate::constructors::data_type::large_wkt,
90+
m
91+
)?)?;
92+
m.add_function(wrap_pyfunction!(
93+
crate::constructors::data_type::wkt_view,
94+
m
95+
)?)?;
96+
m.add_function(wrap_pyfunction!(crate::constructors::data_type::r#box, m)?)?;
7097

71-
// Constructors
98+
// Geometry Array Constructors
7299

73-
m.add_function(wrap_pyfunction!(crate::constructors::points, m)?)?;
74-
m.add_function(wrap_pyfunction!(crate::constructors::linestrings, m)?)?;
75-
m.add_function(wrap_pyfunction!(crate::constructors::polygons, m)?)?;
76-
m.add_function(wrap_pyfunction!(crate::constructors::multipoints, m)?)?;
77-
m.add_function(wrap_pyfunction!(crate::constructors::multilinestrings, m)?)?;
78-
m.add_function(wrap_pyfunction!(crate::constructors::multipolygons, m)?)?;
100+
m.add_function(wrap_pyfunction!(crate::constructors::array::points, m)?)?;
101+
m.add_function(wrap_pyfunction!(
102+
crate::constructors::array::linestrings,
103+
m
104+
)?)?;
105+
m.add_function(wrap_pyfunction!(crate::constructors::array::polygons, m)?)?;
106+
m.add_function(wrap_pyfunction!(
107+
crate::constructors::array::multipoints,
108+
m
109+
)?)?;
110+
m.add_function(wrap_pyfunction!(
111+
crate::constructors::array::multilinestrings,
112+
m
113+
)?)?;
114+
m.add_function(wrap_pyfunction!(
115+
crate::constructors::array::multipolygons,
116+
m
117+
)?)?;
79118

80119
// Top-level table functions
81120

rust/pyo3-geoarrow/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
## [Unreleased]
44

55
- docs(pyo3-geoarrow): Improve docs #1377
6+
- refactor(pyo3-geoarrow): Move Python data type constructors out of pyo3-geoarrow (deprecating existing constructors) #1379

rust/pyo3-geoarrow/src/data_type.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
88
// TODO: remove when we move type constructors to geoarrow-rust-core
99
#![allow(missing_docs)]
10+
// Remove in v0.7
11+
#![allow(deprecated)]
1012

1113
use std::sync::Arc;
1214

@@ -171,6 +173,7 @@ impl_from_geoarrow_type!(BoxType, Rect);
171173
macro_rules! impl_native_type_constructor {
172174
($fn_name:ident, $geoarrow_type:ty) => {
173175
#[allow(missing_docs)]
176+
#[deprecated(note = "Not intended for public consumption and moved to geoarrow-rust-core")]
174177
#[pyfunction]
175178
#[pyo3(
176179
signature = (dimension, *, coord_type = PyCoordType::Separated, crs=None, edges=None),
@@ -199,6 +202,7 @@ impl_native_type_constructor!(multilinestring, MultiLineStringType);
199202
impl_native_type_constructor!(multipolygon, MultiPolygonType);
200203
impl_native_type_constructor!(geometrycollection, GeometryCollectionType);
201204

205+
#[deprecated(note = "Not intended for public consumption and moved to geoarrow-rust-core")]
202206
#[pyfunction]
203207
#[pyo3(signature = (dimension, *, crs=None, edges=None))]
204208
pub fn r#box(dimension: PyDimension, crs: Option<PyCrs>, edges: Option<PyEdges>) -> PyGeoType {
@@ -207,6 +211,7 @@ pub fn r#box(dimension: PyDimension, crs: Option<PyCrs>, edges: Option<PyEdges>)
207211
BoxType::new(dimension.into(), metadata).into()
208212
}
209213

214+
#[deprecated(note = "Not intended for public consumption and moved to geoarrow-rust-core")]
210215
#[pyfunction]
211216
#[pyo3(
212217
signature = (*, coord_type = PyCoordType::Separated, crs=None, edges=None),
@@ -222,6 +227,7 @@ pub fn geometry(coord_type: PyCoordType, crs: Option<PyCrs>, edges: Option<PyEdg
222227

223228
macro_rules! impl_wkb_wkt {
224229
($method_name:ident, $type_constructor:ty, $variant:expr) => {
230+
#[deprecated(note = "Not intended for public consumption and moved to geoarrow-rust-core")]
225231
#[allow(missing_docs)]
226232
#[pyfunction]
227233
#[pyo3(signature = (*, crs=None, edges=None))]

0 commit comments

Comments
 (0)