ホームページ > バックエンド開発 > Python チュートリアル > Python gdal チュートリアル: gdal を使用したラスター データの読み取り

Python gdal チュートリアル: gdal を使用したラスター データの読み取り

黄舟
リリース: 2016-12-24 17:07:04
オリジナル
8482 人が閲覧しました

GDAL は 100 を超えるラスター データ タイプをネイティブにサポートし、

ArcInfo グリッド、ArcSDE ラスター、Imagine、Idrisi、ENVI、GRASS、GeoTIFF

HDF4、HDF5

USGS DOQ、USGS DEM を含むすべての主流の GIS および RS データ形式をカバーします

ECW、MrSID

TIFF、JPEG、JPEG2000、PNG、GIF、BMP

完全なサポート リストについては、http://www.gdal.org/formats_list.html を参照してください

GDAL サポート ライブラリのインポート

古いバージョン (1.5 より前): import gdal, gdalconst

新しいバージョン (1.6 以降): from osgeo import gdal, gdalconst

gdal と gdalconst の両方をインポートするのが最善です。gdalconst の定数は接頭辞であり、一貫性を保つように努めます。他のモジュールとの競合は最小限です。したがって、次のように gdalconst を直接インポートできます。 from osgeo.gdalconst import *

GDAL データ ドライバーは、OGR データ ドライバーと同様に、最初に特定のタイプのデータ ドライバーを作成してから、対応するラスター データセットを作成する必要があります。

すべてのデータ ドライバーを一度に登録しますが、読み取りのみ可能で書き込みはできません: gdal.AllRegister()

読み取りと書き込みができるように、また新しいデータ セットを作成できるように、特定の種類のデータ ドライバーを個別に登録します。

driver = gdal.GetDriverByName('HFA')

driver.Register()

既存のラスター データセットを開きます:

fn = 'aster.img'

ds = gdal.Open(fn, GA_ReadOnly)

ds が None の場合:

print 'Could not open ' + fn

sys.exit(1)

x 方向のピクセル数、y 方向のピクセル数、およびバンドの数を読み取ります

cols = ds. Raster ラスター データセットの地理座標情報を格納するリスト

adfGeoTransform[0] /* 左上 x x 左上隅の座標*/

adfGeoTransform[1] /* w--e ピクセル解像度 東西方向のピクセル解像度 Rate*/

adfGeoTransform[2] /* 回転、画像が「北を上」の場合は 0 北が上を向いている場合、地図の回転角度*/

adfGeoTransform[3 ] /* 左上 y 左上隅の y 座標*/

adfGeoTransform[4] /* 回転、画像が「北を上」の場合は 0 北が上を向いている場合、地図の回転角度*/

adfGeoTransform [5] /* n-s ピクセル解像度 南北方向のピクセル解像度*/

ラスター データセットの座標は通常、左上隅に基づくことに注意してください。

次の例は、ラスター データセットから Geotransform をリストとして抽出し、その中のデータを読み取ることです

geotransform = ds.GetGeoTransform()

OriginX = geotransform[0]

OriginY = geotransform[3]originY = geotransform[3]

xelWidth = geotransform[1]

pixelHeight = geotransform[5]

ある座標に対応するピクセルの相対位置 (ピクセル オフセット)、つまり座標との相対位置を計算します。左上隅のピクセル、ピクセル数によって計算されます。計算式は次のとおりです:

xOffset = int((x –originX)/pixelWidth)

yOffset = int((y –originY)/pixelHeight)

特定のピクセルの値を読み取るには、2 つのステップを分割する必要があります

最初にバンドを読み取ります: GetRasterBand()、パラメータはバンドのインデックス番号です

次に ReadAsArray(, < yoff>、)、(xoff,yoff) から始まりサイズ (xsize,ysize) の行列を読み取ります。マトリクスサイズが 1X1 に設定されている場合、1 ピクセルが読み取られます。ただし、この方法では、たとえ 1 つのピクセルしか読み取られなかったとしても、読み取ったデータをマトリクスに配置することしかできません。例:

band = ds.GetRasterBand(1)

data =band.ReadAsArray(xOffset, yOffset, 1, 1)

