ゼロからマルチスペクトル画像を作成する


10

いくつかのテストを行うために、Ceroからマルチスペクトル画像を作成したいと考えています。塩とコショウのノイズが乗った5つの完全に均一なバンド、または中央に異なる値の2乗のような本当にシンプルなもの。明らかに、これは行列のスタック、つまり多次元配列であり、生成は非常に簡単です。私はpythonとgdalを使用してこれを実現したいのですが、gdalはかなり気密性が高く、コツがつかめません。geotiffファイルを作成するのが理想的です。誰かがこれを手伝ってくれませんか?いくつかのポインタまたは非常に穏やかなgdalチュートリアル?皆さん、ありがとうございました。

回答:


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.