Reading Raster Data with GDAL



Similar documents
Computational Mathematics with Python

Computational Mathematics with Python

2D Art and Animation. [ COGS Meeting 02/18/2015 ] [ Andrew ]

Reading & Writing Spatial Data in R John Lewis. Some material used in these slides are taken from presentations by Roger Bivand and David Rossiter

LSA SAF products: files and formats

Importing ASCII Grid Data into GIS/Image processing software

Using Geocoded TIFF & JPEG Files in ER Mapper 6.3 with SP1. Eric Augenstein Earthstar Geographics Web:

2.2/2.3 - Solving Systems of Linear Equations

Dynamic Programming. Lecture Overview Introduction

Computational Mathematics with Python

Introduction to the TI Connect 4.0 software...1. Using TI DeviceExplorer...7. Compatibility with graphing calculators...9

May 2012 Oracle Spatial User Conference

ArcGIS ArcMap: Printing, Exporting, and ArcPress

Solving Problems Recursively

Advanced Functions and Modules

VB.NET Programming Fundamentals

Introduction to Matlab

CS101 Lecture 24: Thinking in Python: Input and Output Variables and Arithmetic. Aaron Stevens 28 March Overview/Questions

Lesson 10: Video-Out Interface

FME 2007 Release Giving Raster the Vector Treatment. By Mary Jo Wagner

INTRODUCTION TO ARCGIS SOFTWARE

Beginner s Matlab Tutorial

Exercise 0. Although Python(x,y) comes already with a great variety of scientic Python packages, we might have to install additional dependencies:

This presentation explains how to monitor memory consumption of DataStage processes during run time.

Step-by-Step guide for IMAGINE UAV workflow

Exercise 4 Learning Python language fundamentals

grep, awk and sed three VERY useful command-line utilities Matt Probert, Uni of York grep = global regular expression print

Solving Systems of Linear Equations Using Matrices

An Introduction to Open Source Geospatial Tools

Introduction to the data.table package in R

Section IV.1: Recursive Algorithms and Recursion Trees

Introduction to Python for Text Analysis

Create a folder on your network drive called DEM. This is where data for the first part of this lesson will be stored.

GRID SEARCHING Novel way of Searching 2D Array

Files Used in this Tutorial

CRASH COURSE PYTHON. Het begint met een idee

Outline. hardware components programming environments. installing Python executing Python code. decimal and binary notations running Sage

Simple File Input & Output

Introduction to Python

Matrix Multiplication

Computer Science 217

University of Hull Department of Computer Science. Wrestling with Python Week 01 Playing with Python

Importing and Exporting With SPSS for Windows 17 TUT 117

ERDAS Spatial Modeler Language Reference Manual

Python Lists and Loops

Python for Rookies. Example Examination Paper

MONITORING PERFORMANCE IN WINDOWS 7

MATH10212 Linear Algebra. Systems of Linear Equations. Definition. An n-dimensional vector is a row or a column of n numbers (or letters): a 1.

Introduction to Programming (in C++) Multi-dimensional vectors. Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC

How to resize, rotate, and crop images

Using Casio Graphics Calculators

MrSID Plug-in for 3D Analyst

INTEROPERABLE IMAGE DATA ACCESS THROUGH ARCGIS SERVER

MAIN_SNP_TOPO.dgm_2m

Advanced Programming with LEGO NXT MindStorms

Lecture 2 Mathcad Basics

2.2 Derivative as a Function

Analyzing & Optimizing T-SQL Query Performance Part1: using SET and DBCC. Kevin Kline Senior Product Architect for SQL Server Quest Software

Moving from C++ to VBA

Advanced Tornado TWENTYONE Advanced Tornado Accessing MySQL from Python LAB

Exercise 1: Python Language Basics

In this Chapter you ll learn:

ESCI 386 Scientific Programming, Analysis and Visualization with Python. Lesson 5 Program Control

Programming Languages CIS 443

Storing Measurement Data

Custom Javascript In Planning

