[gdal-dev] Creating Geotiff with WriteArray in Python

Matt Fearon singlespeed10 at gmail.com
Thu Mar 20 10:55:00 EDT 2008


Dear GDAL/Python Users,

I am struggling to make the following python/GDAL script work. I am
reading/converting large Palsar images to GeoTiff, and therefore I
have to be concerned with memory. I believe I have the following
script very close to working. The problem is related to the line
"dst_ds.GetRasterBand(1).WriteArray(nxarray,0,j)" - I am trying to
write an imported integer array(y,x) , 13700x13300, to a tif file row
by row using a for loop structure as a converted float. I constructed
this code from found examples, ie, 4bandto3band.py. However,
"WriteArray" is giving me trouble.  I believe the problem is something
very simple; the arguments in WriteArray are not quite right. I am
quite new to GDAL and Python. Some help would be very much
appreciated. Below are the errors I receive and my script.
thanks,
Matt


Traceback (most recent call last):
  File "./test.py", line 43, in <module>
    dst_ds.GetRasterBand(1).WriteArray(nxarray,0,j)
  File "/usr/lib/python2.5/site-packages/gdal.py", line 876, in WriteArray
    return gdalnumeric.BandWriteArray( self, array, xoff, yoff )
  File "/usr/lib/python2.5/site-packages/gdalnumeric.py", line 187, in
BandWriteArray
    xsize = array.shape[1]
IndexError: tuple index out of range




#! /usr/bin/env python

import Numeric
from Numeric import *
import pickle, array, sys, os, shutil
import gdal, gdalnumeric
from gdalconst import *
import numpy
from math import *


file = "china/hangzhou/processed/ALPSRP021230580/IMG-HH-ALPSRP021230580-H1.5GUA"

gd=gdal.Open(file)
array=gd.ReadAsArray()
dims = array.shape
nx=dims[1]
ny=dims[0]

nxarray=zeros(nx,Float)
cal_factor=-83.0

dst_format = 'GTiff'
dst_datatype = gdal.GDT_Float32
dst_options = ['COMPRESS=LZW']
dst_file='foo.tif'
dst_xsize = nx
dst_ysize = ny
dst_nbands = 1

driver = gdal.GetDriverByName( dst_format )
dst_ds = driver.Create(dst_file, dst_xsize, dst_ysize, dst_nbands,
dst_datatype, dst_options)


for j in range(0,ny-1):
  for i in range(0,nx-1):

    nxarray[i]=0.0
    tmp = array[j,i] * 1.0
    if (tmp > 0):
      nxarray[i] = 10.0 * log10(pow(tmp,2)) + cal_factor

  dst_ds.GetRasterBand(1).WriteArray(nxarray,0,j)

dst_ds = None


More information about the gdal-dev mailing list