Erstellen eines multispektralen Bildes von Grund auf neu

10

Ich möchte ein multispektrales Bild von Cero erstellen, um einige Tests durchzuführen. Etwas wirklich Einfaches wie 5 völlig einheitliche Bänder mit Salz- und Pfeffergeräuschen oder ein Quadrat mit unterschiedlichen Werten in der Mitte. Dies wäre eindeutig nur ein Stapel von Matrizen, ein mehrdimensionales Array, dessen Erzeugung ziemlich einfach ist. Ich möchte dies mit Python und GDAL erreichen, aber GDAL ist ziemlich hermetisch, ich verstehe das überhaupt nicht. Idealerweise möchte ich eine Geotiff-Datei erstellen. Könnte mir jemand dabei helfen? einige Hinweise oder ein gdal-Tutorial, das sehr sanft ist? Danke euch allen.

JEquihua
quelle

Antworten:

15

Sie möchten die Methode gdal.band.WriteArray. Es gibt ein Beispiel im GDAL API-Tutorial (unten wiedergegeben):

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

Informationen zum Generieren der Zufallsdaten finden Sie im Modul numpy.random .

Hier ist ein vollständigeres Arbeitsbeispiel:

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
quelle
Vielen Dank, wo kann man lesen, was diese Dinge tun? SetUTM (ok, ich weiß was das tut) SetWellKnown GeogCS, se Projektion, Set Geo Transformation, etc ... aber sieht genau so aus, wie ich es brauche. Vielen Dank!
JEquihua
Weitere Informationen zu den Georeferenzierungsteilen des Codes finden Sie im Projektions-Tutorial - gdal.org/ogr/osr_tutorial.html
user2856
2

Ich weiß, es ist nicht das, wonach Sie gefragt haben, aber wenn Sie nur multispektrale oder hyperspektrale Probendaten wünschen, funktionieren diese Testdaten für das Opticks-Projekt möglicherweise. Alternativ können Sie LANDSAT-Daten direkt vom Earth Explorer abrufen .

Diese Site enthält Beispielcode zum Konvertieren eines 2D-Numpy-Arrays in ein Einzelband-GeoTIFF und eines Mehrband-GeoTIFF in ein 3D-Numpy-Array.

BEARBEITEN:

Weitere Untersuchungen haben eine Seite mit Beispielcode mit dem 'fehlenden Beispiel' 3D-Numpy-Array -> Multiband-GeoTIFF gefunden.

MappingTomorrow
quelle
Nein, ich muss wirklich mein eigenes Bild machen. Die Seite ist interessant, danke. Was ich wirklich brauchen würde, ist das fehlende Beispiel, wie man ein 3D-Numpy-Array als Multiband-GeoTIFF speichert. Aber vielen Dank!
JEquihua
Bearbeitet mit mehr Infos
MappingTomorrow