ASSEMBLY LANGUAGE PROGRAMMING (6800) (R. Horvath, Introduction to Microprocessors, Chapter 6)

Introduction to Java

NetCDF in QGIS tutorial

Base Conversion written by Cathy Saxton

G563 Quantitative Paleontology. SQL databases. An introduction. Department of Geological Sciences Indiana University. (c) 2012, P.

Blender addons ESRI Shapefile import/export and georeferenced raster import

AMATH 352 Lecture 3 MATLAB Tutorial Starting MATLAB Entering Variables

Open Source GIS Blitz!

Arrays in Java. Working with Arrays

Institute of Natural Resources Departament of General Geology and Land use planning Work with a MAPS

Lab 3. GIS Data Entry and Editing.

Structures for Data Compression Responsible persons: Claudia Dolci, Dante Salvini, Michael Schrattner, Robert Weibel

Embedded Systems. Review of ANSI C Topics. A Review of ANSI C and Considerations for Embedded C Programming. Basic features of C

Creating Web Pages with Microsoft FrontPage

Running and Scheduling QGIS Processing Jobs

Virtuozzo Virtualization SDK

ImageJ Macro Language Quick-notes.

PYTHON Basics

Using MATLAB to Measure the Diameter of an Object within an Image

CS1112 Spring 2014 Project 4. Objectives. 3 Pixelation for Identity Protection. due Thursday, 3/27, at 11pm

ELFRING FONTS UPC BAR CODES

COMP 250 Fall 2012 lecture 2 binary representations Sept. 11, 2012

On the CyberShARE site you will find this interpolated version (labeled SRTMv4_90m)

Lab 4.4 Secret Messages: Indexing, Arrays, and Iteration

II-9Importing and Exporting Data

Introduction to the Oracle DBMS

Introduction to SQL for Data Scientists

An overview of FAT12

GelAnalyzer 2010 User s manual. Contents

MS Access: Advanced Tables and Queries. Lesson Notes Author: Pamela Schmidt

Name: Class: Date: 9. The compiler ignores all comments they are there strictly for the convenience of anyone reading the program.

Transcription:

Reading Raster Data with GDAL Open Source RS/GIS Python Week 4 OS Python week 4: Reading raster data [1]

GDAL Supports about 100 raster formats ArcInfo grids, ArcSDE raster, Imagine, Idrisi, ENVI, GRASS, GeoTIFF HDF4, HDF5 USGS DOQ, USGS DEM ECW, MrSID TIFF, JPEG, JPEG2000, PNG, GIF, BMP See http://www.gdal.org/formats_list.html OS Python week 4: Reading raster data [2]

Finding available formats To see what formats are compiled into your version of GDAL, use this command in the FWTools shell (or terminal window on a Mac) gdalinfo --formats OS Python week 4: Reading raster data [3]

Importing GDAL Need to import both gdal and gdalconst FWTools: import gdal, gdalconst Not FWTools: from osgeo import gdal, gdalconst OS Python week 4: Reading raster data [4]

All gdalconst constants start with a prefix which minimizes the possibility of conflicts with other modules Can import a module so you don t have to prefix things with the module name: import gdal from gdalconst import * or from osgeo import gdal from osgeo.gdalconst import * OS Python week 4: Reading raster data [5]

GDAL data drivers Similar to OGR data drivers Need to register a driver before using it Need to have a driver object before creating a new raster data set Driver names (code) are available at http://www.gdal.org/formats_list.html OS Python week 4: Reading raster data [6]

Register all drivers at once Works for reading data but not for creating data sets gdal.allregister() Get the Imagine driver and register it Works for reading and creating new Imagine files driver = gdal.getdriverbyname('hfa') driver.register() OS Python week 4: Reading raster data [7]

Opening a raster data set Once the driver has been registered, the Open(<filename>, <GDALAccess>) method can be used to return a Dataset object fn = 'aster.img' ds = gdal.open(fn, GA_ReadOnly) if ds is None: print 'Could not open ' + fn sys.exit(1) OS Python week 4: Reading raster data [8]

Getting image dimensions Dataset objects have properties corresponding to numbers of rows, columns and bands in the data set cols = ds.rasterxsize rows = ds.rasterysize bands = ds.rastercount Notice no parentheses because they re properties not methods OS Python week 4: Reading raster data [9]

Getting georeference info GeoTransforms are lists of information used to georeference an image From the GDAL documentation: adfgeotransform[0] /* top left x */ adfgeotransform[1] /* w-e pixel resolution */ adfgeotransform[2] /* rotation, 0 if image is "north up" */ adfgeotransform[3] /* top left y */ adfgeotransform[4] /* rotation, 0 if image is "north up" */ adfgeotransform[5] /* n-s pixel resolution */ Coordinates are for top left corners of pixels (unlike Imagine, which uses centers) OS Python week 4: Reading raster data [10]

Use the GetGeoTransform() method on a Dataset object to get a GeoTransform geotransform = ds.getgeotransform() originx = geotransform[0] originy = geotransform[3] pixelwidth = geotransform[1] pixelheight = geotransform[5] adfgeotransform[0] /* top left x */ adfgeotransform[1] /* w-e pixel resolution */ adfgeotransform[2] /* rotation, 0 if image is "north up" */ adfgeotransform[3] /* top left y */ adfgeotransform[4] /* rotation, 0 if image is "north up" */ adfgeotransform[5] /* n-s pixel resolution */ OS Python week 4: Reading raster data [11]

Computing pixel offsets Need to get pixel offsets from the upper left corner for specific coordinates x,y xoffset = int((x originx) / pixelwidth) yoffset = int((y originy) / pixelheight) (originx, originy) x pixelwidth pixelheight y (x originx) / pixelwidth ~= 3.25 (y originy) / pixelheight ~= 2.5 Take the integer values and we get (3,2) OS Python week 4: Reading raster data [12]

Getting individual pixel values Get the Band object by passing the band index (1-based) to the Dataset s GetRasterBand(<index>) method band = ds.getrasterband(1) Read the data into a 2D Numeric array with ReadAsArray(<xoff>, <yoff>, <xsize>, <ysize>) data = band.readasarray(xoffset, yoffset, 1, 1) OS Python week 4: Reading raster data [13]

Even though we only read one pixel value, it is in a two-dimensional array Since we read one pixel in each direction, the array is of size 1x1 Need to specify both offsets, which are 0 in this case value = data[0,0] OS Python week 4: Reading raster data [14]

Reading an entire image at once Use 0 offsets and pass the numbers of rows and columns to the ReadAsArray() method data = band.readasarray(0, 0, cols, rows) Read individual pixels using [yoff, xoff] (math matrix notation is [row,col], not [x,y]) To read the pixel in the 95 th column and 43 rd row: value = data[42, 94] OS Python week 4: Reading raster data [15]

Memory management Set variables to None Especially important if you created large arrays with ReadAsArray() band = None dataset = None OS Python week 4: Reading raster data [16]

Script example 1 # script to get pixel values at a set of coordinates # by reading in one pixel at a time # Took 0.47 seconds on my machine import os, sys, time, gdal from gdalconst import * # start timing starttime = time.time() # coordinates to get pixel values for xvalues = [447520.0, 432524.0, 451503.0] yvalues = [4631976.0, 4608827.0, 4648114.0] # set directory os.chdir(r'z:\data\classes\python\data') # register all of the drivers gdal.allregister() # open the image ds = gdal.open('aster.img', GA_ReadOnly) if ds is None: print 'Could not open image' sys.exit(1) OS Python week 4: Reading raster data [17]

# get image size rows = ds.rasterysize cols = ds.rasterxsize bands = ds.rastercount # get georeference info transform = ds.getgeotransform() xorigin = transform[0] yorigin = transform[3] pixelwidth = transform[1] pixelheight = transform[5] # loop through the coordinates for i in range(3): # get x,y x = xvalues[i] y = yvalues[i] # compute pixel offset xoffset = int((x - xorigin) / pixelwidth) yoffset = int((y - yorigin) / pixelheight) # create a string to print out s = str(x) + ' ' + str(y) + ' ' + str(xoffset) + ' ' + str(yoffset) + ' ' # loop through the bands for j in range(bands): band = ds.getrasterband(j+1) # 1-based index OS Python week 4: Reading raster data [18]

# read data and add the value to the string data = band.readasarray(xoffset, yoffset, 1, 1) value = data[0,0] s = s + str(value) + ' # print out the data string print s # figure out how long the script took to run endtime = time.time() print 'The script took ' + str(endtime - starttime) + ' seconds' OS Python week 4: Reading raster data [19]

Script example 2 # script to get pixel values at a set of coordinates # by reading in entire bands # Took 1.69 seconds on my machine import os, sys, time, gdal from gdalconst import * # start timing starttime = time.time() # coordinates to get pixel values for xvalues = [447520.0, 432524.0, 451503.0] yvalues = [4631976.0, 4608827.0, 4648114.0] # set directory os.chdir(r'z:\data\classes\python\data') # register all of the drivers gdal.allregister() # open the image ds = gdal.open('aster.img', GA_ReadOnly) if ds is None: print 'Could not open image' sys.exit(1) OS Python week 4: Reading raster data [20]

# get image size rows = ds.rasterysize cols = ds.rasterxsize bands = ds.rastercount # get georeference info transform = ds.getgeotransform() xorigin = transform[0] yorigin = transform[3] pixelwidth = transform[1] pixelheight = transform[5] # create a list to store band data in bandlist = [] # read in bands and store all the data in bandlist for i in range(bands): band = ds.getrasterband(i+1) data = band.readasarray(0, 0, cols, rows) bandlist.append(data) # loop through the coordinates for i in range(3): # get x,y x = xvalues[i] y = yvalues[i] OS Python week 4: Reading raster data [21]

# compute pixel offset xoffset = int((x - xorigin) / pixelwidth) yoffset = int((y - yorigin) / pixelheight) # create a string to print out s = str(x) + ' ' + str(y) + ' ' + str(xoffset) + ' ' + str(yoffset) + ' # loop through the bands and get the pixel value for j in range(bands): data = bandlist[j] value = data[yoffset, xoffset] # math matrix notation order s = s + str(value) + ' # print out the data string print s # figure out how long the script took to run endtime = time.time() print 'The script took ' + str(endtime - starttime) + ' seconds' OS Python week 4: Reading raster data [22]

