|
1 |
# Exploratory assessment of differences between ESRI's flow direction
|
|
2 |
# output and GRASS Terraflow's flow direction output, with focus here on
|
|
3 |
# the SFD (D8) Terraflow output, which is (I think) basically the same
|
|
4 |
# as what ESRI uses.
|
|
5 |
#
|
|
6 |
# The input DEM in all cases is what I gather to be the Oregon case
|
|
7 |
# study DEM, which is this 3x3 degree, 3" resolution, smoothed (somehow?
|
|
8 |
# by someone?) SRTM:
|
|
9 |
# jupiter:~organisms/flow/experimental/srtmv41_smth
|
|
10 |
#
|
|
11 |
# The ESRI flowdirection raster used here is what I gather was produced by
|
|
12 |
# layers.aml, which applies the GRID flowdirection function to the
|
|
13 |
# smoothed DEM to produce this output:
|
|
14 |
# jupiter:~organisms/flow/experimental/flowdir
|
|
15 |
#
|
|
16 |
# I converted both of the above rasters to GeoTIFFs to bring them over
|
|
17 |
# to my machine to work with.
|
|
18 |
#
|
|
19 |
# I then generated the two Terraflow output flow direction grids (SFD
|
|
20 |
# and MFD) using the commands contained in grass-terraflow.sh.
|
|
21 |
#
|
|
22 |
# Other resources:
|
|
23 |
# * ESRI ArcGIS 9.3 Flow Direction documentation
|
|
24 |
# http://webhelp.esri.com/arcgisdesktop/9.3/index.cfm?topicname=flow%20direction
|
|
25 |
# * GRASS terraflow documentation
|
|
26 |
# http://grass.osgeo.org/grass64/manuals/html64_user/r.terraflow.html
|
|
27 |
#
|
|
28 |
# Jim Regetz
|
|
29 |
# NCEAS
|
|
30 |
# Created 16-Jun-2011
|
|
31 |
|
|
32 |
|
|
33 |
# data directory (local to xander)
|
|
34 |
datadir <- "~/media/temp/dem/new/flow"
|
|
35 |
|
|
36 |
# load data
|
|
37 |
|
|
38 |
# ESRI flowdirection output (see notes above)
|
|
39 |
or.flowdir.esri <- raster(file.path(datadir, "flowdir_OR_esri.tif"))
|
|
40 |
# GRASS terraflow (MFD) output
|
|
41 |
or.flowdir.grass.mfd <- raster(file.path(datadir,
|
|
42 |
"flowdir_OR_grass.tif"))
|
|
43 |
# GRASS terraflow (SFD) output
|
|
44 |
or.flowdir.grass.sfd <- raster(file.path(datadir,
|
|
45 |
"flowdir_OR_grass_sfd.tif"))
|
|
46 |
|
|
47 |
# create raster indicating where ESRI and terraflow(SFD) differ
|
|
48 |
flow.disagreement <- or.flowdir.esri
|
|
49 |
flow.disagreement[] <- ifelse(values(or.flowdir.esri !=
|
|
50 |
or.flowdir.grass.sfd), 1, NA)
|
|
51 |
|
|
52 |
# illustrated differences
|
|
53 |
plot(or.hs, col=grey.colors(100))
|
|
54 |
mp <- prod(dim(flow.disagreement))
|
|
55 |
plot(flow.disagreement, add=TRUE, col="blue", legend=FALSE, maxpixels=mp)
|
|
56 |
|
|
57 |
# now isolate differences in cases where terraflow is not zero (i.e.,
|
|
58 |
# places calculated as pits?
|
|
59 |
flow.disagreement[or.flowdir.grass.sfd==0] <- NA
|
|
60 |
plot(flow.disagreement, add=TRUE, col="red", legend=FALSE, maxpixels=mp)
|
|
61 |
|
|
62 |
# notice what happens at the edges...
|
|
63 |
|
|
64 |
# in northernmost row, esri routes most cells east or west (i.e, along
|
|
65 |
# border) plus some north, and a few other misc directions
|
|
66 |
table(as.matrix(or.flowdir.esri)[1,])
|
|
67 |
## 1 2 4 8 16 32 64
|
|
68 |
## 1574 4 1 3 1600 1 425
|
|
69 |
|
|
70 |
# whereas terraflow SFD routes all cells north
|
|
71 |
table(as.matrix(or.flowdir.grass.sfd)[1,])
|
|
72 |
## 64
|
|
73 |
## 3608
|
|
74 |
|
|
75 |
# (analogous patterns for the other 3 raster edges)
|
|
76 |
|
|
77 |
# quantify proportion in concordance, excluding the edges
|
|
78 |
edges <- c(1, 3608)
|
|
79 |
mean(as.matrix(or.flowdir.esri)[-edges, -edges] ==
|
|
80 |
as.matrix(or.flowdir.grass.sfd)[-edges, -edges])
|
|
81 |
## [1] 0.9086855
|
|
82 |
|
|
83 |
# ...and what proportion are either in concordance or have 0 values
|
|
84 |
# associated with terraflow SFD? (means pits?)
|
|
85 |
mean((as.matrix(or.flowdir.esri)[-edges, -edges] ==
|
|
86 |
as.matrix(or.flowdir.grass.sfd)[-edges, -edges]) |
|
|
87 |
as.matrix(or.flowdir.grass.sfd)[-edges, -edges]==0)
|
|
88 |
## [1] 0.9755789
|
|
89 |
|
added GRASS/R code to run/compare flow analysis on Oregon test area