def reproject_tiff_custom(old_name, new_name, new_x_size, new_y_size,
new_geo_transform, new_projection, unit, mode):
"""
Reprojects an tiff with custom tiff arguments. Can be used to warp tiff.
If no projection is provided, fallback to old projection.
Keyword arguments:
old_name -- the name of the old tiff file
new_name -- the name of the output tiff file
new_x_size -- the number of new size in x dimension
new_y_size -- the number of new size in y dimension
new_geo_transform -- the new geo transform to apply
new_projection -- the new projection to use
unit -- the gdal unit in which the operation will be performed
mode -- the gdal mode used for warping
"""
mem_drv = gdal.GetDriverByName("MEM")
old = gdal.Open(old_name)
r = old.GetRasterBand(1)
r.GetNoDataValue()
# Adds 1 to keep the original zeros (reprojectImage maps NO_DATA to 0)
old_array = old.ReadAsArray()
mask = old_array == old.GetRasterBand(1).GetNoDataValue()
old_array += 1
old_array[mask] = 0
temp = mem_drv.Create("temp", old.RasterXSize, old.RasterYSize, 1, unit)
temp.SetGeoTransform(old.GetGeoTransform())
temp.SetProjection(old.GetProjection())
temp.GetRasterBand(1).WriteArray(old_array)
new = mem_drv.Create(new_name, new_x_size, new_y_size, 1, unit)
new.SetGeoTransform(new_geo_transform)
if new_projection is None:
new.SetProjection(old.GetProjection())
else:
new.SetProjection(new_projection)
res = gdal.ReprojectImage(temp, new, old.GetProjection(), new_projection,
mode)
assert res == 0, 'Error in ReprojectImage'
arr = new.ReadAsArray()
mask = arr != 0
arr -= 1
arr[~mask] = 0
new = None
temp = None
return arr, mask
评论列表
文章目录