Skip to content

Commit bdab0c6

Browse files
committed
Convert string properties to char strings in masking
1 parent c1911e3 commit bdab0c6

File tree

1 file changed

+58
-63
lines changed
  • conda_package/mpas_tools/mesh

1 file changed

+58
-63
lines changed

conda_package/mpas_tools/mesh/mask.py

Lines changed: 58 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
11781172
def _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

12091206
def _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

12471243
def _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

14011396
def _intersects(shape, polygons):

0 commit comments

Comments
 (0)