Skip to content

Commit e715de6

Browse files
authored
feat: update geoarrow version, set primary column (#758)
Closes #755
1 parent 0df592b commit e715de6

File tree

8 files changed

+58
-27
lines changed

8 files changed

+58
-27
lines changed

Cargo.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ futures = "0.3.31"
5252
futures-core = "0.3.31"
5353
futures-util = "0.3.31"
5454
geo = "0.30.0"
55-
geo-traits = "0.2.0"
56-
geo-types = "0.7.15"
57-
geoarrow-array = { git = "https://github.com/geoarrow/geoarrow-rs/", rev = "17bf33e4cf78b060afa08ca9560dc4efd73c2c76" }
58-
geoarrow-geoparquet = { git = "https://github.com/geoarrow/geoarrow-rs/", rev = "17bf33e4cf78b060afa08ca9560dc4efd73c2c76" }
59-
geoarrow-schema = { git = "https://github.com/geoarrow/geoarrow-rs/", rev = "17bf33e4cf78b060afa08ca9560dc4efd73c2c76" }
55+
geo-traits = "0.3.0"
56+
geo-types = "0.7.16"
57+
geoarrow-array = { git = "https://github.com/geoarrow/geoarrow-rs/", rev = "d27500849c6cee019535d6749991d1fd122baecf" }
58+
geoparquet = { git = "https://github.com/geoarrow/geoarrow-rs/", rev = "d27500849c6cee019535d6749991d1fd122baecf" }
59+
geoarrow-schema = { git = "https://github.com/geoarrow/geoarrow-rs/", rev = "d27500849c6cee019535d6749991d1fd122baecf" }
6060
geojson = "0.24.1"
6161
getrandom = { version = "0.3.3", features = ["wasm_js"] }
6262
http = "1.1"

crates/core/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ geoarrow = [
2323
"dep:geo-traits",
2424
"dep:geo-types",
2525
]
26-
geoparquet = ["geoarrow", "dep:geoarrow-geoparquet", "dep:parquet"]
27-
geoparquet-compression = ["geoparquet", "geoarrow-geoparquet/compression"]
26+
geoparquet = ["geoarrow", "dep:geoparquet", "dep:parquet"]
27+
geoparquet-compression = ["geoparquet", "geoparquet/compression"]
2828

2929
[dependencies]
3030
arrow-array = { workspace = true, optional = true, features = ["chrono-tz"] }
@@ -37,9 +37,9 @@ geo = { workspace = true, optional = true }
3737
geo-traits = { workspace = true, optional = true }
3838
geo-types = { workspace = true, optional = true }
3939
geoarrow-array = { workspace = true, optional = true }
40-
geoarrow-geoparquet = { workspace = true, optional = true }
4140
geoarrow-schema = { workspace = true, optional = true }
4241
geojson.workspace = true
42+
geoparquet = { workspace = true, optional = true }
4343
indexmap.workspace = true
4444
log.workspace = true
4545
mime.workspace = true

crates/core/src/error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ pub enum Error {
1818
#[error("{0} is not enabled")]
1919
FeatureNotEnabled(&'static str),
2020

21-
/// [geoarrow_array::error::GeoArrowError]
21+
/// [geoarrow_schema::error::GeoArrowError]
2222
#[error(transparent)]
2323
#[cfg(feature = "geoarrow")]
24-
GeoArrow(#[from] geoarrow_array::error::GeoArrowError),
24+
GeoArrow(#[from] geoarrow_schema::error::GeoArrowError),
2525

2626
/// [geojson::Error]
2727
#[error(transparent)]

crates/core/src/geoarrow/json.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ const TOP_LEVEL_KEYS: [&str; 10] = [
3939
];
4040

4141
use crate::Error;
42-
use arrow_array::RecordBatchReader;
43-
use arrow_array::{cast::*, types::*, *};
42+
use arrow_array::{RecordBatchReader, cast::*, types::*, *};
4443
use arrow_cast::display::{ArrayFormatter, FormatOptions};
4544
use arrow_json::JsonSerializable;
4645
use arrow_schema::*;
@@ -49,9 +48,10 @@ use geo_traits::to_geo::{
4948
ToGeoGeometry, ToGeoGeometryCollection, ToGeoLineString, ToGeoMultiLineString, ToGeoMultiPoint,
5049
ToGeoMultiPolygon, ToGeoPoint, ToGeoPolygon, ToGeoRect,
5150
};
52-
use geoarrow_array::array::from_arrow_array;
53-
use geoarrow_array::cast::AsGeoArrowArray;
54-
use geoarrow_array::{ArrayAccessor, GeoArrowArray, GeoArrowType};
51+
use geoarrow_array::{
52+
GeoArrowArray, GeoArrowArrayAccessor, array::from_arrow_array, cast::AsGeoArrowArray,
53+
};
54+
use geoarrow_schema::GeoArrowType;
5555
use serde_json::{Value, json, map::Map as JsonMap};
5656
use std::{iter, sync::Arc};
5757

@@ -469,6 +469,8 @@ fn set_geometry_column_for_json_rows(
469469
LargeWkb(_) => geojson::Value::from(&array.as_wkb::<i64>().value(i)?.to_geometry()),
470470
Wkt(_) => geojson::Value::from(&array.as_wkt::<i32>().value(i)?.to_geometry()),
471471
LargeWkt(_) => geojson::Value::from(&array.as_wkt::<i64>().value(i)?.to_geometry()),
472+
WktView(_) => geojson::Value::from(&array.as_wkt_view().value(i)?.to_geometry()),
473+
WkbView(_) => geojson::Value::from(&array.as_wkb_view().value(i)?.to_geometry()),
472474
};
473475
let _ = row.insert(
474476
col_name.to_string(),

crates/core/src/geoarrow/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ use arrow_json::ReaderBuilder;
88
use arrow_schema::{DataType, Field, SchemaBuilder, SchemaRef, TimeUnit};
99
use geo_types::Geometry;
1010
use geoarrow_array::{
11-
GeoArrowArray, GeoArrowType,
11+
GeoArrowArray,
1212
array::{WkbArray, from_arrow_array},
1313
builder::GeometryBuilder,
1414
};
15-
use geoarrow_schema::{CoordType, GeometryType, Metadata};
15+
use geoarrow_schema::{CoordType, GeoArrowType, GeometryType, Metadata};
1616
use serde_json::{Value, json};
1717
use std::{collections::HashMap, sync::Arc};
1818

@@ -322,7 +322,7 @@ pub fn add_wkb_metadata(mut record_batch: RecordBatch, column_name: &str) -> Res
322322
mod tests {
323323
use super::Table;
324324
use crate::{Item, ItemCollection};
325-
use geoarrow_geoparquet::GeoParquetRecordBatchReaderBuilder;
325+
use geoparquet::GeoParquetRecordBatchReaderBuilder;
326326
use std::fs::File;
327327

328328
#[test]

crates/core/src/geoparquet.rs

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
geoarrow::{Table, VERSION, VERSION_KEY},
66
};
77
use bytes::Bytes;
8-
use geoarrow_geoparquet::{GeoParquetRecordBatchReaderBuilder, GeoParquetWriterOptions};
8+
use geoparquet::{GeoParquetRecordBatchReaderBuilder, GeoParquetWriterOptions};
99
use parquet::{
1010
file::{properties::WriterProperties, reader::ChunkReader},
1111
format::KeyValue,
@@ -53,7 +53,7 @@ pub fn into_writer<W>(writer: W, item_collection: impl Into<ItemCollection>) ->
5353
where
5454
W: Write + Send,
5555
{
56-
into_writer_with_options(writer, item_collection, &Default::default())
56+
into_writer_with_options(writer, item_collection, Default::default())
5757
}
5858

5959
/// Writes a [ItemCollection] to a [std::io::Write] as
@@ -89,7 +89,7 @@ where
8989
}]))
9090
.build();
9191
options.writer_properties = Some(writer_properties);
92-
into_writer_with_options(writer, item_collection, &options)
92+
into_writer_with_options(writer, item_collection, options)
9393
}
9494

9595
/// Writes a [ItemCollection] to a [std::io::Write] as
@@ -103,18 +103,25 @@ where
103103
///
104104
/// let item: Item = stac::read("examples/simple-item.json").unwrap();
105105
/// let mut cursor = Cursor::new(Vec::new());
106-
/// stac::geoparquet::into_writer_with_options(&mut cursor, vec![item], &Default::default()).unwrap();
106+
/// stac::geoparquet::into_writer_with_options(&mut cursor, vec![item], Default::default()).unwrap();
107107
/// ```
108108
pub fn into_writer_with_options<W>(
109109
writer: W,
110110
item_collection: impl Into<ItemCollection>,
111-
options: &GeoParquetWriterOptions,
111+
mut options: GeoParquetWriterOptions,
112112
) -> Result<()>
113113
where
114114
W: Write + Send,
115115
{
116+
if let Some(primary_column) = options.primary_column.as_deref() {
117+
if primary_column != "geometry" {
118+
log::warn!("primary column not set to 'geometry'");
119+
}
120+
} else {
121+
options.primary_column = Some("geometry".to_string());
122+
}
116123
let table = Table::from_item_collection(item_collection)?;
117-
geoarrow_geoparquet::write_geoparquet(Box::new(table.into_reader()), writer, options)?;
124+
geoparquet::write_geoparquet(Box::new(table.into_reader()), writer, &options)?;
118125
Ok(())
119126
}
120127
/// Create a STAC object from geoparquet data.
@@ -255,6 +262,7 @@ impl IntoGeoparquet for serde_json::Value {
255262
mod tests {
256263
use crate::{FromGeoparquet, Item, ItemCollection, SelfHref, Value};
257264
use bytes::Bytes;
265+
use parquet::file::reader::{FileReader, SerializedFileReader};
258266
use std::{
259267
fs::File,
260268
io::{Cursor, Read},
@@ -296,6 +304,27 @@ mod tests {
296304
assert_eq!(item_collection.items.len(), 2);
297305
}
298306

307+
#[test]
308+
fn geometry_primary_column() {
309+
// https://github.com/stac-utils/rustac/issues/755
310+
let item_collection: ItemCollection = crate::read("data/multi-polygons.json").unwrap();
311+
let mut cursor = Cursor::new(Vec::new());
312+
super::into_writer(&mut cursor, item_collection).unwrap();
313+
let bytes = Bytes::from(cursor.into_inner());
314+
let reader = SerializedFileReader::new(bytes).unwrap();
315+
let key_value = reader
316+
.metadata()
317+
.file_metadata()
318+
.key_value_metadata()
319+
.unwrap()
320+
.into_iter()
321+
.find(|key_value| key_value.key == "geo")
322+
.unwrap();
323+
let value: serde_json::Value =
324+
serde_json::from_str(key_value.value.as_deref().unwrap()).unwrap();
325+
assert_eq!(value["primary_column"], "geometry");
326+
}
327+
299328
#[test]
300329
fn from_bytes() {
301330
let mut buf = Vec::new();

crates/duckdb/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ chrono.workspace = true
2121
cql2.workspace = true
2222
duckdb.workspace = true
2323
geo.workspace = true
24-
geoarrow-array = { workspace = true }
24+
geoarrow-schema = { workspace = true }
2525
geojson.workspace = true
2626
getrandom.workspace = true
2727
log.workspace = true

crates/duckdb/src/error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ pub enum Error {
1616
#[error(transparent)]
1717
DuckDB(#[from] duckdb::Error),
1818

19-
/// [geoarrow_array::error::GeoArrowError]
19+
/// [geoarrow_schema::error::GeoArrowError]
2020
#[error(transparent)]
21-
GeoArrow(#[from] geoarrow_array::error::GeoArrowError),
21+
GeoArrow(#[from] geoarrow_schema::error::GeoArrowError),
2222

2323
/// [serde_json::Error]
2424
#[error(transparent)]

0 commit comments

Comments
 (0)