2017-01-25 1 views
-2

Ceci est une petite partie du script de calcul NDVI de l'image Geotiff. La valeur NDVI de chaque pixel est calculée en fonction de la bande raster. Quelqu'un qui a la connaissance du traitement gis dans gdal ou un autre module, aidez-nous à récupérer NDVI de l'image sortie.Comment extraire les informations non-pixel de Geotiff?

for i in range(len(red_tuple)): 
       print nir_tuple[i] 
       # Calculate the NDVI for the current pixel. 
       ndvi_lower = (nir_tuple[i] + red_tuple[i]) 
       ndvi_upper = (nir_tuple[i] - red_tuple[i]) 
       ndvi = 0 
       # Becareful of zero divide 
       if ndvi_lower == 0: 
        ndvi = 0 
       else: 
        ndvi = ndvi_upper/ndvi_lower 

       # Add the current pixel to the output line 
       outputLine = outputLine + struct.pack('f', ndvi) 
       #print(ndvi) 
      # Write the completed line to the output image    
outDataset.GetRasterBand(1).WriteRaster(0, line,red_band.XSize, 1,outputLine, buf_xsize=red_band.XSize, 
              buf_ysize=1, buf_type=gdal.GDT_Float32) 

Répondre

0

Il y a quelques problèmes avec votre script. Tout d'abord, vous pourriez faire le calcul sur l'ensemble de l'image à la fois (compte tenu de la mémoire suffisante, devrait être capable de gérer des images de quelques Go). Deuxièmement, vous ne fermez pas le fichier après écriture (ou ne montrez pas partie).

from osgeo import gdal 

red_ds = gdal.Open("pathroredband.tif") 
nir_ds = gdal.Open("pathtonirband.tif") 

# Assuming that these are reflectance, float type. 
red = red_ds.ReadAsArray() 
nir = nir_ds.ReadAsArray() 

# To save memory, we will use in-place operations 
num = red.copy() # Numerator 
num -= nir 
nir += red # Denominator 
num /= nir # num now contains NDVI 

# Write the output 
driver = gdal.GetDriverByName('GTiff') 
ds_out = driver.Create(path, xsize, ysize, 1, gdal.GDT_Float32) 
ds_out.GetRasterBand(1).WriteArray(num) 
ds_out = None # Close the dataset; important!