@@ -328,22 +328,22 @@ def lines_to_cf(lines: xr.DataArray | Sequence):
328
328
x = arr [:, 0 ]
329
329
y = arr [:, 1 ]
330
330
331
- node_count = np .diff (offsets [0 ])
331
+ part_node_count = np .diff (offsets [0 ])
332
332
if len (offsets ) == 1 :
333
333
indices = offsets [0 ]
334
- part_node_count = node_count
334
+ node_count = part_node_count
335
335
else :
336
336
indices = np .take (offsets [0 ], offsets [1 ])
337
- part_node_count = np .diff (indices )
337
+ node_count = np .diff (indices )
338
338
339
339
geom_coords = arr .take (indices [:- 1 ], 0 )
340
340
crdX = geom_coords [:, 0 ]
341
341
crdY = geom_coords [:, 1 ]
342
342
343
343
ds = xr .Dataset (
344
344
data_vars = {
345
- "node_count" : xr .DataArray (node_count , dims = ("segment" ,)),
346
- "part_node_count" : xr .DataArray (part_node_count , dims = (dim ,)),
345
+ "node_count" : xr .DataArray (node_count , dims = (dim ,)),
346
+ "part_node_count" : xr .DataArray (part_node_count , dims = ("part" ,)),
347
347
"geometry_container" : xr .DataArray (
348
348
attrs = {
349
349
"geometry_type" : "line" ,
@@ -394,7 +394,7 @@ def cf_to_lines(ds: xr.Dataset):
394
394
# Shorthand for convenience
395
395
geo = ds .geometry_container .attrs
396
396
397
- # The features dimension name, defaults to the one of 'part_node_count '
397
+ # The features dimension name, defaults to the one of 'node_count '
398
398
# or the dimension of the coordinates, if present.
399
399
feat_dim = None
400
400
if "coordinates" in geo :
@@ -405,36 +405,28 @@ def cf_to_lines(ds: xr.Dataset):
405
405
xy = np .stack ([ds [x_name ].values , ds [y_name ].values ], axis = - 1 )
406
406
407
407
node_count_name = geo .get ("node_count" )
408
- part_node_count_name = geo .get ("part_node_count" )
408
+ part_node_count_name = geo .get ("part_node_count" , node_count_name )
409
409
if node_count_name is None :
410
410
raise ValueError ("'node_count' must be provided for line geometries" )
411
411
else :
412
412
node_count = ds [node_count_name ]
413
+ feat_dim = feat_dim or "index"
414
+ if feat_dim in ds .coords :
415
+ node_count = node_count .assign_coords ({feat_dim : ds [feat_dim ]})
413
416
414
- offset1 = np .insert (np .cumsum (node_count .values ), 0 , 0 )
417
+ # first get geometries for all the parts
418
+ part_node_count = ds [part_node_count_name ]
419
+ offset1 = np .insert (np .cumsum (part_node_count .values ), 0 , 0 )
415
420
lines = from_ragged_array (GeometryType .LINESTRING , xy , offsets = (offset1 ,))
416
421
417
- if part_node_count_name is None :
418
- # No part_node_count means there are no multilines
419
- # And if we had no coordinates, then the dimension defaults to "index"
420
- feat_dim = feat_dim or "index"
421
- part_node_count = xr .DataArray (node_count .values , dims = (feat_dim ,))
422
- if feat_dim in ds .coords :
423
- part_node_count = part_node_count .assign_coords ({feat_dim : ds [feat_dim ]})
422
+ # get index of offset2 values that are edges for part_node_count
423
+ offset2 = np .nonzero (np .isin (offset1 , np .insert (np .cumsum (node_count ), 0 , 0 )))[0 ]
424
424
425
- geoms = lines
426
- else :
427
- part_node_count = ds [part_node_count_name ]
428
-
429
- # get index of offset1 values that are edges for part_node_count
430
- offset2 = np .nonzero (
431
- np .isin (offset1 , np .insert (np .cumsum (part_node_count ), 0 , 0 ))
432
- )[0 ]
433
- multilines = from_ragged_array (
434
- GeometryType .MULTILINESTRING , xy , offsets = (offset1 , offset2 )
435
- )
425
+ multilines = from_ragged_array (
426
+ GeometryType .MULTILINESTRING , xy , offsets = (offset1 , offset2 )
427
+ )
436
428
437
- # get items from lines or multilines depending on number of segments
438
- geoms = np .where (np .diff (offset2 ) == 1 , lines [offset2 [:- 1 ]], multilines )
429
+ # get items from lines or multilines depending on number of parts
430
+ geoms = np .where (np .diff (offset2 ) == 1 , lines [offset2 [:- 1 ]], multilines )
439
431
440
- return xr .DataArray (geoms , dims = part_node_count .dims , coords = part_node_count .coords )
432
+ return xr .DataArray (geoms , dims = node_count .dims , coords = node_count .coords )
0 commit comments