Revision 0ffc32ec
Added by Jim Regetz over 13 years ago
- ID 0ffc32ecba5e3b5ddb28db10e30e0e55d59daa3a
terrain/boundary/boundary.Rnw | ||
---|---|---|
17 | 17 |
\usepackage{fancyhdr} |
18 | 18 |
\usepackage[font=normalsize,singlelinecheck=false]{subfig} |
19 | 19 |
|
20 |
|
|
20 | 21 |
\title{SRTM/ASTER boundary analysis} |
21 | 22 |
\author{Jim Regetz} |
22 | 23 |
\date{Last update: 23 Jun 2011} |
... | ... | |
25 | 26 |
\usepackage[utf8]{inputenc} |
26 | 27 |
\usepackage{a4wide} |
27 | 28 |
\usepackage{verbatim} |
29 |
\usepackage{listings} |
|
28 | 30 |
\usepackage[colorlinks=true,urlcolor=red]{hyperref} |
31 |
\usepackage{color} |
|
29 | 32 |
|
30 |
\topmargin 70pt |
|
33 |
%\topmargin 70pt
|
|
31 | 34 |
|
32 | 35 |
\pagestyle{fancy} |
33 | 36 |
\rfoot{} |
... | ... | |
35 | 38 |
\renewcommand {\headrulewidth}{0pt} |
36 | 39 |
\renewcommand {\footrulewidth}{0pt} |
37 | 40 |
|
41 |
% set some listings options |
|
42 |
\lstset{ |
|
43 |
basicstyle=\small\ttfamily, |
|
44 |
stringstyle=\ttfamily, |
|
45 |
commentstyle=\itshape\ttfamily, |
|
46 |
showstringspaces=false, |
|
47 |
} |
|
48 |
|
|
38 | 49 |
\begin{document} |
39 | 50 |
|
40 | 51 |
% define custom colors for R input and output |
... | ... | |
61 | 72 |
options(continue=" ") |
62 | 73 |
@ |
63 | 74 |
|
75 |
\paragraph{Region of analysis} For testing purposes, I used a narrow |
|
76 |
band along the 60N boundary in Canada (Figure \ref{focal-area}). The |
|
77 |
latitudinal extent of this band is 59.875N - 60.125N (i.e., 300 3" |
|
78 |
pixels straddling 60N), and the longitudinal extent is 136W to 96W |
|
79 |
(i.e., 48000 pixels wide). |
|
80 |
|
|
64 | 81 |
\begin{figure}[htp] |
65 |
\centering |
|
66 | 82 |
\caption{Focal area} |
67 |
<<echo=FALSE,results=hide,fig=TRUE>>= |
|
83 |
\centering |
|
84 |
<<echo=FALSE,results=hide,fig=TRUE,height=5,width=7>>= |
|
85 |
par(omi=c(0,0,0,0)) |
|
68 | 86 |
library(raster) |
69 | 87 |
library(maps) |
70 | 88 |
demdir <- "/home/regetz/media/temp/terrain/dem/" |
71 | 89 |
dem <- raster(file.path(demdir, "fused_300straddle.tif")) |
72 |
map("world", xlim=c(-140,-70), ylim=c(40, 70), fill=TRUE, col="grey") |
|
90 |
map("world", xlim=c(-140,-70), ylim=c(40, 70), fill=TRUE, col="grey", |
|
91 |
mar=c(4,0,0,0)) |
|
73 | 92 |
grid(col="darkgray") |
74 | 93 |
axis(1) |
75 | 94 |
axis(2) |
... | ... | |
78 | 97 |
arrows(-110, 57, -113, 59.7, col="red", length=0.1) |
79 | 98 |
text(-110, 57, labels="focal region", col="red", font=3, pos=1) |
80 | 99 |
@ |
100 |
\label{focal-area} |
|
81 | 101 |
\end{figure} |
82 | 102 |
|
83 |
\begin{figure}[htp] |
|
84 |
\caption{Weighting schemes} |
|
103 |
\paragraph{Fusion approaches} This document includes latitudinal |
|
104 |
characterizations of terrain values based on three different variants of |
|
105 |
a fused ASTER/SRTM DEM. I also explored (and briefly describe below) two |
|
106 |
additional approaches to fusing the layers, but do not include further |
|
107 |
assessment of these here. |
|
108 |
|
|
109 |
\subparagraph{Simple fusion} Naive concatentation of SRTM below 60N with |
|
110 |
ASTER above 60N, without applying any modifications to deal with |
|
111 |
boundary artifacts (Figure \ref{blend-simple}). |
|
112 |
|
|
113 |
\subparagraph{Multiresolution spline} Application of Burt \& Adelson's |
|
114 |
(1983) method for blending overlapping images using multiresolution |
|
115 |
splines, as implmented in the \emph{enblend} software package. Data prep |
|
116 |
and post-processing were handled in R (see Listing \ref{code-enblend}). |
|
117 |
As presented here, the ASTER and SRTM inputs were prepared such that the |
|
118 |
overlap zone is 75 latitudinal rows (6.75km) (Figure |
|
119 |
\ref{blend-multires}). |
|
120 |
|
|
121 |
\subparagraph{Gaussian weighted average} Blend of the two layers using |
|
122 |
weighted averaging such that the relative contribution of the SRTM |
|
123 |
elevation is zero at 60N, and increases according to a Gaussian function |
|
124 |
of distance moving south away from 60N. As presented here, this function |
|
125 |
was parameterized such that the ASTER and SRTM are equally weighted at a |
|
126 |
distance of $\sim$2.4km (26 cells) from the boundary, and the influence of |
|
127 |
ASTER is negligible by $\sim$5km from the boundary (Figure |
|
128 |
\ref{blend-gaussian}). |
|
129 |
|
|
130 |
\subparagraph{Others not shown} Fused with exponential ramp north of |
|
131 |
60N. The first step is to take the pixel-wise difference between ASTER |
|
132 |
and SRTM in the row immediately below 60N (i.e., the northmost extent of |
|
133 |
SRTM). An exponentially declining fraction of this difference is then |
|
134 |
then added back into the ASTER values north of 60N. This does a fine job |
|
135 |
of eliminating the artificial shelf and thus the appearance of a seam |
|
136 |
right along the 60N boundary, but it does not address the abrupt |
|
137 |
transition in texture (i.e., the sudden appearance of high frequency |
|
138 |
variability moving north across the boundary). Additionally, it |
|
139 |
introduces vertical ``ridges'' running north from the boundary. These |
|
140 |
arise because the calculated ramps are independent from one longitudinal |
|
141 |
``column'' to the next, and thus any changes in the boundary difference |
|
142 |
from one pixel to the next lead to adjacent ramps with different |
|
143 |
inclines. |
|
144 |
|
|
145 |
I also tried a simple LOESS predictive model. This involved first |
|
146 |
calculating the difference between ASTER and SRTM everywhere south of |
|
147 |
60N, and then fitting a LOESS line to these differences using the actual |
|
148 |
ASTER elevation as a predictor. I then used the fitted model to predict |
|
149 |
the ASTER-SRTM difference for ASTER cells north of 60N, and add a |
|
150 |
declining fraction (based on a Gaussian curve) of this difference to the |
|
151 |
ASTER values north of 60N. Conceptually, this amounts to applying an |
|
152 |
ASTER-predicted correction to the ASTER elevation values, where the |
|
153 |
correction term declines to zero according with increasing distance |
|
154 |
north of the bonudary. However, this method alone didn't yield |
|
155 |
particularly promising results in removing the 60N seam itself, |
|
156 |
presumably because adding a predicted correction at the boundary does |
|
157 |
not close the SRTM-ASTER gap nearly as efficiently as do corrections |
|
158 |
that are based on the actual elevation values. I therefore haven't |
|
159 |
pursued this any further, although it (or something like it) may prove |
|
160 |
useful in combination with one of the other methods. |
|
161 |
|
|
162 |
\begin{figure} |
|
163 |
\caption{SRTM/ASTER blend configurations} |
|
85 | 164 |
\centering |
86 |
\subfloat[Gaussian weighted blend]{ |
|
165 |
\subfloat[Simple fusion]{ |
|
166 |
\label{blend-simple} |
|
87 | 167 |
<<echo=FALSE,results=hide,fig=TRUE, height=3, width=6>>= |
88 |
par(omi=c(0,0,0,0), mar=c(4,4,1,2)+0.1) |
|
89 |
curve(exp(-0.001*x^2), from=-150, to=0, xlim=c(-150, 150), col="red", |
|
90 |
xaxt="n", bty="n", xlab="Latitude", ylab="Weighting") |
|
91 |
curve(1+0*x, from=0, to=150, add=TRUE, col="red") |
|
92 |
curve(1-exp(-0.001*x^2), from=-150, to=0, add=TRUE, col="blue") |
|
93 |
#axis(1, at=seq(-150, 150, by=60), labels=seq(59.875, 60.125, by=0.05)) |
|
94 |
#axis(1, at=0, labels=60, col="red", cex=0.85) |
|
95 |
axis(1, at=seq(-120, 120, by=60), labels=seq(59.9, 60.1, by=0.05)) |
|
96 |
text(-100, 0.6, labels="gaussian\nblend") |
|
97 |
text(-140, 0.9, labels="SRTM", col="blue", pos=4) |
|
98 |
text(-140, 0.1, labels="ASTER", col="red", pos=4) |
|
168 |
par(omi=c(0,0,0,0), mar=c(4,4,0,2)+0.1) |
|
169 |
plot(0, xlim=c(-150, 150), ylim=c(0, 1), type="n", xaxt="n", yaxt="n", |
|
170 |
bty="n", xlab="Latitude", ylab=NA) |
|
171 |
rect(0, 0, 150, 0.75, col="red", density=5, angle=45) |
|
172 |
rect(-150, 0, 0, 0.75, col="blue", density=5, angle=135) |
|
173 |
# axis(1, at=seq(-120, 120, by=60), labels=seq(59.9, 60.1, by=0.05)) |
|
174 |
axis(1, at=seq(-150, 150, by=75), labels=c(59.875, NA, 60, NA, 60.125)) |
|
175 |
text(-150, 0.9, labels="SRTM", pos=4, col="blue") |
|
176 |
text(150, 0.9, labels="ASTER", pos=2, col="red") |
|
99 | 177 |
@ |
100 | 178 |
}\\ |
101 | 179 |
\subfloat[Multiresolution spline]{ |
180 |
\label{blend-multires} |
|
102 | 181 |
<<echo=FALSE,results=hide,fig=TRUE, height=3, width=6>>= |
103 | 182 |
par(omi=c(0,0,0,0), mar=c(4,4,0,2)+0.1) |
104 | 183 |
plot(0, xlim=c(-150, 150), ylim=c(0, 1), type="n", xaxt="n", yaxt="n", |
105 | 184 |
bty="n", xlab="Latitude", ylab=NA) |
106 |
rect(-75, 0, 0, 0.75, col="purple")
|
|
185 |
rect(-75, 0, 0, 0.75, col="lightgray")
|
|
107 | 186 |
rect(-75, 0, 150, 0.75, col="red", density=5, angle=45) |
108 | 187 |
rect(-150, 0, 0, 0.75, col="blue", density=5, angle=135) |
109 | 188 |
#axis(1, at=seq(-150, 150, by=60), labels=seq(59.875, 60.125, by=0.05)) |
110 | 189 |
#axis(1, at=0, labels=60, col="red", cex=0.85) |
111 |
axis(1, at=seq(-120, 120, by=60), labels=seq(59.9, 60.1, by=0.05)) |
|
190 |
#axis(1, at=seq(-120, 120, by=60), labels=seq(59.9, 60.1, by=0.05)) |
|
191 |
axis(1, at=seq(-150, 150, by=75), labels=c(59.875, NA, 60, NA, 60.125)) |
|
112 | 192 |
text(-150, 0.9, labels="SRTM", pos=4, col="blue") |
113 | 193 |
text(-37.5, 0.8, labels="overlap", pos=3, font=3) |
114 | 194 |
text(150, 0.9, labels="ASTER", pos=2, col="red") |
115 | 195 |
@ |
196 |
}\\ |
|
197 |
\subfloat[Gaussian weighted average]{ |
|
198 |
\label{blend-gaussian} |
|
199 |
<<echo=FALSE,results=hide,fig=TRUE, height=3, width=6>>= |
|
200 |
par(omi=c(0,0,0,0), mar=c(4,4,1,2)+0.1) |
|
201 |
curve(exp(-0.001*x^2), from=-150, to=0, xlim=c(-150, 150), col="red", |
|
202 |
xaxt="n", bty="n", xlab="Latitude", ylab="Weighting") |
|
203 |
curve(1+0*x, from=0, to=150, add=TRUE, col="red") |
|
204 |
curve(1-exp(-0.001*x^2), from=-150, to=0, add=TRUE, col="blue") |
|
205 |
#axis(1, at=seq(-150, 150, by=60), labels=seq(59.875, 60.125, by=0.05)) |
|
206 |
#axis(1, at=0, labels=60, col="red", cex=0.85) |
|
207 |
#axis(1, at=seq(-120, 120, by=60), labels=seq(59.9, 60.1, by=0.05)) |
|
208 |
axis(1, at=seq(-150, 150, by=75), labels=c(59.875, NA, 60, NA, 60.125)) |
|
209 |
text(-100, 0.6, labels="gaussian\nblend") |
|
210 |
text(-140, 0.9, labels="SRTM", col="blue", pos=4) |
|
211 |
text(-140, 0.1, labels="ASTER", col="red", pos=4) |
|
212 |
@ |
|
213 |
} |
|
214 |
\end{figure} |
|
215 |
|
|
216 |
\newpage |
|
217 |
|
|
218 |
%\includepdfset{pagecommand=\thispagestyle{fancy}} |
|
219 |
%\setkeys{Gin}{width=1.8\linewidth} |
|
220 |
%\captionsetup[table]{position=top} |
|
221 |
|
|
222 |
|
|
223 |
\paragraph{Latitudinal terrain profiles (means)} |
|
224 |
|
|
225 |
\subparagraph{Elevation} As indicated in Figure \ref{mean-elevation}, |
|
226 |
the mean SRTM elevation is uniformly higher than the mean ASTER |
|
227 |
elevation at all latitudes in the area of overlap, by $\sim$11 meters. |
|
228 |
However, the shape of the profile itself is nearly identical between the |
|
229 |
two. As point of reference, the Canada DEM shares a similarly shaped |
|
230 |
profile, but with elevation values intermediate to the ASTER and SRTM. |
|
231 |
|
|
232 |
Not surprisingly, simple fusion produces an artificial cliff in the mean |
|
233 |
elevation profile. This artifact is completely removed by both the |
|
234 |
multiresolution spline and gaussian weighted average methods. The |
|
235 |
transition is, at least to the eye, slightly smoother in the former |
|
236 |
case, although ultimately this would depend on the chosen zone of |
|
237 |
overlap and on the exact parameterization of the weighting function. |
|
238 |
|
|
239 |
|
|
240 |
\subparagraph{Slope} As indicated in Figure \ref{mean-slope}, |
|
241 |
the mean ASTER slope is uniformly steeper than the mean SRTM |
|
242 |
elevation at all latitudes in the area of overlap, by nearly 1 degree. |
|
243 |
However, the shape of the profile itself is nearly identical between the |
|
244 |
two. Although this may partly reflect inherent SRTM vs ASTER |
|
245 |
differences, my guess is that CGIAR postprocessing of the particular |
|
246 |
SRTM product we're using has removed some of the high frequency |
|
247 |
``noise'' that remains in ASTER. |
|
248 |
|
|
249 |
Note that the he Canada DEM tends to be flatter than both ASTER and |
|
250 |
SRTM (presumably because it is at least partially derived from |
|
251 |
contour-based data (\textbf{check!})). Moreover, this figure makes it |
|
252 |
clear that the Canada DEM has some major artifacts at regular intervals. |
|
253 |
The spike especially at 60N (which coincides with provincial boundaries |
|
254 |
across the entirety of western Canada) means we probably need to scuttle |
|
255 |
our plans to use this DEM as a reference dataset for boundary analysis. |
|
256 |
|
|
257 |
The simple fused layer exhibits a dramatic spike in slope at the |
|
258 |
immediate 60N boundary, undoubtedly associated with the artificial |
|
259 |
elevation cliff. This artifact is eliminated by both the multiresolution |
|
260 |
spline and gaussian weighting. However, former exhibits a sudden step |
|
261 |
change in slope in the SRTM-ASTER overlap region, whereas the transition |
|
262 |
is smoothed out in the latter. This likely reflects the fact that the |
|
263 |
multiresolution spline effectively uses a very narrow transition zone |
|
264 |
for stitching together high frequency components of the input images, |
|
265 |
and I surmise these are precisely the features responsible for the shift |
|
266 |
in mean slope. |
|
267 |
|
|
268 |
\subparagraph{Aspect} As indicated in Figure \ref{mean-aspect}, |
|
269 |
the mean aspect of ASTER and SRTM are quite similar across all latitudes |
|
270 |
in the area of overlap. However, the shape of the |
|
271 |
profile itself is nearly identical between the |
|
272 |
two. Although this may partly reflect inherent SRTM vs ASTER |
|
273 |
differences, my guess is that CGIAR postprocessing of the particular |
|
274 |
SRTM product we're using has removed some of the high frequency |
|
275 |
``noise'' that remains in ASTER. |
|
276 |
|
|
277 |
%TODO: recalc aspect using circular mean? |
|
278 |
%TODO: run flow for enblend output? or just leave what we have, and |
|
279 |
%discuss that? be sure to mention that we're doing flow for a smaller |
|
280 |
%longitudinal range |
|
281 |
|
|
282 |
% |
|
283 |
% Latitudinal terrain profiles (means) |
|
284 |
% |
|
285 |
\begin{figure}[t!] |
|
286 |
\centering |
|
287 |
\caption{Latitudinal terrain profiles} |
|
288 |
\subfloat[Mean elevation (m)]{ |
|
289 |
\includegraphics[page=1, trim=1in 1in 1in 1in, width=\linewidth]{../dem/elevation-assessment.pdf} |
|
290 |
\label{mean-elevation} |
|
291 |
}\\ |
|
292 |
\newpage |
|
293 |
\subfloat[Mean slope (degrees)]{ |
|
294 |
\includegraphics[page=1, trim=1in 1in 1in 1in, width=\linewidth]{../slope/slope-assessment.pdf} |
|
295 |
\label{mean-slope} |
|
296 |
} |
|
297 |
\end{figure} |
|
298 |
\begin{figure}[h!] |
|
299 |
\ContinuedFloat |
|
300 |
\centering |
|
301 |
\captionsetup{position=top} |
|
302 |
\subfloat[Aspect (direction, 0=East)]{ |
|
303 |
\includegraphics[page=1, trim=1in 1in 1in 1in, width=\linewidth]{../aspect/aspect-assessment.pdf} |
|
304 |
\label{mean-aspect} |
|
305 |
}\\ |
|
306 |
\subfloat[Flow (D8 direction, 0=East)]{ |
|
307 |
\includegraphics[page=1, trim=1in 1in 1in 1in, width=\linewidth]{../flow/flowdir-assessment.pdf} |
|
308 |
\label{mean-flow} |
|
116 | 309 |
} |
117 | 310 |
\end{figure} |
118 | 311 |
|
119 |
%\newpage |
|
120 |
%\begin{center} |
|
121 |
%\includegraphics[width=\linewidth]{../dem/boundary-hillshade.png} |
|
122 |
%\end{center} |
|
312 |
\paragraph{Summary of findings} |
|
313 |
\begin{itemize} |
|
314 |
\item CDEM itself has problems |
|
315 |
\begin{itemize} |
|
316 |
\item 60N coincides with provincial boundaries; there are clear 60N |
|
317 |
artifacts in this layer! |
|
318 |
\item other evident tiling artifacts too |
|
319 |
\end{itemize} |
|
320 |
\item Big SRTM vs ASTER differences: |
|
321 |
\begin{itemize} |
|
322 |
\item ASTER is generally lower elevation |
|
323 |
\item ASTER has more high-frequency variability ("texture"), which |
|
324 |
affects slope/aspect? |
|
325 |
\end{itemize} |
|
326 |
\item Exponential ramping |
|
327 |
\begin{itemize} |
|
328 |
\item fixes seam itself |
|
329 |
\item leaves dramatic transition in SRTM/ASTER textural differences |
|
330 |
\item introduces ridging |
|
331 |
\end{itemize} |
|
332 |
\item Blending |
|
333 |
\begin{itemize} |
|
334 |
\item fixes seam itself |
|
335 |
\item smooths transition in textural differences |
|
336 |
\end{itemize} |
|
337 |
\item Other comments |
|
338 |
\begin{itemize} |
|
339 |
\item Routing is a big ball of wax |
|
340 |
\end{itemize} |
|
341 |
\end{itemize} |
|
342 |
|
|
343 |
\paragraph{To do (possibly)} |
|
344 |
\begin{itemize} |
|
345 |
\item add constant offset to ASTER? or maybe an offset that is a |
|
346 |
function of elevation? (revisit LOESS fit) |
|
347 |
\item smooth ASTER? |
|
348 |
\end{itemize} |
|
349 |
|
|
350 |
%TODO: include and discuss the RMSE/correlation plots |
|
351 |
|
|
352 |
%\includepdf[landscape=true,pages=-]{../dem/elevation-assessment.pdf} |
|
353 |
%\includepdf[landscape=true,pages=-]{../slope/slope-assessment.pdf} |
|
354 |
%\includepdf[landscape=true,pages=-]{../aspect/aspect-assessment.pdf} |
|
355 |
%\includepdf[landscape=true,pages=-]{../flow/flowdir-assessment.pdf} |
|
123 | 356 |
|
124 | 357 |
\newpage |
125 | 358 |
|
126 |
\centering |
|
127 |
\includepdfset{pagecommand=\thispagestyle{fancy}} |
|
128 |
\setkeys{Gin}{width=1.8\linewidth} |
|
129 |
\includepdf[landscape=true,pages=-]{../dem/elevation-assessment.pdf} |
|
130 |
\includepdf[landscape=true,pages=-]{../slope/slope-assessment.pdf} |
|
131 |
\includepdf[landscape=true,pages=-]{../aspect/aspect-assessment.pdf} |
|
132 |
\includepdf[landscape=true,pages=-]{../flow/flowdir-assessment.pdf} |
|
359 |
\appendix |
|
133 | 360 |
|
134 |
\verbatiminput{../dem/enblend.R} |
|
361 |
\lstinputlisting[language=R, caption={R wrapper code for multiresolution |
|
362 |
spline}, label=code-enblend]{../dem/enblend.R} |
|
135 | 363 |
|
136 | 364 |
\end{document} |
137 | 365 |
|
Also available in: Unified diff
added prose text to boundary document, and (partly) refactored figures