@@ -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
@@ -347,7 +339,7 @@ def compute_mpas_transect_masks(
347339 polygons , nPolygons , duplicatePolygons = _get_polygons (
348340 dsMesh , maskType
349341 )
350- transectNames , masks , properties , nChar , shapes = (
342+ transectNames , masks , properties , nchar , shapes = (
351343 _compute_transect_masks (
352344 fcMask ,
353345 polygons ,
@@ -396,22 +388,14 @@ def compute_mpas_transect_masks(
396388 _compute_edge_sign (dsMesh , mask , shapes [index ])
397389 )
398390
399- if 'transectNames' not in dsMasks :
400- # create a new data array for mask names
401- dsMasks ['transectNames' ] = (
402- ('nTransects' ,),
403- numpy .zeros ((nTransects ,), dtype = f'|S{ nChar } ' ),
404- )
405-
406- for index in range (nTransects ):
407- dsMasks ['transectNames' ][index ] = transectNames [index ]
391+ properties ['transectNames' ] = transectNames
392+ _add_properties (
393+ ds = dsMasks ,
394+ properties = properties ,
395+ dim = 'nTransects' ,
396+ nchar = nchar ,
397+ )
408398
409- for propertyName in properties :
410- if propertyName not in dsMasks :
411- dsMasks [propertyName ] = (
412- ('nTransects' ,),
413- properties [propertyName ],
414- )
415399 if logger is not None :
416400 logger .info (' Done.' )
417401
@@ -739,7 +723,7 @@ def compute_lon_lat_region_masks(
739723
740724 # create shapely geometry for lon and lat
741725 points = [shapely .geometry .Point (x , y ) for x , y in zip (Lon , Lat )]
742- regionNames , masks , properties , nChar = _compute_region_masks (
726+ regionNames , masks , properties , nchar = _compute_region_masks (
743727 fcMask ,
744728 points ,
745729 logger ,
@@ -768,18 +752,14 @@ def compute_lon_lat_region_masks(
768752 mask .reshape (shape ), dtype = numpy .int32
769753 )
770754
771- # create a new data array for mask names
772- dsMasks ['regionNames' ] = (
773- ('nRegions' ,),
774- numpy .zeros ((nRegions ,), dtype = f'|S{ nChar } ' ),
755+ properties ['regionNames' ] = regionNames
756+ _add_properties (
757+ ds = dsMasks ,
758+ properties = properties ,
759+ dim = 'nRegions' ,
760+ nchar = nchar ,
775761 )
776762
777- for index in range (nRegions ):
778- dsMasks ['regionNames' ][index ] = regionNames [index ]
779-
780- for propertyName in properties :
781- if propertyName not in dsMasks :
782- dsMasks [propertyName ] = (('nRegions' ,), properties [propertyName ])
783763 if logger is not None :
784764 logger .info (' Done.' )
785765
@@ -979,7 +959,7 @@ def compute_projection_grid_region_masks(
979959 points = [
980960 shapely .geometry .Point (x , y ) for x , y in zip (lon .ravel (), lat .ravel ())
981961 ]
982- regionNames , masks , properties , nChar = _compute_region_masks (
962+ regionNames , masks , properties , nchar = _compute_region_masks (
983963 fcMask ,
984964 points ,
985965 logger ,
@@ -1005,18 +985,14 @@ def compute_projection_grid_region_masks(
1005985 mask .reshape ((ny , nx )), dtype = numpy .int32
1006986 )
1007987
1008- # create a new data array for mask names
1009- dsMasks ['regionNames' ] = (
1010- ('nRegions' ,),
1011- numpy .zeros ((nRegions ,), dtype = f'|S{ nChar } ' ),
988+ properties ['regionNames' ] = regionNames
989+ _add_properties (
990+ ds = dsMasks ,
991+ properties = properties ,
992+ dim = 'nRegions' ,
993+ nchar = nchar ,
1012994 )
1013995
1014- for index in range (nRegions ):
1015- dsMasks ['regionNames' ][index ] = regionNames [index ]
1016-
1017- for propertyName in properties :
1018- if propertyName not in dsMasks :
1019- dsMasks [propertyName ] = (('nRegions' ,), properties [propertyName ])
1020996 if logger is not None :
1021997 logger .info (' Done.' )
1022998
@@ -1195,6 +1171,24 @@ def _compute_mask_from_shapes(
11951171 return mask
11961172
11971173
1174+ def _add_properties (ds , properties , dim , nchar ):
1175+ """
1176+ Add properties to the dataset from a dictionary of properties
1177+ """
1178+ for name , prop_list in properties .items ():
1179+ if name not in ds :
1180+ if isinstance (prop_list [0 ], str ):
1181+ ds [name ] = (
1182+ (dim ,),
1183+ numpy .zeros ((len (prop_list ),), dtype = f'|S{ nchar } ' ),
1184+ )
1185+
1186+ for index , value in enumerate (prop_list ):
1187+ ds [name ][index ] = value
1188+ else :
1189+ ds [name ] = ((dim ,), properties [prop_list ])
1190+
1191+
11981192def _get_region_names_and_properties (fc ):
11991193 regionNames = []
12001194 for feature in fc .features :
@@ -1214,16 +1208,19 @@ def _get_region_names_and_properties(fc):
12141208 propertyNames .add (propertyName )
12151209
12161210 properties = {}
1211+ nchar = 0
12171212 for propertyName in propertyNames :
12181213 properties [propertyName ] = []
12191214 for feature in fc .features :
12201215 if propertyName in feature ['properties' ]:
12211216 propertyVal = feature ['properties' ][propertyName ]
12221217 properties [propertyName ].append (propertyVal )
1218+ if isinstance (propertyVal , str ):
1219+ nchar = max (nchar , len (propertyVal ))
12231220 else :
12241221 properties [propertyName ].append ('' )
12251222
1226- return regionNames , properties
1223+ return regionNames , properties , nchar
12271224
12281225
12291226def _compute_region_masks (
@@ -1234,11 +1231,10 @@ def _compute_region_masks(
12341231 a set of regions.
12351232 """
12361233
1237- regionNames , properties = _get_region_names_and_properties (fcMask )
1234+ regionNames , properties , nchar = _get_region_names_and_properties (fcMask )
12381235
12391236 masks = []
12401237
1241- nChar = 0
12421238 for feature in fcMask .features :
12431239 name = feature ['properties' ]['name' ]
12441240
@@ -1257,11 +1253,11 @@ def _compute_region_masks(
12571253 showProgress = showProgress ,
12581254 )
12591255
1260- nChar = max (nChar , len (name ))
1256+ nchar = max (nchar , len (name ))
12611257
12621258 masks .append (mask )
12631259
1264- return regionNames , masks , properties , nChar
1260+ return regionNames , masks , properties , nchar
12651261
12661262
12671263def _contains (shapes , points ):
@@ -1359,12 +1355,11 @@ def _compute_transect_masks(
13591355 a set of transects.
13601356 """
13611357
1362- transectNames , properties = _get_region_names_and_properties (fcMask )
1358+ transectNames , properties , nchar = _get_region_names_and_properties (fcMask )
13631359
13641360 masks = []
13651361 shapes = []
13661362
1367- nChar = 0
13681363 for feature in fcMask .features :
13691364 name = feature ['properties' ]['name' ]
13701365
@@ -1410,12 +1405,12 @@ def _compute_transect_masks(
14101405 showProgress = showProgress ,
14111406 )
14121407
1413- nChar = max (nChar , len (name ))
1408+ nchar = max (nchar , len (name ))
14141409
14151410 masks .append (mask )
14161411 shapes .append (shape )
14171412
1418- return transectNames , masks , properties , nChar , shapes
1413+ return transectNames , masks , properties , nchar , shapes
14191414
14201415
14211416def _intersects (shape , polygons ):
0 commit comments