Assignment 4a Read pixel values from an image Print out the pixel values for all three bands of aster.img at the points contained in sites.shp Use any method of reading the raster data that you want, but I would suggest one pixel at a time (fastest in this case since we don't need much data) Turn in your code and the output (right-click in the Crimson Editor output window to copy all output) OS Python week 4: Reading raster data [23]

Reading raster data efficiently Reading one pixel at a time is about as inefficient as you can get (DON T DO IT unless you just need a few pixel values here and there) Reading the entire image at once is pretty efficient, but not the best Plus, you might not have enough RAM to hold it all or process it OS Python week 4: Reading raster data [24]

Anyone seen the Block Size information in Erdas Imagine? Has to do with how the values are stored on disk Most efficient way to access raster data is by blocks Unfortunately, don t always know block size OS Python week 4: Reading raster data [25]

Getting block size This week s data has a module called utils Can use it to get block size like this: import utils blocksize = utils.getblocksize(band) xblocksize = blocksize[0] yblocksize = blocksize[1] OS Python week 4: Reading raster data [26]

Tiled images Some file types, like most GeoTIFFs, are not tiled A block is a row By default Erdas Imagine files are tiled into blocks that are 64x64 pixels This example has 5x5 tiles A B C a b c OS Python week 4: Reading raster data [27]

Reading one row at a time Loop through the rows and read all pixels in that row during each iteration for i in range(rows): data = band.readasarray(0, i, cols, 1) # do something with the data here, before # reading the next row The built-in range(n) function creates a list of numbers from 0 to n-1 >>> print range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] OS Python week 4: Reading raster data [28]

Reading a row of blocks It s almost as easy to read in a row of blocks Need to check that we can get a whole block in the y direction get an error if request more data than exists in the file A B C a b c OS Python week 4: Reading raster data [29]

Use range(start, stop, step) to loop through each group of blocks >>> print range(0, 13, 5) [0, 5, 10] A a b c bsize = 5 for i in range(0, rows, bsize): B if i + bsize < rows: size = bsize else: C size = rows - i data = band.readasarray(0, i, cols, size) # do something with the data here, before # reading the next set of blocks OS Python week 4: Reading raster data [30]

rows = 13 bsize = 5 for i in range(0, rows, bsize): if i + bsize < rows: size = bsize else: size = rows - i data = band.readasarray(0, i, cols, size) i = [0, 5, 10] 0 + 5 < 13, so size = 5 ReadAsArray(0, 0, 11, 5) A B a b c C OS Python week 4: Reading raster data [31]

rows = 13 bsize = 5 for i in range(0, rows, bsize): if i + bsize < rows: size = bsize else: size = rows - i data = band.readasarray(0, i, cols, size) i = [0, 5, 10] 5 + 5 < 13, so size = 5 ReadAsArray(0, 5, 11, 5) A B a b c C OS Python week 4: Reading raster data [32]

rows = 13 bsize = 5 for i in range(0, rows, bsize): if i + bsize < rows: size = bsize else: size = rows - i data = band.readasarray(0, i, cols, size) i = [0, 5, 10] 10 + 5 > 13, so size = 13 10 = 3 ReadAsArray(0, 10, 11, 3) A B a b c C OS Python week 4: Reading raster data [33]

Reading block by block The most efficient way to read data Use one loop for the rows and one for the columns Need to check that there is an entire block in both directions A B C a b c OS Python week 4: Reading raster data [34]

rows = 13, cols = 11 range(0,13,5) & range(0,11,5) both return [0, 5, 10] 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 < cols: numcols = xbsize else: numcols = cols j A a b c data = band.readasarray(j, i, numcols, numrows) # do something with the data here, before # reading the next block B C OS Python week 4: Reading raster data [35]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 0 + 5 < 13, so numrows = 5 A a b c j = [0, 5, 10] 0 + 5 < 11, so numcols = 5 ReadAsArray(0, 0, 5, 5) B C OS Python week 4: Reading raster data [36]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 0 + 5 < 13, so numrows = 5 A a b c j = [0, 5, 10] 5 + 5 < 11, so numcols = 5 ReadAsArray(5, 0, 5, 5) B C OS Python week 4: Reading raster data [37]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 0 + 5 < 13, so numrows = 5 A a b c j = [0, 5, 10] 10 + 5 > 11, so numcols = 11 10 = 1 ReadAsArray(10, 0, 1, 5) B C OS Python week 4: Reading raster data [38]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 5 + 5 < 13, so numrows = 5 A a b c j = [0, 5, 10] 0 + 5 < 11, so numcols = 5 ReadAsArray(0, 5, 5, 5) B C OS Python week 4: Reading raster data [39]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 5 + 5 < 13, so numrows = 5 A a b c j = [0, 5, 10] 5 + 5 < 11, so numcols = 5 ReadAsArray(5, 5, 5, 5) B C OS Python week 4: Reading raster data [40]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 5 + 5 < 13, so numrows = 5 A a b c j = [0, 5, 10] 10 + 5 > 11, so numcols = 11 10 = 1 ReadAsArray(10, 5, 1, 5) B C OS Python week 4: Reading raster data [41]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 10 + 5 > 13, so numrows = 13 10 = 3 A a b c j = [0, 5, 10] 0 + 5 < 11, so numcols = 5 ReadAsArray(0, 10, 5, 3) B C OS Python week 4: Reading raster data [42]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 10 + 5 > 13, so numrows = 13 10 = 3 A a b c j = [0, 5, 10] 5 + 5 < 11, so numcols = 5 ReadAsArray(5, 10, 5, 3) B C OS Python week 4: Reading raster data [43]

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 < cols: numcols = xbsize else: numcols = cols j data = band.readasarray(j, i, numcols, numrows) i = [0, 5, 10] 10 + 5 > 13, so numrows = 13 10 = 3 A a b c j = [0, 5, 10] 10 + 5 > 11, so numcols = 11 10 = 1 ReadAsArray(10, 10, 1, 3) B C OS Python week 4: Reading raster data [44]

Numeric & numpy Python modules for processing large arrays We ll talk more about it next week Use Numeric with FWTools and numpy otherwise import Numeric # FWTools import numpy # otherwise (ie on Macs) OS Python week 4: Reading raster data [45]

Converting array data types If reading byte data (which we are at this point) then the arrays returned by ReadAsArray() will also by byte Sometimes we need the data as a different type data = band.readasarray(j, i, ncols, nrows) data = data.astype(numeric.float) # Numeric data = data.astype(numpy.float) # numpy Can do it in one step: data = band.readasarray(j, i, ncols, nrows).astype(numeric.float) OS Python week 4: Reading raster data [46]

Creating a mask Say we want to do some processing on all pixels with a value greater than 0 Syntax is the same for numpy mask = Numeric.greater(data, 0) >>> a = Numeric.array([0, 4, 6, 0, 2]) >>> print a [0 4 6 0 2] >>> mask = Numeric.greater(a, 0) >>> print mask [0 1 1 0 1] OS Python week 4: Reading raster data [47]

Summing values in an array Use Numeric.sum(<array>) or numpy.sum(<array>) >>> a = Numeric.array([0, 4, 6, 0, 2]) >>> print a [0 4 6 0 2] >>> print Numeric.sum(a) 12 OS Python week 4: Reading raster data [48]

If array is 2D then sum() returns an array >>> 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) [ 5 14 6 3 2] To get one total sum >>> print Numeric.sum(Numeric.sum(b)) 30 OS Python week 4: Reading raster data [49]

