4

TIFF のバンドを配列として読み取ろうとしています。問題は、GDAL が NoData 値を無視しないことです。GDALに無視するように指示する方法はありますか?

統計を計算するとき、GDAL は NoData 値を無視します。

import os, sys, gdal, ogr, numpy
from gdalconst import *

# register all of the drivers
gdal.AllRegister()

# open the image
ds = gdal.Open('test_slope.tif', GA_ReadOnly)

# get image size
rows = ds.RasterYSize
cols = ds.RasterXSize
bands = ds.RasterCount

# Set NoData Value
band = ds.GetRasterBand(1)
ndv = -3.4028230607371e+38
band.SetNoDataValue(ndv)

# Get Statistics
stats = band.ComputeStatistics(0)
print stats

# read in band as array
bandList = []
band.GetNoDataValue()
data = band.ReadAsArray(0, 0, cols, rows)
print data


>>> 
[0.0, 126.59918975830078, 25.757117870945123, 15.399812314100501]
[[ -3.40282306e+38  -3.40282306e+38  -3.40282306e+38 ...,  -3.40282306e+38
   -3.40282306e+38  -3.40282306e+38]
 [ -3.40282306e+38  -3.40282306e+38  -3.40282306e+38 ...,  -3.40282306e+38
   -3.40282306e+38  -3.40282306e+38]
 [ -3.40282306e+38  -3.40282306e+38  -3.40282306e+38 ...,  -3.40282306e+38
   -3.40282306e+38  -3.40282306e+38]
 ..., 
 [ -3.40282306e+38  -3.40282306e+38  -3.40282306e+38 ...,  -3.40282306e+38
   -3.40282306e+38  -3.40282306e+38]
 [ -3.40282306e+38  -3.40282306e+38  -3.40282306e+38 ...,  -3.40282306e+38
   -3.40282306e+38  -3.40282306e+38]
 [ -3.40282306e+38  -3.40282306e+38  -3.40282306e+38 ...,  -3.40282306e+38
   -3.40282306e+38  -3.40282306e+38]]
>>> 
4

1 に答える 1

4

から作成できると思いnumpy.MaskedArrayますnumpy.ndarray

import numpy as np
import numpy.ma as ma

ndv = -3.40282306e+38

data = np.array([[0.0, 126.59918975830078, 25.757117870945123, 15.399812314100501],
                [-3.40282306e+38, -3.40282306e+38, -3.40282306e+38, -3.40282306e+38]])

masked_data = ma.masked_where(data == ndv, data)
print masked_data

結果:

[[0.0 126.599189758 25.7571178709 15.3998123141]
[-- -- -- --]]

ではnumpyとマスクの組み合わせをnumpy.ndarray使用して、欠損データを処理できるようにしています。

于 2013-03-24T20:57:51.937 に答える