def mask_by_query(rast, query, invert=False, nodata=-9999):
'''
Mask pixels (across bands) that match a query in any one band or all bands.
For example: `query = rast[1,...] < -25` queries those pixels with a value
less than -25 in band 2; these pixels would be masked (if `invert=False`).
By default, the pixels that are queried are masked, but if `invert=True`,
the query serves to select pixels NOT to be masked (`np.invert()` can also
be called on the query before calling this function to achieve the same
effect). Arguments:
rast A gdal.Dataset or numpy.array instance
query A NumPy boolean array representing the result of a query
invert True to invert the query
nodata The NoData value to apply in the masking
'''
# Can accept either a gdal.Dataset or numpy.array instance
if not isinstance(rast, np.ndarray):
rastr = rast.ReadAsArray()
else:
rastr = rast.copy()
shp = rastr.shape
if query.shape != rastr.shape:
assert len(query.shape) == 2 or len(query.shape) == len(shp), 'Query must either be 2-dimensional (single-band) or have a dimensionality equal to the raster array'
assert shp[-2] == query.shape[-2] and shp[-1] == query.shape[-1], 'Raster and query must be conformable arrays in two dimensions (must have the same extent)'
# Transform the query into a 1-band array and then into a multi-band array
query = query.reshape((1, shp[-2], shp[-1])).repeat(shp[0], axis=0)
# Mask out areas that match the query
if invert:
rastr[np.invert(query)] = nodata
else:
rastr[query] = nodata
return rastr
评论列表
文章目录