@@ -20,6 +20,9 @@ use crate::{
2020 schema:: { DecimalDataType , DecimalSize } ,
2121} ;
2222
23+ use geozero:: wkb:: FromWkb ;
24+ use geozero:: wkb:: WkbDialect ;
25+ use geozero:: wkt:: Ewkt ;
2326use std:: fmt:: Write ;
2427
2528// Thu 1970-01-01 is R.D. 719163
@@ -30,7 +33,7 @@ const NULL_VALUE: &str = "NULL";
3033use {
3134 crate :: schema:: {
3235 ARROW_EXT_TYPE_BITMAP , ARROW_EXT_TYPE_EMPTY_ARRAY , ARROW_EXT_TYPE_EMPTY_MAP ,
33- ARROW_EXT_TYPE_VARIANT , EXTENSION_KEY ,
36+ ARROW_EXT_TYPE_GEOMETRY , ARROW_EXT_TYPE_VARIANT , EXTENSION_KEY ,
3437 } ,
3538 arrow_array:: {
3639 Array as ArrowArray , BinaryArray , BooleanArray , Date32Array , Decimal128Array ,
@@ -77,6 +80,7 @@ pub enum Value {
7780 Tuple ( Vec < Value > ) ,
7881 Bitmap ( String ) ,
7982 Variant ( String ) ,
83+ Geometry ( String ) ,
8084}
8185
8286impl Value {
@@ -126,6 +130,7 @@ impl Value {
126130 }
127131 Self :: Bitmap ( _) => DataType :: Bitmap ,
128132 Self :: Variant ( _) => DataType :: Variant ,
133+ Self :: Geometry ( _) => DataType :: Geometry ,
129134 }
130135 }
131136}
@@ -191,6 +196,7 @@ impl TryFrom<(&DataType, &str)> for Value {
191196 ) ) ,
192197 DataType :: Bitmap => Ok ( Self :: Bitmap ( v. to_string ( ) ) ) ,
193198 DataType :: Variant => Ok ( Self :: Variant ( v. to_string ( ) ) ) ,
199+ DataType :: Geometry => Ok ( Self :: Geometry ( v. to_string ( ) ) ) ,
194200
195201 DataType :: Nullable ( inner) => {
196202 if v == NULL_VALUE {
@@ -244,6 +250,18 @@ impl TryFrom<(&ArrowField, &Arc<dyn ArrowArray>, usize)> for Value {
244250 None => Err ( ConvertError :: new ( "bitmap" , format ! ( "{:?}" , array) ) . into ( ) ) ,
245251 } ;
246252 }
253+ ARROW_EXT_TYPE_GEOMETRY => {
254+ if field. is_nullable ( ) && array. is_null ( seq) {
255+ return Ok ( Value :: Null ) ;
256+ }
257+ return match array. as_any ( ) . downcast_ref :: < LargeBinaryArray > ( ) {
258+ Some ( array) => {
259+ let wkt = parse_geometry ( array. value ( seq) ) ?;
260+ Ok ( Value :: Geometry ( wkt) )
261+ }
262+ None => Err ( ConvertError :: new ( "geometry" , format ! ( "{:?}" , array) ) . into ( ) ) ,
263+ } ;
264+ }
247265 _ => {
248266 return Err ( ConvertError :: new (
249267 "extension" ,
@@ -605,7 +623,7 @@ fn encode_value(f: &mut std::fmt::Formatter<'_>, val: &Value, raw: bool) -> std:
605623 Value :: Boolean ( b) => write ! ( f, "{}" , b) ,
606624 Value :: Number ( n) => write ! ( f, "{}" , n) ,
607625 Value :: Binary ( s) => write ! ( f, "{}" , hex:: encode_upper( s) ) ,
608- Value :: String ( s) | Value :: Bitmap ( s) | Value :: Variant ( s) => {
626+ Value :: String ( s) | Value :: Bitmap ( s) | Value :: Variant ( s) | Value :: Geometry ( s ) => {
609627 if raw {
610628 write ! ( f, "{}" , s)
611629 } else {
@@ -800,3 +818,9 @@ pub fn parse_decimal(text: &str, size: DecimalSize) -> Result<NumberValue> {
800818 }
801819 }
802820}
821+
822+ pub fn parse_geometry ( raw_data : & [ u8 ] ) -> Result < String > {
823+ let mut data = std:: io:: Cursor :: new ( raw_data) ;
824+ let wkt = Ewkt :: from_wkb ( & mut data, WkbDialect :: Ewkb ) ;
825+ wkt. map ( |g| g. 0 ) . map_err ( |e| e. into ( ) )
826+ }
0 commit comments