@@ -459,11 +459,8 @@ def shapely_to_cf(
459
459
"and set the grid mapping variable as a coordinate" ,
460
460
)
461
461
462
- # Get all types to call the appropriate translation function.
463
- types = {
464
- geom .item ().geom_type if isinstance (geom , xr .DataArray ) else geom .geom_type
465
- for geom in geometries
466
- }
462
+ as_data = geometries .data if isinstance (geometries , xr .DataArray ) else geometries
463
+ type_ = as_data [0 ].geom_type
467
464
468
465
grid_mapping_varname = None
469
466
if (
@@ -482,16 +479,21 @@ def shapely_to_cf(
482
479
suffix = suffix , grid_mapping_name = grid_mapping , grid_mapping = grid_mapping_varname
483
480
)
484
481
485
- if types .issubset ({"Point" , "MultiPoint" }):
486
- ds = points_to_cf (geometries , names = names )
487
- elif types .issubset ({"LineString" , "MultiLineString" }):
488
- ds = lines_to_cf (geometries , names = names )
489
- elif types .issubset ({"Polygon" , "MultiPolygon" }):
490
- ds = polygons_to_cf (geometries , names = names )
491
- else :
482
+ try :
483
+ if type_ in ["Point" , "MultiPoint" ]:
484
+ ds = points_to_cf (geometries , names = names )
485
+ elif type_ in ["LineString" , "MultiLineString" ]:
486
+ ds = lines_to_cf (geometries , names = names )
487
+ elif type_ in ["Polygon" , "MultiPolygon" ]:
488
+ ds = polygons_to_cf (geometries , names = names )
489
+ else :
490
+ raise ValueError (
491
+ f"This geometry type is not supported in CF-compliant datasets. Got { type_ } "
492
+ )
493
+ except NotImplementedError as e :
492
494
raise ValueError (
493
- f"Mixed geometry types are not supported in CF-compliant datasets. Got { types } "
494
- )
495
+ "Error converting geometries. Possibly you have provided mixed geometry types. "
496
+ ) from e
495
497
496
498
return ds
497
499
@@ -841,7 +843,7 @@ def polygons_to_cf(
841
843
node_count = part_node_count
842
844
elif len (offsets ) >= 2 :
843
845
indices = np .take (offsets [0 ], offsets [1 ])
844
- interior_ring = np .isin (offsets [0 ], indices , invert = True )[:- 1 ].astype ( int )
846
+ interior_ring = np .isin (offsets [0 ], indices , invert = True )[:- 1 ].view ( np . int8 )
845
847
846
848
if len (offsets ) == 3 :
847
849
indices = np .take (indices , offsets [2 ])
0 commit comments