从头开始创建多光谱图像


10

我想从Cero制作多光谱图像以对其进行一些测试。真的很简单,例如5条完全均匀的带,上面有盐和胡椒粉的噪声,或者中心是不同值的正方形。显然,这只是一堆矩阵,一个多维数组,可以很直接地生成。我想使用python和gdal来实现这一点,但是gdal相当封闭,我根本不了解它。理想情况下,我想创建一个geotiff文件。有人可以帮我吗?一些指针或gdal教程,这是非常温柔的吗?谢谢你们。

Answers:


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

非常感谢,在哪里可以阅读这些内容?SetUTM(好吧,我知道这是做什么的)SetWellKnown GeogCS,投影,设置地理变换等...但是看起来确实正是我所需要的。非常感谢!
JEquihua

有关代码的地理参考部分的详细信息,请参阅投影教程- gdal.org/ogr/osr_tutorial.html
user2856

2

我知道这不是您要的,但是如果您想要的只是多光谱或高光谱样本数据-Opticks项目的此测试数据可能会起作用。或者,您可以直接从Earth Explorer获取LANDSAT数据。

该站点的示例代码将2D numpy数组转换为单波段geoTIFF,将多波段geoTIFF转换为3D numpy数组。

编辑:

进一步的研究发现了一页示例代码,其中包含“缺少示例”,3D numpy数组->多频带geoTIFF。


不,我真的需要塑造自己的形象。该页面很有趣,谢谢您,我真正需要的是缺少的示例,即如何将3d numpy数组保存为多波段geoTIFF。但是非常感谢!
JEquihua

使用更多信息进行编辑
MappingTomorrow
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.