wps/src/main/webapp/R/scripts/demo_timeseries-plot.R

151 lines
5.7 KiB
R
Executable File

# Copyright (C) 2011 by 52 North Initiative for Geospatial Open Source Software GmbH, Contact: info@52north.org
# This program is free software; you can redistribute and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed WITHOUT ANY WARRANTY; even without the implied WARRANTY OF MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program (see gpl-2.0.txt). If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA or visit the Free Software Foundation web page, http://www.fsf.org.
# Author: Daniel Nuest (daniel.nuest@uni-muenster.de)
# Project: sos4R - visit the project web page, http://www.nordholmen.net/sos4r
library("sos4R")
library("xts")
myLog <- function(...) {
cat(paste0("[timeseriesPlot] ", ..., "\n"))
}
myLog("Start script... ", Sys.time())
# wps.off;
# wps.des: id = demo.timeseriesPlot, title = Plot SOS Time Series,
# abstract = Accesses a SOS with sos4R and creates a plot with a fitted
# regression line;
# wps.in: sos_url, string, title = SOS service URL,
# abstract = SOS URL endpoint,
# minOccurs = 1, maxOccurs = 1;
sos_url <- "http://sensorweb.demo.52north.org/PegelOnlineSOSv2.1/sos"
# wps.in: offering_id, type = string, title = identifier for the used offering,
# minOccurs = 1, maxOccurs = 1;
offering_id <- "WASSERSTAND_ROHDATEN"
# wps.in: offering_stationname, type = string,
# title = string contained in identifier for the used offering,
# minOccurs = 1, maxOccurs = 1;
offering_stationname <- "Bake"
# wps.in: offering_hours, integer, temporal extent,
# the number of hours the plot spans to the past,
# value = 24, minOccurs = 0, maxOccurs = 1;
offering_hours <- 24
# wps.in: image_width, type = integer,
# title = width of the generated image in pixels,
# value = 800, minOccurs = 0, maxOccurs = 1;
# wps.in: image_height, type = integer,
# title = height of the generated image in pixels,
# value = 500, minOccurs = 0, maxOccurs = 1;
image_width = 800;
image_height = 500;
# wps.in: loess_span, type = double, title = local regression span parameter,
# value = 0.75,
# minOccurs = 0, maxOccurs = 1;
loess_span <- 1
# wps.on;
################################################################################
# SOS and time series analysis
converters <- SosDataFieldConvertingFunctions(
"WASSERSTAND_ROHDATEN" = sosConvertDouble,
"LUFTTEMPERATUR" = sosConvertDouble)
myLog("Creating SOS connection to ", sos_url)
# establish a connection to a SOS instance with default settings
sos <- SOS(url = sos_url, dataFieldConverters = converters)
# wps.off;
names(sosOfferings(sos))
# wps.on;
# set up request parameters
offering <- sosOfferings(sos)[[offering_id]]
myLog("Requesting for offering:\n", toString(offering))
offering_station_idxs <- grep(pattern = offering_stationname,
sosProcedures(offering))
# select on station at random
stationFilter <- sosProcedures(offering)[
offering_station_idxs[sample(1:length(offering_station_idxs), 1)]]
myLog("Requesting data for station ", stationFilter)
observedPropertyFilter <- sosObservedProperties(offering)[1]
myLog("Requesting data for observed property ", observedPropertyFilter)
timeFilter <- sosCreateEventTimeList(sosCreateTimePeriod(sos = sos,
begin = (Sys.time() - 3600 * offering_hours), end = Sys.time()))
myLog("Requesting data for time ", toString(timeFilter))
# make the request
myLog("Send request...")
observation <- getObservation(sos = sos,# verbose = TRUE,
#inspect = TRUE,
observedProperty = observedPropertyFilter,
procedure = stationFilter,
eventTime = timeFilter,
offering = offering)
data <- sosResult(observation)
# summary(data)
# str(data)
myLog("Request finished!"); myLog(toString(str(data)))
# create time series ###########################################################
timeField <- "SamplingTime"
valuesIndex <- 3
values <- data[[names(data)[[valuesIndex]]]]
# create time series from data and plot
timeSeries <- xts(x = values, order.by = data[[timeField]])
# calculate regression (polynomial fitting)
regressionValues <- data[[names(data)[[valuesIndex]]]]
regressionTime <- as.numeric(data[[timeField]])
regression = loess(regressionValues~regressionTime, na.omit(data),
span = loess_span)
# create plot ##################################################################
timeseries_plot <- "output.jpg"
jpeg(file = timeseries_plot, width = image_width, height = image_height,
units = "px", quality = 90, bg = "#f3f3f3")
.title <- paste0("Dynamic Time Series Plot for ", toString(stationFilter))
p <- plot(timeSeries, main = .title,
sub = paste0(toString(unique(data[["feature"]])), "\n", sosUrl(sos), " @ ",
toString(Sys.time())),
xlab = attr(data[[timeField]], "name"),
ylab = paste0(attr(values, "name"),
" [", attr(values, "unit of measurement"), "]"),
major.ticks = "days")
lines(data[[timeField]], regression$fitted, col = 'red', lwd = 3)
graphics.off()
myLog("Created image: ", timeseries_plot)
myLog("Working directory: ", getwd())
# wps.out: timeseries_plot, type = jpeg, title = time series plot,
# abstract = the output image as a graphic in jpeg format;
# test plot ####################################################################
# wps.off;
plot(timeSeries, main = "Test plot",
sub = paste0(toString(unique(data[["feature"]])), "\n", sosUrl(sos)),
xlab = attr(data[[timeField]], "name"),
ylab = paste0(attr(values, "name"),
" [", attr(values, "unit of measurement"), "]"),
major.ticks = "days")
lines(data[[timeField]], regression$fitted, col = 'red', lwd = 3)
# wps.on;