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(
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) にご注意ください。