2013-03-12 253 views
2

我想读取一个TIFF的带作为数组。问题是GDAL不会忽略NoData值。有没有办法让GDAL忽略它?GDAL ReadAsArray不会忽略NoData值

当我计算统计信息时,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

我相信你可以创建从一个numpy.ndarraynumpy.MaskedArray

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] 
[-- -- -- --]] 

numpya combination of a numpy.ndarray and a mask is used to allow for handling of missing data