def create_raster_dataset(data, coords, projection=None, nodata=-9999):
""" Create In-Memory Raster Dataset
.. versionadded 0.10.0
Parameters
----------
data : :class:`numpy:numpy.ndarray`
Array of shape (rows, cols) or (bands, rows, cols) containing
the data values.
coords : :class:`numpy:numpy.ndarray`
Array of shape (rows, cols, 2) containing xy-coordinates.
projection : osr object
Spatial reference system of the used coordinates, defaults to None.
Returns
-------
dataset : gdal.Dataset
In-Memory raster dataset
Note
----
The origin of the provided data and coordinates is UPPER LEFT.
"""
# align data
data = data.copy()
if data.ndim == 2:
data = data[np.newaxis, ...]
bands, rows, cols = data.shape
# create In-Memory Raster with correct dtype
mem_drv = gdal.GetDriverByName('MEM')
gdal_type = gdal_array.NumericTypeCodeToGDALTypeCode(data.dtype)
dataset = mem_drv.Create('', cols, rows, bands, gdal_type)
# initialize geotransform
x_ps, y_ps = coords[1, 1] - coords[0, 0]
geotran = [coords[0, 0, 0], x_ps, 0, coords[0, 0, 1], 0, y_ps]
dataset.SetGeoTransform(geotran)
if projection:
dataset.SetProjection(projection.ExportToWkt())
# set np.nan to nodata
dataset.GetRasterBand(1).SetNoDataValue(nodata)
for i, band in enumerate(data, start=1):
dataset.GetRasterBand(i).WriteArray(band)
return dataset
评论列表
文章目录