@@ -100,7 +100,7 @@ def compute_mpas_region_masks(
100100
101101 # create shapely geometry for lon and lat
102102 points = [shapely .geometry .Point (x , y ) for x , y in zip (lon , lat )]
103- regionNames , masks , properties , nChar = _compute_region_masks (
103+ regionNames , masks , properties , nchar = _compute_region_masks (
104104 fcMask ,
105105 points ,
106106 logger ,
@@ -128,22 +128,14 @@ def compute_mpas_region_masks(
128128 mask , dtype = numpy .int32
129129 )
130130
131- if 'regionNames' not in dsMasks :
132- # create a new data array for mask names
133- dsMasks ['regionNames' ] = (
134- ('nRegions' ,),
135- numpy .zeros ((nRegions ,), dtype = f'|S{ nChar } ' ),
136- )
137-
138- for index in range (nRegions ):
139- dsMasks ['regionNames' ][index ] = regionNames [index ]
131+ properties ['regionNames' ] = regionNames
132+ _add_properties (
133+ ds = dsMasks ,
134+ properties = properties ,
135+ dim = 'nRegions' ,
136+ nchar = nchar ,
137+ )
140138
141- for propertyName in properties :
142- if propertyName not in dsMasks :
143- dsMasks [propertyName ] = (
144- ('nRegions' ,),
145- properties [propertyName ],
146- )
147139 if logger is not None :
148140 logger .info (' Done.' )
149141
@@ -343,7 +335,7 @@ def compute_mpas_transect_masks(
343335 polygons , nPolygons , duplicatePolygons = _get_polygons (
344336 dsMesh , maskType
345337 )
346- transectNames , masks , properties , nChar , shapes = (
338+ transectNames , masks , properties , nchar , shapes = (
347339 _compute_transect_masks (
348340 fcMask ,
349341 polygons ,
@@ -392,22 +384,14 @@ def compute_mpas_transect_masks(
392384 _compute_edge_sign (dsMesh , mask , shapes [index ])
393385 )
394386
395- if 'transectNames' not in dsMasks :
396- # create a new data array for mask names
397- dsMasks ['transectNames' ] = (
398- ('nTransects' ,),
399- numpy .zeros ((nTransects ,), dtype = f'|S{ nChar } ' ),
400- )
401-
402- for index in range (nTransects ):
403- dsMasks ['transectNames' ][index ] = transectNames [index ]
387+ properties ['transectNames' ] = transectNames
388+ _add_properties (
389+ ds = dsMasks ,
390+ properties = properties ,
391+ dim = 'nTransects' ,
392+ nchar = nchar ,
393+ )
404394
405- for propertyName in properties :
406- if propertyName not in dsMasks :
407- dsMasks [propertyName ] = (
408- ('nTransects' ,),
409- properties [propertyName ],
410- )
411395 if logger is not None :
412396 logger .info (' Done.' )
413397
@@ -727,7 +711,7 @@ def compute_lon_lat_region_masks(
727711
728712 # create shapely geometry for lon and lat
729713 points = [shapely .geometry .Point (x , y ) for x , y in zip (Lon , Lat )]
730- regionNames , masks , properties , nChar = _compute_region_masks (
714+ regionNames , masks , properties , nchar = _compute_region_masks (
731715 fcMask ,
732716 points ,
733717 logger ,
@@ -756,18 +740,14 @@ def compute_lon_lat_region_masks(
756740 mask .reshape (shape ), dtype = numpy .int32
757741 )
758742
759- # create a new data array for mask names
760- dsMasks ['regionNames' ] = (
761- ('nRegions' ,),
762- numpy .zeros ((nRegions ,), dtype = f'|S{ nChar } ' ),
743+ properties ['regionNames' ] = regionNames
744+ _add_properties (
745+ ds = dsMasks ,
746+ properties = properties ,
747+ dim = 'nRegions' ,
748+ nchar = nchar ,
763749 )
764750
765- for index in range (nRegions ):
766- dsMasks ['regionNames' ][index ] = regionNames [index ]
767-
768- for propertyName in properties :
769- if propertyName not in dsMasks :
770- dsMasks [propertyName ] = (('nRegions' ,), properties [propertyName ])
771751 if logger is not None :
772752 logger .info (' Done.' )
773753
@@ -963,7 +943,7 @@ def compute_projection_grid_region_masks(
963943 points = [
964944 shapely .geometry .Point (x , y ) for x , y in zip (lon .ravel (), lat .ravel ())
965945 ]
966- regionNames , masks , properties , nChar = _compute_region_masks (
946+ regionNames , masks , properties , nchar = _compute_region_masks (
967947 fcMask ,
968948 points ,
969949 logger ,
@@ -989,18 +969,14 @@ def compute_projection_grid_region_masks(
989969 mask .reshape ((ny , nx )), dtype = numpy .int32
990970 )
991971
992- # create a new data array for mask names
993- dsMasks ['regionNames' ] = (
994- ('nRegions' ,),
995- numpy .zeros ((nRegions ,), dtype = f'|S{ nChar } ' ),
972+ properties ['regionNames' ] = regionNames
973+ _add_properties (
974+ ds = dsMasks ,
975+ properties = properties ,
976+ dim = 'nRegions' ,
977+ nchar = nchar ,
996978 )
997979
998- for index in range (nRegions ):
999- dsMasks ['regionNames' ][index ] = regionNames [index ]
1000-
1001- for propertyName in properties :
1002- if propertyName not in dsMasks :
1003- dsMasks [propertyName ] = (('nRegions' ,), properties [propertyName ])
1004980 if logger is not None :
1005981 logger .info (' Done.' )
1006982
@@ -1175,6 +1151,24 @@ def _compute_mask_from_shapes(
11751151 return mask
11761152
11771153
1154+ def _add_properties (ds , properties , dim , nchar ):
1155+ """
1156+ Add properties to the dataset from a dictionary of properties
1157+ """
1158+ for name , prop_list in properties .items ():
1159+ if name not in ds :
1160+ if isinstance (prop_list [0 ], str ):
1161+ ds [name ] = (
1162+ (dim ,),
1163+ numpy .zeros ((len (prop_list ),), dtype = f'|S{ nchar } ' ),
1164+ )
1165+
1166+ for index , value in enumerate (prop_list ):
1167+ ds [name ][index ] = value
1168+ else :
1169+ ds [name ] = ((dim ,), properties [prop_list ])
1170+
1171+
11781172def _get_region_names_and_properties (fc ):
11791173 regionNames = []
11801174 for feature in fc .features :
@@ -1194,16 +1188,19 @@ def _get_region_names_and_properties(fc):
11941188 propertyNames .add (propertyName )
11951189
11961190 properties = {}
1191+ nchar = 0
11971192 for propertyName in propertyNames :
11981193 properties [propertyName ] = []
11991194 for feature in fc .features :
12001195 if propertyName in feature ['properties' ]:
12011196 propertyVal = feature ['properties' ][propertyName ]
12021197 properties [propertyName ].append (propertyVal )
1198+ if isinstance (propertyVal , str ):
1199+ nchar = max (nchar , len (propertyVal ))
12031200 else :
12041201 properties [propertyName ].append ('' )
12051202
1206- return regionNames , properties
1203+ return regionNames , properties , nchar
12071204
12081205
12091206def _compute_region_masks (
@@ -1214,11 +1211,10 @@ def _compute_region_masks(
12141211 a set of regions.
12151212 """
12161213
1217- regionNames , properties = _get_region_names_and_properties (fcMask )
1214+ regionNames , properties , nchar = _get_region_names_and_properties (fcMask )
12181215
12191216 masks = []
12201217
1221- nChar = 0
12221218 for feature in fcMask .features :
12231219 name = feature ['properties' ]['name' ]
12241220
@@ -1237,11 +1233,11 @@ def _compute_region_masks(
12371233 showProgress = showProgress ,
12381234 )
12391235
1240- nChar = max (nChar , len (name ))
1236+ nchar = max (nchar , len (name ))
12411237
12421238 masks .append (mask )
12431239
1244- return regionNames , masks , properties , nChar
1240+ return regionNames , masks , properties , nchar
12451241
12461242
12471243def _contains (shapes , points ):
@@ -1339,12 +1335,11 @@ def _compute_transect_masks(
13391335 a set of transects.
13401336 """
13411337
1342- transectNames , properties = _get_region_names_and_properties (fcMask )
1338+ transectNames , properties , nchar = _get_region_names_and_properties (fcMask )
13431339
13441340 masks = []
13451341 shapes = []
13461342
1347- nChar = 0
13481343 for feature in fcMask .features :
13491344 name = feature ['properties' ]['name' ]
13501345
@@ -1390,12 +1385,12 @@ def _compute_transect_masks(
13901385 showProgress = showProgress ,
13911386 )
13921387
1393- nChar = max (nChar , len (name ))
1388+ nchar = max (nchar , len (name ))
13941389
13951390 masks .append (mask )
13961391 shapes .append (shape )
13971392
1398- return transectNames , masks , properties , nChar , shapes
1393+ return transectNames , masks , properties , nchar , shapes
13991394
14001395
14011396def _intersects (shape , polygons ):
0 commit comments