Создание многоспектрального изображения с нуля

10

Я хочу сделать многоспектральное изображение из Cero, чтобы сделать некоторые тесты на нем. Нечто очень простое, например, 5 абсолютно однородных полос с шумом соли и перца или квадрат разных значений в центре. Понятно, что это просто стек матриц, многомерный массив, который довольно просто генерировать. Я хочу добиться этого, используя python и gdal, но gdal довольно герметичен, я совсем не разбираюсь в этом. В идеале я хотел бы создать файл геотифов. Может ли кто-нибудь помочь мне в этом? какие-то указатели или какой-то учебник GDAL, который очень нежный? Спасибо вам всем.

JEquihua
источник

Ответы:

15

Вам нужен метод gdal.band.WriteArray. В учебнике по GDAL API есть пример (воспроизведенный ниже):

format = "GTiff"
driver = gdal.GetDriverByName( format )
dst_ds = driver.Create( dst_filename, 512, 512, 1, gdal.GDT_Byte )
dst_ds.SetGeoTransform( [ 444720, 30, 0, 3751320, 0, -30 ] )

srs = osr.SpatialReference()
srs.SetUTM( 11, 1 )
srs.SetWellKnownGeogCS( 'NAD27' )
dst_ds.SetProjection( srs.ExportToWkt() )

raster = numpy.zeros( (512, 512), dtype=numpy.uint8 )    
dst_ds.GetRasterBand(1).WriteArray( raster )

# Once we're done, close properly the dataset
dst_ds = None

Для генерации случайных данных, посмотрите на модуль numpy.random .

Вот более полный рабочий пример:

from osgeo import gdal, osr
import numpy

dst_filename = '/tmp/test.tif'
#output to special GDAL "in memory" (/vsimem) path just for testing
#dst_filename = '/vsimem/test.tif'

#Raster size
nrows=1024
ncols=512
nbands=7

#min & max random values of the output raster
zmin=0
zmax=12345

## See http://gdal.org/python/osgeo.gdal_array-module.html#codes
## for mapping between gdal and numpy data types
gdal_datatype = gdal.GDT_UInt16
np_datatype = numpy.uint16

driver = gdal.GetDriverByName( "GTiff" )
dst_ds = driver.Create( dst_filename, ncols, nrows, nbands, gdal_datatype )

## These are only required if you wish to georeference (http://en.wikipedia.org/wiki/Georeference)
## your output geotiff, you need to know what values to input, don't just use the ones below
#Coordinates of the upper left corner of the image
#in same units as spatial reference
#xmin=147.2  
#ymax=-34.54

#Cellsize in same units as spatial reference
#cellsize=0.01

#dst_ds.SetGeoTransform( [ xmin, cellsize, 0, ymax, 0, -cellsize ] )
#srs = osr.SpatialReference()
#srs.SetWellKnownGeogCS("WGS84")
#dst_ds.SetProjection( srs.ExportToWkt() )

raster = numpy.random.randint(zmin,zmax, (nbands, nrows, ncols)).astype(np_datatype )  
for band in range(nbands):
    dst_ds.GetRasterBand(band+1).WriteArray( raster[band, :, :] )

# Once we're done, close properly the dataset
dst_ds = None
user2856
источник
Большое спасибо, где можно прочитать, что эти вещи делают? SetUTM (хорошо, я знаю, что это делает) SetWellKnown GeogCS, se projection, set geo transform и т. Д., Но выглядит именно так, как мне нужно. Большое спасибо!
JEquihua
Для получения дополнительной информации о частях кода с географической привязкой см. Учебное пособие по проекциям - gdal.org/ogr/osr_tutorial.html
user2856
2

Я знаю, что это не то, что вы просили, но если вам нужны только мультиспектральные или гиперспектральные выборочные данные - эти тестовые данные для проекта Opticks могут работать. Кроме того, вы можете получить данные LANDSAT непосредственно из Earth Explorer .

На этом сайте приведен пример кода для преобразования двумерного массива массивов в однополосный массив geoTIFF, а также многоканальный geoTIFF - в массив трехмерных массивов.

РЕДАКТИРОВАТЬ:

Дальнейшие исследования находят страницу с примером кода с «отсутствующим примером», трехмерным массивом пустышек -> многоканальный geoTIFF.

MappingTomorrow
источник
Нет, мне действительно нужно создать свой собственный имидж. Страница интересная, спасибо, что мне действительно нужно, так это отсутствующий пример того, как сохранить трехмерный массив в виде многополосного geoTIFF. Но большое спасибо!
JEquihua
Отредактировано с дополнительной информацией
MappingT завтра