Project

General

Profile

Download (9.5 KB) Statistics
| Branch: | Revision:
1
##############################################################################################
2
#
3
# makeMarkTable.r
4
# 
5
# R script generates table of adjacent ASTER / SRTM / Mosaic Border / CDEM pixel values
6
# to be used to generate plots of 'delta elevation' vs 'pixel pair proximity' and 'elevation'
7
# suggested by Mark Schildhauer on May 3. 
8
#
9
# Author: Rick Reeves, NCEAS
10
# May 4, 2011
11
##############################################################################################
12
#
13
makeMarkTable <- function()
14
{
15
require(raster)
16
require(rgdal)
17

    
18
#inputFirstRaster <- raster(sFirstImageName)
19
#inputSecondRaster <- raster(sSecondImageName)
20

    
21
inputCgiarRaster  <- raster("/data/project/organisms/rcr/AsterCgiarMerge/mergeCgiarAsterBdySRTM_BL.tif")
22
inputAsterRaster  <- raster("/data/project/organisms/rcr/AsterCgiarMerge/mergeCgiarAsterBdyASTER_BL.tif")
23
inputMosaicRaster <- raster("/data/project/organisms/rcr/ValidateBoundary/mergeCgiarAsterBdyTuesdayClip.tif")
24
inputCDEMRaster   <- raster("/data/project/organisms/rcr/ValidateBoundary/CDemMosTuesdayClipMergeSpace.tif")
25
#
26
# Difference image for entire merged image takes a while to create, 
27
# so we created it once, now read it back in.
28
#
29
rDeltaWhole <- raster("/data/project/organisms/rcr/ValidateBoundary/DeltaEntireImage.tif")
30
rDeltaWhole@data@values <-getValues(rDeltaWhole)
31

    
32
# Create extent objects used to extract raster subimges. 
33
# The object will be centered along the 60 degree North latitude line,
34
# and have varying depths (number of rows).
35
# The Western Canada study area runs from -135 (west) to -100 (west) longitude,
36
# and 55.0 to 64.00 degrees (north) latitude. 
37
# the ASTER and SRTM/CGIAR image components are merged at the 60 Deg N Latitude line.
38

    
39
#eTestAreaExtent <- extent(-135.2,-100.2, 59.997,60.001) # Creates a 5 row subimage
40
eTestAreaExtent <- extent(-135.2,-100.2, 59.995,60.005) # Creates a 12 row subimage
41

    
42
# Extract a sub image corresponding to the selected extent.
43
# Two different alternatives:
44
# The extract() function returns a vector of cell values, 
45
# the crop() function returns a complete raster* object.
46

    
47
#vEdgeRegionMosaic <- extract(inputMosaicRaster,eTestAreaExtent)
48
#vEdgeRegionCDEM <- extract(inputCDEMRaster,eTestAreaExtent)
49

    
50
rEdgeRegionAster <- crop(inputAsterRaster,eTestAreaExtent)
51
rEdgeRegionCgiar <- crop(inputCgiarRaster,eTestAreaExtent)
52
rEdgeRegionMosaic <- crop(inputMosaicRaster,eTestAreaExtent)
53
rEdgeRegionCDEM <- crop(inputCDEMRaster,eTestAreaExtent)
54

    
55
# Important: In order for the image subtraction to work, the extents
56
#            of the two images must be IDENTICAL. I used ArcMap GIS Raster Crop By Mask
57
#            to create subimages with identical extents. 
58

    
59
# Compute the difference image  for the entire study area, and for the region along
60
# the boundary (narrow, maybe 10 pixels either side)
61

    
62
rEdgeRegionDelta <- rEdgeRegionMosaic - rEdgeRegionCDEM  # not used in this version (yet)
63

    
64
# Create this image one time, read it in thereafter.
65
#rDeltaWhole <- inputMosaicRaster - inputCDEMRaster
66
#writeRaster(rDeltaWhole,filename="DeltaMosaicCDEMSubmage.tif",format="GTiff",datatype="INT2S",overwrite=TRUE)
67

    
68
# Using the large difference image, compute subimagee statistics for areas
69
# North (ASTER) and South (SRTM) of the boundary. These give us an idea 
70
# re: differences between ASTER and CDEM and CGIAR/SRT and CDEM
71
# what is raster package way of using subscripts to extract? 
72

    
73
# Now, the interesting part: using the boundary difference image, randomly select 
74
# one-degree N-S strips throughout the image, and compare adjacent pixel pairs 
75
# above and below the boundary with pixel pairs straddling the boundary. Subtract  
76
# the pairs, save the collection of (absolute value) of the differences in a vector,
77
# so that we have a population of differences above, below, and straddling the boundary 
78
# line. Compare the populations.
79

    
80
# get a vector of random column index numbers, constrained by column dimension of image
81
# Loop three times, sampling pixel pairs from above, below, across the border
82

    
83
nColsToGet <- 1000
84
iDiffVecNorth <- vector(mode="integer",length=nColsToGet)
85
iDiffVecBorder <- vector(mode="integer",length=nColsToGet)
86
iDiffVecSouth <- vector(mode="integer",length=nColsToGet)
87

    
88
#colsToGet <-sample(1:50,nColsToGet)
89

    
90
# Note: initially, sample the same columns in all regions to get a profile.
91
#       other 'sample()' calls can be commented out to sample differenct
92
#       coluns in each 'region'.
93

    
94
# iDiffVecxxxx is a population of differences between adjacent cell pairs. 
95
# Compute iDiffVecNorth/Border/South on either side of border, and across it. 
96
# note that North and South samples taken from larger difference image for 
97
# entire mosaic (sub) image; iDiffBorder taken from the edge region extracted
98
# from the center of the lerger image.
99

    
100
# Remember, we are sampling a PAIR of pixels (same column from two adjacent rows)
101

    
102
#browser()
103
# debug
104
#nColsToGet <- 2
105
#colsToGet <- c(20,100)
106
#iFirstRow <- 300
107
#iCtr = 1
108
#for (iNextCol in colsToGet)
109
#{
110
#  rColVec <- cellFromRowCol(rDeltaWhole,iFirstRow:(iFirstRow+1),iNextCol:iNextCol)
111
# neighborCells <- rDeltaWhole@data@values[rColVec]
112
#  iDiffVecNorth[iCtr] <- neighborCells[2] - neighborCells[1]
113
#iCtr = iCtr + 1
114
#}
115
#
116

    
117
# Here is the output matrix, (nColSamples * 3) rows, four columns 
118
colsToGet <-sample(1:inputMosaicRaster@ncols,nColsToGet)
119
message("North Sample")
120

    
121
mOutTable <- matrix(nrow=(nColsToGet * 3), ncol=5)
122
colnames(mOutTable) <- c("ColumnID","elevNorth","elevSouth","cdemNorth","cdemSouth")
123
# in this difference image, the border edge occurs at column 6
124
message("Border Sample - different columns")
125
#browser()
126
#colsToGet <-sample(1:inputFirstRaster@ncols,nColsToGet)
127
iFirstRow <- 4 # two rows before the border           
128
iLastRow  <- 7 # two rows after the border
129
iRowCtr = 1 # points to latest output table being written
130
for (iNextCol in colsToGet)
131
{
132
  rColVecAster  <- cellFromRowCol(rEdgeRegionAster,iFirstRow:(iLastRow),iNextCol:iNextCol)
133
  rColVecCgiar  <- cellFromRowCol(rEdgeRegionCgiar,iFirstRow:(iLastRow),iNextCol:iNextCol)
134
  rColVecMosaic <- cellFromRowCol(rEdgeRegionMosaic,iFirstRow:(iLastRow),iNextCol:iNextCol)
135
  rColVecCDEM   <- cellFromRowCol(rEdgeRegionCDEM,iFirstRow:(iLastRow),iNextCol:iNextCol)  
136
  
137
# Split the column vector into the pairs that Mark requested 
138
# For each column sampled, the output table has three rows:
139
#
140
# Row 1: from (input) Aster layer:  Two pixels above border
141
# Row 2: from (input) Mosaic layer: Two pixels straddling border
142
# Row 3: from (input) Cgiar layer:  Two pixels below border
143
#
144
# each with four columns, arranged into two column pairs:
145
#
146
#  North Pixel and South Pixel elevation, North Pixel and South Pixel CDEM (baseline)
147
# 
148
  mOutTable[iRowCtr][1]   <- iNextCol           # The (radomly sampled) col ID (surrogate for longitude)
149
  mOutTable[iRowCtr][2:3] <- rColVecAster[1:2]  # First column pair from extracted vector: 
150
  mOutTable[iRowCtr][4:5] <- rColVecCDEM[1:2]   # entirely top (ASTER) image 
151
  iRowCtr = iRowCtr + 1
152
#  
153
  mOutTable[iRowCtr][1]   <- iNextCol           # The (radomly sampled) col ID (surrogate for longitude)
154
  mOutTable[iRowCtr][2:3] <- rColVecMosaic[3:4] # Second column pair: 
155
  mOutTable[iRowCtr][4:5] <- rColVecCDEM[3:4]   # straddles border region (from Mosaic image)
156
  iRowCtr = iRowCtr + 1  
157
#  
158
  mOutTable[iRowCtr][1]   <- iNextCol           # The (radomly sampled) col ID (surrogate for longitude)
159
  mOutTable[iRowCtr][2:3] <- rColVecCgiar[5:6]  # third column pair:
160
  mOutTable[iRowCtr][4:5] <- rColVecCDEM[5:6]   # entirely bottom (SRTM) image 
161
  iRowCtr = iRowCtr + 1  
162
#
163
}
164
#
165
# write the table out as CSV file
166
# TODO: add the column ID (proximity indicator
167
message("hit key to write output table..")
168
browser()
169
writeCSV(mOutTable,file="tableForMark.csv",row.names=FALSE)
170
#
171
#message("South Sample - different columns")
172
#browser()
173
#colsToGet <-sample(1:inputFirstRaster@ncols,nColsToGet)
174
#iFirstRow <- 3600
175
#iCtr = 1
176
#for (iNextCol in colsToGet)
177
#{
178
#  rColVec <- cellFromRowCol(rDeltaWhole,iFirstRow:(iFirstRow+1),iNextCol:iNextCol)
179
#  neighborCells <- rDeltaWhole@data@values[rColVec]
180
#  iDiffVecSouth[iCtr] <- neighborCells[2] - neighborCells[1]
181
#  iCtr = iCtr + 1 
182
#}
183
# Compute iDiffVecs on either side of border, and across it. 
184
message("Check the cell difference vectors...")
185
#browser()
186

    
187
# summary stats for each population
188

    
189
#sNorthSum <- sprintf("ASTER sample summary: Min: %f / Median: %d / Mean: %f / Max: %f / Variance: %f sDev: %f",
190
#                     min(iDiffVecNorth,na.rm=TRUE),median(iDiffVecNorth,na.rm=TRUE),mean(iDiffVecNorth,na.rm=TRUE),
191
#                     max(iDiffVecNorth,na.rm=TRUE),var(iDiffVecNorth,na.rm=TRUE),sd(iDiffVecNorth,na.rm=TRUE))
192

    
193
sBorderSum <- sprintf("Border sample summary: Min: %f / Median: %d / Mean: %f / Max: %f / Variance: %f sDev: %f",
194
                     min(iDiffVecBorder,na.rm=TRUE),median(iDiffVecBorder,na.rm=TRUE),mean(iDiffVecBorder,na.rm=TRUE),
195
                     max(iDiffVecBorder,na.rm=TRUE),var(iDiffVecBorder,na.rm=TRUE),sd(iDiffVecBorder,na.rm=TRUE))
196

    
197
#sSouthSum <- sprintf("STRM sample summary: Min: %f / Median: %d / Mean: %f / Max: %f / Variance: %f sDev: %f",
198
#                     min(iDiffVecSouth,na.rm=TRUE),median(iDiffVecSouth,na.rm=TRUE),mean(iDiffVecSouth,na.rm=TRUE),
199
#                     max(iDiffVecSouth,na.rm=TRUE),var(iDiffVecSouth,na.rm=TRUE),sd(iDiffVecSouth,na.rm=TRUE))
200
#
201
message(sprintf("statistics for %d N/S adjacent pixel pairs from three mosaic image regions:",nColsToGet))
202
#message(sNorthSum)
203
message(sBorderSum)
204
#mssage(sSouthSum)
205

    
206
}
(2-2/2)