wps/src/main/webapp/R/resources/pegel-report.Rnw

331 lines
11 KiB
Plaintext
Executable File

% Copyright (C) 2012< by 52°North Initiative for Geospatial Open Source Software GmbH, Contact: info@52north.org
% This document is licensed under Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0), see http://creativecommons.org/licenses/by-sa/3.0/ for details.
% Author: Daniel Nuest (d.nuest@52north.org)
\documentclass{article}
% page margins: http://www.sharelatex.com/learn/Page_size_and_margins
\usepackage[a4paper, margin=2cm]{geometry}
\usepackage{graphicx, verbatim}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{soul} % for \hl
\usepackage{pbox} % for new line in table
% \usepackage[section]{placeins}
% \usepackage{placeins} % for \FloatBarrier
% http://stackoverflow.com/questions/1673942/latex-table-positioning
\usepackage{float}
\restylefloat{table}
\usepackage{listings}
\lstloadlanguages{XML,Java,R}
\usepackage{courier}
\lstset{breaklines=true,basicstyle=\ttfamily}
\begin{document}
\SweaveOpts{concordance=TRUE}
% overall graphics size
\setkeys{Gin}{width=.5\linewidth}
% http://www.math.montana.edu/~jimrc/classes/Rseminar/SweaveIntro.html
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{Pegelonline Datenbericht}
\author{52$^\circ$North}
\maketitle
%\section{Abstract}
%Dieses Dokument demonstriert eine transparente Berichtgenerierung mit Hilfe von Open Source Softwarekomponenten von 52$^\circ$North. Diese Datei wurde auf Basis von live Daten in einem 52$^\circ$North Web Processing Service\footnote{\url{http://52north.org/communities/geoprocessing/wps/}} (WPS) mit Hilfe von WPS4R\footnote{\url{{http://52north.org/communities/geoprocessing/wps/backends/52n-wps-r.html}} auf der Basis von R\footnote{\url{http://r-project.org/}}, \LaTeX{}\footnote{\url{http://www.latex-project.org/}} und Sweave\footnote{\url{http://www.statistik.lmu.de/~leisch/Sweave/}} generiert.
<<label=libraries, echo=FALSE, results=hide>>=
library("sos4R")
library("latticeExtra")
library("quantreg")
library(maps); library(mapdata); library(maptools);
library("sp"); library("rgdal")
@
<<label=inputs, echo=FALSE, results=hide>>=
# can be inputs later, to be defined in the script file as wps inputs
if(exists("tPeriod_days")) {
cat("[pegel] Found param tPeriod_days: ", tPeriod_days, "\n")
} else {
tPeriod_days <- 1
}
if(exists("offering_name")) {
cat("[pegel] Found param offering_name: ", offering_name, "\n")
} else {
offering_name <- "WASSERSTAND_ROHDATEN"
}
if(exists("procedure_filter")) {
cat("[pegel] Found param procedure_filter: ", procedure_filter, "\n")
} else {
# http://sensorweb.demo.52north.org/PegelOnlineSOSv2.1/sos?REQUEST=GetCapabilities&SERVICE=SOS
procedure_filter <- "*Wasserstand-Bake*"
#procedure_filter <- "*Papenburg*"
}
if(exists("process_description_url")) {
cat("[pegel] Found process description URL: ", process_description_url, "\n")
} else {
process_description_url <- "N/A"
}
cat("[pegel] Input values:\n\tdays=", tPeriod_days, "\n\toffering=", offering_name, "\n\tprocedure filter=", procedure_filter, "\n")
@
<<label=helpers, echo=FALSE, results=HIDE>>=
cleanName <- function(obj) {
.name <- toString(obj)
.cleaned <- gsub("_", " ", .name)
return(.cleaned)
}
# to check the output use cat(cleanName(sensors))
@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<<label=metadata_service, echo=FALSE, results=hide>>=
#pegelsos <- SOS(url = "http://pegelonline.wsv.de/webservices/gis/gdi-sos")
converters <- SosDataFieldConvertingFunctions(
"WASSERSTAND_ROHDATEN" = sosConvertDouble,
"LUFTTEMPERATUR" = sosConvertDouble,
"Wasserstand" = sosConvertDouble,
"m+NN" = sosConvertDouble)
pegelsos <- SOS(url = "http://sensorweb.demo.52north.org/PegelOnlineSOSv2.1/sos",
dataFieldConverters = converters)
procs <- sosProcedures(pegelsos)[[offering_name]]
if(exists("procedure_filter")) {
filter <- procs %in% grep(procedure_filter, procs, value=TRUE)
sensors <- subset(procs, filter)
} else {
sensors <- procs
}
cat("[pegel] sensors: ", toString(sensors), "\n")
offering <- sosOfferings(pegelsos)[[offering_name]]
observed_property <- sosObservedProperties(offering)[1]
# just use the first one
sensor <- sensors[1]
cat("[pegel] continuing with procedure: ", toString(sensor), "\n")
sensor.sml <- describeSensor(sos = pegelsos, procedure = sensor)
@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Pegelanalyse für Messtation(en) \Sexpr{cleanName(sensor)}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Metadaten}
% http://en.wikibooks.org/wiki/LaTeX/Tables
\begin{table}[H]
\centering
\begin{tabular}{l|l}
\hline
Service Title & \Sexpr{sosTitle(pegelsos)} \\
Service Abstract & \Sexpr{sosAbstract(pegelsos)} \\
Service Version & \Sexpr{sosVersion(pegelsos)} \\
Service URL & \Sexpr{sosUrl(pegelsos)} \\
Keywords & \Sexpr{cleanName(toString(pegelsos@capabilities@identification@keywords$Keywords.Keyword))} \\
& \href{\Sexpr{sosCapabilitiesUrl(pegelsos)}}{Capabilities} \\
\hline
Provider Name & \Sexpr{sosServiceProvider(pegelsos)@providerName} \\
Provider Site & \Sexpr{sosServiceProvider(pegelsos)@providerSite} \\
\hline
Offering ID & \Sexpr{cleanName(sosId(offering))} \\
Offering Name & \Sexpr{sosName(offering)} \\
Observed Property & \Sexpr{cleanName(observed_property)} \\
\hline
\end{tabular}
\caption{Service Metadaten}
\label{tab:service_metadata}
\end{table}
% \FloatBarrier
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Messstation}
Der Sensor \Sexpr{cleanName(sensor)} befindet sich an den Koordinaten $\Sexpr{sosCoordinates(sensor.sml)}$. Die rohe Sensorbeschreibung lautet wie folgt.
%<<station,echo=TRUE,results=verbatim>>=
%sensor.sml
%@
% http://en.wikibooks.org/wiki/LaTeX/Tables
\begin{table}[H]
\centering
\begin{tabular}{l|l}
\hline
Station ID & \Sexpr{cleanName(sosId(sensor.sml))} \\
Station Name & \Sexpr{cleanName(sosName(sensor.sml))} \\
Station Description & \Sexpr{cleanName(sosAbstract(sensor.sml))} \\
Observed Area & $ \Sexpr{toString(sosBoundedBy(sensor.sml))} $ (lon min, lat min, lon max, lat max)\footnote{Projektionsparameter: \Sexpr{cleanName(CRSargs(sosGetCRS(sensor.sml)))}} \\
\hline
\end{tabular}
\caption{Messstation Metadaten}
\label{tab:station_metadata}
\end{table}
% \FloatBarrier
% TODO plot station location
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<<label=plotstation, echo=FALSE, results=hide, fig=TRUE>>=
# CRS
sensor.crs <- sosGetCRS(sensor.sml)
worldHigh <- pruneMap(map(database = "worldHires", region = "Germany",
plot = FALSE))
worldHigh_Lines <- map2SpatialLines(worldHigh, proj4string = sensor.crs)
plot(worldHigh_Lines, col = "grey50")
proj4string(worldHigh_Lines)
sensor.point <- SpatialPoints(coords = sosCoordinates(sensor.sml),
proj4string = sosGetCRS(sensor.sml))
plot(sensor.point, cex=1, pch = 3, add = TRUE)
# data(world.cities)
# map.cities(label = TRUE, pch = 19, col = "black")
map.axes()
map.scale()
title(main = paste0("Messstation ", sosName(sensor.sml)))
@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\section{Analyse}
Im folgenden wird eine einfach Zeitreihenanalyse für die vorliegende Messstation durchgeführt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Analyserahmen}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<<label=metadata_analysis, echo=FALSE, results=hide>>=
tPeriod.end <- Sys.time()
tPeriod <- sosCreateEventTimeList(
time = sosCreateTimePeriod(
sos = pegelsos,
begin = tPeriod.end - (3600 * 24 * tPeriod_days),
end = tPeriod.end))
cat("[pegel] time period: ", toString(tPeriod[[1]]), "\n")
@
Die Analysen umfassen einen Zeitraum von \Sexpr{tPeriod_days} Tagen vor Erstellungszeit diese Dokumentes (\Sexpr{tPeriod.end}).
% do analysis here so that result metadata can be used
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<<label=request, echo=FALSE, results=hide>>=
pegelObs <- getObservation(sos = pegelsos,
observedProperty = observed_property,
offering = offering,
procedure = sensors,
eventTime = tPeriod)
r1 <- sosResult(pegelObs[[1]])
range(r1[[toString(observed_property)]])
r1clean <- subset(r1, toString(observed_property) > 0)
range(r1clean$Wasserstand)
@
\begin{table}[h]
\centering
\begin{tabular}{l|l}
\hline
Messgröße & \Sexpr{cleanName(names(r1))} \\
Messeinheit & \Sexpr{cleanName(sosUOM(r1))} \\
Zeitinterval & $ \Sexpr{range(r1clean$SamplingTime)[1]} $ bis $ \Sexpr{range(r1clean$SamplingTime)[2]} $ \\
Werteintervall & $ \Sexpr{range(r1clean$Wasserstand)} $ \\
Werteanzahl & $ \Sexpr{cleanName(dim(r1clean)[1])} $ \\
\hline
\end{tabular}
\caption{Metadaten der Messreihe(n)}
\label{tab:data_metadata}
\end{table}
% \FloatBarrier
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<<label=plotcode, echo=TRUE, results=hide>>=
r1plot <- xyplot(r1clean$Wasserstand ~ r1clean$SamplingTime, r1clean, type = "l",
col = "grey", xlab = "Time", ylab = "Wasserstand")
r1plot <- r1plot + layer(panel.quantile(x, y, tau = c(.95, .5, .05)))
@
Die folgende Analyse wurde durchgeführt: Plot a quantile regression line with standard error bounds, using the quantreg package. This is based on the stat\_quantile function from ggplot2.
% Sweave cheat sheet: http://users.aims.ac.za/~davidw/David_Wakyiku_sweavecs.pdf
\begin{figure}[h!]
\centering
<<label=plot, echo=FALSE, fig=TRUE>>=
r1plot
@
% http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions
% \includegraphics[width=0.9\textwidth]{pegel-plot.pdf}
\caption{Werte für \Sexpr{cleanName(sensor)} mit Quantile-basierter Regressionslinie und Fehlerintervall.}
\label{fig:QuantileRegression}
\end{figure}
% TODO more analysis, e.g. outlier detection, check for missing values, ...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\section{Reproduzierbarkeit}
Der folgende Code und Laufzeitumgebung wurden zur generierung dieses Berichtes verwendet.
% http://stackoverflow.com/questions/4362747/print-the-sourced-r-file-to-an-appendix-using-sweave
\subsection{Laufzeitumgebung}
<<SessionInforamtaion,echo=FALSE,results=tex>>=
toLatex(sessionInfo())
@
\subsection{Code}
Die originale \href{http://de.wikipedia.org/wiki/Sweave}{Sweave}-Datei dieses Dokumentes kann \href{resource_url_rnw_file}{hier} heruntergeladen werden. Sie enthält den gesamten Code der Analyse. Download der Prozessbeschreibung \href{\Sexpr{process_description_url}}{hier}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Kontakt}
Daniel Nüst, \href{mailto:d.nuest@52north.org}{d.nuest@52north.org}.
\subsection{Lizenz}
Dieses Dokument ist unter einer der Creative Commons Attribution-ShareAlike 3.0 Unported (CC-BY-SA 3.0) Lizenz veröffentlicht.
\begin{center}
\includegraphics[width=60px]{cc-by-sa.png}
\end{center}
\end{document}