Counting pixels where value > 0 Create a mask and sum the values >>> print a [0 4 6 0 2] >>> mask = Numeric.greater(a, 0) >>> print mask [0 1 1 0 1] >>> print Numeric.sum(mask) 3 OS Python week 4: Reading raster data [50]

# script to count the number of non-zero pixels in the first band import os, sys, ogr, gdal, utils, Numeric from gdalconst import * os.chdir(r'z:\data\classes\python\data') # register all of the GDAL drivers gdal.allregister() # open the image ds = gdal.open('aster.img', GA_ReadOnly) if ds is None: print 'Could not open aster.img' sys.exit(1) # get image size rows = ds.rasterysize cols = ds.rasterxsize bands = ds.rastercount # get the band and block sizes band = ds.getrasterband(1) blocksizes = utils.getblocksize(band) xblocksize = blocksizes[0] yblocksize = blocksizes[1] # initialize variable count = 0 OS Python week 4: Reading raster data [51]

# loop through the rows for i in range(0, rows, yblocksize): if i + yblocksize < rows: numrows = yblocksize else: numrows = rows I # loop through the columns for j in range(0, cols, xblocksize): if j + xblocksize < cols: numcols = xblocksize else: numcols = cols j # read the data and do the calculations data = band.readasarray(j, i, numcols, numrows).astype(numeric.float) mask = Numeric.greater(data, 0) count = count + Numeric.sum(Numeric.sum(mask)) # print results print 'Number of non-zero pixels:', count OS Python week 4: Reading raster data [52]

Assignment 4b Write a script to calculate the average pixel value for the first band in aster.img Read in the data one block at a time Do the calculation two ways Including zeros in the calculation Ignoring zeros in the calculation Turn in your code and the output OS Python week 4: Reading raster data [53]