画像全体を一度に読み取りたい場合は、オフセットを 0、サイズを設定します。画像全体のサイズに設定します。例:

data =band.ReadAsArray(0, 0,cols, rows)

ただし、データから特定のピクセルの値を読み取るには、data を使用する必要があることに注意してください。 [yoff、xoff]。逆にやらないように注意してください。数学の行列は [row,col] ですが、ここではその逆です。ここで、row は y 軸に対応し、col は x 軸に対応します。

バンド = なし、データセット = なしなど、適切な場合にメモリを解放することに注意してください。特に画像が非常に大きい場合

ラスターデータをより効率的に読み取るにはどうすればよいですか?明らかに、1 つずつ読み取るのは非常に非効率的です。ラスター データセット全体を 2 次元配列に詰め込むことは、依然として大量のメモリを消費するため、得策ではありません。より良いアプローチは、ブロック内のデータにアクセスし、必要なブロックのみをメモリに入れることです。今週のサンプル コードには、ブロック サイズを読み取ることができる utils モジュールが含まれています。

例:

import utils

blockSize = utils.GetBlockSize(band)

xBlockSize = blockSize[0]

yBlockSize = blockSize[1]

タイル(タイル状)、つまりラスターデータはブロックに格納されます。 GeoTiff などの一部の形式はタイル化されず、1 行がブロックになります。 Erdas Imaging 形式は 64x64 ピクセルでタイル化されます。

行がブロックの場合、行ごとに読み取る方がリソースを節約できます。

タイル化されたデータ構造の場合、一度に 1 つのブロックのみを読み取れるように ReadAsArray() のパラメーター値を設定するのが最も効率的な方法です。例:

rows = 13、cols = 11、xBSize = 5、yBSize = 5

for i in range(0, rows, yBSize):

if i + yBSize < rows:

numRows = yBSize

else:

numRows = rows – i

for j in range(0,cols, xBSize):

if j + xBSize

numCols = xBSize

data =band.ReadAsArray( j、i、numCols、numRows)

このコードは普遍的であり、随時使用できます。

以下では、2 次元配列処理スキルをいくつか紹介します

ここでは、Numeric と numpy の 2 つのライブラリが使用されます。 Numeric は古いもので、FWTools がそれを使用します。自分でインストールして構成する場合は、より強力な numpy を使用する必要があります。

データ型変換:

data =band.ReadAsArray(j, i, nCols, nRows)

data = data.astype(Numeric.Float) # Numeric

data = data.astype(numpy.float) # numpy

または簡単な文を書いてください

data = Band.ReadAsArray(j, i, nCols, nRows).astype(Numeric.Float)

mask

これは Numeric ライブラリと numpy ライブラリの関数で、配列を入力し、条件を指定すると、バイナリ配列が出力されます。たとえば、

mask = Numeric.greater(data, 0)mask = Numeric.greater(data, 0)

>>> a = Numeric.array([0, 4, 6, 0, 2])

>>>

[0 4 6 0 2]

>>> マスク = Numeric.greater(a, 0)

>>> 0 1 1 0 1]

配列合計

>>> a = Numeric.array([0, 4, 6, 0, 2])

>>> ; print a

[0 4 6 0 2]

>>> print Numeric.sum(a)

12

2 次元配列の場合、sum は 1 次元配列を返します。

>>> b = Numeric.array([a, [5, 10, 0, 3, 0]])

>>> print b

[[ 0 4 6 0 2]

[ 5 10 0 3 0]]

>>> print Numeric.sum(b)>>> print Numeric.sum(b)

[ 5 14 6 3 2]

、二次元 配列の合計は次のようになります

>>> print Numeric.sum(Numeric.sum(b))

30

ここで、0 より大きいピクセルの数を数えます。 、マスクを組み合わせて使用​​し、2 つの関数を合計することができます

>>> print a

[0 4 6 0 2]

>>> マスク = Numeric.greater(a, 0)

>>> print Mask

[0 1 1 0 1]

>>> print Numeric.sum(mask)

3

上記は Python gdal のチュートリアルです: gdal を使用してラスターデータの内容、詳細 関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) にご注意ください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート