Zonal Statistics or Extracting Raster Data
Timeline
SubTasks
From Gleon Fellowship
    TypeM
    low
    ProgressM
    100%
    Start dateM
    20th Jan 2015
    Target dateM
    20th Jan 2015
    Participants
    Expertise
    r programming
    raster
    gis
    Legend: M Mandatory | States: Not defined, Valid, Inconsistent with parent


    Zonal Statistics

    Let's say you have a series of annual precipitation grids for a given site. Within this site you have a set of study plots and you want to extract precipitation values from each grid for each of your study plots. This is great application of zonal statistics. If you plots are points, zonal statistics will simply extract precipitation values for the location of each point. If your plots are lines or polygons, zonal statistics can be used to calculate the mean (or some other statistic) precipitation for each plot.

    Skill Relevance and Usefulness

    Use of zonal statistics is widely applicable across disciplines that utilize spatial datasets.

    What You'll Need

    The approach shown here uses the mpatools and raster libraries in R http://cran.r-project.org/web/packages/maptools/maptools.pdf http://cran.r-project.org/web/packages/raster/raster.pdf

    A surprising number of people is unaware that you can use GIS shapefiles in R.The maptools library imports .shp points, lines and polygons

    Example Code

    This is a code that you could adapt for your own purposes; hopefully it is enough to guide you. You'll obviously need to designate your own directories and name your own files. Also, this code contains lines for polygons and points; you may very well want one or the other. The list function might be confusing. I used pattern-matching to pick out only March precipitation grids from my directory (which contained grids for all months). The pattern="mar.asc$" tells R to pick out files with a specific type of name, in this case ascii grids for March.

    This example extracts March precipitation data for a set of study plots in the Tehachapi Mountains, CA. The outputs are csv files written to a user-specified directory.


    # Import a shapefile to R and use it to extract zonal statistics from a directory of rasters

    # Update working directory

    setwd("H:/Ian_GIS/Climate/precip/Tejon/Historic")

    # Load raster package (may have to install first)

    library(raster)

    # Make list of asci files in already specified working directory

    Clim_list = list.files(pattern = "mar.asc$") # "mar.asc$" queries files in directory ending in this pattern

    # Check number of files in raster list

    length = length(Clim_list)

    # Crete stack of rasters in list

    Clim_stack = stack(Clim_list)

    # Create spatial dataset from shapefile (use points, polygons or lines)

    library(maptools)

    points = readShapePoints("H:/Ian_GIS/Tejon_data/TejonPlots/TejonPoints")

    studyarea = readShapePoly("H:/Ian_GIS/Tejon_data/FullStudyArea/Tejon_study_area",IDvar="ID")

    # Extract raster pixels from point dataset for(j in 1:length) {

     ex = extract(Clim_stack,points,method='simple',layer=1,nl=length, df=T)
     ex$ID = NULL}
    

    # Extract study area mean from polygon dataset for(j in 1:length) {

     bus = extract(Clim_stack,studyarea, fun=mean, layer=1, nl=length, df=T, na.rm=T)
     bus$ID = NULL}
    

    bus = t(bus)

    # Output csv file (point data)

    write.csv(ex, "H:/Ian_GIS/Tejon/TejonPlots/Mar_precip_pts.csv", row.names=plots$Id, na="NA")

    # Output csv file (zonal polygon data)

    write.csv(bus, "H:/Ian_GIS/Tejon/FullStudyArea/Mar_precip_SA.csv", na="NA")


    Properties
    Credits
    Users who have contributed to this Task, its SubTasks and Answers:
    Yandex.Metrica