33import pyarrow as _pa
44import pyarrow_hotfix as _ # noqa: F401
55import numpy as _np
6- from geoarrow .c import lib
6+ from geoarrow .types import TypeSpec , type_spec , Encoding
77import geoarrow .pyarrow as _ga
88
99
@@ -83,8 +83,7 @@ class GeoArrowExtensionArray(_pd.api.extensions.ExtensionArray):
8383 def __init__ (self , obj , type = None ):
8484 if type is not None :
8585 self ._dtype = GeoArrowExtensionDtype (type )
86- arrow_type = _ga .GeometryExtensionType ._from_ctype (self ._dtype ._parent )
87- self ._data = _ga .array (obj , arrow_type )
86+ self ._data = _ga .array (obj , self ._dtype ._parent )
8887 else :
8988 self ._data = _ga .array (obj )
9089 self ._dtype = GeoArrowExtensionDtype (self ._data .type )
@@ -247,8 +246,8 @@ def to_numpy(self, dtype=None, copy=False, na_value=None):
247246
248247 return _np .array (list (self ), dtype = object )
249248
250- def __array__ (self , dtype = None ):
251- return self .to_numpy (dtype = dtype )
249+ def __array__ (self , dtype = None , copy = True ):
250+ return self .to_numpy (dtype = dtype , copy = copy )
252251
253252
254253@_pd .api .extensions .register_extension_dtype
@@ -271,20 +270,20 @@ class GeoArrowExtensionDtype(_pd.api.extensions.ExtensionDtype):
271270
272271 def __init__ (self , parent ):
273272 if isinstance (parent , _ga .GeometryExtensionType ):
274- self ._parent = parent ._type
275- elif isinstance (parent , lib .CVectorType ):
276273 self ._parent = parent
274+ elif isinstance (parent , TypeSpec ):
275+ self ._parent = _ga .extension_type (parent )
277276 elif isinstance (parent , GeoArrowExtensionDtype ):
278277 self ._parent = parent ._parent
279278 else :
280279 raise TypeError (
281- "`geoarrow_type` must inherit from geoarrow. pyarrow.VectorType , "
282- "geoarrow.CVectorType , or geoarrow.pandas.GeoArrowExtensionDtype"
280+ "`geoarrow_type` must be a pyarrow extension type , "
281+ "geoarrow.types.TypeSpec , or geoarrow.pandas.GeoArrowExtensionDtype"
283282 )
284283
285284 @property
286285 def pyarrow_dtype (self ):
287- return _ga . GeometryExtensionType . _from_ctype ( self ._parent )
286+ return self ._parent
288287
289288 @property
290289 def type (self ):
@@ -323,9 +322,9 @@ def construct_from_string(cls, string):
323322 if params ["coord_type" ] == "[interleaved]" :
324323 coord_type = _ga .CoordType .INTERLEAVED
325324 elif params ["type" ] in ("wkt" , "wkb" ):
326- coord_type = _ga .CoordType .UNKNOWN
325+ coord_type = _ga .CoordType .UNSPECIFIED
327326 else :
328- coord_type = _ga .CoordType .SEPARATE
327+ coord_type = _ga .CoordType .SEPARATED
329328
330329 if params ["type" ] == "point" :
331330 geometry_type = _ga .GeometryType .POINT
@@ -347,7 +346,9 @@ def construct_from_string(cls, string):
347346 elif params ["type" ] == "wkt" :
348347 base_type = _ga .wkt ()
349348 else :
350- base_type = _ga .extension_type (geometry_type , dims , coord_type )
349+ base_type = _ga .extension_type (
350+ type_spec (Encoding .GEOARROW , geometry_type , dims , coord_type )
351+ )
351352
352353 try :
353354 if params ["metadata" ]:
@@ -368,7 +369,7 @@ def __str__(self):
368369 ext_name = self ._parent .extension_name
369370 ext_dims = self ._parent .dimensions
370371 ext_coord = self ._parent .coord_type
371- ext_meta = self ._parent .extension_metadata .decode ("UTF-8" )
372+ ext_meta = self ._parent .__arrow_ext_serialize__ () .decode ("UTF-8" )
372373
373374 if ext_dims == _ga .Dimensions .XYZ :
374375 dims_str = "[z]"
@@ -440,7 +441,14 @@ def _wrap_series(self, array_or_chunked):
440441 )
441442
442443 def _obj_is_geoarrow (self ):
443- return isinstance (self ._obj .dtype , GeoArrowExtensionDtype )
444+ if isinstance (self ._obj .dtype , GeoArrowExtensionDtype ):
445+ return True
446+
447+ if not isinstance (self ._obj .dtype , _pd .ArrowDtype ):
448+ return False
449+
450+ arrow_type = self ._obj .dtype .pyarrow_dtype
451+ return isinstance (arrow_type , _ga .GeometryExtensionType )
444452
445453 def parse_all (self ):
446454 """See :func:`geoarrow.pyarrow.parse_all`"""
@@ -529,9 +537,9 @@ def with_edge_type(self, edge_type):
529537 """See :func:`geoarrow.pyarrow.with_edge_type`"""
530538 return self ._wrap_series (_ga .with_edge_type (self ._obj , edge_type ))
531539
532- def with_crs (self , crs , crs_type = None ):
540+ def with_crs (self , crs ):
533541 """See :func:`geoarrow.pyarrow.with_crs`"""
534- return self ._wrap_series (_ga .with_crs (self ._obj , crs = crs , crs_type = crs_type ))
542+ return self ._wrap_series (_ga .with_crs (self ._obj , crs = crs ))
535543
536544 def with_dimensions (self , dimensions ):
537545 """See :func:`geoarrow.pyarrow.with_dimensions`"""
0 commit comments