sp/0000755000176200001440000000000013125141530010667 5ustar liggesuserssp/inst/0000755000176200001440000000000013124453245011654 5ustar liggesuserssp/inst/CITATION0000644000176200001440000000202113026705250013001 0ustar liggesuserscitHeader("To cite package sp in publications use:") citEntry(entry="Article", author = "Edzer J. Pebesma and Roger S. Bivand", title = "Classes and methods for spatial data in {R}", journal = "R News", year = 2005, volume = 5, number = 2, pages = "9--13", month = "November", url = "https://CRAN.R-project.org/doc/Rnews/", textVersion = paste("Pebesma, E.J., R.S. Bivand, 2005. Classes and methods for spatial data in R.", "R News 5 (2), https://cran.r-project.org/doc/Rnews/.") ) citEntry(entry="book", author = "Roger S. Bivand, Edzer Pebesma and Virgilio Gomez-Rubio", title = "Applied spatial data analysis with {R}, Second edition", year = "2013", publisher = "Springer, NY", url = "http://www.asdar-book.org/", textVersion = paste("Roger S. Bivand, Edzer Pebesma, Virgilio Gomez-Rubio, 2013.", "Applied spatial data analysis with R, Second edition. Springer, NY.", "http://www.asdar-book.org/") ) sp/inst/NEWS.Rd0000644000176200001440000001320613120746646012727 0ustar liggesusers\name{NEWS} \title{News for Package 'sp'} \section{Changes in version 1.2-5 (2017-06-16)}{ \itemize{ \item address error in spplot, leading to display of "Error using packet 1: mixture of missing and non missing values for cex" \item address warning from Tomas Kalibera's static code checking } } \section{Changes in version 1.2-4 (2016-12-21)}{ \itemize{ \item fix bug in duplicating objects in C; see \url{https://github.com/edzer/sp/commit/8f8a66090e47cf0f6bbf5549376c0bc07b6c29df} \item fix all long/lat-based great circle distance functions; see \url{https://github.com/edzer/sp/commit/d8374ff7efc6735cba9a054748c602bed0672f23} and \url{https://stat.ethz.ch/pipermail/r-sig-geo/2016-December/025201.html} \item clarified cellcentre.offset documentation, see \url{https://github.com/edzer/sp/issues/18} } } \section{Changes in version 1.2-3 (2016-04-06)}{ \itemize{ \item update sp gallery, see \url{https://edzer.github.io/sp/} \item move \code{methods} from Imports: to Depends: \item improve base plot methods for \code{SpatialGridDataFrame} and \code{SpatialPixelsDataFrame} objects, see \url{http://r-spatial.org/r/2016/03/08/plotting-spatial-grids.html} for examples \item improve the graticule \code{labels} methods, see \code{?gridlines} \item fix hole assignment for triangles, reported in \url{https://stat.ethz.ch/pipermail/r-sig-geo/2016-March/024214.html} \item \code{as.SpatialPolygons.GridTopology} drops rownames of coordinates generated, but keeps coordinate (column) names from the \code{cellcentre.offset} slot of the grid \item improve examples in \code{over} vignette. } } \section{Changes in version 1.2-2 (2016-02-05)}{ \itemize{ \item method `row.names` for `SpatialPoints` makes unique row names, or drops them. \item add a \code{labels} method for \code{gridlines}, drawing labels under varying angle (see \code{gridlines} example) \item add coercion (``as'' methods) from \code{deldir} to \code{SpatialLines} and \code{SpatialPolygons} \item migrate sp code base to github \item correct \code{[} subsetting when \code{i} is all \code{FALSE}; report by Francois Rousseau. \item add \code{geometry<-} method for \code{Spatial}, wrapping \code{addAttrToGeom} \item addressing \code{rbind} and docs issues raised by Kent Johnson on r-sig-geo, 5 Dec 2015 \item get `row.names` of coords correctly if object is a \code{SpatialPoints} \item add non-default coercion \code{SpatialPolygonsDataFrame} to \code{SpatialPolygons} \item add comment to \code{SpatialPolygons} coerced from \code{SpatialGrid} or \code{SpatialPixels} \item \code{coordinates} method for \code{SpatiaLines} now retains rownames } } \section{Changes in version 1.2-1 (2015-10-17)}{ \itemize{ \item \code{spsample.Spatial} does no longer generate objects with rownames. \item \code{CRS} gains argument \code{doCheckCRSArgs}, to allow suppression of the default checking \item coercion from \code{Lines} to \code{SpatialPoints} now drops (duplicate) rownames \item add coercion from \code{SpatialLines*} to \code{SpatialMultiPoints*} \item improve printing of \code{SpatialMultiPoint*} objects \item \code{aggregate} now passes \code{minDimension} to \code{rgeos}; explanation of \code{aggregate} extended in its vignette \item depend on \code{rgeos} version 0.3-13 \item \code{merge} now accepts \code{"row.names"} or \code{0} for arguments \code{by.x} or \code{by.y}, for compatibility with \code{base::merge}. \item \code{aggregate} now accepts parameter \code{minDimension}, introduced for \code{over} in 1.2-0, and passes it on to \code{over} to control when features intersect; see the documentation of \code{over} and its vignette for details. \item \code{SpatialMultiPoints} objects with zero features can now exist. } } \section{Changes in version 1.2-0 (2015-09-01)}{ \itemize{ \item Support for \code{SpatialMultiPoints} and \code{SpatialMultiPointsDataFrame} objects. Where \code{SpatialPoints} are set of points, \code{SpatialMultiPoints} are sets of point sets. \code{SpatialPointsDataFrame} objects bind points to attribute values, \code{SpatialMultiPointsDataFrame} bind point sets to attribute values. Methods supported are subsetting (\code{[}), \code{plot}, \code{spplot}, \code{over}, and coercion to \code{SpatialPoints} or \code{SpatialPointsDataFrame}. Functions in \CRANpkg{rgeos} support this feature class. See also \code{demo(mp)}. \item creating \code{SpatialPoints} objects with duplicated coordinate rownames now gives a warning, which will become an error in the future. \item Support for Google Earth or OpenStreetMap background maps in \code{sp::plot} and \code{spplot}. Maps returned by \itemize{ \item function \code{GetMap} in package \CRANpkg{RgoogleMaps} \item function \code{get_map} in package \CRANpkg{ggmap} } are now understood by plotting functions in \CRANpkg{sp}. In particular, \code{sp::plot} now has an argument \code{bgMap}, \code{spplot} now has panel functions \code{panel.RgoogleMaps} and \code{panel.ggmap}; See \code{demo(webmap)} for examples. As these maps assume a web mercator projection, \code{sp::plot} issues a warning if the object to be plotted have a CRS that does not contain \code{"+init=epsg:3857"} \item \code{over} methods that are taken care of by \CRANpkg{rgeos} (anything involving \code{SpatialLines}, or \code{SpatialPolygons}-\code{SpatialPolygons}) gained an argument \code{minDimension}, which causes an ordering of returned features by dimension of intersection, and the ability to select a minimun dimension (e.g. only area-overlap); this uses \code{gRelate}, and has a computational cost. Documentation found in \code{vignette("over")}. } } sp/inst/doc/0000755000176200001440000000000013124453245012421 5ustar liggesuserssp/inst/doc/csdacm.R0000644000176200001440000006645313124453240014007 0ustar liggesusers### R code from vignette source 'csdacm.Rnw' ################################################### ### code chunk number 1: csdacm.Rnw:53-56 ################################################### owidth <- getOption("width") options("width"=90) .PngNo <- 0 ################################################### ### code chunk number 2: figreset (eval = FALSE) ################################################### ## .iwidth <- 5 ## .iheight <- 6 ## .ipointsize <- 12 ################################################### ### code chunk number 3: csdacm.Rnw:65-66 ################################################### .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 4: afig (eval = FALSE) ################################################### ## .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") ## pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) ## opar <- par(mar=c(3,3,1,1)+0.1) ################################################### ### code chunk number 5: zfig (eval = FALSE) ################################################### ## dev.null <- dev.off() ## cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") ################################################### ### code chunk number 6: csdacm.Rnw:109-112 ################################################### myfun <- function(x) { x + 2 } ################################################### ### code chunk number 7: csdacm.Rnw:117-118 ################################################### myfun(1:3) ################################################### ### code chunk number 8: csdacm.Rnw:123-124 ################################################### myfun(x=1:3) ################################################### ### code chunk number 9: csdacm.Rnw:130-133 ################################################### plotXplus2Yminus3 <- function(x, y, ...) { plot(x = x + 2, y = y - 3, ...) } ################################################### ### code chunk number 10: csdacm.Rnw:146-147 ################################################### methods("plot") ################################################### ### code chunk number 11: csdacm.Rnw:152-154 ################################################### library(sp) showMethods("plot") ################################################### ### code chunk number 12: csdacm.Rnw:165-168 ################################################### x <- rnorm(10) class(x) <- "foo" x ################################################### ### code chunk number 13: csdacm.Rnw:177-180 ################################################### plot.foo <- function(x, y, ...) { plot.default(x, type = 'l', ...) } ################################################### ### code chunk number 14: csdacm.Rnw:189-190 ################################################### class(x) <- c("foo", "bar") ################################################### ### code chunk number 15: csdacm.Rnw:192-193 (eval = FALSE) ################################################### ## plot(x) ################################################### ### code chunk number 16: csdacm.Rnw:204-207 ################################################### data(meuse) class(meuse) class(lm(log(zinc)~sqrt(dist), meuse)) ################################################### ### code chunk number 17: csdacm.Rnw:226-227 ################################################### options("width"=60) ################################################### ### code chunk number 18: csdacm.Rnw:229-249 (eval = FALSE) ################################################### ## setClass("CRS", representation(projargs = "character")) ## setClass("Spatial", ## representation(bbox = "matrix", proj4string = "CRS"), ## # NOT TOO WIDE ## validity <- function(object) { ## bb <- bbox(object) ## if (!is.matrix(bb)) ## return("bbox should be a matrix") ## n <- dimensions(object) ## if (n < 2) ## return("spatial.dimension should be 2 or more") ## if (any(is.na(bb))) ## return("bbox should never contain NA values") ## if (any(!is.finite(bb))) ## return("bbox should never contain infinite values") ## if (any(bb[,"max"] < bb[,"min"])) ## return("invalid bbox: max < min") ## TRUE ## } ## ) ################################################### ### code chunk number 19: csdacm.Rnw:251-252 ################################################### options("width"=70) ################################################### ### code chunk number 20: csdacm.Rnw:264-265 ################################################### isGeneric("show") ################################################### ### code chunk number 21: csdacm.Rnw:271-273 (eval = FALSE) ################################################### ## setGeneric("bbox", function(obj) standardGeneric("bbox")) ## setMethod("bbox", signature = "Spatial", function(obj) obj@bbox) ################################################### ### code chunk number 22: csdacm.Rnw:304-315 ################################################### library(sp) setClass("trip", representation("SpatialPointsDataFrame", TOR.columns = "character"), validity <- function(object) { if (length(object@TOR.columns) != 2) stop("Time/id column names must be of length 2") if (!all(object@TOR.columns %in% names(object@data))) stop("Time/id columns must be present in attribute table") TRUE } ) showClass("trip") ################################################### ### code chunk number 23: csdacm.Rnw:328-341 ################################################### trip.default <- function(obj, TORnames) { if (!is(obj, "SpatialPointsDataFrame")) stop("trip only supports SpatialPointsDataFrame") if (is.numeric(TORnames)) TORnames <- names(obj)[TORnames] new("trip", obj, TOR.columns = TORnames) } if (!isGeneric("trip")) setGeneric("trip", function(obj, TORnames) standardGeneric("trip")) setMethod("trip", signature(obj = "SpatialPointsDataFrame", TORnames = "ANY"), trip.default) ################################################### ### code chunk number 24: csdacm.Rnw:348-349 ################################################### turtle <- read.csv(system.file("external/seamap105_mod.csv", package="sp")) ################################################### ### code chunk number 25: csdacm.Rnw:351-360 ################################################### timestamp <- as.POSIXlt(strptime(as.character(turtle$obs_date), "%m/%d/%Y %H:%M:%S"), "GMT") turtle <- data.frame(turtle, timestamp = timestamp) turtle$lon <- ifelse(turtle$lon < 0, turtle$lon+360, turtle$lon) turtle <- turtle[order(turtle$timestamp),] coordinates(turtle) <- c("lon", "lat") proj4string(turtle) <- CRS("+proj=longlat +ellps=WGS84") turtle$id <- c(rep(1, 200), rep(2, nrow(coordinates(turtle)) - 200)) turtle_trip <- trip(turtle, c("timestamp", "id")) summary(turtle_trip) ################################################### ### code chunk number 26: csdacm.Rnw:372-382 ################################################### summary.trip <- function(object, ...) { cat("Object of class \"trip\"\nTime column: ") print(object@TOR.columns[1]) cat("Identifier column: ") print(object@TOR.columns[2]) print(summary(as(object, "Spatial"))) print(summary(object@data)) } setMethod("summary", "trip", summary.trip) summary(turtle_trip) ################################################### ### code chunk number 27: csdacm.Rnw:400-415 ################################################### setGeneric("lines", function(x, ...) standardGeneric("lines")) setMethod("lines", signature(x = "trip"), function(x, ..., col = NULL) { # NOT TOO WIDE tor <- x@TOR.columns if (is.null(col)) { l <- length(unique(x[[tor[2]]])) col <- hsv(seq(0, 0.5, length = l)) } coords <- coordinates(x) lx <- split(1:nrow(coords), x[[tor[2]]]) for (i in 1:length(lx)) lines(coords[lx[[i]], ], col = col[i], ...) } ) ################################################### ### code chunk number 28: csdacm.Rnw:436-437 ################################################### options("width"=50) ################################################### ### code chunk number 29: csdacm.Rnw:439-448 ################################################### setClass("SpatialMultiPoints", representation("SpatialLines"), validity <- function(object) { if (any(unlist(lapply(object@lines, function(x) length(x@Lines))) != 1)) # NOT TOO WIDE stop("Only Lines objects with one Line element") TRUE } ) SpatialMultiPoints <- function(object) new("SpatialMultiPoints", object) ################################################### ### code chunk number 30: csdacm.Rnw:450-451 ################################################### options("width"=70) ################################################### ### code chunk number 31: csdacm.Rnw:458-468 ################################################### n <- 5 set.seed(1) x1 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x2 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x3 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) L1 <- Lines(list(Line(x1)), ID="mp1") L2 <- Lines(list(Line(x2)), ID="mp2") L3 <- Lines(list(Line(x3)), ID="mp3") s <- SpatialLines(list(L1,L2,L3)) smp <- SpatialMultiPoints(s) ################################################### ### code chunk number 32: csdacm.Rnw:477-491 ################################################### plot.SpatialMultiPoints <- function(x, ..., pch = 1:length(x@lines), col = 1, cex = 1) { n <- length(x@lines) if (length(pch) < n) pch <- rep(pch, length.out = n) if (length(col) < n) col <- rep(col, length.out = n) if (length(cex) < n) cex <- rep(cex, length.out = n) plot(as(x, "Spatial"), ...) for (i in 1:n) points(x@lines[[i]]@Lines[[1]]@coords, pch = pch[i], col = col[i], cex = cex[i]) } setMethod("plot", signature(x = "SpatialMultiPoints", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) ################################################### ### code chunk number 33: csdacm.Rnw:513-525 ################################################### cName <- "SpatialMultiPointsDataFrame" setClass(cName, representation("SpatialLinesDataFrame"), validity <- function(object) { lst <- lapply(object@lines, function(x) length(x@Lines)) if (any(unlist(lst) != 1)) stop("Only Lines objects with single Line") TRUE } ) SpatialMultiPointsDataFrame <- function(object) { new("SpatialMultiPointsDataFrame", object) } ################################################### ### code chunk number 34: csdacm.Rnw:531-536 ################################################### df <- data.frame(x1 = 1:3, x2 = c(1,4,2), row.names = c("mp1", "mp2", "mp3")) smp_df <- SpatialMultiPointsDataFrame(SpatialLinesDataFrame(smp, df)) setMethod("plot", signature(x = "SpatialMultiPointsDataFrame", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) grys <- c("grey10", "grey40", "grey80") ################################################### ### code chunk number 35: csdacm.Rnw:538-539 (eval = FALSE) ################################################### ## plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) ################################################### ### code chunk number 36: csdacm.Rnw:546-553 ################################################### .iwidth <- 6 .iheight <- 2.5 .ipointsize <- 10 .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 37: csdacm.Rnw:569-573 ################################################### data(meuse.grid) gridded(meuse.grid)=~x+y xx <- spsample(meuse.grid, type="hexagonal", cellsize=200) class(xx) ################################################### ### code chunk number 38: csdacm.Rnw:581-582 ################################################### HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) ################################################### ### code chunk number 39: csdacm.Rnw:584-585 (eval = FALSE) ################################################### ## spplot(meuse.grid["dist"], sp.layout = list("sp.points", HexPts, col = 1)) ################################################### ### code chunk number 40: csdacm.Rnw:587-590 ################################################### HexPols <- HexPoints2SpatialPolygons(HexPts) df <- over(HexPols, meuse.grid) HexPolsDf <- SpatialPolygonsDataFrame(HexPols, df, match.ID = FALSE) ################################################### ### code chunk number 41: csdacm.Rnw:592-593 (eval = FALSE) ################################################### ## spplot(HexPolsDf["dist"]) ################################################### ### code chunk number 42: csdacm.Rnw:599-611 ################################################### .iwidth <- 6 .iheight <- 4 .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) library(lattice) # RSB quietening greys grys <- grey.colors(11, 0.95, 0.55, 2.2) print(spplot(meuse.grid["dist"], cuts=10, col.regions=grys, sp.layout = list("sp.points", HexPts, col = 1)), split = c(1, 1, 2, 1), more = TRUE) print(spplot(HexPolsDf["dist"], cuts=10, col.regions=grys), split = c(2, 1, 2, 1), more = FALSE) dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 43: csdacm.Rnw:624-631 ################################################### setClass("SpatialHexGrid", representation("SpatialPoints", dx = "numeric"), validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) ################################################### ### code chunk number 44: csdacm.Rnw:633-634 ################################################### options("width"=40) ################################################### ### code chunk number 45: csdacm.Rnw:636-644 ################################################### setClass("SpatialHexGridDataFrame", representation("SpatialPointsDataFrame", dx = "numeric"), # NOT TOO WIDE validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) ################################################### ### code chunk number 46: csdacm.Rnw:646-647 ################################################### options("width"=70) ################################################### ### code chunk number 47: csdacm.Rnw:664-669 ################################################### HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) Hex <- new("SpatialHexGrid", HexPts, dx = 200) df <- over(Hex, meuse.grid) spdf <- SpatialPointsDataFrame(HexPts, df) HexDf <- new("SpatialHexGridDataFrame", spdf, dx = 200) ################################################### ### code chunk number 48: csdacm.Rnw:676-679 ################################################### is(HexDf, "SpatialHexGrid") setIs("SpatialHexGridDataFrame", "SpatialHexGrid") is(HexDf, "SpatialHexGrid") ################################################### ### code chunk number 49: csdacm.Rnw:689-690 ################################################### options("width"=50) ################################################### ### code chunk number 50: csdacm.Rnw:692-701 ################################################### # NOT TOO WIDE setAs("SpatialHexGrid", "SpatialPolygons", function(from) HexPoints2SpatialPolygons(from, from@dx) ) setAs("SpatialHexGridDataFrame", "SpatialPolygonsDataFrame", function(from) SpatialPolygonsDataFrame(as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE) ) ################################################### ### code chunk number 51: csdacm.Rnw:703-704 ################################################### options("width"=70) ################################################### ### code chunk number 52: csdacm.Rnw:711-724 ################################################### setMethod("plot", signature(x = "SpatialHexGrid", y = "missing"), function(x, y, ...) plot(as(x, "SpatialPolygons"), ...) ) setMethod("spplot", signature(obj = "SpatialHexGridDataFrame"), function(obj, ...) spplot(SpatialPolygonsDataFrame( as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE), ...) ) setMethod("spsample", "SpatialHexGrid", function(x, n, type, ...) spsample(as(x, "SpatialPolygons"), n = n, type = type, ...) ) setMethod("over", c("SpatialHexGrid", "SpatialPoints"), function(x, y, ...) over(as(x, "SpatialPolygons"), y) ) ################################################### ### code chunk number 53: csdacm.Rnw:730-732 (eval = FALSE) ################################################### ## spplot(meuse.grid["dist"], sp.layout = list("sp.points", Hex, col = 1)) ## spplot(HexDf["dist"]) ################################################### ### code chunk number 54: csdacm.Rnw:739-740 (eval = FALSE) ################################################### ## as(HexDf, "data.frame") ################################################### ### code chunk number 55: csdacm.Rnw:747-749 ################################################### bbox(Hex) bbox(as(Hex, "SpatialPolygons")) ################################################### ### code chunk number 56: csdacm.Rnw:770-776 ################################################### n <- 10 x <- data.frame(expand.grid(x1 = 1:n, x2 = 1:n, x3 = 1:n), z = rnorm(n^3)) coordinates(x) <- ~x1+x2+x3 gridded(x) <- TRUE fullgrid(x) <- TRUE summary(x) ################################################### ### code chunk number 57: csdacm.Rnw:791-792 ################################################### options("width"=50) ################################################### ### code chunk number 58: csdacm.Rnw:794-801 ################################################### # NOT TOO WIDE setClass("SpatialTimeGrid", "SpatialGrid", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) ################################################### ### code chunk number 59: csdacm.Rnw:803-804 ################################################### options("width"=70) ################################################### ### code chunk number 60: csdacm.Rnw:811-819 ################################################### setClass("SpatialTimeGridDataFrame", "SpatialGridDataFrame", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) setIs("SpatialTimeGridDataFrame", "SpatialTimeGrid") x <- new("SpatialTimeGridDataFrame", x) ################################################### ### code chunk number 61: csdacm.Rnw:824-835 ################################################### summary.SpatialTimeGridDataFrame <- function(object, ...) { cat("Object of class SpatialTimeGridDataFrame\n") x <- gridparameters(object) t0 <- ISOdate(1970,1,1,0,0,0) t1 <- t0 + x[3,1] cat(paste("first time step:", t1, "\n")) t2 <- t0 + x[3,1] + (x[3,3] - 1) * x[3,2] cat(paste("last time step: ", t2, "\n")) cat(paste("time step: ", x[3,2], "\n")) summary(as(object, "SpatialGridDataFrame")) } ################################################### ### code chunk number 62: csdacm.Rnw:837-838 ################################################### options("width"=50) ################################################### ### code chunk number 63: csdacm.Rnw:840-843 ################################################### # NOT TOO WIDE setMethod("summary", "SpatialTimeGridDataFrame", summary.SpatialTimeGridDataFrame) summary(x) ################################################### ### code chunk number 64: csdacm.Rnw:845-846 ################################################### options("width"=70) ################################################### ### code chunk number 65: csdacm.Rnw:853-880 ################################################### subs.SpatialTimeGridDataFrame <- function(x, i, j, ..., drop=FALSE) { t <- coordinates(x)[,3] + ISOdate(1970,1,1,0,0,0) if (missing(j)) j <- TRUE sel <- t %in% i if (! any(sel)) stop("selection results in empty set") fullgrid(x) <- FALSE if (length(i) > 1) { x <- x[i = sel, j = j,...] fullgrid(x) <- TRUE as(x, "SpatialTimeGridDataFrame") } else { gridded(x) <- FALSE x <- x[i = sel, j = j,...] cc <- coordinates(x)[,1:2] p4s <- CRS(proj4string(x)) # NOT TOO WIDE SpatialPixelsDataFrame(cc, x@data, proj4string = p4s) } } setMethod("[", c("SpatialTimeGridDataFrame", "POSIXct", "ANY"), subs.SpatialTimeGridDataFrame) t1 <- as.POSIXct("1970-01-01 0:00:03", tz = "GMT") t2 <- as.POSIXct("1970-01-01 0:00:05", tz = "GMT") summary(x[c(t1,t2)]) summary(x[t1]) ################################################### ### code chunk number 66: csdacm.Rnw:893-906 ################################################### spplot.stgdf <- function(obj, zcol = 1, ..., format = NULL) { # NOT TOO WIDE if (length(zcol) != 1) stop("can only plot a single attribute") if (is.null(format)) format <- "%Y-%m-%d %H:%M:%S" cc <- coordinates(obj) df <- unstack(data.frame(obj[[zcol]], cc[,3])) ns <- as.character(coordinatevalues(getGridTopology(obj))[[3]] + ISOdate(1970,1,1,0,0,0), format = format) cc2d <- cc[cc[,3] == min(cc[,3]), 1:2] obj <- SpatialPixelsDataFrame(cc2d, df) spplot(obj, names.attr = ns,...) } setMethod("spplot", "SpatialTimeGridDataFrame", spplot.stgdf) ################################################### ### code chunk number 67: csdacm.Rnw:912-918 ################################################### .iwidth <- 6 .iheight <- 4 .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) print(spplot(x, format = "%H:%M:%S", as.table=TRUE)) dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 68: csdacm.Rnw:927-932 (eval = FALSE) ################################################### ## library(lattice) ## trellis.par.set(canonical.theme(color = FALSE)) ## spplot(x, format = "%H:%M:%S", as.table=TRUE, cuts=6, ## col.regions=grey.colors(7, 0.55, 0.95, 2.2)) ## # RSB quietening greys ################################################### ### code chunk number 69: csdacm.Rnw:938-939 (eval = FALSE) ################################################### ## ?as.character.POSIXt ################################################### ### code chunk number 70: csdacm.Rnw:963-969 ################################################### library(gstat) data(meuse) coordinates(meuse) <- ~x+y v <- vgm(.5, "Sph", 800, .05) sim <- krige(log(zinc)~1, meuse, meuse.grid, v, nsim=100, nmax=30) sim@data <- exp(sim@data) ################################################### ### code chunk number 71: csdacm.Rnw:977-981 ################################################### quantile.Spatial <- function(x, ..., byLayer = FALSE) { stopifnot("data" %in% slotNames(x)) apply(x@data, ifelse(byLayer, 2, 1), quantile, ...) } ################################################### ### code chunk number 72: csdacm.Rnw:987-989 ################################################### sim$lower <- quantile.Spatial(sim[1:100], probs = 0.025) sim$upper <- quantile.Spatial(sim[1:100], probs = 0.975) ################################################### ### code chunk number 73: csdacm.Rnw:996-997 ################################################### medians <- quantile.Spatial(sim[1:100], probs = 0.5, byLayer = TRUE) ################################################### ### code chunk number 74: csdacm.Rnw:999-1000 (eval = FALSE) ################################################### ## hist(medians) ################################################### ### code chunk number 75: csdacm.Rnw:1014-1015 ################################################### options("width"=50) ################################################### ### code chunk number 76: csdacm.Rnw:1017-1022 ################################################### fractionBelow <- function(x, q, byLayer = FALSE) { stopifnot(is(x, "Spatial") || !("data" %in% slotNames(x))) apply(x@data < q, ifelse(byLayer, 2, 1), function(r) sum(r)/length(r)) # NOT TOO WIDE } ################################################### ### code chunk number 77: csdacm.Rnw:1024-1025 ################################################### options("width"=70) ################################################### ### code chunk number 78: csdacm.Rnw:1027-1030 ################################################### over500 <- 1 - fractionBelow(sim[1:100], 200, byLayer = TRUE) summary(over500) quantile(over500, c(0.025, 0.975)) ################################################### ### code chunk number 79: csdacm.Rnw:1047-1048 ################################################### fn <- system.file("pictures/erdas_spnad83.tif", package = "rgdal")[1] ################################################### ### code chunk number 80: csdacm.Rnw:1050-1053 (eval = FALSE) ################################################### ## x <- readGDAL(fn, output.dim = c(120, 132)) ## x$band1[x$band1 <= 0] <- NA ## spplot(x, col.regions=bpy.colors()) ################################################### ### code chunk number 81: csdacm.Rnw:1064-1070 ################################################### library(rgdal) x <- GDAL.open(fn) class(x) x.subs <- x[1:100, 1:100, 1] class(x.subs) gridparameters(x.subs) ################################################### ### code chunk number 82: csdacm.Rnw:1088-1089 ################################################### options("width"=50) ################################################### ### code chunk number 83: csdacm.Rnw:1091-1096 ################################################### setClass("SpatialGDAL", representation("Spatial", grid = "GridTopology", grod = "GDALReadOnlyDataset", # NOT TOO WIDE name = "character")) setClass("SpatialGDALWrite", "SpatialGDAL") ################################################### ### code chunk number 84: csdacm.Rnw:1098-1099 ################################################### options("width"=70) ################################################### ### code chunk number 85: csdacm.Rnw:1110-1126 (eval = FALSE) ################################################### ## x <- open.SpatialGDAL(fn) ## nrows <- GDALinfo(fn)["rows"] ## ncols <- GDALinfo(fn)["columns"] ## xout <- copy.SpatialGDAL(x, "erdas_spnad83_out.tif") ## bls <- 20 ## for (i in 1:(nrows/bls - 1)) { ## r <- 1+(i-1)*bls ## for (j in 1:(ncols/bls - 1)) { ## c <- 1+(j-1)*bls ## x.in <- x[r:(r+bls),c:(c+bls)] ## xout[r:(r+bls),c:(c+bls)] <- x.in$band1 + 10 #$ ## } ## cat(paste("row-block", i, "\n")) ## } ## close(x) ## close(xout) ################################################### ### code chunk number 86: csdacm.Rnw:1133-1140 (eval = FALSE) ################################################### ## setMethod("[", "SpatialGDAL", ## function(x, i, j, ... , drop = FALSE) ## x@grod[i = i, j = j, ...] ## ) ## setReplaceMethod("[", "SpatialGDALWrite", function(x, i, j, ..., value) { ## ... ## }) ################################################### ### code chunk number 87: csdacm.Rnw:1166-1167 ################################################### options("width"=owidth) sp/inst/doc/intro_sp.R0000644000176200001440000001557613124453242014414 0ustar liggesusers### R code from vignette source 'intro_sp.Rnw' ################################################### ### code chunk number 1: intro_sp.Rnw:76-77 ################################################### library(sp) ################################################### ### code chunk number 2: intro_sp.Rnw:80-82 ################################################### set.seed(13331) # library(lattice) ################################################### ### code chunk number 3: intro_sp.Rnw:186-190 ################################################### xc = round(runif(10), 2) yc = round(runif(10), 2) xy = cbind(xc, yc) xy ################################################### ### code chunk number 4: intro_sp.Rnw:195-198 ################################################### xy.sp = SpatialPoints(xy) xy.sp plot(xy.sp, pch = 2) ################################################### ### code chunk number 5: intro_sp.Rnw:204-205 ################################################### plot(xy.sp, pch = 2) ################################################### ### code chunk number 6: intro_sp.Rnw:213-216 ################################################### xy.cc = coordinates(xy.sp) class(xy.cc) dim(xy.cc) ################################################### ### code chunk number 7: intro_sp.Rnw:220-227 ################################################### bbox(xy.sp) dimensions(xy.sp) xy.sp[1:2] xy.df = as.data.frame(xy.sp) class(xy.df) dim(xy.df) summary(xy.sp) ################################################### ### code chunk number 8: intro_sp.Rnw:235-249 ################################################### df = data.frame(z1 = round(5 + rnorm(10), 2), z2 = 20:29) df xy.spdf = SpatialPointsDataFrame(xy.sp, df) xy.spdf summary(xy.spdf) dimensions(xy.spdf) xy.spdf[1:2, ] # selects row 1 and 2 xy.spdf[1] # selects attribute column 1, along with the coordinates xy.spdf[1:2, "z2"] # select row 1,2 and attribute "z2" xy.df = as.data.frame(xy.spdf) xy.df[1:2,] xy.cc = coordinates(xy.spdf) class(xy.cc) dim(xy.cc) ################################################### ### code chunk number 9: intro_sp.Rnw:260-263 ################################################### df1 = data.frame(xy, df) coordinates(df1) = c("xc", "yc") df1 ################################################### ### code chunk number 10: intro_sp.Rnw:266-270 ################################################### df2 = data.frame(xy, df) coordinates(df2) = ~xc+yc df2[1:2,] as.data.frame(df2)[1:2,] ################################################### ### code chunk number 11: intro_sp.Rnw:278-279 ################################################### coordinates(df2)[1:2,] ################################################### ### code chunk number 12: intro_sp.Rnw:283-287 ################################################### df2[["z2"]] df2[["z2"]][10] = 20 df2[["z3"]] = 1:10 summary(df2) ################################################### ### code chunk number 13: intro_sp.Rnw:291-293 (eval = FALSE) ################################################### ## bubble(df2, "z1", key.space = "bottom") ## spplot(df2, "z1", key.space = "bottom") ################################################### ### code chunk number 14: intro_sp.Rnw:299-301 ################################################### print(bubble(df2, "z1", key.space = "bottom"), split = c(1,1,2,1), more=TRUE) print(spplot(df2, "z1", key.space = "bottom"), split = c(2,1,2,1), more=FALSE) ################################################### ### code chunk number 15: intro_sp.Rnw:320-323 ################################################### gt = GridTopology(cellcentre.offset = c(1,1,2), cellsize=c(1,1,1), cells.dim = c(3,4,6)) grd = SpatialGrid(gt) summary(grd) ################################################### ### code chunk number 16: intro_sp.Rnw:327-328 ################################################### gridparameters(grd) ################################################### ### code chunk number 17: intro_sp.Rnw:334-339 ################################################### pts = expand.grid(x = 1:3, y = 1:4, z=2:7) grd.pts = SpatialPixels(SpatialPoints(pts)) summary(grd.pts) grd = as(grd.pts, "SpatialGrid") summary(grd) ################################################### ### code chunk number 18: intro_sp.Rnw:351-358 ################################################### attr = expand.grid(xc = 1:3, yc = 1:3) grd.attr = data.frame(attr, z1 = 1:9, z2 = 9:1) coordinates(grd.attr) = ~xc+yc gridded(grd.attr) gridded(grd.attr) = TRUE gridded(grd.attr) summary(grd.attr) ################################################### ### code chunk number 19: intro_sp.Rnw:370-377 ################################################### fullgrid(grd) fullgrid(grd.pts) fullgrid(grd.attr) fullgrid(grd.pts) = TRUE fullgrid(grd.attr) = TRUE fullgrid(grd.pts) fullgrid(grd.attr) ################################################### ### code chunk number 20: intro_sp.Rnw:411-415 ################################################### fullgrid(grd.attr) = FALSE grd.attr[1:5, "z1"] fullgrid(grd.attr) = TRUE grd.attr[1:2,-2, c("z2","z1")] ################################################### ### code chunk number 21: intro_sp.Rnw:426-437 ################################################### l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") Sl = SpatialLines(list(S1,S2)) summary(Sl) plot(Sl, col = c("red", "blue")) ################################################### ### code chunk number 22: intro_sp.Rnw:445-448 ################################################### df = data.frame(z = c(1,2), row.names=sapply(slot(Sl, "lines"), function(x) slot(x, "ID"))) Sldf = SpatialLinesDataFrame(Sl, data = df) summary(Sldf) ################################################### ### code chunk number 23: intro_sp.Rnw:460-471 ################################################### Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) plot(SpP, col = 1:3, pbg="white") # plot(SpP) ################################################### ### code chunk number 24: intro_sp.Rnw:478-482 ################################################### attr = data.frame(a=1:3, b=3:1, row.names=c("s3/4", "s2", "s1")) SrDf = SpatialPolygonsDataFrame(SpP, attr) as(SrDf, "data.frame") spplot(SrDf) ################################################### ### code chunk number 25: intro_sp.Rnw:485-486 ################################################### print(spplot(SrDf)) ################################################### ### code chunk number 26: intro_sp.Rnw:490-492 ################################################### SrDf = attr polygons(SrDf) = SpP sp/inst/doc/csdacm.pdf0000644000176200001440000110272113124453240014345 0ustar liggesusers%PDF-1.5 % 63 0 obj << /Length 2535 /Filter /FlateDecode >> stream xY͓H_L)9dUB2,E%{PlǬeI0ˁղ7NlV:Q퍺ͷ\27ڻ>^:>$wCN] _[/2[FŇ-/h`'4nwUUH2+>mpUW C3yg'nvIſw1Pܕ`qFkKOt)&M"S"j{)gr9gJpd3aNx^u%KYfhXqgxpǐ8!z :+=gFUHb/h;չV쭑hYzB4(fhBRl.a;@W嗪aWG@}fFʼnS2Z =IdIMT)89raH 8UQZ( Ez$&,A{Z>LO2 1N+90 ǓSjNAlZ+ _לB!d$vbHRgH:t&}=(iQ9t=uYHgnSBŰ *<ˁKn6,#&S{Q ➫ZMⰝz͉XNӔfKW;L5U}s`64q:VW;,b4đ'A49c䯘+)خ@tǒX4_@4<[7 3Ns>!tCt_~ˢJtU֙d|A%+X#c\|n7][$>e)( ; :qwz7Zή3]Y(3z3[VgkcThxf{lĦٿSXBNQOEpWVA-\( mwF"{Ӝj 綖GZnsʠ-D7g^xlI2> stream xڽZs_KIED]SqNvl;0 J-k=@3boP:o_|uצ)hgLiy9mdnֳwsX*_j~l-6jb 3_|ɯx"cͷ/fh+qaVҳ&a\%Ӵ<[׸h{ֽ &""Qj(RkrDv@9[> :vz.B(T4{ >{LI[~D/ij2Ra5?ms+yI*+yNl^=k~N[rQ>c@9m-Uҳ@!s\0C[lA0pM;"n -mKJPsF`2SxAJ {혊x(!= /n'fQ NGAc{ (i wq{V~ܟ&fDsWJQִʍȮ&5l|._ǂ]\K3JPf\Ugq *{^{UvRS }ItƖ[(.}9->Ka~KZ'| 5d$0cB{|P=g^W#pTow>DK5zm !]S\MDR0n;I9r)T d8{cuQVg j"zWɣO}Qj%PZ# F' [Ζ"ĘU(C ҹRԉ`O.=摁,ȭs)펶` RIّ-;٘vw,T9NE&uci5p$\+ʾzCxFV>zx<'?GI YvLVG~t.ߊ~F@.RQ$.wdG*jm(_Ql(*O 9ާ0k?ai+*\ +R˧jE2CDZ* H=v.?~0bt8˾ECU(scTz?r8R1N\ybiuozw?gg|ʫDW RW6X͋ endstream endobj 95 0 obj << /Length 2061 /Filter /FlateDecode >> stream xڭYYoT~_)] 1}Ana8 s%qPw;ι,'z -ݾ&T6qNI6IB pmz,8=V580ӟu[\g+pa5g/Y|Wx%{OOW35ܯ >z frPj .x6๼PMͮXOyFv(\k\hZTеP}3bsK~WVx3`ՠ# Qg ZXf賸Tښ'iZ'OgM6UsD.a7-dnxmS~xR1Z.hSN<(s@)scU R3ufQГ 7Yޛ_DJ J4r| XN)كjј"؃`ZJoS`TaQpƈ,I*1Qm=kHN *H^+Ź43oUS001ªČkee`~7G@4bz潞FI[]2.%<aw Wd6F̙I"@=x7ȸ'wjti>id  r㟏_w+dh3,fy8VH\,!.>f8tĬak+X{ao3zftbI%-u{UӰc[[{ s6sM|یm6, AZ?W1XDevG`GO8sMS:m PR?/@g%FN?]o3jIzX*H(c}f:plތO ^ݯYnԹU5_S˩դ==PW28ҠχKUt!{͒X*]\Z%?c۷=o2\cf mvy܆S}_ ,!!ȥh@4t W@36rpph#ւMTlo|Ze<^ֺ~k9sfؗBYH;LKD'@P']pʥ>7߉݄_[YۖG3PT7(m,`*b |h-9q&3t "}(+]֯ZD\.wLy,$\+h>/h}8*,?,ͺ~xkPLe7G[|PV^[6]=ke҂(#0 /o_(0 endstream endobj 104 0 obj << /Length 2664 /Filter /FlateDecode >> stream xZKs#Iѯ vYkr[֬r8N!we~t^ߤ7߾)r/.oڕfg26[\^/%:ib<@PH_”<ˤv6б@Wj}2.U%b[q=+pA6+wrjꯉ%]|R;U9_L&ph_$Eqp'*]"GBl0؄z/xw瘉&Rtr?p ~;2~ǭoۚqH.R-R!u$%6V !=,\E.e? 4A1Hzdi6-[7st'Yق`M.J81gj + Hg4ՏŶ;H}GB+G0*-J|Ab˫%u\#u nqtУw$^Ez#VzTSl"{ &81+9N" [%eH|m:T+W~gX*)<)pyp?L*kɎ(g"-e"c˧苞iX.-=x]b-&CS}>n&(nAFMrأsp:1&9Gݼ @22,^.-CP|"u{b4!+AjJA$T!<[)x} xtH#^9gtMB?ΈP.r|2f+ .W)ogp͕I,?ֻ"B͚­5,E"դƀ .<`}B%/K^ +܉ani<@Ka{z u&! +D^`%7+ҸOt&W35}M> \WdX₪0!`#Q/=BqEm'iu@^PCikZ_32㭇>opn(e_ +><'Q: jtC^̫M8ڲ5h4\b=F;k.Rn$Ӆ=%@ }̣?S"?'gO#KspXW[n~ $?ME[YCԼT[Mߠ4";Ȍn"wgk ڞw7U?,#<<+/<~~?& /U^s'Zid#^#nW΅yLSkܯ;ಃ̬e6ʕ3P ej4se7$-^dɥH)S1}iGXb"lQvDwV#a܁4nWJ܅70Ulmx$Bmؐ"9 ,% =_`FD!,'٠옇Њoj>84ϩRIf=48]5ÑִI/Tη|rVLg< HBA[Vr [;s>\ jq@y⫁ϭКm,UԳ<TWt• +y A4<>x>=Z&OHruLCKUeⳓ6=tC"$ ݳQ!_6!) ~B|{D}GneQ&oRK҇OZYȿNS/iRE['mxgŖsf&wĉHB|Ђ?< cD?kr&|6 ޱF>yBόs97X\g|=hΊPNJR)f!qpeLzX0ͮ:eb?48`9_l`6j.J;y#(y>E1w=L=@1saut#f\zfJ[a`>N=a5| u7|u`7&Ϣ Pj(bAx!g'MGGa\R fp]J)OS|wE?Σ4*?|nJEpb3[Z칫^Qy.X,6pyw[^YE!% ̹.̻f+߇\cK}$O00_gPLp,[(`ErvD?n HF Tx@ZI=m!GSHג0}0iMOt;Vb\n|{l&K9M^ O]]ywNbH.d:Zrf!+/O1Uq-2؎Ҫ"<  endstream endobj 108 0 obj << /Length 2622 /Filter /FlateDecode >> stream xڽk۸{~od4fDzڢi^h²,΋m˻NW9=GQsތMU4Eb%j{y:S1RFa'/hhY"'5ۦ}[5Nc<\آp{ Q!3kw8?5)G'8ΎD?ݷE Iš*S&"ԃwNl@kCsh7Vv+5ϰzVUC*KhsO2G`7Br9&VŇL[gb27ĩzNc:TTeO`ΙhdD/p&QIQ]f8ѽAfwQhmd,s"x '^ihkjnî=̅9%HNڊEfF.$ D(eu+*];~GNQzD7 iƠY6XX a ԊX^țk_lց9,l/%m^2IW:u:/_[r'dCdC!3wDU CAby Qa2*29)D:c&>2"&"8Kˊ]ӻ-}µ}) $i˚ wZ]Fb=T,-x=vk6 $$qmMn9$t eYZ |;rx*wN܊򐁗3ez͕b.s܌sĸ ;"''Є'l]XW;alg()xI8—0NrgI}902 8휩͓)BOs};mǓ/g"L!lQ<cUDeӄ!bș48[|MDܳ]* (Ml+jq{Nme>m oCuet -BME[+Oֆ7?r𾒹>?{;?r5K0Fh lE>ZDp,@7 &ցkq ބf@g{R>^ŝ];o/=l&Rs8"@JySSv8l{ _)~ s1ڇ' w_׎*hmO`.{9&R8sG&GXeT}@O8Q+ _u>#JR)]UA(6D_NʧC?^Og%Pn-0r'QY2A>iq; e޿VTab(M{ij*W> s*O%|dHLiJ../( zv7u&WIg[80æR/jnxP7)A܈`[t0'$ܪYatjbԖNFXnd}|GC L+.rp*E+ԺOU*r9S "juyW߲qJ/Ϧ lD[O.|[~p`n}'3"yc9 a9T~E})]ԺEQ-TKVlxy?VucM endstream endobj 115 0 obj << /Length 1914 /Filter /FlateDecode >> stream xڭYo6 6AjXtai@WdEN,gY](KN(/~uﺧ{hy8zr*{Jcmz GI/ ce7G?~A\)?4+C okS yxVM |ݧL Ba,50>g@62i]3sh|-d2l=)Ds2LՁ-hQ3Nl,_{ۈsB <:I`*0؈K^x|% }|w|-u!vmČS0}+:mvs^FNj@P& <_AmܿR|0?ݡz&}%('/Ölmƥ9Q=L<-*+/ x+H)M٩xWG-Z? ?S/`2q:z 0.rt,que/0EdOI׸ϪaL;I70E]SKɼDAL!.xubgvN=ě`'CY>g5@6{n 1٩eIW覎aٛힾs.:Nc+Qz:"KJ$_Rw8Zhsv[S~c×%i#>٪{PəAD4nޕ:\?Rґ?Ov)#ZLH^rJD$x'ʽ{U-yb%t#Zlu宂;lpҢLzhےo;Ci2`aq+6a/Z wtޘ%^^fY!>,lG)< k5=8s'a\vqyF$|X!<+`o0J1t^Ű3r#۷ƎށFM@ސʺZ/B7H(@c003Na(@nJGDzHvc d_\7S uKӘTDv,[tR9V [;p;EV*6|RY("]3Fah)XSJb)1u`p&_qZ6JBk:oE P%)3ݔAi2>϶WL)ayB-˄0%]I% b ^,݀% ty8u%0y9 [EyV9 EW|8ћ `zVRm5˦4s6Cr/c싢EԨ|ejCD؆g %v3ct͠s[sacaKZEZ*) Sai:>:S?v.mmdI n}4ƻ+]y!љW+ 6#Df &[LJ|1~8 elh^.)'|?ͪUZD?3:bF@0(QSk]J:f2xPeoVD HjQ D endstream endobj 119 0 obj << /Length 1927 /Filter /FlateDecode >> stream xYKoFWF2\)M"iENm+DUE{Ej)QzXjI.gvfvvz={@ONi/|t$%.uqۯuLZm Zm%h {{!_ϡd4,[ܞC>b) O=~w+ (Nb6$ړ\#h;44Ⴛt**ji+"S1#mR׬!>\"P=o#b She=0_@`/ /Faf_(ɐ $獸`М WQy&YtB WbǸ?j5:H&HHQ'cm,(#I=ӎBJ,?i:R܉HÄܞSJrzM7GjP݄rjE4[u ?s IpP<^q"rE80)P.<_!8siK"Թ>y cEV2B:"#\57藑Kc}1 m8U8MYJVj` 6r`h-[R')xӢ&Q}ER5%312ovLmd[k_]KYQ tRb3GeO%k6LSI#B?PpBiějX"5{aVc8dAP[xeR8p]fީxLlR 1Pw;1&mR/qv?r5 `T< _E\YP=mJ| sQ!<_N{I]†Nx2m- = hW3j0`3o`$5r?7l+eNJʵqWL~v[':NnoGUwTSUTY'y\5K(o:|=<[/g|;1c~]{ĶQ֙甦N(͸ElXFeGրܙAЩE ;;gffF\D6E>[ ?"ho9' = 92q@ʊpT(גYN UdN.< Vֱ1x Y I~y)/ki(;6&y><8*p># G!T?(c*XRh=H⼨ɽ!s;8Ko[!7L#p^mbVORڎCZnr7[`Od>" 3aSj^,/M4Q}ўY>};j$ 7f0Jx> -2yΠD~ԍ6_8/>/D]&!WOo6ʿCuUlXA endstream endobj 124 0 obj << /Length 2355 /Filter /FlateDecode >> stream xZ[s۶~ϯK9Jt98N>}`$V*QQwo @sN`B rM?ţ/ϲI,'Il|&&\,&=4.xzw:K~ w^C÷+h{hFIWjh;h[h\z׸A}0khVv#p7+Mme( ZP:R%/e+we}0ϯzU^E6? Kgс*kS^:=f'$B>Oxi>)TԭLUad+KجXMrX(y{\D%a3IuH94VvњnPs1ն7)ΈLŦsG"oK~%ͫ7*fQ Y"1! !7kf˚;oa=0Φ $[l_U!JR1:0;۔s$; lvbl&blEFB ?JuMg@O 3]K:4$'`/+O`g{8}ӷ8ӱʣ7(oӭ /+3{T=yD~)SsmUy_7۝c Ms4|% 2nm-LNLȈ.\h_آ+0,b]ixțV,pt)LX 5)=i(V& 90Fʘ֞^ȱoO~Z+lHlN"=::8+Щ,wVXdIl:b7ѿb0KV{pWqSaBuXu΍K&sVlUk":eQ6tٱk25;☓C`M ht8W&JL_#/St[n:P#mQ{^;qقOPQ.tK~4\oGW\'*_D,qa\0 V%Iw,Jijv36A9塹L-nGbwIl߳vwOr9 Jk^[fW8$)k*`& j1[CM3/8iHEމ#{ pCLLOO{YcdZcl@qz"42D9޽cM匰ZG!Wn&}D?z~v9pvq;UIѹ) B%K޵b(Oi9Jsv%7 R"8C0kh߅>wܞ] 4'%yyx`$D8sRΉES6h`VB/J~4}~Q+Ix> r0o|[xꜸ|"&q^Ik3Vqo;:ՌWpiRN?1eɃ:8O_~=/yoIH|Egԛ>_07s~rMb ЯBx|ʗ$'>}[HTam1⬏w7wTwqfΌ/֫nsE@qI}UQ$/%'=HO KHT+ /x _Å=r%WPI8|JL>aEƕN)A|$2F(Rꢫ] T5rV1or:PE?ys{^pw>>T8G\&)n9cg_y`//p@WLΎBVnS[ T_B<-{1⼳ţ;x endstream endobj 131 0 obj << /Length 2434 /Filter /FlateDecode >> stream xZY#~_̓1led8F'OEВZ9XIS*^}HZg<4f:?&I4&?MOrQQ<_M$yVL42I'_dͫxz5Ke2>J#xSóg xɠ+|wgfV )錚^x?Q' 8S/@ 4J-~I-Y'+xZqq ׊m'5kygUܬC` mPvl?aU8SyB4$5GG mܡ5K% }bސ+Vh'^w{GyӀDO-Ou~`E:[fg7}2]/y׹گ㰧ʏi/tݯ#JMRVն_4^ktY; "%;"2CXi&OIjX`"/[&b=H/8 ]R7Bx(SظcIRA9XIM ZTNϒ(лї>:'(ZMJ{Z4Ecwhn#)p QĠBA#X@;z||70X-`O*Fm20D^n|a?;' Q6*̍ew9 ia`NDMLR ɍ+jO .6[Ҹ,38GQnHTisX|^vKҒ{ˑ΁+/?8CQT<4Á<$]1;ai~7[4 %z]{m>Y4"IvfۚS9E4]/n؀  Ǟ7WOn2oElcZw븏œ*\`(p $?0pd!b q'"+_lRQu`WwD8 DEEh+K/\!hN `C~O^aFXHCLz>| AC ơzܯٸOPs(@KZ{ãHMqrkGEW91 . a ·2uLC~1\1epY|GDu׌z˜H-Ylm!iDQXx͟9#qФD2;{]X Juǜ0$ofB?W4-JUP!@U~\7PI1W3]ȵh5^u2{J{o oMrj~ՙ=p gQ,屷1+,./;v'%Z'\/t #۫$6lowɳ _kw2Ž3JVn&^L_l3~|!#0j:%{ՊѾ\߿TlC$/;\K#+<2?0Fw4Zj26έI{vbٙ 7G:V*9qԕZsa-Qb+E*XߢˢGKbIk uhrXO78yg4k#JڀX$9 h>77\H? endstream endobj 139 0 obj << /Length 1938 /Filter /FlateDecode >> stream xnF tkBtZn i*7Z%5Rlo[D9۱0h g߾ x?^G! di%Qh8&w&K<#Β;xrzHq:ȿ_<ʽMfKXyw_ ClpE>8_z-Z{s3Ux9PIcR'A <%<;!U _Zϐb-7<_d{+UɁQ`*'p@OONl Tg9Gj*ÑME6"lK溇C@K5n+PS~_/ֈ{G?';݆фJ+wPD)~CS$ Mv7$s/:@F0^5-n{D>lfDoР 13e QB?ͦ^UYwnz Yӽ.JHm4@+<'5+:a$'ILwX~XOO$]"\)5+|;Oaq81I>B<&]v{} Iw)<RjV=a4'<㮢|T0N9~x)`(DO$3B^!E/2}MB츞 ^貽ܵګpVN`fd,xlz -b ?򏋵cߏ_Ғ{=hdHEH\D,8?*zYͥt*"zk$8[tB;}9ZK5[:<[h!r!w&T[(" ]nCp]h2gN\'݉[yM;1 `}`lqđy:䟹4ęND 3 x XYk%1c sk c&E$ 27!wIdHYHs"n8{Y-^Sz϶VY6^?U|[>9N'nΎ@/km:C7%)&~Mmko_=5n[i3p(7Y^ap?# endstream endobj 128 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/Fig-bitmap-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 141 0 R /BBox [0 0 432 180] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 142 0 R/F2 143 0 R>> /ExtGState << >>/ColorSpace << /sRGB 144 0 R >>>> /Length 686 /Filter /FlateDecode >> stream xUN\1S&gnAI$D"\)EDEb"E~?36h 3x^vln\Bۚ ?/<\~rwƢ{ΐ ૙oO7H1*~7I췳>n4WDKaɝ`9DL vq{篖5PGd.?~-6ci8 (h=|̧}ږBFγ1ߘbپqX-N󐦁+)ن a`fa‰gq|p}XMΏA"u1Y 3Ҳe1I$}͏IsZ1Iyw]3e'd:HkI"gO"T%{L (3I" %m9PEb9Ɍ; y(29`\UʻTe*&R\ UhuNuNhI[gEfQtuUyų EP ,Jڢ!T(̷7y}w5PYvYJ{h|Z v^p֩w<' #褗8,뫅,6XkY'̪!*h$Ao0gq̑(7)kKZܔ::VɷaKT> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 150 0 obj << /Length 1546 /Filter /FlateDecode >> stream xXYsD~ϯP.FH\En(e;Xv(;}xd)!lEq,0xv58V&˃$)T`:z{LvxCZd* 4G!鉥=y~tz*( SU4H"Ҽgϣ]صO8ER`~ i>Xֳ=l\!_=ZL1prDH=S1Q 59I#LHF| 1AW$cx~g-[TʑBg=anl[˖JT:&od(^ɑ !Mv&Ju]~Ưcg%LS(&Ѯ=V p[>ᄇs] {ӎ !}ҮXHpvTZnKNI[!ˣk'zk3eaaJ:QIӱ;3Y/=yRP/˵I##[1 3UĆ|l\T?.euJ rw0,V(a_^zܑ!'gnim+Dw=MK>nVE*وN_`& w䢵f28 )NV\&jm; i-J5oF 2^MJU< <jFAyQ k%WoAqsZM`+cH`n Efק w{M5UY֎ aJ5;9»W8EzX_6sFfBTdUsLő+/GX9N܇ }5%2!-*J">$5\41M85C^ɺR!eF[MU!N𰜕k K :UQ:*rdW]U*O {xe{%܌Qp!Wf̌`ȹfg#e -qrH5Qm=8T)ܪ޻F=YtX&P h$:RvLgе]bUAP;Yr;H0jB6 "e{R Y)MX{<vP= 4cmB R&YȤNr e@x!~ XqRs"N %<\^][[1-Gt5Q*޽+$kfB CB |c:m)%W IRC^F}uDuW?Y9DzBG:1xS}}""fMH@v~I'ip^zv-Ntor[Sz7"c}yf*mj/G0s-CԲrf6[:'3_> /ExtGState << >>/ColorSpace << /sRGB 154 0 R >>>> /Length 18309 /Filter /FlateDecode >> stream xˎLr^)jhOve* n@Óe T z7<=#_A2b%.>?q:Ǐp}nq>?}_ǿu}}z=p;~XmSI?BG\X*b=˗w<I%xfs +M0;3_ ЧЧЧe>RxM urx|\Fɕ22edЗ+eLN/r:<| fW#kט1ɗW#k|nuxB ߀$nC߀$5mI$P7o@u 7t8qxw`v|8CqwgwCqw2GO]<{v[nn{n3f͕ u` }n3N|qn3.Zrx8[[[+V`V`VH* JǏO$ igwt!5{ E0t0tp% S/'=={{JASy\VpwwߴbŸ{pϭ0Z[+ Z ZJ{pϭЭЭpZy8wr7r>]w T%.ɧcK.dwI>]wbZFK.2ϵg)~<|itMbhUnU^ ܪ ݪUJϭЭЭT2kUЭЭʕ`7FchU9M_緭is>1CqE3t3t'PFwcccc[>k+,c7949s#&ŸMMMT2krMM,}|nr \ [F'}}|:V8iw}&'[Fs%&|nrnd1h}MMMT2kr&GMMΕLF'M9is]3ir&O&O>Vs>7y TgL&>V' T3t'p|j&:\z?\nrY9+69&g&O>vs>79hrnYs>79C79/}| ISΚ|Y&'&|nrnr^ 8ZE3t3t'̚F'a9+69&g&g&Oqo&'[E3t3ts%&| I%&|nrb&|nrnr^ 8ZE3t3t'\O\VR~ 1_>C>/|n} I%gO@`h}n}n}d/Z[?Y tcݧppI>uwKwgM;W;t1lY,ݝi%yw',ݝ- \z>W; N+ɻ;Fz\Bsw &y1ns3t#O*>s3t'Qw@`h}n}n}dϭ0Z?Y t㬻M7ݍyiws>w7Cww6{Ew3tw3tw'̺Ew3twbyfFݝT2/en}Yw{ 8[a>C>W2m}gO>gO@p>>h}n}dϭЭ,HqrM&|nݼ7{Ũ1_t7Cw7CwwRɬ9at7/ |nnYw'݈}*| 6vZa$Z?j}nY' TgMZ@$ T3t'Z?ɧOZ?j﨏Vu3tMs>79C79/}| I%&| b&|nrnr^حɓJHI7b?ʫۏR˜ Y{Z8炡炡+拹`Hp>˜ \p>C/6 ss,iI[V鋹` \0\0\p%1-/悡炡"d6s0"Y [< =~L 拹``H*EҪ8&raK0L"F 000pӡ|14 =4b8%aACT2aŦCbhzhp.yېE0@1@!b2yf5O'22&y:1_!C!CaR ZL'9d9d9Js<cz^{>7mX^T6SSSL'5f"3333)z1_L1CO1COqR j6)f)f)f)NʜM1)f)xP=ۜSS08iuc-ǩܣm\~ٵٽф@,Āb u٬ d2XC'|CŐo]p>abHٷ.8ŀ0bJb|Ca!\~*7p_cV~Q$aYD$"f2٤'d3鉙DL"b&1(%׋]#=%$JD -JDY)'%P"bh%P"DHOI>(C(]#=%$JD $oN!d2{{!Da'd2 ="Bf!C!dET;1C !Pr~ۉC !PR&v|C{=0糙LLKr3]_޲|63)Y #_aLfb&3eUf̔D8LfBf31Ldg(_%PfJ̔@͔@)2Se쒒B+g_%PJ̔@)2S|׻>E|Y>L>Af$+`$f $+`$f |Y>B>\!JlV2+ !Vah0|Z>C>DKXIJbh%1||Z> -Ob ˱6z_!6wf{==Af$+M܃bd{0݃Afp"=dv2Cݓ7y l$60Cah 0{=|QUGHC&FgHFldEHl0D,41fHY'[-ȋ/LԔ<|l0¢Cf1ItI(3鏳It,:f3.d&q6EL˪E$:f]LDIt,d8DLVE$:d!l|]%d8E@.r8L$6 fY\jl 2KXH%TH1%$L YDf ")"$LVHYBLDf &+M$,AbUR3 r>K%кCK41ڵ %hF#FZfѐhl4baB=l4d62-eQD F*Z9!ѐhIa6XW hld0dCisRFch1Mv.F#67f8Z˞02 FK*$ksFCf!ђ*Z9!ѐhl4pf4!ђZfѐhh\hFCf%+Ml4b] .vCݕt:q]}duKda6 +E.dV2+BP2 ՕTAz0E,ԅBfuq' Y]B]Ȭ0ՅPOEY]J' Y]Ȭ.bU] .VCՕu'׎ dw IyȦlR3)/YiLN)!؇C^fC%" هCD!"|H>D$"ɇCB!"|H>D$" ɇ;?̬R~%45(A ٠dP5)b. JM* MʫKE$"A ٠dФnrUD2(! M dO^{H^E$"W ٫UD*"yJ^E$"WɫUD**3yLMG]Xr:\ύ+ĠR.\I,W *b.HrM* J`"\I$פ8ҤKV."Hr%drhP)rqq)JrE$"\I$WB+"HrE$\I$WD+"J(Lre&2\!\O#e.DƜxQ.ݤk1Ȼw2*͊K.]FŻY]FŻw2*MFDec w2*E$2*AƜؘQ1"٘Q1bcFƌƌ3*6fTl(mb'83(X?׽U;7XԈ$jD5",jD5":FDHN* KߘK&dQ#I\)\'j}SEHF$Q#oD5"DMȢF$Q#IԈ$jB5"DHF.DLf&Q3_K^KUAL%nSH~G$#߹8O;"T@1N~G$'e}%# w.%.c.)~G$#O;"H~G$.[sd}D>![HG$#eg&3dԹ/~ )Zl}D>"Y+@k/\>![T@j^d}D>![?Ԯsd}D>![Ck/\>"Yk`SHG$ 0OG$#K{!d}D>"YOG$#rrمd}f>3Y^Yv%lh ~K׏7 D,`.mYfHER\Y`.mY$Ў-Y fH"m\B("m_o!K!oY`.mYfHc-si@͂7 D,i@6 B,i@6 D^b`͂6 f,i@͂YW32uw m$\[DHep( * 0* "m$Yq[sQH$ H0@ 0*IR^0@ Dp0* "m$?^8WHQHi#h{\e#aT6Fe#A¹¨l/H 0* 0%ae{IX^V텙47l:|ZN)~t\GM2m siBm ڋyQ)DڦiJ*E{oSM!6^ si"m )̥m )BަoSK"mSM? ޼("mSM?޼("mSM!6H!oSM!6H\\M16L3mS̴M!6L3m=f~lK-nKKsޣ͊-!ҶHRR8Ǜx[Bm {t31%Bޖi[ pf-!ҶDҶH"mK7+ H"mKς7+ H"mKO7+̥m%Dږi[Bm)͊Y!fH"mVr1r1fL3mV?0Φ- 0f˜i c[tʵ7.fޥЦG.2!,C{6=̥퍐7Dޒ hӦt>H707D޿("mo("mo07Bi{{a.moH[RmT06=Dy{C =-frisa7[gӖ,7Ql9Jo9W[xA-l9-d|\ryI}EҖH73!o9\+ڈ0Dr޿ވ(["m9 Җ~xˡo9ވ0Dryy|a.m9 ҖC[NR+ڈ0DrP;662Ln2O -<:C}~k(G4=*gTD,$zFE29W=">[&=*gTQiD}R\.ϋ3*G$3*gTD-s"zD="tDϹ#0=*gTDϨ>l^="zvb;;[V~,+Zsʈde^fbe 21LVF$&?\DjB2"LHE$iɴ%sɴdZB6hb.LH}_ iɴdڤK6-"p<1YݷgO`!x(C$! ҿ܇HK*H2s3}>Dr"E)FD$!}Hv"pو`!}I$8s}>Sު+dp{Q "4 璘YALG%1!er1QńHbB$1!?bńHbB$1!޿rXL$&D"(bB$1!ILOD" ĔT sIL8޲^0E0,Be&\"Y|T~lD"Y|AȾHN/[pq,BA$ Eos"lD"Y1[0,BA$$*% K){ 4U*Y$ r%U *Y I/r.TH dU iii yi߿##ߖ#'ЌK KrN*#(2AfT9Y&dUQdDdFedN$ǹ # 3*̨ 22Ȍ Vh1@ͨ 22Ȍ # S5ޜ 22Ȍ # gť̹ jяt)HH#H#寄2" 2" 2"lR\_ # # y<ޘKMȃHHH~y)HHHHMӪ2z8g."%!V "Ҵ"Ҵ"\rq 1ӊHӊHӊHsIsHsHsHHHHH~Gx.1&'&&&0sI,jyj%cY\%D%D%B..נ8f f fg f f f fg \0D%D%B%Dn M҄!,Mx@' si*i*y*\ B D D Dg<+4444<)QkV0"s7ɌJ'#J7fTQdFNfT:QdFggeTzQVA1@̨,ҳ2Cf""""!""""!"XreYxKH-F-6;$|#ҽG{O(>u#\p'K}H}H}B}H}HH1wV ҭ@N./"]^Dty w\v_(}_~?k^eLnL?]/l9}̲R[ߟT<6eΗ۫^_mQ==ס]G΅.?_}ejy|z }?iubkj%{]qbnX"G5vcou[2!SQ]..{kj鲾vT/u>xTG<].5rg{_:jG.}_EZ*bW-V:j꫈U_XuRŮ_w-vkQ}c}j?I:sĪ[:8bub~nQU?GŪ#VG-VX/;b[-vXYcq!#VG- DZ]yyLt꫆/sxB̡.}ls<շ9XaEZƾ_j"VG-VsɋXXaj[&/bub59lQFj"VG-y*/u4bub_'3ľ~ic_ҧQ]_qiq:>Mw~GC]Zb]k5^]|ϳ/2?"Vi2N?+X'bub埈Z:jO?-VƉXX'b+DZOq"VG-y/}WOZkq¥ž~*gZ%jp9jtzD/";^?|5HR©KGM^gk`FɫyX*b}Tc%Zt>WJ^-VXX+b%+]EjW"G5VXɫJW+yEbQ"jѶUa@|kaSȺQK"]QK$5^&%5^2I/8JQxIaTjK$5>kRe.^2qX%o PZPxMۨY]ǮxMk>l55އ-^C[5]kpk&װxx ov <]lM-hy8A y7D!j񞚈aE{j"އ-C爫xxQ{Z&}=DC%:l K ڦ ޘk8nZ euї E{r"އ-ރɉxxR{Z''}=HAj񞜈aA1H-C N.[=9r0]ut Ӻvt-/)=L->l0xOO{"==a.&aKT3xZH] AFh ^V ׁn"=AxTE[*=P->l1P eq@.q|TD^{X,z~t9|rxia7TrP%*=T-SqX=Tj񞢈.&aMCU3xZHQ[Urxj8n97H,uc#`{J`Ŭn8m+=X-ޓqX=Xj񞤈 bZHQ[Vrxj8n9\9]C.pt95כrX969E-sѽ}=V{޾h=~ۚ{Ys{[sv9|/k9ٲ׿s.N:s?Ʉ>|,bq^TtGˡsZ8n9-ϡ~h9P>㮎roϋݽ=/9vcso[>e-mˡ{9ZX?#X-[vikoou{[sv9|/kw9|ok.e.xׯmeE$zAZ|uMfy^kïh^yQ޿wyZTvU_b)`9XN~ a]B_\ _;nQ-@0~m&[TK 0Д2Ӌ/ U x"FôVq^=d^Z$Jk׌ۆrJ̓+/=R PCfa,oSg4Y;z 8LXަm걺.54c!2ꗨvjC30)>nZVe(@4mO_b-V,E:lvOPަzɟ3]ѯ]ߏ7eyr%kZ c)>~jZ:0L8xXnL,Q^ PGiqM藨~k48 t%I[[iqMuK|H^{Zq|Kl~TRKerF2q,T'n[f|`;ӑ*hi-@cZ 6閨i- B+[n |0i,oS|n,(` Mr%[ [!mO{_n |0 i(oS|:!(r=a&AW?k\]TR> !鋫 e~n-KGRO?|a$ץBe~n}Rj,5hvʱm&(? WU 47zvpzmKgV E;hxSo H?-*D7v$U`EF"Tʴ_>> 춨`Pě?R4VZm MJ{,*jmXߦmM]+DuӮMdߡMk b:Vs;|ֲblDJ6uJՇ3/g_{ rݷI?XL}keO/vUn"݋7VFH%%3hnW,~Vf2F U=g2ᬕ҉2v oW,>V.SZa(c4±Y| #Y]v͸sHXڂXptQz?-"G17e|rt_?"PkoFy3>c{N+z늣v=8fR:FD4j{i6gZG1*`gT&uLC3SѨy۬ӞjjVAcPE:|*bN{:ggaun3v4T8jHFsܞGj ~m6_yzMf3:<qƹչ=|nu\<:v4ysۯZ1n:>#li[vyy8_Cc\s=cKu_^q>o#[nm<i7'f:<qvs=<6}աyhu qo[Z1nwun#~E1g7O<ܞZyu4ysۯ~"PЏZ>NzW<>o>Y~ƹ~6:muDyzW<~]ZGO1n:>ni\Qyy8ȞO}uqf:b~qvs=<>oש _;:8qm}b箯<i7wSi7ow\]:yysۯΏi}:muDgum4K KmַnVYf_RxcݬܞGYRQGx:9dlQ]=^Wgd]Eۊ3 miQ=^gd]2+32N客mũ6|Yu/yuu8]HEC/!=nVYOYGQGxgd?,osv{8n*ǩVYhNۏjZ8#Ygy{ίuq:aNۥjZ89 '|{nX븝+j>'xy|vj&&xMc?uXN#v3tmşCƶc&bqFYU8v:b&qFYչ= u.U눙:guWߞGڧuk/Q?>|{iniuDDcxy}Ya~;8Nxy~8*/Vi]kk:OQxչ=?u?jqs{y|_XN]qϮy{^6(kno?:un[gyYmC׽1޷]=?6|ou}tux?cm#4y}`t+"G7g}گSp:xW<>שhu_jc}s{yT:/>չ=uzmndž;_ݷ'߳nis[:뵻o}ݞGz_6봹uxnk>x_cR7EOV)q]__#j}\ӭdk?o_m#%g]HYm#%g]_ZGK1ǻ:Gc}[zX^S_럱جQum?cm#:OQxv3<~@Fq oI*_\_lTA/mƩ򼗷)^8WQ?_Z1wt6=.g Yw A8RެNA7ZJAQ-|>a}A?e 't>A/=X[֯S:ͯxɺDu]t_+:t ^ObN?_<}Z{9~~_/2_҇ endstream endobj 156 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 807 /Length 2340 /Filter /FlateDecode >> stream xZko8_ ~mm;3A>(hkK^I~ϕTqgm)S幇AU2,ӂ9"L LjLz<#SM`Qb)ŴF$xTd@D4Y1Y&0=39GF1g &1 °0ײ-D0I`gRyDL&-~XY)1h-"JD EBP *ֱ 8PSU xzx;ab60M[R$!G@R~0AaxjIzDGM!]T`@J 53ҊXPGbUŽ$zH8YvLyZjC r!BK +ϜH[f ܁a q2a?^CWC0 K^N TxüH!aJރo2 % ʑi-5dEJ0&%`DIFz,0  ( |dɛSŒSɳJ.?:NY,M7,-lո9Z2Q?oo| j!>/|!p}tqIĴ1WT8.|W)<0+ڜ__=3(f@P? pzxzG\EPۀi:Uv}, -u!GB˩Ԏ+TQ @f@$o~P&c%8,cQQpX8B%ol` u:XH ͍07Hգ!s=tKY7q>51Hk|0V3(obeQ"ڻ"ĊE3.ⲊH2&~ 쀯[ñ!7't!yHۋInە;c\tf#C=>2r`b*Y ]Fv\ BFa4R`uBw\͎sQ0@:/J7n@83 `C9? r%='@1mp loj*5~'j]nn62d)kfij#EB"@-*x/HwN%)+V }r3krdԋ;XIftD]av9Cu`/=n_m endstream endobj 159 0 obj << /Length 1775 /Filter /FlateDecode >> stream xnF=_AB %W,ڠNk'-Rh\!-J4D9;ǒCmA>cvݱy/^+((w.fBc'ȹȜ( Bwn3AwGyŭn{ZTn /umb9C ^1V g?OGz'}b-T߽?롨UmMf} q,FK]{X$^;P*x1v*caTX8 Apu5NAO͊u96pt(HEkS#t t %un8!@8>Bπ̄DwFcH"v4Mc "VO!fXxoND(ƪ(@@$npz>^ٟH:1'oaȓ`ԑ `-65Y`\/'Hl>TrzJ)ƧF0E-( um!Ӄs)` UL ®8J,'eXό\' l*cS?G#-m:ÝH!;g٘=* mv{CNAUnCNjC'|[R2X#153ư`o0؂IOʏ:kbgS};^VGEF[ʥn[jO%4dw6 veҸbcϺˁ8t^,q*2t*ci􀋄Xw-@UfiiߓHOD54fҩ1593 T{i&qHpu'4f~8!Q#7d1qmտb6gM?ה@d[j[V5HtU] 1l铝ݝFl,wWϑ v|ls uf k>Ba{C񶱎a% PK_<* ٵ$x&lX ݙ|w»??Wf7K6ZNITM׃μtfHk賨vA cS8˖{&^0G,yK/?23+5ЧnS ʢ-`=_6E|m;ȻfI1nu٪gL75ԯIp[W ]a"袤߬kul ϐ+!`a&9c)Շ*3 4Xˆ_XC֝U7gTuԔq[U0\[3Ȧh' 8v]\O(<#{'#@jy^#nMU֬%\cXTƏz<4 l/I%[MޫOǏc1V0aEg/'T endstream endobj 164 0 obj << /Length 1765 /Filter /FlateDecode >> stream xڥXKs6Wpr& |:mgv&M۸4%Jf,RNۻ/oꑒy^ I%qh{kbk_.Bj-[hX'h8._R#UAcoFAкf4auA[Z<L@f1<3hS~C y#c^:O%Mtp <,goo"wж݈ӀN' щ@ 24 b3/D'$MʒޠbcXwh8h hp"{jj""D;ań_CӠCض:8ƠƎ:ILZ蔔ԻX#a⛊M6ijm2i6X\EN}X  ;8$ [i%~٩͍Ħ~A~+L)LZ' e|~O( l&C,0_ %-K[W2%2oX׬vАNY:F2\ol+H3TuLf:FԠt 邧8. C`3 t+jweݶQ]3VJ~`;>}kujqKá0-嵴=0wanQ-pr8כּNmQA6Q%Z[+oC p9I4ftAjd-i4AVTB4$fQk͉,R/RBK7# * K^\ Ռ hK 7cۺm0!}O C| #&s1n38;r4V9Z`'aS8)NN|@VIY{D$"E"?`asVGqX]]+kb8ZMnåK'.ǫc=M˫g'+LWҋZZ!jfT_|``mx-o8o)wsB ^1.gB hDQ\`udDO..|kVA,Wowi~yzߵi}Σ>MCD5O ;` 3^񙖩i˛/A):鐳ѫxY?UK6fE]Ů>v@4: Wpǣ2y$ht鲟0 ?rDg[%8t10.MKѯq{48_ol|MY< ńJ<4m_Ԍy5?:92g5?_aTRT I0 " Dfѿ] endstream endobj 169 0 obj << /Length 1779 /Filter /FlateDecode >> stream xYIoFW>Q5pp8pEJ@ұ"o#9-qz 5[ Guk9֫'xEl%* кYTVDzhbz}٤qύGF;xdY/WıZMOp|{8azڞ#I>igc p e/3JSdR_"NK+Kz}?vKxF)k <wZ%G/H}t1wZ>GIqly,z0$5X6N<6Gzd)l EsoIuܽT$_dخk+3&~=j>Tve -6X\Mئ$I }׳mԙ!P8@rxb2TZRB.uu;8bڳQ,E&Q3k+Ј`OQGih %^8LI{#OV Yfi(^CϚT- { eN정,Mt1dW N3v*6»qr֐: yF"_otv]>бK 5vL#(|$`ufr2^4Y:= b@@+q05 7m1gȞ7IfP`p()٢a-jMdWrKtb$~Eg20=v%?^y'*j1^* %"DVHeWCL^?*$N*=.K%'z'"Bklrr1d9#սƯ(qEb=Ӊ[侀}nb#j:}AR#B"H~UBe! F o)95psݔmySuT "P^2r:8r=ep'5b?01F!/NxHڒ*E[ͅ7z3+c% C9<4~LJ(ݔu/$7g{f*ꀔMP5) tʑ`@j6#]OBD;^u2'j9_`sQhhk{[ΔFnυ&J~#rvq!˥ߕȒ|ް$DD pt6Tu yH|lax͚'R'U+d5L :8dJ3JA%蘋Dю^n#\Gtep `58L\Oz3TX3®:$r嚯|kdl9NUKOryq տ _{ܵqpCj'[NM6 +>GXxitH Y47 eԄ0kMKrƱ ^*` s}G˛&p9k]00E*;`2I- k׉0BgN"U}hƄSX%9o" L)2>[ppE@8-^\+䨀[J.=jza.K^9G: xa'OhAXe lrk8 ,>*$e' endstream endobj 173 0 obj << /Length 1436 /Filter /FlateDecode >> stream xX[o6~ϯ H%E]-X6A%6yPl9u [N,;iv{E;Gue1xhQYD[Ņp0 r=XunܞMN yUfrdË+{n~+q&9 dn!鴄y8a4`IHKW8Rm͇N¼Ж1Ұ>kAkKx?GǤ8K Zbq^DX: %)bT+ X :}Р؟!tJcCbAkYIV^Kڻ"}Ҩ@+5Oe|BI|yVVIBA&F熅(,!jX /IdGG _Sa~U 0rv2j{M(si@;mW$(z HێMC`[mHmdI-(Ѡ,he놶S3vf%u!ΰ3bk.Ļ!L/AXUu׳C[kJY|iʓaK؁oؘn"t?N/v}8!-%n:XG @_ˎ34> jX? oym| tI1}_;T~& ίp):q_x#jQЁ/8D8>o5~)Ys蟍l8t>?wX{M0qSPwO5odE; y񄼻LbO 9 tۮd-UÎ 2:뛔bo򴤢/0I*Lca>0Ŕ#D (We4ٜ dI$$q^ݜ@tQATJEU9[b(B'ApޕUXr{ZsTX]V3< H﹪oa7N;/!J Ԅìq>!^rU(M;} $nJ, 8 ,G95 Z/F{dc endstream endobj 177 0 obj << /Length 1643 /Filter /FlateDecode >> stream xXI6WH̒A[mh"A#'eXv2mk#-G#=z@KpJgC,:39.2.վ!24!bBB^BdPod1I7ϴ7}b2WBpKy?/xq ) Ŕ!3K s*{?7>,xF[~uI)J>C\"Xpݪ.GI,aʱs`o [找-7 SCXg( "ϞW=fBjX_KUT(w.5K]{4MMU2oR.,(Wy&TRRV2}O`E6Y'n454*Af'|UXrG_8 9O=\Vd߷cNB Bhr*\L\jh3odaLL& dKʺ*$41Qy,>tXbeAaUKY8I,@ G% Ԛ|gl$GZ\vBi ::[8tX48GYuSr>,my#s(9$-$L^wMu̱Y4$q a'~tfVv<(f#te_ }YIikCŻ@Gg[K'4@Z:Eu+W78 J5<K?i2/[C.ę#Ό7O63pם4}YG{ҩ<~&~LKrVt8>y'5"I^6^^'pݮqڎLzCC$_J/`W_w7&mI> stream xڵkD{~U _E"h{HHm%| ukwu hgvfmѿ,TENޖ,ɰx ?{/r4'q*˕mYw[a~UR&*).̂ΰ2~q$'z|\j_ WeŨZTQKpqÿI4ʠ>-᥷No4Xcg#n߀}N#%6&J掋2FƛP߁ HmGIJc?KC fmxOwm<BҳJ~,WqLgaaמsy?hcPlN3axw*/{6oDx-(DTkz,/{Vk~`V|'ɶ֪SN\Կ8;W Xa==Ok[.f񎼂X& %G!g!F @̙ o+q1sm={< %'m#He}.Di -_N̕)q!nI:}tJ}l!d=+ H-W)+NW Ձ_=1GPC[Ƹ) 7t#mRtHSӘ=-2,~_qczi1m7 5(n{3QҶk}ZL=Bi8FF%!|{QqgMŲ+\ƫrE. XOL^ږjq>#?F! r:0鸜 \'tFid"_.wS60irk*`˂Ly(% 5IJu*/~-4A^rv{h H')Qdz"U,v (تKiY:Ƴ~G(UP)G/v|-MDͨdEad4dC6{ܩ$ue˃?lV;"2L {ͥ)5n ~V:H˰h&$h}u#vLFl*Un(7:%*47U2%g;2-;*_j-X棝H֧i@`!#ё7QfZbyg Rs>{.341{fџS?֑Fҭbs=bknlO"H}5 ZzrQ6ⴾŊ ǜ^kFm#)'朹6ڳl'oLFtqT7:FwGB<]Gخf;H tP.2:9G>QE)m1*zWn׾u:+)D4>4+ِK!Tm@KE> /ExtGState << >>/ColorSpace << /sRGB 189 0 R >>>> /Length 5436 /Filter /FlateDecode >> stream xŝKkW+ϟMda.O s'O˸r~Rvzޣ㴝FeF%4r6t9W! gsl=bC,CJF Oe9o kG: 8 1dg' 8;Yhh:p6\+9;Y@oPw>pvsl 'HΕL8k(,ld!gc(/;N GIHu6/!}Gg"S8; rd 5HNp6+;탾 J|K]q-Obp<8;#QlXp{%gC N oG7z!}"?f~m^H_7F07-;^ Xpv$Hbrv9RI9LzM;L5$$hPmUgBsngAAT?vɃ{aZ0\)yJ KJ^%%Gcx Upv,&adIoXLwz}gHpo@!c5YHq^~5N7bHHw"rvt#8-].D ILuDY#;cC$; (Z JvI$;Cq 9僨%--{Dݹ=Y5>w(;#]#IcoH7\)[Fk_ܝI(%io,%Zdw,!;KF//Ch KFq:gR}-AI]uhY0FO_|`ӰxRbGQi IbFO!94$B4194go99Fz8Q Bt!`' Y}􈽊PcOuD52!:}{UĮ#}îCM֯W幙t#\8(&r9ID>4AIH1؍,>-ݻ]F||⒈7$y8<,a8Y.<щqNTqIH1* Kx%Cp6&9, Qp%~\ջ,X5GJ6vȮS_262 h v@Sde3#:D > Q0p. NE}' vgCS8'!c< 8җsS:D HNp.QYygY. D Jes:okAH5,dgH3&;# FTFv vM{I$j8;rv#8Ap$j_ug' ? FΎ$l(Jrvz}07,,9 i/}C`,F٨?nBL˷Oe7"}i8Dڥ81 <*xCq솱őc7 'DZ | za(SpV4t3 uhEv#;c$;DIl$g}pv6~lUH~؈lD76j3J ;Q3']$jUrv gB$QÊs)NV׊lh7r6"9>Pu";SF]lR}CTIw/CٰΆ%ggmJ ~q8Ѝ~FRwg_7z!~ALHÎ++d}3!@IN/o%}ZOF;QCB H2DQh*Glnƹ_6*5J Qr~69(?NVMKQU7}N1rGrxN n1`Q-ad CrU9vn" nc7:&s:Kww }c%r6J gcmlxPr!hkD HRB!!NP F$c V5 iq`xU5*N* QcC)hGa}Na,2;" ;}GЂ͔ uJFao8]7Vs }GB#!A) 肋Q퓾,ov I4W~noE}GBݔ/#!A߰oxK7*;9O}cK%cI) aI2F٨,ͭ}zkɹild!,s~|muH5?LNkOe78})_1GKGØo_W<9d2C,2@N1#ɐO2:0h:6z4Xe@5 %$ S6}{HFDz; avO12lmID12(^m{OiNjI@>FO3`N2{ȁI@1X&mV*5X3`uXTŊhsy/\UG TX3$ ?֒b\e!6t4gʀ42$@IŀmdI@h;(f w,/(=tu@~$U=u *Zݭ(?BTqnϽ?ʇ *#CL! 5 (`j$~ڬJ1* TI%aP(愪 @uvuz8*&跘"sTTJ6 T~$N7>`\"xm| ($/h(J p_p1Nx]dpV%Fh8=]Gv]C#a*Aj5_pt`ptz h) Gi@,1V bN 昷{7QbNѩ88:R+ t ]N輠Tt :":!vIWZ-pn:>{1#8#8&Lε(H[I9٩*;Us'G07!;X3Z0-:V. t5":9<8:18:u9h95} 5d!k揫jR07rsǙssTy!2&̝>G0w NUҶʁ~+:dDTC~'}`$*W??LeVLڶOU7י#~>W.:izx9}qU@4 m9uLH,(]s~>9-I?K-XnH~A1HF<˖:b 谗=3NA4eO àq,{:]bwzۚ.~=Q,q9m?zN72_POk<,axzx$׫LJr'g,3g. _=c<133!w3zVON/Og8_~Nrǽ;'8޿xb?vWa>dqajϗ@\*OWd> ׋%_q`bk6 endstream endobj 191 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 196 0 obj << /Length 2382 /Filter /FlateDecode >> stream xَ}B1bD4H؀ml ɓD$EɚoM}쮮d5 &yz񶘔~Ef9 ϳbf1ཹӸu{5K dA/Qa{0mͬ o9n3̔WSw ;8?0Tny-{Kqx5Op[WkYmq5<ks;*UyYmf2AOxB&%pf{n ꑻ|0B:6;Ʉ/g[9H SfXPzKԖmv lU΅Q*T0yCfmUf4,A 13QTxܽ<+|n3,ɚLC IBѹ$Ψ|pqVt4 z*p_D N$ncC#W r\ \ ́ęK|'Q%XyтKy~Uq?~+G*#V 'K[=[?g/LȞ>jZ D_Pq?Tj.+.%S/_.q7_ o)Ap!1()n·ᰐHPiADXX S(PK{Qf=+gGaN6uQd$L/҂ כ_D endstream endobj 200 0 obj << /Length 2434 /Filter /FlateDecode >> stream xڵi X1 Ϡ)µ"H gpbDRZכ_wpHʩF$x5OjVo_DËo*><W*,^m$L!^!z4eX!BzW{ LNDx"@`IeȋUHrIX& Rg ͺH 2 ƊZg 02xZ~皽q'K?U4g6a !vO.$9FLQ5񬵚!LW d&9JT'BFVa]* T㠟Ah=Ip42CրG Zh1"(, $''j Sİ`geabQ #O v9-G>*ʺ|q4m IK&!|3t"vJ}kŗ&-G &,e3lQΗ;ާ*4w;d3B 'eU8h}Jmy`NO;1yOUTl${f*/Bif`΋ .IvpJ*9v"PxE-S':%qAk%\Rfd;({7.Ǐ;A%a!V6煠[q(0&D"lCҲx x5W,W"':r`l(/;|7ybDO&譮OIwִW& g9C0[|jѧ!_cbfGl0ռ6FSWm _\e2yUy%"eƌ$z(tSX LïW*i;h)KQIPdןXl0)z {Ș%̞Nb,=TBO<BAOcÚ66Rw~Їzi3b/vFꖜqY <퍄q;yt[!yGP|$-4Tn^et&9 IH|;?vTFwwi*/g~wrVseN&] kY$9Hَ1ӓg/~+hj~eoÒߤ~ u5߸ސr(}Z46<2Rs5^ vV:$P@.CNB(EˇiR5TTG58xVFZ@eSC+^ xM†wHnBNќ0r._ [=\$"9qWE]+3dDx#Ǩw*G LzZ.Z7knEDy̔V1qr{ '|y: \7Cbpȳњw IgNݍn[&`N ˥fA2.Jz0Q3,N'M5<#]v=T5fȕ,~,M.,TY4˺?*"rثQut5};}xHo'7q_dk͙#KHq2Z썊USyR{ ܥLKs r|Ѱ 4 :q к #>.R4a KI;EdpT:,|( %X̊Еa; #R@"x;f?AF#^ BTwl5LS;J'-9nEFKvv IZT ;]\A]Ҵe8eg({ :m~?:iu*m Đn  ͔H2MJhi׳r{?Ƀ9L } p > G0RrlĶfrC~؎fgر.Jqtj{sPFV6`mtqLf޷Z~q_YϏn7U5USl()P?)_57[T ) Wq Հ0'hMzx5 endstream endobj 206 0 obj << /Length 2747 /Filter /FlateDecode >> stream xڽYoݿBXn,,αmwQP$unPlow7}lޜyu7K<t3JI(qnѭq(= ~[}%r{E<^6/ߏOhܪAe'Inď37Cq3cqO}ÏWwwnpja͟GD) ,YUhKV+e 13}/v7#* )HwHt%J|~Fi=ay a9J/$Vf:C)p0Χ?( 4ځG&8Hc;clɊ~i)dhg1@WI.po-3J5.p {^ϟ4\0J wU8> , k1(,P.,xI(T|țna}v"IAqe364f7Ə89):ҍةHK^v I)-6|Ӻ'J&Æ|<OKP̗{}z arzYePhZHb5D]%wl&D!B13aܽ}R<?/gN{ȵN~{lhzM,>Yۊ}x-5h2F#7Rd~>I{~}By [ !Ϫl[}R{P{}?uxYf[ML|,[(WE,hr OwtEA;T'{ebZ~~pPe \% b7 H@P߅.0!7 C y]Ȇ |I(=N~ڱ@ANv ~iW]YDOaWWLso뼼Db~yrD/R7Sn(~~xl\[~=$aK$LS-TwyA~D} [R.*,ɫ!*8.aZΪhOpyBV\׀eo~}RK}Ct;,y^i)n$e'5[t%~괤De3M=you\&)?$`%-֨WCa- '\O (Ԗ FrAޣ5xzN7c)6X)*g]+1ktORtw&LREj}Jbwp#>!yI+RAb2aɜ!utW|K[.C~SA|/y|ŀSx 5Ŵ1GDi3a5z[ bun!{PsVBY,!q!`Y\+trCIwiϣ]BFesVZBZssv;)1bۚ>WI мhJV٬j%zcŒfeB/ Oˌ/N9䖼I3JW[Rꍄs:4Od+Ef]8X^S c|7p͂ VOE)yznoh4|3w%ǜ< q4I&xc%ٵ)ĝ)Cwozq7IO+ sį‚w{sAh._QfLJ%&YGug֌Szف'T$UWC% iv endstream endobj 213 0 obj << /Length 1242 /Filter /FlateDecode >> stream xڅWRF}+87 @( Ȧv<,+e)؟OY66yjzzrNq#G.Oe&yxN2ϊ$Ksil<]<Т^ypى")e T24ZF1YZ{韧2cfjF$LC~1 pE~ M&%*X:Z!Lo/$û5>B#|[ތRO/Jۋj-ma)6d>0SR#Fؒ ҙdHer_TjjJRjҜ7.9 W*%;ӯVeTH|hƜcκ7֔$LAY5!S"9-“Cyz2\N1Vф0g8!|<^|ox` A2b?y^tѳKx=Yg*yeP-8]CofPሓʕ;Ǭ~JoŠv')2MmK0;_* {SNƾX%il4CBo.aYh"q-b)tcfM[G†YWQD.9:0 phJ;clX:C}[Գ .)wqys0 /m΄pOiBDskH 6 i ]nԲ'Pb(<ƾsĢvڑm?LJQ ~7J4zj\)2q1yՉWl6DO!ƽ~ciGC}iE-;z.Mlp}@R% V{(2oI辵pHƓe լX{ uHiuk[poB^a+s?|uܲ?6vp֏p!{m6t-Ӣ55i^5z_E؁uh),=7`|WuD6ƍYDj4n>t++bAHf?2C?"hSq`@D\hLrt )6zK? endstream endobj 222 0 obj << /Length 109 /Filter /FlateDecode >> stream x3632W0P04Q06V0P01TH1*24(X@es< =,=}JJS ]  b<],1o ?\=: endstream endobj 228 0 obj << /Length 97 /Filter /FlateDecode >> stream x3632W0P04V02!#CB. L&9ɓK?\K(̥PRTʥ`ȥm``S: 6 endstream endobj 234 0 obj << /Length 169 /Filter /FlateDecode >> stream xڥ= @ !us7?nmV"RPޣ(/ :EeޏQjRgr*t*X(Xk[Rʥ( e uC Z0 'Atޘ G0T8b -Qb7c7g35 endstream endobj 242 0 obj << /Length 135 /Filter /FlateDecode >> stream x3631Q0P0U0R02S02VH1*22PA#CDr.'~PKW4K)YwQ6T0tQ`H``(`   ~$~K  dE@Yb..WO@.gC' endstream endobj 243 0 obj << /Length 118 /Filter /FlateDecode >> stream x3232T0P0Q54T02U06SH1*22PAsTr.'~PKW4K)YKE!hT,C(j  P); endstream endobj 251 0 obj << /Length 119 /Filter /FlateDecode >> stream x3636U0P0Q54Q0P01WH1*22(Bs<=\ %E\N @BA,C dXlt5# 'W v)1 endstream endobj 256 0 obj << /Length 182 /Filter /FlateDecode >> stream xڍN1 @\IMKxb-E;}Z'l ^aMƃѐ"2)ch \1P0V gQ9]=l1UN똢 ڜg7^nC?_Up[ ;@6D!^I> stream xڍ46QD3޻1Øa%z$ A{N"z{|s_֬5yVFm=^9[ Lt YYf|VC B#@ !q($@ @`q8B!p[&@*\|p{mp@9 11?9g wPa>UCEˋƇBKs] & xqŌwˮsa[!n3<04vs@+Xg]߅?(A;8Rsv@!7m>G@lnt( E]=e%twݟ" _7Dy!vpo.HLM[l0w00W A `wKAyy7,@En]F!P=u8NzU- /)w!e⏛8>܊v4QcP#_C+BOr;rH{Ŀ jݡi/C0m,v+?.JH( 4{ŷHD[ (- >Dߦ?w~@a?P ]\@0/:P4vAgPPPwMgUrt^kRkF~OR9fAȥ.(q1\m7܋xe;ֈ?3J=R-!afF:+WQb|3N]çt߂\51*dͳy ǝ7Y z"7~N`WϾn4,4dcl~iT~1_sD{B;>?6azM- h!gifБ'6v~a*vɕ}V/Ÿ_3%crj{ԺkOr,7wH4uT?MhA2'bRz]bk]<\KњNkYMw`UH6ix6! cVAk s9̚}ٗGOE$ǐ- w@`ʪX"ٕ7gވzO#z2x_HѼBDWA1ZcOcW=P?aD λg|S+Glt!dn F*wv炎'{WF7Haews<| `y`>~uҐ5SڦS&b:E ^nS5]r qT1ޘ[qλ:B3Ъ%Rו.mhvzMG|\vֽ$켣m:IRC3FqYq+r;|c\]]G-kRՋpۗ:TMV 0GPIP:/d2qYzn'+E'OVL©3Ň1ڕZB_tf{=ۺ 0>6FuIiWSatɘægi Θ ;gC0Υ[ulÒk~/$>U<.sRǬO杞+t>M(w$8=cZq[!Hsp^"d'{-i%K􄞑$j(I|LΧyslm\;m# J1L6bX 2KZʚx"&FyLCZb̟P 9Z&B o\ Np1ǹrKUekRmXnZON {z 6m枵gt&0-kN$9 ಏF@B{v+%d UgWe<7?2_DO? 03$bVk% ||s 3q鋐Jp[ZV͝|^4mjt['Hfg4{״jvƱ'f{Z?k~JOmj/)VFX򂟵7n֓&6LyQg;Ljdo8\]8fB=pРˢ6 AG$BX8T " {"+3K>o$<뱞0TQ2t%|l-تS,@,O]r,fop 8dޞű6 ~Pߠ"04m(y,z-'#:`6bY'ǁ[;,Իj(_En9ɜh+D]Α_ۯ7q{uxu 4_;n6ՓdW}8nZN3+>bH4,g;)+ʼǫj뭚m~>kR6E˜V(P`Awu7X`zN-6Z>^m9Fbxw8DHyBj8,BJ|j[;%( A]dL|4RٿdL5*Hϴ p[:VʙMn@$̟W0;hw<(<<)8 O^.ߕZ4ꢡ%jE}>WB/c)R"i9}0GwlfꈜdTyCyFf!E;=^XTM`R|g!G>ʜK6}`lxJოV)KSQ*\<d钰*7FD{>ÂN U?EbS3RGtZ;%^ы}[]f5|'nB\0x3A}Dk[wFxcOioeH|Mc4aUCAX!tDt}Ie8;Vac<P]oyK-5B|Q)p",.`keKҖa]t] i{)IeeʇwC/ 6$ɺ8FzwR+yU=7,v7 s14ч377k5#kXc-jB?qQ@QǛ&(uզ4pmfuj1~[$XH^3(ןph<-۾@`99p0wx!aɗ$ELT:V/SDd9SgԕNv *`NaL03={2KhLQt1 q+=Yү{1p_OBXOQOq@?#6Zv4wV>dW3 fpH߰3b.)7b]m-`کk[ztrcqA0 f;~ncznT+jW8UtgGGۉ6=d-)΢Ձt O"1Tbt1ejKS% (އO~ 5]k=;G^}fӾߋr*y!j=Bx5X׹}ҡ\呭1UzX(I41Pt\p?iGtBxl؏8t2֙'%[:1gXڬ̼ミ[d!5s?t#+h#1MM< [zƚ JKшI~YØ(oJ HcuH (F8]F)|P&&%H> T?nC•hљZcɈ(+k&w(~K3"P6 -`2"o1Dz!?ƣWt g-bXyVVWs^b^ݪwţYAXń U[ϣSZNu/NȆN\V]w`I WC;ZcƕX1xm p'X|T9PXET3N2 :e> &]IZ:h{rg/NU4-e 6P QTg2M)Pҏf{n6)E=A<2NJn>mvE<>A )fks|蝴`BX 7Ŧj_z҅t!%Ab-N3 ȏÞ˵R"ݍ.XGA2ź͒G#&dbb\:GO3c }O=jU&Ÿ ንEWþ*U:r'_T:"fmݩbdؕC㤟/tΫhfٍ$63MAu\A"#~.q_^Rm\w2"+Υɦp.@Qa ~@fJ͸{@dv qs|Q^EW4ĥN ljd/>=7g$ˇcE%Z"bI%^^z])dpd0nW+vYRdԭ?"[GTsvaJ bн+GA=_Y >}qLfX@V.tX8c=(?QR_^5K3m5}")J,lL1cs1풼+a"5g4W gsRdC)L}z{/L>$rúSm}쯬*Ӳhե)=b?u{[x7Ca2ZF Ʊɣ΢w ]h~l6 2Qy͙Dq,ͦѣzLjR9` Tz򜱡ȑJie-4g:8[bxT¨pTN?a-䋂]UMRR؇L&.}mS`,.3gJ d:d3:Cj4F+]K I];PrzCYGtejr*-s S\(xo ߓoWBE]i$Hɺ ο~Dԙqw`QI|Fq6mĝuɉK̄8^F_M|I/RM!ZG/\}NuSiDkp$ve,Uf:*E]jwk8Z-oOXr9!*b*q @Ď~^PXQq#r}^UgitR׶cmG=oi;]R ?yh!/Z-6@T5d*3 r^ 3Ζ_~y,xM:/~@SaQɄ?QJ]lw_!ĹSKFa" "#(GF\5Sf:`b \ ^l-0Sb}͹aݙoф1bgwA[xֺH ;J߃7@?GYFö89m&lX&\߷4vbzU׋q, vt/@4AT-8UifabG endstream endobj 263 0 obj << /Length1 1913 /Length2 14249 /Length3 0 /Length 15437 /Filter /FlateDecode >> stream xڍT /nCpwJ ݽ(--}߷ֽ+k%ggޙIBE(l 6IYXx"Z,v&6**5KgT G'K,DA@7PlqX9yYxYXl,,<1;Āy& @% p4p~;?Z+ßa[  tپhM,A͍ٞ hv4eY:[T@N GW)-ojLT5 K`3g7#&49ؙoT 2`]+G K?&&`[{9PcrvwfL08@Kÿ98Z;;19Y0oe3ڂ윝OdVw/fdfigj S{fu;K6o"d gG.Nnr7`5{ПJ?o|7 K3pvtx[`ji 0[!M 2 ݿ;@X,a`;bfE Ii)W)"vx1~0}drr|7<+mg[=@7sA]#v_oF.66i2m-mzOmxHq;Sv@GG%/ַq4f&;  Ǎr~0 ! qEސ7 Y`V/yx&E$d6d0|C,]e&8+ě ⿐㍣),X l/F6]jvWҿs3o /&o9rW̝v?oWvpXo:˿Wtlo0F1Θ#qf$øpGq}35J*Cs^ॳy?ZԍOGclK Qw0|B&WhsJxK?uaRvg9hL*?ySKUR fY?SjAwtwyFFOؒ||a.NKʽO0XXRPęWWvxa*ezgջVoѝWiX +bX;h Ͱ'd{ʙ=gi6\Ӳ 2,sXNDPSZ'dD(g' 0DoL)~SD;gC&u|8]ٕ=y$+s8rԤnr@s %Meԉln+is}穪`hY7qS{Y?%G4[qT>i&j89zi8-mW\ \܅C$F|0=pX$F[af&q"oϲ.\4L$EYRf| i)%yA̼ \a7>]";$d/Plt '0?ƍùy[~ۨ6νu+"37*Ÿ.\Fr2I&}is;@ P3!C ^ҍP&ײ=$sU& iRp)Fl(F7)^0N`ʴ^8$0wDW.%3ʋ̬"M)m9Oʈ{͡N1TwP r˩?U+}=@Zmc1b~y@O@>@]`s| d-Ӧ\V)5ݦН'BlI+0ߺ$\Z≭0~JNFBq618{5W'{ixS2[ iBՍKE <07ᵝri"]s 2c}Po)Ե\-:z~䋚?uVv,WO$E1]YǜtvtBg gZP+[wZ?̦{ϾO1.UA)Gm0A[W&j"DZз^ɭry~!|5@cnt[NH5KvHc1T˴||IuG}xϢ- Kȍ0!lߝUTޅTX~>?S*Y΂] nbJvV+Ks]zL.P[AQ59D" v:jR;&,RS7W'98L%,6_ƪ2s]7󶯤Id2*buvЂ냖"fFJ"TH섡`(`f= ʬ4ʛ4H=H=ӱ)LEZozBK2qW#[]bYD'.)42zC#F%(64֟rD!gxeCZ>+UPѨAݯao:ٜLp>sqL1eτ ݂|uqP|CM&I"ǨDlp2USΟ;u̵M2Gr#ɡ͟{Ԑ~H |jGetfn5 4.E~Vy|Q\}o`Tt- Mj񄳵Ls! 277mňF5T͖ޣap8\gpK8M|uia9rW%!zP*ڝ!x!{}Sљ! &XKt#o^<=m~о>/es0'Wm3)gpl&PI>q5˟%IAh%;r#jK\ŗϷ^B5}Esm/?탶LX^ 1(w~L@e 0h3K~K9^fE6\T/~`l*'Ttl>D:?p@B>/| " ե"W /S{QL"%lYI`*Ez'yeg]̡9 _eNl \ Yspm{ !kH(+ֲĖ&\liR- ۟MC8gaNxZ+b% 6lx0.\O *w*d-?nJ\ɛǏ#O䋓sOBK{}?nnd<]T <\ =ߠlyn=BzA 0ObL<Uf*7lZ--cpn$*p:c.^k8vmՓ}% tXwZnٓ~8he}10yOMX2ebd:˝sb3&=G4ZxCxLSR-R8!C%2Q׽b(FITM7ˈ6!i2iIe L1fQ{s9|u|I:vӁMOFRx xI>y!R@&+Wl'88ʉsXE ף7TK3I^cGdt|4üČ ~=z\ AXYߦ˚ӼEMMۉ bFL}Ư;JfN\8MhMtA8F8BENO f΂VRc4 (fbafaFꆇZE4$i6,wpuw4>UsVaCS"Hc(8}^8#t 9on .j%c5ց!|uۓ<g"1c+N.:Z /q4eM~3g?/^*?R [bZ}7t-\ᮥ5H%  CYAD,1W% j$֡O;S'U-o[_˝{Xݍ&,4o~927ঙxo1`G>J!SfR#-] eǟfBW5(ᐞ[CYe<~R%p}*R,%l*4n#hM{P˜Gc;D6 Uٖf$  6ƛN/^Ǽ^FUH1kExJnh+fdAy nv(K|- C!YTA^h/GIhQj&*-#yX+p>|G# GIUu(ZG!0ܽ_XGD7tQ$K p ,*%G<%cr c%cׁEs vyIp4bWKre~a [*|˒i@> 5&<[ߍTZͩS^;2&I*wHv4k)nbFj2Q+R_=U+WCJOy h G#Bm/qQ,Ϡ!>((\;ɢW,ix.RtO~/''+yy4+D({ H_%ĤPN)9)9Ъd!ڥDL) H6 p\2m#%{/3%.ĵȶ= IȬ(!V> M\B%LnH8+[Gw?k7|X2 C |U QGqV'Òr|=mNI-€#AFxKc#!2*}7C`'*.<զL<3diOYc#(vX *l\'O:YQuXlmI,}jDdZy_D*$CȤ*\E/m+3Gǡ),Busj jCWg62wn. ȭϫ_)uiL3("6pO!w)Ka 93qcn?_AolKpO?= y]uꚠcAj @$`nzuUH/cH~)fHϲKlJIB%]nCSl8Urz75$Ws^ƫ'hV%|*j=$^41p6 w clè#6@yS~TZP>,%Zr;a@M1)#I,9vbVH$A9Vl/Bd*p<^lnTh)V苣͌X!pՔz%/'8+ui>>M'!.lG6:^O|Á)̌frڎLRu*T>HoMQJح*ܧ΋4q^R"߯N8F.4֔9 =fF9o`IXJȧ81,\(cIyzVmò|\ws*QMc؄2GYE>tɬ~RۂQtkp_Q,C M?}-"7HpnWy&)\h7w+znI-Q- B*Bb\e='H;4(g0r [T9clw_ =0 !GJ_w#d9aB<<)C^QaW`+@ AM7}C{I ȘZVsUh +ۚG]?2S(\F#\Ny6i`I;mdCꤲg߳4vw6XHA a[vd1*ZCcvRO-7h9nK@]Î$mGxKN j a&Oanh !z(\\(f=ӹ ^vAP¡RSe/+U9< Sh=>0S19b#.δ6Y(LD]xU \kJ[q Nl%ʁ=y6kHYD!Ć{eX8^5A"d^$7}`xėơ[N5{q˺@z]i͗U}`u?L+wr>wvV̯OTE֍CO dش]^&&)۲e0{ӐQ例씴f,ƭx(EtauE9[L?i{؝_mPv;DyoHT M Jikʒ[3AFtDoC|DHVL"ZT55{sxO8g4x3+k:q.GR8nKN+C*G zH ,𩌪)l+~y4NR)8Pxe܇- n%StjA0=po(]y P_LU3WIOшOta]KVo$>M WcoڥކU|)C&eA DXj^8+b,qdfSlЩr~+;z°y5cɌ)HYVlf|C?-ԎO!V∱>%4cۇ)05_ЦQ.KǜC(9/OYɸ*kk`bef 5t^/HaF.1ϧ}C⤳ϻ_w66ْWmhEBfQtrTDe$g1 ǑIX?۔i Æ?9 JhhȻvowS; b..zyƵ4Q5IT 8,%w‰f{tZ#^0Z <ۂm78h~UeQClns iO҇p="9r<_:h?IS!,ዠ!Y!nEj@ .naAԺxbT2DY'>/'Do+GN9RiiZuy4k@œ[m9||T.Žh܀LYq)%C "{/섦Amx4P 6aHTڼ'sad63lS`Zs%˱ZO=3<Gsҳ  ^ǃ43hDo$ q5ӆs_wT\R8N- dߋ.SyBĺKRAp>pk0WtNEn^0s-4st}w$-6 Y7I"dŽ WNXy*#? m=I994hS6I8.t (EeUY'_@suixC5O>y=8^NwɸkU+θ햬NcdY~ohoh.o Έެ25,!ROsnW ^t\TTz'Ts;G[BT21k~+.tv躑51UMSpVBrsUTb; .ZN2IE{ O-l'o܎fLܢު\wX;?Qy%cm-N=ΚGZ3icJw\,&x1ZDC]]c"LݯGxwEUÿ~|P17]cWȨb-9oQCٙWm@قgʽh\ 5{Unv)wXDMv,⬲)T %HM}I`SP7 %0x/z+YW(}o X@l5]w"VNE)vlBųYhNx̚͢_=Yh 8ej̎f7D+ 9Py^rzȓ?Q6sZ*|,wW便SN'6[jO1 }/ՊZ|aďbq!Gٔ/]$ՕD>l95*^y(²pI-صd [$T0jiṠ'GY^FETdƐ}[i? bxtTQ ٲ~y6z#ׅV&!E02lmЊԇ1=Nw軓J~׷FFIY]Gg`xpnןU X5 j>$⧫>rѓMCcѢsxT1 z/fr2=]'_EFHh>.x}x*T 3u2ӷXmaaohxJ46Z*-_K>@<8)JE,ݰ4QΏjl hޓщj~f37~Lx=)֍_0M^G0ӖKcC0kNNCKGE~Y5+|;]yo@W%&| yduZƖֆҫ&"$+{r1`!זAhAz}r4L#Rͩz0d%Q'i3*f٣]y6<^B+t.ǘ3*M),/: S#W XOv-XB~GG;M xW3X'.?P7 +pV`;M*)C3~5[@bD[Lbٳt{]b1HhϴieGv%8Pk+fL~K #]'/V5zy^k⎤!1p:ri.OkGxr+Ov75'x0Fݼ:/b"gPum&l¡_Gᔙ%!8 ڂIduu1H*pɹcQkgc18ڣcWBJ)t̩-iUj*M\n8x5x3xʕgy!彶6M4m Uobims ?^1\!!g)#.H+Ԁ?*$-q#Bnx>/3-)a/&IGGgivɕ'rŎ_$s1Jm/xހGX؉:>GF[*@m`0LQS+t` -ˠ$cilP k|VTl8wNr|{"Xh֝2nf Sea@ZnVtzL]w3$8Fua\-?qehE3tgjCz5GY6 ه(3')~~ / {įyj1g@HA喻"_!b 1 S_Đ )hpX mQ\{Q 8EZHt4/(kCחmX_v7 K'v~V[4M AA S72Ȣ}iC[Z.cj '"JcMK]-QE͘c e&`x&8s2U[#bל(jI0JU %"|&xPSM { Ccۄ:VI{:%JpdX3tcf<֍a/0Ic5 @mkIg&􉏄LE~Z?w`]޶D{&!Ƈ~_KMW!*]eCc?14vh<;m5@f#?L5d<-c)kG)CI)'iX>Tߪ s?oF͝Bprދ~g*.UsOE |x,絁8>eSq< cU(%aٗ_g-Gř#J.1~<'(j oXL.#OԛޙO͢N |+T(&tyJanё!^;/lx3P+mT}\kCb7GG # BBA5ȑD`וFJ܄NH!PRT.:Lͬ2#k_Ӈ:;kaGf7YTHQO8gRJƓRpbޙLRUy,A#BT @$`,TdNQ-ӻ̟G&TūOIĄ;" T0 W endstream endobj 265 0 obj << /Length1 1951 /Length2 12731 /Length3 0 /Length 13939 /Filter /FlateDecode >> stream xڍP\ #58wݵqw X-Hp%ȽޫڽלkP3;]Y:66N66d -?rd-`// ***:\mvv^66 Is9#H88zBV.q 7c2iAf@{" d h Pw0\<+; Ιb)pX@ G%XiV`u w x؂@ί& 5:@]VKY/&8i 43ss{-`[@YZÅ 7Chjtm H] F?ܼY\dG~`2]Y5N Yɿu^E,A.n666^~ 0b##Ok ގ2@` 3 p|M/Bfg\ K=?_ C}c넙;z*kj3]Iqq737'f ";>yEOڸpvے\ы·%y4Ev{{;6&cMRCHDcd 8nE)orMFpժ\KҷC`E#0ksNۮ!%4kN7CT9fb)B9TVy9tD ᖗ7*œQ+}&dKƏC?TĨ(QIJgrj'vD _˱UL h*!!',S L.Rgym31Eٽl:n{|`][E"^kDig$-:ܴ蹭1sgbJM J[glۑn~WRǘkJYaW☙~хN(B_ri-Q/w#8v7?{m 4Ϯ$Ny4|)!O O5V=V5 [)0W3`'V+57Ҙf+^:CHxU\@]T}ju!ᓅj:웤@?呣 hXAA/Uhf_%Sz 0BFs,L=R;b'PS.]Dy}.2zB S~0[X*^HԒcLH^OvQzPz:|XÎ.N˕ 4IqDKl'!>>(VmqwVi?ꯕ:ЦN SG2fO[&ܐ \g,9El ~cJ_Dr줺mDR>/&"[BT!~FК"~oV'd20MmK܍fCA_+=^PуۋI\N}i"x_&l%aCt@OTo=+U̍M{#]L:`~P')"q]0.fھyo}~5}WwWeXy#K &>%O誣Zހ$O2?6x(a=wJ&jvnY!3_HU0[2*;tp'ǪQ YeI=pa'[Kȷu{KM:/ƪ}ΌX4`gP8kiwJ/Ddɘ`s%̹!J[Ilɝz%_d1/E^6LTDf>S =bXg؂F|+)OSYEDPrrvȣ$r<]61vJNSJo0 D*Hg/-{/)?&o]!S ;A;9| 5;;ht;ڮ:MKOHafM@);WQaSGe9' YQ!|8 T/#_Wd6JomS(7[a|ʀ(<,7.0셝$y$B=uZsw$~ڔKDB~Z]YB)4o?̟~jɀX\=ps'Qm.2o7+<0zͩ,'jc{"^q5{3,@jK4;! * />eTp<UtVL 2&o|_h-90+7Jӵq̵Vf+Zig-HZ) D*WFZ- ^f xrpenD;ѢJQо+O,.,Y EQr0G#YKh.W^Ape+jýC\'v 90D'ȉב߁~cQ1GCrJ/0tiNtrbݱP:O&N_+eF[}ڡQwn?*:khYHF߾K]e L!"Zl0};%q\kƆb"$;96:s8UŝXRsȢPSGJkfg'ETeG=,)5">  2rbulz&P)."?nRc?< $ G4&ʴ,Q>oP_CFDX nc51x+X7 6d5@J- MZR;eN)6Iaz-a*[?TmIaOw'=^`N0iW `AwS1'@< %ЬMozm:wd&"-/޶d/B 40_ 2_S}PoPl\N1*xBI8vr4&ʾ[MS6k(Te*e^7uzgL. fn$jM2b%c4\fO="yŐ$W?oJ4d8#[8l5p̈5yk9[z5~)Х ]u61 yn=$|_QUϙ)ioe j.z&xn#6n;Ev6H5RJ%7ɹwÝaHKEMus7|XQQg v[=N߲v(Ԛ/Kew2>Vi䙜aƾN{F2+"fg߅SQ"9X6'4 SbH#GpOÇdKrp&4 ^zԴvDE凄K(s#9 3fow iVPp@D7nxOsH6k֭ nW*1Th"Y͛7C =(a% /Ǹ1&޳z[Jv ]oBj)*a2'⮚-TrRЏyYi{[͏ FL [֨N>Ʌ{L8EmEZ#y+x;@MZQ3D x)),{X}I'KB017.+{/G/ǿA۝ֹaB ýK,l4Tœ.1Ͼd&S3!˧N e.ҢV6O.;5Wg'zr9N ȌQN6V,dQPdH+5ߔWu*dcF SW Í<٥cR"MjIcVnB]yZ6?_$FA{*9;8Pm],[J8s|u. M+eJCan^, }P6O(WzA/WYBPj;G4h~q{ӥY^a9QJa9Lq1iVq|l37V|0ndD^ 51a8Evd,}q(%E^ 0P K3ߔ`![gAW^k*4,u'ݶC{ N>?26H!I&x8Qߏy}5 9ow/kH"_6E*eIl34+m< >CY~o|}WwA9wm g~!PR1vginL]i%AS $ tC&b~:;)mjT2[bZ=.+hmHl]W~y]nJN|X ѝ8*VYGs1AhuOCk5'n^m~mZ{h6KVʚ-}zh5V\y`4&E~?O"{79sӨ# U(4tlikZv( #N}ԃ}^P[Q7r%XN*ȱ`DU'!g,WZm<^v?(S 5~vG6jUɋze%,o ; s(p>pKl8ꯆ{d>6'3O\8|J9k$⃒ǜF-|oM,'V s%zB'ACQᛅFQE^O:g_ i(hz+uѝEƧ4\p 4_)I-MpwKYB+F45:C[D򇰅HP J52~ŒV`6\X3}- r; Īat#׾uEOhi#eDuj7nGo\Uߩh{tږbQ0]`yjpOI0]= #ŮI+Bj2ǵLixd ~ڒ>΃2<՞8:\p2T=Ǽ3蔰/;>g=N8!zbJ^IܸC˅=-ålrj,d(04w5j1$MxV!G'(TXDq'R oZ6n:CiNa:Vϼ'Dт˝gy.z<,~0w;H7\kG𾯝Jdğ^' >bf.o6}"%^NOwA`= EzC=~ġ(|1ɟ}O^?n"+F/(|-23vo%Cǃh>󸠀[-tb6-9H=lW{ O|ʹ[ '3uɑԺL_ $±<}֯݇dy!KqZ l+ڡQ9Lkj{]Ч{mglUpTW PPpތi w剩+!XQ6c]~gBRPQL鋸WHڅ}sw tV?a<[Az϶v 5]ol|-ߥ1<9')3!w~S7{}$oKDlu +-p{%UE ܃py< 1/?l22ENNPv%?"@ 7W™#weG` Y,BP3^Uy%3Q|88 ;~qb Cd2yT%7K{\k?@%++N//EQ5د4Xg*>} <$ڭ [v ~R֔Im:<1C6hmwj)4K+הr$Iߣ^M֠ TMYIo,}]ljb=7#[z#uI ׌o9SfhPjbK+e0e.61'T^erJ'e-n>ZĶx`NjV'k:hKg>+-CqQ31 L-e=f42KIǛ=qKz-uakА#k&l9JēFxp. oA2,i4i|!'nQ O}%yXeaCaOtBl.54ҿ~`7P=c:rggWّ6C`7Ibwr::㋱x]+fͥ^)r*7 P&C~Gy Y?ט82ުRQZ3qz !o"QۜDw^:-μB;)Q<6'0rUFUb {\M~y~a߭JYzQ-Tk-eyF:x%nDL΋.A>y<ח뺶GE133tp[+#;(iV-1tUKZ$&nxHi xPaj.{-Ɠgk. YEӝ[%d֜aCx{kb#䁃[\k0Ľ4٬Tj䉲wo,_YOl쌱?la+hm)}@ \]^q8T-a ԖHPj9Z cy>aUL{{:@k1Fl7'C/_QAtK]A4=Cw֖J6ǣpXD_֮#Xd ]QJ+p_>v45*ykeYݸ|nq~()uX4e#fv>'%xW,ѧ 6R8n;>Vu %Bt/:Τ֌gXڊ1`f9fj5mĩзWzØ- m7;V^"eh%)h-"^di} NGrٙXT=6M7[_\k/cy#_?o$']x-=AS;d*t$_$r?E#XBX0-Njˢj yaic[sFlaD)z';`iK; ƣDr ИlPi7x%A *!:Mte62VjωYheN@7UP2K ?{{W*b0(8 1k{{L2jזOnY% _\4dz$%P~FͬbcYL*ڣ1k}9t][TN_q38]_Ý6ӂ #fMe؆T*",cE5K`x^+7uX)UbpW_D Ԏ!9?7nT1eOY/g韭ؾmrO߻eK)@ٍ]4 "~ׅڨ׫.Fk3͑MWX0U€{,/Zq}|#DnuOc˴9@!AxuhHZS 3qb] (@أ_4L*=?&${O!3,ٵ'*/}[g~_Gᆞ$lJyNu\TG;@x5Uk_'h75/%V _طBD_Yx!5^lxQtM(i\?E@d[QY+>N f؋HPCGn|PhF(3 6]jlD2tz*W<~U33ri8޹K7OjXejK}hIta@r.;Sey88QܶQ@.,Bvp#AMPo 5.]y;$؜U4@xk__-,?,0w nj)}R %T+l8PIg;7t" jC,Nu4^`2#6!-ZvZ d0W̔7?T&Mkl:r<f 62*y佻uUyLkc-ƨkq?>ҝŦΏKK|Cx;9:Kjɛx !3;rJ<ï՗|>w]&N[6:Pjh=/~zoѵjaEY/{KsưWB^*U:gwm:Asծ kDetڔ]P"2[EH.v"Ӗ,S>dη!8:+:V4Gm*{rīR@X =^QSbߨsrKw- Rv)٣D8Ftl'-W:o>еJ [`J ^ʜF q[ F``V`rO8R٩HjYLS,:6~+dw8r7[s5vycq7!;ǁlK+m> stream xڍT PYqP(+G AQaHq4IKID@E9 X(+E3Ǭ宀Ǩ *^ nnuUw{6HW!r te2 FE1!A rGaǠrF r&)[LRH00=azs C{H9 NÄa*hL#Db*4 'dp/EbTJUD` $ %5R8.RT "?':PaB<  1h J)F=D (  AqąPAd (x(v0̏Ƣu0\ #!E ] $P% `L'S}005؀ DHCItCP  IM_&Gj5n益*<2Å)AJ[4WAc Dd$ ۛ U#b7]( ;:35EFj4KA-]+ьW4&1ɨiSf4etMQ@jb @dBh>2>Go@TUWwb`l"CGi18I LAPE''B^B7!,_UJ$z?h y$%Aʗ 1Ko( SE] sԎ) 092j)NᨀP`K /|̐T"QPԻPJE!݋` Q^^Sj='H*P#fBNӝpԙh"JRT^(FZo欫i|}JˣOZ#,S<_ :~W rw[xRMf[&lqzq4kZr!lj^^1%,NX7Kv:lj=mS~$s%Aкm._`\dؼ,RWoiddjo+ߊ—7hW(sW0ܓik;*Q1o ׿[yBk{3;fNL/Y[^ V7Mje&# 0iFLzFҲ#l+#ƻ쬶f6M>eޱ&y{~}ZöܸI_Hve>Y/GE;.W(=[[rr^/9$ed=ί۲hqE !k.Xߢs/`WpTwH{<}jcgNNwCZ / endstream endobj 269 0 obj << /Length1 1457 /Length2 6760 /Length3 0 /Length 7747 /Filter /FlateDecode >> stream xڍwT6ҋH%* &*IH"HދRwiJ"Eҋ={3왽g7+8 8$(h PX"0b`&KB c>e0 A`0$& / @$@u4pC FA1u~ps@~ (=c!n0! x3('Yn>' 0!(]h#g(! FAX j):PCkHr'nH0 w8Ba ~04Ca`;,w`>|h{A _3 *f ǠI EA-p]Oߖ#k GHAc8DC"   A/7v_$ pĎ:B?hA=g)pcv'(ձn_6QP/K?'+,p῏X@S_܌ **"B~!Q >0OwD~/v (b,u!3( ~|*+#G08_'v¼ }@q>r Ki~P/? 82uxf7@P`Sؙ鯃b%ay S )z z6і# o>a{}C@ ^{ҩ '-' LC;'fBCĘnQxìiթ.KI}ߕZo#~6u'6WG|LP40MVd,Bu<` sp6W9ISz_3E8SYL]Ѫ/nBc,#SthI{VP.Ru^ePH1+U̾3c+NCwwIޖmĎζ1o>,TYTTnZLv8^Cl1ڤ3 nWP-ΑşR4,{p\|hp mWLKɽ5{:n*d!b$[8+9ЌJXZn|Ck/Q6Eihx,ubͬ_zZ%O# %+^7Dk7 $lٯ6ۣ 4Gy=qZX7 CGԣ8(lb 7K!(ypKdIe7@M7pDMoKj Pa=y g3\OɃiB6Ŵ(,4DsU1R,D, kց~ 66++ͭ]Ef=;lpW2-6UzqO9v}gL6*bHyzg ;2M5vi]P?|Y%ŶHKA_T 9 & =r&c6>Rmr<P>PAeQŔ$]{g<R>÷b*}]tc ݲ`;UPYӐ%g8MǦz]O]aG6nVi]!t`njF@n2s#~V3jlq$ =ogDGiYrv݂\Z>Ķgؒ$i8kiTp$y-=Or1kf/Cs(QBʜ;bZtxbB6&Cobf:"{=mYyM/汕=^ԭ7WT3dqU7Hpor%[e8y=F(rvP3{a4_RUMUUj RܘnIdSՂ+秅rC(-6DTzĦqsb]9+D->4ITſmnY Ѡ ʸku`mm'/zS*2:3#u>wFĸ':T63 *6gJ[Yci -LbLTd Ѹ9^h<)(徘BMZ_.Xq6cPӼޥ|;+ڰ5һN'לmYzJ ͵tL N3g CM+Aw>O&ݠ>XC],Mh1 Q Q R6I55뛓;&i oiZ8NPI%|xlb6#= !&۟P^q/k_kƼe1~NmM~&S='䉷15`uB;Ė>(GXf"A!FUI&ަZ~>)~|EPr) ̀5궺O¶H8*iIƑכԍB>Y~=) '6À`]soעprq4hGXl@(Unb E}PZFtRzi+hWH|ѭ[р=ӱkMH+9x[==9-y&j r&'cWxŏWvzHqOk3T9({b 6`󯒍ϜjL٣CGb@+miA_zsWHBƮb?k˛dׂ7Zns6 >wrNΰ [y=V˙wﯾ@K(:ܷLOJC^M4!] _ )QrMY0| 9}nz^Rln AJLeyaY.s MaK!5iPMys]VH( b9mRֲDTv(C§#cc0~#/s+ ?[dKiy w,xo3G0oPfM%N9Q`GzUS Ţ.[Y~08W3.Uq<7 u:K C>h[옩Nt`Ed쮸/j,9֛2NJ/jN׷>IX%*"1?:Ŕ^WszڔzITQFG={OXY3v Lj}Fi@C%P%ui'^R_2)q7XQr)_„e,ZmR.[`@HШI$2#ݳ"ݗ;㔋m[]^o5UdzC" PmBs w .7-H*SH??n26r]{}#d*įxIk7׆ȦGN] Ot{J崪Ax2)<F֦ GQQ=jNՌr8fϑC3w8 RQdZ;v·eo$sm)KKոTv7-Li iX^/+:%|5썲E-6|Sk%ܥJ9=Lk.!4]Sz"\(|:6u-*Wl2ZsWr*kZL5y(Kv!v1^H6//CxpmsQW d{zy̧*G0";y>A\ <;>R{8T?uI-K1IH6Z{jβNÍ"^f^;HDG7+3lLp6j\_k *tǧs֚T63oad恑 bGn7|V9_(hYɩa=Nzw. ^0O@Ɵ/qXNY;p y*?";n|ٗ Topҍ5tqiEuX*؊1aoB_J۝&e4]#]Ρe!WyG! VzA~05.n5< kuvH0?oxlM{*j$Y/7Oƫ z|f[*7bTOb5L%ْ5MRc7:^(N/˅=L&'遷rT;ixhU'7"N(A hf!)sy˷~2,HHۑls/}@@6]q$`>KVZjm0*˺E&sSmƿҼi>mbdbL;=y)յKԐ`E;'H_G"CfNFc ?^Za@bLBTL#1`R年.Òމݪgnmt!f? GomOsx[X$A>ƺ(dI0B"XTVN1bgA姛\8%Nh¡,)V6w;IbG={=~ۦ[CTnh4툝keΘ N6];g[8g^vI6`E|[Y' 'Lp{F;L5ϙdpG׷f$Yf|Ql+m0Iϼ iDسK%r =~ʝ[d傴iKu0[ʺp:QOnIԉEga7gxOwt]C[D/CGv>v>c [O蠞~t>GRbOjmWy$}_31:?/q!T턷w >pAa/MP3wE}ĺICK 2QscRܯ^6מw˒!jKr (>Te74 u*49} Er{͊W WH yǽy>ak]ILy8Zp:`RER &SnpS!|Ε*gAL7σ掯]J^n?[G=IY@;ͧnޡƸ;P;F?#|(<%kE\/Z_ZڛicpUf(t҉v>vBmEyAHo- x|8zsdд 2zVHB4:=ԓֱn{Ǝ(B_[A&'nEvZ٠l[:r#n*"`qv kl<~7u8j^vjǮZ4:ɜ ם,u&. lbCHs 5-5h]t[Ca59aܴbǭ0r0bZ/ټRi("^ܥںMӻ{I z1g37h"pTb)Asq#giW*/T㉂{5q2QFoiF_YC j~r*+|2;*" Ҥ4Dwm0SS  fڮ8^  Tu릊هaV7q&iև-_A?b$h~H|f ׯ}{gEOeu@guqIV:ZoiHVYl_ZƫCeCz(w&& \nYUq~HZyC}58j1?8 endstream endobj 271 0 obj << /Length1 2594 /Length2 22553 /Length3 0 /Length 24020 /Filter /FlateDecode >> stream xڌP\[-.Cpi{pk܂{p 4nsK^սE:\cPj0Y8AnLl̬ %u6V++3++;"=?fD*m# &iSrl6n~6~VV;++:$M=l,JyGJ >hl||<.6 5hntW ZAk77'~OOOfSWfG+a:F5@ tZlg2fD*?v GK7OS l1\ !Pq V'ؘ[?ljnd Y,miEf7/7F)@S{WGp8oi15)xjbjc׈,oY d!"Oh^7?'krXڀ,,݉E dO؄ftpq5_5;2'urtXX}]M=7w#D66 heB]lZbgk ?eHi((13}^_&NV;+/?h+tar]KZ XXw&$noom`ch@| @;TϥUZظ;o)"FWi/?jǮ-U]mzG|en~t% 9n)2w늱sqL]\L F\_6]z-b 3 ttAD,bA߈߈"XxX,ҿE7bF߈"(F`.o񂹨F`.johF`.Zo񁻿o3/2 '_ ?o;xhec7݆//_]I ޳5Gff^U?Fowe.p*|guM/7xnp1'deNX]|p/' G(6?9_]88;W#xmfcgq lॺ8`oq,E\/N_a- fC୹y:񁳽@|~W_OIswJ@/9򂣹@m}h]'ބ,՞N:K*G #h;RעI}["ڒէp'ž #1i=;iAB~wvEUy/e|e<|aOm[|)VA9y YyKYGg}a1~c&Sm/L8W8 9E{O ÐnWiER&YR=Q4jƹr*f2oRŤmCŜr2}{#޶|gUZ \jd'1LCn,o**č/<#G4yB ]U2dbJnw(N5=h =|.yd,)^VP8[6\,ï ʼnndT@F[_0iB Nygoq}gׇ hDjŝ̫ !/-Zb ߉'o):9X'NdEe4 X ɹ>9-BծXׂaBz"Z??x*3wmjRr!ps3Б} 7?DO!U@_N2%*f^B~Bޭϗ6"H{ox~Av0*lUzʓ\+%F$_kDҴ&62?W#Ѝ@,|+c$|]W^lWBnwߢpg(q4hkT 2kT{ {p cXM=Ltá_Yg> aՌu9$ y#/ǾJUD[NC\e_ \"Wp6^wmI$ D뫾䘄ӯKkse&稄d0B؉⽫tX_gykK /v\!4Û"c5}h67K:Dt oV5Wl ΃?cwKAw0v*{Sg?;tK-ES#$8ʘ %:%gB{_[B%.7솪Ǵ7lڼoX*Hwb1j̜|8p :E΢`T0n0vV,Y mKo>(Hi='vi[U|7]#k9,O3z7Tcív.n<^ Hr5;jBI쁇*<(_ R7C(wA.T,$G)hB,dEGViT@;VV'&7>cNoofyB^u'  >v& ;Y.A"Pl|$7~W{Uy$>gg 9LHgM$9^4@AF~Bɠ Co[hKa26QjkLQ -}3*;;2ÕcH4c{F0kk00>a!1K;t!{N=(97K.|Qؠ=* ~r QR^);刹ZYsAHKK 6-^*{O!О6;K > `bCv 6ģHHi}VK.vTߞF ,O$U[;yIcSEr]_9duz(T29ۈXg-ir]s-lDp\$sN4Kw:ȑ68?c7ƅJ&!ET_xk3N]0OuKD1Kz'!>\|U+Q[M7nR:~ꮧ| Pr܊iofO] 1#b[{ǖ:qjΥ|W$#.|}dE [MXz[@K?:%!7u䃃w5M#~ȑmNibc/z9\Jkl쟭`GaƵWm$ (}d- X. _7I9;! .]Pm|vM!`xyY% h5KiMLI&ccdb>g0^ քvTA Q5:[X^_BhYeF&ڰWԜʆR4iZ/rr AKAnlɺoiΉ3A"1S>l Dl}I#Pߐ8*S~9H OQcqpRRyF,F˦Vmkt:K 0M6=^lաyTM c!a,-j u\_-\Ѻ\i/ˋ)@IUOl~JM,ᛲi\=0QiZĻDaIYۈOh;.^̽ߧjj &Ҫ PP|Ϭ&YNJd45|ڑ3ՐN|H:{AbHhוs \Vy{we5'+I 6TzYbH:+!)KE:Tr#zilno5B [6D&u" ?-)F0~2 q[ţ>pr HW`3qXmO*Lʆ@& #{G%xX+&S =_?{(j69:YߔOR5BNFHAK*v&9gY;NwUޫ.kW-͝zߓ=<uj1VAv^wVU^`q+7d#~eɾ3:X A1 Tni«=pOa%Y]M ykQg>κ~ r`Ơ+>lDǓ YzAKՀQQS;L]2[[7sH/QulUHGIa'X}r+>kJHCs{%V "ϡ7r.bbz6k}'3z.hGĒ7-HԋbnL XtmE#mۓ|s_5C5Lu)w=FTBbB Ѧvآq)~.6o&LԚMl׋e||?q~?Y4>`M8i~' E{a5!s;7KEF0J~D4L׸Tna'Ả) !rϾͥi(.hca@s&=Pk\:+^]UQSR'&iGsaIC)UI꧳#"mcFOQI j[fa +]롹˟:|~X}3ݍKpoΟ}^k)zye7M,)k2ӨgYXuz8)iGn*C VZ%C~+.40u$юONWeaY4#rTa[dS}+en@̬C%Qa[:Ak]HO#ﷀڒ~immo?KDj "Y=C& Dv(RL$j7J><%C@# d tPHȺq z9VFr%ls>?Gw-Ǘ®U7JG"y?ig?xU_XaFa;oZR֬bGZ9!gw:0&!*@WME@?]+7h`FZ;t|8_@bO\bѼ$m;^[?1.[,hqy^FR?Hˆɏ وOYj Z=Do3Pm!*kp߅|-%[buyԱkdV3B[OO [ywH!y'K̥OϧX8%M@BNЄ%2c0fv9:[[Nƞj̷jr~/S3RKS<=5$z:#L#RJQy?٩ZC[mQ|(q%yAM3ϭax%jsը PtR+VV}X]l1UE Jvv(fDP{T*,@:ТӃ߂Y@9F0eE$}/s$%WN2F9mF׮ݽ7D,h{qJpI bDH0$Yi?GEHF)?d__+mMyY0z="^0 56 jJ(fK.@5sE= JHW`6FvfK?q )CFph:+4a>Q˚IjP6H v!+I\|E6} C?pl?xo';,H"Җ;$-0#4f 6]!Lŏ,6kO3sɀuc1i`80hFhU%5R}_ 9-+^M?}WE\Ψ8 G'Q'}JBfvz>_kyQR)w3kaOw".ˍ;M՗Bey2Ae[la;AA1AN\Jxy:܌h1c_&L_f١놬`Y%>~_gE+ɡEɛ M!{{jr~iu1x3[3㏜VUl9"!VԳL:*V^^r]U(ƙ =iU'yA>vrH* PzO'UZYe~ %dm4#~>-Ňcji Sz^ Ӱ}[vl"g"݇FIZlO'aHjh@b6ms4:7H%5 Bv?8ǩmJ҉ F&^p_!edqOtFI{V~( obI;攂6Kgh'4UOO评7Z߮rUfv4zm 3_镃bb(( 6_(c G+B&3R ⪱j!1nLr|[к(u+𝳝xE^qKjᇲZz.Q gZTU_ ۥNuǟ 04 U@[H ay";O$Ӗ,{&y-*uuz`ÈF|t+ė?:E%XlW~\_Xv4\N)GOfT -@by3m 5YVm,cO0m+ת೪F)-}FupY l1("AxQCOC`w9)P/U"D.Y1?ؠ :"ɖ$B=T9>P~Z}Q>q5ӑ!jE7U˧\y^ēhfbkT[꺑?&Glv?%>3fFtKssd!ُo1*Y_"To%hSDE^ںAaU69ɤl; xϻ/ZG!^cj&Ղ2Vp>:-|ue O_35J$WހWܭ]ƞB^G~/A0hJ"l;uV!خǞop_w5 V>ԾUgF-m&D/ \ g[/GS=zcQȨŤ=_/kIW(w3F#D2E1^!E|^/bxp=gcanErUV._ȥ@)_U ?SRsb~T4BGTm DkƒNpҨ %0.{c1|<qYb o1*IQ3%sonN{{wmL:gutC qcJx7)6]M Zgx_wU:r# Ai'P |aje1.'βAf%&p|8@z|oaށ׾T%DعϬ˧ .֣phH%x&}TdؒOxnBo3O>U#饫̇,[O+Xl&/Y➱yݏ6Ux *Y5*N%].V۴'V^.:Cg-ߊbdYcr:(J9RϏz<"rl_%Cj*baFD'#^44Bӄzy9[1jX@yySC%tHcKd*w,suүѬSQ_oi~!tbBW}7?XebdrAQ|ztCFM#tB DO^)ɣ,i3ۇl0!v"$P]>swE0:|ð̰黇nsR\*U3U6Ng6F.QC \OԷ.!PkKt™{) :UdCmD'EWYXe!\vad BXFw3`oX2Qx?܇SV"BT:Be'YaN}@ Jg{=obFۈ)r`7/ƃ}104%'pic/j@8Ĩu55#p :q sJ|gY`(GX|&hя 2'ZG3t:ouy=Il$uHGUBX1HfhG2A1M|i>ɕ*xbΟӷ{^HYνFF9bGtzB`X&w*yDs櫷{xt]m稄Ra#2, xmX˜hL)t1-譌-C:iZ{mk+S.5jęu0ln;J⺪V6k_\QYٴ.O)xZceܠn*t?pWZI/UEK`$ s4}mF5}vc[O }ɖNwS]]=É{{ ̯7 ̼g$j/f4MOm4ǝX;(}Fg6^zK͵4r^֥D U^**KQx9G^u>) /$$d)}_ Ԣ)D o?eF ѿSi }4Y`PpЄ(碢c䓱 ("cmuio'|q=8aLsd"9$y)/!=ݘuH]4b,jWPsbؒJэEt4EJd`'0uOj d}-d¼ycGqUscw&^W#DṚ ?I~1qE'OoURDGW[r3J12c#ʡ1OF !mC^Y2>Q10jL4j.i àKXmb):@:s)yu?ÎQ}'3cGcP[A4>@XKvIb4qbgE'#Zxꢌ] nPIƫ2J&0tA4Ь<gx84ݞR?uW *i1GmS||0[_p?\*-FÈW|@&}Qqna`H]{ Q/9"κ MfP;;Nx߇i1ƅOɎlI!6 DȮnhy}pWW`͗:ڴOǫ_5] lq=`GF(%oBNz i~;/Юz>43K!}Ω%룣]J CLn*w.7r5"<+N4T>cI8ަJh:*R|o$]LSb> u hx-0㧃:*u P>fJukC+v9ԆCm h GJUm99;P@brLVkMV O4ㄢts 3Yrhd {n£ClGҕp~@_Kk4ظyMb Hc;# o&<IaMRB͌o֤|l~ދo*WP=$ȡZf>}LYw8Τt~7ԒJ eMhSڏl /P,($/ P$fgt`2Mv#܎,T}mag\ Eiosۋ }aţn"9:sJ |R]{x zCc_okF};ػ`1Ц`)#zpU_<ђ>i47^GB@x^ZuؖdD;cRHWT)0(әY!n[Liwo ʭu%*:K(?vؔ NjRCXuiooÙ~:Tp9zI׻)V3qJNLQ[kqbH6<֤u7Er!/>@gPwjF]u!O#G|5t 'e]2VH*C0I>uO]zaLf*wK7'Vlg#_u)<pQbPc!ʜ fh:V"ZP.5zhX -k"b{ ^NɾZ.lA '\ActچTOEv)$0jMIԺ7;{ ȣ~I\c_ll{N%OhٟWzge(̌Uv!y{1~a˒"JI͛jM`WBƍyF9̜wo(ݨ^E;.aԄ= *6P 74R3s jpkh}tqAN╦\L)[#]cH8zh0UkM'~T_NX~L]ݢ/9*94ۄzd VR'Ӊ­6iOIcQ4vTvn |RJraW&1,/Ɲt)C@6l++~:PD(ƥ7|k,{3lge*ÈeZܘ]9'άUS@P=IkjWn,y7ծF)Eм Oi<-)Ř?%KaNì{CX/ҰȞpA[;0xU: Hu.H=tWkj_|.lv Kh2S!hұ囄#1yE.Ef c̵{cz̶d27W nCTADƝhB$:MAhn̕Yq8_rrեy荟p6m8Pov̶@[Ҳw8 ,db}]z_(U+V֝n]u'>,yz@lSWV7ؚw,9&.X,yV:GU=:xkkpO=m>\XSK_ K_5`W?bX-pJugWT;&ڡ'\h%}HLBR Je)'Cg/ڰ$dyX|U< Ui񓋓9仯aH{ wR \b޻ _?jY^K< Ě`B="[1'ԓl8 пfle S^΋e8g,y7\ jH9E|G赠}p؇[ e(DвWV}̦.ΈM [Fh U󮒣ϋ[>#>(<9I B*X Kk}_DF7o)RGɻt9ʋ'Yi_7Rtr bT Uⱡx_#4zmF8TR}~f8h_6}.2C/C1xgYH1Ʃג~)9+G_,g4GQnGB/l褊(̈́D)umBOOb%5n7kR}[ ?;~ޗ 2Hנf<3Ԋ S 6L15nΒșvc]s'&h0z. c pk_@H|R}y5(r{ -4̓ZÚN c i!:i5ڐ|ahϛŠ> ][XŸ@394JA1 Fd,ҹo\YHz^bתLyɄև|SF+vߵ_c?-Azgk}]+I֪9z^hT+5+Ly]TKuߡ@#6r?!l31UM+ҞWoa t F;( עZO5 ir? _HMw&I AR+~lmCw*壺{ 65iACE1UB}8["(+ywGk5ekqL^'r4TЀn(o1 ,WDF1h|)j`V5@A=$7EO=PF㾮K&QtR{5&VAGVmH)>g*:kXj I._cv䃦LFy֛l0Cͬ5aTV8Y^sH7a[id\">c u^|l=@< Ԑ'g<=&|,x(tSvD͜zq<qĜXC 9[8AUmQo$ h#c_2swQ\?!x#ܵT:l/@pKd^hd`sE>/U)ll<,`]HRq8}-&pa=(`CGCIL 3Numfe'R#Lv+K.ǛolLYHʭr3%* :!^9ė9]D'I7Z`'ZT}*laP]Oxѫvgu-}|7 9\EF}z@v MY/vp| QI!sT;)@FaSi$oqLr@L00H&5.q[z|U];q2HWכCu^w`~ҁ?ֵZN pu&;?66!{ykw?2A_wrۡrdN˞'O{i__Gd~ ! 뉒JM@a0rTl,Kh>9;Te]u'jD ŸEBgR|<3)V^odvkW.IMox(pR'c6^n~ڗ&. ]= ,hQ Ro16, $2-)Wx> J~Lȹ-M#$MPCV( i'%Tje-aҁvl!)NQ\cE|V-S9JNWTno}E90/3+!/a>C@mBs_W][a&?PlL(Hg&.[+ P}ldA٣[mWT6fl?*SFufvtLRwTHN{yCwKH*j _^g4OKLcRB9=9RlwPu}͔&" GD`ȃ`G /d5!KUK]_18>79f ʁl.Yr LFK-,7/\(z\WACWoI ? |d%uFy\avc`+LO(Dlz bMŰ0(q-#h|,p@R{Quu;=sC[|P Gx~ b}ztFW"41}_^GFۢVWس9J: / hץ@~ cSqbQst-^MPER V]Fr \чHnk-R\ǪT' xs;y7pGӁ[O$~siڽa&J+~1e>\{.`ŵh;Fo bv VA7\ykyk%^k9eFic}_Р?ɶ:RZX^4U (2:NgRmԙt-}.-Q XdFT1:nI4j#¯PRdɹ'Î?P2T&4B6x9Cadj-G<2Xg\2:SVJ*`Hkhm8Νm_ۤMk+ZqJDZ,:a-vPH޵ ׏ğ2A\Q1 mf?yёlԑ!.S9r]DI L/PЃ]0B_ż< gFJRi<6/*Q WxM튻+zW_,w񈋸PN.W;Xp*F^(w"jY$Кy~l-+ ѯE{OA_(#HJ3,/-mO4ctuu~9ŤyVHM.p)؈r`z@C0;e+Hr j=%?"Wv /5PQQk/l *c4f^^#uɑ^uL1}Z-BD  *$1 /՜q%a 1  7m,,\\7o32a̧؀x5Qx~jd(lO:)zY{?Cˆo- soa6dwKF.EY\|OrcEp_ (*rG$ b |mTY:(2[3`cr DG'xJ-lޝ1ˆ(<עL7=OCl̚|jޅ="s>$fm+8TDIl)}qq$Irg2 s|/ʜhO9jZ7I22Tî:22WAcj9<|eǂu\ 񄡴/mнJJ%@Jy? dFx~?5X"`@~W<ఇ}UvU(1C0* cs)s TyCEi +2QNZ|}=} 5 H>ZOho&s4LW4CkaE:?iL) B2N_o6|*s~fX̢<e*[BpÓfQ{x2ao,9? fF+yDօZʹ2EZ2I˛tA!l,&O\})m3-]1^^Y5;/AMȷj@7_uBX,EOğȾPN^ϝ|:3Sȅ=񯠲zg(#u2R\׌1jV6,Ѝ'@g$!&qj ԲB7M }^maaSf|msu`uA2eJ91[0WaÍaDIZWз`Vi`/#Sj'(fw\#!Uly:=M_qO[%5 &-O}a[P=}HCx727 h7T(\iY' j zF2;NtS(b෺7BkpO[)NOGdh Xg"C!S̗p%o'33ŊED(%8^h\7={.iح 7+r/V4oyg,f6_`0S #vgdбcFſ8c- ̗3jYxQ–C  1w!=ch`E>1ۇAԒlr܇wA8zS{qQ| ٸ#12Km\g[b Z{R11e`,H]Jt6]:=/Fsr*f]UEW׋O-L "kGVx. @ĉ>li+7̛o]4+2S%2uL%ۗGX^ ۧFہ"H<]TuI>eM#&WٔF\Ht`Hbpx urr]m,vW̩}0q¶}~t/%%J̞!!\^.#x\N@ۉ;{Q6 +_J"4{a^jJp^F*IV?uw)WGsCcjnݷm} 9,:=tI&9ky /gXd(*S+;Dw?s=j? 3z#H-$*km(9|eTh!ɀ}O( eDmk7\Xd|Ƽtqݛ}E6Pԁ!}&Z/tKT#+[?j`J$ՍKS81DP[EP^=g*T RdV7'\߽2Ofc\M2]^EJw 4>SO2> stream xڍT.S5[Bq/ $@Bp()PJPܭ).ŭ@x guZ<3̼|ac5Sm pO(P@.! ˌf AC0"(! Mia g0@PLJP\ !Re' haw\6%j;?N[.8p Z D[3n }Str\/(q A |wetpSonq} aBb IHT'x`o ap]஽F$*L8 7C#Iq$\_P &glu EFzq |"wBqv޻~A [9tcmXU"θ4ێ .>ED7BT5-K%~Z#[SھJҟi]xO90b]?=®O7`'N |7 BB+>5s;zUb~M> .a+əfB1&=&2M7qˤăp'\g.=PȽƌtt^ռ_ib4}cl幠b̒mBZ\YZdd,e5o3w^d譎x>N:=lNZSH}:&Xh$j^;aTю8'+#+ ͒* -Aٵ^+C3SQ['Y1w %j*[CC^ukj23ʺ/-tqS3[t,jw>qeU{^El*VUKdy݄1A~CJy4rC#*3ܤ|EPs2\DxQ:K^GܘUqCnzKAes*k4Ѩ:ޟjo8L{ãۡ44>fúfB4Jۚe׏ը RV@`C߼_` ֬h^ڷp{с!iC(סtj!AO'gd & h(sTn.;·d8݃-=cs `fǟ_&SNg}1xuAf)Oi2uvW^ ~:YwĊMI.8N[m+]Hn΁(b8(OS'mo Ok3KL!m\Fwg/`A3JyCA&).UPFda24g^LW,집O&ۗ|_NZn7Yc%\JRfCSyBcj`zWKu.O?8a?#>r/sG$B<ڕIB N6|SS=RL-:<}8Xmo3{ebQ^R>?i3|F>lo-%K H[z]+A:TU-b`^gG~dB_.mrdt(*Nkͤ=~p>o^)\-Jӌm-7r__jH%z}NFVL/c[۱ʵ=R)L1LsŵyLfFl\ƃ̈́.'9 ܏o(/4{_Y1&g`.Ɖ玤?HOwTJL4B(gnNCE faw)Lbr(>Mِ{dKS~r=Qgrz-tiޕ;F[|a/;"JLSEñ_wt6G0: 入>t^2_ܘ T _oHg*al+=khlUf}O!=JuFzXorI^N)3[ӟa'~IolOK4oW3y r'"B'`S}{Aчӳr ̺v9RIϼDn:ludtXqzHsi]w~/s0s>|m|*~e0B/m k72KdH($ivaz1Nz1saSDnm}o Έa=6&f&>k8U A)EQ&R5Ew+CJKBǪtRyހ:Ӻg~1:QP1x3[* *,Tk{_HP=l>< )M KMr&:|YqlBeuU@3٬3۾Yk Vɺu6WT)!"g?~rF&>mik|ȍ0I;+ET4,mW UC?h@C:Luy0WtP7ܻanhʺrVrͰ.29B^ݮc)?7 9 }`D_0~oʔ™BcRG"ߖK>PШi,=/l>Sځ'Hklע6t63RQ)($I4Y@Evꂥ3^a )X\%l,A 2<_W޹ d$;w|{2chD@Դ;M]D-lP4>~xT9JZHG$^zжuqW) Z^|-159҇ qZ>EV -5JpvqJ1S>0DyvX03 3}- ?|"ܒYi+A$&BcJT0g+_O:5@u?Hz?Mܘgn?A{9\xØ -Sه$ZA@E5i`jH8,)C YI*{Q#KQNLۥ\@%qvŜzHѝLhA,]I*dBC.PW=a%pS?3ff[A6 1J%[2 [`<$::9,֭Œ޳bnKZtA|X?Ѻ>uhΑy Z=yJH܎Z^/ʷ*GwU&S/Uz׻]98Fd 1/H">Aq=$kEYil1J2~H? PJLr 7B8vMdܳgLIlk LZHO:*޶)r7Ja?g~^@ۗԨ'c]vZ|gY;ʅ0l ŧKQ K]9&F~zꔚ9š䃾}뚖e7fNCY5 n㙷q@=%xg1T;6葂‹O/Um\ V! '1# ɼc&DşIk: *uz:+uӑR.xZg@Ic )/uJ5IN;>dOW= x S1Kh 3ąx=(}ٽ *VWϯOu s'8v_笔ň1)XIKYQz4w}C`!-*O+9pB$=f}5;>=U/bڊh(8pL]IthVZQX%Kl}1O>J-4WHv49_aCޯq Gͧڎ+o.~ c\30G.a6!VzvnEMLTo GVv7~1Of2;*2dI5g +9Q //5^sWw4hs綵TXxdY$22HA@ ij`I::^wm*jL ,}ED Vȥo} d*л(ȋ+;jZ!!jIQO^R)isuhEalvbg>P~?z&&HXA e"[1 OM.2[;lDvl :-jgvE'RṼF(ڭ[&K0_Ug})bNڅZe~qlMo?ha˳<V:rPEliZ0dl ><ܥ5oy9V(옣vi\'i0Gk}I.{dC$u5ȏ/t2A49 /6m)?d3 ~Y1.O>ʺq p?:n خ7^gA_mLǰɁ"ȟG9ѩg6QL`G*RbĿ01SsK7 |?HbS'%17BYI㾖{UBhZ+8 RpOr'wD0kmUjj/n+B'oۘ[㢙n7{$_Nf]db Q)u$=雴ʱ1Y+`.^-v]~&%;'ڦqU]R $;3zE(I{䛣9& t~I.JF MMz2Rǁzz"LCJ2fToA>Gx᩾0N_LIAs,Ɍ8~6_l/ 9CAuZJe➸HpY/ڑ}Oã!-pG̽5RKy2 ˶DRbgE6mvޮۅK x#5_< 2% dZs]>eҰN0JVIܯzcI,8 rT3ӻL>(mu g͊Qjԕ"bGB3\v!A"׾][ZOK廎(.FiSnH{-$5䔙~:7.v bg_sm}+&dKPXϹEr:@]Vunh-gU)od\JU;W4!] f(SVh,T>a9u.êUhH1&&.ǵa4Ruzj.MGst=qH0||f謕RW)Է4Xm*{œMJDEd NYʊсK&Y3 p! 'JxR֑`cV4u Q-3-Lͳe^V>ɉr%e/?'Pʱw';v2 E1zܭ3Jĩ5CؙT"xOUPL*&;I`uD_tȱpBh:/38VS':,i)c=?2{dYN@l"b0Н3yo/0)^^0wn< T/+[A{Tˡ~uVdʲVUD^E#4VNbe-37q+}+g)r^L Ba\xlh R"$h1bC?=1W !ފa>FvGpڝ/qpKRN#'3 jNW$ {Kηx0Q1'zg9ξ3)q`nH·iDS`|m>ZozD%_7jJM/PSJhĮ,U>ܘ~Dy)-7ĥ[  y'W> QV<}NrW5poJzXk9 V}w I!{d:(`W+NUn}zud< xnXo,9 0R]q\an߱jT0 e S8MQW4r^U|m7;&l` ~'^WG+,Tk='2i&nkYԌPlLڠp=ǜثU!M3-5a#},*Ȅ|*:f~iP]vU~5F#^@'|{m,v _]ٜZ^Sf69Δ*%a/̽! 4+jmv8nr{v}TA wϸ~n?Ċ3tlJt!4Fɑ&imIj GuFckI/7pZ3lUs}K-diW,{l-OB\g{ۗHFft+ nWjy`iP[zjIU ˃ g#5$ȽHJ"QNK䧉nf5?L%: 'f LT퟾6M olB)~x~ N4o=]ӼnŃ 6:gDYzf?Ν$`1/@H?ħ-~.uЪľJ+=l?C(uX96Xp4+0qW.>ei#VCyûz+C ;vY79Ht* gNVNpA pH"#(8ñszY GB2,9aq8 "GiaO_^% fp!jA6%\f52zN J:S@I|', ~#x,ϕiDӰm? > stream xڍWTlS@$T1:6QBc66CB@B 4P@N}w9=Ͽ{LHD"B`a,@T @@9#ZP^p$BP0'SqfH@ %eR @!% P]$ETCz`Qpg4.˿^(,##%Cv2B!n3$CcW{ #QΊ|_8` |`_ !ߍ S.p?b3p789x#a(.7LG`C1c k40 Bp8`#M}a4- Bܼ8q.T1@p՝@{ {~u(+ nG5; U:⦎VWG8:jCeQ-s HJZ0P_ͱJ/1@ ,P{A|`4QG8 p9GljaNͣ <0[Ho1UWUH _H`1(_UA8!2M_}޿g,C$0I/]7t?vsZ; Wo4HijCW#?:h*g h["3Fz=(!0:G *4L"KTBA X ܊q7 ?GCG7"$pB(~S\ {~ )Bh{0 A)f&Pmǵ*7|ƀVgPOIjQU^_{4˟gɦ#/)6UE~S\y%32ԕC-Mm\HwV ]쇨eI=ʳQxq`C Z= kyCl[ bK'~^\L}W]K׽>x!c'T߲1j]n,/3!N\bv{){ xޜ"FTQ Mr}ŁŕA EjRi۾b#ȴ-|Z8w6rS"gɱ/$u=٬J]*R쏦YX\ژ}ВJTEO^Nkn'UH~Y?]-V+H?<5+*ɐEɖ I+j"y X~%]y6Amo^^gHxF`^UH!5}R@AUxvV#kR%+HDᆩ(L۾ZHې_X^=Qy5\gBSV{x:zQU+^4Fa VV1a%?OiMv\u3@`%J;x\ZNu^W? KJTwBZ\Π]=s B)E;K3VR&,7S*EW׭<_!\ȥ'{12{{Nq~U;{/ˈ هI1u}.T. ]5͔H9vz/[h"/I:]H";mvX=L^hf\ .\p:V+zmLR1N9Ujp;[),x,w5!stjh\󺘹|mktI:5J;o^"-cJ5yZmߨn>$IOxLRz\G"nr$4B0$o5 !,*h2U\;"p:v17H`duu%K`Pv "sޛ] 6|g @"tQ:糙X  CgL` *n1L)& Iv%[w"֮`vrxL=1#J}fFG3oK4ǠkZyw}|mؘHhcwNE=Ԗq9aA}e#l-}DH1t{fE1SZN6_f9} dzD.HGKͰseQˢ"6f|.˨Kҕ*cWwؗV:y {) jZ\ʎ3]uMA}*`0X=xْ3k۫=ݲ+A_{:29^8l\3fffrzAW]&6*$ V>g]p_tO/*uu0V~jeʷVן!+%e NλpfSI#;TTp6p#uRaގ NbUjx @O?eHiƶܤWM<)(ِJ!|rї#U\}Bfuy#i!X}yv7ъntHtu:_Z__'_ȖfoF%o`I'sS}wJ0&[ 6m--5^?XLJiar@^ R-4,2f;Ӿ;@ʩ8,}Uڒux\n T:>Oms< m.wlrlH)biK k U{^t{jec%QAu+ f0Dտ,&K 0XR滏L߱l,8ڜbpVgWrS8T m I35UX6?*'QPByΔ;[E:W1(Tԗr]^@/ݰ6qV'tk'LYY>+ۓ$ ԕK]vccg J9 Ɋeh&W'4To㍩a}Eeq7P: 3,9Z-RUr&x348uxTk\+ife#^6Y0FVr%" ;aýqם"15KR*o#m1T(d Rtv~ȉPu1WC)͊7LLdFh.b:mwuj$".㒉ğvM(GeŔggcIޡ6o^9|H)M GCS+Ff*dUvV@Ny셼2GKEѮwl '_|"2')*W6XNWÚd1nzn CXK~)vWܸTlOH9{ g'/ۏ)ƅXӍp iNh wWxž{Ծ$bv[3zۤSݟTxE?,z&?hepD촎2ҋu%'}L> T'T98c7SQ`+ħn0vy}7'4!,} S4%=IũS} _j@{p㐋fvkpCِȠ8o[/ Ր=N0Y9;q=MJ$|.{١>5^}l G7c.ۓ}A Cjb6a9}Ssi* KToOŎJp*Vː{kG>(1[cgws7#ԷK/\XbXއZ oj֎ r6(TTT!+s\rzv<pZiRrг|P<:ewm [/`#(=/Ŗo=4cx۞z :dLdNqNqp85zSM!R-Ya\6Ƚ)KM7fA8p(3zgKk޹d̷g5">& rlZ @SZn۲=Mo/Vzcps s{wdL,g.֤G6x~-ܹ&zXav|ՒQ+{C9HD*a{VDMA#CO"-%&X6oLWWPGJf3*Tk@JpN5ϲt;_T,'J5T>|ޛԞn矇 ~#S~ۀv-ѼnۛwD6a:oU So¶D4Ts&}B+<%و1x@Pl@gF!tⶳEk5Q_4+)>#9SLyGXf$q¯ګ,h06#u5JXCf4Dtf[\G&Nsw`7;Mʫ33S!V #7P[u</-LҞuU\Aji_!6td_p:aܞmxV59/yi cLVUMx]ndk1&7A {3aOy`@`7EB\Qܓ9|5jړU)X"W4Ͱ/C9 endstream endobj 161 0 obj << /Type /ObjStm /N 100 /First 889 /Length 3804 /Filter /FlateDecode >> stream x[[sG~Wc\[߶\VbǶ%*=`I$@_9= !nK>}9߹v3V.P^ʅBGShKͮ0U@ͺ;N*ć ҕlN{'O qσ@*X u!ěɸw\͊SPˬhY/`ͯm~َUZô6 8 Η WUeagp -]yzcP8~Sӣe ܎84GjTstGRKTu2j=k-3'lƋtW@>-Wɖf<9V:Is%Y%zI|X}_no2O 4 ``*JȦ_ =Ht867jؽxT&z]ozUTB`OՄUDP*~ A򔒲JNt(%#tDžx>>074H[b62 S_' RҘ ~VPt,ן~%h+Jӽ:NvWNIŗJ!NuI'tjN4jq}HP:$> ]6Bj}CFhV nHvLMEh8ey]cPW$CpŌxfDg{-\8hI{u,y,]/JuKi霼pim*%ox6Yr'gKtiV=th:`k՚@{I׉e5N4W+ےESz-q[z mҧ#hSŁZ-`j4C:Y5C5rŇuwj蚴tGc3챸tRjSبC%ljbI!=,&,}Df-)H7CȿxKydϓj'_NVROajځ㹨8J%i.b?1O~,֓vj#:0l 2" |VaKIsDIZO)jOKY|~PN/X,Z g2݂ri[q ~1ERJl*<`*L5S[*y:u7\Fd.urjH_U%N}!gGT`%!NXwrzreM5Hl){e͌T -AR 9)aJéCGOH_4%=LS3u=}-J.J&9/jZ_'%ت/Iۗ2ɢ˺Ԣ4y 05blfro钒5aˀkV2pmXѥdnku;֭\,m!_!^m(X-r{sKii8!@m9M.Љ[nT-dYPg ˥ɷ?rDB5ߐ0ι\a~CZ9A&*f QꆤjSkSwi޺m]YSenჯ _l}Ey->=N| yrg7 wN%uhk-V{ۗITkifrF'@53fF`p[C.sK{N8Ӆ0]_d9KB]dydB8 RDw`ϕC7}$ ^X)?ܷ극r.ՓȺ)oR:ǁw,}B l3\븴tqX:GnEn?Cfcvvvf%tRYy%qsV%:82jm2Лbe= 4ͼa*8Gj ģ|<ﻜm&*C/J<8-.6DXltKGpScg/鸾\z[^s#[=ruN,%=0&Ӓ{5|^L @*jǔ^E5c*XQ;.Ug;#>ԃd%NtE_\k1SAZ^Ak6μ›y{*+F˞荇JQKqe5+1c1FVA0|31T17C jo_YFMo@jCz H_E9v}Z|n6A&q?c j.|x1P;<9٠l`<Ѐh؀^1iXͷQ32/NvW?W4>ƿ5 h1Ffz㫫.$9_n )݅zƎ6e/×BDO3A@ O%TgDKG˒gLŵ,6Wcɳ\ fwMxnX][-!2-?jRWᅿi኿_d$p'ӽ, y*{Èm1 m!:^g^zV\6 Yf0CZ endstream endobj 277 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍVT۲I HG~)JOBޫT)B PHQ MQK'"MJQ HE=w{kV|3g|^>oj!qA`8ID 46W )D$,ly#XAX?$pM,#ڴ`81 {P*UP@iD_ @R kb|Hw-(UTTX$a8x" X`H.)Dxp>J`p`` 'JH`C`v 1)0`caX@4x#1ij }#菃P)+;cP>0t0!U#)\N]9¼0xX s!:.訛0bu"}p~R~H_!^6UB!8?ЯXxcBc?k7$W >`+4rDA |D+e7e&naH7 ?w (pEq hF'E!DAȯϿWDnb.X@Hw440A^RZP4@\3) Wcn@O[WM_/ae!2Mp{Ni;c,oߨ/0;/Wj#Wc+>FԀ:ߗA!\M8[70!=($*#7 Gj_꒖`X,,D1q'D"~3K18b@l/ p`A)/#X,QVO<_F p~˛*y%J'M Tiϳfi=LEv&bRC͇AoWhx%-ՖB}CEzד_b0g "M[4[z.oH{T^U}dpQNJ$V0K)A8(lL!nVhȧ~\B\v|;,.5V 8>K Fe>8膏(\ F&_zM~~}Z m]/ZB7b2ұD 2#NN _KK' {0<ϭs1 {{2_e_w+| ߌ^U8 :#--pYږ2cU#ѸH8Wᢐpr,spp^-Q:Ly5p͖%'ՈNzRЪEq))飷Y[ȋhxu/%9߱{V޾gBO.֧VMyJ9uњiNH>~[ҥ y\iƈ< +PvQ)ݵVWrg6r+Q j-ZO mSuѦ= EaNB_kŌ5ಳp [. j-j2ٿry?g3畦1Y"s6|4~qjhiY!}SU,)+ׂڃkjӯGXf ="6O*{OVTbjL¸4LAیyy>HJʙs<;ߍDyfV5~`lsVUʫ)"Ž%M`kuu܏'t}ZGm6p5pQa5+ t4BmIw?57>pܘEa8㗺 vnYںM~:YW9OFU&5ZV(S7 ;~Ig,H!,B{=X@ 6_XPUmKog~|J2/:H{}{R \Ń(q^D:2wQ97K.VSU+(kMzVؙ<1  lP=!f!*7B6G qaQ<:Y] yO+QW9z\≀v%F]%f8& O:d 6M5=S'u E[!.òi6s>-p;bW.c<-rHrB*lsH:'n9ŗj>Űmܽp-$+!{ϷLsrvJ.j#ɽ]џ򹜑_.A[h*YH^ęう8vD# <+s-1{S%ޟt#PՔgWQO"Ǭ$hȘu=9U}Nc ;eMZ=d2[剦ܮ)j+(ȨfoG]nqJYތ$? )/(\c#/}H^VD_TnQϭgeW>h|gjƭILdfDHY3e Le-9SKs$ \UX ٫;>}O43uF})b t]aTnHpi/mC7)Ӟ `N;xubȃ]e^S׿2o={M5nC6ژyZ=Wo1WGF[1ϧ  c4M*be>ހFˢ\Fa#;A(T9e1^zmKeKrוu5#_ 0o=@qe,BvrPSʕe:Y(sMgeB \k>4su_f&Ukz9 ;Z\oipTlw^-]Y廦Z$-}l,q9+m̐x|Y(Q=˳sVzm2wAM2kMƈGm\M+ԫ/=Ż滺SRo-9 61^+ Fv0xz`t9 R]i^rf Vy\S G"-c&f:ƁG +2{R:N|6y:a5ɘUFC.Q.Hn`{{> -QMPTڪ7t0 >3Z4rƾF68JPSDxO_)Py7a)jN6v'"ldhz!ծ/l[:G&ԪlhFG>A*^M;ժ 7ZCHщk]1]z:҆4~z_w&n0!-(",adg#Llm' [qto_7/NNsUaj{[F>ʰ~,jn(WWX"&^ॠNadΓb\d\.4Itzy4p'-̉pus&k@) ^$}kK"/ NEBc}~ӗ^ӈ/|OOC>PîuԸ_CpT+F2 )Em9Qq(>Χ։'uHyg<'R q?K947-D.rZGf5f5#ǵzW ҂1Zbk-* ҮfnZURCyz.,vj Oj2+ӖZwWQ`g?Lf12Χ}Q5Ѵc%\&~tU-7cKKUA:_wզjuuxK 1V[/1"kMSɁO]1{CwJwa'%oM-kٜq+DQ}*EF_O{ǎ.F0 ^|R-hxv#Ua عyFbgCRn!!%VXpK}>n)-)``uGܟ{vaIc̐Kȑ.!cuQ%[2HytI) M *kO?mfRtV &:wFR2VGL6za˴48S]e'''MJnfzBesc.7)$]c@q+)/sBcE&B.>}jX@{KtV.v}${P7mTeK=>iOb0Ib21"1M;0bI<:7tg9%f.Ht[ lz+G3iv_Y = ݔq3EKe f]Z4}F6+5Gh7L VNr+*PZŸ4ҦC8u}}y4+3кx9.p9s>ǩ>۔2wN'(tw |cꂝI$eW5.0)<ۅ"mxҵ &6 N*Q i>+ù;8 X)|8j~I9)É>%w|TwﲿU ǖ! &jHЅ/`^wعbԇHxpWu@gw7U5շ\\"F +-8ku >;o3{|2~)h~?_G1dMj}gVVeiv0!<,/qNCLudSV6bb^d;fTrÐƌ䔀S=rS)A]Jat'@jY5v?YaY+S%cNҽ՞eW;Z?$,ZL<M3(2Ŕ[3ti5 [>3Jh2̝W\֫Q6ZRlA=G'[S. f"X+ʝ$@"_}$ gswVh7oUݶT`rZLBIi5b<1 BƳMCݴ%DT٬،4C|ޖsKuntd“مW#5,ݧ+o1D4pĔ:}i05j0ugMi8o50]n,gS z2޵?٬P?p XXϳ[&F\857Yw<)>gWBu4 gS,"8AV+BÊ);AŖ$|?ɽ+V%V~bCSE"^Ε/jQJ{ Թ>yXVUȭh;dtW?.$AKY?xɁŤVq^_~<7AV/=U"Jc3rB{7`B{p?CkGW7IsO gŋ {sM> `Sqf]sUE'ZxS o<`9jޏ1fޡPvySO\X4d{!"D]#MR6grh0A ɢvl( 8`Oe V}oJM}oDksKOQ2N1Wx]Rdg`\30@B@QMl/:oW1 endstream endobj 280 0 obj << /Length1 2263 /Length2 16515 /Length3 0 /Length 17861 /Filter /FlateDecode >> stream xڌt  7Vc{NvcNL4m76vƍ6{so{׬5*)(sfdebʫXXؙXX)),mP)5N ;EF`3XLdqXXXXl,,#rZ2 ;"(4&V^^n¶@GK#; 2:{/4-ܘl@hnh +]-Ę)jNUAfnF@`cis+ؙ`Ui9=a) !KLL@Fvv3K @QBݙ`dgojdicd ;p#2s2qwvbr+C̀,ng* 9;!#\ujmrL],\b́Nn^Vt7`˸=odp>^ {8d 8;}`ji 0[!&;ZtX `'=ll<\fi9quu /KDbd0qXYYmE?Qѕ3x \ ?ݧb-xb?bb< Go._yuqϾ<vWTϺM-]l/Wv6-;TQׂX@N#+ ၷ|47 ^Rdvqr<-#N+x MO0 V''Y/? , ^7+Yb0KAAd n_`V6U M?=A4 ??/g_ [M8Oc6M-@'#13Pld/%p)%Fl]e/>_`Apsgao$4ApV̬edW_7XR6Xf)r 3WXi_Y6X*fg GJ  /p)\py s>X&.d>t ./L:k )4h;]Qik6oGvinVH_NZB۟ Uf M=n$F bT~qj薡spAQ*wto,_YSޯEz.cV/Y7^#uf$øtG]ȝ~#G9f/^ԃOG u11K%r"ݫhq"usr6sOA>4 >3tdfTmɇX5MwܭN o6(W iN\}J~٩-U> =Ү2ZrN*`#> })o"M>ȖvBqWbV}JzK'=<z/MdA^o*!R7}2"vKudMHN?E|(:;d ʎG2C-f$>:\ORYd $o5컟a]J)%.2w21 #IR@y=B.Br"l@ ^27j$ڔ^t-z-gb~]w['1MP~~ SLe7>t|P/2³V'8*d#<&tt)AJϫb0:'Q:YWucfl-9㿸nwڶtZZ7Rc-GX/O~ب2p84 йxM~ɹyruHu<7ϐ@Gj(}="b֙F}ASv2PQg瞅bi4@c>jVK{|9[g'XS+$U޳w 㿲̂%n5Q;+:E;|$J}?I:

MZ0:s CL̊{=K|U6=@M\Z0E|=.<=Ga:]}!ߣmbGbJEۣ<3'8nұwn;X]łSH2V)Ҿћ\'sl㳪r}"t~' pd{CN-,Z1Fy܋ 3f"VH-bt?})y_A 0,bFwHcK!Dc7U!El><=w^bA_²0)DYV/ eko>;_B;DJjЊ+:[̇kb Neثrds*|s,tqëVzTc3t#t3bb-mB)$az9h!PC 4!nz!.x@Xp^UӊExaT~ok-M>P\$lF7LW_aޫ,rGwY'RW#1NCj:ʣ@_ר#92KDb~:蠍޼4IPQ<0)`*m ܚAmԾ @xi?5>ҼffJC[˜S}՟NR?\M>jo/8dW`; \'YxԓӗזJ3~ !i*G2GsJҍ[;f xAdѬk^k'%ȹ{"gfJ囵,`>8͐kޱ !&3V(0mkVWIٞ<ѾlHlxȃ݇NUkW2κU1Oĥ5BjѻͩwATKm#=m*x&T2yy9lt~$XxOgarnN 4D,.#T,5@$r:Pn*)k4OJ҃G~Ejd5upф}"sݐ3_U'|3#1& 5*h[Q]W-rΦt%|id7&aqܾXYg"}C1-+ʞjɉ ;%-\KBS:U^;3yт Jj6SHf9үɂd"Kb3N?!3 r/z!ģ <b5Mc˞=CvD5eN4p ];6,o חj$\\}vT>gr>k69( '=1c>7Si6Bc_v7(5Į+#c2C[=>X26'<֯m?"|(IbᏍMaցD6V+H[VdJ|_lim/XkG"V\j.S 5\P8V֯8.2`dH]slDx"STy&o?_C$7Т*DxNcƹ+Dg3=xyЮn1> >d3`TT-e 褷[\vh5?6B9sSAϓ!ǦI?}VUK.b~h+}c̶QG({$k"? \S&n^tY+FryZÿ@E(= d$c7V&7 S SBa*tA?5P6df[i09NʒZ ޑ&l G*4>=$ %m5U< ^LqCߖ wZ>VQy+@7W<'MQR}[D͊nX EڙHH`Rح9>%_VVOq*Pom4 ŤOVݲ.|FZFH !  .3WY.ƴA}R<a>Æ ~RuZxvWzZstޅ ]`,cѮZW^NďGz`oZ׳&ʶNaᎷ$?aIEhX@ӐIo*ڱL"GSP.<2lweŞa>Y35G-Pu–rS\R] r6"q, M٬VA^10v-vEB/D.Ʋ_!nɬcV q445g?QK_p;y' Zzƚ߃VKz#V@?LCfQy\sC5HRTGz$GM1VG:wBj㬉|2',?vDӪ]}IXڷ].6~ Ef[abeBW`~& A0'3DS}Jm}J(,VՒ)fY|{I?SE#xuBL _J6ڽD.zeq>wx起kX;c6]Dĩ5Â">so~v-ghNNC'Vi+^CM._rʟȾ*yx @Bl#Mϸ(wγ Si04~g~zo@!Vok7k'09/ Lg{{okt_U"1v(]wW n6Ύ >\Bd4l/kTrp'z5jHyx9'4eV+jwSg EWtOq4kr+K֙n/vq_NϊχipxoԸ*AYc3B*_3hCÂ4ْs3YOFsH+.b$9]lS'YVd/qP/V(N1R"J ꔔѢT7 %ѻ"3e8$*/OV݊e5R#.HڄJI"rCt% ! 1Ӟ4E̺T|*]yHz0[^nfԏ2rDH.He?wlӾCޏ2w|zK0Pj1rmX^] Q&/bTԫ?crW%2$vÑ2V>[uͬc:֤uVTGֈ!jWJ=)If ͗~}C%Յ <]::TNjr(9dϾw)>vӭ%848Az_N{)YnUj,mxvY$ bZD>/,d@MCe.󚠕8(vp.em50_J=û e:Y*Ry."qG7#,~wۑ')Eǘ%Xڸr)cѿToH{s|ȃn3kGRhڔuȠ CeVw" PO=#X =AtEmrtq6y!w"9XzҨn䷬.OCG8rIHvMk|\ 6 r]/kÃ8k̫,uEsE)8ݕ>*P9}Bq GDíUƇ#6^u?a%Oŕ)&*B0<ď=!+v}'w6A})lj[$`izl{VSS_tZZw wNp(nL,+Bϑ ?8X'Yj:2 |9u\8'HkDuെvr鄒urک)M|X`*kޫ-Vtm囃h>GE9}5JA,ԿO|[DT+?-$:Q^}]Db|'$DqT 9lɛ LI˯kMu%lOgkM8o yj ;p/ʂ*N0>4 rfp|@*N"d<ܶ8}f sࡧF햜NͲ9@Дbiu0#,;0LE5Y$֞=Aa<1cZؾup.$cb ZI Tﱄ W:/"_ ܓwq;n)P0a0^ .nH'4A {Rj!ْadݍ~4fcwg1BFǥ6թ(_+7LS[C x/|=e"U(ֆ> }!넽+<-xIJNFXX=,h؝I@Up2D|zM&%ƚAZ~QKy[=, $JnLHvc_4ޱ<#5];Cȇɰp}2ojZVn04})7tX9%!3[AH@tW Nˡ/2]^氣j-`¯q)IV;3-g6N-w@* mr=-1Z׎v;_UQ f:6( :P9Eoq*~J WKPz"FCc\󼥕8e~]y0 11 Qoop_)l@Q3q5վsL=ψ9?44p8 ?>hbUU&Z[ed願ȎAu;mǙfT0) E-P:UJ4[c 2*\tkc>AS2K#48(55d`ek ,|֬7{X%9}84#|U)Չ8̼jeԜ8(G>CrL+z"ٺƶIMXo?R2Tdy/7yPj@Lr|P]zO 1mqؠMaiqRvě)c^a 8}MVe2% 7zNu`Egr Q>:84yy9jm80YFZ^2gžᙞLPېxZw"t:47w8d}7ټ79z27D xSa4؄ 05M~y&.eA5[-D]c$ÖK:P͋°aohF7U v`Aܷħ_{JJ7U*NTgQ!crňĹ¡UO06-@W=MyV|3-Wbd S6,?"8_Ɏ+:۞"}s.~SE`iݷZd"M!_n#+Kc*Ц τ ^~NwQ3rYmVE(F8٥lkFTSeD|cunХ rI -S~nn F \M>h;BUc)zϛ#׼TMxKsRi氚_a"y[Z ^\Q HS6; 8o*Dl>BG6FU@v%\h9V#a-XI@Z'gi ~ NCve헸qIMŮL:S8#HфľFx0ʏ p[iɶRxt@}EǴ!L>~~b jxg30i|J42}%{ny%GC s8o&~F ("-K髢YJc(;Vr%{3xuuAgDUŠ_ahfֶb1S :"k-JbUT?k?FXWRAj,bj7-x.ӧؐ3S}Dr^@.;+C AqNCtK=fczoݶf Lh]oka3I(@JKG#놃!ĀjD'SuSbU"WNG ٌ:c%"K!MN$F3H,7dI N]C烹2R$I3òvVl8 Δb}`\z&)CMLNlSp Ζ~Tn| &`6_$aYڏ>[2U1;i} nućd"#LWLH]+F8i޶u}ht…02,Pm W}l$pz>G ѫL=R(R/Gߝ#aGB8,t6[FE ]Y݅B7B4J^M'`6Qq{'2}}3㢚a pl-G/,.)'q-rC0X̝ 8<[|'p[Qr0 ]~lj'G*vr+Eh8d#R[sѾ*ʠp+Ĕ瑾vJ3xBJ걿pHU6sߞK޿_ZP)ѻReXz"-ka[DtsWg֠EmvG~xb$qOvf8 QEqڙm-:Y ~b6&5#^r k[>a 'k%|]=p hGJQtfx2ok'̭H:=7s{nܧGۋlxMm:쇙 jEa)w( 3-4Q['"lx9QGM˂u]+ď:lPF>櫾XL.R$z ;Mw?\peNTCۃ6\ԪNvיd8tCio~zo9h6d!]]*7xc[pIQ=e3fQxbtcgANh_QX]9E@ LD~(}I  ɓ~ww~ѐi\}] MX@5<61M5Ÿ֗z65tKWi.؃""̼c"y?BgͭfWx9h=Ac>#`Z.;wumd1Ê.AN_!5b'ԓqF| B针^hsm| EI"ZsA"BI< ƍF̍=7GpEȤ~_mSL"UGάdF :ȝ*I֠76#I*²*]DUEf-;O ?︹GAcjw; }1ػv+Oqua#Yö61n u\qIJE[\A: " MBHnÀ :'d{Wz.jso +TjAWT e3dI'Ux_ uk:k>]H⤜|$DVzQpS|ݰYK.n1G|f@] *uZp7DgWFDjX 7'G%|vJ=sx0,la J)0Q^X RO !ާMQ詵JYy;L64vwwFbrm}O6q07kpA@+v] c>rp)Ok6H[ALYHӰ!, qY|uΣ=PCІ{0j*nqmMfQ a$(b e gJ>~}͝\wiC\$Тg}>g#E䪫0{Y 0@ayf._iVkNFFj/c+\\ghΛ~IxNKMЮ^p L~C0 u6w*amdѱ5Y8q 0X%[ZBZ1,řC6k:V"*V.§Lu==nwVnc{,˻gd 3?L9Qhu8R"{_NҺ`ʻI=`C0͒#.&ׂD-ֈMFgbbz\/ZHA_>kRc^ޢF V pL{V5!F39mVw(Ӕd[nHPFVjO܈}\pXT[3oM2u[ˇ I<TO1CGc"}ꧮ 0x}p顭1ХCC=ZMPhHV;h~D]9|O Xa1kÌ<mm1$?29QB_go- { J;{2VB{/O( GzqOW-4Eo2 He ua/d81+F2Wū]*$).})DiCONx#>30AO7rckA% nˇ[ T`NϫoE1SA,DAQ-6;/3tA~d uRٵ 8[~B'L Z8֞*tdAmzύaPLsd2 F*(pw֥gM l&:1h$-G4T;Xh5h7߾ )sN=pq`!ZDeXq겲]i"AphFD5!OlHRR-VKĥb_o!*#*c-*Ԝ}L4K|fǎ\K2_4+?$@0iQ0 OO==DmԵ4Wg%%YHtdDz5Vw]p3.\#BrRJC? í8/LZ=P/utP:Nv"<-[f9(-B,-HQIaڱs夈 Xt< vLm쫚 N|z6{`nWO*L%<-]yMQn=[%ϘLa%Ym/)D cuEh_4.!xBzu i%0RO1`Yx{{gIEf5^[%P=! s%,;㐴1_O)Z֏ fu E/N=tp.|{ ldYM g4RZFE])QNh%w"ݶp1! 0X:I=͈nfPdsp>hb/K[}ZZZzXo}!=kߔP.OyYpQp6KbgHk[vdyi%, M*cj=YDi=:JX/I q]hP'i8f=Je̅z?.MPcR]oJ6W žR(Y6gB (諒 g7n$Y |Ʌ8/. -I]{ m$:dpAт}aK@|CЪoth{QKLSoS!8 ]Wn3`Z-ԛ*V{ݽK?`&S]lZ7M~Wlx$%f6gt;D ?to]vˎϹ[MNȖ:u7}Ffי/J?a! Lѩ_s*zR::R(JBf sPLλ;'#bfO6\e/Ekz*ِOH뾃dC6[b6^`2N!!! V ^:Q |Jh Vn䶄X/̏HY{ cٜ=ӵ~#ȱ({J*t7I]}uf]wSGt/^آ6n-h"ugۘkMZ75> stream xڌeTYSKpwV[p%%w2:w,*j?sT2;ܘؘYoX̬TTnv*M6.@7L dsqظxYY쬬|g06(2TN.֖VnL@kF`a jt63q(YALoͬn A+hlbb)Dv].@sJ&cF[Yzhivf@W9x+Pv:m#zllW kML,v@##dW&)QU :t5svrsev%˯0 %nꓰvfm=|c ks_;h8X;e%~,n.VVV^@/3+_IԽ)~A}:9:,@-&@;O ` v@$ZASbc !߿ @sf`fU֑`bb^_&vV; o  Uw f=7#hj`= (?kr˂L_&v؀F p_S-[4v_ h-D,AU hbffט-vv@GW_W t]3]'KJ:99v.n7+hعl4z5fG7 ԡ?rsXDF߈"X$~#>俈"X#voO7S@~#P>/(oʠ28,[O7@tE| K_9;? 7k;srN_bXY&W1AM#9]z5u11-s#{ {>"_*46Kbo_#b/bhgg͠ 77e')/;J7 >ۙA5+!Q@vt3-wף lsHv:aYAASb n1v6nߩ@@7z/9;G  wAs#1sr9]@O?LY;>LNNvtzbq/t276/G@ = d z2[ Y 6P=pXܬ\ 7O?@1O:(_/Bf. :C? u? A|.W+t$n=mAޡ@/⼣@M}X]('Gͫ;)'B3D'BŸiy*VBz<|b̰2 JHpS}Iqx_e*nt1F8b;+TW+<*|` @jEl>Ŭ0C !VnJ󉇿sC^$=cdrU/1R q?e <&ч#e[xXɜ&|:➕=+鲞3؁*Pĉ(_Њ< mk9ƿyKڑN24jćyKt[GA RӬC?2"B@*K˛1LfocHJ񶳵xn,xTV{G4L*N1$}9n $0B&M`j|[Ŭ  z?iO i`VܿM\tֻJ,Ax~|lAK|9M;4xbUM|֢3M2xT Y$N%2J34 &Ym~FҎP&&(4>a~hqh7浘8'¨Lw<2Qך"֮laҬ?_h }`Ku }44n,߆2sTDa}9!#YcuNnI$LdvSQ S Ʌ_r"=ƯKj Ȏ&7J9'ɺ0u3 m( "3]O,͚W5ƭA7%[l>Q=1ײ}--CwW L4kG4h\G:h-zbѱ2P⦰$.b_οQEʼ_ȶ\ -.5נ:ؙl 1mnI٧+v\.Ҩ8WL7,cV(.zPǢ0YOI TL΂d,ARi3Xݨ]N߀8t1_na:d 8׹ޮiTREMe!C|J7eCM؏ԅ4ZTUm3@8ȪL/[3~ ug&uMnXT{Fq*$ty|=vq#SyKV~V.%S'(=D!D`ׇ3w* $zݻg*Ek*K7W852T)|"&yylyS+r6YO`0գ9qUt{gIГ탞!2jf#EJ2Z'Bl؜HˆAeZ 'Yp4ESxї=%BꇭW5K(W/Kٛ,ѩb%F'{bʊ~WF~[jwP5n-_P$K"O]xS޵oʧ Lѭ\vaHķ>G7TxIYC:K뛺CɍfB4mA$E) 1 qZ9 O&P ޒ'uL 1s4@\@=k;C7^h6&h2dѻ>! CxE`=ᨗ k3iŇ6UIDt9Xi2%O*YU1s/̭ꡳEV82o>,j)!fN$dAHd+;F6}#iT%:;;`s!ԱK[dR~@Q_;3iҐ/:tLkS,-]Jrv?@w`FP3 ޔ "ׇ`H/Ǒ:<^!J Qԏ5ͦnZ+NM!0w!HE|ui#o4FdGgf2 HNN:\f&?wy.9Zlh^{XaPS!V%n~nw)ӗ)E]0#Tz(਒v(M>v}~"̄#(V5dEbseV|hX#kCCd>72kg∯dq&:|}B;{+Q; xgZEN|~ML J:l*v(V.^k澇f2I,L*KҠZ:0kmx'g,⦻ҥw_“~_6q>B* Հ&6ʕ?EFfF{?6ФVVSx|`W=_QAmtDxoq2@We,㾾mnX͢?[mLK$W/Ay|F=F4[I7M˶0 Dubb<:$9 fI}tvtT.`+7lރH-7 yjg1ZSr|= D換/s= ?Z#W_ l̕p :&|DeԌ (ʜS1 ]{4ԖB j`<7עC\%iE,ꨚ+ qe{5F\r H%g%\Z:NX|V(5@Z~vHP;=s.3}P/qD(E xwњc5nFƤRIg6lf2Q(OsZG}R\>h2`i'JPe L6+_% ld1fܑ J4I2FL|La#-.#{O~I[U֫vrrC)ov50o'OEVΤlT݄!d23""hT ;4q2oqdwjz|~ 泥GCdD*TA铽qq7h|0(s-u3~|;YpH τvrraqUHRl%z7} 뛨^02Ą釸޼% %N^t)p-9pxV'mbw~\mķJޖDvԿN $Ajz"V$qh'kwD.UEJXyCe85xSYc,vY;&\+>O)/L8 LBq*6o{."{+%dbjs|k ڥBB.7˃Ȟ`/->`qq# t? ͭ"_FM8chPMǷ4xWvQԃ&<'ʥ)HHe]!["'C{Ԝq3֚D#%~)ʄwPSGl8DۥY4븏-{ædU#d_̌˩}迄y˧2eMlnozQUo}-aӡ'%f^u|9:+|LG6E9*o&dqEӈwnTZ LsJnTŏuJ#cϵ޸jYRXlksɜ &8"Oi=Jy6 [ զ5.E]z1|^ş|mz+40 eC*64e1-@ԛQ VcV7eQ< ~cn0x !7({yw%t%O蕻fݹ6;!2ڈ̤Ŭ.bd2.QU8E\PlܳE7Fm=Cķ>x ub':_ ! M::_޿7-){j M^NtR(v~rooCRmfSLpSґ@\3d\t@U4^%Pzea%eC|";;EtEݬfCrQͤEE} Q Ԃk0%0<\D%zlȾzNYwn@Nhegg9 8^=w͈*GX]{C{~/,9r ๰y.#(/ILkˈqK9hs*Ł>2( ~tSMp GkACťUHFcz$oޫ B  aPK[4BsKb).ÔsDfv"_ꋴ>j ǔM)&G 9 #L8<$.^N~IL{٩ŁԽZqG>R }rKIe/I,C'Y:)acO*G|z ntO[?Z[sbwdž5)`Zi~'G|:~V<#9rt&pO')dyJ'5[e=YPewv B˧ѻ#s%caDd +=$ s.*ҷSY'K=bƔF|yZ_ֺKJ0`Qvh{l:YR.ڣ2I!9=BW"Wxs f@G l{[;QXK ֕oc鱁_ֳ%B.W_VF0UnFF*3nsxE(&,Wt* ~d(o'Ҩ$;&?+Xb+ƿU̼kNG%q,xK6{^^ܪT1uwY*ٵ6MT6x7C {)dC4LoXGEQ{N =C,]]"zJc~iߕY( -#~e}79u~o8 $>kfv2Wd^PɌ`(b#"yox}^*mG7 N)"n-{``fCr hN€G-JJ+lج| K7uU\n^)]1ZF`^4RT =7fj'e 1"X_F^%١/r6K$STm?hQE%|%z̾գ'⭥ϻ}ǔ荣0;{!`LN[f $nʑ%Fd{YJhZHyP Dթ.=gk$GZi^j߆Yz ]l& col̯-X:Nޑ:C]Mva"`O%s <])zֲ Sx DԈ P%D$joq v\ 3~mlgi G$.L,,FmK7~t px h'@z:1èށ꓁t fl!ؖӴM/ 6XgVHl5;achmPQԃv` F%~/V{I)ۮcq҂L* :ZLaD ,ۀ-`d~*ǩ;w5M^k:UjG:z524b ZI򞢧8SŽ";?6Xj9?8v}>*b{NP)*‘>TϥPi_4ZK7v !NiM퓒^R-vܷ~,#`h$w(QԾs*\d\dKR_({S"fV$1k)oŷ1:zVk壥kSN2#`&d /ǸEμ`\#W NdRBQ]z&K\ElknoIl1(lT,h1.6%Ah5+_*+ÔQۦ~0?tt (pd1 ZB*ǶTB #GU_ '?*>ݜI#-|#iZ8?Ki11A "صFLEُfHKn#"D(׌)K:{e'<1kjv)O9|M]Mߍo rj9{ xg-WLc*8/fg0El4ot4pKm 6j[J!_:<&GBkxWU7JՕ.N oОF`hƻ-".K׹toB)OxWayG (brl'x6:\<&-?c7M5˜>A~F1Z'N*oDH'#* W\5@MvI_&ԔSGe9WL~P6ë&x?l[ {o42ܣ {@#>O;3.sjv;$l߫6umLt=)u}Kasc{?؊Uķ]u;5iF [ ҸayNs5c|;F*t 6u LjIFlfKxX7atyjLfM*#o&\ꛧ+4 ?MP 7ww/x#Cq{)U/i?X3t4yHnQ9^j.B[t!#2z)2}u{Q6#oIIKrT>̅uqPhs*~M{T2Ϧ7?Q"r'6"}J21I##!W\t ѳ!l1KXml#su 58{魸-YíWg9 qEk#3ڴ,Kv>MaCyʟ+3iiWM-G|Uqjh辞gNis,M_F2D.(uFz=-5aBO*~4C[X' ׹} ͼ5 XECM+Y!Nȑ*\M ,@e .Wԕ9Rk޻=:< ?—3J]t̑#R?#\QZW*ԡ||%s#'1q2*FW N1(4s+0@{TCԢnRG2g`aGK{˕Išj'n$[\֖p[XLxf^hݫ3./NYa+W{ [{ZEP{ER1Şr?s:`B*\nO Jd )l_@ = X\In;b Bx6.]jrOİ^">0v r+8f'm*+N*(Qq{eN,J$*x3$@}r&W# dBrfCi2EX֎ ^B #`0Sx~ Зʶ' wэmZ7›<n 16rԸ0TIW"3 ^T}ƛY7\]U>+W=V%p/_@ĠD֒BoI>9){jY #G|S=-LUjw/`mo[sP^/!!nY+.?sQ +J / vwb\ǬČM  $& \uA\t~]5f3ł︡ ! 9scp_? 7J#o/f GM4IKkTޫpz?bbJj&|\,IMyFZ|(OVYpҽڥ[C qT2Vf |T%QC.b~qP I,'{bo3H4ҩJ4.F11FQ1 M2L[%Q1bB^e *敱c<ӅO2Gh2Ŭ܊i]-Ts& ^ UhO16y \b}#i3K\,,AIHfZa愔@EVr{@^l5' A ,xw1fK,;H֫;8 rR)ybP}UmHL.[ EZ9Roiu͜ɹNQ;ޱT[_#|AtTg}ZV['0;&9.8of^fKgݝ1`N7iQ~ LDbf3ONQC;\*jO@|n}ų yqT\($3<򙄇0>HVxKޙŌ>HAVI4G_op _%f J9YyȌ /TU~ O F`pǨ\;b:mXrE;FƆc6-lԍ<;Ccm&*پwӜÓa+N-lMI׻B%|4 n46xuK J]l؍iq6c!5+gu$Y>wpÌzQ>m\<Hn!K [\j)'c-6=/ /w KI첰܇ֵ܁k0G{ wIXkO:a.Q1*C^mυ(̍6p3 vaUM6KvoTYghؓ(]#΅㿛n FBt!'i816#|f~`lab.UgQ\x}\d:WOt]Mwk{ڋas.MҊ/cO3ͧ.e $$q`sAĵ`R[/e Y& 3i9ʆZ=:E^UaD;4y8CFB26z̳Azc Gm&@F4wK9+`k?G5Tߒpg*:A Wj:Z,IJ3&kԜx=od\0BIXl /~v Ovo'FAuR j@|!)"*&4:)vm\p;/^3hrhuLJMe.^"+_GAj8VQye$5Лz,\icM=٭QV DެP9/Vi7-6_B 4/QS~PO~?c}f_u]\˕h$yҋd}@s=n.Ci!QJTyoxXnt<Q>OQǸsFʹ|-؏<1 H%WjuFdp=Af/<(Dܯ:4 慎ʚ/LI{ЋEKWKNw<>A ~ zM!B,s6G+^ߎp7).c+RE2dtDa7LU UԆGt.mkCĥ7t;VXK2^,<[\iFlȾkKH^/P+7v2>{0I Ԓf)b 4w\@&=[Wpc ūFP05~qN~ve7S5$<`Vw%o0#g8ˁlS}ڎee'RuSlcWcJa>t^oٲcUzkW3KICEE/` w]z\ ,4m+^@iT$qkouç.s4}Q ]wПB*i8HOP?M ܖh~V6̖Q?(Ƨgp{j9 ol]q *>.ܲtK7'ChClߛ1W{ݤjrF-5L S߻(v)՗+_dj/ZAbV18r9SQ RyS'$͌>iC^FYKK!ΎvM|A3KC@]bWщuPg(޻q"X0~'G$+MvyS$G.h<8W}$ţ&FH*t^3WLh)ۊ &V7)1 ggO>OT_YFxMF+&@;쥿΄ںD>{LJ>+@Fm3v3qy;WB;f!0<~`Ԇ`B-yчͤ%߳tm楨}i`h )ѾhφnrY[ ʉ zfMk(E~Xԕ~͏jVTzx$鼯˨*5nHٳ (]_!deOS:2 &EDsgXLA~pb8BD=IF e:m7Vw 4y\,#]<5=o;?SvjDŽ=(N8dvvӻ Q{2 t }cܝ3 Qo܋X#_h6!cBRo\&zl`c:az,:T7[瑌ek%jv1-!@+73 AW;eNrgE#84QIDhWpB eNɩU[H!񒭮৔T'еea8>U9J:~ st˛5U~z_#lczƐ 3+tpT\Onf<@M|U"2KѸ}z{3UCWoS֑ZnUgj-|e:Ca)ok E޾k*P" buE V.Bq tp3~*B3C<^47.s z<2\i`P(ORg*.7VBيnhBiG$Q X9:P'm}bF!̏Erxa(i~AV&E-*вChe8>s2 aV`ʋPue?uGveŊxqOeX`WY 3SվN <&D>DŽ-,NB˯}Be캎TId ;zwlCֈuݳ[VZzSnWHZ')%o>fVfɠҥjWțFf{UyxN#B?}&;vZ厠PB7(Tp~'iͬ! 삧BKP@Z)q^K#Me\:*6tw-u,M5;l<,~uBԹ}MVIu5q[1r5̆Ԝav=7,wvY?n. FZl-;'hs#gTTQz͔v/D0,wipWɖA1Y0 Ad=xZuՙ(Ķ >UbKv+fKItz~7c$)0dyM$x?Dc Ɂ/27"l\(Mb5߂QOf2)K$y&s\?W6F k^ zvRC nnx :~cV/&~lNs=xQM]׈= G4;b = gDc)/qP#g`<7IK3b?YSu6!٣Ҙ>k/+W] jЦz݂$zǭ ba:pLhO~|NJ,}B]S#eQ#kT]x.%pU"5^V{xLbFl77xǓPY~vopOZ{$V4+>|A7GKK\59teFqsp|0FAy }9O 9oJ_}*xXhBTُ2t%!c7=:MͶ(fTa2ዤЖRXl[T)tTqt)-xɗ87혮jx~sw!&zS#'%xW-Mc|gӃ]/"(!w=z,.R/U3SSkaIM=_KD}Hil8w̛u" xwJvzg D+|ȶvG)WsjBeQ;[S)U|8&Aݬv_׽Sq@[*>U*mϓpxȚQ %g| zDVOVJd tX^qٔ%QGEa`x !'I]|T4/\ VD4:@+m>Hs(q4C=ʛ{Lb#{|Qhm`)KΎ{tV2|U ~_훿 d3kK5]@t—x8c:T) endstream endobj 284 0 obj << /Length1 1370 /Length2 5960 /Length3 0 /Length 6892 /Filter /FlateDecode >> stream xڍwT6R HK7 tw03 ] !-4()%!ݍ}[us]ZD%m(aH.^n @ ~nItma҇!p d `Ma @$7&ȁ=67 A8Lpo7=ߏ5+**;vA0@ 8V;:pk(H'7 wd؀R AC$w񃝡NuGފ@ ~+C )W buwo|+iӿ E(@ 6P_|ˮKiNPDz\ nex@ܒ rYm~ɌOPq@\|yohMcGކp7_w*h2#ۭ~_mͿϿ xAq&ա-gUT\˟0[z"_s}U?q)'Hќ, b92 KVA,qvAhlvS&hQ[$L\ wV\"VE7g脀. +ݺmDǸhdJGfꮫ5w*Cqd۷ޞ|Jp" be(H2(2'c](1G[iuiexE}gmF_CE)"W`|d}hF/jN~0(.5IҪSPbE,f촗oC!vv5!}Yw_,a!o.oqهW؁G[U,JLقdOhBS+B>1| 3^iAK c݇'EB/=${&Q%:(wDq"F4g]L21~by*WH 4:t8|-0B ja)-9'Vuj:0 @{<=- mE ݖJ6rJeCޖ7FcsC;۫MAU-gi@1 ELCӳВe # '%EIP?I{pC2bo7j9>B ]MbeFtsWc ?mO9uJКoD^):4$Fչݣ 9x)&UTǾi1 טmJrHƑH)z!%_B 2~Xrz]Z^|.̣8*oX!YI:4DF:ɢ85鵣v]E+ %r$s۱s(e3C$vol6 Gkч AI9*4Gv;?+$GvoK-$Y-^ayr+!@Yg)ǡ%,gAt\ZM~™ԴzgvQI0l72ʎ_9 LQ`gYS7޴Fwt~n0#7W&DX%/KRTH#P71v,3V\hj$\ۺd`8 XdM:$w*@^EWk'銳#], jL|1܋3iwcݹ7^݈n/Hn>}0Xy'A `?->P*t.WtPD:xX-dL.Z{|J Dr^x@ݻ@Pg ]h9sēSIa/ Id?A9[IP >=~fMk0#(3uVHw BGfo`3ZHڼ)͝۝R*c9kG{?LFOokw-qaKP_з fVd=џoK#3df½̭ eԜC ۂ.pjRUpY˻LXkP~+h;+ӱð<wE&\ǫ8{X͍pNX]ꛃW .s Ke6@FqO 5YH aQCs;N)v x8aN˕SdCЭuop,a2jL@GR+=_v7e2t=3h18P .Q̛dݲ:#cAN([ߦVV=>EN]ZyZL.dk*ƭٗ d:ep9xBr;֋p3V? O&-& |ga0$_/cY##Loz#< a~ɠ?IUD|GֱrwE "Y[7@f|,Lz2͜ߪP dΞ^hBOhggs$t8@6\AubTWj<,Ue_޴ͻ#p_ɂjͥ־3N*C&F:9Տދ:D-XW`/q.R.+DWzJR̾i}.zv:~P/F !-rMN *,P~ ߞ jV_ Yçb4%7h|}Z^O/=+ʊ٫O9XӕnegM^Э2KYTruÛ`T;e U"o6o)cSh4&l&"7%"a wã:mL*yloIkew͚XU@fù))o,].` gmc;uM) _0v! KҜ%G Z\ݯ7GJL|pu+!y]>KR,IyCUrUMӐm3[˲cV-CRJ V>Ԋ Dy>mtU >CH:\wX}s-#5{(^c+)RE;}two$P$$Zڶ膔E0Zq? 2⦓L8uRI1mg21oL)˴R|îrC+`2?,KDIlK-9.hq,ܩ}fjs˨{sS<*{۟:#AZ؏DrZ+nt$% 0Pe+4M+?qbdJѦhi#IXԹ> &CP8vI!Cu3\CVݷ.У&%B]ϓ'>‚^ &sFt':z\͵srKO̺o(J|m=I!Jt.e6 n"V'Gq*OR{8O`̚AYrVD0EW1lL'KVT,IJDlεQNx3etr 8z ;I9kyW++mC\+iy63b6 = ]졯{xlPǽ l+Kz|,G^c ԟ2.j8$hF$\8! d)/de[ o r! mp Ű\2PfŸ4,*8F|Y_WmdL|;+fVll]Wcb$*F/jdZ%̄j,*eHFoTl֙.6ƃ<@;zB~tPV A>/zMY@i.[>wW/ҳ+QȾ: 3𨟿$r bj`Dz0Tq_~0=T$r ޳7 }?@Li eb % :{&22JG{j:&_Q:>/` 5uP]̰q>`}ì֊*Hm#PjV;?M2/&~N6fXHJctFCMʻ,n(ZRD^H3_hI(NY3sa^=nq0FphOLZIL&5Rpv]3S+7a/~Mg%S?Q]);"J^(SJȺT0V HH}<ϗ4Mg@Z/:.{,n5ܘU ?4\0Pb{2# G::6 >[dbAN;zv#&]zU>ص> '^ HDJ~F`7 Ҫ!gC?ʏ׺B7ǭFLZ Go`2*NZ[*&O4J_3֢pؖp]cF+ ajƼcuXameđMAl]5v]2I?T6WTa!+kY7lH "|~1-fv֫̀.b9(&#> stream xڍwX>!C 0J;G+1ƀQ҈ Ғ]M8q<{:|E'o h>A~$PQ VA a~HnG;v؍a(w8!E ؔ h Rjx8%$A $*A<@m~s+"]}Pp{4_@N(PPBBw8PC!6sTB`$C+*) qqGex^pCyl@\``:vh/ Pば@PNgDp`tq |{UG{y/ xB w>ݡ(+ڝkH_i0UDhw(>{iGUw+ ˜ah(D܀0o>N_fHWf?Ce ecmECf۫IDA@APLTDzG: _Fճ4S$\Ab rCG Qs?Sw鿲dT<8D? OhA jC0[{$Z aazp4a78g8tz`B@adu113č\a%3Tc$+0IڰHl$~e-c^( U444fhQ3Ho-kl: Epd/>Y~Ϊ)p H*!1E{7 M,$rxEvf:*ŃM۶wc/ _sąΒ|5S5Kmu~ƌ=t` M͉4D zTs8a.GÄO!tHxd)B3gNOkJijH'&lF 嫡 /ҙ-X-?@@ 0$ ~LJˀ_XN)\JB훗,ݥy%Zb`6 _K T@%׳YFFf^9a?Es4RrJ]|0,~gyDpL XmgvW5jQ:&^QPO鄲wmN~ԧ),xϤˬ>JۨGZMTxطWEŢ7kh"Ljp_=xxI Ȫ]&e.~@ieI^8MƔ&LK>a+SIiheGO蛐jAvMOM1Q7aͬr8#o 58)b²83[] b$ʶ y9u}iy]3Pa)$JeXطqwdP'[M2/+KB)L^P",euPZO^煩OwayzIvb`oq_uߨOZ$($eJyj8%3pQXc6~v ټEh6 &ZsE)5_LG}*4>/Z 7Zdpuze1Mُw'oUn>).ZEв,%m=I@Hϊ7 Yd(O(w QOMO[Ac]7=|}<(dDSP7WUJ1@h7]$zT#wiT/Mpj޶oy#wTDiT$?L 󢂚y]a=2;ѧJԍU9Օ+L[@by g1V@#Ƀ2S%Jo,YgڭRrjvLE(aKL]7=[Fl.D4qÉ!P2QvMVg ~2yl=W=CH¸KkT`Z*akguDibA̋F-_83XXNHo6߭Y|Wdi.⑒RDcQ*PkIDU6 z5Sij.zjji_s~{qg~*qaA\>msy㵠 0ᚄķecl8ʃW(U2,8>XK'1~8sȸCRE꣠Wc @O"1Ss1jc5a R O+捖I +.m21)J}u{]4+fKnp}6(aNE,w2FSNvׂ/srX9Uf_hn0]|;qQ=]9}{]ijA5ys-́k0q93ȝ穂,A/8<³VdĴ2`5~-ާJ?X>dP$D q+M--LhY2)H- :W[9b Ӓ {\l~:sd~+£O^AuHAF#y=$ fzs2lWQo64.=Un&3GoUh, V.۷]dxmed4iO<ܩAMz+^^ |Ѫ4W7eu1;<2<&݌9|şp 3U{Vⷌ'RxIkxfZ<56=I!*k }84'=UcX"L<"-n Y[#3ɗz3' hAɳn$/k4eΪ6.IgE@ԺTKš~~8 0E-2X?Nyw[hea%3ntpոΏm\PE)kwlxWMEэPE9SBq+'F 'T}ȳdH.kq^Ys vByÌ6%qd>imܵBؽίVRG ,4w(Kd1$Tv|#cpR7',d,r 'gLO4\xžLyZʩIe  nGb&j!.z}ƛU(,h_--$0fDfocfaY)kMQ>JһOAɚ:/&iTGdSUn (6HVi>EkD {$UpYLgӄMȥ^;cc:ptA؍Kw/dݲ4C*Y͓ 󪓱TFz3 V26m*c0O➒@R'OH1} EVv_>n!,bUm͠0!ҾSksKSiRۀ/f dо5EFh@m7;ŰݼB_fIOAZ#|̈fY|$J<ߙa`6HV$els|2|g)mvMVˋ 2(ARIǟ ^*epm.;dB?_X^?㪍 QЦϹfJm ` FДM#On>ۢs?8Rng/'WI/I cv7;?7 /ް8F$Yn=Ͳ)="14\xt}ON~)?Sm&ueyR ̍R !\W4jZ97_IEN[ J~ -i|onQLYgCI|ѳBcŸ7X)9;VthvUfnUohMGUe5#/WmOr2 㟅h $i 'x;!ZK.l(ΰL\wNWi6ξ[!GS<ѐdG|E,[%Q:;GxjK]tх'w}6RY?/Rx~8Ǣ9JAdfv,ٽk@*'k40  * &o6EjLٶ#1hZabjc/ 7T3v5}L̅BR x2`0RPv%$,cםk[BRN Eh|YB@[xBHH{]yl.w2*mz\Kþ&ϭE? =eBUPz9u;D'm:/o-gbZ-8rۨbb?M<_ƖJ?Zg >:D尢hS`GbDMAb&*K˓4TKt*]]dXф5nߧ"R:ZZXDCZܔk}fkWJڼ1_ʎi=S$AJK7 /OoP'np◛z!_ukzÁ7_! Տ,Y,̈́!o(fytwt O_2Q } . -JY 5KfQ&Lwa!qe$.hlb7v٦';IjYàw)?$e3)vNKVw{RӗfS[OB-F&'_2?o472p8*r K:ؖ0G`2%itq` F:qE}N!~oZ,umо낵 {S׾ $H@dr"fK2HNWS SHEUKJ鿀f}urDv:V9 rny.[gD]| endstream endobj 288 0 obj << /Length1 1819 /Length2 13144 /Length3 0 /Length 14282 /Filter /FlateDecode >> stream xڍPҀ n! 00 =;ww zr{*x^{*bv@i;['fv6~;Zd ZBh&4rz3T;[9yll|1sHLJ,y;[ Zdn?:z;ӟ1#ddyhbd P3'=?++ \ r@G)F6[cAhX)̜\75h ~sq5:޲쁶+ep, @:ٺlf k "C#kݛҍblwAGc5:O4y;wwֿ/?d55 Sg{֏ g6o"d@'7//X@[ޞv6 3$O   ` 2qAHDw>;폟~M?^1G%iq%eƿ[R\ `fspx>7:+gkfܷsO. BXvo 3ll&o?.(+vSOd:;m._S-_49_6ٚM43; _rX4U9X55?o [ toKfbFOm7`hvo dJS۟ `eszs 0sDbsXE<V*XK<\VO`U8%7ݧzg3/q6Bv+_`5 пo% j/rۃśoY *v_o[j/|__/|`u-뿚|K'D8;:=۸|@7 ¬@eu`]+jEֶ˞%gnļXn:Gk6WJ?Bm /,#3ǮB{'CN[SsF+)z|&A2Sxcx^^NVr*69*w)ܛ}%LCT{Co] cZGE(2]^lGɩ7C&CKP#}w3`h,M[UZ*-$3(=qXSKjp"N_14]~9>a8 bo}o9gm?T1]=_3Ɉ (7y䑵i+ꄰ!nGk8@&g+,EZ! |>yCԓ&uaRRsd6ܴE2X#JTu zMK8J~ zj,6{ҌEYy7;MJٱ Oic޾F`d⚏EY85۩bd:cH-@,v]VQOO .͈] F*:4/ۓhyϥn$J|`~j+qbG1VYѓd뗓~Pz=_9o uèmǵph&WMs̴*[J`99Ȯ/3a5Ѡ&}>\ס$>Xke(jcF)&,N_5yx-()S5óP`% I3=s,y+xv]$=I)euԛuᣄ[zꥺ݃~cZKsC8WH02k, jߜX<5oIy=i2Rᜪ%k]7P"O ӝ"&CU|E435{nhu? GJk DhKmC.x?#׎{:_4P>moD.B(`]7 Xo07eGһDZ b#L~7W?? E^~y bŖX3uL$ҧ {\)q+)XzB% ʹHIHLs 55y, ѾIY,~$%i%?5GZ; Cq<\%#T/}(TQ?|n&Nw B|tx<0Vx7`ǪgN{"AzkЭ@c VKDdx4'Oj |6̓iM`ꜱWKa.U֜g_NL+yb;jƱ$c֨ܣ|͎ph/rΏj{RW*WZ=zrK5c^R齭l4.A\ \[m%}\of 2kjPt uxOZγ <|쀖.!!8Ism!߃ 0?lePD,<Ka*V8fgQӫQ.Xg#9Ms@Re C')4LJ~)/Ɖ?`*L4}׬Z 7Ȫ9cZQ" [qEH w~L"wm!v]mT f҂$1@ϫhU1+CdUh)HUla^x4_ se'r_;TE'#jO~CDzB9mibJzf3ڻ"nz3ۏ_r&:4Db RFYpPaXj]G@FAe/Q̆BDf+HR2!49g);ibs)N0_IZ4r_2:Tٻw8G@;&$!V$,w'ֿ+н01cQkXKShS8T7lou{$s7"iAܐa2 Th5b2Z~AI][w-b?2 T8'zFvAzyԉuyIw={-Z`N$-n!R?/k}}Ҍ6 x 8NN jЊdYGE\;0#*6=a@e|CjŎl D,[-Ƽ=9)L*οa)رF{b^+|Ĕ[h*mvQ Ãh-Np J jE%;v2=,|A@;MAb!+h)ΘF2ṹ@kň8'txĪZeh/dSHh7 2%%m:62 tpmi#&)C + Ð?s#tqd3al{ۭ^ömr@M};H]dă_np fkKsz8??ki5NҮʯ22ҡ{1Zpz"j(4n([ڭ<-l-;~ѿ{:FHȤ;5ؘW7-a S?:vG}Ύ5<5j>vNQuQ~zh]c;tBZ n|mmKnZ(kayy-YCks\BΧGk ,&AJgMoL{="~GTP'AgWkQ;?lֶً*E%B3P7^ #FN=gk)f oO%ׄ"U琠?w`F]H-}SJUIXjf/ob >Bfw&zţh2QiOaZ,}Z{m)pfXaBʤƉg^W{gEH }>= 1}>t:lw>a#1^^Ct<ʒl(b."" Yk3P[MV`!k\H(AnVjϳɢa9xJ4VGS\8I8k z7FDMCIK6 ϩBK #9[#| [Ry/,fk:H==$$Zr[UjkFX$,RY4рS`kWhE^{E<0>7JQ]KZh>r58??m^g\> Ո}O]QQ=TPv iC3P@)kuJ4*:7_w V.̾0)PjȲ+@I * u XpeϨe| P(6 gc~Mbqh4JԞEh\3]>uz1 a~/"x&^áէ6Sh ŻqVm@нtI!$Pl<0݈]1 AΜkI=~OjZ'OAR{ɇYx?iy*b/4_ ~Ͷv?Q7r9Er`vhKoTt[3LeE퇑GU`.eYs-S>Z p}>>Tبqۃp?p 2YNd${lkgE{ D dBsH_< k:R/qFrwBgi0"?:Ek$nbuz MVW-WqܫG[>^F9nW=YVȮ# :aθ.҂WVz# U~Pq3+(51I&9f؟g֗4܎jiZ-G 0-S,upS@h-gmdJy3B#e|iKŢ&:* . ;Hz煤 \_<(Gv}$͉GAEVNF3~DmaX .Z'F_ zI6sMTsYvjA333̶Cl˔ūGZ!ń">9Hi0#_%8\Y"9^qFJrkyH]} Žqbn*գx`,ީTDFL&uqwq5HTт% ߽] ZqiQI{٬:VNmY,|ݪdfuh_o _GLz)e;/~JȦqJ6!E{Y"B?)&;u(fҳ,+q: ";Om'TBW|{Iɂ8FV^;s:f+@h>M;rKurVpkAZY+IȠ4xO^rq:sW^b3_n ;}"V创:\KekCMw0}Zj0W/RYhAfhuf+7_a22ÜqODj'៬b(qR IpئG^cބz.!3TmX N6WT-M⵻)@9fgiQE/\⊖oyK]EhYur_^سavk5aF= 68Fyy:h8NioR Y}}2! X,)T5uɛ^( O􋼕91u~XpUuhK'F]:dHHG@; SditLU8A$_c;+? I'2}6I;U!suy 0t9GIfgZ2+]]5wŤح.F]«gV[@,jvCv@yDO&abOdLŃ$|nk(A=+RSeq{L>F _ąW;{1pZAN}lD. ,V)bEoupҢŘX&?f'~-[Zè]N=W,6*0|8'G;XoH2^eV\ẘ{ NH I+lB{X$fa柠nq&EonPowraX.HfM..4m*;^EF NGӹ;0{m\:+z Vj *d?4d8Ƈ]! IZ]tTVFjNy}N-3HOVepsUrϛPB(? v?#<m=þ\5zNl|!sGTjPw{f;r#H=L>˗ϦzB+"y ;C* i5%q h~`k%}RUe]kf+`DN;6鴗t}Ix~OՃA N s7BWj&@82Sys(+o8.IQd&nysrX:* Zy7*S|T}zsZtEDG"bccM>"o:q5[Mc;wXm!b6- GLNbŭ}<"IkB#xwh'-HVh=e`()t=I` ҞHT5T=|! #`\V ;{ݐ:(csqi"&/pe\B6>׍kr\ߑ ~!{0CG!ãcR8o>65'z/;,Yd//`ՋyB:ٓdA3]SDϼpIw1z0 ˯7ry!nŁnssvZ_|LMsSSaYY̤+ l߉fv=5njvdO yN ?sݧkz&XmFN|hڂ:f٢lb?Z~$bϯu&5*ܞ&vk|N)s[EQ̫l{ %l%TH*T;i]rx:hb3AanQPv76̘ȉ;bE´/#eȳu8⓫9ph 0zY;]U{傯%}khiž#fChgk<6-e, 4~K9ez}j+aZ|QA$C Soz>+\hMĂ3Fvy=VV٥B\v{=xrX\7Zm>:`F~x-Wy ev*_/x=v&s 7T𫹕pHkУKD\{}`dN-Ɠ0W6/͢\v?h?7.U'͖@sy b+zTdnL6> *R3i p>z?_ӫsR~6"ZOWsDMK٤PVF ? I%SNI'­v/w`Lm2ؓ2&>`J4 W1u;3bbxh:fw߀jǮQA ʐ!xEo ˛Jm{$Or.,5(ΏvjpS˗O1va0J<1!@[(#/:F'ܤqzBUIahGAJj'r1~SU5t0ijP3ny{sAFl5ݖ@+0( s2R?)T~s^ F=_ Nk?Cܜ%6;u-ikV'w~YoHi/E("X !'^' P27T:)Q }=lL ǔfY;cZk #HEλ6O.Y^;/q-TzdQEr{a?+ G^6>I*Z#JHB"QR H7]k'!|q̆p9[>3f>W;L6ϦZDcScd841 *mҫ4APJ9H}4pJURK2.4Rg74XM2PWn=9i,3CL܊r'iMV`bjMPC-;yHeit&n0S$B.Dcnrs=B;\ ]v&4=mcVڕ4 O&K~k_㑟G4Hb³䧼 $[Rrjn5~.sa7/voV8l"mJ#=~./5~ٳ0)9Ϭ)`?k#QT@UB~(=zNn)]Lj~vDIǬG]4)Bnrqgê美ƣ{r5;e ,ՕTy|穑zb!ՔFsLGl(H@J4ʎhXAx:W#l1"c:f,Q[bOhAQ63S[E튎!P5kVr(;)X#BAbbBj&.lo%tDcܱ!k@$qꨌ곿Rc+\ԜNHXܗU0w@ - h0~qW3ONoGcK.+2 ~o6(clIFO{F=gM|4]L^qT+k=[!2vE$"UۑU`twp@# aL1eejpϤa3]o\_%pZBn* ᖎ ~6:ow{baTMj h|E0@$by+Yg';s4јKqbMʁX/@H4>썦[Ϭ?!n5>^sc>#'d$t"_+fl{ (dP* $i[H*Hv\- z޴3kגc7wJWX1#9>#d8((kiEϩ:*|QR2'S:>)XtJz7u+Oօg`*FJfR8CAio|jզ endstream endobj 290 0 obj << /Length1 1685 /Length2 10610 /Length3 0 /Length 11701 /Filter /FlateDecode >> stream xڍP- 5=k7hh5@p $]'Xp}df{Uݽ^YPi! 3 + @RYSΉJC vǎJ :!bHBAf6)3g2b p r 8C@Rf` @9HB<`+k: `p1Afe3gksE 3[ rllnnnfvN3 l P9 3;_4N:4 nfP` ;=APsu@d'YO3pr߉YX@=VK-* 0&:A\fτ?Z7Ȉ=O|NPl<=PbgwvBݟ x>w.=?l=ŁMlBfr𰳳sq@5?3x9@c|T/'3W*pd6, ؟`ѳ€{[\1<_#픐X,\\.>/翳_>vKs@u #sCvv/gY2ߎd\lmI1uʐM_U.vw6{q{+ۿ$vhO=ۃ N/ |epz.wEi{ q̠P3Tg%q8rC6V{sy:%JylRM >v?)j .?7x3q< 7YB\c=Bmmlvg+y lBN;s&gk(/h. (acm/?WrY~XT'vc{3M rP Oz)M!HuTڜ$N}ruao<@ESl[;|lM ?gkY#!s[o+xX"  fhr?R":"3bc\\Ncg?+1Fq}_㌾\.t &'$@0Uf>fu{⧠<6-OK [nK- SjyB&K77Ϫ=(WaP&k 7 ŃC(xK R>ʈ$y6EU^6}%G.HyIph.p Q*ZaP ; e:n?rOWts#Mϗ1n W Μ77XX%xM%X.6"s;siRsĢb=xӰ+r0)̯!Y$\7\GmqSX/o7/'7Xzmv kL6v[Eu8` ]Β?ArY;%jۉgSbe}Ck/)ߩa E/F 1Ct2|3qmzt/]Jȿ8|/sxn+:3}bp1-sW物돌HQ}_Léj_O 20![k ҒG. 0 Miz误~LyG6|4`d ,"ɰaM6 ǰZK2{UWMS ˟'?puV~d+?8.j#-?;]dð$Çֵԓ_ztWdkO޾D1=$ 'Td<* |nweqݐv7! ۊ||Yܰ36_vd(w PM]GQQ={2J_5viu7dcEei܆9uC8`+<=᤼Ij* zY7C,xjn5KV~A&BW;7}z9`onB ?JVD<7eVLe6T):J=rsYs3M hΰ /=eup5gu{ a@!"b%=3w Wb)B 3TK"|Z{~H%0t p*ci;:+}%Hߞ^ 2 <-braExbOv=wuSym`@TLK-I<%ɗnrAEcwD(`:e|̷E% P!Jm`ԅba:r3{#4D |63ggM)D.^L1B6GfD71z!T|PaV&1F6Nk"#jCƔN 2N8Ue&%I$%(*Q6^GͨS?婨5?+ˠˏ au'ί{#ua=[9Vy|tW9l|;mU NX]HٛS:BMQvքh4~Dկ!yQ5#&|uǤݤfyxDO YcKe3W ^#ZpV!fsP c5}zLEֽ/J4yd2L¼ Z3$Ja}sz+fыv[6~Ǧv쐠c#b,6`!shk_nQ7e*!|Ԟevm4!#_$T&7oq=$ JPt7t^Ƌ  [ggtIXO@YQL`3tXB idI> 5n#^[*MȄFL,A. Po߾gb뾊%-rӔas$iu^C.Oxau4{M\a1 g!* ug2eJj^ڴ'._]fEp*RN`(Ns XTOt8Hā/\; Cٛn^0中Ңab: ZZ&leuǣW8&@c*o3+xw׷v1Nde_CN+:nۤ-vU&>q6XcO tݒ8uOaur:x~VS&]kbO//̑}`PsG=7(5#ԋeJnJ w֤+i]er'/,0gCLWA FzLQqy |;Ijc6apk="F%Vߣ!ϫ?Y@/($GtҶ5yO) mUsu"BΈ*2h\)GR<7lT _DY.c&P"3dR(.+ x-=B'D1GGL`CR8]zwC3f9%-qØM:^¬.UEċZ|GLq_~<h W&fch&(d&MJ/20o+T[;dXKď;YAVl-9*?8EϬ$pR9#)1M_# _hn%Ţ9ūَ\jz1k H,ned}@Q6Q }qF*LqK,{>aVVܙZ[ߜ둲Tgjx{r*O63ag]HBi(CλL#*@u1Ў^pr=LZ[S҇YlqQM| *< >uSp#KiZJA@\D4K *Koy<7arNdZ->޴̎+)Tc|;\1d$߱UIcc3Z b[OH¾JŤݮ <Ϩt(*[6DqmOSPҦ2sı'I'7Zxi&%/ؿdohC+%V]=5j{+3Dkzz牢(qE-ȒV}u@vv364߃.|ܯdI.#)MdkTg,"-.`m n/% & )+굶>\q2zܗ:H $rC) { O4XݧBxYnMe<:[BGQppt]śs'H" ntע\.\pR_QҝQݹc{Eg*H>>s W^WH wo)K}!˜4l#A0$`bǴ'uE4 ~h[A֥p qY0WTņ` Qv}bүgƙiDta0Hط mMN5Ê]@c/ahT֠fC7n]9z;W[j2!I+[wI(dSmXMNzo ()wia*YDe(>JloS4b1 m7]SC/ ff)X9+yWYDg`8BT G1頻Vѫ-XLexK2:equ=Ts52״ Q+w<2¬)x_՟]"3 uaYKS6 I4§d-: `mqr oQ z6$Wa̠:p_%#a`T/?=gZc`"QFf]0xBhl]Ix'ݼ=1_Y(.m? i$v"=Sos$:)-܆ոi }7iZ DDיڄ>&Uҩa* 1I FQ7N' 뽌6{yU5:;>.4wZ;0ַ".LM[}>Tixʪ{\*}QE haS̕hɉ_'%)+jȕRF\TMLY4pKx%Ҷ˧|?/߳ F֘X?7/v,gQ",zxԸ?9w*|6 sq`"wF`BX@a\:B7Q<}0H575#uG'ߠH/9ؗr^?kC86ь\3t!yKg:#Ady@Sxxʪ~Ϗ<~~LzPp@WGLd 4Q,@6riXb3< rHǮ`$).]K'q눦Hè,VFuquX_ ˹4fTK4,N;JT5Vmuňg= XGn|;&khdU.\/EX:r3 tF"i^XbߨGjE!x֦ޙb P7t=C97sc'UUnuU ʻ[vρp$y yލ=Gkr :m: b\ a  OgOy+FCv:kq.P@0}\Қ+fhv^!(Gu^XԘaQwc"y$%Y< IXOMsZtܙ=/p3BB,qc]j~}ڙ8?G|8*1,tb4nMHtsаD,apܡiU%ea'(i4q$!&K0Wb]Tbom,뷙RXbu:(I&|jŹΠN &8F(MTF"{_LUQxړ]-a׀*lWCcOg_d:[!5wB|Vi0K_As7!p߬.])'bY,梚kT+xXoqS%5p8+J;i$F bMڃH' QwOǭƃ̹SkѕXBMτ1-D޳HcNs67 Kd@jЗx% ;QYuqi5cp2[#~iSɶ]^_JM9X""= \jַ1N T[CenQAs㤝w~/7Ixӑy9j,dveK22${YPWϺcC=&EO.0}vCɢ3Y*5(bAdlH rP/V7F?ˠ6 :)Gߖ3$S$Ce__g!譡C,ps!"'#$+U!V/]EكƓyTZp3^\f'Ҿ}doV%{~1Nȩ0 B~Jy%.Z\dzOc08~9{?y1ˈz%kt'7t"dL1$'N |#";ΪfnƐ'v(xMb!%UI*}$gܫ⇘{_;B;rXbo! u8C8-e 0=^7: v^-PXF#PT-*gƺFʗhXmBo6b1>mH8VT(|QbN#gS.V|tu},ևvI檛Ï ]pT.AA{]nm??R.Ѳ&cDz\BW/iv^n'ɠx!J %Nٷ_ba;uNbk$/N$BIj蠣za!/nڬVE]Qo̽:`04?@F_yFC: R+za_‹uQdǃ]Ə|''X:a3eS׼K5NUA8Z3]ښ$vaHǶƻ^X#ar4T&Y,1ؗ¥4[~oBڥ(#Ǟ ca=}AHqW^@_@ G_ KJ;2/tn($0yr=Wmg8VضFl^:!&[ Z!nY#1+cc +B6DLfb9΍LF?ơ`=nJzDh5HoJf͢(ב&Flք73qM$m :Ĭhّ8}){8\MC$`)(">'>?js蹣R~׳lI[=r@| Ӧ1:Ld)KZ0ptDVF;.N1 1f/x* {,[%^Fk]wO<ӜxAaB`5!ʼn&BGeP"YVeQHgWVӬ (DwW֋ +gw_+ys*LO!'>2T<աR>t=}-S?T{+zDe 6Q*:' 2unXo ˃>eFT0G%ǒMeo [)_pm-?]T"}QV~-VlkceLVJ !8SS՝ެ}&SBsK7Nɖ4X[],ྊ+Ěh{v:e=5llqPp58XA0"=25)Q?ޒs͢Sy6%g!j>>c_̉j/ M=E:Z6v,.GGWrMNW̺qa೏ Qc,1 `y߁]:F,d)s]nbeWeBvWΪVO}l ۰6r־. e$x;ur5(žt幮TmZa㘾 9<_+IzJYc"ږx mg98ag,Pux/\huw+AKWVjv[VBظr+ m27 =םK+FgOkE_>zI}´''f$c9kUL>ÁFtlX{MC0B.^XcҴiK )gEw*4Ivgj|[l}}^P&< ZdNLy6Vuݽ/[itbuhc',!n[ڵ; K@0>ȳCa eޕ`R4;&Kݨ"hSUL$ex%u/T3AE9*v7w1RuG}P*U>N. y\;Z[IlK3j!6#mo*nﷳ%SM<`! Xr:*"5v %e󅯓j v]mp}` -ցheTB&D{8H^afo~䳱E?f?ӫpvHbuaCߧT? endstream endobj 292 0 obj << /Length1 1565 /Length2 3300 /Length3 0 /Length 4295 /Filter /FlateDecode >> stream xڍtT[5 Fr)*=MPz&XBBI  UEp&E R)@zoe${fϜ9{L GrID* )PtHyPC !C b . ID RY ՟DY pZ0&A D\O&R @RRUUYv+,1TWГq"XW +a<)r$)Y@u,A Hqf1'598`J|wXT_ $R!4"$+#S $~'~'? 吿LD ncXO xQ$b<($F<C83[c}- G,EQ=70ƬG<=A"٬O@\;K "!ims @((7a]X{[N䦙Cp 3 x `|@J:F$Tt!!3 ;f?8"Cϯ' Ñ[W 74ձ/6!"WTQ@Y1U ~G$@{),?C ;1C -s' e|!b i|3*VOC?Ɠ-4 RqFT c.I@9uwy9B|Y\XwAaHr2vXnsQJLC %ɣP@ 8oK\H2BFwDl^2Go F Re01JI4/? ? l^@F*P SA4k6Xx O<{Jp+\% Wh_Yi73e;x2vud*w{^Aɱj*dzjRLi&MMO+q. Ֆ|W4^x@]Sd;9v l|** , Z w7Q4{)z,3a4Ypfd%uHt^`@|Uo4l>ut_S[/UD"깲qGX[Svqzn Yr%shL/7DۥcQQfQ}Ӣ䡞6P)`$>g+Mȹ2]=PZfAyX2cA>,6wf쐄/~?.].߾i`5R;ƏO; \B0o]tS1%wmNH^^'-p9לbIp pٓī8j^&l+6wN"^h"f+$\Nʞm¦ܕkioJۗF={;kq< rZ1Y_ŷڝFIՕxiRg$ħj ͙|JAlt+i.% pa_5Ո^umS UG:-X6tErUi}` K0eK_~ԫV̓!䰟w{5c `\R}jY"|ݫM&I 3 ;LQw&tʹf'ZR} kՐKÇԅ%o- MΩ,Zf\5j n*( /awX%?CSuX; /_׹jrhK,H^ìU31Ley-۸Çfy,?ʚᐄċ̯\;[Xӳu=ˑ{p ʻ{uϕ߲ڱ-Ѽzjȭ#(if|XŪ\)p0uMY!j:Ӱs &K gaPDIM>xZ\:ߏdjLuX s' wbJ;YNy*w~jݓWR@ͻ2ey^-k9-q>TkNyǾJ?z՞qvO|^P9뫔WyйP_iPuGth(,h􏬺f 4:TIuȜy@ׇhv "92hC9_C'9]\]sO{谥˦O;7LĭS|rԳ7B|5UM 8/9הKbt zGM684n|fyMګ=juARƙ..WZgy= FLܧw'} ]!շiY8U<7$OZ"KEn-c2n`[/X)xVҁ*bH >T,?5DWAYN<-3e^!ۏ?`lVC)4?\7pvEK'w2^'.ی3k\\ GCuj̓I|0{<1S^ӌIAy{d=& (LA2Dl[#Gqs{w68w)"}(50dcئu]@Cm2a-4qq00Ǯ_|Dra_cZeװdˁwvJ_}Y/݂2YW Y<7ޏx>$nFvHlѣТavgiG+`zDy./ {`PcL{ Mn=Wq֠/nrE s V&qrϑ>cE P DϪ~=1#rbqp[LPϪ>˗Qu{֫e6DMm9BfuF,d%4d?=yFȎPT&`jleHVxuCmb{g9CcԗqVXkn|:Q).{) &Î6E'7i:~`{2TMT'=g :}Wh>gq`-k=JXoxiJmf(LO]RNkaI/*of{HUs_nԆ=|C4X*5[vGE3e;]. tw5l;"8BX-1\%]sP}"|["p]X򇂭'Os-oo-Tie`=6xf86bdt:3 鵷Xtapms2$+i4 \)/?P#Ǯ.>Yۆ `W}6}K !=^OszC7>sYUJmɜԡ%\>Q~ڇX? +3k9O 7ZwY$#]D\3 s"{϶:E\Qf?2\@ endstream endobj 294 0 obj << /Length1 2510 /Length2 11327 /Length3 0 /Length 12758 /Filter /FlateDecode >> stream xڍTZ.LHwI )ݝ 1tH Ҡtwt7H Ҡrsw|ֽkby;QkhIYC,A0S #aFӱ:!!`?d@@(& T!`/% A0@io Pe(A wt:~\BBAnV@0@9"!ܿH! 8?C>"?G/xD0Oi?"^#e`̟Hxaww|,4"tZ9`WR<^0V">1+l* 71a=Z {Te?`"@XPv!ªkb!aQ9aUv²3:XI!,G|0U0lE<S K 3/?fy/8.N`W_1DdmG\0u悕o|0qwkXN@w?L| vr@@4V ynqyaez0@W? 1,?пn؉? B_X;TTJ{qbu-GU3TF'?fAsf7vCSNG/1Ok[l,X'U,™L0 |dБJhђG)AQfzCQoeNP6y9ډ-Kb8?rwd.Ո۶5hsHV1,6R5P,bZ],/"KsYuXlg<5tK? [z5?p$i9xryIx5WM]aʞKq(I+Yk%̓*:@ɸǹZӛsc¯ ]7n8S3[\L8;-&zo嵴=j0QDxZ+bU\(Mk:eeUOJ&t>If|DDy . Q+G5dаEšםІ9WqERu[\7rJ9(ސnRʇH(\7QLOl7nkŽa.2'yP]@HWjIPLcsǕɷ ѯo(ބ1)'dotV;,tm(iZT'BB.yTSAur3F#zAnuKI5:YW> ,7G9lx˜K-/pҚ}{h4u}r>T`17c8<(V ^0VXX{8޼y\Klʆ5ISbm@&*>V6GŤunN3>cX1up'D#,|iKbJ؍"'K-P̯AR*5ʕIOWR쇡۳ʮ5GXm3fE+R:l>O9V 6~_}@.BʗGMs\\G=83X'v}ECߥq7@NWUALkh)h~aacX\($; LJ @fix_ޫ(;6m8!K<٩W~Qŝ(tGS"C#LJW,OR{۵2]xWJ#nsQvL^c>kJH$4ϸu jaMm! b^oO(t[ 6tC+rQj_%,.KIk1W W!/7 9_PY*i.B_ |@w6\(fzLF RRH)bCO1w?:-gD<c[6cVPI5J≪KsЖܩLByƏEOigN&BvRA;|d>>5PADG p")![yXW9"1|x wž#2yXj [JPXvĴ]ie< +B'2s;X&b l*G+fdu >4KF_NcCJါI?Sm1gclA@Hig;N]o['/nao,LvPW߃4VWVz S&' V*%*KR} :Cu%Fm,5JVULnXԺ wK-E B{0~> Bt-t]k+KO-^iTsV}xZP\qnr=(G4׉Tj0>#||%OU[( W[,s/ .N5D:j_#?[)"Qc`|XobAO߆ |73bWcmq1~dnUuspS6Zxm#E 6,s:hWbCyxt ¬_MCҟ>yɡNFx#\MU#ܚK5^U)c{Tڨ2miDq̴ s}= OE[{L2_Mk21)y^W{1m[j׍3&)5+'sC#m-FdCO+5񺥐ʮ5=[*rDoÅKJYpĀM>Gm%zQ̨R;\7pse݅LӝUgM  z^$ oPh>Le`7F/`b7-c1#]w ukֲtajSicz||,4w~| K[TJA7LϿx~#埳0 7jٔ#.GrtF;p-9mJv,ZŸ`tL΅kt=<6رhTs2~ Y7'6;2΍PR^b6د#1,7?k0T#, k` 0]D|V~Woe>iC ѤìR|EuH>ayFgMZۣ(dlds'*V;*ZSC%-BV(xQT&l۟by[d} 40)4G3: V(KQeR*{o,Kl3iRySF9.)XL9}ɏ8=;M(>wP&m˴YG(rGʏbhV9&1 o+&!DV"VZ7BjI銍(v':Xaq^'4w1Asܗ W,d'OӟX_L %v#7\E$Bcd /WBI*4"`-`?LkնC*NZ^Ōh#HlqXtѡX+]̰}ޝv$r ѩu 4U9b1:n leL^ZJ4J--2Ѝ1~Kf~VZO"6a6xۅO6:=*в#Il*p2!LKVK՚ %U ]ְT|5R }C\!DJ-P _H.~VM垁l"?kdo'ytpeF`=3}kWLo3SIКQyl_CA3|H)k\wi7$b3oÆ%|̄y@d|>8/gF3&d7%YWӉrxBQ7w}b{N^ZjFCqi2z3șUy+AWD[ms$o;10U~Ƶ`eヲLw|XUN:Pkj9 Ixk(ˌMjIny@2*\6uY̐:%i4ϴ'H+ QL"GJb-'[ =]>\.Q?Ϟ}"4}KWYU\ڒd[DRm@ɒNp{RrG4T3&e燕5C 5[ųG:ϓ}5E޳D5x>x2.A *D-(w9|Ib676##t DAc<2rm\xR^:1l%5Eג`&tF1 ;D<9,0Z1–8B<(j7~L5N4F׍̪͂gwF.֌cz_`ìZU$p>1.kz Z44v.ZR!8i)k|MJ^؆Qc$_1PLtus\vjNh[3`ኜڛ3qYDŽXz.tV&5Fɒ: M>i%A.a$Ju=8mpURGѪ+-;h4=7?V}.T?xjgњpE!5 }WKzZ74p6vFz Q#@[5VZZkNgXя,2omce~8h DY=y[ۗ3PE!r\_i*|MqІ4Z(:pQ2SoNNA{oՒRvf;N.8_q5/iC\r6g3Ƽ~L10ܫ=|:JYb{ "8CN-$?P3 ^tПmԤZa UG;0LBٽQ"w1Un9A^/|IJ~&-0$M=1$S%׸'__`*+ˇx5y,N!INRYǃ m0)~F} efIN.i-pErrOxph- { l-wVUTDrYNVG 53kԔutŰw3dA‰HDGS]Ly:6p`! c^B幤EVgq 6UB0BU#]5F^ou$:xmmP m2R)Fm|ɠ2#LϼEƆ0^-~?'3o*=tu7Hrn _X~JTK#c32mqB!d|pk %Hp0kwtBlHv|+>k>x [Y'n15zWB;aקd#Y~~ű' lHت3 wWIPkKLb  ECF!mOo lRц|K<^*aުtx6LUzLq@ C;;'Z5lC! I7[% ]1aCʡBBشʂ]C?(/y ^.fL4Lr:N8xw*A ODJb3(MS"L&>SBHgI/jc³kD)I˩]W+b32N/gܑ  M-MY9CE>y%Yk\rքzOK˵#$q v$2,bxu% oV|3@"Vn3ؓOk1)<~Lof]:3.=Qo2/E9Z}%n:hhѭ_Z{{6}Zm@8wݗJg5BɃ,9s@U$,NC-OR+eWQEr@Zʪ}%V.`Z$D wl"#R>K%xuRuXL&zs"%G1e48,R7L~bٔD2 /jdqrQ^t[mDŽ4/ }#Xf읈KV,v?cPϿH9ӽ4V 1#R0lOs]B5?Pw Y&_V!򫢢NePYzZ%$lB ɒie_IlTꍓhs;31{#ss֕oh[Hʁ&V!1ؕw }'+`f}t/?.LL㐾 _YoM<5 ,kDRV "مi%Wmc:k;4 1ꂫ3Ì橪r-4-V'+u vt ГR/~&B(#*gIW-a.0#w2#D6p?td ˛ZciSm+)_wI-N "i\Pa>Ce1Zް[7Μ{[6h:/E1-><]mj^zoB[5ի-53#ۧ/8Gn1ĚX;;D _P Rk::/r'Kc?/2y~;쐱&WDN>wٻ7Zxu"XS3 +c5s7F&]XRQHhm)cl2_`/g {rW։?ܬ. {^R6UvpWc𵪐V\U"N #1f.aoA\xt,bgåV'Nd}5ZgQWQKM1$'؉%GB321+%SuҰ,`V2{WFG c+<*fWK=~!3e71\p"G}z`42$6A քzٮl{dȴ Avңf!.|!Oq|z[yᅜUaum΋3HKrsܼLm N@jQ/?٘OP'[蘳c|h(.8+@r.fL$a71ÒXN ]ړۭ|<=p[ȦK]h !]]j62 dlđ'V#兘},︘x$|#K<0_U> WDJ?)6]mz^MGE+k0|Ij@g/.)%SʹcNCTU胋L0v/'TSdwsC~DMzFq"L>P'I]IȰ$簳1h*9¾Pa^ew)Am_!0='[+S}G[; 25,ЧC֡2;ŭ}c{P:ힵk2\']JdAP./0Yy|}ɎCb)M UyUIN7\;ZL8 H >S<U>{c`TU) U*I# 0 -%xŘSh[M3s֓IQPMBh2ͷ}rJu:Qs܀Ddxؙ=_N2Jpɾ)#B,˶Qy:< h\{3EIdnՖIk(bWj\ݫ?~sƧzm#h%_!1.,EBAP_xؤ예7,Pv53#D1=~kIOnLpWt~kT-8HOycJ)kc|iMwCOfDBPfPߕo{UQQ_9]J%bz#;<jVE^$YV_gmRJxF#HdY-!&I ? Jq-^J̣ϔY c+ e3_=GO7n=\/Y$\ P#1Ŏ,Iߪ-cQ7Mfi_=z; r/iș5Q"6徳JʟR0M˪N?(Mڜ,|g9Il/YJ "Z( Of=9@`9m91G $>PAC{i :O3w?Mq~4mu4A*~X5=[Gޕ|hL uE5I)_?K- rP睨"7²;8si0kkǰ,9dZM#_m͖qZȥv@,1kп1Y^x yeZh]mĮp83Lp3Jq%_6MWp;--Bgmۇ_?~|nΤ ?~2 -$^uS`6ܟL_BNFfb/>L:xvS4Yl4W%($zؐ0QMtvWoޔvEWcPo$?F~Axvt[buE VCvvサfÿ$szxwg?H OŒL91]f.0v 'ϛ1y禱tALDVDҵ!kr/ Lx`1?WV_N 6kzWB:Owcn0EgxtEafp1 *ڸ/SCVФag'WC[iDD2åɁlܯg,0-UO?Ya6̥FCl1G![G5 `)X! $f͓Q=Y򻓢\7w9] 1m?g endstream endobj 296 0 obj << /Length1 2113 /Length2 13078 /Length3 0 /Length 14357 /Filter /FlateDecode >> stream xڍPܲ-N =8w <݂`y|rOrWWT{ H΅ `e`feeGR؀5#QivĜ@@W8啧`ouqظxYY쬬|CwffJ la>hMl||<؂@;dhP7\<+? ;3֙#b P9@f1#Q-]܁N l s~=jgr&@v!0 ?=W ߇@;Ol(I3x0vf6n@ w@ *_yΦN`gfg_Y e ;31{[[3_@mdf`;3D:h؁]A2R^MHm +++/yZ^o_o{/8|t7BbcM]& f?=cOefog(HH0?>QQ{77we "X3Sk^ՠw,Eיh>+/A|6 IWݴ?n-_Ⱥo蟕U]mW"v6i#Y2SZ=5Z1Hכ`bce_׽2~}7_oum;_ :9=X_Lj f 'lgz`nׅrsXD2x,b/E?"X~#vo`,k߈A7zT8,kA|52.TUz-?5;f;_b54*w+t|}t3^m?F?*ߒ_kf~_l?bE,R~uxzqkgc~mJћWi. 3?rZh۫?e{ ;bl]jCWp#SWW9.?tK?/-d@UCp};9=t:&oN]h)tANw");d'maI*>OF 3{HKxOD> "0 <;hZCAR;)b߻Jy|X_-T1X6OU`@@D@u>{77L64[w=Z:s/!%.)- a,wyib.+3Ē]_ᥨK 9;"U '=͇3g-*{KizSs d V\X1%>36 dz r~G(Svj}Ccu7P1dI8v_`6,'Ga4h4= Or,: mInlB!'=e!F d '#h)[1x39咷ij,b#;YN^ MAwDs{w]z|I%FQs3s& 3C(s P+g8<;иp{)yh$au!v|4q4EX/cyp9 Y7HޓѧKO(l< Rm~${|8^QH}[QI3>T7Iv~jY9٣jQ6Գ,Zaz6OzxcMiXj𥼑:";-XlX~8*IͣW5CK )ij]Ys@̯ħ:_0DcJ.;bQ5$SD]ACi&tTD&,qiP.hXW8׋4:qG0p+nnj+~3oYt:4x۪;%W'{5D!\+Hê3=yNv ;rTiԻ#:BMY.MN#]'vn@ShhH=W?3@@w𚿁@tdcz_ڝbnP iV/ùUhqL;U"d2!EDl_FG5@g|}D?#MP[2Vz'c22> (UÇt#Pΰc5n1"-g1@>&eYSWz M}bg/HdkPkh =Ob]Amw3&B F@?_϶z61|tt]" k#P;0# vDhyS\ML!O+"5Q _;׻u3YKֳkQR</.ko`G] JIinX P`dB &#GJz#:ƇxB GҟVN~.{?|Dk{o#ؙAwvTc^\hmMFr&T4jMr&ME:\eN"^-Nynܳ@4 kDžq3:e 1aP؃`9'y,Ohf`at%X4dv`aOLH'&LL~C]›MC};kܛQK9:EJV/-jQRn Ȓշ R9wotrc|zDK`?mӝ=[HcY@\c4*vիƹWa2ťtM݄Qy4>|vrf y'3])I,R}C )ą${VMw$f}jRnY[`ȩ :<ӄ;?~xgr!y`e1œ1Ҿ)OYYX\, OKxޅIA fhߖؒI#  T3TF:'2i'ٱu&P$dU=zThF$a6$SgU|BjG4!K3.Ha+_nG#׫lHOpFˮ$xئ~~eG=%s1k\u9Xm)+ W88S~T;[{_G8応=-[I Jt r>f 8`mKoEAV~.?+){P|=.*vͯ\w9tZgo_4vlq "VuQ D 8f ϯ@t϶+驡\ds@CHI)!i؃w\ߵbYk)gRPn@Ru+;Xy%dҼT׍-ge>+ ,ă4ѥy MVyMƲs;rRj6yrg8('1y0 tpH >gXΨ?k.ե"}zbpc\3im}I9˜=2L[ݕa+:\M NJv"DSRpUIfg15c0SRNMKqsh!6ԨXn]:|M4eԼ3FyC=GͲ^A*=A3Q )x1q>GkѝKKKHS'!%& קl5|ao 3Mܶё, ae30nZ~_83?4IlP-%oFV5]z8bv״wR^̧~UN%stUkLPD4C@ڀl݅ '|O;*w.|Q]yB\*իW4aަeWp-0C턨oAӨiHS]ӨЁ Bߚ0D`1 !..͚<3.}"ꃰJ`=>ی<ROUyF~=GRR IA%QB\Tm9ґv+QUIYh<-;A?ʂkˆR{!N H~?P* )S`/k]} EF'u?̽Q(U&h_uy\7p/8.Ry.7HE:ig!]vk]9D|>a7n+QsײJDTq-eZ[犩#nBE]H5hgɆqP7fxB$/~}S=cD3xt5aKyկblƩaǭ~ ]'fƻ7Uf8C3imwNPI#g|M$Sf SIjTsqw6a[ kaɄ`X2F {n1o늍nJ~P1Aƅ{tTho4MX"lwi?z6G^4,,fA`0CwNw/@KnD=Tm".ܘ=rH S^{96jH='gc5)zkXb,z@khٺw7 ]t*Uzoe8>Y51O!&PDb(?nB|hnaRQɬZ#'yrbÚN]Ѻb ֽ1%f*GQQ2q X2%Nyޣ73æ'J#[dj0)F6>d' zG }ty~c&=#թ*ȹND0*gU2)b.:M͈ła%ҰyTR(7'70[tp|wNx=@lj7bKT(8d pSbJkO 5^hY2 S7)Z LU'fnY./0˘KɑZUXug:k4ʊjx9 )sw-B趟Xm50Sm3Օ\(?:vǚ:'4ʌ۷6 YĴl'DZL(L8>2XZɈjD wA\.n,+;HP**} 2yVzWF!x)B+u dI|hDVUCaֻō/16$%حٗAДIt'xBm,{;MD>?Kcлrмd|3߱<H閄j-!(.(x*brp6c->܋PuJp_7Fd*K> ɫl[jBfj2N'RTP$\LV[@-9,ㆎ|dF{C |EzqG=9<ΛHDb[ 6"0&XԌZ?op{03"Ʀݮ/N. F$1uJTbEÅK"#zF@ޗ|p`TFL~Cܶ5Gĵо;וMQQdVʎ% PB1%huEfPJia|Q Ժ.p;e~,]e11yh!p7P)^ EEվj>#maPxO|2i[R Y`c7Ov;x*pk3`|Y};Q)Kdh)Y*".Ⲁ@\ 5c $l9kIFVN>;AV]ф7ZrBi* @> ^MAjz@#qQ/Š" vQ׌P3Y/ѭVpIv:$ݟ9 cT {p܅7^F6HL?a )k\M@)PYŏN1'!j ĈfG9I7ܩq߫KǏ'UE*Iiڕr+?KPn!O&ސt: *s[*Mv&vuZOL_ RQȮ\~`.vQQ(";aGkUfsd_ىd,P1k/qnEV&f;976첚* v[U Vt^:=4UIR)fV,Ӏ̆țUѬXit,kؖ13{(|;3c΢;y-DMUToTXf-_\a Dלz; U1@Xu !|BK>pCq2]HDS[CK6}Yqkem<$hǷ5)Ki]Y@aFf:E=eG/^bFd\9U@-4c_t~E@2B_CG~\ ι$!E©`G]*bb!ȵda K=f$cef$gV4|I!\x^%+[DB,ГYkhRЋ|\EI:{1GAAkҗ'oGpZuօYVHi8&Ÿ;dG#qﴐ7(NJIk2QwhޕJ4LXB dK\aM;:Nբe LRy'ءE1@26Y| ,A1ķc?c}"NwN}1}Qu%. d隕ߛ`L1gH :\;&T뚂E 'FF@Qf9ËRw ! Gt;eW;hrLh5WjMjL5"|J%FDOً&n>^𱷿48Q$>g J ]v@,$hIu\<|MkȩVΚ`"S.W ;K_Mkb7h<.Pz:u>F2tw~f>/~3?47bVinKKė3W8zBڑMC.y:4.QY.\]欅wm~Rz Zde[J$M(mm 9PtR\DF;]qG gƶ2;Qb3tV~W%K%%& Bke49ƌT)v p`J?B n?>Xr署zwW>(j6vSW? <>NOB]/qNBuK-j4ؖ{CMzr#3^ʍTY ..6N24ĂIDcOW'CeÍGEߢ|v)Pbvˋ^_>GF:S>_×?mKpMȶ 7p(&tYL*Ӯ}$U4?cOm{cw7Nѻl`24Y}ikI“w)B΂7`:ﰚжEk(ꑱf&-߯vX8{N6 oM 6]xf$>a=|5O]8b,NU.DABF+p[7 8W*dkqؼH}ԁ" qh,3nhS/ G*|۶3-&Iݞf 1@CѵIo\2'#ԏo=Z+kE碳_7t :U j"3я\z8߮EeHC\ WJ$#Ta U'7W6_,D] $4|u.D}x:ᖧցc é]N$yT4{S8+e=sVSMxE%kkhuf/q̞{&s]ҳ@YآzH ≠o3r ΩiJ6Pp;=XyLD%ز42 J[B!ϑX8, nV4Q7ל-E۸2'Z@,Vj*qMg܍!=MNrlT['}k`tG(=nSus?ߜYUjUY ӫ ^6\+z4.բ`I sJ= ~U@QzAO?wo'.}8Sbt3;~iAt4o(w<[֝T9XhPG-~bEmv>#_qiGp.6$sn,**H'$3% a@ +&m{*$;Rn)R`K۔ϱ 8AA{n >F.=X@ { 4ď r7]8!x2?ypgT//؀O5/'B Yhrľ_ +9fnֵGXuTP4;=Ο*[Wkr JF %5~&iA.6,C9+;ύ*6D >8߂6#.'-!k'ڠ 3P bni\ߔ qO]$9Waw9,XLd|}Ѩc Q^ 2qv;?Io㤈}S3z ZiwIt}'ŌyXi q)$/eJVHf@洛'whV'p1G21͛Y]}th.E0s&8."D*(iUSI3T+f#_ULueB-zO[Ir?ݕȁX 䨞~E#%M(; <gU柚C-?qյ3>¾3vZ]]IpڡjƪE1(}p̔[XyM*C9 2P@Uq0Σ2]CJ.mlŊp[JA|e&"muDX$7(tL[]n=z8v4fW 6HޔY?L 3^x j/ de0_ AQBν`ikOglI|Gg9d>$+. w8hµҮ@ƈӥz;?tQQ=nXwsilN"kiAn2uxoK_)t;R.G<Զʫ8mz-3hqAh.Rhܢ.e%~3E(o8νcu9 %;3; g9&}uXT3<Jo&N!=p:+ B?ZҬ&?"48;Ed'-OA֧YRӅ|·W }̪-K=(fbc `,UbUU#mMؙ23TzC4O䮇%=!\B ](CW mBT7]<E%Y31y{ȣ_3nX{YMu"@SK)~Q2%/Ư9vb*4̥!,]E ĂYOD轻/ǧ>AYԴL-WD4?_"A 1L]{At.@U+Tv0K{;C2H:̅{ƥ<*؂[o|kx[ʱ/]fæU@ﴷv0IXW7*7 "'9=炳uQu$_;HoCn k*GN Qa=[~"{LȻѸzP  Q7+ڈf}R/wzRN:<9*/K{4r3\gZ$OJC1bw$KuS$B6,wS {v-& [ "˅N[#cW&P21J?цbи4erzQbq?yW]iCBZ=G62[.L,9xH +5 cԣ9>L<"?(M(U(e[oVNc%x p8 h/w3Ñ>e6xe((oݚ^嚍(L V=:c4}+{3~5'+ƸYnb#&̯T[ot88A$=dPtg){!ZIHS]w#ݵu3egHW_qMcԞ9N]yql|[(teBNߚQrǧ&3>PCrvԦa t'ɚ";D d 0r:{߮Xp(_`3ԻhD-wgVe-]~A"m/M9ۤC+nj,W\aT]%Io)v,:5#A 6r7+sX604Ԇ="itKw~š.v*S+7%FǾcÏ`F^Oe37u#,RlcQm~+޸ϒoߥ1%.QL\ 'NiFQϑ~V%wTpxOp"38]Y/9y-Op3q&+ʞI(J;k+;Ɣ#N.[v烾}v9멜{rHlpMgE4Ϸin~lަ?}`C_3cam;NwKy/xAoSX iMM;{ݶHÖG /T?3FDT&`<,k`{e+sUN2gH셰шXv?9e-aSq 5|Svp(œK/~' &vdwW9*}D0s1Y=/|8E[$i4WI_0"vӃw/v-XNH5a7]a u*sVvsHY_L6[ uĥ輯r*m1D@B`Qb/ݞ}ZMa/H)9bۤ?$mdQi+->G6]"vM~BS89 dPzG`nchxr,;bY"s%5Q(ihe(-$H-6Q,@E0jnK$%HTsÄ{Hukmh54Ri Wjn曖QL5w "Ӊ59 1өVCoIirȥ5~e|e6t FUԧFIu$[Z ;k-%Z6*>@<[F*|:( m'_آ[`va] ccw0q 4ܐ{#N@d .]7\*ѭ#Knd 5m;E_-toau endstream endobj 313 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20170627145912+02'00') /ModDate (D:20170627145912+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 279 0 obj << /Type /ObjStm /N 57 /First 482 /Length 2311 /Filter /FlateDecode >> stream xڵY[SJ~ǰ)GRԩ;@ ܳ ˑdBί$F7nURku S/G20_(U!ʕF`Y@LLsno ĩs$RRY!>R>FDBGD($X| Ƒ/) (P2hD"#p@ Id`NRASIr@A-8(Oi*ҧ ,=K Q&RtVlL )fNDX&`J B-`'8+ Pp  9p>p$[XQX  @LA}C֒Fx?e:'ޗÏ;G Oû ;?7&P@aI~ V:ֳ V cb6e4o>%?)38 $t_o2:ܻ7Tn*JKxCERxxG3|/%q"8~| O"4Jƹ\g0Ƿ6OƋ{|{~g8x ƄxagS}VK$'8)Npvh_1^' t׼pz}pvx~NIOPľ8Қ#Lrc͠ zb'~ǎ?G:qEӉfKpnC:5N |c:oYSΪah i<{qw]'iR?q'7S'D[`Y&:IqyJm].Mō=`} : /{G;9Q.l 忑ZW`sKɬTT'_ryN:sZv,3< \J Ș7 $Wv#oHn 3\tKޞE~R~vw-}MR.4%R O_ҷCKڰ\{F#˴0Qu&¾9jw[/ tzmk2hm6j3 xŷg_JkѦ#Z]R\Qu#\rq]3Tw'`<]\GGI+nâO&} /.ou&[o_w‹&.x=(/5\(+EG; t [0oƹ܃hEnads (y? } bRJ} UVL{KWٯ_Ga^Ɉ_^ewĬժbyJ)E1v 3GcS%W.؀x"R=6?jJj*6hq U-)02FևJ ؉vK79a(m*(\Veg rJcgsKeK7w#m~E˒RKJ`=B̅vT;aN㻁^(r3VWѝ>'_:V}_r endstream endobj 314 0 obj << /Type /XRef /Index [0 315] /Size 315 /W [1 3 1] /Root 312 0 R /Info 313 0 R /ID [<3C406EEF279BA210CA4BB2A2D885903B> <3C406EEF279BA210CA4BB2A2D885903B>] /Length 795 /Filter /FlateDecode >> stream xoWUW ZJ<[g)bo CE-2$!1?1&Fc'2ĉL0`fÄ`b[/}Ή(B|:eJvJPvj20U !WP+@{V5Ud ^zЀ o VkAXA X^ 6`pn={1^} Q i;}V+A=pACmCQ7br9 % eݠK|/^!*G'aЧ1gokFx(8 ;w'bcrNId`W\pF1o,8 > stream concordance:over.tex:over.Rnw:1 103 1 1 2 1 0 1 1 3 0 1 2 7 1 1 2 4 0 2 2 4 0 2 2 1 0 5 1 1 2 1 1 1 7 9 0 1 2 2 1 1 9 1 2 4 1 1 2 8 0 1 2 4 1 1 2 17 0 1 2 3 1 1 2 12 0 1 2 2 1 1 2 7 0 1 1 18 0 1 1 6 0 1 2 2 1 1 2 25 0 1 2 16 1 1 3 2 0 1 1 9 0 1 1 1 3 1 0 1 1 10 0 1 1 3 0 1 2 1 1 1 2 11 0 1 2 5 1 1 2 11 0 1 2 2 1 1 2 24 0 1 2 1 1 1 2 11 0 1 1 11 0 1 2 15 1 1 2 1 0 2 1 3 0 1 2 21 1 1 5 1 2 5 1 1 2 1 0 1 1 6 0 1 1 23 0 1 1 6 0 1 1 6 0 1 1 10 0 1 1 6 0 1 1 6 0 1 1 7 0 1 2 2 1 1 2 1 0 7 1 4 0 1 2 8 1 1 2 1 0 4 1 4 0 1 2 1 1 1 2 7 0 1 1 6 0 1 1 6 0 1 1 7 0 1 2 2 1 1 2 7 0 1 1 12 0 1 2 13 1 1 2 7 0 1 1 10 0 1 2 17 1 1 2 8 0 1 2 1 1 1 2 1 0 2 1 1 3 2 0 5 1 4 0 1 2 3 1 1 2 7 0 1 1 6 0 1 1 6 0 1 1 6 0 1 1 7 0 1 1 7 0 1 2 13 1 1 2 7 0 1 1 6 0 1 1 6 0 1 1 5 0 1 1 5 0 1 1 7 0 1 2 3 1 1 2 1 0 5 1 3 0 1 2 7 1 1 3 1 2 6 1 1 2 1 0 1 1 7 0 1 1 7 0 1 2 10 1 1 2 1 0 8 1 3 0 1 2 1 1 1 17 1 2 14 1 1 7 13 0 1 2 21 1 endstream endobj 51 0 obj << /Length 1840 /Filter /FlateDecode >> stream xڵXK5ﯘiL1^3nGRPBXC;I ~i,{I=Q_[ղՓ }ˋLPִ\Ty}:*lu9^OS4.vlnL閧r3jU:F%9!~E+M}}XH"C&Ym/hJM*:05mk1֫[$́/2خ~6& ݚ$nTA 2 Q9sbge0 2`n$$Z/qXdwa*uU j|MBb8#c- 3_qRRxp=-L>`z\\#W0#ջ7"\/pb篨͐#6tZXbYҌ8 |W"ːt/Jf_V DP[7Lvh42$eK r:4,uV V?KCkYp;K]iK~_יk ՟C rx01}VwcU85Pؔ9pH9P'=2[zWQy8==1N@2R1'aLa$y4e@lxl|gAsڮAc4Ʊ15jsznq؜àHLЇ d 07rˆ"[ ?߃Ks~,ك.%~Y@?`ayQYwc7Ln!va4[~s& 6FMÙA6H++y%ƹX~>Ys^pGk%ovFHi5|w ՘'>*J: 554Ij\oxyjF] ˊϱvm\>O7/_YЉdayR,Kysid=`JvlMR sKtZ[`y"-ggp>@7ds(ot)fjJ`1oJY2:)wIs}&5Uwlg~ȑ6JԣNG4Vb2YfDzC[jEogިDN/89u;{qߔ L2B? ) %W4;B"-ܵB4~:eI1I}@Q+އ2}MXl 4 JÇIaG-*DMVnvz?6HC)hS;fИ6 CvV f-`D`)c(o~%ΰsAzA1֕;y9ݳ`u$17jX4锍Ez?-וIǕ})"{4мn_k+8mY%>"x ĩClU " ZY ~RnLP> stream x}˒_[.Uٍs˞Tv\=(J"JO>@ @7d,|0<xs.mx.u-ɭ/o٧6&X.w'>kϏ@l N0Dr[x]v>8E\+u8p|¹*pA|8fב{\C8K,́a=LӚ*0 0#zOJ1wBmWᨧ 6kٟx~Z NY=JvUFF9%!lU>s =LHjV& |v9Ƕ Cq r@;CȊ8ee"ސ!O=ʃ1)[da_ˍ(oK+m~ulM|kh܋u] gv81 ӕ!]/p!o&9+BkJu9*Aa4 {)Wx?pO3l]q8=Q4y{ro艘[="Q82!EG'dq.F~T)4dԔHV2RqyٹP~߯7afD87 awSkgN .@WHn)YU) #2&zsg'?Ex_߯a{'+*2fF3B\}MKwlnhߑg"t*$oB8(:*PL=L, i8xm"#),Rxxܭ)f>d8uh,"8ʆﯳlY]9F\4$&(.~CGY7 rK*ux eSFו:x|BT8B.c|r8+dd[17*py qdQ!1cpI-N<2hJ܌/ԩCADr:=ٺ˫S|lY}j1K1A"! &ao<’Wq\r- HEbw mISiWфץ Ѥq'&gm3.}n5IvZO;3Z~mH/gd!7͂.Y'2i[q!5h hR.?՛L\$""BeRL}Sh/2& _QS֜P}j/tsԈ#;OFMV"I'~hȦ68.4Sb$§̭aíV+)ƻe+MݫE 9"ɯy$)L sL+%$Cz. (D=Wc\A2&AMĢq3orIQv%9Lx%GwYp%mjG |P9G'LȐ)9β3mGpzh^qP e†O'ۍ&ۍҟRhQzNIղz{Zm`~;ܳ9߂TqԷg(y2%JmOS[^] oػKNFweo^/O]u}[|6m/7SquZ{C153Ɨt'hN]bW@Y*U€~FI)͕Zϯ&Դbs[xetF W dk;WGճ=Fob %sg |3‡7GgnF'jWgEup,:3FpYpR!؟!D5:A8Vb-:rXp I(aj{VXe ӵ4@x5ps*> ߇zKV\+kzh;+h,Ha A)5/`q((1sԭ^%%NrX>gљ:umMfvΨ?^ZN Tє@/ Es7hO?(QׯfùubQӳTI܄|Jh6EPT35rWɦvfMܝ1_tB/m-Z-g?+ywRR#hG\ 'w/|UsjS>3W@-vaB5!Ǚ.ݯs^ʷ#_2˰_|@i6t[4s!_&͛ѯ l[=$]_P=!?4G8߰$Ia;O*JE9w$vY^IN8JspTƑD:uyG]l*d"DF߁6 C0_>=?/ACfP]q4|P/ 5(;RO 쾊 endstream endobj 78 0 obj << /Length 1686 /Filter /FlateDecode >> stream xYKoFWPr)`iѢ END(Qٙ].I1of9p_NB/.O9 'ȓ(\LR"MI"Rr1 ~H4ʠ3<%<[x^o@y&apϙ=mf%<""/wL|FP< p02?eBvM3(3`^Z83 |#40EFҋ.22` )O1Y<E8 bGmmD*f* RQׅeke߳-9/X(TDn@/-<.< =fMHRe8eνj?t.,dP؆pBH\=9&CRMZ ەPy'AZܗ 7`vB$bж㄃PJ'{J$q2L$CwH1Vy Kb f 'U*2KG:o),rd9jFbf6=(h4a<„=w*ĆePl`p2$ZZw%7ȝw_wb&NIb>Z=]EIF̻L6/{Qa^EyzE9[u!yxS`r 6f E^C iK| X.>挢 &J5U\]2¤ |:|'26lrw -e\D~TGcpNh/ GTc!fڠ72l]nŋZcq+akrY_-Ι`Iγ <[ t.кsTI# ohCN~Z홒<}̻j<b.^Q[gO.ʃt)> G0s4LUM͇S :o!>0 {;O\k݈.0j gl) ^g38;{x Y*";.o9:̋E9]7&^ i;{GݍRo"F֯3J߅k6>l E~Y#5OfA*O>-}bl?ZNv '^r22 [w3mCe;wFlc֝P"V^0BJm+b Fy@lٯ%l}{ 8xmco EJ/^꓇<xq}Ӝ/wݦ"("Lә u ȧq:|HjѮ78cW( 3"k%T !hgH(SfP»md\ n 9uKcA\OQokOT){^ ^ں61wrZxmn+rJpޯöMiIMc V [»Pݽrz)P!5k!*PCMm6o9vw}ڤ{#g=TDqgX/slCfJ&̶ }ؔlg6 A,4lF197rLg27Q+WAɝD$*x7OP; y)/?uw]-pC"N"2\u<X endstream endobj 85 0 obj << /Length 747 /Filter /FlateDecode >> stream xڍUMo0 W调 L>,Kaakշ/q>6lkHJ4,=O$#نIvgQ2Ŕ1垙B ,[>.,DnrdIG.n\}}Tssj>p rquY!\\3e0eI KS[c!޻LITt,$i T/i%qD} ^5> /ExtGState << /GS1 90 0 R /GS257 91 0 R /GS258 92 0 R >>/ColorSpace << /sRGB 93 0 R >>>> /Length 755 /Filter /FlateDecode >> stream xVN0+l "!R{#uQ( ]14,Of2O(o"@4#!p$)H>}<$N_/N(PJ;u#_I%oKOp'Bp#q>Nx;LcpY Yg <-| OZQ3_`ų;/| 3s[$b|!8HDBG6Gi\x'ߝ rm5bjC95Dˮq)JRکui˛ۍbKI) 'h0p[%)'٨m6rSC;T>SŤ;rX׷`\N$ 3?geΚ2[\Zon <بqe3kkwcQ@mr mi*8?[Zm4!~71Z6ŇT\> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 98 0 obj << /Length 811 /Filter /FlateDecode >> stream xڵVKo@WX#G%Hqp*=q@}P]73;(XQ(,LeUUIO>̃r4ƆH ?/&AXky2c-2р+!V́V@)P/ᕬ[YQtֈ}=Pkf}<:6QJ‘fTT.N}',oYڊ<@3Z%ZM씳YEM?G& sQ+`1Ehihkf[􉜙5:+^gz=K:[р3Z]EhlXcņTNQ+g5@$h7~L"Ղhp9(ck@Il NȬ5u|#k-Prڐ'a$%Ch(uT 6,!a@aمU—%:s/ZIa *i[ф%oZUIG+ )[lmus%ݱq/rTwJVJ9}D7ӧCח ;UG?zh%mUuW9ێ..J-?:JaSϏk\º\=_Ҩa9rG0 ک̹.V9k`)t% P%uŜ?h"<I̖v! d?$Ysi/[-_L"\-kNuO*n.􎞽axe &39-$nTl^cw|{8g*MSV;N'Gu endstream endobj 104 0 obj << /Length 1817 /Filter /FlateDecode >> stream xڵXɎFWF2j̀ p8@IFFxOUu5\fի*3?\|ɨEb)"/4Ʉ6It>z2Uf;hU4F-fxME§hCM6mLh'bpKL0Aй<`PPڸmph5Z Gxv+x69ӡ,* W#RVdE XTOpnok ="ALs^3K/amߺL³|zM;}(֩LLy%Cos[e_Cs(F;5 9R+ߑpMH/g` 6 P9$":_oLs.sj|܋ 6tB$xb&H APRX,:9'YDx4MJ#RLـ}"vҨZHxsa*xG4$q9 jPjK:C)wn3tNޝPM̜ *qW4/TFXaU197ܺD \[)dt9gW_7== s6Т+$"hߟEhXi^R͛8)d(ӼZUPs(Q$Ov,?Ҳ+trH;.D4[טaAk&N|X: BSrMfGnc^9GL4.i(o5xɑTGo$5G9OƱjq*!vX*8KSAh :6{bk"Fů>La5, ?XpR Ș㿡h Y2}>nA݆N#QL6nAH+Ij5HO KH[Z>B7GmuCXYdt`N>ɃtTMę5\8>[M˦J-BCj!4X\*ĿU=6 wM# {scNaa%WYlD1D!H+<(4(R=(E?u.#'Sad\*S&sq)D)Bu>y_ըlI($>0n"8Ly>U| ejK4e_w cWU"G< [:al2qa2m+!?!Y|YM3u`z krYSr7Պ_,j5 =JwIr/N]ޱ@-9]InI&`v&UQ^6)1sCv{Z6Ɓ;۸WD>'`= xVRXa͙Vs;Εi VvB JVErzJ_t}}0B dephsow\7.][d/o;<@q)b]oW;_k?D}W}ՅJH8T5 {x&8Тg>ȁAv>k,} =%QQaԽkOWd6vȤ=˖]q]~Z{])UxOMWwmЅwٓ]{y8=tQmd،q`~C)\@04{߅Uk!w|JvFm1u-v AT\|n!5Fm P9fv682'v endstream endobj 108 0 obj << /Length 1063 /Filter /FlateDecode >> stream xڽW[F~_CPf\R5ZUU8O>`Qm6_s iՇ13s|>Hoymxi V@ldj|XD6ᧅ XX[X;&Ϗw@AV=rI ^'X-<9|uVc%b©eB>0Zܭ~xAUT9i}N혌JtŀșP@C7tDqGIne؏(*R|V' 4(x% 3jܿl ԑ̧}T7_ɿ&#TMY(gCQ 0qŒqMdYRTHKNJec-&|Wfs&ãʟIQK$}Phhh|LTad7J-{h@i֛ݠn?K\[ W{ \j KaHkr!aGVE>EkK@7w$(=Q\ pTw3g/`=»}Gi?UJN⢘6$9 'l&_\/*L&:[Kjʯ/'jxśKV¸k幉w52kAQ<#VuS&[-վ#݆Mi b_l#?UKȤ5R%N, +'js+R4}6Hɫ?+ =79/[_q rnkN,=y.O_"'Nole}59fyh266C| #7>/ endstream endobj 116 0 obj << /Length 1758 /Filter /FlateDecode >> stream xڭXIo7W9I@46[h$@AFV+i\o##lA.[H5ч %fo2)3f#$fybl:-G_ƳדvBHZ@oUGqr{>̯]J%JC\ܮvйcx;19M~Nb\cEɷ djƌd;n`qiï*UAN᷆kQQ(%Sk>0ief45:)uw¦2]`9p&+4HÇn4AGirpun};MG{ nAGT iZߒ[G~IH͟c*9F%E1$#;ߓHEQ s"$~şqNퟣ:'}7 Jh`k[A+Bgi?"Mʌ vnƟ& pE3=aޭɪ<0<̿w0L˓Z ݤiʼnc@+9 % I \ne( iO2Uz"]މkP 5|^s܃eX;äJ=-9@xD% ( FZ7LD5夦ՔQv*MYClȸ6`>Zm -[SqUp9V!9-f+nkf%_1 5;(YhY4v±sѦwnI+::ҲncǑ'Mm!~dڄy9YI`TCk 2rFyiv]{CA!Lj iδȠvYy:>Xm2q=[NCTg%}o7O{-5ODg“<g5w@7l'"~q'AX߁Qֺ !6AݸW' d&(O)A*_%KR6,OTdm0-HB,:BXPEܬ0&7yAZ%I!-2>at\ f{$%hpWtj#$ LB/r,s0oH1U[^F噄MA#KWm;1PEABNY^hw5/4pMZv~RX4T1yd'i#@S$fϝf l-rP,ΫOnN$ z5`g0Ȱ7t^ؙeW"*h`l'9%}+@#[bu/!AyTx\ X6+Leoh;t  rc@ֻE\NQ:-dx!Zlˈ coJ*aA pJáWѕT0/YGS˾dut;fYyI})8=eѰy-,<?:I i4X'07B5.3Pv£W:r͒TQ9 B*'5 azWzV aj5#mU'9PfEv mϿX;c z#H& H襁Kgp.];k/}o~̛?=D =>Ha a7> stream xڵWK6W萃 T 9|ܢZ Eں4glWl3$;7 4OD`cs.]O&Ig:pU!#Z1Է`N Yak8 d)&8LI̗i*қiLM!O{xMM3f8(hE8׬(ҷi +jzC?aoQh90;y5oqf9َQ*`ʉK"@M<LPzYr9 r.0PJ2N3-y:XgCYr R1Nqn/ bU܏r') z4'l|D ˴ L|q/FS'sM7MM88"f@_sKs/ޫgX,3(2[ik]p6(0])Urf1`Tq<0U ,R79oj`@Z^A Q^îF5IѝfXQYެuQ_2|~ ě3}xr+CqG@0.j;5/ uu݀a̩ԢYpXMŘ{ YXʔG2WP`B1:p(3hx\r M5d u(q!xC|q]ނ:-EL2b T"GQ]Bcλн-#3_Y~^ݿj }}ZƟ'/FB<`Өг[XhiW[ x? E%n))/}';EGZo_zQɇ٫n'JjlKR1wC6 bX HD$tL$`@l=QSpoUlsX{cXNhguWe>9:;ck'ZMD_EHwl 9SU1p鐫"7 NϼHAi5,;ċm;ݛ a5L;YVZ,^pRء8 X!b%5/Kh8~df^tK@wFF17(c[yn endstream endobj 129 0 obj << /Length 540 /Filter /FlateDecode >> stream xڭTM0W|p@Z]VHa[JiSv3qh.!TN3ofE#d֪<+-2&f.Oƈ] SNoh6/Dd.ʦVEr\h8/Z+ͫ8)\Vqae\>ц 4GBh8%-A8.v%mÙƚtʼnd>g X8 Շ g\HHS@T!npB@&qlӜ&U&KFRrxeܙƦyoWf=>SYvyF5V/Eiq+qEY2cMwu6Sѵ>/_~{=u cfj}ڲ C^z}ĭ#!cjlX:e]0ӻ* 5 endstream endobj 113 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/over-017.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 131 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 132 0 R>> /ExtGState << >>/ColorSpace << /sRGB 133 0 R >>>> /Length 636 /Filter /FlateDecode >> stream xVMo1W̑: J"q8zJ%ןk`ՅCSO}.8?s}3xoK+`sﯦ>Z3䪜}uYrU1u\+\+\^:PʰCЙp1R}qF5> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 139 0 obj << /Length 603 /Filter /FlateDecode >> stream xڽU[o0~ϯ&RxqbC $J&* 4+/v/e*MUlkjg˜Ӌg8Y6gBJ)J,};@H7{ȧeE([B=' aAȭMOE=z ]{&K]r y#ҬCcXcلU +  n!V:W{]8ѡ @5^Ap۹ %_l7H{_ӢGJGJx`}=:ׄ$@i( cۆr ܓo:[h;m}PI  B=HeYAUCW|iQ&6K[gS\ s9h|&A xlr~:> /XObject << /Im0 142 0 R /Mask0 143 0 R /Im1 144 0 R /Mask1 145 0 R >>/ExtGState << /GSais 146 0 R >>/ColorSpace << /sRGB 147 0 R >>>> /Length 179 /Filter /FlateDecode >> stream xNA @ fu* ڃ *X>A LDPApCKk]@R<'3G[< ?0 dž_ ʧĪQ,6}leNCes#5-I$f^ѐj$P ,;Ֆ]E$ endstream endobj 142 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace 147 0 R /BitsPerComponent 8 /Length 375 /Filter /FlateDecode /SMask 143 0 R >> stream xq0CQߟa>8ے(> w/KQjCi;6q}2%GL1 S k"dj`+X-XisQlt94)ucH*TYl&b#5ai2T&SI*d1gxunL4ZÅ4 U:KÜU: K)Ew"EwEW#%Rڋ%^ڎ%KP66m,A=Z,AZ,!k, ecH_,&s9i 6f0@fˌ™1R1F H,,°pNn !aXҶIẓmkI{|]!f/*b2e&= -e4 endstream endobj 143 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 244 /Filter /FlateDecode >> stream x O{ic\h5 $c|`|0985FN prV 0rj]NhU\gmWsav=j0Q3b JTˤ֓Mv.fŖUj6ۯV2QW_ΪUVzZ pU̬e\8Eks4ŕ&`E)y0jqN*Z˵*ru,{p#7/5w endstream endobj 144 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace 147 0 R /BitsPerComponent 8 /Length 150 /Filter /FlateDecode /SMask 145 0 R >> stream x A 7E">p*pޞd,ɼvJ%2Kd,Y"3f'sTf%2Kd,Y2y}-2Kd,Y"Df̘̅R%2Kd,Y"DfNB%2KF2̅#̻ endstream endobj 145 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 77 /Filter /FlateDecode >> stream x AoZ%8[@ tڌbI v0 f`0lEg``  Zn d endstream endobj 148 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 152 0 obj << /Length 853 /Filter /FlateDecode >> stream xڭVKo0 W=9@myvث.;;h,5ߏXv5Daʂ`Alr(& )6fRk^8Ϝ-Җ͖Gff_2vFl2[ԛ{6([bsJH!RӖ{74ϜJ}Kk ✚$#Q5t:R1OTT`J^ZG5%PߌہO[ML\$\|zy_W$̥\zlaϭoU Hb=,mՔNm-9% ,N"$IHMHRTs¶vU/AE(X簃і;A!g}{uiw$| (M LN>&8 I,4BzkvdZ=b}Z|_{6hT 2C7}FXMHL՛ 7FȋܺjW훠:u0[+<KcfGJ QFM^Ht$&GR?,{Kqo{ESd;%e넭:l7nHئcqvmD:(rS5f@XGTW%_aw* R4`*hx endstream endobj 149 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/over-020.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 155 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 156 0 R>> /ExtGState << >>/ColorSpace << /sRGB 157 0 R >>>> /Length 290 /Filter /FlateDecode >> stream x?O0way=VT H Qĕ* t936`8-pE0d- R7 ViZ^c ?oIOL LM'Zf> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 805 /Length 2151 /Filter /FlateDecode >> stream xZ[o8~cly`4i;vE\<(6hXI6~#9ǎ:,vRṟt1#gֱȂcJ)2%S!cjAfF{* ӑYl`X Y221s$|ZJ87cɛuzéY7i\}>*; ZpXavza:xvsDdxW4'>&&>ݤqS#c'>TTSQkW~N"S~c]=0%R#;K9GiiDm \7nݐuC'EoA̖mOM.'ޔV y!~\#@rZi4tGl}W ciTEPlĀd^+ٿx\KNQ4ru^ b Rc 2G-_+ۣ*B7F@шNkR,b-"qey8#VU!m_&3BY;nZ=g螹2VGO8q d4XIjZR9bKMhU.ҾCKh{V;729 9:sx{6o껭 X}c3񨯅n}g/џ %Wd86ȍck1,kލ0GcݧtJtw8lopWpRfN}rg{lfL/J-=ɛ^s^֢ؠ|hFx󉽯_vJ( n)KQM1,zפl(]5(VV J8 1I}EQ&b4H&WX\V 4$7bP`G ҕӘ#Faz2fOQ @YW6YH-݌XJjȕT[xf7 12͵[YWYn E|OuKe9nUgƭ :)i+E7X;<#Qrluy*%Cß! Cz иSyF8:pCw#X:Yg> stream xX݋6:Z, -t]i)>lM{I|sׇ^)}-i4Ȏe?~FArg\0{teKRe$-p9ѡLtøntC nu|nS(ct0Z ȦxVDz'}*}&= ~srۘuAJh{hGIxmǯ4 @ P$0"`0_Yb -&8.y| Zqgnj="L;} m@L?B;/˄Ը^ӲF)!>5FG&˔ $qQ1Nm%`ҡ(Is!`<^i 3@%#tB؛MvXzK2 3u%̒p<H, $rL\r-,5WkQ o^ezW 1nC[~Y ,eQ\PM7;#9ע<[-=͓4ݗC׸CoUdjMfdhTIBVr?)?| :V=CiKpJG4,K8d ,RVXJ#Ky6լTr%2+oNr@loʗӘE+[[[A3Rm!- I^((k["+JT$k#S H}b.zR=`2kH11&c,$/ڂb$-#c}ٌY3gRn6@ z(bA*#v* r~ $qOl3W#QTѽbiFQ>-UACɄ49䊳5zIF}U_f 6\/(im?)p\kv3WR@Cu -2$YXu0AӥO-į>.Wˆ.V6:5592Gx;_вyj~/2/$eIܐ.T K8Ȏ&^oe.ڀ>sd(s/ ܑOGm[FoEP%hn?O|~:!d{PS~;꒫F%=2?O9 QQY&wv  endstream endobj 171 0 obj << /Length 1702 /Filter /FlateDecode >> stream xڽnFCi$bf{-ڢHT@K%fH9  p;f735{}diyU9*7ly=Iy9˳"6I6[g.uioaW 0k5Ԗ u񬑳Y]/ufa5mPKN[YpbORc"Lmc Sp$j6' , `OU, Ini2iv\&tIs:mro3l@Y%X*(KS0 @ $7@;@+z>fWio\#N*M(oj"! L͉7ʪi '~vܮgsۡwHpko0qƁۭL(x 'r.m V SLL_Rvx6(Kbۓ@3SIo!Pb-ǓIx;aUb9P/wM~#9c}%%}RZڕ0lS༲P{Qm͸ֶ#Vx?}-/ൔ!爑/;uan5rpu#ǏҘzrϓ> stream xUKo0 W调 Ԋ(!wCذK ;t=,Iߏ<` C@I#Z׉7VU6@!m-Q-[X~a-E/3}7M&WNԪ.M)KSaVK cfe;;0OM%YfŪ=4odթqM?L*OV需L[ f[aM!'xLDu]"J=3Ҫ:Wge0p8rF_u]1{jq DT]\ N54u%7۝o%;9w0NvK64,nm\8ʞ#N O|Dϱt4 #]1W0^_f|F0Pyn\BqDmJ pῃRq=)K9ZQ <.OyZ endstream endobj 168 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/over-025.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 179 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 180 0 R/F2 181 0 R>> /ExtGState << >>/ColorSpace << /sRGB 182 0 R >>>> /Length 500 /Filter /FlateDecode >> stream xT=o0 +86C皠-3СȔ64ϯdIθ12#'7@'F1 3phwxA\F5-U?nAOEpU_AM]3Fp ^S>EK K Kޣp9r gT}毆jQǻGu=c%ʫ`'(.Q0Շa̽.&ھ^`Ԗսz]0j!V ŴMy%Ov8L#M|42|3/We;?﮷}g/@`tfW9o;lNW.Ϯ* ŵ]8'^54p}_Qk6ދA`##|VX&q\K\ }Q`9N4 mew"it٦ZP({sRm KJڔдr1tlBv endstream endobj 184 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 188 0 obj << /Length 918 /Filter /FlateDecode >> stream xWKo@WX-e_7@-©`׍UbJkӤ5T*rkfvND'oϧ_W:IidzTU,*e]LQ03bw`&(\A^XGSK:끎Ѿbǯ͹[75lAdr(s9C7;zXz'GLkQdz^Y.=|J;C2JJh0({xX#:0g MXFו άO_Pte]DŽ6]ZQ*:L `%`?a zr,Y]ËYMN6:81 b\SḊl,1M:FdLU`IN2JOEԜ=c59^C.xE(K?1Za^3(J8W2M͋^*8yMH 蚡5wLom_nQ, H8eC50aErg J_$;*r u sӵ*@A2p [ڧ m1@6ɝ&A.k;bK) y(ySxx|_wu$i@"xh0 Q>B ?h?([%1> stream xڽWKo6WA2s(ihMТ69hmE ˩$Тdynb1Ky87?NdTG2YH^X/\2*Da2Fd6l mhTxTq L%,; Z'-gRJXT|˪_i ~K_t >a)<=Uzz^[vkV7@{fj=9~I|%(⛉kk35ii At5ͱYX1+t "7nYɑܜBrp-;Uh=7pjՁuOV (k6QO_(Q[G"[%&SLwX{%Q Ω>a*}K_}C0eQȤ0!'TX --{0 `. ߓ v:> /XObject << /Im0 198 0 R /Mask0 199 0 R >>/ExtGState << /GS1 200 0 R /GSais 201 0 R >>/ColorSpace << /sRGB 202 0 R >>>> /Length 37499 /Filter /FlateDecode >> stream xT$[epRH$4 >nƜkJuV^9̓_|~|>y}<?Oz^sۿ>>_g^LߏW뿻__Ϗ?o?}_9?^|+׿׻zSW|yyx}q^||_StFk#o^|s|^_|fW1|]#FޏkCƷ15x?}z>/׿9}~~c2L`g,F>c2L`^#|g*Ff:Ϙ >S5e2T|.sF>5F>2uFS\ϩs*c>k94F>2s5_ϧHx<>2s:>gNg8?g=F>6`Y_u2泾|mY,c>kg2^Ϻ >5೾|e#oϺ >5e1e3{W|eyQYK <5e"y^j𼬑#Ff:EG fO" y^d|`^#K 5|,~=}|~eg9<>Ω<2xNk0s[FS2xnk9,ϭ 2xnc乕sZy<5xns#os+蹕sZYm<2xNk0yNcds[Vi fieg~@xk˘g} }Oѳ/c5xecٗ1<5ٯg=F}<5xe̳Ͼ <2Y_g_~<2Y_g<5xYg_Ʒٗ1<2:g_Yơ3OmOk0xS2f>>\#t٧ktbt1t٧6ا5e>]c i fOkOmOk0>]ce|S2:٧5ا6ا5`1TFi2f1٧k>>,ci i 5اk>}#o}j}ZY8c~oyk| kek0`'NFvr v128tF;Y;h'``NN\;;Fw0Fgd2525ecd'``^#;;ye|v vp fON,#;Y;5kd,\,\Y;;Y; vrdkd'`'#?8#y^ޱo^q]z525ekek0`'NFvr v128tF;Y;h'``NN\;;Fw0Fgd2525ecd'``^#;;ye|v vp fON,#;Y;5kd,\,\Y;;Y; vrdkd'`'#;z[;~x'^oNN1;x v vr vkecd'˘;y55e:,cvdON1;x v v2Fwkkt'`'ѝ,\,cvdd`'`'N1;x v5kkd'd`'xvkecd'˘;y55eke^,\,cvd2fNg^|#'][N^cveN^cv vr fטl\Ydkט,#;9FfNN,3mk0˘#;;s5f'ѝY5f'`'`1;y65eNNN;y2cd3mk0xd2f'`'`'`^d12˘d2f'1;;565NZ{~חC;2vr v12`'`'``NN,#;Y;5kd,d2:,\Y;;Y;sekek0`'`'``N,\y5cd325e?6?5^Ȯ|\N,\y5cdNN,\,\Y;9Fv vp 5kYơ325ee~ۧ}z=$G~Vާk>}3ا5ט}*ާ6OcdqS>}3ا5eTƽO i f>]c>S>}#CgO i fO>}3ا5e``>qSݧeTƽO i f>q7}ZYƽOט}fOk01TƽOmd,[gO i fO>}3ا5et٧oOeFi2}*ާovqף9?z;A3\_ⷝ\,\Y;9Fv vp 5kY;;Y; vr v vp f25NN^#;8Ffh'``d225kt'`',\,\Y;;Y; vrdkd'`'#oN,325ecd'``^#;;yاK}zooT iSkd`# i g fS2ا1Oe?k0}Z}Fg2>,3ڧ2؟5eO1Oe?k0>>YT i g f٧2؟5>>]#3Ff:}*YYSgOe?k0`>Fi ٟ12k}]~Ώ_y^ڒq}k~7??tF;Y52:,cvd2fN^#;;y vpdd`'`'`'˘;Y;9FvkNN^\#;Yơ32fNd`'`'ct'˘;Fwr vr252fNNN1;x v vrd`'\;FvoN1;x vh'˘;Y;9Fvkf?әh>}=HЙݧ6ا5e]ce>]c i fOט}j}ZYSkOט}*#4Ff>>,3OmOk0˘}#s5f}Y5f``1t٧6ا5e>>>t٧2Ocd3OmOk0xS2f```7?zMqA|5kd,d2:,\Y;9Fv vp 5kY;;Y; vr v vp f25NN^#;8Ffh'``d225kt'`',\,\Y;;Y; vrdkd'`'#oN,325|?Gz<gs^ws/zqo;9Fv vp 5kYơ325eo{{]{ z z fh``^#{{}e:.^YSgek0`^^Fz 12````^^^,#{]{5kd,u2:.^Y{{]{sekek0````^.^y5cd325ks^EX `W]-_s} k.YwC 5ep7n]PYƩ3dp`^#wC 5r, 2 j0x5ep7 jp7 Ff 5dp`PAwA f 1r7.F k.Yơ3dp` 2 j0n s 5j.,w 2jp7.,!F5Pa12yb9i^Ws^q^_;A3GnAwA 5r7nX#wA2jp7.,w 2N jp7 Ffn]PYSgt7.,!F5Pa12n   2 j0nAwA 5r7nX#wA2 n]PYwF5knPwFg 5dp`PAwA f 1r7.F k.Y{*k9~~ky^}׷|eZxϯe_l}_jpؘd 5_֘EI/2~Ycs"c5~1/2N'kp/2Oj~q/6>YESg~1/2~bc5_~Yc'5rȘe_l}_֘'kpȘO~Ye_dp"Й_l}bc5_d#O~e_}_֘'kpȘe_l}_jpؘd }O;{5y߽~2|^ԙkk^wU2ҙx̝!#Cgt,{ 2b䞓=Wys5=# s2j0='{SgtFsk䞋Yơ3dp`s2j0{N\ 5r[#\2jp,{ 2b䞓=Wys5=#Cgt,3dp`={N\ joFgs5dp`=W{N\ fs1rq^=յGE3+?qo^q?9|-c|ofY#c5}͸C2kpg,2k0;wcdql5epgΖ]Ywv2k0;wcd];[wt f5epG`ql5ȝ];{128tFw 2:;[wt f1rgFk䎎Ywv l5epgΖ]Ywv2k0;wcdql5ec~eUc~u~Nט"Wkl~NטAec~38uf{X zLU#=&Й1_kc2֘1=&czl1_kckc51W5lLAɘ[czSglLAA1=&q51ckL٘Z1=V1== FzLc6֠dL1=fck zLƩ3c6֠֠֘AH8tf{l٘Z1=V1==C{=V#=&czl1_kc2֘1=&cz=fck zl zl1WCglLAx51c1c6֠j8c1c2֘1=ߗϼSl5}-} zF,Fz,FzlXX zL=V}VAɠjj:AhHH}V zF=VAhՠjc25c1jc51XY z=&>qzL=V}#=V[#=cơ31XY z=&>AHɠjbjckblՠjc2X zL=V}V zF,Fz=Fz,YCgc2OQɠjjc1c2}VAɠjjc51XY z,FzL=V}#=V[#=cơ31XYΨdc5g51 zFϣ_О1 Y z=&>kK~_+*%^q )u+ZoMWA`Aՠdp5HHӭYMWA`Aՠdp5e:A`^#M#MF.FfΨdp5et5h:4\ f4] N Wy4]4iet5h:4\ f4] N WYƩ3j:4\ 5t5h5p128tFM',Aɠj0ˠbdp5HՠH,Aɠj0ˠjt2h2NQɠj0AӭYơ3j:4\ fOQɠj0ˠbdp5HxhϿ5]2h4  M',A`^#MW[# #Cgt2h2:A`Aadp5kjoMY9ZW{WOyO[V[ՠdp5et5h:4\ f4] N Wy4]4iet5h:4\ f4] N WYƩ3j:4\ 5t1tkbdq茚N WYMWA`Aՠdp5HHӭYMWA`Aՠdp5e:A`^#MW[# #Cgt2h2h4  .FN Wy4] n4\2h4  M',5 i4ie:A`5  .FN Wy4][,Aɠj0ˠjt2h2hi:4\ 5t5h5p128tFM',3j:4\ f4FN W/ѯqhϿ5Fgu4kY?t3^ߗZ#n5lLíAɘ[c44i5lLíAӭAՠdp5t2֘1 M'cni:pkt2N٦1 MMWAH8tf44i5lLíAɘ[c444] N W#M'cni:pkt2֘1 M'ԙm:pktktkLɠjd:Mgcn N4t6֠dLՠlLíAӭAӭ1M'1M4i5h:tkL٘[q6i5h5h5dp5t2٦1 M'3t6֠dLՠlLíAӭAӭОwHɘ[c44i5lLíAɘA٘[[[cN W#M'Йm:pkt2:Mgcn N4]4i5h5>^kONs^qS^{[#M#Cgt2h2h4  M'F.Fn4]2h4  M',5 ii5t128tFM',Aɠj0ˠjt2hkbH,Aɠj0ˠjt2h2NQɠj0AӭYơ3j:4] f4] NMWYM#M'FMF.Ff4] NMWYMWA`qꌚNMWy4] n4]2Qɠj0xꌚNMWYM#M'FC{bdAՠdt5et5h:4] f4]4 i4ie:A`5 oF F-FZEj{~kZ_j|ki5p128tFM',Aɠj0ˠjt2hkbH,Aɠj0ˠjt2h2NQɠj0[# #Cgt2h2h4  M'F.Fn4\2h4  M',5 i4ie:A`Aՠdp5et1t2hkjtkbdAՠdp5et5h:4\ fΨdp5HՠH,5 Ψdp5et1t2hkj<ߚ.Ff4] N WYMWA`AHɠj0AӭYơ3j:4\ fOQɠj0{\H=vo=u/2z,FzlW2Qɠj0ˠjc22 5_12ˠjc22 Sgc2kbH,  z=&,Aɠj0[## z=&,Aɠj08uF=&Fz=F+FfΨd_5ec51W fX ec51W fX zLUYƩ31W 5c55_128tF=&,31W fX Y=VA`Aՠd_5ec1c2kjckbdqzLUYSgc2?4~W43+wQ0.cUtl٘[[Aɠjd:Mgcn N4t6֠dLӭ1Mgcn n M'1M4i5h:tkL٘[q6i5h5h4 FNơ3t6֠dLӭ1Mgcn N4t6֠֠jt2hi:tkL٘[1M4i5h:l٘[[[cN W#M'Йm:pkt2֘1 M'cMgcn n nFN4t6֠dLӭ1Mgcn NƩ3t6֠֠֘AH8tf44l٘[1MW1 MMC{MW#M'cni:pkt2֘1 M'cMgcn n ni:4\4CglLíAөkǞWl^qh z5c128tF=&,Aɠj0ˠjc2kbH,Aɠj0ˠjc22NQɠj0[#=#Cgc22 z z=&Fz,FzlX2 z z=&, ze:A`Aՠdc5ec1c2kjw Wc =kA2֘1ݳ$ԙ =kAkA5 tOtCglLAɘZc:tt5lLAAՠd=5A2֘1ݳ$c:h =kA2N1ݳTAH8tf;tt5lLAɘZc:tttP :HS#$c:h =kA2֘1ݳ$ԙ =kAkAkLɠ{jd:dcg :Ht5 A5 =kAkAk:h =kA5A1Ak{bdL1dcg :HtA6{֠d:dcg :h :$qv5 AkL٘Y1t55t F:HtA6{֠dL1dcg :HƩ3A6{֠֠jA2 l٘Y1t5 AkL٘YZAɠ{jdL1dcg :HtA6{֠d:dcg :h :h tOtCglLAɘZW{$c:dcg :h :h;F:HtA6{֠dL1dcg :HƩ3A6{֠֠֘AH8tf;ttl٘Y1T1ݳ9y];3yk Z Z-%\-іі,AKɠj0ˠjR2h2NQKɠj0Z#-#CgR2h2h Z Z-%FZ*FZjT2h Z Z-%, Zii5R128tF-%,AKɠj0ˠjR2hkbHK,AKɠj0ˠjR2h2NQKɠj0AKYơ3j)T fT_,AK`^#-U=R12ˠjR2h2h ZSgR2hkjRkbdqZJ-UYSgR2h)뚹b~kya̷AKɠj0ˠjR2h2h کsF[F Z-%v,AKɠj08uF-%vFZ*FZjS2QKɠj0ˠjR2h2h کii5N12ˠjR2h2h کSgR2hkbH;, ک Z-%v,AKɠj0Z## Z-%v,AKɠj08uF-%vFZ-F)FfΨdN5eR5~Z Z*FZJTyT[K,AKɠj0ˠjR2h2NQKɠj0AKvYơ3j)S fOQKɠj0o|uUg9ޮW0?.bH,  z=&,Aɠj0haj0:ˠjc22 Sgc2kbH,  z=&,Aɠj0[## z=&,Aɠj08uF=&Fz,FzlW2Qɠj0ˠjc22 5_12ˠjc22 Sgc2kjckbdqzLUY=VW{j0ˠbd_5HxhϿX2  z=&, e:A`v8oqy.+ߕvRpq؛q zl5lLqL{͸K=&1wwɠd=&7/X z=&qތdc2q؛q zLƩ37/ckL٘Z#=&Й؛q zLc2{3Aɸ{Lco_25֘1FzLc2{3Aɸ{Lco_21δތdckL1=fckCgco_21wɸ{͸K=&1wwɠ֘[cz1wɸ{͸K=&1wwɠd:{3A1=&1_kd:{3Aɸ{LƯzL=&5ތdckLxhϫHɸ{Lco_21wɸ{͸K=&ԙ؛q zl1w٘Z#=&Й؛=USK=Y^UJym^{]woMWA`qꌚNMWy4]4ie:A`Aՠdt5et5h:4] m:6]6Fg4] NMWYMWA`qꌚNMWy4]4ie:A`Aՠdt5et5h:4] 5t1tkbdAՠdt5et5h:4] fΨdt5HHӭYơ3j:4] f4] NMWYMWO{j0[#M# M',Aɠj08uFM'FMF.FfΨdt5et5~ߚ .FNMWy4][,Aɠj0ˠjt2h2NQɠj0AӭYD}_םzzuݽX zLUYƩ31W 5c1ckbdqzLUY=VA`Aՠd_5k0c5_ec51W fX zLUYƩ31W 5c1ckbdqzLUY=VA`Aՠd_5HHY=VA`Aՠd_5e:A`^#=#=F+FfΨd_5ec51W fX?Fz,FzlW2  z=&, e:A`A՞21W 5c5o=# z=&,Aɠj08uF=&Fz###:s뭼*WV^`~\W[ՠdp5e茚N WYƩ3j:4\ 5t1tkbdq茚N WYMWA`Aՠdp5k0t5pet5h:4\ f4] N WYƩ3j:4\ 5t1tkbdq茚N WYMWA`Aՠdp5HHӭYMWA`Aՠdp5e:A`^#M#MF.FfΨdp5et5~ߚ Ɵ[`^#M#MF.Ff4] N WYMWA`qꌚN Wy4] n4\2Qɠj0ˠjjϿ5] f4]4 iYMWA`Aՠdp5e:A`VL=JO5lL,GglL,ԙ1_k0Aՠd_528tf{2֘15lL\#=#=F+FgckL٘ZYc6`q5נjc2e:=fck fckL٘ZYc6`^Aɠjd1=5eL1=fck fl٘Zy z=&Yơ3c6`1=Ư{l fckiϻ`^Aɠjd1=5eL1=fck fl٘Zy zl1W215~ck0˘A٘Zy zl{FfckL٘ZYc6`q50r~Z={]o=VA`31W fΨd_5HHYơ31W fX zLUY=VA`hhatAՠd_5ec51W fΨd_5HHYơ31W fX zLUY=VA`^#=#=F+FfX zLUY=VA`qzLUyXe:A`A՞2o=VyXec51W fX zLUYƩ31W 5c55_128tF=&,=c5ec1c2kjSdoZY]X.A`^#]#]F:0Ffta PXYƏΨ eЁ5e:.A`^#]#]F:0FfΨ eЁ5eЅ5Bt` fta PXF]XY]X.A`A֠ eЁ5e:.A`^#]#]F:0FfΨ eЁ5eЅ5Bt` fta PXytateЅ5Bt` fta PXYƩ3Bt` 5҅1҅kcdq茺PXY]XW{ k0ˠ kiϿua 5҅1҅kcdA֠ eЁ5eЅ5Bt` fΨ eЁ5H֠ H,u : Ư[`AHʠk0.ОePW5BZ +_x}^ ysMgWP,.sjSgښS󽭑Yƴojck0˘\cƴ2-ט1-e R-Y#i5-mLK,Gg-mLK,ԙmKӒk0A[֠-eВ528tfƴ2-ט1-i5-mLK\#m#mFZ2FgӖkL[ژ\YƴӖ6%`q̶i5נ-kЖ2he:micZr fӖkL[ژ\YƴӖ6%`^A[ʠ%kd1mƴi5eL[1micZr fl[ژ\y ڲm)Yơ3ۖ6%`1mƯr fӖkiϻ-`^A[ʠ%kd1mƴi5eL[1micZr fl[ژ\y riKd2ٶ1-i5~ݖkAʠGk0ˠOkЧ2kOcOH,>AʠGk0 zSgԧ2kOcOH, z }*,>AʠGk0hbOkG1:ˠOkЧ22 zSgԧ2kOcOH, z }*,>AʠGk0>>]#=# }*,>AʠGk08uF}*F4Fth2QʠGk0ˠOkjϿi fi?>F4Fth2 z }*, ze:>A`A]՞2SZ 5ҧ5o}# }*B|*Gޱ{WGzo[wLz f:ƕ^y4n4ieи5xd`A֠qeд5eи5h\4m 5Ҹ1ҸkicdA֠qeд5eWM[YƩ3j\4m 5Ҹ1ҸkicdqWM[Y[ƕA`A֠qeд5kq1ڸ5ڴeи5h\4m f4n WM[YƩ3j\4m 5Ҹ1ҸkicdqWM[Y[ƕA`AӞkkqcqH,ƭAʠik0ˠqkи2h2NQʠik0ƍ]#M#CgԸ2h2ho[Y[O{qk0ƍ]#M# +,ƭAʠik08uF+F##M#CgԸ2(-O>Z[է F-Ƴu߇##MbѺñAh-iܯ+CԸָS2qk],WgԸ2xk0ƍ]#M#  2h4  +F7Fw4m2h4 Qʠik08uF+F7Fw4m2Qʠik0ˠqkи2h2h4 s6.FF +,ƭAʠik08uF+F7Fw4m2Qʠik0˺,9,s+A/ Og̡ԁޮUEWYK #wt252525252nQǕAA^#7F:1e:+N[,[=525^ytkHAǭAǕAAAǭAǕAAq: :m 5kHq: Z UK ˠ]HǕACA^#ƷGǍ^s36y~'?_⎻٘52Nَkc~ ˸tf;Y_WFkLǵ1v kLǵ1v kLǵ1v tt\t21t52Nَkc:dlǵ1v tt\t2َkc:dqטkc:dqטkc:1qH,c:qmL],c:qmL],֙6ӮA^[+N[#Yơ3qmL],c:yw52=y :n : :mdqטkc:dqטkc:dlǵ1v tt\t2َkc:dq׸tϻA1wyw5kqkqeik$˘t\i ˘t\i ˸uf;k8tf; mdlǵцAѶqw],mk :64 m[ߺqk$;s?'ϏWmj׻z ~e A^#}=F1ek/OP Sge Aq >A5kH__#ke:| ˸tf;A^_/_#Yt5dc>keL_c:keL_c:kננˠH16Aqv~ ˸uf;kננˠHqv~ ˘οt~ ˘οt~ H珑οF:~fטoc:dטoc:dl1 tt~t2oc:d׸tϻA1yw5kkek$˘οt~ ˘οt~ ˸uf;kננˠHqv~ ˘οƥ{ޝ ktϻA^_/_#YFt~mh_6ڶ04mh_6no ˿7R3emh_6o ˿7Fƥ{ޝ 16о{#ema|w篑,m c:64 4OΏ|m>vC >2$ `7S(Or vC >2$ #a2 5\,|ke\: Or  1N,PO >52 5 2 52 5 2 5kd7nX#;!F vC v vB Sgdje: PFvC5b$8tFA;YA;YA;FwFwCfddh7`' #a2nNAnqd/PFvC5b$`7`7`' `7`7`' ˸uFA;y kd'Hqv vB vCKc7 `7x5bd7#YA YA Yƭ3 2hh5kd7`7#Yơ3 2hh52hW5.P,v#A yߺ!F U v Z ϧxC?|?y~߆}1=ֈ,QO 525$P,QO 5kd{X#[#F G >26 8uFC߆dh{PFGl55b$`{,oC G F G F 1=ֈ,Q!Q,mldh{`k #cl2֨A֨A֨AQ[YۣC[YۣC[Yƭ325kd{X#[#FCg=d5je=j\ۣYۣKc{ #cl252525252n֨A^##F1e:!Q,Q=52ڶn^mh_[˿??m[61em=602ڶn^mhdh{hC q~錶g2цAѶuhC hۺ{xmamۺ{xe,m ! ,m JsцAs~o'G|WG߿ To 5kdZ#'F 6P Q2V `%oe 6P Q2V #hl2@5F[Y,m |+ke\: $oe @1扑, To 52@5F[Y, T $SF6Pl5yb$``` 8uFHYƭ3@2<5kdZ#'FCgdyjejdyjejdyjktathAAq6 6O @1扑,m ldlA=@5kdZ#'F 6P 6 6O 6P 6 6O [gdyj F6Odh` ˠ]ոt?6P UA^#(F6<1eЮjdjeЮjdje: $VF6P 6<1e: $V,vU=@52hW1dj{b$ˠ]`ɠ ˠ]`ɠ k@@@k7|+ 橑,c6152f1(\,c615kjdyj$˘ |l̷r Sgv٘od15kjdyj$˘ |l̷r @k7|+ ˘ l y 橑,c6lY,ԙ@6fAqn y 橑,Й@6fA1h@6fA1h@6fA #hl2f1l52f1l52n dc65@5@2<5e:l52fqZ,c6/@k```H1h@6fA1h@6fAqn y 橑,Й@6~Ҷ02ڶn^602ڶn^60km{d,me ,me ,֙@60k_:Hن6FCgvhC hۺzhC hۺzhC ۶uۆ6F-@602ڶ04mhd9mC k} o'Ϗv+L>z[l52.PFXl5b$`-ۡY[l52b5fvA^#[,F^1ej͖P,m152.PFXl5b$`-ۡY[l52b5fvA^#[,F^1ejdje:-&U,m1l5bd#Yơ3b2^52b5b2^52b5^[FFXn/fll1ldll1ldh`{ -#[ll2Aqldl/-VFXl5b$```{ ```{ ˸uF[L۫ylbkd{Hq茶 Z UKc ˠ]xl5bd#Y[L Y[L Yƭ3b2hh5kd`#Yơ3b2hh52hW5.-V,v#[L ylߺ[,F U Z U Z [gdj׸tm|OSZ㢡H֎bgE{{x)~Ǟ Yƥ3s2ajȞ=F[d2ajejp;A yskdH YƩ3s2aje\:='yskdH Y{ nd2ajȞ=F[d9dh` ˸uF{NyskdHq [ \ [ \ǞA==W Y{{NY{{NYƭ3s2o5kdȞ[#-FCgdjej\{Y{Kc =#{n2s5s2o52s5s2o52nў~A^#{.Fo1e:=' |m[ǞAѶu|=G?2~ڶȞ[ |m[9mh;h¸Ҝj`9mh;8tF{n |hhC?Fƥ{jem=' |m[ߺ{.F- 6lma\iN502nўцA^561e:gS64 =c ? ڄo kpAq6 n5 cd #Y7 ndl02je kpA^#0F6ـ1e kpAq6 ndhA^#0F6ـ1e kpA& #[Y7 n5 cd #Y7 ndh` ˸uFPylلkdHq6 6` 6a 6 6` 6a&AMMXYPYPYƭ3ڄ2؀5kd&\#0FCg eke k\YKc M#pl2؄5؄2؀52؄5؄2؀52n&A^#0F6ـ1e:M(V,vU=؄52hW5^ylلkdHA&ACAA&ACAq6 Z ل5؄kdHq6 Z UKc ˠ]&ACA^#Ʒ&,vUM(V,vUM(V,mB45 k ,mB4d:4dٕ]9ٻrzڕȹf]icn52.]icn5k+k+e#k$˘]R6[,cvsK٘n ٕk-ecn5k+k+e#k$˘]R6[,ԙݕ6[,ҙݕ6[R;Fٕk-ecn52fW1 ˘]R6[R;Fٕk-ecn52N]icn52n]icv5ؕ5ؕ2ؑ5e:52fW152fW=]Fve5#c4˘]J# ˘]J# ˸ufwّk`W`W`GHqJ# ˘]ƥ{޻r ٕkt{WA^]Y])Y#Y5fWژY5fWژYƭ3+m̎\R;FCgvWڠ ˠ]ոt{WAA=]y ve v vdd+mjeЮj̮ACAqJ45ؕk̮,Йݕ6hh52hW5.ޕkeЮb+mj`W{޻F Uٕ6hh52hW5fWڠ ˸ufw Z 5fW`GHqJ4d: Y*_<ۋVM6}_,ڦئ6}mZNe KgMep[ m#tl2ئ5dp[ `ওmY,mZNe ٦1M,mZNe SgMep[ ˸tFTe ٦1M,mZNe i n:ܖ52ئ5dp[ m#tl2ئ5dp[ 8uFTe [gMep[ m#tl26A66A6=ئ55M1Mktb4``` ``` ˸uFT[yl٦kdHq茶 h iKc `xl5Mcd-#Y۴T[Y۴T[Yƭ3ڦ2آ5kd6]#[4FCgMejh1cVFշ4ml1~ڮgVƌ Z6gķL^16m3UlHjm"#+oJo*6h$5PjM|TA#цRm14m(1/[#+ՆRm14m(5~uF[LFJ1dHjtŎQ[[Dj-Vo ndhvA^#[,F^1ej͖P,-V-&U,-V-&UFXl5b$```{ 8uF[Le Kgdp[ -#[ll2b5dp[ `ওmY,-VNe b1,-VNe Sgdp[ ˸uF[Le b1,m1ldll1ldl/-V\[ [FF X W X W [gdj-FWdh`{ `ոt?X XA^#[,F^1ejdjejdje:-&UFXl5b$8tF[L Yƥ{jH_FydΨժA^#}}}2Q_U,Wgej ʼn.WyƷ>#xb$kϿX~r~}nzB|ke: Or KgdjnݰFvBddd5bd7#YA;YƩ3 2 52.nNA^#!Fv 1ejdjejp֮An+[y kd'Hn+[YƩ3 2ke: [y kd'Hqv vB vCKc7 `7x  50ejdjejdje: PFvC5b$8tFA;Yƥ{jejt?vC  1N,P P,P P,5:ݰFvBơ3 2hh5b\g"Hqq茺 nkꌺ nk#][7}1&?˳٘_52Nٮmcdl׶1z ttmt2k1]t52k1]t52k1]t5kеkеeЭk$˘tmӭ 8ufke\:]t5kеkеeЭk$˘tmӭ ˘tmӭ ˘tmӭ A׮AזA,csژ[{ Sgkۘ[{ [gkۘ[{ ttmt2ٮmcdӵ׸tϻkA1]{yw55ҵcknYt5kۘnYt5kۘnYƭ3۵mL^]][ݺFCgkۘnYt5.keL^{]{ ttmt2k1]t52k1]t52nٮmc5525נ֠ʠH~j۱y 9v?n-?- n|ttKtdΨ[ʠK n#rt252525252525k[H\#]2F e d Sg-e%ke\:n).YFet5%c$ˠ[֠[ʠK ˠ[֠[ʠK ˠ[֠[ʠK n#rt25252NQ[,uKܸ5k[H\#]2FCg-e%ke-k-e%ke-kt?e rvKv252525252nQAA^#2F1e:n).Y,nY=525^ݲytkKHAAAAAAAAq댺 d Wo1HqqFz??cp1RRt}}}puO£ՠɠ ˸tFNyttkHAAAAAAAAAAAA^#.F:p1ejdje:N'W,u:t5bӭ#YNYNYNyttkHAAAAq: :\ [gdp N#nt2QAAAAAAA=t550ja4ˠՠɠ ˠՠɠ ˸uFNyttkHq: :\ :]K ˠxt5bӭ#YNYNY܃>у>EM=m>zP z zO Kgԃd{jHFzOd d d 5҃b#Y==HYƩ3A2=52.QAA^#=(Fz=1eЃjЃd{jeЃjЃd{jeЃjЃd{jHFzOd dΨɠ ˸uF=HyAkHqz zO zP z zO zPGATY==HY==HYƭ3A2=5kHZ#'FCgԃd{jeЃj\=Y=K #=h2A5A2=5aKf;tgؘβYƥ3alLgYFF0kL1e 0kL1e 0kL1e ttt2ì1t52Ncc:dl1e ttt2ì1t52ì1t52ì1t5kajadYj$˘tY 8uf;,ke:t5kajadYj$8tf;,keLYc:,keLY{f rt0kh1f06A1f06AqvY AAAg,Й06A1fK;daxwYFFWwGwojdjHwFBdtttdtttdttt5b;#YݡA]YƩ32 52.QwAWA^#!F 1ejdjejdjejdjHwFBdtttdΨ;Ƞ+ ˸uFA]ytk+Hq茺 B C B C B rvv 252 5252 52nQwAWA^#!F 1e: P,P=525^ݡytk+HֻOw8>>P52 5k;HwX#]!F C B C B C B 1HW,P P,utdΨ;Ƞ+ #at252 5252 5252 5k;HwX#]!F C B Sgdje: PFCt5b$8tFA]YݡA]YݡA]FFCvftttdtttdΨ;Ƞ+ #at2QwAWAAwqtdt/P7w_P'?wxkA^#~k䝏,w d5xe ݯ/wy1w>F 2xke:w_| KgA^#~k䝏,w d5xe ݯ/wy1w>F 2xke:w_| [gA^#~k䝏,2xkeݗ;_,w }1;,w d5xe ˸uF 5ȻF2ѻ/wY~KݯA{?Gq?tۿ翣XVkdޮ1כֿy_ ˘vyomYƼk{kc5kཕZ#YƼk{kc52NƼke\:כֿy_ {[Vkdޮ1כֿy_ ˘vyomYƼk{kc5kཕZ#YƼk{kc52NƼke:כֿy_ {[Vkd{kc52]c[A1ژu r1ޮ5FyoטƼke{Ƽ6}],֙}omy 2x_k$8tf[A;w sx>Q޹?㝫;'wY\ 9k52xj]A^#\sk],w ޵d蝓V,s2xj;#yb$;'wY\ 9k52xj]A^#\sk],w ޵d蝓V,s2xj;#yb$8tF ޵ds5xd ;'wF9s5a4;'wY\ 9k52n;'wys1έw-Fߗ}m} K '52x_j=A^#K/k=, ޓd}{R,/2xOj#yOb$}"YK '52x_j=A^#K/k=, ޓd}{R,/2xOj#yOb$8tF ޓd/5x_d }"F/5`4}"YK '52n"w;w/՝6wrk,;w dN\,2kȝ#wc$N,;Ywr d52kp'A^#wrk,;w dN\,2kȝ#wc$8tFw d5ep N,;Fd5zc4N,;H[ۛ{=~=|sc:^_>D@.T{~➟{z;k,P{~=|s;:ʹ'z~)[:ύ'z=6u|s{~kIy{Wn=?Q?ў\G>}DE{s9~>ߟe?oߟ> stream x00W` &`;0π"1~`A4ej}U,v݇H & H `uyp. endstream endobj 199 0 obj << /Type /XObject /Subtype /Image /Width 8 /Height 11 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 32 /Filter /FlateDecode >> stream xc``e. endstream endobj 203 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 214 0 obj << /Length 2083 /Filter /FlateDecode >> stream xko6{~P ,zlum{)vdoNx([5(x7HTLN$=*#4 0/QM:Nَ% wOMEۈ4c0JR\Nx,5x)f3j [F8'{;Y7~ˬXXF0("ie#@NH/N#R*g2ˤ;R~QK J/+ >-ɜX.ϗCîTo䐱7ʅɕ'%oDf$Դi \" ny M0':!H%2YWz#kЅֹ؋TH ##ccq /K .oL+n(;IJ8#NzR#n>bݤMRvψ#5quHN#a@şbi: cڽ@c=bې_A!iG";R9CØm͓vK^Ckժ(ꆴdB^qjPHy}R  ?~ 4o+H 3gS 3gS n,sF4ax'sh/=v*+ kZCbqW {T/|{$T$;Ʉhq~ '1EsBA=ܱ-Y Erդ\>ۡfڻ3K kUF`]=m5M< 1,*# rM)G*"9t`Pws5%kS ɺWOd/A~x+z>S@}2P,@ n ߹,ؽ?27q rC\P=Lh>?Ǎ*ԝgD8߶ +M"|sNu)-n%HdJ~~z 6/T ]31,ߊ!ro ZJsjJUs8Ӓ7PtU0Y ~X'FHeBhVVyrsS{3"2ӳw[%2ѫ72$ ȓ+LeH^ҵI2VNuT-re ,H.n mArG-Fմ¦]X<o)dT+Î: endstream endobj 224 0 obj << /Length 1005 /Filter /FlateDecode >> stream xڭVo6~_Gh(1{+w+0 K ݃"JJr-k/@ <}2j"_WoOH#r[DiUUBXcVLDR}a[G7Ul&6պpVh;K]mѧxTzez&ogL]p~ekXDנ&.Gԁ{Gah%]ZrshQwaFIcPF :MO/HЩ&wۡf{q Wh)Jt!;DZ eO`w  nMf6.3K\. SW/[*/Vdhٽ pi:. dq~d>공ٙZ4 ~d2>=r>uφ ud}f CZr;lL0<> /ExtGState << >>/ColorSpace << /sRGB 231 0 R >>>> /Length 3804 /Filter /FlateDecode >> stream x\n7+zio:|?1& D8P;;bSR%Y.")|7:oQlrܬ-j|U?|V/- ?n)*e2bj_h*ʳʭZoYl^\,rTS(r!jmNCN#M㊮=Y#\UVĮ\՘VĮVĮUVV.XYʹ1T˓_fi?~pDͷ.%G\EhUүnU?v5vʮF,g&|K_`qܲ+3 \-Нsy97M2xʴ͝_g! ƽ5b 1lȵ^j2Ixb bg;hE.m'˥^jv18rQf15 BmN"ZW2TKR/5{!1{:K ⱸ)HV( V& @XVz~ Fwpnt[}pntX8=ק&fgʃƕ.Ce:eh,~27f&bu=|Ϗ?߽'M.qėӰa\w ȝq"7 X~; idPn Jrx6?J'ݲ|zjl fWgz*^GI=20 ?ug<̃e%klc y@-\FFPYiGNI"mCeEvˤ0nrڽz$˕v!PmCk…hlc +\j.dl㦇aqtWr-!Ppݏ:pga+~zn|5^En-qIxi.iπr>l<ʯvWzly?}{?-]O"8Z} aH6,wN@ްidiH V5ipʎEE4tގy&_uV啋FM,gY.55ZnhrhQY嗋#j9itQSY ̗yl56ZY˸!r>k4kG <6y\f㶡^ڲ"W;_b6K=hB6r5,WF܅hlC E5 5ЯD`p!`w.d,ㄌRxZs z#IfO8,,?k>,A̮? /9~r>|y~)^蓚߼>|z/KI2%B]|R^1횬C$3mZۙwr)VZy@ oIʍYjIfS3,vg3+_L(._np,tUJTKuRZJq[yQ˳Ng?;Wp`xРG΄I36 *xQ;JU)%2yj teat:C L+eH\ ke Zpx06}:TOի R'mhK;0lr R}TGwHF+D{ddC1}xL^ڂ{:9Hߓvá[xd&'Cq]<'egև_0zn|Fw}?}W%OG織01~+ ,PP\l~ʹ <<,t+g烺R^Vn$,CYOwK^ni'.eW-?qXo޿KNoH5uiogkf!mCEv`6KR/;4FjBOL;MɡRV4bd: @۸ f`d>tsd؋8#NZXf7˥,f7sW:_Xvx֟q3%^OZ(uT1ky[y:1YܽdәU-b+Og<<,^//(O%+w'3«UAԠfvSm띮;Z=)tYQYًFMgi/5՞5Zhd{hrxZC˷?QFh,jQW'l/}||dc*brv0|cq6pj Xtvfĸๅ>uaDĸ76bO]ܛH>5:.#FDr>g{}HcaGm ˏO7gbdͪ00q`L ;[4O`#l~ {ק>?Gq7 C18}~ٱO+&F`H<b 6 >5i2hSpaاcO}]T3HA.nާ-Q([ Spۄ c0`ʥ4{>M8#0}Z4ߤK[ &2%=FbL|s>Ob'R`Ob}m*1y&F&1ZS)&r>9HçK⫛y&'1;)&r>90T Vy&r>90SL|s>a\0iǜOX|J6D'0 / |h)&r>9"AR\E1Bdc'wq>MLc'5|8|sާ.r>9 ݼO]|s>{bkn d^mL1i׍9,|$0 .+L11$ y|6wa')#LOb s>8Dq!{cq ov|]0%!0F `b/uC 52͋ixf(rICK|5$^C i$ӈ-M#˽FNB:4ܿ{E_BoK \rcAx؅Z9 4Ki<Z7ÿiq endstream endobj 233 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 235 0 obj << /Length 149 /Filter /FlateDecode >> stream x3135R0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.sud endstream endobj 240 0 obj << /Length 119 /Filter /FlateDecode >> stream x313T0P02Q02W06U05RH1*24PA#STr.'~PKW4K)YKE!P EoB@ a'W $o&| endstream endobj 244 0 obj << /Length 122 /Filter /FlateDecode >> stream x-ɱA($ \vTSHB $:@\#Q_TQUE&MG-nu8M [Yð,ΐV]'v=WN;S3uz3x:cE_ endstream endobj 254 0 obj << /Length 135 /Filter /FlateDecode >> stream x3631Q0P0U0R02S02VH1*22PA#CDr.'~PKW4K)YwQ6T0tQ`H``(`   ~$~K  dE@Yb..WO@.gC' endstream endobj 263 0 obj << /Length 150 /Filter /FlateDecode >> stream x3632W0P0Q0R06CB.#3%X"9ɓK?\ȌK(ʥPRTʥ`ȥm` *og`?: A u } )v endstream endobj 270 0 obj << /Length1 1437 /Length2 6831 /Length3 0 /Length 7800 /Filter /FlateDecode >> stream xڍvT]6]R-r# 3 Cw#-0 00Хt*") %!H*%]>>k}ߚf:0jpK[` (+7$ȪɀA]D,0 @ tY^PH@ 0D,(| ( gxB"rBm\#e‚\iGDjv0@\QMIÃх`6pͯ!ݜxpg7_k|0W@ ByBxrv_Orlm`?D>.0{ Xá$Ok7}}h'`^($?˫ gddP7`~,i *#mPn_E:ꚵ0?$7 _3FnH f–p_kҺ^ @ u-C `D+BXwLZH[Ŀ7Yk]vǯKc8rTn0_kaA/kBu%P/ @K4ҋ-|Dko ^'2D1!]NOx[W~vf KfSOBƗE_'2_tM}HMjtP1xjmLhT2T)ė2u=~u슉^'Ӛ^^'/ٙcƺ-r3b6糴BW}8î"5-:j,;e+|궽A^NlsZg{>؂u{{fO&!7f͋k_!eQ[ z]=kݩ8QxhK~M#Gs?$! Ԙ.~frݪ %8n-:Oۅ={&70G'QlzNR}hSs:o?Ϸνq c aeyu܀fu+]=[6zgi<^Q*M"[eу Oݝ|44IrJiޠjt{(qG+q{gU]7#H-}Of܈WOPn@G btF1sLL-1K9#Fʟ5-3~5RM"u8OʁX&9\ez)F_y&1́X2!6aԹ]3]3#vKR_ir`Im*ϭ䣔CG>4|J6 'ԷCRtiqT)jl"gZzΣqu8$e:c$DkK+ZmeUècIվ$%sG7h"!O[Wki bFM<8}Yl@)m(Sw$R:SjQ+_ @@Ӭ2L@xT)w.N,:%S O8lI?bJ)zXnі$ʴ!_ŁNfq? t_U 3oLYr>pe~}r.' i$z%#9o2tV2B+" Y֟vA,=>%Ԍ%knyˏ\ݵ<$~o3 kRΊuHtqxE`mKȴnn7~Uq~*>NFR3hJ) rXnsjᡒ<']=`<0\+>6/XFri~_4iU|yWKs` $΋O@&{o~h9V<)gYP.+߆ơ2&c&Mge4Lyzmy''`Y;$ Dic]Bc@Mľ2q~u<>ej&E.3aEL\h_ͫn@{/!M/5$o(O7f$<h)Ṿ|L#v=Tq<|_Q^{]IjᐄPBlzRX Q&,$Tr B+yhɨ\I;N/-,|ꜪIe__N2=~݋Afʢ1lJ7ƶb,B{S@labm FKNz$Xm$:LY#X"o7w(oHoJ$=>|uI ʋuE;Nvf@r9 M`y^si[BS;L1LM5,;]r]o,9<^>Yq}s L>~9_]QWbgϾ7*9]X*م8%-s_1 U(Ƽv)`y[ve涙cbggy+bڡx7 u1KWA62?|gh.oiqLCp*]>$Rcp'w|$EΚzuLp O[Ye݉  鶹W !{}g]÷RzտV1bk%Ր7+|'!~8-P % Ne-=i1"Mn}LtzOz1ёe^W(ޫQ܍O%5+Mj&SY'ILde })cr,RHEuDܡ{'\k\7}_|\me͌sO oFm;dokk9Dl)nݚhJps**#@04 FRgicKVz%ީ {}7ZO{&C[ 1t+.ԸCai^]c]Y6Ŷ#Js[4tBH2+1w_dl(MJuG {S[A53]hӟ\tb/51PFy~ImZjH礦2J#U'Sv1Z^҆aɭ͸ӡRu j?F x'#2=):섩Bo]ʜ=f9&'rt܀7g&ۍ!˕?Uz):W-)~^L6LKcxJ7s(ܧT5MK+vAQCi>Of8deck#g}}NH jsΏo8,9o0d'/˯65 Kq# }[a8/ $rY_IJ?Ȼ]Fcʭ O&ae櫥CsWGW;]/JqE/lDzn8ௌ|lJ(KVQνă 1!%W"y_qΤ9h`[}xLʑ-é𳁔% qf8QxlF~c+֯tg䬜zə6+2s:k+PUOԥ\ڠd)C!;cUXz$UXH-~~&J-s29a &b;6UTLm\>r敵^#$ 5-F5W%~cݳ/j$he[` fr#LJ'g9K^ar0MYVy,%1rh~ݕ٘4~aaBgTEzJV7"R5pCEl0lLQ5/ sj;^g3< {};i>T|-nSl\{AZ$x.5{<mJW =Ջ6NAĊ-fS"m`Rnй:\\8{҅4KӍH> [Rґ^fR譎NIF}w/ʲ.U$~(0*?S*&3gő$'g}2V\H]N~UhӇ…xBYw{a9or6=V/l'+sƟ'0M[:)ov[Rʷlc?ӱPaDpų =fC.i9Q;?gҿc~NVA&M:}PvqV1uP<3X }MpkFlyj[FcU$Lὐ/'i[&i <'eHLồi v&[0X|J7,\3IQ)vux͝Ң=$<;~V>SS#Mg#g-vrC#BMQ%=䢄Zk Z:;<!GPP ~)QbV[ ^hĒ3ҖdBt-e¼"=-ɛrAm5 R+aS[D=wbT5vBt1]- {5۞9FWUE|d> }c6k :!iS,/Z`ƃߥ qkCs%=zO7oB]|&{;3X`Lm,;ӥ8Ґ΁puf so<Di"_7^c"MP*RCu%8qGIw]Q+͛g~S"r)J@Rd..NN6QeCF$j}a\tά0r/=B@*^|7jΦDs(wC♋l7~:n/n`{ PҧIJ"=]5 ޑ $+Y!kGOX(yMKd `b$Wv-Plg'@RL#>][VB(Vjm|7@fG:h{Al ;+iYe`LGv=| U6|si؉83lsRKb⡵S4ٕ yLv`ts:]dȀ7Zv)(9bGRJ"=-<;%Ԇ~OCD CYfZ%PO8SC5"FLSlo߆LPzo> stream xڍP A5{p =T<{u^{w阮LYA(b`ad)j0Y()խAv(5.֎bM@6q;Q f`app23XyCtt[@WJ1G'/kK+:yPXxx ]L & +f&v5G3k RP[@NLL&.4k@ tq P4-neCà!n@5y/_zߛ`adoHdg%Pgy&M\MMLL nQ+[ȕLyf s1G{{ĭ]f:8z8YX;[!͉I (#7݄p033sqr {9ta~x  7ϿXXf )f_]=z`'3wt3)Hj*-NQQGO'z<&X G_JvRt|\ Fg`6{b?6HO?_ߌuO,8_u3>,8Xw]%= 3/fgTvtj003tپ_= ><S~&..&^8>,hL8? '`'b0IL2 N?_ `R/0L,fE}a#L 3uXLXX+˿)T^f/._]?}>Ld羿 ~__]Jcy_ߝw?w(,& _ZKy8+ ߅YO?f~y!7< 4CXw4 !`؝JaYrt{DMr+2܇-A}#Ls֖l:ێ8cXaA]xW-d+x,e7rGg@X^ s CFsx`@ p?ong1r'HeNb؊|t7Xc*Y]{)u!o0Ʀ|D.G ,pE -'iWs .c Ƥ0t4TP}$m ,H&.5&xx!'VK7%99Meٟ'|~a0NE33':X7X|`i[ ۏɍ!#B}:-ZQ98a?FI F2;M e}>u8 "7PuT ̘q 97psV2U3Bp;nDIIdQG5BVڦBƄܼm~iT\ yT@lSOvEr5J~iu;@nSd0 sȲ^Izg TXXCxSICtgy\tQ2{_.QoIS>%oR)͕;+GW=9+K,lbͅ>qTYB<ܠ>:;MşFĤWSAa-n/xXPo\o{iljoqqI̴\ZCIGIC"GKB 5d=|V9 7ǒb UnJh: @zyI T* ߝ>LWjDoE]w!HQ(i𙶫d6z"E<6]†.9d{8w8'sߝ9dź҇ as ZxzMހ;c/ȳ \5ۻ'yW 9Yd]ُfo51ou1P_@=SyCv?!G:m th\n? opIv|oAwAhjmȕ(*OE`Bkd˅~/ْL${$96Y'LDnƈvm}tiK$$g<ߏBwh7ѝPZ$\-8/]X{p^b3ƒv]^y:idÅ6]G){MxQKYZjgd=\SrN_ʶ1z-"q { ;w['T7 xѺR/Bc%Ԩ֗BoS6hmс[7﫧Y'I&3< 'UٶP5W ⽺Րz ֚Xj$-sW {st4Ys{}rU )@ohqD->p#Cܚ".7À[]{j]%o#dyEsLZj;0K0b7Ңh]ːwX22`k g9v-{&J}/m;T۸Ia›lř"Z+l=Qɰ_?5:0Elr+M.藐4 >|ר|֫H0Ru_dX=VEe?7 uA%ƍN%< #}X-(P_k RӇ=U*L2LX}!-D)L0%ѱ .eOѓB gknv-if"g.–)L ]F#ce8vgϙx9;DKm $(y1p^SYG~8A}~rEUY*. xzʓZL)nC/$+P?Z?hDEJ ~&!9 3yU$NC D?s]Yh]@5OtOT A}E'H|Ħ1 $/oGLUڃFBD$}4YRc= I"!Z;< jOn (JRhAOb!niR6Y7"kD&fY"T 5CLh`Sæ/.#Q }X | H ]wy Rn8/D^Qb3K?r>wk-fxWLʚζ PLnx~$JO;O%UhgV[X[ wf]ԥ(v:\K1ˋƅuNjB-־Q _0=;SB..\)&ShBz̙Lhj`-K^֤(QS:@I{੼xNGHGX}~ L`>E_MRmtc ?߾z{y{PXǜYӰwI?[b-3H NG;Y | sB+9GQ_/r/X`%f4|Dc|+[bp"O^'Xi5<#1TW"xe 3h@gVATnUrϯrKZUQLʊ 0S)lr7;_V|񛅬=T0C}ieY!*E/:#7>1I eϱK7\lRmlEo,p&? `s&+/`M ^b *fx0S#n+( =Jl' W^m+}loqؿJj|_+)I2s2OގMckjӺ˚2Kq?ް7B^6ϝWqC/~ dfTFQh|l#Ƃ]2 C 7{D9ڷbӱb*"S9lE8Jל8Y.6`<ca+24N XHlM2}b (I*]f&8u i󳄜 ecχ߯jQrT\asR/9ӊ]v3ά2m`'…MhdH~np5zJ?;R` QQz↗kk*h.?f[vYP/Ο_m34j`W q&:N}ߔ2zx _YЪbPXae VyfL",lH`uގLpv@-P %z4T1F'fEWy%y+HXpyK#G="24rdlڗ`*w>wi `2#}\ޏ`l Økk2:WlLCn9'/ZKe#55PY\Fs_F6i ۀcsp.L*zq3-a{W}ǎsPF&EգBZۻ6@ÇǟiJ~}C:"na//cIm%6υk9*WD%<:m+1-sYc{Dv+5֝l@r&M Wc^Fc*Ozj_%(УT(vzn48q34UIqc[WXjp_44 !&,>pD]:cvij*ő(T., C"F|-] $VMWb-K ¹S׊35^/˛VF-o/VHe ~TG|2`R%Td؁3.x\6Hgsvܔ]8_/oi~*gq5*ħge]E["t$Ȏntkn>DFep̍.L~ UMz4τ9YۢķԌ*Ƈl .^ƼiPYO;uH9VNL96,9h|Kh߶FIHvPKEk mf:ቆ95EAk•O&^CnNMmBoz4/5S ?IM%U1va@}'5~ |5l G6x) $e.Vm-)=el纻X %({\{8,`ӧ@f9C`~Y*;'|@k""o\[pP$>jNq5w/.an Zϗ*zUXSe$dk/QPVvUV$>hA 1XT}!߆=> ?]EOƂ0n_m?d#q6F\m8iY[a eD߄긢uhml3+, .ہDir╆%`[^ġyOp<:.B-jܫL`[(%b2Ni3ѻgTӗLm&n [$E ڃ/7pI_d`jMͮ}Z^1|seK8Xy!@ O_5[v0m%~"P,GMhFatAZK%cU"ϓPEYtݡwK 3E>~L@dr|H7`*|;mMsK|']٧3Zm:rO-7?'.&.iHt6*_ E09ܶ!t :@qBT'sٕ4XAEWoݒDg[G<ij\i 'G1\Όi>4A^f51<j1N@{=ERcml9W"ˊ?uC}Ֆ l[]lE7n$*W Kv~ G0InƋ s$'\S/l yTQ5|׫s7aZߊ 8՝gp%mD=a.:JGNmLEuePzpQC35s7J;}0Ur%gP#͡cs W ۆ5g$p됒FH0r"943Zck-iCDkTH~:|f~+^h+!0cû"˱_c%V, ۏ[u>(R*Gf\9kjBtU?qW5ɥ|o^.P$@"V|g/a&H]ҾyW9~)*cPm 0x~$ppKmLMȴ GaO Զ0TiZ\k22F<+=Bڈ/R7$^4w:-u.xOri"Z)^tU0}WqYuܝH4*USՕjYyWv:%l䤰*,^zukC5/%Q袅.m${1Pܺʞ3Ou..NkOKȗ&l2V-*"[Ψ }۞kSU˗;ۜըiR+fP" uTXݖr=7dJl6Qgjc?G$oNu%^>dKNx-`?ZPkb8ިDS#mS(\ߔ&ߊ@ʈOʭGvFqv?J_e EF@Y?,;ea7 fbZ_'ߪ:ܗbrUPb~&PR=ܓ8Rx /u GX Ucr}BƋ& zg>LUi(X:_. !Eימ dmLk5| Xiyu55t0I݉(3A kؽ {r;]%'=PUFl*4Kke84IIhcDaNIƋʏ 2S&*Wվɾ`:㚱`}պmϟ>AGVҼ DdP{b fWs6H^H$UL(p[:bܬTDqF.M0&=Aq04pmr, M ﻑµt)=E}ݹR!΋F5:]\aChEXj~)gy6[-9C)tvjS;QXq۶-8ٝ߃/1Xh:3LkXI6ά R։g-rb V(W Yibɻ-_M@z7Qe'r.Ю6W296 2x ¿8eR<1D>&n?`P1:޿vdy2Z564-xRXpUqgNm1HQ\b[*4hWhv%s[]x4k(:Gr86_e;hM*xcV ?#eoi֑oa{ SrV`T¹,a_i$1/[G!8 `}yx*!2\0\|W^ SN͝LBɊCC&Ҁ -8u@K4v{#\KmLwnOHo*ݟ~'Ԅ:)6;X+;/~^uvйOoNKݍ;rac, hᩮoe؅U}S݋|!sWex{C + ։; [tcIF̞3 2Sas r>F~c[\-r>2+hc wc1n`8(F@ fh<ˁyk(yumKQ5$nLE0v+xcBo1Hxf@UDM yt8"}ſ}ϕte_=]f`9W~Gȯ vL.C['!^23w۾k/%XSjg9[7Gs 10Ҏ ~)+ZEMwihkq(n⓴nd6NN17Fͨ vei$Npb 6٬SgBGvc>uB%7.xX!qh䑯!xN /O0q2%}b%/Z#B(pʄcetvwQ齔$7SiӜJ*T.:ƇPH}n9rzlXi$n P'gFz0rir4co@`ejh+7)7JKBWA|7Ƕwz-kKp%ZV1*@CDDPew0LVsf!R>5L :bI/,j-).c0Ӣ)6"~3֡q_ ->/=/٭MŅ>7ZZfFvU䞰|Fu%,1|ƒd̔t4>8mM89Oz_LXM(_v=APdmηߵr-fH[r o۰*qZ~q/xH &8-L圣Uıs%C39¼/^F{c?UH M|{gu"İ4H)t"؈gc|Ԁ[h#ͨ&Ql@ |SىfD,ԅ Uchd@l Gv> WWS_R! Hk˫;ߡNgM0PX^ eJ9\~;MsY) Ek}ŷﷁN7O©{ a'1Kl?y{W8؜NނH.mO@KF(#w@:vc@g=NnƅY Ih$1 |7³B:C#,qU/(F ~7kg\υ-h<,HrCDo)>$%fJm7!v 0tA=/` ͑ODTa4D*ȶ?Jd~Q8Ș")sng5Wċj SMic*6ْYN-Ye~yEuFNz~rCtRx=`$](9D7uC|7\Х4& O~LuT#/Rid(9i"ݥu`DVCzU "!7K=6 Lu`[][/faNUi[h&>`X.gBoIv*RYx\ %:vM޶ \!rr`8!s||̰PVti1lerJKm{ϱvn85]s4Εb-Ҁ[Dui0&3$z7QR}kR5\n?a|& #X g$G7A!Ѵ4Հ+z"h)rDAjYGL7|mXAf;Н(,Oq9q 1-Oo$ٱOv~l^snMHQ Fj@Nn3$fD ݹ(r]X#B/,GT6V>e:(D ӭﭧP欒.F---$8.?|Bp#S@i&vzc ]ƒR,L.9fNh7B}s,mXYEg2CC}7mFo)˹z J%hCe1,F.oz ʹY&0RoGy n-$Qcm"hΖ>@ٌx2vr5;DLd74sST3*̡ U!~!re„&ƀPi`0€k毛M}LdݷK{$" ̾QˆVĂ65f-/1UC^RTPyfo:'Ol2@ukE:~/p+M56;Ro `$%Z-: }MIJ=ȻQ3rp%w5H,4:^ѝ]nB-_Nr sä{ZKRT'B6ے7Σ. j"VDJ0}%$^ [D=8{Ix}4 \ƃ%TdJ-Ȓ!2yr[ʏ2n`y1uk( ~Dz9 숆Zh}1À?ox՜p=HbN?uv6֮y0v2'#S:%}[bs.;8UIP k1~l]w32CՉea±ϟʾx:PΗ떙M2'XH ~e:_*!2%Cx 8^QhU.IEJϨb䐺X-x?k#/QUa:s HDk' |2kؠ^UZv]m3M6B:ëEHy1ZNBLdosWGh+ 84\"瑸]%),պMbF6g&J3LTA6avFcLaD^$i bJprLSHܷS/CHnFϟ&JOkg:~W&R E]6]X0)G0䂾hgwPΣg378 XrVUdPpgZأiHNܣ̧;{?TDfoi pqLK}K ǚ[ѝ|K~)"]ok,tq kAM5!u#S_кZL h5c+dIjZ}6VWZҴ,3mCTtlV0cXF7FpiCͣlE_QXLm^Vm5vk8PB[&~o}+pZp0r.14\8V x0z2YIkMK2NkKg A=k#ъ|f/uQ9 J5 =:|$u^e֚O@q1_ҩW=re%1rه'Eݬzgp+E.fo^ Y ]xLِz+>ʤ޴_0Cf?Ҧ++ b4 w$A]3X]=S\.Dx=WT/7=izq&)Dģ!P}.\ƴDXu"“QNt~ղQ߱j4!+tI[Jopw.W<6CP*~$,=Ȃ8Ei~r% k%b>+5%)=zwŨQ֎ DCx<-rEA2]HQP%X ɶK[*Dk k`5JBk 垶:\JH^=igq){eJLJ1g3oPYP!̵`4/9ܪԏd#ma:x?zQV@Netr60a7ɫzJiHvRK:L>\ _CY59%;d&a}yzV=y>C )?0˝Ҕ*r?v|Z36jƒJi[ʫ`zXC>w endstream endobj 274 0 obj << /Length1 1978 /Length2 12964 /Length3 0 /Length 14174 /Filter /FlateDecode >> stream xڍP\k apw -8`NHpwww s^yjf<ݽTQQ$ac de3!PR;Z#GT;X!j:ĀDyk%`caƞ t673dlA6nfq1p3mٛ@G3{D#%@?.hmy]\\VL6 sG32d 2U2@hwiLU3s)TlL] dndm GH>ۂE2ݿrdn1hfnm 01>K19:26@g%w@^s07ut`r0FܼAF˵q2166 c'[f5ks;'ؿ9"?2S#\̘ f [/[[{ /spwyyS`ln0[#. ߿+@X,}a6֖n_1 KRD`dd9Y^Gh{o}x7_SX[> ׿dmnx/ `bc׍rq q7+Yb0KA\f?N0/`V{t"w/?#zi_c6|}M̝9R8bOlޗƻ={@damx羿3~mվ߳G-9]\:Qhf'b{r|/d{;ۻ?{7߯ d4oc&JЅqo F-ǒ}# lL3FERf82a`dN|G:bd~s_+Ses§#9L](* (0!֛ohGqTv.Ll-Aݙ 1RڦeفU]8ªqQ>f oxg!F00ak?{.G"avkbB.CZˉ$9pՌ4$CcB8j BhL;[BƑQ悝Sq6h*:+L5ԈS89JNtC 2yp" 0/!,)Nwnx:qqtiK=֜\ZK+&0:o_Z*X,:,|9T{y6?߼NS˻P!iIM4Ē^> ?*c@\Ly=N:IFzS ĭuUK SN'g(X.X]<,`[_tԐt>[70#/:tg,çu \}>}f'0pz[NBdLcIs#/Olr1WxycޛFY Ea&<+$o0`8tA@?[# 0HyW Tzc{B&Hf2bŎ$ݷZ?W_ h ND}V:!)^Or~SLK_-6X> טs?g]4IS4JmtiG#⬮f6^K‡%KQB/DDCܷMr-OuZ޵77eɬyc~SRUlqsXvu@GRdE}627) ~L]4 Wfɹ-bE4Z*y϶e- ~,uv'Ea.f>R^ڨVw3ϐYA?mݕ5~0·[}/\R5hۥ61ϋ8S0O0sR L7%}" i@U:B1ʴ@4$ ɽ29/6 I)pRnY,)9L*s&z(( lY\^ aH o3zʏ F ` 6ݭ~84rF5^:&7M xl"O]JWU]!oǛRr)^50&:}:]q4)z.} k3h!^J]'0d )ɽxݒBquFȑ(jldjMyR-ʚ|fC](֩V2ց}2#/K"U-,qZ7kNfy>t>9U#t9cYrjr/6ss* ]"f+D [W!W6dɤ'*QfQMl"hEjc24 gSFk[wLYJ_$(f)! UTk[6602{{Ma.4bxLi@$#@$d%Ǭ KY*Su#&*b#(ևwڬ&FklQ&"1ezrs?  Vag',2kd˝`bC:Df|d OsĈ&& 1#uH.<7 9/Eod_5[5 _ W=әѧ }@bdqN"'|^ !|zArǍ0ib!YJR)10ڙA;&\@p͟j)h)xOaGY\$S'ܡ"vEg5/<*K|bm l[>HٕB8 Mjp9v#1Ny9 FtNՁ=D-#]Z0WW=v$33jx-:$[MZe۲W;G OOotp`$T(>=l,\R^*$~'ֱ}jKnWDtBM08tG"3v|An kô!CYa,m4s݄CRo"ww.u]$ӸhH?b7']󊆇sTѯ*^ӯ'2!Ss [_qkSfWPnO:/_A#r%ncIL/abubb|hÙccH Զ3nWEqYQP(dڿʼ})[|-٤,¨ ] GE1n=lCX,aMAf<"ղ2 :e@_T?f(o֯% on6.U񲝠4:YR&_eh&7sW0іS).{iCȝM.xlü#m\ RUҁ`V׳)a =)%~[h_6pIGx Ec5:%w:ꆋ#wԑϳn9m@_V'U:)Ql7$PӤ2 ]qp91Vw .Yy 0WȚ/}yq3iWy#[xb25%<@x<IiMc rkjg!E2Рj.za>C%&B񅒗EnF kBB){7B%{ ,sKZy-R:.]ңmePR7.x ǓʟU*Jz[i:!gyJ̚&sۧ)eWG\܀ JF'( {[^]ԴN:_M`']xGPt[R&o19UI\C׫# f~D6V3,Q\g]sz=ʼn;:M9զ\G67F38LؒJZP] g{-ΰX–_wꛭ&3h?!]G&/\b=9 'Dp&AZi[b7wq:H`rz1h$X9/V9'ɤG,'Yjik"~0m61B}6g 등dEN8ת5C_N*r;z< #]`Aٌ"iΘg"Űl[pq.+j'@,0 6S@a&2;JWږ7n$?>k(uz0ł~tL%;@"x#hE)ɣ)J91)iܾF{}n+|;Ip\ 7"4Oa\mz2S #'32狼I)pSI>!lIUӲqb30s${Z+1 fVօ.2g_%V͒ uwcoy-;hre!rMطgդvXEȪrLxEk2bt X:{mQ;ک5_hkutdab:/\4*?{"0V13}#+^I챵Wܪe(3gyd X&<74ŮuN_3?YS?.*+ ]IA8sV/(xL10nJzwZ 'E Qh8Gd; >GL}QgXCy$X+ϚqGEJKo[[u$ 55lNsK24'Z-FUbQO\o{]tFXR>"bg8Z  ݍ;LS0Hݾ&љA."VHށsʂh-o0~kM(jv-?݌X|X(EA_b%0!ɦЖCxI`~h}_S, ?Q8],BdƐx+'5j[tjָCę=qp dBHhH*lx<H?M1vd(w8u2vl?s\Pa 򣿇~m>P@B}925DJ8 Yjd2)-߲ՑU@DVƛ įB 8~d^TqE'a;C:RX!!Udߣ]]AaMWi 4P}Q+/ ]Y8 4+#jYgBj?CÒM35 e9rçr[MY `,sPr-D O9;b" ]ܿ}0E5 w+⃽)9zoEi%x&ID MvB%4˗F]b:3%'2f$kM% vXSVān 0_[=KAl?q3k: 4<ٓpl Ū#X8x:p :^ŷr )]uNF|7PM A;AFG)E{sfsLsx;ϝۜH{5f,s3T"B θ(gJhׄ˫$.<HG݌΂ ^=̊HS e.@Y.Rf$cPg[<$vP1~U}dia !Cid;h e~;BGG#:iAޡW@$njeá2Af#iLz@Ic$c1 >5C=W (Lْ୯m(* j[qU)& zK nsضeW]D\ʰT Q|_">%5Л/#&v mL)8c$4'a8mk%Y%Q-,{=$AE;yQR1<>Κs% NZ#Kq)e1o͇v̹%/ն?=%"Aġr#|ֻ8]u,y] vC|yKuPG5Kzեp`8 Lo)QQLB=Lvlht?ɱt;ΗiI#Qr\V5C-2.Uitt%Y_c4KHGjtP$|ooIV!PvJߐShZJ]EQ#Ta$ȒVS󾗦xl3x&=2U.MHmX!>m)k+|"cd _aWȉ5L֏_G0@ε4ѥ\SzTXGΎO!(&K9sgsaSm\;2_'s2u;8 t(_e!{e 2   *粠tW BjGA0j^C֩1B.8?9!| L9Q(~I+H֎؍`|hg|@3tb PrjpbMXĊW^8cTd́Q,17ie08.kONzL 9I1]B .%sD`{[cDž"s{h͹I49bX]BI*?Fs`)q#$C;)1CTK'|I؞eQ;^6aӄ% ;&q Ӊl.9 kc1| 2NX89s-w SXQ-i~hlVRZw^vU4Hj+\v.`I|-L/,Dbaѫ v4M!ZJa0)YJi8!?qAԐ9%Rȕ{2Q{!72Tr,Y6t _Sda5f7يld@Ul8SF WF'K1/GbLj-UAdHp>|'j!(W<]g}BWK%Iucokl@#ڠC&dTFS|MNA. wz0_,f>6̈KJQk#Raa_7b4t@GYVPihѨ)Rbd1Bމ7c#\5D-hs ޯ'2 OfLōze6lkVĹ>4G&O`tE^wCUu)uS:u%W ;_O}[ߖQ$Q>E6I*68&G74.t\>`0\8p>ϡG}2Rz|I䃜p,Q ĵَh܀4* ;N mV)W9–ZI'+R}hSFu6XGch&Zj~X <^6Z6ְņ{Rwz47w2!NpӰqteehzs?wX? nlPB'|R:ToU}$x<6(U~{$L2C/붐4؜<[J › P34O^DL`=h3됗\#:CU"! b]^F #k+-DЩ٠> c&rM8Nr|47K"Z4eQν#~[ ӊΟ;61RVOo_2 Qځ∅R+;rk1ܪ•36߇d O:[LƧQɞ}~EL2X)[/w=NMJYw6@7B:jqN2@^ ezHk {J}8)i[OG$F5-#i4ᬈƵڽ -ת>TWذid7I̝ LJRa+ʼ5yZSg(;@⌊CB&D>Elɝj$}bCK2Jw0Nధ]ZOo7Ml*>Ԅv2_4Ԫ:ïK4$2k~Hb@[BQ=o~=`Ds҆Lp@yh'd=s4&G i}l&^Gmw?+m_$_\Lox9 ?9xш8AC\>휶FMſʩe9$OsrsʩNIspmxukiy#W4Kl<(K)P_(;9# 0JՃ{h 5/|xʱv/I.*/azy~)[13D ]MCvY"VC}fT#.xT QGƚg7XT5צ?!TG1%_kdE2P}oZ??,f9wGp*wU^A8괚Z7p*p "弦dN"Ta<8"xw-XnY~XI qz6ughbZ> stream xڍw4]6тDFeFE] 3 w;E'z zD I>}^ksvgƬ#AZAW>^8@ASH  @ll0W8/1(D vEh;M$ DA ?$/C$JvA5$BtBl\k pv9BQ0k0 v:wzHk!8$\]ā@^ /e+ t.P;U0@ S/@Gq"\n@oS|` Bs{e{m|J54To<#$ Ą"?haWaݦe8N?ci!Ѭ8&Hd?Sῢo$jG v2@=H ghpT]1CD2 цZPm ץK,k&o=7R a0~!a{>|I@=SE ].tq~$y rDV#1߈ODDq( Bo6K}7@PkDgrt<_F&پr̡.^rVe<[BȽ|Mq,vs^xKN_Z fǨ?l1nt}Ռ١Ɩ&JG~ѫYW:?6EgJXt' ,x-*s>+dS'dn^p ,??^,we5a:&gFѧ(N-,ȆbQ,X1'Y{oOJuV}eӐԊO{OӾ;xOH"PռƁD{V L_nM, Z0U}>Gډ*J{WEP"rt8Ho5:!ֹ{DC%ڗ3Fzu9$3 goM:iEMΚvkM8@uРV45rS@k|U/S*:;# zr=/Ea,a&QP[ Q-z{'?_짷OvRe20){`ȶVRqU,G&?|ׅ2;΅(UG$'Ho ۷4Iy_SJi}WRE"}&:g{ѠQ(m߁Ҿl-~ҙ [#CqEǹ5,ɉ&簃#qA"iۤP5H"Ԓq*H{ lJ|,@H;QrѨ:pe=` ʐO鑔Ҹr[]`#F-vR-uNj%cOlZFYIore utl7aE݅܊4(rT'*OyF\MǍh{bUt*'SP$Ҫ âF sC-KEDQld>ߚq Ȕd=QӥoqQL^ E8uEpoઽYZD [F5:%3N LwB>lN/^5Y@>?(-+u ˜!ieaQ>(nadb&n~X\!Y66O,%Wχ^drz <_86X?ר뙨aB"?]-;}LD;Z41s93EZ2&(|M=MwkpBBum .ّc)F=U|!xsy2;oBr/Ec2R(]x0 ET#h"J, Fլ=wM`\'DsAƮ8 ^:r!J,<`b_ta Ӧ!S'Bn% ^3Z: 1kyrvIOVKtᶘC'ƷbӨ)5moalW'͎g[%I^ߍ"XYS];*lӁlMc{ yZte>>KRzJ%6Ke!1׋5C@noG%d cM)ڪzOxGmG^KS9E׸ne1#(>)M1aFclkqtGj>S?ۜc9}dJw8Čթslc8m2G,=ih<,k‰PMB5QFC=y qn=X lM&=am;pbō'Rzǥc8`p+e"a/SV}7Y'AlOgQf3}WN,gӥډOwlݡ{^w΄3w 5,#ɡ|docjT@ jwֶٌ_-{ЈQ {E͇@/,?^lUme7-ݳ.i<.R_R)*y3sK#&<4Cԩh=(ҌQ~w|n)6+ZeqgGvKN֫oK_}V=US;3ͯO9V x.Q< L\?!BuwJu9x"/8ڷҥG6 awpاzuq75x#>ty܍Է鬀1ZT.s{ƏuDd"9>8$NŨb4.f[c$f^|>ը>om햴C #.FJLod)p53áB xM9EqD'WO+*HɅ&U5aoW7UvX}I@YߊOVdG=U͵T1џ>58'՗mA_1j'+*%HTnGWcQitdx3g<|[za4Ve. &-ci%z[K0dqu7P(?_QQىq;-c!6ƥk%vt|PK-3~*oLHYvȏ.:e _^{NM' tDj|X.o庥p>6TMJ>=`h3]Bd 3l. _32<8,Nܽ"w1O%?],Ȼ%w8oIXaBzI$pdjMwOɛJ %}{Yz4(M0(&=Ϫ>:GXu'dzYeD]I~5qxFP,LS;k)<,E M4~QbC5YHHM+4Ť@{ޗy(E͍> ǯ SviQneU!EzCBS7. 8q$.H'l#[UV.(;tDpn,U*휟GI$JZ#>0kSCD9-{FG-g3o&z:GG dֺP?91p!eK|73x8TwٻSghtmF ri uVK'psw`p475U^/KuG1{D*cw-Bɤȳ_J#e}ɽ+9v6b3' &'OHEשUS=Qm~0 .qܺlk7"Q +$<0{22CM|fzԪ,KdT.BZa61ŶkŋȻvϘԩ*B*}sFWlJbZ01)'stil bxLQe 2⬰8LTEZ4If]Lx= '^1D,/>q*׈=ۇ> L1((|^<8uyZŴp+~Żi|':t"sl\>ZCX994 K9#H{q|[L9(*qgR8ÃNB<c=7]*Cv2+j2c=qs,uGv7ojpY8My/TXŀcq̈́OLGZyyl [Lr9 dJ{8%df4mqB>fUAbX]:_+OS6\8|o"+I]z57n-ca^[fcG(-pJ醥WGWECrҥ \ eGrHrp.^.4I 75/`9]0) .D,kU~9Ei19 nz}:/#~6nLnu`szMT~N(|ǮԘlOai_CYZApMƑ84@4D&z|,x40X3"ɾШ~^Py3] PhBuz}3!ٮ (}DBOG%5t-,^ Pft,C!11]+'2Wl4y!yƓl4p~-e){F+}=ۼՂo/:=:x1=5cV^s(T\Q3GKԳD;_(vH&s(QӓUQē(N>MS e08+g~Yb1.wDZa/PIFԁٶx)dM/o䲕P␁ ;;N:JP?c@3J$ eM5U/ʤI[% kL0ev8fƏ='ER2-j~V &qa.E`J+ɉmgisd\eA!o8Z,|f4rIgMEMx;l3 8QpMNNC* ۉ/\ HZ2ʜY!fM?4hK`ZqG]ʻ#K^F=['L#] W+7(}1s9E͓Wdw@.ysazNԤ:wI57\]vS19` Cr6K\~;O\Q!*|᷼U=;W3@Vm<`ȅL0$@a@V^t4u*/b<}y PĨy$=)wkz;cU""IX\3Zizi.~xNY6-,avFnGMdIqShÂ:٨Ht`خ?K{8fOc@@v&"Ɠ]tDӔR Rm\!_MOӍf쥍v^yF?,duФ+xnO56>(0=#k҅cb=J*[8% endstream endobj 278 0 obj << /Length1 2484 /Length2 20970 /Length3 0 /Length 22400 /Filter /FlateDecode >> stream xڌtm.iI۶m4ĶӸm5j4Mc۶m5yZ{Yk>N2bE:!;#3=#7@DNB GFjl W Gtt@h.5t~HXXLL܌fFF1sZv@'82;{G 3swyPS8hv- mr@wFcCkBP;;s3089S,@'+WyC?ÑT-ؙ::k cӻ NP(m1ǀooLL _,lv64675ZX δC[ ] -  .0|/-읝,*0]5:;# L_`jakbW&. j.@)MEpef@g### 3^/{>^v">8/'CW `4] 4{Lƿ>y}_/;[kϗAQD\CQ柊sxѱ2L-Q47?|lM\dަpP;\yvߖ'$bmoGmhcaҺ89c`M5Z9J9![3Ihhll϶#WY[,Vt_el~u8*oJ1[c;3;} ~M/1^ ¿A70F\ Fo`  A7b0HF첿;o.+q+F|ʿ;oΧ׮iq#7zg7b{Y$Ill~5Y?{#Z\OoLw?_JY0sq#ܻ=e7hŻ]V{l#ھ~'l_b߃ٿlc{vq#\윁&FE[,,\j[; hc߫ Aqz5'9Y:ߴw.#mxo1\sgǪ{{;H@2vq|oK@w1✝1OemPC4ٮF*ע'$$̀u;.m1[%z'w-L` ө y8x[&upDRGpp-[ Uګb.R/!3ʚ&r#FpGF#9b)`~\ԁCM~62I%|,5URҷ[DHBBQea]:δCI)mHQ]?ݹ Hpn*vij5UA4?aup>$aihGXW̍Z\;|e; yC(v50+R iQt-2ڧB}cu M7-]gE!9Afe^XgXZ O-a&b^ԃH6~mᲟUJ{wr0\'򑫀LB{,[IAp`pם]yơEMUv9N iB`_ga> 4 k=mv|}v-%(Z9 ^]-Ʃ,v%B&j4Y2GMꗯx*=7@F'I+tY{ƄɅNjtWee%sYBFaOkiqqa:d&iY/\Q;9sM8kLHpYuUՕX;C^5o8qJNQ.GH:vC71a0<1KuJS~EhKbHD8BeJpnfiJv)ERR_Oߚ6;g082#dfFU#8i.vrߘ{=\rCgةӿSEB,|9V.S iL=<~sa\A.P=sJG^iHsFܸؒ`;T6ݱ:C0`)1c|f#}gnk̺veJ)ad(,U^=BNTJ:7$>~6s0{jpWmXB"鋝RlzՉEv[B(Fa۬)R!\f"dJ>t&B4wh&_ ~!R:+(f뷮_(m}_{у:r6H o!PJ/Sѳ5GZd^kD+ʉ+`qI[>di?H4!S@c5 ~tYm5D`DkШF78*WH/:JI]xe+Qz;92:V*崹mǢ^SMO[>BQf ܘ8XkŴL`,d$Em?3Y[rfv GysmB Ρ&̲aWj%'G4[}$pikgǢv>BI#8KV /j_ .b;&ߜخw +I 4(*iྒ Gſ41WU7nRdC\w) Ke:#a$-e ""ItDV)c6"h澜mL\~`4.:`òq<D4bTiz蓆ڋ]CSfOCy2~b7h"ڱ+-fOm60Y ,%WbM_3n_\)>УQlw~Yx&HGм9lkpaӗȀ~hXd ٙ!ru#jdn5/Q~{(=23.sR^P]sG ;rB;RB%,B뚨.>wt_P \ƀ`P_BesЩLu{su<܋fi0r[ZP lblّ٨NtKxdo7'o`Om`fwoubYK$G3:'dvj׾E'T}i`%B$^!ʼ /r7N_?toZP9 6}'dM⎉nje%M*seDEi/?[à-&풲֪j}\ƮMyc+>;~2Qt&Z\P 1xjًQgh =-=#@nAߒW`G |&pT]Tz;dcV) XjA|d8tDZ8&$'}ܗ{p\px4#eNO RD*Eˀh"k"2K#efg8hJ5sw6׸|f%A)?4HBYm] ^(-h{P] W.j)F s%ϾALS[!*/jEOnTf3&ZV0C;e9!ҵɀKplTx+M=<| zdgUË?ڴw ]3iי4-$*|ۧa 6%U{"ye{ 2z \A!=J}&2畑 {*4yc1IFӌpDb5yP#;NNpRHLMsgi~+U>-ʝo7+^-Lhrzb'Gz%C14ߋY=fCg6Z%mK§:ڡğWT-·5g?p-qAEhH>I[kCOך3NZ1+Eяwх3<u)!ŏx()f/ Pxd9L^9aDh^Hj|AŇ]ȬX^_TjZsr Cu8uW0uȇ7I֧=U\@^SIy!Y\NrF+,Dp쫨qzMEkYlüL64cF6+1} PsO"7}svZpρT>3@-L7Wԅ2YzgC^EncRwDLfЀs1m#yYy<ɮ,.YY,:Nz 3"鸇1X^ iU,]B9}аyB3LWq.U蘂PΦy,Rj cս^EsM¶[8cͻc N+EHRn= #hu 1Gf/ #ʯs;JqX @]NnQD\_(EE< PQ9Ū⃁j*¸&t5oBY׀p9MY6ၺu|ƎYm߰eOlS-yN7ۀphs)0Q{lA(8 ,KxP>ώ!_q,&v{-D Z(d"D+Ri]N }oȃ(T_4ehF<`35q4#,BepDZhi  LKnj2cڿָl#sDjwẦѪ|͎кuNSƯ h{) N{WsIPg!!aKa ^?Fw,[xD :2^H Xf5Y;>JsR7}Iuc_o+t.9ANN@J UPw(;q=mQmEL 7RߖYK19{ݚ TgxGMZf#(%g$AG"m!Q4F}*I6Oc]}a @S $\~.,Gl*W ۜF߬>JD{g!uo'Hj1CGj *f\Mȼ5x=J`JQ.,n(qzqcZ~&gvB37uEvsU8bA6Bu_A1M4^?s,CЕeGچ]`ӗEnEB8{ik3:iq`Qο'weBDSt>瓛qré'`ؖ{k^CxoYqkCiNl$~I,SS 4wgA?:V=mIJE-Tj u͹=TXDbXU_S&ߑ)kDtXvP[ǔF# DC'jc#)$rPG2w_EǗy!3d V]2>au.ywQ>[Eeob{r /?SuG& ,‘}oDTf_{F#vEzNVMw5UikƯ;ӮmV "{5W&[!gGJ)L9Y 27+\Qѥ p|;UH׮_(ܒN1-: j\$/GiB~+u.Bz7'|[؟@mjIFLv %hSc'ծp$%`~h`6/[FܪW]}8T=A44џ-P⦮S3 kbmDPiϕWøh\GP һSM ٫ʭ}TO¦mDTw+ҵGBֲes\R+ zT{}kXZJR P@+Gw(Nf,= vCS,w 'X a{BSuIܭJ T=ro=(ozlwQHieX u׹"&U9R /yZb*×@!h&9*a0ϩtM$Ҍ&V4jh-V8K(zd R0oy6Em2VD{.p8>D݂ɟ\f=J3:^, U\p F S3H[R9>$v6ZWk^&*x_BibpU8MXe#.S_9 K;G5,sV^dU .=6c#D-aF )|R'>EP}%uۅ y 7rs1A0ӛ3^7Rhe8uJϩ8mwq0=q}'`"(2mn>Eq':H>J/.Gle\tː!^|B8!owhd9ۚh %}ޠׂJ`>܅@RסGפ_-)@nKWG^I]$m= Ѩ`aCn ʫ @}HYcwW`6U *sAF^ ؖć"y<}y.N;#ΤS2xDAt D'Ujja/XGȺ7̀`S'C3Ǔ3oEvƛ,~CіBJ:88-+- Yߖkj<)cZ'*#ih 䧩)W1*:A2$Tew,g8 Rfw'LZ?㦛sZOH: 6hU%M)'o)weojӘD=J]V5TDVgVB{`'}}n :/~?ZqwuM؟[@KM;#(>_kaHa= 48׊G i@ѶUzjj\"%b N^{ 3T֛@9ET+%mI }SEIA(BatmmRUW}|EľiI{)&Cx+msuypyn^ X@Sf3AG?qOՠ!%d$h]+ʈ3ߚt"_(Fֲm4p6\.^z\ ʃ=gũ<(|X<q%sy-5ftLXqK|l=BH&4~Hϳ&pɽF`MM)\vBNs&̓] J,ማ)' OHH;|6yuӟgx}YI[~;?Z퐌o?E:ښs2!/xL^nzFo8hs`@5bc $!e6 [\py _FOILWs S] "U*Hcld|AԱTXϧ6swS0_=T~m+IWNIVwzHꪱ<'N3<|do/FEz#U}<;)y7ag8r y>UV 'vr='5'Q[pT^߾ R9"6iA:+.j<>ٕֈ~CxdMy'[rdK_UEI;F D)3_cÀ2Zvo'^8z"T֖"8,;.rPg 3Ox/UM;)n)>>݉wTAGԼA:< Ϻ/pB/=Wܣ XD1D 803=۴/%vh^ ZZSFr@}aν Vxhd:|CEdbE)DKUzYcK--& Y ݚ$,Cd N iIP_xx=.a:u]taGD70*y<,ąmZA.PJ11~0;5@̟!RJAD#$RXJh(YX޵?O(1{ ˋoMҖȨ'fF&+Oeжs޽{]|qD/HV ?v&.*_~yP]XJjf xSꉗƲN  GNj82֓x(Ff+GhO$h3F& ,QMR>E 6̪ހ[uQ(C52*^%r!$`BgAˢn>IxVc3nltc!ʒ_;IJ1!|BGbP+] }!<KNv@Cm#dNTMH|HI]=ʭwF&Vo}b oTVYQ)Ai9RpQ?\Lez Skz\Lƪfi~C/K$/<{*ג{m#yo/Q4b`νi?؂b.`;:"}0ZIUnUysnG2 Řc)-7G$<}ΥC^j*Iǚdk_V1r,Pnm~RYp̜ ^KTM󤯍:wYUdICR(qڗJhx1"^\-eH`^B)ƪZN)A9@w3zt|͹G2U"UVX-,>e{34K'V@Y,J'(TJ1W ͣ{E$\R-[XPm,?Ɯ5 @^O3`udL^} N(⑝xЧFo?Z}Ie[s2̈́luNo(v0ct(aYc#_INI0V`Z&cJkNGT 55ұ^`pyz8bҴ'0} x,fYmj^~LkM"O, I}NYKėFQx>2Lv;h8:X⦊ol8Ru׭u[AQ?i8TlsUt!#Hc^R>[sz]W;;TSM*UVwxy0vA.QH9PIC%d0'wz x#gۅ.5ڈS<`0#{~uυ>YX;µ2oPz z?=}2NV;R ,j9.J+5{7ZsEy.z)5NGBi}jU[)kQE7U Pń7f'6R_(h낰cˇWИ ++]]DW~<^f #:yN*ՈB(S ĸ+ĎtzEwcb/Zɚ㔪fzNn_O)؟%S?Ւ&=h*#w{13pc"rYUbaW\P%.M?E$1%E '_L;v-R{mdD$aR/.[d :դnrg?@)%_>嫻90^F#̴>CL.εkBIg -/xf% ff/ao]{$eТY)h&r>ScyMnCkD|yQ5(yKohB펃{UuwmZ?RҵkTn i}bB0Iې>kN#|17v!r2Y[XL8t\ @ S8ɔOE8Gl>eJ,y$Pn"IAߊ,SŻo3qo+<%NZG`ߚ *";2u O93}35 d^Ӄڎel{=F| W:KlL& (v|F/kB>۵ZOٰ毗.O:R1|vu-۟Xr`k*/)EB_ LrN 회Z0(%Nn6KVݽuO|f`^i,sQ$I܀Zأ&s\E L qٱM0P xN,2W_ CƐwpMVhPcmŪ[P!w+\^ۦ{Pɫ #9;IOFu\qXύy놈uH!GQ-(ӹ&>YP\E=0J:$GCu{R5fi] ;vC>dPZX4WeZ&WF]KYcf1x$8s@)"r3?rLOL^K|?+L?/A?91]=Ki xl:~–{s"GO=uݠiC1ib80T70^W#z{vJȧ18ËzM$(/} kdo<@V苌eY]\=I#R'.QmF}SfKI! ZC2}mit%#a;S6}՛@DBl"\7|NP5cTl@ٚ G5@U+ n VM2:ۢsj#fa#aHi$y#pyxSV S> X&:J gAhxHrBX",aXX1z[_yɈmxZ6+5+-$C3p'zz,L&+ CC3,mmʻw-%CW|Tk!4meNo҂6=$e^-ǜuA 6:KMMs!x4m}A?ϻ-Х!ұq>< p"g6gB~% r^;ڧ6GX?c~s @۱ji]N-qa}MA/8U8ϜJru_:u6["{o~qV{R[)φx KssFV c_")L46x$fM2Xܷ؄G_|$D,G2ed|=E'5w0Ҙ55E33@ jw6t"ae5|E"~xkb}$J0)9A`B`Hxc!}:`P+zLqX$`vPSt tTD' (_T(ċF[K2i"FvBf3()y >y\A_OÃ:R{"7k`W\}8ʤ;uX @ !z: ua%zlFb/rkק8ruܱ}QJv/bL屡YJN *H@B렷$:\'/chqnxk+>h@XۇkÇiMx\{|.ƫۿo[hAR[J]@J7{nd ˺UMG=IcAj_ 2_k- KN+nz  Y,Utb;=~YUu?@Dc΄7XqǾ+bQ:y4&xAr$j_ &|Mt]:cȖpFt(w BnyLMU;r7ɁhF.1=7cپɆWDh̸ )kM")bHȷZ3Q=,B-=L/U?pm$ f/ 4.yIJ~//bR2w5O! endstream endobj 280 0 obj << /Length1 1623 /Length2 8664 /Length3 0 /Length 9728 /Filter /FlateDecode >> stream xڍT.SBqBAC Xq-PK))R[-h"s9_뽕|3̞fa5sA<@ >YX _flc0 */" ?ؔ@ E$E%@(Lvh4ܠ`OlE7w_#rEȻaN (@ w>h lpJ.K\=y`2'#@ yh\vƋ0ttnf |ځaw0On_߉lm\AP_' hpnjx=ăANAy=9=y= [aP;E7WW0>%'a|ެ wn˝VW`@#l~7um~ `8 0/pvNp O3Op0'=~sB|q|ZJf\vOA @@g9UPu@bv߹D g@a,7oA*^n?7 A^k=l&?wV l^u8a:m˟vKqu<~*~ |erx>(aqHe `0/6AHU#0<waQqoHT7tF>?H g7z{Xv{u?d{p>r? <¿Oì>n x(( 紇N?5[[/uC)`[97[p:y ],EX5>f:Gm^:B>}=ʶ2í&̨T_7VS '_~oâ1 0qAmG`)-!WE4T.EՊ<7{R>Rl1' q=F2vx2 O~Ն礼(PωǦX34(+acȻ7]!~KVI v*J>TRqj))B?V4'6:)N:Fa}F}LvS(}GFhpra#+~tM<ڳ!U6q|ke-UCƑİ챆t6'Ǚm`޸+%r:Kss~]Gz |: vtxvf]!+ݯ8>ؗ_I+*kRLLjE"W)FpYrj#Ro6$Ĭ@'Ih8ARNI'zw{RTp2:U/. nge&kFiaADL$و9 m\~a3=qr`īwkS;cP+'ñŒH稡GHWa4⪡q'Og9 ("zP4(4=8_DlKyZj+y7@fG_7xu,5Vw1I_IjsegOCr e.8F}jJ_xUDVkw9G7NhtZU:1Oes*)ӹ4NFfdb%B7ȼ{EF"..QeSCz` ,=m˹2ijpA:';Pm90eZix.N#{VQ+[2y4PЮڏ5c[L,=e@ҧ)39N\"Ks}R@΅LڶFA\|!GDVUy?Fg5iQL-Q<9{ڏ6Bm'$C P b$Sp{yX)&>*Zm~1ҡF7YFȫx)e^~T v2GE6[.5$mߥq-ƫҾ{rc1 7e>xz>Hd6h3Ud1GK`qca=نYK7x G|U>14ks5FBgV]XCJ6oB"u~hIHShBfOj,LFiM9 }=!.^iqiG6m.Di`d1"9A"%:P˖$Nvc"fSJ_hH"wl`5ˠ \jZ߯aw޽,j ъڒ뒱HubJW񥖶 e/Qv }31kL6ϭB0ιJR bu 6h$vw9(OWIG0rZV kYj=13UA;.2Ȩ8u-n;,Ź,O ↨ *w\H?R%tƬʅ})I%C"jKhW}16\N K>9HFu*&;@PsVuqGa'9N񆥎;}tO4IR%_d&AQFEj/!WF=$J-GkNC}" rZnPtN3qFHώ^ÀBu sݵPd%yZ\l7'cifBdl6%%v@t C^8)q g"6r ʿPte:̤,۠@8O+e.K\6j|d{6Sn7t]3v;ܔmi Xes(?PQMϓ8ZnO!K4 uϨ$|,T$fi@n︍ΝH6 E0 &J~"jT~f_A+; ccS/P-.\@mB“ *nx \! C>HG7veD{5#jjdayZH:$#hJ|GVT3NZxD q5v2ca.UY0DŖWq9s([Tzh:/q5"LP(T({bB۬roinRX(Cx(Q$K7vJ_p[7BStx?+tx(`%m 7168@y9wC*RA\ h# ~4?qbt]vXO KLCD_5bie,umqԢZZW10fJ`eh ΁$^Ut>L=2gב|j(h Q2~. J,(qKzآe}Eڎu-kH;M6vV'U Nٷ}EĠ[Ov\9mY?kwV^wNGЖ bƅD_}h= .vyI;_qq< kg-Oy}7(n]v}Iy1Oj6 )q$SZ )TR |ԠJCg; ay !趓F:'\FtM)ŨhmgaRM0IaYjх2zyfNa?2#ݥ#gj2Lgr ǚյk9KEޓa~Y"XH:5.y%S`QDN S#{r.lr.c͋Fq`.OY[zIy ƶ(.^kLT挟yiip.޻BQlut$<OL.ђ(ll|6Ȱ|paмtq~6KXz:!U{jf ~^ccyshS$}ȟ'b*T!PIT]  ؎B/^ۜyPH7V۲xfa?0ъ5,]z A^vɽʽޏt _:g|{[}J+ji>R_.%2-9Ʌ׺uϝYtk"ۆGdUM !S(Q;?^]&fu:GbGd& eN}XVys7wӄH~hq\SwiH*bSΗU !bt6OW {&aT*66yH`#3~Q:s{\L7֏!X.y.2a T~SD1l(];2FbO 8R5| (QM̗7>FRR>O1?%(1U~,4Ǔ2/xٟl^paFq u~ [COSsj:dƲrZ0,;f"U>5`Ž7,ּ'xw֔AMP]Gojr!]өC[yũ=tϾ7.V{!V'0rHdd>SYIoA0+Awl)w6&Ō%ked.H*s[Y)s_&q\wJG;MMt)ytk,ߤ\̟>UhUU~Go^k^IL<UOaxOQ a$U6ӐoŤWm}M{6r X&oIgBh<0iT^v=ދ/V[Ќ+ g]^?UZ2co6B_2 |' +&DY MR{^p(KJ`pTODouiM|h3yq-^uڨ˓2gv!Bqc}4eгE%fM f]ZM"u98i>jOx\ߓ88as<_8F[{?uFlѷB0g})k Gt J169~*fg#e%0}+5.-6Ŵ12K︘N^=w,^\mrwG|tĺluyi5R#-(n/*jzy$s( c"5a.!ַzecF#.tȶ7Lq"ހUaSYj?jҭT>~,sowk\T2__>VC:mzjs*s ãk[S}} ?S6l?參4OrB:t%!Tn$%,,ߪā<|R 7߲9 GIԁQ 'y|z NjIkёMzhCǡ3 : z9wחiY 3UxW S!d]9. ɷ.WCg"_4 QR~ĜeН~3ni A+cݒWmuaD< ϨsB8a]6M:4{$cCMv6@ $Pl *LSOP4񚧖8&6s^)ΉAM[{rPX\^`5(IV xĭ;Xbw6c|*U#zmw9f4]4wڶxwbdNCZlZpowwq4H΍+70KrWeنd1 Ҕ~~,?&n LgU*"6b&ҝ].f slx)j&u!ܵT?B15ox@SOPX;Px&JZV#wEb#=wbQ1]*GJ␴׌W _Q5FӛOfSdAux,=QeDj8G+)ۊ.fUZp|cnxw`]#Ȫq#|/lu01=y)_3iƴ)w-/6Hc%@+_8HGڷ.DPB$L{,@e(Ǩ]PҤ姌>?5TOhd8T .%ogNe&D_m"1 qԾ$ ';Vƾ 7V@_4ļ7^3g[?e %>t;ȃBU#=ӭ+GhDjPX7k q-\jՍ;ntX{6!&WF Ud(i\]l3"3^x+Y/DrI\FA_5!#3 4{yNo$±y_8xu ZD uin^a'vc9Z|c#5[hU=>ӌ]dlvj8UWWk]UvthGWhg}rImvO~cdeA(JI1ijHbpf&%E*g˄  ޝݔ> 94PދXKW.z]a¬+ªE1('Z Zk>gʬfϾFj]?7wd%Xmi=1}R@4gbC&"ᶉW.ϣ^RcGSme=DdD,~"vx'3>[R|𻨩Μۋ\lNغmA#<OO-"[N{Sn@Ͽ QqL{0xt"SKDio1V%S Bѻչh5zPaεTG̀^i}b2~S^7 3Mbqx-$Ӕ=ފ^[Vq?'ab aQR$e{$-Gϱ`)5guk)|R]O`oξ7jxk/54ߕ2sH׎Yo!cׂih$ZG'U @mmыSD OKkJĕ[%7.NvsߌzPR/қ'n|ix/z&[{.$p 3 YG遮E7P4@E}=O|r$'ʥq-qL 1pEΕH"Q:"hk4=9Yib4"`=rV| :{⣨畝 endstream endobj 282 0 obj << /Length1 1357 /Length2 5945 /Length3 0 /Length 6875 /Filter /FlateDecode >> stream xڍWTlS@$T1:6QBc66CB@B 4P@N}w9=Ͽ{LHD"B`a,@T @@9#ZP^p$BP0'SqfH@ %eR @!% P]$ETCz`Qpg4.˿^(,##%Cv2B!n3$CcW{ #QΊ|_8` |`_ !ߍ S.p?b3p789x#a(.7LG`C1c k40 Bp8`#M}a4- Bܼ8q.T1@p՝@{ {~u(+ nG5; U:⦎VWG8:jCeQ-s HJZ0P_ͱJ/1@ ,P{A|`4QG8 p9GljaNͣ <0[Ho1UWUH _H`1(_UA8!2M_}޿g,C$0I/]7t?vsZ; Wo4HijCW#?:h*g h["3Fz=(!0:G *4L"KTBA X ܊q7 ?GCG7"$pB(~S\ {~ )Bh{0 A)f&Pmǵ*7|ƀVgPOIjQU^_{4˟gɦ#/)6UE~S\y%32ԕC-Mm\HwV ]쇨eI=ʳQxq`C Z= kyCl[ bK'~^\L}W]K׽>x!c'T߲1j]n,/3!N\bv{){ xޜ"FTQ Mr}ŁŕA EjRi۾b#ȴ-|Z8w6rS"gɱ/$u=٬J]*R쏦YX\ژ}ВJTEO^Nkn'UH~Y?]-V+H?<5+*ɐEɖ I+j"y X~%]y6Amo^^gHxF`^UH!5}R@AUxvV#kR%+HDᆩ(L۾ZHې_X^=Qy5\gBSV{x:zQU+^4Fa VV1a%?OiMv\u3@`%J;x\ZNu^W? KJTwBZ\Π]=s B)E;K3VR&,7S*EW׭<_!\ȥ'{12{{Nq~U;{/ˈ هI1u}.T. ]5͔H9vz/[h"/I:]H";mvX=L^hf\ .\p:V+zmLR1N9Ujp;[),x,w5!stjh\󺘹|mktI:5J;o^"-cJ5yZmߨn>$IOxLRz\G"nr$4B0$o5 !,*h2U\;"p:v17H`duu%K`Pv "sޛ] 6|g @"tQ:糙X  CgL` *n1L)& Iv%[w"֮`vrxL=1#J}fFG3oK4ǠkZyw}|mؘHhcwNE=Ԗq9aA}e#l-}DH1t{fE1SZN6_f9} dzD.HGKͰseQˢ"6f|.˨Kҕ*cWwؗV:y {) jZ\ʎ3]uMA}*`0X=xْ3k۫=ݲ+A_{:29^8l\3fffrzAW]&6*$ V>g]p_tO/*uu0V~jeʷVן!+%e NλpfSI#;TTp6p#uRaގ NbUjx @O?eHiƶܤWM<)(ِJ!|rї#U\}Bfuy#i!X}yv7ъntHtu:_Z__'_ȖfoF%o`I'sS}wJ0&[ 6m--5^?XLJiar@^ R-4,2f;Ӿ;@ʩ8,}Uڒux\n T:>Oms< m.wlrlH)biK k U{^t{jec%QAu+ f0Dտ,&K 0XR滏L߱l,8ڜbpVgWrS8T m I35UX6?*'QPByΔ;[E:W1(Tԗr]^@/ݰ6qV'tk'LYY>+ۓ$ ԕK]vccg J9 Ɋeh&W'4To㍩a}Eeq7P: 3,9Z-RUr&x348uxTk\+ife#^6Y0FVr%" ;aýqם"15KR*o#m1T(d Rtv~ȉPu1WC)͊7LLdFh.b:mwuj$".㒉ğvM(GeŔggcIޡ6o^9|H)M GCS+Ff*dUvV@Ny셼2GKEѮwl '_|"2')*W6XNWÚd1nzn CXK~)vWܸTlOH9{ g'/ۏ)ƅXӍp iNh wWxž{Ծ$bv[3zۤSݟTxE?,z&?hepD촎2ҋu%'}L> T'T98c7SQ`+ħn0vy}7'4!,} S4%=IũS} _j@{p㐋fvkpCِȠ8o[/ Ր=N0Y9;q=MJ$|.{١>5^}l G7c.ۓ}A Cjb6a9}Ssi* KToOŎJp*Vː{kG>(1[cgws7#ԷK/\XbXއZ oj֎ r6(TTT!+s\rzv<pZiRrг|P<:ewm [/`#(=/Ŗo=4cx۞z :dLdNqNqp85zSM!R-Ya\6Ƚ)KM7fA8p(3zgKk޹d̷g5">& rlZ @SZn۲=Mo/Vzcps s{wdL,g.֤G6x~-ܹ&zXav|ՒQ+{C9HD*a{VDMA#CO"-%&X6oLWWPGJf3*Tk@JpN5ϲt;_T,'J5T>|ޛԞn矇 ~#S~ۀv-ѼnۛwD6a:oU So¶D4Ts&}B+<%و1x@Pl@gF!tⶳEk5Q_4+)>#9SLyGXf$q¯ګ,h06#u5JXCf4Dtf[\G&Nsw`7;Mʫ33S!V #7P[u</-LҞuU\Aji_!6td_p:aܞmxV59/yi cLVUMx]ndk1&7A {3aOy`@`7EB\Qܓ9|5jړU)X"W4Ͱ/C9 endstream endobj 160 0 obj << /Type /ObjStm /N 100 /First 895 /Length 4139 /Filter /FlateDecode >> stream x[Ys~ǯGRڹ*U)tI# VD4I=ł ddT*q0;1RrP*BG]hS T"ˈgS`dUOT$X# OHR@"0OhLZ=-(4 '3)ѹX01-*4ΣAB2Vw i pk4$j0) hSED0*R0Њ?|ghƦvd?gi!meVԼDuY>(G)Lz:O]Ջ┶8 !3lSMp$3Y2%+q Wh,xTV./$ݑ:C0TPJ;IJFc:eL[[3\OO g[q$<#*`6S]FX ުҧPWG9o x$NďGj6UzT~|?xr)I|^?Mt.dfAngK+XSj|>sdYaͲܟ젚œ%#J!)fCLAZ0gOyЬ)m)6{i*w$V9^TӚ-~n.lm=T'^s<ʩ8's:,Vdzn0ME nN`4"|_Y=/ k2NrR}E՟jLaEZ\W ä T>)b:꼾-jj2V_GGѯ+>6G2 AG1h6 ad+`%O;n`J1*GbR(^Q^7'3B(6pZKn{&!NC+Q ] "]R/PnMߌߎ Xԓ|Ri!Lj$SJ**UV}%=ʭ_&*Ɠ!}[u?ClɇNUx;Tb-Tadt;khU geIE1*9USiͩSV0ZU9&%;&-m^3VZdCl%*$UiQ:JYS^BtKEUj6mM[l{n61+༇-bB.1`-SRyq">aSx?J)Cx@3"C@iU_p'ը<)W69\rTf467`ڔՎxFB?&C\ D]%nUo',flN=:?6?N6Mp4m?P/8zw Y7 ;_gL`2_UWU|v5;I O="HX;2~"*4BPTE!:MN`'<:謺-:DgU֔[$Q={,9uoyY&/.[Tch*O@pj=uaXPMH*zfy$"6 :CXnMBG="+%6ɚ67|^r_n}6LtZgaG7t;{I7'+ arGV%nMK ~)a$-b,ZsAk%TLeFZF?%Q T"P}B=yeXֳsG\UQLS,'\޳/N|a8.4ᕚ+nUf/lpϰ7AOI ë$NOwZ '"?Gլm򜉒["7s-GGYZNO(\ r,az7(a) 3PAln 5RJr L2@DVm5hxd?Dye8XW[CKWws, I; O ydBr sYBmwPOl<,WG<Jb|X]N uq g nN, o3EGj8.u'z}Fvh*Z\1}8`޼?OLGJٍ\ođx%~oďD_ו8ǼD\Z\ @W\#1Cq-FxT_H,b:"fbv5k1<sI|K"G/eH\Pz$#H_~#,;vK\w Fԓ|]$w?zŒKv#Yಘ*[~{:t|\8{`bẃR.W/`8Yg߱i|ljx yךp63zZo蓩ܛ0ưn):0dCei MNj2?mod˸._}3rFg;8tU{*+C2Sxwt|O͸49mz[ endstream endobj 284 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍVT۲I HG~)JOBޫT)B PHQ MQK'"MJQ HE=w{kV|3g|^>oj!qA`8ID 46W )D$,ly#XAX?$pM,#ڴ`81 {P*UP@iD_ @R kb|Hw-(UTTX$a8x" X`H.)Dxp>J`p`` 'JH`C`v 1)0`caX@4x#1ij }#菃P)+;cP>0t0!U#)\N]9¼0xX s!:.訛0bu"}p~R~H_!^6UB!8?ЯXxcBc?k7$W >`+4rDA |D+e7e&naH7 ?w (pEq hF'E!DAȯϿWDnb.X@Hw440A^RZP4@\3) Wcn@O[WM_/ae!2Mp{Ni;c,oߨ/0;/Wj#Wc+>FԀ:ߗA!\M8[70!=($*#7 Gj_꒖`X,,D1q'D"~3K18b@l/ p`A)/#X,QVO<_F p~˛*y%J'M Tiϳfi=LEv&bRC͇AoWhx%-ՖB}CEzד_b0g "M[4[z.oH{T^U}dpQNJ$V0K)A8(lL!nVhȧ~\B\v|;,.5V 8>K Fe>8膏(\ F&_zM~~}Z m]/ZB7b2ұD 2#NN _KK' {0<ϭs1 {{2_e_w+| ߌ^U8 :#--pYږ2cU#ѸH8Wᢐpr,spp^-Q:Ly5p͖%'ՈNzRЪEq))飷Y[ȋhxu/%9߱{V޾gBO.֧VMyJ9uњiNH>~[ҥ y\iƈ< +PvQ)ݵVWrg6r+Q j-ZO mSuѦ= EaNB_kŌ5ಳp [. j-j2ٿry?g3畦1Y"s6|4~qjhiY!}SU,)+ׂڃkjӯGXf ="6O*{OVTbjL¸4LAیyy>HJʙs<;ߍDyfV5~`lsVUʫ)"Ž%M`kuu܏'t}ZGm6p5pQa5+ t4BmIw?57>pܘEa8㗺 vnYںM~:YW9OFU&5ZV(S7 ;~Ig,H!,B{=X@ 6_XPUmKog~|J2/:H{}{R \Ń(q^D:2wQ97K.VSU+(kMzVؙ<1  lP=!f!*7B6G qaQ<:Y] yO+QW9z\≀v%F]%f8& O:d 6M5=S'u E[!.òi6s>-p;bW.c<-rHrB*lsH:'n9ŗj>Űmܽp-$+!{ϷLsrvJ.j#ɽ]џ򹜑_.A[h*YH^ęう8vD# <+s-1{S%ޟt#PՔgWQO"Ǭ$hȘu=9U}Nc ;eMZ=d2[剦ܮ)j+(ȨfoG]nqJYތ$? )/(\c#/}H^VD_TnQϭgeW>h|gjƭILdfDHY3e Le-9SKs$ \UX ٫;>}O43uF})b t]aTnHpi/mC7)Ӟ `N;xubȃ]e^S׿2o={M5nC6ژyZ=Wo1WGF[1ϧ  c4M*be>ހFˢ\Fa#;A(T9e1^zmKeKrוu5#_ 0o=@qe,BvrPSʕe:Y(sMgeB \k>4su_f&Ukz9 ;Z\oipTlw^-]Y廦Z$-}l,q9+m̐x|Y(Q=˳sVzm2wAM2kMƈGm\M+ԫ/=Ż滺SRo-9 61^+ Fv0xz`t9 R]i^rf Vy\S G"-c&f:ƁG +2{R:N|6y:a5ɘUFC.Q.Hn`{{> -QMPTڪ7t0 >3Z4rƾF68JPSDxO_)Py7a)jN6v'"ldhz!ծ/l[:G&ԪlhFG>A*^M;ժ 7ZCHщk]1]z:҆4~z_w&n0!-(",adg#Llm' [qto_7/NNsUaj{[F>ʰ~,jn(WWX"&^ॠNadΓb\d\.4Itzy4p'-̉pus&k@) ^$}kK"/ NEBc}~ӗ^ӈ/|OOC>PîuԸ_CpT+F2 )Em9Qq(>Χ։'uHyg<'R q?K947-D.rZGf5f5#ǵzW ҂1Zbk-* ҮfnZURCyz.,vj Oj2+ӖZwWQ`g?Lf12Χ}Q5Ѵc%\&~tU-7cKKUA:_wզjuuxK 1V[/1"kMSɁO]1{CwJwa'%oM-kٜq+DQ}*EF_O{ǎ.F0 ^|R-hxv#Ua عyFbgCRn!!%VXpK}>n)-)``uGܟ{vaIc̐Kȑ.!cuQ%[2HytI) M *kO?mfRtV &:wFR2VGL6za˴48S]e'''MJnfzBesc.7)$]c@q+)/sBcE&B.>}jX@{KtV.v}${P7mTeK=>iOb0Ib21"1M;0bI<:7tg9%f.Ht[ lz+G3iv_Y = ݔq3EKe f]Z4}F6+5Gh7L VNr+*PZŸ4ҦC8u}}y4+3кx9.p9s>ǩ>۔2wN'(tw |cꂝI$eW5.0)<ۅ"mxҵ &6 N*Q i>+ù;8 X)|8j~I9)É>%w|TwﲿU ǖ! &jHЅ/`^wعbԇHxpWu@gw7U5շ\\"F +-8ku >;o3{|2~)h~?_G1dMj}gVVeiv0!<,/qNCLudSV6bb^d;fTrÐƌ䔀S=rS)A]Jat'@jY5v?YaY+S%cNҽ՞eW;Z?$,ZL<M3(2Ŕ[3ti5 [>3Jh2̝W\֫Q6ZRlA=G'[S. f"X+ʝ$@"_}$ gswVh7oUݶT`rZLBIi5b<1 BƳMCݴ%DT٬،4C|ޖsKuntd“مW#5,ݧ+o1D4pĔ:}i05j0ugMi8o50]n,gS z2޵?٬P?p XXϳ[&F\857Yw<)>gWBu4 gS,"8AV+BÊ);AŖ$|?ɽ+V%V~bCSE"^Ε/jQJ{ Թ>yXVUȭh;dtW?.$AKY?xɁŤVq^_~<7AV/=U"Jc3rB{7`B{p?CkGW7IsO gŋ {sM> `Sqf]sUE'ZxS o<`9jޏ1fޡPvySO\X4d{!"D]#MR6grh0A ɢvl( 8`Oe V}oJM}oDksKOQ2N1Wx]Rdg`\30@B@QMl/:oW1 endstream endobj 287 0 obj << /Length1 1875 /Length2 11827 /Length3 0 /Length 13006 /Filter /FlateDecode >> stream xڍTY- wwk5]CpN _ff{WUԮSuTYQ l932Ty,,L,,l g_VDJMl/^hf7v~sSd]lV.>Vn> 8Ʈ 3@ltB{8,,?SZ+//7ßQ[#`l }{ @ l :{W Kgg{>ff777&c['&- l P:]f?m cB[2͝݌7 hbgt&#P,?2?$llj 7YA6@<3Gc'[1*7}Qdwvbr4oM3휝O4}jmvdgf3{f ; PF?o&l@g' 7/+Z2\'~/{=Md|Ar2v]>^&!@of_A]cImv6yZjJ bd0qXYYo>E*X3x*KSN?A \෉hp=Nӷ/13o]͟,5xWWmvk]f 8퀨M9I܁f gS˿F/ f*@\(FVŽmۥ6RWJؙ.6N.!N`3-&`vD3LDFW"ү竲2[L^lkQ .-R:&~WNLoqpgq gӆ:)Ӈ(z[H)h/7F̬<*J{pGT BtcN/e\ᤁ:$<Dn'Zz[tBd!cQm<&RQ:&f֫X1&)o}+Pֆkb 2T1yb?.LaT-Y , Z;r,ɨ/#tÜ{wοp78Ar:eWg q='ц/R˕<ŝv͑koh6%;/@PdY*GGer_ ZyBh*"wn@G'}EQ2cQ`h>Q=JK\8|`6Ukj5-y=qk=9YwWc.:6'HVITh| C+Cȟf/nM<,wD%ˉA=Ӷ'OJPßvlcjMҫ.I=gyIO{c@޲|\ Ch箶Vb {e& }|Y[=!7}JX˥*Ƚ=lo9F/2ޛI޸z@(hwj"r`J}A:8p> ޗqJfpjŽǞ!1 Jnp&wØk-y1+m+=GK\xz tel )>א2"lhSqXb7(ۻF$bD _S4қ\S%Ϫ%Dx@ `ENJ +\]%FqIE 4x~^;"57w[?<[x!Jj+[4iI5%peN)D *3",tQ+5}lI1#a4PMo5sd/"*j(M3;;fg2>\4uT\޴W-K M!HF_I'si+&Dh1W=, i4un|Uϒ &'LGHGbϻjPtԪY(|Β>JxgKhiqt:ڢdI#ы '˔SԷFޛ/ϻG]%9DLi`SV:A ds936Ag{쉡lf`jUVNGZrVych@^XjEO&$*QVvp1h{z7<|G ^Pl*[Wۈy{ne׳nY&Yar'0l^>KʼKoH}IsL<.e2)VގCÕfEqh`vc⋊72BqPlS*)5llv6n!K } Lݍ1D^ơC ,(;,~"muy6AHYH'EI W\Ɓ53_9hBGvI겛7z[7 !"RW62SAۊoߕr6V. 2*~᨜vy:(pIi136"iUS)5+{ܶݎDQ3PS1t0h<^pkg2;JXsvT1^F=~f{s,~D\ԕ SH' Bk  =އ>q((0{X&rglOg >BkjrW$d̙9!UيQDIΥPay&ҿ]h&í4jek봟?ÿ"aКp / v,`b:VgŨhfp}Dy p YZ- 6r1QoTxL`[%Cf`Džt}/έۣ瓋; ٺ_4V(ehIyb|18der}%cw} +t,CgiyM֘dy6+f[D"^#$hC "ӈ$)khe=v >ONwބ g 6Ҏ3{ӜsC8;md֋;˼s59١nFE@a^$Ț9!(>x.J S\'@Uu|QȷaLk%0T_rw-aTZ==fy|f, !|[~92)GHpF(N5Pr5%V1%BxGiU M 9/}3XvgŐ\Ԕ|Zs]汻 'I"N ~ֲm"̕jJvڲzdC{g^9u0Q /0{tP0OrgK_i:s:0CT ;;י+Lt[d%sӑQBOLdcEQQ\xIݟt}- v V@kһBQSC[0=M+fFQAͨE^F.'#pM3@Y퐮!;!;;Ȉ_DmFVP:~tEwN`kc`Of4.2Ֆq]HӌnD{B"QؒIR }_[z.p]ٲf3+vaC,xU:pvmޒaGΙx5=a]rN2gtZ~(b#ʽ;V|bh%rIeJ"[#740S/A%_ɦ<4t$_Fi sj5ʚE—SDpv =6Wdj7lQrn!s23K_z }VNg&0Gv3`+Rr=6ȧ۩[)2!ha20*t*:9vF j ?mq $_˨xh[B>w͔aڒy; yND.U(K5 )+RʎŃ^Goՙ]Q{vQFnnO+VaռIuot>rxWQK$nEnJs:&)u&?)=XAD'Ai8;g <YSK)ąW!]<, +nMqJςSdeTBҔxDs[d@ZĬ q)D6Td-{-k4#+dm/?_p##!=kCM2(VůX.`aߙTNr caOJďi5,ـ^MaK*Tf3n[]|Y3mFl9/T"/wPc=]r+1ᒽA}M~ Y6ߩD#aEz+Sߝd<[J+S15ғgmC~EzgTV>UϮJrr9=ʯsHe5l#n^FY;82L=$$r:non"Юb+bLN\<(j׏e+wrlz|cGKRIUJ3$:J2\crKD3H\6U:>vEluӮ8sv`3aiKZ`RӞy/-섓x< |~S~ښIZp[[ +\,e,l^?b$;ybo*A S0[zy]({:Q꿁n>|r^0"]Լ/Wي۸8&]aW9C?D\uj7<=$FP;;)5"YqwD-p8l0ыa6Zt\bGJ\؆zG/ﺄX幚QGPmл߼DJbݜK -ۚi"^O,pH婾<{5KR)ɖ C63; gJ)U;lY"Y.Wr'rI07\g}.oO d1;腃뻠RWg/ax%]U2 (2~dcIc]I!'%C"C޺ ^:M qVi9o{$T#* ifr„)0{y:Ωq >T//讥G+$ELEi>ep+OX6_bF. udP{3XOÒBC!^_sRCA|zbdiG4*#lrF/ˠuNq s :I8̪) 3ꝵ @ڄv2yJ\mW| Hg~=FO/Tbʑ٪f2[kthZ,ݳ@=lyG?p )oM(m/,H@5^LlI +5RBkg"wʜ$҅ޔv5umYH&a2 Z&>Wb,L9PֵS'!=\ zzro.@ V  2Xiqlt8E|ZIFN4F%3I6l&?" Ald!kÇm^ e@W?%@;UN~fOuKhǸ&Af~?=EPJw>Eߖr7#,'|B׀N*'\zq A>$:+c(sd<'[ldu\1@:b`> VS>ĨPŭ;A{+)Oj :} ՘"SC~Ǚl.&mXq 3 Ʈ Sܤ6Id~H6_0w oHB',HfWF @P(#ٮgDjb ~pؙ`U{N(NPv#٠lVp"'}0%kaH=i G('ϔK\Z`&DQ!KXZ#`% WiΐgnܧWFŵ,]VL MPmm:OʍDU\!Ra/y&%,fQśhf.}\ʽ0=j7g cBMf:In[ |څS^EV7qhg|=!xՏzI ln[1 4+Ȃ|&h q=` hLV:RJ!>_!|;! }Bh䣡1<ÎMu 0 B$}Dj,T67oitZI l;(, e>VXOVlD\ Wvc}Dm1o3nK}`bGqGh-sl{48IpKoy$z;(^Jrn]ך35]`DEZ85bYvb:z@{,e 0̝h\WkgTBvCF"_S8 쭕8the@tI&ljg[YF{?>4uYQ<iIK^a4ɰ|/W <ܔ( S]0n%8lEr)Yj/z}g?wCTDL:Dǫ9鏬[Dlk_O!`gg. c?P)-B"Nb62.i,RʙEi6'4^1A1,_Q}YD!c9,c=XsLz IsMbZ-Zz!:4[4h_^Fy^Hh!06ďҼrZZk|˪ZҋTqd_ag㽫G*`,cխ4".iϲ)2B|70os7A.ֈ!ZkLohd*>fC#v؝T]Fq+ aPn¤9gQFSC'>+EbQ185\u1 <9C>D~ @V3Y5YąZM6zf*M]Nf4&hv&eYv@VA"wev~a| ejNA5r/1z=L%"'=cQOM<:z8cfT %q O F1_AEfc/ R$_3ZKV1M1,1$nR ™>Yc(.BW( ʖϑqs|^tB#;ˠT,7&m<]v'ޢ-~<: uۮQgnaՀ*= 7XV>g3 c*#C͞>c\ 9-!=4؀Jj۟p9 4?zCNPT~e|v18OMM.׈.5;/¤XjWm|n88]o7Y@r<b)ZSL3ձl};&֠`3B mUfLT:靽7Q}c-fY0#('$TjBNg`389QXH=Swu#J/pCJYdy吏> !rQؼAM++I1">x&3?)l԰5Te5*VeRbN_|?xIOfs L\׸cBY"RxOde.:5]xRVL j>7p o@pXTM[!.t!rcC!7 2J= TZx5h>u@i{lz@g,f]8t, |7Į7NQ^A||_(|\m#mGK!Th8vXI$m{ܜ:1Ηø'Мvy}9!) ~Hѧ 5LE~1'5(~K2eSk^//:U&g@%>$䀫+#.R\'.5kMVےKd0@r!!G{M#м+/;E 3n'B#N\(E[<܌H^<"݂t Z? n}SCVq_1pII#,:`X.gڌvjYr򗏑=.)Ŭg8]@p". дoN8YhCw%`I#-YVH"6\ l ˭%1qKNv[i׉̤d/E{Bm ]U)^U>eU6_.( r"}矬 ?S02n¡ ?#$*O2>&U}F'KGΗs[#&;/@o -Y{eϯ-Lª]'D.2xt uLf<@e]rYR =ЅU7g&Aw<56*34V޸ WN_GyBoO4d8$߸Hrh?ukZ8&K&3ּ|-i]tj]B꽿*oEߔL0=A;27XHʇ] Z3>N5j qpaG4]f)1ǩ Er3܎Wfdr{W7B-%|~=rdfȅwʬV,( ʜ>O+!;;4f'Q$1 DV 0<׃A>g,U ISS$?>k::1G̷xɐ\odܯt- *iʽpgoa&gmU50@% JG&}2jF/]ֳ#5:-G!QY 6׋ ,緞Ʀv}H+VI&^b;d E/nח&Ks0| I#JQ!{js\!uއ_QLlЦ/0cN$ aoBv%(o/S$Zme*L " z7޿s>uh~ '+z}հ2_7`]J7ԗ:E,pE9Ul!hy5p@{5BGͱW.fjC@+GLN.e腞CM$[u .dy^nn0ތ-q,Or{v;PrQH30dl嬍@ 2zC=-L_'7`5L n#!C,|G|_y|V1L쮓f5Q-gGGwA;FR-?"nS6p:*r endstream endobj 289 0 obj << /Length1 1906 /Length2 13251 /Length3 0 /Length 14434 /Filter /FlateDecode >> stream xڍP۶-w@pww48C K Nr{U_1mͱP)1ٛ.L,|qU^ ; "%-/)"&/&)؃rVv++7  @7+3@ rFwttySZ+//7ßQ;) PXn4M@.FŁݝ hdd!DprANn 3t@;ПĘ)V]܁N v~spowd?@࿌?eiL :MM`O+P0:ۿ݀V@7?DU7~s6urpqfr!aYl&nog8#=,  lf3Wf +HVo7?2 rii Y(Auzqi w`ˉh}?1ȁϳf t de+rֽ{G}X¾A59 #1<,f+\=X"o-yl]?';L[.-ZXh("EaH]cDg:dˬR7ֺ-w%B >ז5a9+TEcԲۀ;4ͭSVxg_dkQr"׵sȹ9MHǵ~4,KM|tLh6bUK6UNòLcwp)r\Q Ƀ\6c$K1isTjD"JX/l!`pr%eO`˖ NA¾eȑ2pˣ" sT;a]Oǵ0?g4Rڱ`%G.>3MJZ 횤zֺ>/nTތ|dߜL7{2TqplV[سMVި^TP]ʍ'4ڽ轔lj〜+aǭ)GY%Jw_3QB>4_)(< g~Ď)ˀ̅'W{lWewA/_>VK(&<۸m"bڙlËj3yJR +۠WJ~@\£E}J@=@m]a^t`Q M_v~*jKWYH:ΐ%1iY"*8܃=RH4>}OQv|0A#ų%Xֆǯ}߅vR,ޑ1}[gNrh"bmtM,%||708Т ,W\n#t;O@S|Jub]m\Q1%SLlm;cgm=/ 5l .5X$ΆZ '&3~ԥQRa!,v"H k3~2] Rp:59+Ͼ3yr%dXaR}J6n[`eG9qr*!|=6H~w׽R;Vȁx誫(QA*pĚDm<~#P`+_9)?"VTS÷1j%L͂Q )jj]HFl9N 66Ǔ|Ů̈bd sj҇>zNo,oM4Y_BYe4Kc*]\-bY]͂SG1}_#:P`I慞5~OzInW!qcZ"%WvҰE)g -Z_A14 $@#Zӱ!iiP5x0޳FUvlL9h#+ n9WFAfPE ."º<q< źhWұ[^I i3KIh{iNm!<.IyPdR#,PҬLSR#T6-B2@Bj(è|@d<n"! +-'NVa$E|5BEн))|qwp'W%.+K~PE֬*9UɅkj0t i4Zn35t-Мkíz(Jt%<[؍?F,>F6] V̟Q 01vjDGsNr5 >n ox`ΰ?P.r.+i8d սb$j&k8` yϼ+Lů/_]Urgb?N^0lT Ld8Nko!(*x<4 8dh5{e'44>LxdȬ~q1@&2gc.P L)`-V|P(~m\Y|" *̢/?c>Yn2G(xmi_ўA0ɡ<[5:};qe vU`g3閩짇bP<0B= e u ZeaRQnHRe5z9]l,n9n5dvkӅȨcȞ>W1^LpŃ=]؀-Dt-dcrγmUo fDx^sC6 眖س0ytWNNնj~XEUrMk1 YTDfL q6_Z'Qy 8Zw|Z4^ZH!2dm٨^\e>S"̂ͅ|$CkW :fE2U++<_?TF֓|9da\:GAQ֣JUQ'{<#oc5FuM.gqv} _>,]D0V^?aN9)~g1g-Ju4};I$ $4*{6|đ_](M:B'4[.E[{ǼUd.I_Ե.a^rbaN1axXLtoPl4ȠhjwB1{|5 Kbޒ"2yOm+|1UH9~sgRN"9\;IkŒ|d.FcM6 ^ϿG Rt6qkEt!m y&x¸#D'隌X1Qf枽wv 0j}xRJ`qQ͗ $QѦ<+Z{;VޕH|Q-owO CATm&o='<ܺ-^t9&;owpN5yNthB3Y螱LP W)>"M*Xz!֧AX|~9.x.@ã'_NGj4Y 1.GG Cw^'6!&6Dnr^,Fj띒sItRpόySW8CE8ޛ . KLT?e#wf J 7JޫayC᫣%R^hPo_3S>R5b}TޮtjBߤJ;y.~#De&?&r(@?=eKspB>=P\A/LÝCg1~΂u򏡓TP!m,UL̪Hڏѭ{4b[e^,&URj:9-U8F#06'(3Ğ(E2LOO|mJa,$1x/̪8B(~(y[Qg}7Ӑ+k:؊n h^^)ꬷx-twaOj L[Ort AtUJN|Hum@tr)m68~%)z.r: 0HUU7q:,Q$"bC/nϩ0O׹%4wQ$N"N%H,EdĀ2x(B;4{ᐪuB h>Qa{UiAsȣ{ k&bfջE3q dhnvKHrd tUjuPC=P czۿENw $oΙ'fu$w{~Zb^✉f⤑3+DL9/R.;nJlLO-+1FLrdRxYQ O٭ _U 4LLwW(.]/#r4*H5{+`TJ8xjaY8UǑm$eբ|MA0SZ,Z{T~ߴAWf>YF2%<6~:()w(wYsM?SFp"{g,[!4.7IR n^Uf9&@F Ё.hr ~oD /FNjTÞgT4SX'[*fIȤ!lN_%9cq{PuQpH {@q1b Y]CܨPil-W2UF^6όwyjfeDTȁO85@T"^)deC~\pVE]0?`+a[V$ }N7q3|\[sΆWo˼p b뭴OCMHΦdmT<{ˠ$ﲾp`ȜʢmY[iJE_VשU~{ =mTsW'~8˟X$=;|OښH./M?mW>9(A@eAyD3eL,'xl͇{ɟ'\s_Np^%IWO=Gm{]`֊rIKΪU RtRwU*#3D3/­0*Ng>iY`),(GyyX&'FLKO gu:_SEMjD}:d-f򹡁>a dax{-uL]8ydyn$ƴ4#'wzcMhyGP!NI Є| +ӥs}>*2cJ ek+kb7E񊪞FLP:LDB$!/$DĠ& 9?p!r"̻5X?;y4s`sGu 3G}|YD];XEߘӻ(ME+SxF?b=`O'9V+FG/CZkBVZ,9 CU.Rkх ƃ1~ sNm0ZuLL2tFB"VMi{ {g|N3.k0ρ7a~8i.iJL~Й79lcN!9]W {#M?ے4 2FӔGt ]^oJUm/"d7cZJGՙhki͞!hR7nӞfvOZ +L ,*1[Kɗl}z(oRŻy3׸۔7˽k Mqr1u%5#)!^;XJgmw~!LiM `?;n`hy"⟙Ed(x2#^m>h./{7Y &qime}9,mLTh0kHo.O7_^x"Ń1-v' -m݆/ŐV6^auIKw٪ i֝Tvc !&qm0lt]Ƃ9"7.MRN2Zu܃7jThRPeO!{pFJI 6ݴ#6tОavt>zd}v«:)ہI}oHTtBv8=PYQG&4JcE Ut DM j3zq> d֑k-ZP3eu`#gRFUkJ hXi˛_I!Y_Ey0s@jDȪyLdJ>.0n3DC,h]M-Rj)%{AhyR];n\X/\a_jqՏbQJ)YF3͑ҩ$ 1V ! vⓟ&[ E/k2gqE_XdEL{(Pܯk#n`m|I${uuq١yx54]&aĆ ;PxM/W xRgUq>!dʔע1p:X)vYvU SCaqyCJqvz leg»->şCwն>ޭacrKeDz0l&xvX\B@jS< ӃJi/d'jNMYiy1tL#7IvsG{VoHV mx/)ՄXc:?jao',0]Jrph{x:ؐǐtb,8e,}tfx) JUϳۑB/"Qم[d'dwr"T 6~G`> =6ӄ|R5(dєϝgvX۶?ݯs18r<.5Tf9)#;Brĥvk5agYõ]_)僫:)AݕW3:Nzv*;%zXCJqfs؛co6:2̻>^y8 pSćYb1b6h=W6iY`.ҫ`b|زrJӯoaJ5ƛ*u@Xӧ́'E'O1%,{, g00qV|FBI&Y1J۝xp½ OYn xmǧ1mR|2.h{8d ICH_l~ڮnP#D$ǓAC 0]E:J;2;ECM^l>)e1TNxЅo {e;s+gl5 xS6o*t;&vl*}?9-HTuDq,UҾYTVoS ,5V ;'~!Q<NM-h6`! b;Q|mb/=;`ĆGR򐮫NN`|5b%sL5FtMw5 77PjRE767s ٘IBѤU} ۼt&䚡3qP `W㇈VT֌T7d^%$e0턶ZXOIߞM>C mnGӣD>C&!;S~G;NUƗ⾴@?f 9ʄsͳlVqW XtuH ^iq+!LRi "/ZDv1mKձ(aRq{bUKQwyx2[VX&]^? MAeBtd"-oЮpЕ]p/ޠ?{g}Tir1aE \=| >z 7-Pud*ʽ*lSf/Y`zs (P$}q%i #IꊝLO-__#wy~<z[ ^t UϬX]lX\n3qE?Kqg\c@J茋7j#crrS?g!UUt_ qmӳkJJUrl,;3-0yv&'J-jT_9Y!xh4ѝDFm4Aԇf"hqFf-ӓ}џ1r0CĕezY8ܑZ~xZur) >臮T}TTN |< iU;B3}1Pqp.?'M=RJ,e}d=+e%riawv\+F :è1ṗK%/rt$QVϯt#ڞ!v?ՆrĄ79aVԓՋwW SrjIq*tu[ig!]^=;Jz@_ kEмVX¢_0+'7nL Ŏ3ҾӔYTL#w O~"-ɕx]js^wS?G"Ϙ}FӹAyRcÝ)./KQ]Pp!ژ^u 5Aӡ8cl3{ݗHxj?dC~_IZs\ U"f햷/m)8 J$ "$- DDL($.@"R|n"KՔEm$ZDc|aS nKoQQ+,IA{A2ȓk7\4%ޤhv{8xW$ehTڞ(2FycW(Կ*2AU0+NϹQuZŽᆎ*62 bET҉C2Vx8 R==~q1*][ZB>.z"gO` |Px}"l=c. 1-qN}gjhM|RH!p)uH;"J*!_ղ9DvA"+X= G8&.13xhMG]bz+؈iO^ >?{Xԯ#fz=pQ%ZE:jXO&R=4דkW!7pc5'zX;199sonO?-@pId JOu쮃XDmSޓpJeNd )˷؍syJSkj}W? )mALh# Y ]2 ̋c?7j%x+"Gm*$j~A_t6:Ԣ64&ѿߝ o]-sc/;cv/OiS|x ً<<_BhF%b8qruL&Ux=S\ W7D q p@nbr H,{lRj&:C_\#[ڑȽ'Μj|6dz~}\zÿ3\iϬƝQDW5t^V{ 5<ؘZWAv\0cA@x ULjϊԑj|`NU&Sj%xę=̍׉مI$h7E `RJl'z݀a5ʌ~ h%ulqNU,2+A3A&LG HA{ORdщ'$jHQ e LN?Gʵ1dqk"lA I}r֭GeK&)dp?| +whLO;nT3D{rJȣ)):znq`Rx S T("O=-ej>hkL9oW}eS"URQhϴi7Ml!;D$I*.!Z%z!dY=2As=MVrbƨ;NT_k>/(۪2zw{#B[Kyi;RhחC_f8w&zr g 4+қKb)+ TCEnH;`^{Dx)ʥ n{1%:'[*O$`M.+ ~;!FNŖDLnIXw?a49,_x`RF 6x96ye=suׯ:iC'RF^V\ʪyvE2{Im1͈kuƀɆ|@ՙf)ݜ#cΌ*2l#Mj'nJ0 Iw$el[,j~sƾ Nq zcۏhmࠏslB^_~/l]g'^5'{Rx riXZV_ʌ]8.pm*YCZ^7->C\0zK##]40;S2NwYjxWHPz܍e|1G-(J&LBe4[]aaL7WC=bxUadE@Ͻ0\_Bwy>ShY‰zLqiO/{iWt3^u\ <Αxϸ^):=>I4o 3}=5x,p_41 +cC7~nh-JIzA>peO& 5#9`q|i:kndzQO2[-@2fR+,x^Qt祚ZiYXJ2&iqv`vDNPEŌ{\^Er̻L.!ˆΏߜ U]MA;[qpT:c}J0M Gfr"y8bp;w)1Ѹln,B=H0ٖM)~({4%eIe6rҵ[ÕzMSx{Sӿѱ!ke3|VunVr!%\;gԸl@v.'h #/=c(P%o4z]~ ˣ ?Zgc˭@mъن.ZbcR2HjOAi%u?kR-T/":Jw_Եsɯ?=uV/g2ˌ4Oy1ejLjϑ7%XQit篥VfT?2ӗ҇H\bF; endstream endobj 291 0 obj << /Length1 2461 /Length2 15972 /Length3 0 /Length 17427 /Filter /FlateDecode >> stream xڌuTJ7HHP1twwwPݝH# Hwwtם9[?fϷyޡ"SVc1w0I:ػ2Xxb j@  +-7Jb`3L7q*8dl@6`ea3/@u Q98z9[[Z=@cF p19[L\@v`f&53kruuef`2sarpexXZTA. gw9௴&vcB[YRsp0q[k3 X A#Oy@&!kMM콬-ֶ <+/A[)XM"*pՅ,2.ĭAf{1>_92k[;d#&!Y\,,,Ƃ O3+濜{9f"qtpXSY[?H>.& O"$ `nm 0YZ#&,)p豀`xm~hf-)qeuy-* ade08\NNR6O [8x\AϞזxAbU/+?$fkE_&vֶ^+xKaE@lre\Mk!bo mF&v.֞ sekW3_kgkmRvp0YXkflj x:f^%9VN xX98>@rpsmMo+` k?vp-X0K 8ɁohCL+bo]p;+-{7;ӿ?|PfQm:#wpuPvN6p g(4kMcW`o3299MHQK 88B ?Jw_ |2Z9(8SW?ٸp~p 6w`K \1d .7/=!-9ԅՈz0pjܼ#Bn3A}W{_JȞw͝-+FPF-h}<ii:ƿyMؕL04jGyMw@CT,81 :C+wO˙Od ۜ{/!l1Lަ^,5r7=ث W'j{O6T⿴Q $L,@"~aD;C#bU;? 5ڜ^*ve 5us GƸP9 0A[t؍XE9N?ĺoPg a; #%U6q< H]Grf8H `Zᅨ\)#AvKLBTt(E3mW8}?="pӇn=Q'$B6^l"ҝ Y\1͗9T ?DmRg;aFavv#}%Z0~29{<~Є*?g |X8⛖!Ԣql7/H]cZ8nY -,zӎp-K@쓛 YEפg 9cW]i܂;qdmȊ<3XTuUDFc /q:}laz>X/4'5UxruQEAa9(sE+QJŬ_,!1G{I\wW~@®-ɿ b)]|b{;+rAi/.g3+;RsS{^2@HwnH/ zk w3}3y&eF^ʖv|:L{?}d`ҺsF(m>Z_`G8)agehDmZ^Sd*a8{<,sNri*u0Qvyws6=";ibއU= `83mm3W\hKBV.6.$-4ݡcԻ(i tQ1 >33D"ninx#֝<ǚip':D'&otJDzX]/X_LoJ\[> օɭH%B +Gfp~]/LJ&0t&cKE~uk!o0_ C031E> [NOo+&H:"~ϵy}W;9pE՝vlh񨠤R &sdl$F\UF@G;:5@QV=E?^1QDh)-$qaҦRPjE=Ї$ Ar=OiϺ! h-祬~bxwJ7J_/F0bFA=bl<$DIr5݂$,>1G n2t[jKÞ#\ m\DZ#9c^6$^krhs^Y-s|ίFD66loG8Iy"ц^(6b+jZ9} U9>VG-;[RK#\eݾ^kc8;2'7͘ǤudX~ ʥ<~(hJ>5į;`2&VS,@^9|-X6ZelF56"?F ujAQܠƮjܧfaye9\oA+ !зs}y.#=)DF_ 5EaA&trܔ\o!_,f1%a8޺t&o,;͌%:1ֺpD;O'TruK/[O,'D 1prGcS"fb袿嵚hv>$Q|ar}ZIjD ]fa &Ӝ#fꇦo:1u{/\!2:N&IE?db*tN+;pLQE}U- x|d[kĽju^=bz‡.B ,\Ev"i엟NnmPj:neZJ<z݇[W A h]Ϙa:.p]a$(b8>Qz>ehЉR**v\!>쫮8/5]s(C!mIeHeDuJF=qCܹj=ߣ$nXMB1֘Iӕ6s6eG!s0}bN&N&!b% ""gƎ1+|>3*=FAsYbi鯟kD֙!`fX}sL0kиYݠ?7d'h/ꨘ+ rt3x^Mm"]X֢>{e{bjh8"|x)im%aZڤBQg:tj'CsZKy6WJN.SE[Q`wf=DBi5$JSÇQnHiI6d27e#]? A < | OP5avrrCҴ /VU '}K^q) 1CD&dE͵7)bd3pvks>ADW}rv3b|7 }42z8v(_8pgD |rnyY@\ j&ط '^/y@5nv}exy;=׼9-l\'vCtei ~@b|A+ GڎdQw/m`\m(xBbt"| Кqpdl=AQ){K<>ܒ~}+WPQ?䍝4Fro!*{Dg*U߰;]{r>;D5!j!7*'&a0Z!b!y? M /iz' l+8^O@*l@p17jcGuH`n"OH!uVc u$:6n('帤ɴN=GQןJq.?Y8ow9FAut\ϽΪV8꙱ګ>/ RzR!lnLYqRSt?csT_q"+ BƘCs&lF6>xGvruHTV]A.{lh_u ?LcJֻ0U41 25J>{Db9[ϩ&% B+odqZTnp#&k"cN :j?BFfW#y堛:_RCNӆlng+9g MJ"! TlɚP#YK+mj;uطvA͜l'BnH+zq=?8az:2x'J&V](ic+)B55(ӂ_k`95GThZȉƉvYThgeFb߳A9!B*f=":~aF XؐN܊q4veQBM|Y9unAs݂{ Y [|%6GB(_5ػ+8z4/ %jtg:6aj^qd/%wJVx7\c-uKYW10ٯvh%(Eŀ_0+N GU^5nĨɹ{l'zt3Rbpg;] \vN/-iƯωZ@r'D妈 2[ ._6 -;;O8c{=a(F# Y+|K| $NlO=\uNK2+XjMϱ{:|3-MhqƜt 0P(%SX+LyFzM>o$6'Vb^gulQ/EFBlUW-wOP.gTNـᄶ 6(vkvVq\I$Mm,cQqɞا]~:ȟrX{ϗ|qA{5Vc-XvcʴOb/o_#u =һ FN,$v DHI j .c+~w M}.L,TMTVlk%Lq].&?ݵ8Yq:!e.hιztZ3H< 7S8T( #mnEF=@Fr G伍dav-Q|"~gj߿rF?Џ01K~V4H."sv1 8yHgX̄tr~֐9 _ZBQc]G׏2M@L]J+{';w◐cK,pL~0s!.V- +<jV k,QcjRs)AWq gcM:Xќh ! ӿwOc f}×FU#UygU؏Zw> ~w>ӬpyFAd* n!&k4sX4e+ID~/l3>zUݟE)^)jlz|fCu^ӪR]=4e`.,(6У,m; |X\;I؋K=O<,Qtj-V?] 7pdj4br$e(.3BX⪈+W3~AvQZ,.]n#]bvC@_ƛD]ņ2 ML5ŭ;Kb#F%e}an$zUyNqV y,Jo~4q#ѯ(^6b-UN9YLfTEQ }׍ڢ@[URu}PvZtlZxQui#M˶ŭt isn1(*0%3wre䭢m傛Mr1X)^P^EI'˚Ŏq˗ӕQ)EײkPĠ/~ԗ^'\{'tė0HZ1 % Y^Lֿ$`ݰNMZ kw[MV+1bY\:VF鋺d->pc%\Czqw] sI5t@N~D_MQͻاҞ'VWGΐm0 r qWBl˒De/&zuP8I|I1%FbMf~ P#g2h? ;91rIoB":%G gh#;'Nc]~Bҩ' Wg#r#]{ZQ*9]:'PW=<_}B̿e-NP.g>*>E_‡o "6oRbyJKVhf+?[!ȹ× /, ?ioIt7^@'[k~Ah 69[LqO?6IPpw2к;:$yϊ'Ҋ ^(`|Dy@@ݺ[̽YĹ+tֵ*{g$SToƞ*6TmdBwU3~dEXUs,)yx{ s%ml+AZZHE0D.73|Dn$ɒcd6@>f H`<eڕ7f%|+n&Xl~p^] 3[):'PmajuDL.-~rKY6MZ2\0R~Md]ڵjx {F:mUZ*)& rU%dѸET₉^n`r%L(g.[ٳwЪ &XӃK& ?> ֤`—fSB~aS8h$)+FSHvuqc9WC4Z.f+i%I1[vlgcŒbiW(Dnc t[;Fv΀^"iDaf.jk{(,܂ZH4ؕu 4_D2mc|?/xo+^fr՜sJZѭ|DQ7V ]T{;U?pу02fwIwyWΈ+ПMC'}T2idEF\(x|ޞP[ \_ϼ%yqѲ^ƬUΊӈĵOo| XEf$48"LXom6ޗ4K[C"Ɍ_ SEZi  EJjI'~ snݥEaBw:'N<ᢽ'~e(!kj,81nP^ۙz (. aSb36g"oJDو"}<(ZEFc ۑ }Gb,6pP^QٕEzQ9%?19Vߠ!:Xt;{ M [ lTRD6@ )t8lvg#r{:lwE$KIbɩ*Ik&ÀJ9\R8H,P{ټj +;hRaXTp&h7L @*$gzKU3@~UX@Ntlo%O ;ǩ|SUq 只.A2* MZ:|`Nz~z=uw%j1T>XĞd }Iei^!Oْvű6)ij_5⛅yo?v{Qd`†hKLR9w|WǷVOe #@DT'¸Nr\$㶏)Ch]\@1,# ftV5]M!/;w\΋O)SR6eܐ|I K1q "m)si+엜%xNyӀӑιHy$LNy#/2(#FXW;H[ o 9'oR>dOr; 6lam>i@D"9{9N%o-Ip5h9s Z< {N؟gV- sz:z\(9!0$$G%#$D#(ؒ.9?wvrFO-~]^<5HE6jӜFFX{3yFɷRX_ Ii8FyQɝWbcmV_]|z(Stv5TYGJt2171mbh+̊- ?f4/Z= SC2%:s1FWu((vP*%c"TqhTSf#`sB'V{fW L"4 *At"}[[8́>*w'X Zz+d*UAk (N?=Knf51gĴHnC׼w=Z.[Jf{(&Pz8ev`ےKR2B. t:.[ Ewe?3}Wٲ1RUMJU8:͋&q&1~ I97̇ 6LEQEi {i$ 낔?mk`m zpbpj5 a W[>xۯ&{iTD_d60hn+ OT0:RC(Z:`bDl"ܴ/&2BIcpd<|A ҧ9B2dl닭˸6glȧ?f;%I| X(+r®-lex?9%HjF[fJ!IHG'W9=ȕ` j9^N"SX"-e[&/礵RSx-ϝh²#"]Q-?e5:&Uҋa +Ϫб  6X@*澁mF٨Ti6ӯ4C" )\&%:!JШNho$j:!FɁ5' ~AYiTᮌ(}y!Y<=)zҘD"JYzI=QkEZm87-o"!%l~|c|-q?!L$~wN%}b${ۂ*hc?;}ˆV㘠L1T+DU@k'\je,PX.և3`o> w?}Qrַyyhh|ᡄym/8U&X3Rx|of|~O'+Ÿ>?oH-Ki* ,b#nHo;t(ۡ'6q{P۰JqqO&CʅxCNŚP x^w>208)%&OCf Taܩ(oU[Z AF% g?dD& ]L<[L 4dëw0:uV1;/L'AGt`r=i/-EVN|b.2#+b^ zaU}E3^W? cE-_ ƼiAohp<^cLYf(HePVClh/ x1)5>Zk{u3n@Bff0fP.}mka~Tnw:XHg8Ŕ:9veAR8[rBl%9h4MCZ2n-[w AIlrQ)> WC ap$Z ?` .a]K]ϴoaax߿]4/}6.}# $Pt҄+ƺM70 (mJl"e{(pvnҪ3l{\|&lc]bDKٹsE'G[vc˨Խ] 7}!|) (#pb,߁F%C=bJ`sŌ=:&D}κOiUX#<ӹfG); 1q]5`7X^pZ[8u҆廞Ul9یznwF*0| Q_> #7o;σ+_/=P3'{\-ӭK9dh٨ 3 C'TJo}.M. TҒX!аVpo{gu%>+@.grHbܙʮaʪK=L p+gj|p3pPېr]JKokX5Ԭ!&``L"g*Ta?AN/dLK>{*8~ .؅ރo/n j.Z5NdRD^i"XPhEy`_in\ b"&4i:|}?>!DU1VI\sJ5ɨR$O݆GB|3rnݒ<7Tiyz_- 575/pGл ?L@ۉre]4L<;eFN,[v&=ԑ]XYqL `j[|q+N:}' tIr(!x *Vu\?2 `KQь kwFnAWKcoڙΒ&xTnʓ2 y !;N !6B;G`෧jd endstream endobj 293 0 obj << /Length1 1382 /Length2 6009 /Length3 0 /Length 6959 /Filter /FlateDecode >> stream xڍxTT6Rn[A$aaARJA:$QR@ZZAB) }}9oZ{s]s]{fmN6cA%=T@ d]cK @D&04 ꁂ!2P*"]O8 "HȈHʀ@($7!`p8U0'g4߷(A=`0n00FB`P?RqFen(!< C;FP A&D 8P9ho0„x":`Cu6W?ѿ!G } xc[J3P;%(+ f*H77("՟* 컯uE a_c8x "`H\Dtc,+#uO8/z1*Ebo9/B`nB1jPB8a-(r[t/; :X0z`@aDqP,"S C; H s,FjG{Y '߹R37ҡ6ryƪof~}[lV/<*|oʨo>X0,Qu,[̈́_ڢé_Bygـ;ӑ Fvg2]]wpI/9:%TYb^͡XZ)Ƕװ42U7$9iaqEScm  Uw'w6֔Fvf/^,DU}lM?SJ#%p1|uyU_nG)\.x+,>RI8Vlx.^oMGqx|dM!OKxj %fÛf/LrZ0ѰJi^(vieM$~%,GTX2Y'J`4yVAe-7*590X09FzsG -7N$ѫ:pD}>ZViC7>V-n u+OfхLgrQ^=exFo=6C3WLggdKoulxͳJR6i&2ͭ). {"2Fs4T9CKٶG%FJ 8>hw3^Vwun&fעXLȅnwtn#j]2J $w~m\>TLނ'2Qߙy=;[ʁ ۮ K+F{<36 l˫nXcd0 ?ԄQ$,zݤ<X\ڗ|'Yw`wN攅v=R`Ҹɮ!H\d ߺIP.el*fF̗jd#9߲Gw v#@)O7}oZ}){ѪXn }[703h9V\&jx0ߢ Ӽ*2 A<2k|V$:vay.FҳkJ'&zB9@,?Bz`ݔ~ǛR%?]|MBz?e2<({2̐tt0-&Q*A}mIː,|{ұ3Z .{ڧT>.mBx"uϿjUu ህ5"'Gw&,;W𠂟EIc $Cboe8D~)FƧ[TsQ'sb{lÚVP{hh H*_}{. ilLTXn=YÓ?/H1kNBv _7_dz㣒},pF~\dRUz ]PZU&}PUGWe smNi[-zZBӷRnR{^WU~9Ca !QL1(WBkצ`G #hMt28EşI;[ͷb݃dp"/!btFÌIG*EoV ݃mUXU N޻/˦9X𾉛:N<0 < ?#`ЋʖR1])XN\K8Pdڦyf mar&PQ:(w-[JMj1~7٨XWpGi*Hl͐f[!ǡZQmckj+z-Ytw<嬭JU\yY`X͢1[tfDrrXޭ=8^Ԓ+;p 7}b)+~FZf]R?f(Toisޙ q;ZIm}E5L0BoȸIk^Zѹ-Z;EJ&2C\ajŧqSzʁzrI_9)s9js ;b^rkJtҝ,N>@M^Ƭ|Yׇ<;D] )ɻ P,= 5m5x?rmofS^4m#jj'y0\;|QLY?6^wn_0qFWsv).$'Ĕ(/RK01n뾬 ' MgOV-5YER5[l,'HpMT]82cTp?h6XTkP;]8-О7pnxhՂ5lBphB"ϼn&{=\f2atUBIq t3ΩƳdI7_{}j#CUpڐt< i 1`pIdا~N'Xe_xo7^3NK9AnXp:PH~t8}xjRn7 j{y/yzu{ݑ q"j5//Y$cLQf+|7?Ī_jx8Ḧ Kh!x^rc^*?cO ,l} 2^c=foƜ|cPCB#.L[~pnuP͓ IvnPdGfPp(b^mV(H܊➊M2*\T`|9`gjDnJ4i1WUlY=2?H_xH4 .}bj ?p:!RߔQA'AH]DUܬJ>TKʇ_UtbXr=g)%cZ|NoIJ಄##'κ%}m@#ͯ&YG+o}֚'pc y~\2鵣WN)1yc '6 )bߺo5y"q8^h ,ǃ{Kt3]h4p_Ghpk䟝7pcJ wlwDLF3TYG1-QX̩M.m *l>{kN3 9Q\Z1=@>q|"lVRQ^d?q`pȊfZ'ƹ;ޒw).J#gf},jT-gD36F=$&a ,O: ߣL KlX|㝷Ǽ0R&\_|`#ܻv"Z æ,=1nqӃҠzGYwvÎ9W ތnz /veə-+Zt*W*8uynUr<3:sRtBMzru.j)Ͳvd^9o.֚XAfB1.q+Ux1h/O$Z{MS*oҏ|>ZxBޭͪ*1Iڱ,kj'nmV2%1j5Zfk^D~MZ/F@ o\OT/Έg8)}(w\0jC"vWSV ߯z5e!w|%+l\> m+":.uznĞt?@&$GfY*=L : QrF2[7 N&:s*9~Z3殿ىv(w%~zD,-;6>ǻ%n4x𲒝^ɓ(S ,~߷P*wH@]Z5æ}sƓ:c8eK)ŀESJuaL:LtBNIK-r2hXftAtE~H$ju ;Yyۓ0I AZ] U\+ǩ>JRZg5>PG kǤ *\Z%65҉?GLX?oNמxTy9Am8 .Pؖly~aZʹ^0W@:W=cnz]kJQ~a+|; ©yA|nLy޷A8EWz:ʣi1ʏ=.8W{Fo|Rٳ*b"+6 'J2DDcD& ^|2^/9kΤ\ Hd:2PJx_]k^lv&\{2N< flέ/RssOS'd=/xHp#,UhN4.jk걀h &hk+9Va|rG_Cy TP G8u Aq "--SY&n{CSOیVw5* h,1Ehnp endstream endobj 295 0 obj << /Length1 1787 /Length2 12340 /Length3 0 /Length 13469 /Filter /FlateDecode >> stream xڍPи[ii%!8wwvrޢ 1u̵\[-6)K9HebȨj+qq89y99QP{t W0Q_2. & Bo\<.~a.aNN7'!.Y;xq@\6З>0Z0XLH9\@G*jrxhhA, `B98<<<؁kq&Vj\A?F@ƎJжЂXA=. lrt}Iqs^TN ǿU `}8.v;B`?'`UءPV@+%_Ki/= cF?ʼ uE,dr^_#? hinN:`g71/&l (S[r<-l8he?'e  @]@~>v/BX-s5/f_]#q8ɋ,!^y *,_4`pqq^>[ oUrrN^&R(`GƜ|/?ϔ*/#y7{?`{#^}U.8P=_ 9_ R/fev{,߂6/fvxa^89e,^^isXl| _e+-A^fXA\PX~>?CHP_$ A?Ha_^?&pV?_R/m'/\/ܗ pq z._pq|/|9Cf/wskN;uh׋V[Sbw*nܿ 8ZZ>nq!9D|]Q cdvthd"AAt5R3JgI|?JYa{{N?'Q~7#|h:%A#=uxiݬ8?/dE*Ӝᇩslqkbv7CioY< ZAh-{6JtkJLz!h^[syi 80tVfLV,j$FK +b&X̗hLAK6v7cx.2u>د7m?UDwWvkݥY4A6%}SJ f.3E*.Lf[FMCD"j'ziujƬ&scM-XKDԍKD-sMQӞ֪Ǡ}]H؇Y欬ԭxtn~m;Tˮ}54bVg3_˶H0(fЛKrg)IqK@tc:'9ˇ" $HĜIb\c"<-:V?鈐)#{(uiob\~I$'d]Ŧ˽69hy sUm Ɂ( PHuskj緌v'hLҺMEpي,qGK" W 9şUaZa= -<ǽ鿨Yhc'k^Ž[P0*#\ Sro r{,6xA;1 ݾo,9LGGҭ'9N1)^fR`W-3I5Aᦼ3?-BńkT,lMqfCUAnn+ap UD[c,ep'L8,e ׻'y\Ĕ~+Djε &U6ZKGLvs3lQW[iomÓJ=Y[ #Q+Y Q< 3U풔}R(w& ݨtk7%$^zv V&H[P]4:lC_:g]ФΈ4S9Z~qXJ2kVLw&jZpCff)66HvQJi|w鳁]l.\O~0D+ix{QgS0m"M\ʄ/\D8xL)SφǪX GǮX{Ng, (muB#…ıiC Hy.w@ eKEFMGlneuj c\&^-3 W&uӄWA-.7;&deTa.4ҼvYSdx}=\_;/]'-ۡ5j`xB+΅iҲwKqfk.ty=y!~bXWw ۀ$hd['DubHsXWLt`(r{R(еYiuKplǏ .⟱ɟ~t7ACj8U.S<)D-l{TFM8h.#ev/KH\p_JP5zSY]522WkD+DtZrzw];W1{w|X8aگ}ft>'ߊɔ >_Vcvh݁ubuYVafi%_*\>Yb X6 љrﮚJvWqIpX\res]OxYzv:;# K98is-6?.kDZJj(C{.%>.>Szr]%pVwW8wX 9Gv&~ V-5d2ZA  k)8;C*0tphle[A+q?a96w1cifkT0z֘"haA I5)Hfjspx+$řEu-E%GW+OP7uCETs&Opǩ 7 5&`}*EW_Ts*EdfU5f{'0+'t"Lpѩo}`˭ݏ8SLB~k*cAU "v& pZ5*JHQ;=hZHoVCgr&c5!#)ocKg"偉;TyHR=oYIsK}w\)Ǟ器4AR^lĨ ⶜eM2"_fCXTWoYmu!8n~eήŬ?$4;nV$?$нCh\Hb鬰Ww[ZY^ @O=U6/Z L,~)zSDVT݆AEask)G#0xq]5/Gg4Ĉ2Ti:Sۖ%2ϘqsZDoO vb]fgd#Æ)Z%‰X4(I"wi74Gy=R5(2,/dKEq\zP9`hN5Z7ECqYR4E-B8\:<9sGbXvMq0Pmi(@.w/HZ r4CC=-A^:eHPFgr|+)^ $u-3%qh ur,>75/t-=Gπ&<˔yO\nD _#k EL+awXajfB٦45w3 ߆EɠɄe3|]]vL5!GBXt:=p9M}-RJ( ;0QjaVּX\'ɢ-a@ﱲc"YFZN.T3](COfǍSc?fQWALCDŽs.R.w,㠘N#VG9x8+ӿTCDd: #8'iѿ&K s6uM> mL!2ONV6T!MuVpϚ͹1i#v#'䀚wVod~$Hz* 57}@ilXuGQvi6g{*uSwR>i)SLJՏ[5w?ȟmBNy~uk"܋_<`6fy֠mE;ph>k2"Mp$Q7$M4 jzŲ+@5};FĤ9Edk|b6q ?syc݇tIoBOAJln*U ̗{31rvMrp?u;>MCft&h}n1\IzT~Ig pO#fr-0Gi &w٫8lYyZˆx]QZwlqhPc4XX7?g(37Y A5Esȴkz 'SX ,2H]_{= UQu>ǪLF}ešNO7$vD<'պ [w)+\389 t9WK?*aEB`~bVa$X\M5C6ß6'']a[)mqI*@ڕhd`Tj,n@I`%LX,JI6IA6pw6TniR79F0 >=4ڊsoI Ĺ\M~C~|nGP>hRMTYR؎ 4->bH:Fhr +aNӟ8xxD1;OQץ%fɦ_Ƴ V'7]=X"k {,,*߯vC#ɕ)ԫ dvfzfwO:ѵ~:W<,:NX#ۈ~OC3|&Dz.Zv~QV\NQ\ڲuwp43Ox!ʪ;rfJwW[w۱WPnSIP!>./6pD} ߲r%3+$9<, lѸ:yf #ïA]4{CZ XijTwk-= /2{QuΣnJQul a{L<&]}\)Ng0|'X YNOtOm@aׄE;G:cHGs%|H=$v_砉&J[1^3a'c ֔٨w2l5M` #_V$?ّS`r?k} ME_TSv 4q@c(^Bc ݶaCbb(lۅf <,dK=mE9Ѕx%[c!d?,)VkԘA,f@wE[z!kSKƈNL!qH ږ8vF S廄2qk\#k-ĉ75 ې3ĤOב4{z*祾xL@# OI P!)JzD)6[_zϱ(ڃMőyyW M?nf9`~%rӿ):eyL&!+]bdD#Y/Dk8F\YUPX`~ă%Ęad-]h=d`[w5St_}rP 3KDaK3 >=MI]|}&K;4ewu j ڄ0 \G]tRO_s*YˢC10CF76Ý EN{Y1R0m3DU~H2kTH)?vX6LascQY|R9.&yx)yN,vΕ*jupxTBUqe+kI!Ư1JSnL>ۊHI:"iܳz:Tb|p==uA[(dAO`R䭐r}uC-5f%NÍ-Fg]\׽>"kD[2<( CI'7m>E5IouSԩ| * F -m$yY uc?6ĻTf~?35qP6ͷ,KFC\dʎ80xx+=㥌5J{{kYaw1QPng.ǏTvosp}%5Hpat/*-< j;[tI;HE8 TtkY)t!M}vw:j$H$`zyLK5#P}YTZ1u(&۠tYu}7Qĺ}(qo.k#+款HS> ]& :Ɨ 1ZMٶshh ٍiU7/)FLǠuv>|6ؾaU|~(0ˠVwDCu \T]}>I΀uXW ތŮ=SΞ}}T ƚSrO]Cm7*Z ~?}HS(C6/m3.BHG9( eƨ=܊.WU>w2 EdpŠ7hؒy[0OX'" N~<čHlx2SUă}S*.JB3*f"؄+\(89[ggiK3ƳS-=w&rYxa3-7qG~ۭ3-Heۚs6(KJBu"n&RAvF1Nq$ݑvCo)7}b)g/,Uc]GYG L~?r‎rbftMwn?~kTgm}Gty4 ojz7agwhp4ޡ?oYJO1Z?\TpRV&R_"sbdyrLѲ~'e!v_0! ֥j)ۻƵ};:WX~"nwGMiţ/ dW.,NtmPLwV9D* ifTߔR=W#B|k%WȰ&ԇ_c!pk67MFlZ[oZtUQƯJi-W%߀jBьC%%IF Aw.]n3wsP&?߁j'ʿ ZXN i1غ\;rS'2FMgpzriT7{5Q#¸z yn"R޵ L.D QFMCuP:b mAXVEHel* .iJ V;ޭJ8Qho8b$nLwؑy)r5 gj+ >u79գ겼knqPVӀ_3nYfwhPgef!>w5W2fI]7ϋL$jet9͈J!]uUf/~K>PZ+PtcM)oFz'f@q,M W*DΊ(Ŭ259uSl6,"$cqOMsSVXt#?~ⱟQ~E'Wհx|n)xŜ˹}QXcQaurF:mFfFxfV.Xf{++OqF6*m _0s}r;lF+j r1[-U .r Rge OF%Q#yFJE)kBƨgLA*h(1kh0č%jNz7)w <RaW$~` es>.k'?UUQ{l2O -?X~V `H+{!hL!֮:0#p6L2s0{[¹)*Z]Au[MB R[;^_͓aTPsƿZ0V:c8ӔU}"M1x"o}&4wMaOGH8?z˴bN8D닜z}DAzez{67nNӻ*Fh}ۦXG3uPIUH.*f^Vyک0P3bpawb=5# 4.HN?ʣ^Z㎙{_f-kv`lzEj*'-Z15ƶmavr۫~vIc.)9U0%+nCW%1AkR~>LRo2ZWu_þX\\n@KVYk9  @uT+Mͷו#͂t&r~ho)9kә9jRBVU&R*G(zy-!uO0ruvDmA+%Qٕ8tW-rY,~mF(CxvEDx VNkͱ)Bu%:,e(.̀cߙϹxAiʃaBrT]Q.)SeXıTs''8d$->h YH\z D/l'o1v{.;+ű&4?\7!ɉD2~~]4kq>5OScb]:<#{Wm-'l-f]:Bn-qfV.1|c3R1?}#/%ccv6`[L"k77*`$ 51!ѯbxSL4f_x°%YF8#Y]'OiA JUIϳ\0ž|k?2xuG'B;kqH:`y3:1lvUG,[AuD vy->ޥ !>3h')]3e,qg]H'åM3zqbB"?gВ ;s?<[jro5iHN &n9)x9k ~f{ej ]Gx?LLXb@}|2J(Ŭ[N=g=]_l"vtah%,/wb%~y5bGD\DQ,cBs~-.X8Jk 6pzY'w*,B ۓGcOp Pؚ%o@:ޘ,^(#-HBz4;ϰ1Z{wRY p cngSu ãۥ{`fFZUporVph.Ĉ t㠎wgfw|N_SiŖ&}`jihSg{UΤy򒕫*>*م g?aFqcTY ( lP K>0^fpD4!i/E1Kcf3"qpL@LrT 6QSwڎzA=< EHS,*o32fE-w3A6nY純[nf$BVO"Upx.kbTblg%G]ٝ嚅uڻ= R21[= ٽ,̂}t;XHA% FOqRK=+'U̠Hg պ21NQ457N9؍7,(%lk x>8`dy76 ,rQ$Kx[ӭ,O k8)O 7l)q9 Y4FyH endstream endobj 297 0 obj << /Length1 2451 /Length2 17395 /Length3 0 /Length 18832 /Filter /FlateDecode >> stream xڌP cXpw n]Cp . ;w2*}9  !HƉ "`bbe`bbP5wWGrp4&:̬ffN&&  mx@sc@G!bk`njTFfnnNB s# @d~h'#+ڑjdP9\@ƀ-֠[c;Gbk tVF 7gc-;@EJ` `f`'޿ 42ڸۘḼ@qY'7':!4U: .uwFvN V{df1c[kk#D@Fo3}66E&6&0vcdcn MGf r311q@v̿o=x{Lyy:]@'gFNC ܟob;ƏOoflkc#fTQVWV¶nOz6= ++(@-?ž߂]׃m3:LLFo?_.fw1;[Yhmn:;퀜&_SuWdllRN]1HsGqs7_{fenRu4}虙m,nǷKz۝(fcdk{X9@;$<߶ll\oyLl~);Q?(qE . `q2 f `2Ao  QzU>AoAo3ު6tY?ro߂Z%ll%>`F ƶVV@YU?I9~5&\51wWj[x31Mov?Qjngś_R7-S1 VJ?b-2KFޜmG֑[0WNo)[voג½eslN c _21g/J.jy ho):et2szur[ sp|cdyv| /ƪǟ"yn$#g7Zz4ޮ⿾@n #[# /Bg)vS=:`k2nFPVŨnW_<aB:gv;  a U^-!)r흹]$˿,*p?_2Gg5C DO yv-gX:8SküZ*c.9! O؋QƺINxeа%ɽ;5`3wU h펐qhM\]%ZCah\b`=6n4ndN꧴=FM`0W[D_B1 z -2<-fT:*N` ҐQ ӛ9)Fnt`k; `uzGpW?}gv7%Jn8U,nBlawY AS0R.SsO&(ݸZpC|B.tW<̔cO9PokK:A F$&6VP¼p,|"R}l?nvq,MZ䵫2)GF/kLdt'bTfZ{^c*>ޔoi',֒kj- DՇ}W 7{i}#X+nx`22&Iܴfwx?32+2Kf:Y1ఋ^kg$!Xsū{Xe55p_,cVf:VovWOk ¬ƔnXq)"NA,UNU'EkQ!uټ{7b_ ؿv}Rz.Sfc2Lg;w>FtONb4md4y 1S:-0s2!PA9@1!8#4 sק(l tѦB{9㔾܏W_|i O-8{)_SЇQqgT>NŶ1':M|kYDf/SHJʺ+ $ya6ugcc,ieҩ8a&8oaH;s Фl.;d7hcŲ9`3֕!~'anhfD{k=DȄËRcn'> b"*Jϲ1$׊_*{* J.׋ɞ=o;*?Rt=ޔShWʤت$p~f/Zf0mhA|q(*\ 8;er"(nkMZG_yJ) C~ J#;ď$ciA! YfA@#pXx,38G3 kJN{$DٚEAP*$ȡ!@>M獯8Yj;M'`y|'t9:} io$[)_GU%U@ۓv$,,30ӃCPU Y4vN_~5@[]O]\Pم#Q}dnۻ=SYxN1g ȱ w~ =˖>;QnLrsDuv;=]-@!'&͝ր;{ u r]׽Osƌ 0'>4h]ȣ &8zo[d?c3O!iGmB*BvӘ7.e&Z޷n9p%!X5@KC24͉]BƼKqB\Dj"APu? aHz*~y }/c*t2M=\>L|_]aG˷ HS=a > I>nW d_{_ ~uYwjh?-GWYTm El[^k=;{?ir,ITo:DZqowM0n m%Ǩ{ep/V h\08 H=3>b ZZ4yp75}:0`6ۅlӱсD3Le FM': `H5$q-*|d5p^{ 'n*8hc yәw &n:9u+^eYYK;z}eF7?X&7I]~|ջS.}v1xmL&-ˌ%.8,N:aX2ԋDpfb2=Ygj}ǮY#3_eBN0O}^q#fsr=rR`yt7%/rś*i:qW[_Aj7c3VÝa ?sSz}f>hqQ%l2ȰhRϐ?S^]_}lIj`kr9,]Q@1cOa-b\ i_`]?e, enjрt5i iZ|{ !*n:ą ԃ'և5NP%$2wqPS<:y?',pݔ1ͭ#V~dh)v`]P꙲819ߝ*nBa,ƑAӤBXPx̭'*Űn|.B;;ד_獉u+?Dл@4/l ]).5  Qe5M[[G=͔RI諭 m wtߏ6t ![#?mJ/T8"A$~5UMQRW뼱TTaa9S&s9s5iX[Oݜ'up!t;~Nz+ Ki_|?*L%|jd~bnh>j%޷&cp{k g}ΤܢU yqsw/@&0Rͷߛq;st89NHiy5b#֞!2X#{cdUYR!M,>yŠ,1FUQv ]o*V^ @;_-q AcSћ% SIO Fc39s2+j={c<S'wN^Ɯ# %E'Dcwc\)Q;8i8]븜aq&QW鯜2$\£GV lo\dZT& \eۊAl.%"iA2z>_7ZhaI6%\MKIOt@R*#R-Qs.hˠMyİ.V^UwLvpJn`3ےJa i.砰 ү2ûv 59&B<H]o*"{"ʍuD4~ݳq*)b=AːlxXJt[|=uhs/nukc:~"yx` {N?iaSsh*tB1@W=o6d6/bp|: PFBSÁ<0=`rzW%}2ޛ3<2}o vHu'p[PD`L5B{xKRӱ휒܁6)%t:zC,guU_UD\3)CXϗW@X r-m'A͍uF*$B9Ie1T7k>t4<&vM/ͱ}'G/Eγ[,acbkfMxۉoEA;,kwˌ'יqV0Y&OGKԦ]Q%qܖܶl/ $o(N$'LIkuC= HmEʧvK:3^G#>KJX=5I4pXf}\4&ӊ爍/dqo$5r L j^ZwE?7墪_-K} ꩟=&{\T0ƨ~xrQDu1rسԍZ|N0%1YTt=k@ֶՐ 99CsD)Gw$~I5gi\,n=P!52E[b^5:y(7eE IB:U.bjvrƎ؀gA ھ]ipߗL&%_bmz^Kk7"71fV#7ذu'Hbx bcؗ;nI=y4Z/VwGC™HB& (AFH5Ӎu=`(пؿBgYkYB!:J!4еsoey@ؓg֡9>;.t-ـICԌ_2Dϥ-XJ4a@Vnܓb3Wèxzs+-i{d5guԿ?@_ȱ9! Q:v}o$4'U(`M{%<6] :J.#tj==ccVXw.ng,ީY)huD]NPa.C1seZd V X"z&'Гz~%骗pf5}f$s|M=. (&~z鵐+3QJ?ƢvuUܧ:<1m6Řq"!PC3[W ҫ,js.䶒o~<PwXmԪR%v",r:Ah*31cWWs* FYCT[L2-n!-#?hʣB%r;^{\+Td>C޼tP]̣}TaE`HU)٨K tCOi~ɔqbΏeSQZA ƯcgSddles! ,*Q5Kj lHAMe4e`HX/ &_*z^BE#pjCj|ޅ=%ie{"QY} 8^[d{hʌU$iϪ $bn}q7 q1֥ZuT3DXL|}*y#[I>SNL/+9//:bڤ:fAAq+  }Mx*UK 0Lb^=lVDMϗmB Gxj wSHq*$)3eQ, rkjop\fY.׵!HԂ676/hQ]FG?_ JZ9%{`5m H ޺˟ؾg{VZl+*p`e ThE/)c>O7 5ܤ= 'qwDSج3G$dyh~ X5\.# y`@삋kwۗ. ԕ= B*w-V  'Ͼ!0Z)u!cVI2JRF˜F:҈;nX@'thm̏ ׌r L6ܕ S0/\=U5KTߍyM~mJ&]ЂX)?w&u~Xy;1mq'^$Yv_XNnF?9yêbmv iF9q7EXq}ClJе 6ADSDȫ"g!4Et={hR[m6 KO2]Yt}ZE+Ga_ע rë E-{T 䖙V%3AI:?/gH*k7yn{'vI[+sS@IZ#|`h>6 \kK&g$R.z22 L|;epdfD螉õY;i,{we0uD56-5j|ܳ4zmɓs~fcf\_rm#|bXg"KYTd@y UpSIt8]/фκhCOB \\ε|n:yj=0p̞Iq]7i8r[El-t*ֿ_ $DpΓT.E)kYFV V=Cv-n?{ig+g5y]E_nWMpԤ'嗟w_zG]gppӇ=v{t\{2.j'5_͎[3m QgCHPTDDz\-煮i9P5Ğyni՘~2=hZ7VkseʹP8t)cĔOoxdq~Z?0L[Ё6ڮGw< 'fli,rh0|Z#Ԓ"5P||bP_ z?v^X_|Bi+QE%>p\#'yta1DEtO?hQD+ݶ>pΚwMa[};W`qiov@&LW1^!Yuj{Cg`=z1*{gi#/`3 !#z!^He/]\H%aDe 7 qU$vf{ׅWmL695ǰ UaH= dfeO7yȶfH:ڜy.q 8q>U%%C9\5 R?]!򨸐Dok &LneT}+ G gs_~*}̍e\#'Go!|kMEr[E.ouI͟[Ujbt! 'RmN(I~$G,hau&Pe ,} h"}_=QTKpH?`V;6!M+AټNW|ZqҜYNx^[dSM? (ߦ{X'ؕcA~<믨(cAr2#$ to~O $Sd0 ֕0:|GnmoXE8KId9Pi<6~WԾDԛ0l{ZTE[wE& W~bm #:Ҟ§_H5>f63ce IJhhAԗaڨft_"9udS^Vw'a 3vRѻ-鶲;~ QϼJq,g|8(GWacYtdoW/Ƅ]Og/F\[o9f/̼Uc$2r[9Hfd2(ovk/n-]31tٿ xI-w9k%-jS*!j3fĤM}u_FQ1!,A8WZԴ,lLʃvf@Hz!s y!уy 3GhRJnFfl ԁcvQTx33Ƭ|St,}`'yhzܓ4( K_~bM#1.ߠn7xz?O)fcàt` SCtUw@ѥ^g-\070 7m'"݂&u"v`p-sBsL3|a`F>[Ԑ6〻Mn3< _Ft~6J|,atԎF]Y}0j`%\Nr;zR,޼TkӬb[;-hki.!~(y1Ү?rÀMV א׷+ՓMetG Ј?x~aT7 k :6>P[fud®W苪⢧Pt 7.gehƉ hK.F];6B YG q9K}DV)Y-As85,Q1;=E=ظu9A\Kv5.eܩ2n4 RV sJ[˔3ͭ0nm0yR_"7a=U >P(\爨2 ^{Y ;gOn JW<軏Ud1 u䕩f6۞uD/O,sdO]%8VE#MU;Ff2J3a I;+$RFRƓ_pgQL j/,M$/#[Qȸ6khwlfaH(Y2ՇB Ifpm~!JMB)Wu=.h[ǝO_P8 r6)~N*M]sJH?/ JgJ΀K!a|smXĢ{HUgJ.S%$-! k㞩tBюLmd|ҞvdTgEIBy=wNG9T"?3kaclΎ0;|=Smlnϔ kVg1.J5;$$XsYҵ;]"jڰPDi82~C-v}CjTmv4SV1@+ޚN+QB=>s^ }v(R1%D!}}ɠ/z-@5qbA(cRZ4C:) Ӟf).sV+Ao%B0.cjdž&X]W<2#_p  L忹xye#3bʥ<˶5apĭ 6x!#;fyh2"sn0_4@}g랉>ǯg*=43B-g>ǡC]Djs';1&?[D_%L|ldU&NVzyGnHH3S_ql<+םWy!'yռ*$]1_ Zg(({S3,mwY.LFg$-NwrŦPdI:i_Lg픻`HM~rR~[0!^>bͷnr`Lx,%~* r$nJ"ҙM h^a5frذ͵z~SrW:OF.qPݠ'tXDՆP `=*#T&?BfX]sFl.bS L8^(:{ka'*?;|*Q(BY>”s~歈;2XKÜD&-wkq?ST=VnnjzH<޿ 2=n"+,("FNDZi>𒪲jR:`D2B2/NP}wa+׆Rc6?pLw᚝Dh\#+HXQFnkSKxeKi)WL1u58n M.a% ~]p8-F2q/tұiLY<^+ٶ2Oк8OۃZrr?җPާj<ɆcBJGw*˲"H9 NuQ ɑ(9Q;5kHY[Wi|ab?;dZ/ua$a+Yf'd)IuِF;—:v2oT ЀYs[0+.=Փn1%Jܾ&?zʊбs|6B;-fVitҭ 6Ͷv-Ea]K0.>a֎QV2V}gcrɔ[Lk ;Rn*=p}%z略!f7tqgř=R#ug$P.' Vk:* (KhUt-S1Vni;P(rQ~'_+I֠Ma~S/v{x׾-l@Q}5"rFxA!eg4k ŬإRL5K-* i~;o5(L3Z@Y3ɝԇ3VF ? BVDw];txbJCffI9r&u ol+r@c~) 7zƆ(>/u7Vp[JCw|u+C"VTF "s9] maaHGnߝyd9>/{@Axx(=֪j<):ѓZ Eő[vb V_6dZ> HKh2h+TҼv]?4n*ȯULD4{DcNb}+>Ȋ=O,˫qU{oc)M+Mo_%*eb+H2?~v/}1l+֢aSgC+u> $n{=KT܈XN< c [L;Dѵm#[:i/RB?Qp*W׮tС>2 oaV2ZdGRܝ~/ L,)bɽ>P)κuQJ9 J l,zYd\|&趼k~n#A@R?"1&fb}~iP. {e.͹f仺QeМx\oƣn!MAN::m|U\u{uA%o-^yz#ӕdRiMc S8|f|l$x&RLocZNv`wJ(`=Tx=N8LЍ5fօ&[2U4ֲPh@,Q!'>A:GV`-߾~%&Df!:L5_۲=BbFE磌NѴ(6]_8ZU:bo%@@oԿ_E)!pt'u}r38Qa2%J-y]_t fp\ 3ɺ[, Pep@dYfQz>O!֛Dm]+CpN_2QwJ h=XDɴ %#'JK N0nY `!1v:~%j="hZ>i_k]ٛ";0xɵ f4X{򧄺b|b?;Et.VFlz_u}'|:W^*0DDSjs6 endstream endobj 299 0 obj << /Length1 1459 /Length2 2280 /Length3 0 /Length 3215 /Filter /FlateDecode >> stream xڍT 8T{VHK!Cf)KeaAIn3d3fҥtUHZ%q-lESYV<}kowӷd ~ Dvrw'G 0ZZ ~cv\? lh|C0 DcSFS &߀@ 8 0hY#0.|thbQo> N4> DW؀B@~O%,>c -C[tgTrC@072L FawpC|  A n_=`as"wBMt~n08$ι"8`cQD?-`0*H^u̯6z\(M@Gs c 0;;|V^n^VF;heD@d` c# *iB0L6ҷC]s-g-`ܛ`D/M*fDZ_B`>'UONp@Ϩ=jg ΚWǜ nGx PqۃRr>yE[0DF22h\.- C@D22"`<<Fh N0.fH(o4Mx9?iy?|ȼS`..Tv] - ?lųȴxͣcE7 xK}JWK eI$y9>9}c`w^fq3ǡ}~1/tF/y^n:h.{8t Iet=d :4#> ?m4WdU3]F >=ڪU/}3P>R8>͕5;ԅ8N#)}Eg= t- Oey͑f\ (?iPB!름fLi]u~iCN=і" KMGv%8晸em,^2^޼ܺWƇn|^=,La;&8J*v$nY4hzٗˣhb`AfQ֣w:]>oNV+~K*4 =a![`S6 +5_Y0r ?U˩ˌV{0hYsr){鷙럛R. kF.?R}A%fIƹA|G&\]"X[bۆlNL5#^Hw-/(nV3a] Vaa\ݣ<)9k:rnJټjËJr8ɚS?2J*'4_k<ڑxN%hۻ;wZhӾ>2md`й&JFo_4|(D'͞Iy'0ɖu3)XRd[,|`*8ջ1G41l\Bɾ?" >: :cM{wD\Ķ`ljk‹Mʭ7V ȵo9pyS|P4sd"u >h߬Z&{|ѹadHࡆQj?o#։1rrNRELS)ӛԪ{p'gM+VgNfrhDk{;RKѽ{[Uwj˒]JS4"AHѻbAN^+7YWo=+͎ڎX?GřN*e'tvU_uJӼ w<SiV-M9wŽ/_޸0zDlnvp.^lÌεr䤪<`vN4]`7Egޗ$-:[RVjW( әQ~=vh`nΑx!7]xy>Xx]QQOFo/bڇ};6v\%nQIfwUJr .mL1,53&ߪw,IkH,{y:Kuj T8ad4ia5oVynN(\-ޚ]-BsVP׺}k4l=NRj3o[W&߾en|!淙ѐ;uɁi:|,l> %%:V+4R)IG,ʈu۾*T=&<$9-[uXٕ/ ڕsD]]R|]r=9;`f}%{:j~⋶͕Qzdy%hEdQvhs{ FTQMů(_o'V== endstream endobj 301 0 obj << /Length1 1592 /Length2 3396 /Length3 0 /Length 4397 /Filter /FlateDecode >> stream xڍw 4m-+&03{G13f3%W([D)2-*{vR"}Μcs|sCIt9<\3VpEy8\ f)'#Qqh:hGA3B@(#Tp@WHho<0$GQntRi t8*&fh;A+2BJӝN`>>>h"MLu;& |twGQqX`aޙ<vӾۭȮt4# ပ)`NMyt?7I[h LI~x's<ݗ$&Mx7O@J$ CS4y"l3 8eVL$Htf}x*f=Id'a]72(0ދ3AMln8:᪊p|1~ܖi;)+.8iho@2p;Dc O4\cx_j7??%~[ FmrZ{?}d__ )(*H%$QWɕ }ҿz~! ,%q8 B {3&b[n-FP :(32RmqW 3?Lj8qw$|S9WOݠzrD/2R~pPF H$R0'`vЛ-"O \~` ~BPT0w?;Tb6oP A72BQ~So"꨿A0;7F`c_P~v 1> J-}oU8/Ehx䇔-=nVP⮙e;d =z2XOsbf[Αq{Ev{ណ#vpuk?2N3e(TTHº~jY3!-~PӼ\iv'\,ёª\,!:yt::j7O@}^N~Xt;C7d.y؍O/8«Rse!H-XCƒC >F[20""=lzdmO.RSZWk[ablAncyw ]>!w*ȲEw7*%U0(E|ܜQp/kY y;%2 w`BvA6FTcRـ'F -0,w2#/bv3-K7B܈wfc4}jPBëo^Il={[E4?Rp=krkՓk.٨v"άVk|8T{خR5S4_'x Ŵ:JuKoZd2HOy˻\/OZ ՗y%euV 횤ՊZwM>94qO H^p }"} O~S;)ѥnt~ө]³4Xex=d{1Ԏ*Tk{zȢ=Io LĚe_H. y$?%,w X%OKi?}@nQ'ˌL~SkbiG庹}9扈xbF+ɾgZݙ k -Tr $=zj50(η//-,ɆjiN֙# _/E<ԪF=ya`Xggr3K>s L>{VcCO{t[3nϔ^Y=2-@A=60].6'J)>h !M1 WNtWo/ T^5َOZٰ?xkj̼`LoǮڛ# D%:>"#[Y-U|rĶTz 5b4rJ#|li,adYrv>uv8WPqv/m//QF,Sv&O+G&@?]*Oaɷ-v|;&j2f^yWTYyn*+ryl <:?3iH۝7.AM1c5|#ݍ::eRW>ZX?%UɭJbO 6kx E$$ġP%J[C NIyLB'wX|ڥyޔͳfql\qqw㱢EaO?a4&g|70}I,½>,E+u4!(m=/U #˅8fhF  26J[C%Es&yi{W-01hV]e苮Fq[m L~axrmZaiׄ''0JXˍ\VtivYNq!eu̾[MUOqln݅Y>sA&SKՇ^f:uJ ;*7ޖg|R>1<Oゥ}K.C%kaM y;,Tuv4NQ߾ԮFSz/# {d4ld9C$WcSFIm;bjTWYS&bqC QyEAlw2[U謭*͵|V֙ɞYQ֔&:yKP_p++q*)'22T>[ؒ1M^osԸdiTq_]n@OyK [/%' $ynf̱%=Wr>Gf 7eEOgonV8w2.#35x\OK>GߌoO[s d%"TFΏ8Ď\2S2yƯsƒ2Hiܹŀd|zOduW _8dZ6Vs=tKO\|# `sU3zxDqFlrEPpԃ=QUa:yu2l~5zZXz\t)]MËjX@KYqޙ.}ȡfvF b%8q~J?6AgO35 fRQbQ拱wbv|)=˽Xn5 !@SUN<.КF5KK?S*|M#&̓IjC)4/;[HTJ{Bg> endobj 286 0 obj << /Type /ObjStm /N 52 /First 438 /Length 2037 /Filter /FlateDecode >> stream xڭY[s۸~csd)^E쌓4]if8U,WӴ$K>A|dn7pOxD1ON &Lq0O˸ p3 F(e@D "8&BHPb3Q&00%=pDrfXB"RhM Wi8# %q*ϰ$+J=p\ 'JHp 楧xR)-%5t|#N 0 3>L!W`8,H Froj3At`P73Y>bzca =NͦiȓtPOy~8q2"AD>8'0yy.F (>Qt8Ŗx:'\#a:9yCs,FB] B<9 dЅ޿ : NF6YQKUE%˔Žӈi]4JniJ3>iӤM i_FF" WH z fEp,!=+)zc{_iAlٷeۛNщ$~OG`=4_^2MSdzԆM sGPÍMh֨" U*2$#XϢ(rJ[t'LB7Hw},t dZRh5d|qbr4}#&m)QQ/5};Kw #gWHoJ׽J{_lNv]bMce}Yfy4jiK$ߜHziZ,VVSW=VUWczZg[џu`ftqyCAY!t ] /Length 816 /Filter /FlateDecode >> stream x%KlUU{ihEJ-JЂ}"B[jHH c>F:0#hN~Y{}o"T˺JP@;*Pک@KUkK{TtCpPay8ZQ7cW^{W{xL„bgOsG`F\7SY8/´bg.%XP,ͻw+Vo~n+%>KpAꭲҡ^R\oUv\+ +BO2= ŭ{qrPnpS|򺇼o25W=Kw8$YfnͽFŃo]g&t.|)??w#\IXSr'n.hf};Co<'̓--+sb1/ p$'1kš5H6GM@siNi8#ݘS@%is{=^\ (%/Z]]VoWWT ZVqՊ_ZUc,CUJ^W*W׹rSWUUqFGӮT^s+.g_QnCtC~AUW O endstream endobj startxref 289715 %%EOF sp/inst/doc/over.Rnw0000644000176200001440000005054413026705206014072 0ustar liggesusers% dimensions(x) returns number of spatial dimensions % y = transform(x, "proj4string") % bbox(x) % coordinates(x) ; <- % rings(x) ; <- % method to retrieve lines? --> Lines()? % gridded(x) ; <- % \documentclass{article} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} % \VignetteIndexEntry{ sp: overlay and aggregation } \usepackage{color} \usepackage{Sweave} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \newcommand{\code}[1]{{\tt #1}} \let\pkg=\strong \title{\bf Map overlay and \\ spatial aggregation in {\tt sp}} \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt edzer.pebesma@uni-muenster.de}}} \date{\today} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \begin{abstract} Numerical ``map overlay'' combines spatial features from one map layer with the attribute (numerical) properties of another. This vignette explains the R method ``over'', which provides a consistent way to retrieve indices or attributes from a given spatial object (map layer) at the locations of another. Using this, the R generic ``aggregate'' is extended for spatial data, so that any spatial properties can be used to define an aggregation predicate, and any R function can be used as aggregation function. \end{abstract} \tableofcontents \section{Introduction} According to the free e-book by Davidson (2008), \begin{quotation} {\em An overlay is a clear sheet of plastic or semi-transparent paper. It is used to display supplemental map and tactical information related to military operations. It is often used as a supplement to orders given in the field. Information is plotted on the overlay at the same scale as on the map, aerial photograph, or other graphic being used. When the overlay is placed over the graphic, the details plotted on the overlay are shown in their true position. } \end{quotation} This suggests that {\em map overlay} is concerned with combining two, or possibly more, map layers by putting them on top of each other. This kind of overlay can be obtained in R e.g. by plotting one map layer, and plotting a second map layer on top of it. If the second one contains polygons, transparent colours can be used to avoid hiding of the first layer. When using the {\tt spplot} command, the {\tt sp.layout} argument can be used to combine multiple layers. O'Sullivan and Unwin (2003) argue in chapter 10 (Putting maps together: map overlay) that map overlay has to do with the combination of two (or more) maps. They mainly focus on the combination of the selection criteria stemming from several map layers, e.g. finding the deciduous forest area that is less than 5 km from the nearest road. They call this {\em boolean overlays}. One could look at this problem as a polygon-polygon overlay, where we are looking for the intersection of the polygons with the deciduous forest with the polygons delineating the area less than 5 km from a road. Other possibilities are to represent one or both coverages as grid maps, and find the grid cells for which both criteria are valid (grid-grid overlay). A third possibility would be that one of the criteria is represented by a polygon, and the other by a grid (polygon-grid overlay, or grid-polygon overlay). In the end, as O'Sullivan and Unwin argue, we can overlay any spatial type (points, lines, polygons, pixels/grids) with any other. In addition, we can address spatial attributes (as the case of grid data), or only the geometry (as in the case of the polygon-polygon intersection). This vignette will explain how the {\tt over} method in package {\tt sp} can be used to compute map overlays, meaning that instead of overlaying maps visually, the digital information that comes from combining two digital map layers is retrieved. From there, methods to {\em aggregate} (compute summary statistics; Heuvelink and Pebesma, 1999) over a spatial domain will be developed and demonstrated. Pebesma (2012) describes overlay and aggregation for spatio-temporal data. \section{Geometry overlays} We will use the word {\em geometry} to denote the purely spatial characteristics, meaning that attributes (qualities, properties of something at a particular location) are ignored. With {\em location} we denote a point, line, polygon or grid cell. Section \ref{attr} will discuss how to retrieve and possibly aggregate or summarize attributes found there. Given two geometries, {\tt A} and {\tt B}, the following equivalent commands <>= A %over% B over(A, B) @ retrieve the geometry (location) indices of \code{B} at the locations of \code{A}. More in particular, an integer vector of length {\tt length(A)} is returned, with {\tt NA} values for locations in {\tt A} not matching with locations in {\tt B} (e.g. those points outside a set of polygons). Selecting points of \code{A} {\em inside} or {\em on} some geometry \code{B} (e.g. a set of polygons) {\tt B} is done by <>= A[B,] @ which is short for <>= A[!is.na(over(A,B)),] @ We will now illustrate this with toy data created by <>= library(sp) x = c(0.5, 0.5, 1.0, 1.5) y = c(1.5, 0.5, 0.5, 0.5) xy = cbind(x,y) dimnames(xy)[[1]] = c("a", "b", "c", "d") pts = SpatialPoints(xy) xpol = c(0,1,1,0,0) ypol = c(0,0,1,1,0) pol = SpatialPolygons(list( Polygons(list(Polygon(cbind(xpol-1.05,ypol))), ID="x1"), Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), Polygons(list(Polygon(cbind(xpol,ypol - 1.0))), ID="x3"), Polygons(list(Polygon(cbind(xpol + 1.0, ypol))), ID="x4"), Polygons(list(Polygon(cbind(xpol+.4, ypol+.1))), ID="x5") )) @ and shown in figure \ref{fig:toy}. \begin{figure}[htb] <>= library(RColorBrewer) pal = brewer.pal(5, "Set2") plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=pal, axes=TRUE, col = paste0(pal, "4D")) points(pts, col='red') text(c(-1,0.1,0.1,1.9,0.45), c(0.05,0.05,-.95,0.05,0.15), c("x1", "x2", "x3", "x4", "x5")) text(coordinates(pts), pos=1, row.names(pts)) @ \caption{ Toy data: points (a-d), and (overlapping) polygons (x1-x5) } \label{fig:toy} \end{figure} Now, the polygons \code{pol} in which points \code{pts} lie are <<>>= over(pts, pol) @ As points \code{b} and \code{c} touch two overlapping polygons, the output from the previous command does not provide all information about the overlaps, only returning the \emph{last} polygon which touched them (polygon 5 in both cases). The complete information can be retrieved as a list: <<>>= over(pts, pol, returnList = TRUE) @ This shows that \code{over} returns true if geometries in one element touch geometries in another: they do not have to fully overlap (see section \ref{dim} to constrain the selection criteria). The points falling in or touching any of the polygons are selected by: <<>>= pts[pol] @ The reverse, identical sequence of commands for selecting polygons \code{pol} that have (one or more) points of \code{pts} in them is done by <<>>= over(pol, pts) over(pol, pts, returnList = TRUE) row.names(pol[pts]) @ \code{over} can also be used to query polygons in a single object overlay each other: <<>>= over(pol, pol, returnList = TRUE) @ \noindent The output tells us that \code{x1} does not intersect with any polygons other than itself, within the \code{pol} object. \code{x2} intersects with itself and \code{x3}, \code{x4} and \code{x5}, and so on. Note that the \emph{types} of overlap queried by \code{over} include any intersecting points or edges under the \href{https://en.wikipedia.org/wiki/DE-9IM}{DE-9IM} standard. More generic types of spatial overlap can be queried using functions from the rgeos package, as illustrated by the help page launched with \code{?rgeos::gRelate}. Constraining polygon-polygon intersections to e.g. {\em overlap} using \code{over} is explained in section \ref{dim}. \section{Using \code{over} to extract attributes} \label{attr} This section shows how \code{over(x,y)} is used to extract attribute values of argument \code{y} at locations of \code{x}. The return value is either an (aggregated) data frame, or a list. We now create an example \code{SpatialPointsDataFrame} and a \code{SpatialPolygonsDataFrame} using the toy data created earlier: <<>>= zdf = data.frame(z1 = 1:4, z2=4:1, f = c("a", "a", "b", "b"), row.names = c("a", "b", "c", "d")) zdf ptsdf = SpatialPointsDataFrame(pts, zdf) zpl = data.frame(z = c(10, 15, 25, 3, 0), zz=1:5, f = c("z", "q", "r", "z", "q"), row.names = c("x1", "x2", "x3", "x4", "x5")) zpl poldf = SpatialPolygonsDataFrame(pol, zpl) @ In the simplest example <<>>= over(pts, poldf) @ a \code{data.frame} is created with each row corresponding to the first element of the \code{poldf} attributes at locations in \code{pts}. As an alternative, we can pass a user-defined function to process the table (selecting those columns to which the function makes sense): <<>>= over(pts, poldf[1:2], fn = mean) @ To obtain the complete list of table entries at each point of \code{pts}, we use the \code{returnList} argument: <<>>= over(pts, poldf, returnList = TRUE) @ The same actions can be done when the arguments are reversed: <<>>= over(pol, ptsdf) over(pol, ptsdf[1:2], fn = mean) @ \section{Lines, and Polygon-Polygon overlays require {\tt rgeos}} Package \code{sp} provides many of the \code{over} methods, but not all. Package \code{rgeos} can compute geometry intersections, i.e. for any set of (points, lines, polygons) to determine whether they have one ore more points in common. This means that the \code{over} methods provided by package \code{sp} can be completed by \code{rgeos} for {\em any} \code{over} methods where a \code{SpatialLines} object is involved (either as \code{x} or \code{y}), or where \code{x} and \code{y} are both of class \code{SpatialPolygons} (table \ref{tab}). For this purpose, objects of class \code{SpatialPixels} or \code{SpatialGrid} are converted to \code{SpatialPolygons}. A toy example combines polygons with lines, created by <<>>= l1 = Lines(Line(coordinates(pts)), "L1") l2 = Lines(Line(rbind(c(1,1.5), c(1.5,1.5))), "L2") L = SpatialLines(list(l1,l2)) @ and shown in figure \ref{fig:lines}. \begin{table} \centering \begin{tabular}{|l|ccccc|} \hline & y: Points & y: Lines & y: Polygons & y: Pixels & y: Grid \\ \hline x: Points & s & r & s & s & s \\ x: Lines & r & r & r & r:y & r:y \\ x: Polygons & s & r & r & s:y & s:y \\ x: Pixels & s:x & r:x & s:x & s:x & s:x \\ \hline x: Grid & s:x & r:x & s:x & s:x & s:x \\ \hline \end{tabular} \caption{ \code{over} methods implemented for different \code{x} and \code{y} arguments. s: provided by \pkg{sp}; r: provided by \pkg{rgeos}. s:x or s:y indicates that the x or y argument is converted to grid cell center points; r:x or r:y indicate grids or pixels are converted to polygons equal to the grid cell. } \label{tab} \end{table} \begin{figure}[htb] <>= plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=2:6, axes=TRUE) text(c(-1,0.1,0.1,1.1,0.45), c(0,0,-1.05,0,0.1), c("x1", "x2", "x3", "x4", "x5")) lines(L, col = 'green') text(c(0.52, 1.52), c(1.5, 1.5), c("L1", "L2")) @ \caption{ Toy data: two lines and (overlapping) polygons (x1-x5) } \label{fig:lines} \end{figure} The set of \code{over} operations on the polygons, lines and points is shown below (note that lists and vectors are named in this case): <<>>= library(rgeos) over(pol, pol) over(pol, pol,returnList = TRUE) over(pol, L) over(L, pol) over(L, pol, returnList = TRUE) over(L, L) over(pts, L) over(L, pts) @ Another example overlays a line with a grid, shown in figure \ref{fig:grid}. \begin{figure} <>= data(meuse.grid) gridded(meuse.grid) = ~x+y Pt = list(x = c(178274.9,181639.6), y = c(329760.4,333343.7)) sl = SpatialLines(list(Lines(Line(cbind(Pt$x,Pt$y)), "L1"))) image(meuse.grid) xo = over(sl, geometry(meuse.grid), returnList = TRUE) image(meuse.grid[xo[[1]], ],col=grey(0.5),add=T) lines(sl) @ \caption{ Overlay of line with grid, identifying cells crossed (or touched) by the line } \label{fig:grid} \end{figure} \section{Ordering and constraining of \code{rgeos}-based intersects} Consider the following ``identical'' $3 \times 3$ grid, represented as \code{SpatialGrid}, \code{SpatialPolygons} and \code{SpatialPixels}: <>= g = SpatialGrid(GridTopology(c(0,0), c(1,1), c(3,3))) p = as(g, "SpatialPolygons") px = as(g, "SpatialPixels") plot(g) text(coordinates(g), labels = 1:9) @ We can match these geometries with themselves by <<>>= over(g,g) over(p,p) over(p,g) over(g,p) @ and see that most give a 1:1 match, except for polygons-polygons \code{(p,p)}. When we ask for the full set of matches, we see <<>>= over(px[5], g, returnList = TRUE) over(p[c(1,5)], p, returnList = TRUE) @ and note that the implementation lets grids/pixels not match (intersect) with neighbour grid cells, but that polygons do. There are two issues we'd like to improve here: the order in which matching features (here: polygons) are returned, and the possibility to limit this by the dimension of the intersection (point/line/area). Both will be explained now. \subsection{Ordering of matches} By default, polygon-polygon features are matched by \code{rgeos::gIntersects}, which just returns {\em any} match in {\em any} order (feature order, it seems). Although it is slower, we can however improve on this by switching to \code{rgeos::gRelate}, and see <<>>= over(px[5], g, returnList = TRUE, minDimension = 0) over(p[c(1,5)], p, returnList = TRUE, minDimension = 0) @ When \code{minDimension = 0} is specified, the matching geometries are being returned based on a nested ordering. First, ordering is done by dimensionality of the intersection, as returned by the \code{rgeos} function \code{gRelate} (which uses the \href{https://en.wikipedia.org/wiki/DE-9IM}{DE-9IM} model). This means that features that have an area overlapping (dim=2) are listed before features that have a line in common (dim=1), and that line in common features are listed before features that only have a point in common (dim=0). Remaining ties, indicating cases when there are multiple different intersections of the same dimension, are ordered such that matched feature {\em interiors} are given higher priority than matched feature boundaries. Note that the ordering also determines which feature is matched when \code{returnList=FALSE}, as in this case the first element of the ordered set is taken: <<>>= over(p, p, minDimension = 0) @ Consider the following example where a point is {\em on} \code{x1} and {\em in} \code{x2}: <>= x2 = x1 = cbind(c(0,1,1,0,0), c(0,0,1,1,0)) x1[,1] = x1[,1]+0.5 x1[,2] = x1[,2]+0.25 sp = SpatialPolygons(list( Polygons(list(Polygon(x1)), "x1"), Polygons(list(Polygon(x2)), "x2"))) pt = SpatialPoints(cbind(0.5,0.5)) # on border of x1 row.names(pt) = "pt1" plot(sp, axes = TRUE) text(c(0.05, 0.55, 0.55), c(0.9, 1.15, 0.5), c("x1","x2", "pt")) plot(pt, add=TRUE, col='red', pch=16) @ When matching the point \code{pt} with the two polygons, the sp method (default) gives no preference of the second polygon that (fully) contains the point; the rgeos method however does: <<>>= over(pt,sp) over(pt,sp,minDimension=0) over(pt,sp,returnList=TRUE) rgeos::overGeomGeom(pt,sp) rgeos::overGeomGeom(pt,sp,returnList=TRUE) rgeos::overGeomGeom(pt,sp,returnList=TRUE,minDimension=0) @ % # x1 x2 % # "F0FF" "0FFF" % # it would be nice to have these sorted "2, 1" instead of "1, 2", but % # that doesn't work now. \subsection{Constraining dimensionality of intersection} \label{dim} In some cases for feature selection it may be desired to constrain matching to features that have an area overlap, or that have an area overlap {\em or} line in common. This can be done using the parameter \code{minDimension}: <<>>= over(p[5], p, returnList=TRUE, minDimension=0) over(p[5], p, returnList=TRUE, minDimension=1) over(p[5], p, returnList=TRUE, minDimension=2) rgeos::overGeomGeom(pt, pt, minDimension=2) # empty rgeos::overGeomGeom(pt, pt, minDimension=1) # empty rgeos::overGeomGeom(pt, pt, minDimension=0) @ \section{Aggregation} In the following example, the values of a fine grid with 40 m x 40 m cells are aggregated to a course grid with 400 m x 400 m cells. <<>>= data(meuse.grid) gridded(meuse.grid) = ~x+y off = gridparameters(meuse.grid)$cellcentre.offset + 20 gt = GridTopology(off, c(400,400), c(8,11)) SG = SpatialGrid(gt) agg = aggregate(meuse.grid[3], SG, mean) @ Figure \ref{fig:agg} shows the result of this aggregation (\code{agg}, in colors) and the points (+) of the original grid (\code{meuse.grid}). Function \code{aggregate} aggregates its first argument over the geometries of the second argument, and returns a geometry with attributes. The default aggregation function (\code{mean}) can be overridden. \begin{figure}[htb] <>= image(agg) points(meuse.grid, pch = 3, cex=.2, col = "#80808080") @ \caption{ aggregation over meuse.grid distance values to a 400 m x 400 m grid} \label{fig:agg} \end{figure} An example of the aggregated values of \code{meuse.grid} along (or under) the line shown in Figure \ref{fig:lines} are <<>>= sl.agg = aggregate(meuse.grid[,1:3], sl, mean) class(sl.agg) as.data.frame(sl.agg) @ Function \code{aggregate} returns a spatial object of the same class of \code{sl} (\code{SpatialLines}), and \code{as.data.frame} shows the attribute table as a \code{data.frame}. \subsection{Constraining the dimension of intersection} Building on the simple example of section \ref{dim}, we can see what happens if we aggregate polygons {\em without} specifying {\em how} polygons intersect\footnote{sp versions 1.2-1, rgeos versions 0.3-13}, the result of which is shown in Figure \ref{fig:agg}. <<>>= g = SpatialGrid(GridTopology(c(5,5), c(10,10), c(3,3))) p = as(g, "SpatialPolygons") p$z = c(1,0,1,0,1,0,1,0,1) cc = coordinates(g) p$ag1 = aggregate(p, p, mean)[[1]] p$ag1a = aggregate(p, p, mean, minDimension = 0)[[1]] p$ag2 = aggregate(p, p, mean, minDimension = 1)[[1]] p$ag3 = aggregate(p, p, mean, minDimension = 2)[[1]] p$ag4 = aggregate(p, p, areaWeighted=TRUE)[[1]] @ \begin{figure}[ht] <>= pts = cbind(c(9,21,21,9,9),c(9,9,21,21,9)) sq = SpatialPolygons(list(Polygons(list(Polygon(pts)), "ID"))) rnd2 = function(x) round(x, 2) l = list( list("sp.text", cc, rnd2(p$z), which = 1), list("sp.text", cc, rnd2(p$ag1), which = 2), list("sp.text", cc, rnd2(p$ag1a), which = 3), list("sp.text", cc, rnd2(p$ag2), which = 4), list("sp.text", cc, rnd2(p$ag3), which = 5), list("sp.text", cc, rnd2(p$ag4), which = 6), list(sq, col = 'green', which = 6, first = FALSE, lwd = 2) ) spplot(p, names.attr = c("source", "default aggregate", "minDimension=0", "minDimension=1", "minDimension=2", "areaWeighted=TRUE"), layout = c(3,2), as.table=TRUE, col.regions=bpy.colors(151)[50:151], cuts=100, sp.layout = l, scales = list(draw = TRUE)) @ \caption{Effect of aggregating checker board {\tt SpatialPolygons} by themselves, for different values of {\tt minDimension} and {\tt areaWeighted}; the green square example is given in the text.} \label{fig:agg} \end{figure} The option \code{areaWeighted=TRUE} aggregates area-weighted, giving zero weight to polygons that only have a point or line in common with the target polygon; \code{minDimension} is passed to \code{over} to constrain the intersecting polygons used. The following example furher illustrates the difference between selection using {\tt minDimension}, and area weighting for aggregating the 0-1 checker board of figure \ref{fig:agg} by the green square polygon ({\tt sq}) shown in the last panel of that figure: <<>>= round(c( aggDefault = aggregate(p, sq, mean)[[1]], aggMinDim0 = aggregate(p, sq, mean, minDimension = 0)[[1]], aggMinDim1 = aggregate(p, sq, mean, minDimension = 1)[[1]], aggMinDim2 = aggregate(p, sq, mean, minDimension = 2)[[1]], areaWeighted = aggregate(p, sq, areaWeighted=TRUE)[[1]]), 3) @ \section*{References} \begin{itemize} \item O'Sullivan, D., Unwin, D. (2003) Geographical Information Analysis. Wiley, NJ. \item Davidson, R., 2008. Reading topographic maps. Free e-book from: \url{http://www.map-reading.com/} \item Heuvelink, G.B.M., and E.J. Pebesma, 1999. Spatial aggregation and soil process modelling. Geoderma 89, 1-2, \href{http://dx.doi.org/10.1016/S0016-7061(98)00077-9}{47-65}. \item Pebesma, E., 2012. Spatio-temporal overlay and aggregation. Package vignette for package spacetime, \url{https://cran.r-project.org/web/packages/spacetime/vignettes/sto.pdf} \end{itemize} \end{document} sp/inst/doc/csdacm.Rnw0000644000176200001440000011635212577541412014360 0ustar liggesusers%% $Id: csdacm.Rnw,v 1.44 2008-04-06 20:47:04 roger Exp $ % -*- mode: noweb; noweb-default-code-mode: R-mode; -*- % merge all depth coefficients!! % Customising spatial data analysis classes and methods %\SweaveOpts{echo=TRUE} %*Intro and plan* %motivate spatial data handling \documentclass{article} % \VignetteIndexEntry{Customising spatial data classes and methods} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{color} \usepackage{Sweave} \SweaveOpts{keep.source=FALSE} \usepackage{natbib} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong \newcommand\code{\bgroup\@codex} \def\@codex#1{\small {\normalfont\ttfamily\hyphenchar\font=45 #1}\egroup} \usepackage{xspace} \def\RR{\textsf{R}\xspace} \def\SP{\texttt{S-PLUS}\texttrademark\xspace} \def\SS{\texttt{S}\xspace} \def\SIII{\texttt{S3}\xspace} \def\SIV{\texttt{S4}\xspace} \title{{\bf Customising spatial data classes and methods}\footnote{This vignette formed pp. 127--148 of the first edition of Bivand, R. S., Pebesma, E. and G\'{o}mez-Rubio V. (2008) Applied Spatial Data Analysis with R, Springer-Verlag, New York. It was retired from the second edition (2013) to accommodate material on other topics, and is made available in this form with the understanding of the publishers. It has been updated to the 2013 state of the software, e.g. using \code{over}.} } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt edzer.pebesma@uni-muenster.de}}} \date{Feb 2008} \begin{document} \maketitle \tableofcontents <>= owidth <- getOption("width") options("width"=90) .PngNo <- 0 @ <>= .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 @ <>= <> @ <>= .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) @ <>= dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") @ Although the classes defined in the \pkg{sp} package cover many needs, they do not go far beyond the most typical GIS data models. In applied research, it often happens that customised classes would suit the actual data coming from the instruments better. Since \SIV classes have mechanisms for inheritance, it may be attractive to build on the \pkg{sp} classes, so as to utilise their methods where appropriate. Here, we will demonstrate a range of different settings in which \pkg{sp} classes can be extended. Naturally, this is only useful for researchers with specific and clear needs, so our goal is to show how (relatively) easy it may be to prototype classes extending \pkg{sp} classes for specific purposes. \section{Programming with classes and methods} \label{sect:cls} This section will explain the elementary basics of programming with classes and methods in \RR. The \SS language (implemented in \RR and \SP) contains two mechanisms for creating classes and methods: the traditional \SIII system and the more recent \SIV system (see Section 2.2 in \cite{bivand}, in which classes were described for the use{\RR} --- here they are described for the develope{\RR}). This chapter is not a full introduction to \RR programming \citep[see][for more details]{braun+murdoch:07}, but it will try to give some feel of how the \code{Spatial} classes in package \pkg{sp} can be extended to be used for wider classes of problems. For full details, the interested reader is referred to e.g.\ \cite{R:Venables+Ripley:2000} and \cite{R:Chambers:1998}, the latter being a reference for new-style \SIV classes and methods. Example code is for example found in the source code for package \pkg{sp}, available from CRAN. Suppose we define myfun as \begin{footnotesize} << >>= myfun <- function(x) { x + 2 } @ \end{footnotesize} then, calling it with the numbers 1, 2 and 3 results in \begin{footnotesize} << >>= myfun(1:3) @ \end{footnotesize} or alternatively using a named argument: \begin{footnotesize} << >>= myfun(x=1:3) @ \end{footnotesize} The return value of the function is the last expression evaluated. Often, we want to wrap existing functions, such as a plot function: \begin{footnotesize} << >>= plotXplus2Yminus3 <- function(x, y, ...) { plot(x = x + 2, y = y - 3, ...) } @ \end{footnotesize} In this case, the \code{...} is used to pass information to the \code{plot} function without explicitly anticipating what it will be: named arguments \code{x} and \code{y}, or the first two arguments if they are unnamed are processed, remaining arguments are passed on. The plot function is a generic method, with an instance that depends on the class of its first (\SIII) or first $n$ arguments (\SIV). The available instances of \code{plot} are shown for \SIII-type methods by \begin{footnotesize} << >>= methods("plot") @ \end{footnotesize} and for \SIV-type methods by \begin{footnotesize} << >>= library(sp) showMethods("plot") @ \end{footnotesize} where we first loaded \pkg{sp} to make sure there are some \SIV plot methods to show. \subsection{\SIII-style classes and methods} Building \SIII-style classes is simple. Suppose we want to build an object of class \code{foo}: \begin{footnotesize} << >>= x <- rnorm(10) class(x) <- "foo" x @ \end{footnotesize} If we plot this object, e.g., by \code{plot(x)} we get the same plot as when we would not have set the class to \code{foo}. If we know, however, that objects of class \code{foo} need to be plotted without symbols but with connected lines, we can write a plot method for this class: \begin{footnotesize} << >>= plot.foo <- function(x, y, ...) { plot.default(x, type = 'l', ...) } @ \end{footnotesize} after which \code{plot(x)} will call this particular method, rather than a default plot method. Class inheritance is obtained in \SIII when an object is given multiple classes, as in \begin{footnotesize} << >>= class(x) <- c("foo", "bar") @ <>= plot(x) @ \end{footnotesize} For this plot, first function \code{plot.foo} will be looked for, and if not found the second option \code{plot.bar} will be looked for. If none of them is found, the default \code{plot.default} will be used. The \SIII class mechanism is simple and powerful. Much of \RR works with it, including key functions such as \code{lm}. \begin{footnotesize} << >>= data(meuse) class(meuse) class(lm(log(zinc)~sqrt(dist), meuse)) @ \end{footnotesize} There is, however, no checking that a class with a particular name does indeed contain the elements that a certain method for it expects. It also has design flaws, as method specification by dot separation is ambiguous in case of names such as \code{as.data.frame}, where one cannot tell whether it means that the method \code{as.data} acts on objects of class \code{frame}, or the method \code{as} acts on objects of class \code{data.frame}, or none of them (the answer is: none). For such reasons, \SIV-style classes and methods were designed. \subsection{\SIV-style classes and methods} \SIV-style classes are formally defined, using \code{setClass}. As an example, somewhat simplified versions of classes \code{CRS} and \code{Spatial} in \pkg{sp} are \begin{footnotesize} <>= options("width"=60) @ <>= setClass("CRS", representation(projargs = "character")) setClass("Spatial", representation(bbox = "matrix", proj4string = "CRS"), # NOT TOO WIDE validity <- function(object) { bb <- bbox(object) if (!is.matrix(bb)) return("bbox should be a matrix") n <- dimensions(object) if (n < 2) return("spatial.dimension should be 2 or more") if (any(is.na(bb))) return("bbox should never contain NA values") if (any(!is.finite(bb))) return("bbox should never contain infinite values") if (any(bb[,"max"] < bb[,"min"])) return("invalid bbox: max < min") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} The command \code{setClass} defines a class name as a formal class, gives the names of the class elements (called slots), and their type---type checking will happen upon construction of an instance of the class. Further checking, e.g., on valid dimensions and data ranges can be done in the \code{validity} function. Here, the validity function retrieves the bounding box using the generic \code{bbox} method. Generics, if not defined in the base R system, e.g., \begin{footnotesize} << >>= isGeneric("show") @ \end{footnotesize} can be defined with \code{setGeneric}. Defining a specific instance of a generic is done by \code{setMethod}: \begin{footnotesize} <>= setGeneric("bbox", function(obj) standardGeneric("bbox")) setMethod("bbox", signature = "Spatial", function(obj) obj@bbox) @ \end{footnotesize} where the signature tells the class of the first (or first $n$) arguments. Here, the \code{@} operator is used to access the \code{bbox} slot in an \SIV object, not to be confused with the \code{\$} operator to access list elements. We will now illustrate this mechanism by providing a few examples of classes, building on those available in package \pkg{sp}. \section{Animal track data in package \pkg{trip}} CRAN Package \pkg{trip}, written by Michael Sumner \citep{kirkwood06,page06}, provides a class for animal tracking data. Animal tracking data consist of sets of ($x,y,t$) stamps, grouped by an identifier pointing to an individual animal, sensor or perhaps isolated period of monitoring. A strategy for this (slightly simplified from that of \pkg{trip}) is to extend the {\tt SpatialPointsDataFrame} class by a length 2 character vector carrying the names of the time column and the trip identifier column in the {\tt SpatialPointsDataFrame} attribute table. Package \pkg{trip} does a lot of work to read and analyse tracking data from data formats typical for tracking data (Argos DAT), removing duplicate observations and validating the objects, e.g., checking that time stamps increase and movement speeds are realistic. We ignore this and stick to the bare bones. We now define a class called \code{trip} that extends \code{SpatialPointsDataFrame}: \begin{footnotesize} << >>= library(sp) setClass("trip", representation("SpatialPointsDataFrame", TOR.columns = "character"), validity <- function(object) { if (length(object@TOR.columns) != 2) stop("Time/id column names must be of length 2") if (!all(object@TOR.columns %in% names(object@data))) stop("Time/id columns must be present in attribute table") TRUE } ) showClass("trip") @ \end{footnotesize} that checks, upon creation of objects, that indeed two variable names are passed and that these names refer to variables present in the attribute table. \subsection{Generic and constructor functions} It would be nice to have a constructor function, just like \code{data.frame} or \code{SpatialPoints}, so we now create it and set it as the generic function to be called in case the first argument is of class \code{SpatialPointsDataFrame}. \begin{footnotesize} << >>= trip.default <- function(obj, TORnames) { if (!is(obj, "SpatialPointsDataFrame")) stop("trip only supports SpatialPointsDataFrame") if (is.numeric(TORnames)) TORnames <- names(obj)[TORnames] new("trip", obj, TOR.columns = TORnames) } if (!isGeneric("trip")) setGeneric("trip", function(obj, TORnames) standardGeneric("trip")) setMethod("trip", signature(obj = "SpatialPointsDataFrame", TORnames = "ANY"), trip.default) @ \end{footnotesize} We can now try it out, with turtle data: \begin{footnotesize} << >>= turtle <- read.csv(system.file("external/seamap105_mod.csv", package="sp")) @ << >>= timestamp <- as.POSIXlt(strptime(as.character(turtle$obs_date), "%m/%d/%Y %H:%M:%S"), "GMT") turtle <- data.frame(turtle, timestamp = timestamp) turtle$lon <- ifelse(turtle$lon < 0, turtle$lon+360, turtle$lon) turtle <- turtle[order(turtle$timestamp),] coordinates(turtle) <- c("lon", "lat") proj4string(turtle) <- CRS("+proj=longlat +ellps=WGS84") turtle$id <- c(rep(1, 200), rep(2, nrow(coordinates(turtle)) - 200)) turtle_trip <- trip(turtle, c("timestamp", "id")) summary(turtle_trip) @ \end{footnotesize} \subsection{Methods for trip objects} The summary method here is not defined for \code{trip}, but is the default summary inherited from class \code{Spatial}. As can be seen, nothing special about the trip features is mentioned, such as what the time points are and what the identifiers. We could alter this by writing a class-specific summary method \begin{footnotesize} << >>= summary.trip <- function(object, ...) { cat("Object of class \"trip\"\nTime column: ") print(object@TOR.columns[1]) cat("Identifier column: ") print(object@TOR.columns[2]) print(summary(as(object, "Spatial"))) print(summary(object@data)) } setMethod("summary", "trip", summary.trip) summary(turtle_trip) @ \end{footnotesize} As \code{trip} extends \code{SpatialPointsDataFrame}, subsetting using {\small \verb+"["+} and column selection or replacement using {\small \verb+"[["+} or {\small \verb+"$"+} all work, as these are inherited. Creating invalid trip objects can be prohibited by adding checks to the validity function in the class definition, e.g., %<>= %x <- turtle_trip[1] %@ will not work because the time and/or id column are not present any more. A custom plot method for trip could be written, for example using colour to denote a change in identifier: \begin{footnotesize} << >>= setGeneric("lines", function(x, ...) standardGeneric("lines")) setMethod("lines", signature(x = "trip"), function(x, ..., col = NULL) { # NOT TOO WIDE tor <- x@TOR.columns if (is.null(col)) { l <- length(unique(x[[tor[2]]])) col <- hsv(seq(0, 0.5, length = l)) } coords <- coordinates(x) lx <- split(1:nrow(coords), x[[tor[2]]]) for (i in 1:length(lx)) lines(coords[lx[[i]], ], col = col[i], ...) } ) @ \end{footnotesize} Here, the \code{col} argument is added to the function header so that a reasonable default can be overridden, e.g., for black/white plotting. \section{Multi-point data: \texttt{SpatialMultiPoints}} One of the feature types of the OpenGeospatial Consortium (OGC) simple feature specification that has not been implemented in \pkg{sp} is the \code{MultiPoint} object. In a \code{MultiPoint} object, each feature refers to a {\em set of} points. The \pkg{sp} classes \code{SpatialPointsDataFrame} only provide reference to a single point. Instead of building a new class up from scratch, we'll try to re-use code and build a class \code{SpatialMultiPoint} from the {\tt SpatialLines} class. After all, lines are just sets of ordered points. In fact, the \code{SpatialLines} class implements the \code{MultiLineString} simple feature, where each feature can refer to multiple lines. A special case is formed if each feature only has a single line: \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialMultiPoints", representation("SpatialLines"), validity <- function(object) { if (any(unlist(lapply(object@lines, function(x) length(x@Lines))) != 1)) # NOT TOO WIDE stop("Only Lines objects with one Line element") TRUE } ) SpatialMultiPoints <- function(object) new("SpatialMultiPoints", object) @ <>= options("width"=70) @ \end{footnotesize} As an example, we can create an instance of this class for two MultiPoint features each having three locations: \begin{footnotesize} << >>= n <- 5 set.seed(1) x1 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x2 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x3 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) L1 <- Lines(list(Line(x1)), ID="mp1") L2 <- Lines(list(Line(x2)), ID="mp2") L3 <- Lines(list(Line(x3)), ID="mp3") s <- SpatialLines(list(L1,L2,L3)) smp <- SpatialMultiPoints(s) @ \end{footnotesize} If we now plot object \code{smp}, we get the same plot as when we plot \code{s}, showing the two lines. The \code{plot} method for a \code{SpatialLines} object is not suitable, so we write a new one: \begin{footnotesize} << >>= plot.SpatialMultiPoints <- function(x, ..., pch = 1:length(x@lines), col = 1, cex = 1) { n <- length(x@lines) if (length(pch) < n) pch <- rep(pch, length.out = n) if (length(col) < n) col <- rep(col, length.out = n) if (length(cex) < n) cex <- rep(cex, length.out = n) plot(as(x, "Spatial"), ...) for (i in 1:n) points(x@lines[[i]]@Lines[[1]]@coords, pch = pch[i], col = col[i], cex = cex[i]) } setMethod("plot", signature(x = "SpatialMultiPoints", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) @ \end{footnotesize} Here we chose to pass any named \code{...} arguments to the plot method for a \code{Spatial} object. This function sets up the axes and controls the margins, aspect ratio, etc. All arguments that need to be passed to \code{points} (\code{pch} for symbol type, \code{cex} for symbol size and \code{col} for symbol colour) need explicit naming and sensible defaults, as they are passed explicitly to the consecutive calls to \code{points}. According to the documentation of \code{points}, in addition to \code{pch}, \code{cex} and \code{col}, the arguments \code{bg} and \code{lwd} (symbol fill colour and symbol line width) would need a similar treatment to make this plot method completely transparent with the base \code{plot} method---something an end user would hope for. Having \code{pch}, \code{cex} and \code{col} arrays the length of the number of \code{MultiPoints} {\em sets} rather than the number of points to be plotted is useful for two reasons. First, the whole point of {\tt MultiPoints} object is to distinguish {\em sets} of points. Second, when we extend this class to \code{SpatialMultiPointsDataFrame}, e.g., by \begin{footnotesize} << >>= cName <- "SpatialMultiPointsDataFrame" setClass(cName, representation("SpatialLinesDataFrame"), validity <- function(object) { lst <- lapply(object@lines, function(x) length(x@Lines)) if (any(unlist(lst) != 1)) stop("Only Lines objects with single Line") TRUE } ) SpatialMultiPointsDataFrame <- function(object) { new("SpatialMultiPointsDataFrame", object) } @ \end{footnotesize} then we can pass symbol characteristics by (functions of) columns in the attribute table: \begin{footnotesize} <>= df <- data.frame(x1 = 1:3, x2 = c(1,4,2), row.names = c("mp1", "mp2", "mp3")) smp_df <- SpatialMultiPointsDataFrame(SpatialLinesDataFrame(smp, df)) setMethod("plot", signature(x = "SpatialMultiPointsDataFrame", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) grys <- c("grey10", "grey40", "grey80") @ <>= plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) @ \end{footnotesize} for which the plot is shown in Figure \ref{fig:smpdf}. \begin{figure} %<>= <>= .iwidth <- 6 .iheight <- 2.5 .ipointsize <- 10 <> plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) <> <> @ \caption{Plot of the \code{SpatialMultiPointsDataFrame} object.} \label{fig:smpdf} \end{figure} Hexagonal grids are like square grids, where grid points are centres of matching hexagons, rather than squares. Package \pkg{sp} has no classes for hexagonal grids, but does have some useful functions for generating and plotting them. This could be used to build a class. Much of this code in \pkg{sp} is based on postings to the R-sig-geo mailing list by Tim Keitt, used with permission. The spatial sampling method \code{spsample} has a method for sampling points on a hexagonal grid: \begin{footnotesize} <<>>= data(meuse.grid) gridded(meuse.grid)=~x+y xx <- spsample(meuse.grid, type="hexagonal", cellsize=200) class(xx) @ \end{footnotesize} gives the points shown in the left side of Figure \ref{fig:hex}. Note that an alternative hexagonal representation is obtained by rotating this grid 90 degrees; we will not further consider that here. \begin{footnotesize} <>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) @ <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", HexPts, col = 1)) @ <>= HexPols <- HexPoints2SpatialPolygons(HexPts) df <- over(HexPols, meuse.grid) HexPolsDf <- SpatialPolygonsDataFrame(HexPols, df, match.ID = FALSE) @ <>= spplot(HexPolsDf["dist"]) @ \end{footnotesize} for which the plots are shown in Figure \ref{fig:hex}. \begin{figure} <>= .iwidth <- 6 .iheight <- 4 <> library(lattice) # RSB quietening greys grys <- grey.colors(11, 0.95, 0.55, 2.2) print(spplot(meuse.grid["dist"], cuts=10, col.regions=grys, sp.layout = list("sp.points", HexPts, col = 1)), split = c(1, 1, 2, 1), more = TRUE) print(spplot(HexPolsDf["dist"], cuts=10, col.regions=grys), split = c(2, 1, 2, 1), more = FALSE) <> <> @ \caption{Hexagonal points (left) and polygons (right).} \label{fig:hex} \end{figure} We can now generate and plot hexagonal grids, but need to deal with two representations: as points and as polygons, and both representations do not tell by themselves that they represent a hexagonal grid. For designing a hexagonal grid class we will extend \code{SpatialPoints}, assuming that computation of the polygons can be done when needed without a prohibitive overhead. \begin{footnotesize} << >>= setClass("SpatialHexGrid", representation("SpatialPoints", dx = "numeric"), validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=40) @ << >>= setClass("SpatialHexGridDataFrame", representation("SpatialPointsDataFrame", dx = "numeric"), # NOT TOO WIDE validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Note that these class definitions do not check that instances actually do form valid hexagonal grids; a more robust implementation could provide a test that distances between points with equal $y$ coordinate are separated by a multiple of \code{dx}, that the $y$-separations are correct and so on. It might make sense to adapt the generic \code{spsample} method in package \pkg{sp} to return \code{SpatialHexGrid} objects; we can also add \code{plot} and \code{spsample} methods for them. Method \code{over} should work with a \code{SpatialHexGrid} as its first argument, by inheriting from \code{SpatialPoints}. Let us first see how to create the new classes. Without a constructor function we can use \begin{footnotesize} << >>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) Hex <- new("SpatialHexGrid", HexPts, dx = 200) df <- over(Hex, meuse.grid) spdf <- SpatialPointsDataFrame(HexPts, df) HexDf <- new("SpatialHexGridDataFrame", spdf, dx = 200) @ \end{footnotesize} Because of the route taken to define both HexGrid classes, it is not obvious that the second extends the first. We can tell the \SIV system this by \code{setIs}: \begin{footnotesize} << >>= is(HexDf, "SpatialHexGrid") setIs("SpatialHexGridDataFrame", "SpatialHexGrid") is(HexDf, "SpatialHexGrid") @ \end{footnotesize} to make sure that methods for \code{SpatialHexGrid} objects work as well for objects of class \code{SpatialHexGridDataFrame}. When adding methods, several of them will need conversion to the polygon representation, so it makes sense to add the conversion function such that e.g. \code{as(x, "SpatialPolygons")} will work: \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setAs("SpatialHexGrid", "SpatialPolygons", function(from) HexPoints2SpatialPolygons(from, from@dx) ) setAs("SpatialHexGridDataFrame", "SpatialPolygonsDataFrame", function(from) SpatialPolygonsDataFrame(as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE) ) @ <>= options("width"=70) @ \end{footnotesize} We can now add \code{plot}, \code{spplot}, \code{spsample} and \code{over} methods for these classes: \begin{footnotesize} << >>= setMethod("plot", signature(x = "SpatialHexGrid", y = "missing"), function(x, y, ...) plot(as(x, "SpatialPolygons"), ...) ) setMethod("spplot", signature(obj = "SpatialHexGridDataFrame"), function(obj, ...) spplot(SpatialPolygonsDataFrame( as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE), ...) ) setMethod("spsample", "SpatialHexGrid", function(x, n, type, ...) spsample(as(x, "SpatialPolygons"), n = n, type = type, ...) ) setMethod("over", c("SpatialHexGrid", "SpatialPoints"), function(x, y, ...) over(as(x, "SpatialPolygons"), y) ) @ \end{footnotesize} After this, the following will work: \begin{footnotesize} <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", Hex, col = 1)) spplot(HexDf["dist"]) @ \end{footnotesize} Coercion to a data frame is done by \begin{footnotesize} <>= as(HexDf, "data.frame") @ \end{footnotesize} Another detail not mentioned is that the bounding box of the hexgrid objects only match the grid centre points, not the hexgrid cells: \begin{footnotesize} << >>= bbox(Hex) bbox(as(Hex, "SpatialPolygons")) @ \end{footnotesize} One solution for this is to correct for this in a constructor function, and check for it in the validity test. Explicit coercion functions to the points representation would have to set the bounding box back to the points ranges. Another solution is to write a bbox method for the hexgrid classes, taking the risk that someone still looks at the incorrect bbox slot. \section{Spatio-temporal grids} Spatio-temporal data can be represented in different ways. One simple option is when observations (or model-results, or predictions) are given on a regular space-time grid. Objects of class or extending \code{SpatialPoints}, \code{SpatialPixels} and \code{SpatialGrid} do not have the constraint that they represent a two-dimensional space; they may have arbitrary dimension; an example for a three-dimensional grid is \begin{footnotesize} << >>= n <- 10 x <- data.frame(expand.grid(x1 = 1:n, x2 = 1:n, x3 = 1:n), z = rnorm(n^3)) coordinates(x) <- ~x1+x2+x3 gridded(x) <- TRUE fullgrid(x) <- TRUE summary(x) @ \end{footnotesize} We might assume here that the third dimension, \code{x3}, represents time. If we are happy with time somehow represented by a real number (in double precision), then we are done. A simple representation is that of decimal year, with e.g. 1980.5 meaning the 183rd day of 1980, or e.g. relative time in seconds after the start of some event. When we want to use the \code{POSIXct} or \code{POSIXlt} representations, we need to do some more work to see the readable version. We will now devise a simple three-dimensional space-time grid with the \code{POSIXct} representation. \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setClass("SpatialTimeGrid", "SpatialGrid", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Along the same line, we can extend the \code{SpatialGridDataFrame} for space-time: \begin{footnotesize} << >>= setClass("SpatialTimeGridDataFrame", "SpatialGridDataFrame", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) setIs("SpatialTimeGridDataFrame", "SpatialTimeGrid") x <- new("SpatialTimeGridDataFrame", x) @ \end{footnotesize} A crude summary for this class could be written along these lines: \begin{footnotesize} << >>= summary.SpatialTimeGridDataFrame <- function(object, ...) { cat("Object of class SpatialTimeGridDataFrame\n") x <- gridparameters(object) t0 <- ISOdate(1970,1,1,0,0,0) t1 <- t0 + x[3,1] cat(paste("first time step:", t1, "\n")) t2 <- t0 + x[3,1] + (x[3,3] - 1) * x[3,2] cat(paste("last time step: ", t2, "\n")) cat(paste("time step: ", x[3,2], "\n")) summary(as(object, "SpatialGridDataFrame")) } @ <>= options("width"=50) @ << >>= # NOT TOO WIDE setMethod("summary", "SpatialTimeGridDataFrame", summary.SpatialTimeGridDataFrame) summary(x) @ <>= options("width"=70) @ \end{footnotesize} Next, suppose we need a subsetting method that selects on the time. When the first subset argument is allowed to be a time range, this is done by \begin{footnotesize} << >>= subs.SpatialTimeGridDataFrame <- function(x, i, j, ..., drop=FALSE) { t <- coordinates(x)[,3] + ISOdate(1970,1,1,0,0,0) if (missing(j)) j <- TRUE sel <- t %in% i if (! any(sel)) stop("selection results in empty set") fullgrid(x) <- FALSE if (length(i) > 1) { x <- x[i = sel, j = j,...] fullgrid(x) <- TRUE as(x, "SpatialTimeGridDataFrame") } else { gridded(x) <- FALSE x <- x[i = sel, j = j,...] cc <- coordinates(x)[,1:2] p4s <- CRS(proj4string(x)) # NOT TOO WIDE SpatialPixelsDataFrame(cc, x@data, proj4string = p4s) } } setMethod("[", c("SpatialTimeGridDataFrame", "POSIXct", "ANY"), subs.SpatialTimeGridDataFrame) t1 <- as.POSIXct("1970-01-01 0:00:03", tz = "GMT") t2 <- as.POSIXct("1970-01-01 0:00:05", tz = "GMT") summary(x[c(t1,t2)]) summary(x[t1]) @ \end{footnotesize} The reason to only convert back to \code{SpatialTimeGridDataFrame} when multiple time steps are present is that the time step (``cell size'' in time direction) cannot be found when there is only a single step. In that case, the current selection method returns an object of class \code{SpatialPixelsDataFrame} for that time slice. Plotting a set of slices could be done using levelplot, or writing another \code{spplot} method: \begin{footnotesize} << >>= spplot.stgdf <- function(obj, zcol = 1, ..., format = NULL) { # NOT TOO WIDE if (length(zcol) != 1) stop("can only plot a single attribute") if (is.null(format)) format <- "%Y-%m-%d %H:%M:%S" cc <- coordinates(obj) df <- unstack(data.frame(obj[[zcol]], cc[,3])) ns <- as.character(coordinatevalues(getGridTopology(obj))[[3]] + ISOdate(1970,1,1,0,0,0), format = format) cc2d <- cc[cc[,3] == min(cc[,3]), 1:2] obj <- SpatialPixelsDataFrame(cc2d, df) spplot(obj, names.attr = ns,...) } setMethod("spplot", "SpatialTimeGridDataFrame", spplot.stgdf) @ \end{footnotesize} \begin{figure} \begin{center} <>= .iwidth <- 6 .iheight <- 4 <> print(spplot(x, format = "%H:%M:%S", as.table=TRUE)) <> <> @ \end{center} \caption{ \code{spplot} for an object of class \code{SpatialTimeGridDataFrame}, filled with random numbers.} \label{fig:stgdf} \end{figure} Now, the result of \begin{footnotesize} <>= library(lattice) trellis.par.set(canonical.theme(color = FALSE)) spplot(x, format = "%H:%M:%S", as.table=TRUE, cuts=6, col.regions=grey.colors(7, 0.55, 0.95, 2.2)) # RSB quietening greys @ \end{footnotesize} is shown in Figure \ref{fig:stgdf}. The format argument passed controls the way time is printed; one can refer to the help of \begin{footnotesize} <>= ?as.character.POSIXt @ \end{footnotesize} for more details about the \code{format} argument. \section{Analysing spatial Monte Carlo simulations} \label{sec:simquant} Quite often, spatial statistical analysis results in a large number of spatial realisations or a random field, using some Monte Carlo simulation approach. Regardless whether individual values refer to points, lines, polygons or grid cells, we would like to write some methods or functions that aggregate over these simulations, to get summary statistics such as the mean value, quantiles, or cumulative distributions values. Such aggregation can take place in two ways. Either we aggregate over the probability space, and compute summary statistics for each geographical feature over the set of realisations (i.e., the rows of the attribute table), or for each realisation we aggregate over the complete geographical layer or a subset of it (i.e., aggregate over the columns of the attribute table). Let us first generate, as an example, a set of 100 conditional Gaussian simulations for the zinc variable in the meuse data set: \begin{footnotesize} <>= library(gstat) data(meuse) coordinates(meuse) <- ~x+y v <- vgm(.5, "Sph", 800, .05) sim <- krige(log(zinc)~1, meuse, meuse.grid, v, nsim=100, nmax=30) sim@data <- exp(sim@data) @ \end{footnotesize} where the last statement back-transforms the simulations from the log scale to the observation scale. A quantile method for Spatial object attributes can be written as \begin{footnotesize} << >>= quantile.Spatial <- function(x, ..., byLayer = FALSE) { stopifnot("data" %in% slotNames(x)) apply(x@data, ifelse(byLayer, 2, 1), quantile, ...) } @ \end{footnotesize} after which we can find the sample lower and upper 95\% confidence limits by \begin{footnotesize} << >>= sim$lower <- quantile.Spatial(sim[1:100], probs = 0.025) sim$upper <- quantile.Spatial(sim[1:100], probs = 0.975) @ \end{footnotesize} To get the sample distribution of the areal median, we can aggregate over layers: \begin{footnotesize} << >>= medians <- quantile.Spatial(sim[1:100], probs = 0.5, byLayer = TRUE) @ <>= hist(medians) @ \end{footnotesize} It should be noted that in these particular cases, the quantities computed by simulations could have been obtained faster and exact by working analytically with ordinary (block) kriging and the normal distribution (Section 8.7.2 in \cite{bivand}). A statistic that cannot be obtained analytically is the sample distribution of the area fraction that exceeds a threshold. Suppose that 500 is a crucial threshold, and we want to summarise the sampling distribution of the area fraction where 500 is exceeded: \begin{footnotesize} <>= options("width"=50) @ << >>= fractionBelow <- function(x, q, byLayer = FALSE) { stopifnot(is(x, "Spatial") || !("data" %in% slotNames(x))) apply(x@data < q, ifelse(byLayer, 2, 1), function(r) sum(r)/length(r)) # NOT TOO WIDE } @ <>= options("width"=70) @ << >>= over500 <- 1 - fractionBelow(sim[1:100], 200, byLayer = TRUE) summary(over500) quantile(over500, c(0.025, 0.975)) @ \end{footnotesize} For space-time data, we could write methods that aggregate over space, over time or over space and time. \section{Processing massive grids} Up to now we have made the assumption that gridded data can be completely read, and are kept by \RR in memory. In some cases, however, we need to process grids that exceed the memory capacity of the computers available. A method for analysing grids without fully loading them into memory then seems useful. Note that package \pkg{rgdal} allows for partial reading of grids, e.g., \begin{footnotesize} <<>>= fn <- system.file("pictures/erdas_spnad83.tif", package = "rgdal")[1] @ <>= x <- readGDAL(fn, output.dim = c(120, 132)) x$band1[x$band1 <= 0] <- NA spplot(x, col.regions=bpy.colors()) @ \end{footnotesize} reads a downsized grid, where 1\% of the grid cells remained. Another option is reading certain rectangular sections of a grid, starting at some offset. Yet another approach is to use the low-level opening routines and then subset: \begin{footnotesize} << >>= library(rgdal) x <- GDAL.open(fn) class(x) x.subs <- x[1:100, 1:100, 1] class(x.subs) gridparameters(x.subs) @ \end{footnotesize} An object of class \code{GDALReadOnlyDataset} only contains a file handle. The subset method {\small \verb+"["+} for it does not, as it quite often does, return an object of the same class but actually reads the data requested, with arguments interpreted as {\em rows}, {\em columns} and raster {\em bands}, and returns a \code{SpatialGridDataFrame}. We will now extend this approach to allow partial writing through {\small \verb+"["+} as well. As the actual code is rather lengthy and involves a lot of administration, it will not all be shown and details can be found in the \pkg{rgdal} source code. We will define two classes, \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialGDAL", representation("Spatial", grid = "GridTopology", grod = "GDALReadOnlyDataset", # NOT TOO WIDE name = "character")) setClass("SpatialGDALWrite", "SpatialGDAL") @ <>= options("width"=70) @ \end{footnotesize} that derive from \code{Spatial}, contain a \code{GridTopology} and a file handle in the \code{grod} slot. Next, we can define a function \code{open.SpatialGDAL} to open a raster file, returning a \code{SpatialGDAL} object and a function \code{copy.SpatialGDAL} that returns a writable copy of the opened raster. Note that some GDAL drivers only allow copying, some only writing and some both. \begin{footnotesize} <>= x <- open.SpatialGDAL(fn) nrows <- GDALinfo(fn)["rows"] ncols <- GDALinfo(fn)["columns"] xout <- copy.SpatialGDAL(x, "erdas_spnad83_out.tif") bls <- 20 for (i in 1:(nrows/bls - 1)) { r <- 1+(i-1)*bls for (j in 1:(ncols/bls - 1)) { c <- 1+(j-1)*bls x.in <- x[r:(r+bls),c:(c+bls)] xout[r:(r+bls),c:(c+bls)] <- x.in$band1 + 10 #$ } cat(paste("row-block", i, "\n")) } close(x) close(xout) @ \end{footnotesize} This requires the functions {\small \verb+"["+} and {\small \verb+"[<-"+} to be present. They are set by \begin{footnotesize} <>= setMethod("[", "SpatialGDAL", function(x, i, j, ... , drop = FALSE) x@grod[i = i, j = j, ...] ) setReplaceMethod("[", "SpatialGDALWrite", function(x, i, j, ..., value) { ... }) @ \end{footnotesize} where, for the latter, the implementation details are here omitted. It should be noted that single rows or columns cannot be read this way, as they cannot be converted sensibly to a grid. It should be noted that flat binary representations such as the Arc/Info Binary Grid allow much faster random access than ASCII representations or compressed formats such as jpeg varieties. Also, certain drivers in the GDAL library suggest an optimal block size for partial access (e.g., typically a single row), which is not used here\footnote{An attempt to use this block size is, at time of writing, found in the \code{blockApply} code, found in the THK branch of the \pkg{rgdal} project on R-forge.}. This chapter has sketched developments beyond the base \pkg{sp} classes and methods used otherwise in this book. Although we think that the base classes cater for many standard kinds of spatial data analysis, it is clear that specific research problems will call for specific solutions, and that the \RR environment provides the high-level abstractions needed to help busy researchers get their work done. <>= options("width"=owidth) @ \begin{thebibliography}{} \bibitem[Bivand et al., 2008]{bivand} Roger S. Bivand, Edzer J. Pebesma and Virgilio Gomez-Rubio (2008). \newblock {\em Applied spatial data analysis with {\RR}} \newblock Springer, NY \bibitem[Braun and Murdoch, 2007]{braun+murdoch:07} Braun, W.~J. and Murdoch, D.~J. (2007). \newblock {\em A first course in statistical programming with {\RR}}. \newblock Cambridge University Press, Cambridge. \bibitem[Chambers, 1998]{R:Chambers:1998} Chambers, J.M. (1998). \newblock {\em Programming with Data}. \newblock Springer, New York. \bibitem[Kirkwood et al., 2006]{kirkwood06} Kirkwood, R., Lynch, M., Gales, N., Dann, P., and Sumner, M. (2006). \newblock At-sea movements and habitat use of adult male {A}ustralian fur seals ({A}rctocephalus pusillus doriferus). \newblock {\em Canadian Journal of Zoology}, 84:1781--1788. \bibitem[Page et al., 2006]{page06} Page, B., McKenzie, J., Sumner, M., Coyne, M., and Goldsworthy, S. (2006). \newblock Spatial separation of foraging habitats among {N}ew {Z}ealand fur seals. \newblock {\em Marine Ecology Progress Series}, 323:263--279. \bibitem[Venables and Ripley, 2000]{R:Venables+Ripley:2000} Venables, W. N. and Ripley, B. D. (2000). \newblock {\em {\SS} Programming}. \newblock Springer, New York. \end{thebibliography} \end{document} sp/inst/doc/intro_sp.Rnw0000644000176200001440000004775512635750062014773 0ustar liggesusers% dimensions(x) returns number of spatial dimensions % y = transform(x, "proj4string") % bbox(x) % coordinates(x) ; <- % rings(x) ; <- % method to retrieve lines? --> Lines()? % gridded(x) ; <- % \documentclass{article} % \VignetteIndexEntry{sp: classes and methods for spatial data} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{color} \usepackage{Sweave} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong \newcommand{\code}[1]{{\tt #1}} \newcommand{\proglang}[1]{{\bf #1}} \title{ Classes and Methods for Spatial Data:\\ the \pkg{sp} Package } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Heisenbergstra{\ss}e 2, 48149 M\"{u}nster, Germany. \code{edzer.pebesma@uni-muenster.de}} \and Roger S.\ Bivand\footnote{Economic Geography Section, Department of Economics, % Norwegian School of Economics and Business Administration, % Breiviksveien 40, N-5045 Bergen, Norway; \code{Roger.Bivand@nhh.no}}} \date{Feb 2005} \begin{document} \maketitle \tableofcontents \section{Introduction} The \pkg{sp} package provides classes and methods for dealing with spatial data in \proglang{R}\footnote{ The motivation to write this package was born on a \href{http://spatial.nhh.no/meetings/vienna/index.html}{pre-conference spatial data workshop} during \href{http://www.ci.tuwien.ac.at/Conferences/DSC-2003/}{DSC 2003}. At that time, the advantage of having multiple R packages for spatial statistics seemed to be hindered by a lack of a uniform interface for handling spatial data. Each package had its own conventions on how spatial data were stored and returned. With this package, and packages supporting the classes provided here, we hope that \proglang{R} with its extension packages becomes more coherent for analyzing different types of spatial data. }. The spatial data structures implemented include points, lines, polygons and grids; each of them with or without attribute data. We have chosen to use S4 classes and methods style (Chambers, 1998) to allow validation of objects created. Although we mainly aim at using spatial data in the geographical (two-dimensional) domain, the data structures that have a straightforward implementation in higher dimensions (points, grids) do allow this. From the package home page on CRAN, \url{https://cran.r-project.org/package=sp}, links to a graph gallery with R code, and the development source tree are found. This vignette describes the classes, methods and functions provided by \pkg{sp}. Instead of manipulating the class slots (components) directly\footnote{which is possible, but not recommended because validity of resulting objects is no longer verified}, we provide methods and functions to create or modify the classes from elementary types such as matrices, {\tt data.frame}s or lists and convert them back to any of these types. Also, coercion (type casting) from one class to the other is provided, where relevant. Package \pkg{sp} is loaded by <<>>= library(sp) @ <>= set.seed(13331) # library(lattice) @ \section{Spatial data classes} The spatial data classes implemented are points, grids, lines, rings and polygons. Package \pkg{sp} provides classes for the spatial-only information (the topology), e.g. \code{SpatialPoints}, and extensions for the case where attribute information stored in a \code{data.frame} is available for each spatial entity (e.g. for points, the \code{SpatialPointsDataFrame}). The available data classes are: \begin{center} \begin{tabular}{lllll} data type & class & attributes & contains \\ \hline points & \code{SpatialPoints} & No &\code{Spatial} \\ points & \code{SpatialPointsDataFrame} & \code{data.frame} &\code{SpatialPoints} \\ multipoints & \code{SpatialMultiPoints} & No &\code{Spatial} \\ multipoints & \code{SpatialMultiPointsDataFrame} & \code{data.frame} &\code{SpatialMultiPoints} \\ pixels & \code{SpatialPixels} & No &\code{SpatialPoints} \\ pixels & \code{SpatialPixelsDataFrame} & \code{data.frame} &\code{SpatialPixels} \\ & & &\code{SpatialPointsDataFrame} \\ full grid & \code{SpatialGrid } & No &\code{SpatialPixels} \\ full grid & \code{SpatialGridDataFrame} & \code{data.frame} &\code{SpatialGrid} \\ line & \code{Line} & No & \\ lines & \code{Lines} & No & \code{Line} list \\ lines & \code{SpatialLines} & No & \code{Spatial}, \code{Lines} list \\ lines & \code{SpatialLinesDataFrame} & \code{data.frame} &\code{SpatialLines} \\ polygons & \code{Polygon} & No &\code{Line} \\ polygons & \code{Polygons} & No &\code{Polygon} list \\ polygons & \code{SpatialPolygons} & No &\code{Spatial}, \code{Polygons} list \\ polygons & \code{SpatialPolygonsDataFrame} & \code{data.frame} &\code{SpatialPolygons} \\ \end{tabular} \end{center} The class \code{Spatial} only holds metadata common to all derived classes (bounding box, coordinate reference system), and is of convenient for defining methods that are common to all derived classes. In the following sections we will show how we can create objects of these classes from scratch or from other objects, and which methods and functions are available to them. \section{Manipulating spatial objects} Although entries in spatial objects are in principle accessible through their slot name, e.g. \code{x@coords} contains the coordinates of an object of class or extending \code{SpatialPoints}, we strongly encourage users to access the data by using functions and methods, in this case {\tt coordinates(x)} to retrieve the coordinates. \subsection{Standard methods} Selecting, retrieving or replacing certain attributes in spatial objects with attributes is done using standard methods \begin{itemize} \item \verb|[| select "rows" (features) and/or columns in the data attribute table; e.g. \code{meuse[1:2, "zinc"]} returns a \code{SpatialPointsDataFrame} with the first two points and an attribute table with only variable "zinc". \item \verb|[[| extracts a column from the data attribute table \item \verb|[[<-| assign or replace a column in the data attribute table. \end{itemize} Other methods available are: \code{plot}, \code{summary}, \code{print}, \code{dim} and \code{names} (operate on the data.frame part), {\tt as.data.frame}, \code{as.matrix} and \code{image} (for gridded data), \code{lines} (for line data), \code{points} (for point data), \code{subset} (points and grids), \code{stack} (point and grid data.frames), \code{over} for spatial joins, \code{spplot}, and \code{length} (number of features). \subsection{Spatial methods} A number of spatial methods are available for the classes in \pkg{sp}: \begin{itemize} \item \code{dimensions(x)} returns number of spatial dimensions \item \code{y = spTransform(x, CRS("+proj=longlat +datum=WGS84"))} convert or transform from one coordinate reference system (geographic projection) to another (requires package rgdal to be installed) \item \code{bbox(x)} returns a matrix with the coordinates bounding box; the dimensions form rows, min/max form the columns \item \code{coordinates(x)} returns a matrix with the spatial coordinates %\item \code{rings(x)} retrieve the spatial rings (polygons) of an %object deriving from \code{SpatialPolygons} % \item \code{method to retrieve lines? --> Lines()? \item \code{gridded(x)} tells whether \code{x} derives from SpatialPixels, or when used in assignment, coerces a \code{SpatialPoints} object into a \code{SpatialPixels} object. \item \code{spplot(x)} plots attributes, possibly in combination with other types of data (points, lines, grids, polygons), and possibly in as a conditioning plot for multiple attributes \item \code{over(x, y)} retrieve index or attributes of \code{y} corresponding (intersecting) with spatial locations of \code{x}. \item \code{spsample(x)} samples point coordinates in the continuous space of \code{SpatialPolygons}, a gridded area, or along a \code{SpatialLines}. Subsetting and \code{sample} can be used to randomly subsample full spatial entities. \item \code{geometry(x)} strips the \code{data.frame}, and returns the geometry-only object \end{itemize} \section{Spatial points} \subsection{Points without attributes} We can generate a set of 10 points on the unit square $[0,1] \times [0,1]$ by <>= xc = round(runif(10), 2) yc = round(runif(10), 2) xy = cbind(xc, yc) xy @ this $10 \times 2$ matrix can be converted into a \code{SpatialPoints} object by <>= xy.sp = SpatialPoints(xy) xy.sp plot(xy.sp, pch = 2) @ The plot is shown in figure \ref{fig:points}. \begin{figure} \begin{center} <>= plot(xy.sp, pch = 2) @ \end{center} \caption{plot of \code{SpatialPoints} object; aspect ratio of x and y axis units is 1} \label{fig:points} \end{figure} We can retrieve the coordinates from \code{xy.sp} by <>= xy.cc = coordinates(xy.sp) class(xy.cc) dim(xy.cc) @ and other methods retrieve the bounding box, the dimensions, select points (not dimensions or columns), coerce to a data.frame, or print a summary: <>= bbox(xy.sp) dimensions(xy.sp) xy.sp[1:2] xy.df = as.data.frame(xy.sp) class(xy.df) dim(xy.df) summary(xy.sp) @ \subsection{Points with attributes} One way of creating a \code{SpatialPointsDataFrame} object is by building it from a a \code{SpatialPoints} object and a data.frame containing the attributes: <>= df = data.frame(z1 = round(5 + rnorm(10), 2), z2 = 20:29) df xy.spdf = SpatialPointsDataFrame(xy.sp, df) xy.spdf summary(xy.spdf) dimensions(xy.spdf) xy.spdf[1:2, ] # selects row 1 and 2 xy.spdf[1] # selects attribute column 1, along with the coordinates xy.spdf[1:2, "z2"] # select row 1,2 and attribute "z2" xy.df = as.data.frame(xy.spdf) xy.df[1:2,] xy.cc = coordinates(xy.spdf) class(xy.cc) dim(xy.cc) @ A note on selection with \verb|[|: the behaviour is as much as possible copied from that of \code{data.frame}s, but coordinates are always sticky and a \code{SpatialPointsDataFrame} is always returned; {\tt drop=FALSE} is not allowed. If coordinates should be dropped, use the \code{as.data.frame} method and select the non-coordinate data, or use \verb|[[| to select a single attribute column (example below). \code{SpatialPointsDataFrame} objects can be created directly from data.frames by specifying which columns contain the coordinates: <>= df1 = data.frame(xy, df) coordinates(df1) = c("xc", "yc") df1 @ or <>= df2 = data.frame(xy, df) coordinates(df2) = ~xc+yc df2[1:2,] as.data.frame(df2)[1:2,] @ Note that in this form, \code{coordinates} by setting (specifying) the coordinates promotes its argument, an object of class \code{data.frame} to an object of class \code{SpatialPointsDataFrame}. The method {\tt as.data.frame} coerces back to the original \code{data.frame}. When used on a right-hand side of an equation, \code{coordinates} {\em retrieves} the matrix with coordinates: <<>>= coordinates(df2)[1:2,] @ Elements (columns) in the data.frame part of an object can be manipulated (retrieved, assigned) directly: <<>>= df2[["z2"]] df2[["z2"]][10] = 20 df2[["z3"]] = 1:10 summary(df2) @ Plotting attribute data can be done by using either \code{spplot} to colour symbols, or \code{bubble} which uses symbol size: <>= bubble(df2, "z1", key.space = "bottom") spplot(df2, "z1", key.space = "bottom") @ the resulting plots are shown in figure \ref{fig:spdf}. \begin{figure} \begin{center} <>= print(bubble(df2, "z1", key.space = "bottom"), split = c(1,1,2,1), more=TRUE) print(spplot(df2, "z1", key.space = "bottom"), split = c(2,1,2,1), more=FALSE) @ \end{center} \caption{plot of \code{SpatialPointsDataFrame} object, using symbol size (\code{bubble}, top) or colour (\code{spplot}, bottom) } \label{fig:spdf} \end{figure} \section{Grids} Package \pkg{sp} has two classes for grid topology: \code{SpatialPixels} and \code{SpatialGrid}. The pixels form stores coordinates and is for partial grids, or unordered points; the \code{SpatialGrid} form does not store coordinates but holds full grids (i.e., \code{SpatialGridDataFrame} holds attribute values for each grid cell). Objects can be coerced from one representation to the other. \subsection{Creating grids from topology} When we know the offset, the cell sizes and the dimensions of a grid, we can specify this by using the function \code{GridTopology}: <<>>= gt = GridTopology(cellcentre.offset = c(1,1,2), cellsize=c(1,1,1), cells.dim = c(3,4,6)) grd = SpatialGrid(gt) summary(grd) @ The grid parameters can be retrieved by the function <<>>= gridparameters(grd) @ \subsection{Creating grids from points} In the following example a three-dimensional grid is constructed from a set of point coordinates: <<>>= pts = expand.grid(x = 1:3, y = 1:4, z=2:7) grd.pts = SpatialPixels(SpatialPoints(pts)) summary(grd.pts) grd = as(grd.pts, "SpatialGrid") summary(grd) @ Note that when passed a points argument, SpatialPixels accepts a tolerance (default 10 * .Machine\$double.eps) to specify how close the points have to be to being exactly on a grid. For very large coordinates, this value may have to be increased. A warning is issued if full rows and/or columns are missing. \subsection{Gridded data with attributes} Spatial, gridded data are data with coordinates on a regular lattice. To form such a grid we can go from coordinates: <<>>= attr = expand.grid(xc = 1:3, yc = 1:3) grd.attr = data.frame(attr, z1 = 1:9, z2 = 9:1) coordinates(grd.attr) = ~xc+yc gridded(grd.attr) gridded(grd.attr) = TRUE gridded(grd.attr) summary(grd.attr) @ Package \pkg{raster} provides dedicated methods to deal with raster data, and can deal with grids that are too large to be stored in memory. \subsection{Are grids stored as points or as matrix/array?} The form in which gridded data comes depends on whether the grid was created from a set of points or from a matrix or external grid format (e.g. read through rgdal). Retrieving the form, or conversion to another can be done by \code{as(x, "class")}, or by using the function \code{fullgrid}: <<>>= fullgrid(grd) fullgrid(grd.pts) fullgrid(grd.attr) fullgrid(grd.pts) = TRUE fullgrid(grd.attr) = TRUE fullgrid(grd.pts) fullgrid(grd.attr) @ The advantage of having grids in cell form is that when a large part of the grid contains missing values, these cells are not stored. In addition, no ordering of grid cells is required. For plotting by a grid with \code{levelplot}, this form is required and \code{spplot} (for grids a front-end to \code{levelplot}) will convert grids that are not in this form. In contrast, \code{image} requires a slightly altered version of the the full grid form. A disadvantage of the cell form is that the coordinates for each point have to be stored, which may be prohibitive for large grids. Grids in cell form do have an index to allow for fast transformation to the full grid form. Besides \code{print}, \code{summary}, \code{plot}, objects of class \code{SpatialGridDataFrame} have methods for \begin{itemize} \item \verb|[| select rows (points) and/or columns (variables) \item \verb|[[| extract a column from the attribute table \item \verb|[[<-| assign or replace a column in the attribute table \item \code{coordinates} retrieve the coordinates of grid cells \item \code{as.matrix}, \code{as.array} retrieve the data as a matrix or array. The first index (rows) is the x-column, the second index (columns) the y-coordinate, different attributes the third index. Row index 1 is the smallest x-coordinate; column index 1 is the larges y-coordinate (top-to-bottom). \item \code{as} coercion methods for \code{data.frame}, \code{SpatialPointsDataFrame} \item\code{image} plot an image of the grid \end{itemize} Finally, \code{spplot}, a front-end to \code{levelplot} allows the plotting of a single grid plot or a lattice of grid plots. \subsection{Row and column selection of a region} Rows/columns selection can be done when gridded data is in the full grid form (as \code{SpatialGridDataFrame}). In this form also rows and/or columns can be de-selected (in which case a warning is issued): <<>>= fullgrid(grd.attr) = FALSE grd.attr[1:5, "z1"] fullgrid(grd.attr) = TRUE grd.attr[1:2,-2, c("z2","z1")] @ \section{Lines} \subsection{Building line objects from scratch} In many instances, line coordinates will be retrieved from external sources. The following example shows how to build an object of class \code{SpatialLines} from scratch. Note that the \code{Lines} objects have to be given character ID values, and that these values must be unique for \code{Lines} objects combined in a \code{SpatialLines} object. % build line objects <>= l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") Sl = SpatialLines(list(S1,S2)) summary(Sl) plot(Sl, col = c("red", "blue")) @ \subsection{Building line objects with attributes} The class \code{SpatialLinesDataFrame} is designed for holding lines data that have an attribute table (data.frame) attached to it: <<>>= df = data.frame(z = c(1,2), row.names=sapply(slot(Sl, "lines"), function(x) slot(x, "ID"))) Sldf = SpatialLinesDataFrame(Sl, data = df) summary(Sldf) @ Not many useful methods for it are available yet. The \code{plot} method only plots the lines, ignoring attribute table values. Suggestions for useful methods are welcome. \section{Polygons} \subsection{Building from scratch} The following example shows how a set of polygons are built from scratch. Note that \code{Sr4} has the opposite direction (anti-clockwise) as the other three (clockwise); it is meant to represent a hole in the \code{Sr3} polygon. The default value for the hole colour \code{pbg} is \code{"transparent}, which will not show, but which often does not matter, because another polygon fills the hole --- here it is set to \code{"white"}. Note that the \code{Polygons} objects have to be given character ID values, and that these values must be unique for \code{Polygons} objects combined in a \code{SpatialPolygons} object. <>= Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) plot(SpP, col = 1:3, pbg="white") # plot(SpP) @ \subsection{Polygons with attributes} Polygons with attributes, objects of class \code{SpatialPolygonsDataFrame}, are built from the \code{SpatialPolygons} object (topology) and the attributes (data.frame). The \code{row.names} of the attributes data frame are matched with the ID slots of the \code{SpatialPolygons} object, and the rows of the data frame will be re-ordered if necessary. <<>>= attr = data.frame(a=1:3, b=3:1, row.names=c("s3/4", "s2", "s1")) SrDf = SpatialPolygonsDataFrame(SpP, attr) as(SrDf, "data.frame") spplot(SrDf) @ <>= print(spplot(SrDf)) @ or, as another way to create the \code{SpatialPolygonsDataFrame} object: <<>>= SrDf = attr polygons(SrDf) = SpP @ \section{Importing and exporting data} Data import and export from external data sources and file formats is handled inthe \pkg{rgdal} package in the first instance, using the available OGR/GDAL drivers for vector and raster data. This keeps the range of drivers up to date, and secures code maintenance through working closely with the open source geospatial community. Mac OSX users unable or unwilling to install \pkg{rgdal} from source after installing its external dependencies will find some functions in the \pkg{maptools} package to import and export a limited range of formats. \section*{References} \begin{description} \item Chambers, J.M., 1998, Programming with data, a guide to the S language. Springer, New York. \end{description} \end{document} % vim:syntax=tex sp/inst/doc/intro_sp.pdf0000644000176200001440000073635313124453242014767 0ustar liggesusers%PDF-1.5 % 110 0 obj << /Length 1651 /Filter /FlateDecode >> stream xYw6 Qޫ֦]{]\[qږ')Ͳ (ҥ^m"A3Gϵg2JZNϠx9iHf |5 |h̰c>UўS5+ }08;NkLq3Aߏޟd^p +ɃQ _FV9–h\cno $Y1G4ILJAq\xJF ?*@Y%n(!XC.$=V3õNnhImT{ s$#ڞQkS *w2+!.`!&&AqI `69%UY[\~ 0so`S\q%^ uĻ 4k[PxGwl#݇\EUz% Wxt1i+\{㊯P<\ -`!mKXvBPuF;3ja(%qdWaC@r# ;zk  eێjM0I]\]<±Ц{ƽhZ:L@OSbM0}=H0x^M4rF9& 1ryWW}WxkAn5wƚXSźZF՚rjAՖ%M/&ܴy&W2+hk:-z.e_~:6.zu֬27ވP^F4 'uy5 ITuIs oUu MCp8OR.YO0_A-K`8Bfw!MP)@"-W[L=J$ P4[y=KLRAx4;M45E@螩 7+|,z2So b&ݳ*J»Q s]X2ܺ&328@5E𢲸~|X j"Ybzҝ1$U/I~$C(*qdRk;Ϥs;ͦ˃˗LpU% ]М`'ڵbG⋓#fgꖊrA'b3-Ct%]/e1.6EQX-ȳh iV!n::ݔI/%!JR NdGu~™e,̓D41al$Hz#5.qcH0wfB\9"&+$V9:J67t؁{?A"Ğ endstream endobj 132 0 obj << /Length 2906 /Filter /FlateDecode >> stream xڥYKWHVkplDI%Q!)O&>jь0#UϯI7jD>⇻ͻJUf&wVYeiMm9.VҤ/jm]鸃9= W Zqp4 jzѕvʺђhm*x(ZkUKn|kZѪH ^lli>`J؉<_I[s\^/4} )sZC =fz{(L|BV́VX[a۵?rЍY0y21tD sRf2֩4"*S;sz12UJ"*ө]Hrpƫ@Rx۸wWG]r rUu|+SДz+ ( CvBjhYT2ZIZ"NǞP;G0J@3z;7O@)y[x7≯$Wz"*mxAnt YUay05IX4;'^)IOQGA%hKq?IDgIdNxT_b]j^O ,Hȫ~%?z5"ϙQ5N[?|dptS#/hWz܏+ڔ l pbXh$kb2] ٶޏtuKY'ioWOzC.'j+(dw/Id1.vU[Q>]Tu-VN,x"[7Gef%Z/^k KqO똲e!Tc"חBKd{?3k$^KA."B}\r-*ŹfDC{Z0 ~@>?pR .reuA?P4N6^!1)ZgʌA8=jMbhL"{Yr+/5Dz0!>:p?;2˾:=1W&;(Nmx+j~&2Khѷ65 K5Ẕmp"h8LI32EM׃gJǼ3?8Ӿ`C1  6+N}Z4!R9K ݺ_8$ 5.Le@MrP 4 =0$Nmړ33~a4&KW1ܔU݋]DUh݀sKp=A5KNX ( pa >9vT++ey2y Va {dS=H@D; SE6V }wA>MˁSNJD ']cZǸ! AOQz佼n@?D}[$WIeIo6t73=YO 2Jb~Cv:-_7eJHZ }f=hqF\QBlL<~EN uQynóhuԚn#!2 xiT !08FA V 27G0:ՍNObң3lf!uX)'E$K|, -7%"THvruxw0Nq)fU`%sa'2S:ϗ1,cѪorG f,e+iy$ ѩD " LfdZow: r T9;^,42fUعĿtB-T8 vs(!ܫm,/q?̠Oo%xY|S>u9GmabGz\9Mӛc@vRK]dr F>hrR@ nD,Y BkZ||욡r `&L ʻNVn ݅3okYjand+}LOhu>_Pe"-yd?}XуAJ Wa]E-\V w7NTYC6#yh2wH-f(ԏ +^6-C &+n#Esh;L&-cfaέ.$UR|Tlj,DN9*5 GZA_2o(Sׁέ> stream xZK7+|,iy$9$خTR ̲kק<`ufe0 dz jUd"u\*Db 6H\Mp:T(»NOv8qG*Ku8市 F`aT)᳀aV$b; hM[cj@2P[$8ތ &;La@(KZ "Xvy>ټ ŠwHB==Lq4,ŞꎥN)/"# (DyB&# 3a^uZ)lfPEgdE:S%PjV҅Ox.ѹ'~=g G 4V{W({Ꭹ.#Y7ʎc7UQ術D=R#0__jݫ]=%lj/RH$p ٟVq[> c1q҄79*քpd D|-Sд1!+\SAiN+y3H{yR r{ ݇s0MKպkJ?m̷ ~bNo+BPBYX#(;m#DTmfLrKp~cHj %`:Ճ5)xE4Cia.T)|NJ9X7Y֎j\[p| ɱ&s^00.ݷwj۵-Jǥ>AW9X$07}i%:K}v@0yts_Q`D% HcT! (6j`K_Sph.3CՄ[>ػ]%gYTA:Uؗq# +ݛ@$sQ;d϶'&cpRdDV{ܪF5u;h~c\p7&Cj]lm˿šqqt_/BUyBLX'TkyU+ 99yiB*; 8~|jOILQQ9MynZʡXJÑlL)_oZ]OC] Bیnw(N{˫W endstream endobj 149 0 obj << /Length 2398 /Filter /FlateDecode >> stream xYKD﯈8%b~  !$;I<,IbgwS]Un'L9ppҶU9&W{UDj-Jrpk0몜nU1]°W ?l>tS߻_~p/fBnIFy][WT~\#\[j<>ֹFJxτYw8̞ͅT K=$+u[&ȁhv|-Ȱlľq-uVSl#n67ڒI~S_J6RUO N'?3:iBBhS;nwRhnѓ.UsГ1DQB,fI*SU&*U+W(6_".p 3hܽq܂/ڑو^,%2zf[5 % mN=HI9=%d+`H] N譂`ɈYk% MWæ wHp *4x=*͉K[o"]RZHmco(-F׶"l< s| 2 +-R }pk?4ބe#%T܆ BNP`weoY5e)뻔2y@OpJu=A O( 3:ZP0ذ 6o`-0ғ] >qB0L5Ri!DL# X &ʑZdxNVʍ8a0=ϣ3 )^A.A:v"]wUB%e 4[_џw x=,Hdiw0 {wM H⑩[;\?N%\b?NP{-*ic͕B? @Gqc5В0P 54Xoq5Z#4vON=[0]5- >E {OQ4`-+e}p`Z8+G7mCyqp3f/:7C p@ܨA(n1*w!= #qa$MkE; w/R/!FbsC$2AӜ6(qk i[Лm7^H6Sq&UJ[}P[F =!m%x3\6q>f\%cr(Yq\ r~|#搪{2(SHCbK̸cOM֊<smX`]*3ɱi;N4K?x< fwL8:#nq|.*JPIy"v \g6ʙCT[+/u]&އ !/@NeW2 ީ6(ww#qmB~ 筹o{ՆtKjܡp.00{cޙ9oYS؎\-7| ZBڛR7Ǭ XoCϷ#1ceEkKvvj"C_GYZқ~97ϻf .,ř鞅,$Ximg[K%b|ҩ$4i0CQV nsnNZ7>G'P&y<.l\RQ`-*%hTЈnu`ި!wUs0K]f-J&d#[Re;cO!?< cTh´oVQG*Ҧ04.2u--ȉ|[)Ȉ)G_;5T/_р/aN<%T Y%)Da r ]ƌb_X{^ԯ-#֨>DjA,TNZ_x$gXpY3_^߸IP3grU/տ, endstream endobj 157 0 obj << /Length 961 /Filter /FlateDecode >> stream xVK0WDRx $@Jv9dѦJwOҤI7n\{g`Dlr61A&XK'A f2r3Tc ~~fu&lSm2:C΄Rxo9xPv9/A+XgΙ`R dEJ$Կ̢|_\:N1{8+H͂O8ᇶƿf۸~ٙ=xmЩ:h .%yz_Ę| uޑ̞|%c hCF1>ʪ~⦷9R{>sJ\W9ԛ{&i5MVwφ#t"̯93˾F LAxe"M9\g'Nc endstream endobj 162 0 obj << /Length 283 /Filter /FlateDecode >> stream xڅN <@VoFk7nj\nPVca?A$\OFJ@@ (ˡٓ7"&۩5RauGɽ~싊 QXeLX@eRPm icw|k˸֚Y^|c[nW 3B{?d1넹 T{M!. 7}npp`\Y6iPϧ_|Jp&?b>%^75E1A(aPm UE>3z endstream endobj 154 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/intro_sp-005.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 164 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << >> /ExtGState << >>/ColorSpace << /sRGB 165 0 R >>>> /Length 347 /Filter /FlateDecode >> stream xURN1 #-W !t\AA>v Wlٝ{FKp oՎ:p1@3 ֱ߯y:[WmO֨p'|4vB DŽ.NM"'Ab⎤/S$1`A2{)*wrrxL b(R8e;8jC^,s\2wrC,Gr LjhZIӆwrPf,GrPܬbn_Ym߃9#mjg5'@zy=usԤh⌔fU8dP67|/cH' endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 791 /Length 2130 /Filter /FlateDecode >> stream xڽYMo8W9 EYl#f6Am+wɐM+Ir>DH>*h-p(u"V"EavI tc8" '(Axa[F1j7`op*, g0+|K›4"(|g&Bķ("z-#O"bh5(-0O"5X(=jH+$DpA7zH'iF!?^#đj% T (`m`"u0H[IՊ#~NpPϟlJ&Ь5%,*5R,6? k:.$fB#Ƚc44:.h5"ơ 4pIY@c#GJTqX“c2T  m L/3O4|0#$!!iMKjh`p^ .EZD|XfZR_~}\6u5YUN|7|&&y,_,L鷼Η3,Ţh=yG&/'y=EsSMz=|]ןWr]!ꊻ)X6"ozmCi}GuTOHp+u}U]݊W;PVgbJ.MUc|#U͍gy]>0fOYu'Tb\͖XNCTW"uqu;nLˁ5>. 8Cwd.uތoơm@awU{3w0[c+{F Jt\rQٗeU/4GYX}[1{q:&$a}lwTɳƶ?VNP'L'l'\'|':Щ%up%r(;_~k6I<0qe &nA{T1&|H[1wKFa,G+ddRi]{cJd0=15g:ʀ,߄["i|*!F^IH=K8#Xal|>1X[@⸧+4D%na E a,,Xn1.R7 8"K2Z?e(bB|z$%d6l@~PDSGUҹ4$_˨_@pX%'?:Gn;.( 1alT*td05<ߢG>HzlviU=su]śG㞢nhX3}a ߮. RKhľ^7IsH)|Fݜ}yQ՜kq<;6^YZ[jP_zP6} B} C^J4|A\{g$Z%b U2\>jDaLUU5زמ$9)cC^4D7@B~-Rv쨥 ;u>4|s/eӼAVu6ƒNN!`987x`H@ '/6ᒎqd8N aO R0+ŬMU?JR@V*˛YVmQ"(<^47#[$f ܡT6;X ^W VOdkqw t *T4eRyJL(>tbZ4y@֢N$XE&ȬbOĪ7k7bŜYu{ۡ LJ)h뒦 WMuL|t\6es.j55!䠟W> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 170 0 obj << /Length 894 /Filter /FlateDecode >> stream xWKo0 W=%جav ثv5'NkR䁵(ʖmHY||GR<NLE+h4a:t1hTE׃,`-IKXÛ(幌b!X| TWK*[,Jx[/.a0!02)UJUx?E4b'O9{S{ڻ&7֮<ÐIBp}vE&E[hN`xK1 J4QL4LzuޥJ[ H5A i-5լ5ʃB3~%f\{4Ǯ(?Zڰ ?iMʑ?rka`&=`"W{*9(X4>pN`PY=d4Aٖ0>V >vjjs9t8~bioҴg _;BR5S{Usp5]oja]to> stream xڵWMO0+"۱ RZ ڪ{DUvP8sb;e(3of&[eY}ܪp};"kVq2&DU)K.d6_duf,/uW>+$zv8lOwՃ|4|DE4{MInX;4r>ݚʭnU܆s3v ayVߙrcؙ{]͑[ce쫱->X]w]ة2x].v%d!xU6 G7E"(qjcLj?ح]j&ROz(?TTݭ(Rp)icbV@ZbZDץ,{,Na4x%jT0`(X5͋6HT,f͍zr6KxLU+&8Z#M`4TC=CH:E ټ"]CHh&X_cc?!u'V,j'P#Alǻ;6%ʗ#oݴٖD;'[";K%q? B^.7ol5:v羣.'.$OBW| M8DbaHbJY8(B\R{A%t`vO<Аjj~GlPT91H 7#?}"sD`@Dkx*ǀo߲.Lo&z !{:hn2̰:!5TyZϱRȒsFUs| \l~ n:A;g0^ #)TL?^zyY[mn6UՖBɬEو[(t0zO* endstream endobj 179 0 obj << /Length 1311 /Filter /FlateDecode >> stream xڵXK6 ĬHJ"R4)ZP{KsPd9vk ]w83ԓ8@4973s^EFS@ƹu&F(׫CX.dX3V@[T5L Z.ҸT׿p$TST$L u]N]凔bʣ@+PS9z`Ug>_'C;}RR+xt<鼂؟| _(0I ) $:R`&(ҽ/FB4!K<{mw$[ϼ:"K_!b!yI\?ё]gJ7N nMCc 3OS=nN] [s բ x>k|O[ {D(ϸ~h=xQL3PgEɔIK짗Hr}AlFj䤍=st|,F0,d$aadcΓX>EmNUB,ctI涭~5,feBzd[pJLB[AkXORaL .x]6 r(k7bbySEÅxmJr4kە4ʅλ(}QjaB:eZkt'S? \qkvps-ï7$PeP?Wndgpw GL6yS7*~5yIKD8a環,PEn.˯(+b:r3H2ay_5EqAI$ډWnYy}lwҾ6-zP.KZl9ʝÏkB V!pS^"kY]_(⁁ endstream endobj 183 0 obj << /Length 1180 /Filter /FlateDecode >> stream xXKoFW>QhrIЃ#RRKt%so\RخC9Ng;4jcWKTjcTPpD3SSR<+8\cex ?~wCU)zɱB oyC1yxG*Äp4sX3핎dFy,~eO."-Oti,_O%v]"ZK3= i$]00Lh=9AF'G<@B*cp]unR}?u뢳{Jj`+'jN( ^B<]/jqԺo;7ʱqMu7DnPdhѺu--)nV;f,0ߘ+o`.^ὺq)[AսV'NW.kk3LjNt,DΫޯ>\[;Q w@tf{4$)m#'څ^ZHυ@:;Ob':NCiηO7 !ltXDP\錛>[7 ӄ"粇NeaDW#ÚMtû uWp贯 h;NFY}8´~+\%ra?yEOIuTSXMAC]ŗd{N^P7}V3-.o:؊FgƵ^3Ч7n}3_x2-MV=}˃jAâRV8f`c4ԡ9b&nA\ hZo{)/.=ǐgg5)L":vy/> stream xnF |kYH6mH !A %;DC_7 =0p}&$MRn|ՏN*Q*OƋDRTeY!Β ߏuS8t.2D2Zg\^S4h):7(+(su)ߝW '.#";g"ol1싘sL4Z.A#Ê8Mpl\Qp FgTkv)e=33jM rq&Q8RAxP;~27"޽EFZR0U LK?rgnP#R$pX{*dSz coɾӛR Y) ;ldlzg"V}oc#A jO{qQ aYP,ǟrU3`\fvMnwf<}7l}Mݢ{E&^vG-u=2P<ڗSi+ruw%A4.~wC4} i6b%cTe/;kWZ>yظM&e~7م7Y+y%:ѬXEFi +j/uX4v^zsB׊Qfzh^H^m\\krYCq}=R?[([ w7/iR ?707B*3xrMܨvŸyLIVIۧ(Wy<8 *xkj. #!fDkÍYw=bqN')Y54{/ ˟Y",T/'eQFރ2RAJE>㫿gT endstream endobj 195 0 obj << /Length 364 /Filter /FlateDecode >> stream xڅRMO0 WJk'MrDcN z&PGƶ tbhx~#` 3qF#TU V-,6Gƍ2 kphl$L\vO_r ^6xZAk# 4+@5rxd+ɺѹ ,yQjd[2$톹U܎V `Z+>mFrسs硢=$Aמ.7Uz V\ y^蒽-)zaF}#>[`eDkRW“DW6SBG2Ҟ+3BZ}Rm,$s^/u]MXdY~@!nUbu@Qju< joo endstream endobj 187 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/intro_sp-014.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 197 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 198 0 R/F2 199 0 R/F3 200 0 R>> /ExtGState << >>/ColorSpace << /sRGB 201 0 R >>>> /Length 799 /Filter /FlateDecode >> stream xWMo1H3ǵE4SChHzR ,!6~l {{XwO\Βּ|>=tW믆 ֒gΒY7gYwd8N-<~1GxZM}d7+Y~i, ^b)_>$ #MFb@>Ubq([J \A H }X,3H Y X=Yञ|j{\@qRh?bODtg`x$0A䀃@D\oQ? ~\sq鿷ݿfdyOT|Q~/SD: -!툝 4Mc[Jm"7Uԋ(R ,Dݚ p8U].[V"k+$J1|'01O2䀅Sp4:${uV~ڭpE?sg@]":IowEǩEaM(.t_B -@4u#MbH1UH V> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 206 0 obj << /Length 858 /Filter /FlateDecode >> stream xWKo0 Wj#:`+b;l[C8ibwKG-jݥ;~'%V^]8=9LBo"&ғa(8(*» $ԣqBᒆfu 2Pp 7\ب^lym1~RI;_%H fP[[z3x q ?Kw 7 `(@"ᶁp{ͪWZlsp~Qܑ ,I޽GV;zoׯ==H[V%"M K0qB*@fZ 5EhdV7a*% gl5&EmƇlo*j͝vwq&j4L9*u#]WK@T !*Lܸ%6l^!E˳ a9Olo#&-@uۀD'N)>9X]<_4Os!;3-Fy ZZh݇nKT|c, '\Zy޿<g]G}xboJ^q ;t$tм=/vz9 endstream endobj 211 0 obj << /Length 1209 /Filter /FlateDecode >> stream xXKo6W֊DI @E])́GKeo;ʔC{ 8T4YgϳdTh: )L#fa,Ѵ]ߎ'i,Xkh _Q@$- |M/i^^rXW$]?a[h+nE48tcJŲkhCk;nɨ:~=Zn!n5(L1&>QFlz,E=ш!K.?{:iXIA;c rAA9,fH|bvcs$yV,ꆛ7ԚuGnIM]1$}G'/ l:ID!\c ħ{&o~:|ߵI  n5n]Px]68h|٦ %EDQx7Z|o;ڎ(Q٘5|F7db8UFLofp<ǁH⯺4`ַ/]5s!clDt&qFAg$f tێaXJ#ꃀYjEÚ5h 3 e~hRTP;1lf ❶VY67D>zC4 yk""Tt}&n؁L6|f*r- Y x*Q9֣>:PIIIBw5+I$0$3Ҫ; )`94[J8^^aDi5kj )֓bDmgaSr ꈓbFmMÚߒǸvCiٗaDӞh7y TqDE}maXkݒ.h<+k)+@G.$ HKaeEe!tqLs!ƪe󂌪rs뽫f:gxhPRZGՒ#SaA8n2ߩFZwxLWZ`EQ'b4YL=cnEo}~\v0Xs /bH &T'^ *rF_q_>CּS)ÓK{ε/ywcW'Fjm C"̴ M%h{۰x<PxO<]y*ÚA(PL"ɀ_ n endstream endobj 215 0 obj << /Length 1416 /Filter /FlateDecode >> stream xXo6_aIjF$%Q* aS&ecIN}Ql%i,-;w''jL޽HٹR'D[\^L)cl>&fF5L<k[{-?~SZ2H̙ Bpt ^ ՕZ ौV XL+`{I¤8yKEHTNg330c*K*IXIsZ9C/T Fp(i~ *UGn\QpagE/<Ղ~N0j[SLgOSJ8ׂyI0-pcEpÎWg_m8 I"R-ߖ"QebN) 62h9eqTC ^a8I颜6~)nbL A@PlF\ ѢM ]&ڐ*.sх\ ?!ePVUuhW)1g^Dc3wAwP bƹhIv`JB̓]9r3 bxWF|e|_ i:DzA-PEWMe9s8}K}٠1B {>es:0Z,!9SBS"B>E/N暾%塼bT i/r#Y0Sc 3G#H޷aV[iJs=rb?hp}I8^Xou<.#Eb8CF!Ics`}c elWWgMbNrʢBit`Ƅn>-F( !PkY endstream endobj 219 0 obj << /Length 2128 /Filter /FlateDecode >> stream xڽYYo~_1$6`#"޼~f81f8Z]W7 ÈfwUu_Uz>jV0v5֪f/~vtoWsWج9,~ "Wum`'wߙwW+æa ןXvʔ@Ygs+y癸^ʩUOgy^\"fo,|LEOg^ T+3kj/&#lb2xwrWZ/;Zq^f<0US)u~JYEgE{5[81ބ X48(OPe&HGىlm?ęn*&RU] Ux\]M-i/Wp>mمc-$ݢ& B8fnpT!AڧE&YX*Q̴6A `=HU= )D3m ^v k`B:4ǓSJ Q呟CL#{ 2i~є6#'1<8 Z ~!ci{JV8EH\gP?߷!mSLr7Mta nu{:'†4R()&WU .#8woY"4襥ޑAtUu1VqDXH&heu^* m"3i,q*/VmbG ~ {cLuht>3P /'1Sw!= k2(:qUC{Maq<0N ̙3J~&6p)GTҰÊIV!a9qw=!u8|Շߩ N4(WcJIY$'}J=!" LREyuYz6fK yWX@Qh!vr4Z+}ybQቄ @gˆ5Op EqXl-ۍkާ)3B]aB DLLWKc$ !|nT&dYG~-< ,d7#1{o_.h ƶ#F'h*$1? 1^ "9kPWOA cv"o'MiRL2:Lhm#ܠr uY(}3- /KSi4geR>.oұQ2>&b)Ɗ1{lTrGB2W|UQo9}qh:,_oGic(S汑/:*hΰ̹q14 2 <Ӿ2C-aμhoO߄AS(0c ݮa л؁LG]+#u ]N=C)$pY'Ea_ zI071744Kf1,c󗎼lQ0}41`H!.qjt@:DN]"Y~u;NIN62OF^h,Y/^qpI'cd0 mqWp*V&!D’Luߺ$Z˫0%97ũxfqp\J58z(526FKr(/Vb9hApG~ӵp{i+zt(bC7k{c{zd?|K*1iD~S.'2DY>/|_'KJNDM_M`W/w(zu~OrBaݳdO YmMYZ\n*?a MꠓP\ɯsޔL%*B~!UX;H,ɳS]7/Yr;%/%M BdJsRP`FKhM7c$(_UNhbwf[ endstream endobj 223 0 obj << /Length 1113 /Filter /FlateDecode >> stream xWY6~_!"V$EJ Ms E6̓V+$3]^.NBʼnP,TJf'`1߁q˴ZmrV?ճjXѿyNRt95tkXo7L3{sbz|cOPqƆH-*< Fa$!6(U(jc309!Y{L-ǢNQM#2-XBnLȴ0 65:ؗd}!WZ+H&Q yJgl{4ghKռWW5w+-S^O)>Z!5_FE->bfO7B0D'qojk~+^j ˳ f)')!꫹]u>hJn{,S%k1U_w~Tkc,wԒ@~A`aE8!b D'Y@8~i'Uxׄ=pF:0͡)_l|y~1k1 tk>rjU-4G/''^Tܩ i2uV(8K!|hwyFbl2ncɨ q,Q8H6VgRg؋ a:rMΉR 7cLSY$ߘ?,hFL*𼘞} endstream endobj 228 0 obj << /Length 674 /Filter /FlateDecode >> stream xڵVn0 }WyrXŒa0$o]rZ$uCn8lytHKE}?LU \H&d(89"Ì 4Yxߧ龟0e4}!LOڬ"Y?U` /̓|GfV32ʸ^]+HeBXe*\@ ru0/5Y 0v M;918oA:OLLSLD cly^(`)&0ץF0,3'Da7*0;r3̞'oySTq9\ۥ~FGع/;Q/%@8yw[Gf; BqY1iߘ]e^z rҳ0qeZ:v[}|VdcEq؁W!Zknro7IUj.WU#LVv JVPӔlꨄ4 #gpY}LA# r)VU vFH=jvkp,jRЯ־ Q,5bu'ٸѧID$AyQZ`&8oK.E=> /ExtGState << >>/ColorSpace << /sRGB 231 0 R >>>> /Length 174 /Filter /FlateDecode >> stream xMjA {=0=0׭乏zp[aƊtZ[{yr.6 endstream endobj 232 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 235 0 obj << /Length 1914 /Filter /FlateDecode >> stream xڵrGPIBα)RHB<Jئk1$~wg`˃@OGjf2ڸf9-'S ׻'n\\L|v%]!W<`xI]9~8ыd42:Q6  gxpV RlXΪ(LHoaLCƈwDYg X@6e%$ Lą%1=Qy{Fk˘+c'U l| 9va `D82Ѱ єyXQ m !/p*Xl:LCc+Mk)ZL{ƿgCruZ)aM>$M3O䛉]nJY*YY~+rؙLNyc < Ԭڅ kHH'n3Rqh~JSl;DU_n7#;yG៭FgfB;M ,QAPЎtB%b* kWJD41 IX+F"/Eg I6} ßui8I3J&G:B0I=0DYua^nƴ{`UFK. Օ)sj;OID[9=ƣLfScv0 1ZA̤^XD#Tc783N- Z \: _PSf\ 8[ooQ80.qҦo.[E'qʤvpH:LjD&cUWȔ&VQ51°6%Z+׬ӎsuXn_)dǍϼNZIrlU&ฒ kGcqHTpAΐhAu}SAZ;k8KNdTz9պRwSW֝B^ﲢ@+cދJl6cK<)0{)bA:EOg|F6u^Z8Baw8l uW̺žm* B<$A!U:'L8V0)tHRiqcxr2QG2 M}{D?c,B+e{/ɽ)P'nt`}WG1ki~&U. ^"GwO\w%'If 'j?^ 86 ;$!Uk8gx1Q-le(izo&*2Q`_k/qOJdhIuOeVa=?D߇Cy&kaà7,exBʰSFҺc_gWOu=Iq=oIu+/=#e-6.{xS/0XE␮ق@ endstream endobj 242 0 obj << /Length 919 /Filter /FlateDecode >> stream xڵWKo0 WjE[t!Н:,mvH,vߏX6@[$>~$%8_fU9˵lX@')* fWy%R?"CI+ HJhhOni@ڿyiDu#vv .q;`y2 P@ sxQƙwnZ @4ޠ[d/S=g2};.T[]4&%|vG.mVll$ıjTL&q؎VFmLٌ$0R\2t\-Ca}r5,Ja Em1QE}xBKqe2?V6X'voWt0ˠPyN j z6DqmO<К壉InYʎ_p.Wv[.c-j.1b7I)k*R sdDEii>i:fx+)x!)vʡ^l}dr![(Dq#yƤHCR2]+ 4b9Ha&ۗcSu .;}*b7k#'K;b'\нWؔsn'NLpDp(\`F; K$>3z@5ASrI:#(bSyfMIaaPE endstream endobj 238 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/intro_sp-023.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 244 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << >> /ExtGState << >>/ColorSpace << /sRGB 245 0 R >>>> /Length 209 /Filter /FlateDecode >> stream xmP @ + bӽAԃXA{݂z]fLF1ĝV#&|pl.%3Ѩ^&8$,"c[n7e'H1ϧ$mSWTdpq%5p6fI_X"Gkp~_N^֍FU,rVn_EaZwߥe>,,R~b endstream endobj 246 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 249 0 obj << /Length 1202 /Filter /FlateDecode >> stream xڍV[o6~УԌDZ`e Z[úŢ/YruIl0hQG|; U(7wYHumv^dKLix>X'}GƗ0 qƎQ*syQ,ҞI 6V*5iӊٔ>}"x$e~\ϔR`<.gtqu`m/caO,ztȂm[Taa>Y 5 J GoRPtqF/}|'!4̝r[TV$[j~aL`| t ΌBj+)؍aJ c:)&@IJ7w\Q}Oq#Wj(- ʺK+Ҟ}ŷWt t)I-&LgіAԕeIS r2ܜBB9w8q~Vdαގ]I?*8%?yyjY]T94Y0 }H[ G&9m@N|wuߋS%H-$V=pQIEIv:'haT Fْ 8<͉h,𥃳 ]z~cD$TVڬrp-Dx)]#N֝];V>sp՞hʲ8yp #a'-xJw〶D:I ָCW/k cqX;Grم5 K,[ }F+_QE.klMiBle݄변F̤.!n: Nt,X4r[.@ o_Gij#$n:Z,[ҌL endstream endobj 239 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpVgOZBN/Rbuild5a1c476169ea/sp/vignettes/intro_sp-025.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 252 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 253 0 R>> /ExtGState << >>/ColorSpace << /sRGB 254 0 R >>>> /Length 745 /Filter /FlateDecode >> stream xŖM1 9+@Z $h% Z$g&d]Zġc;_OQ^KD.k$Ƿy( W;x7< =->J~( 0wDO^6) RN{>~ - 94)ë}~-8Sbeex|V*m̴v2;G?@:})Uŧć+>zƶFHVڈ/+撖gʒ;1R &Ay)w]IY^v1M)z4 B됾FX}Mz2^k=lg~qf+r/r/Db_UZ2}%z׆IoW.T{B:䠟BZ$g3X;e"0bD NAjHT B4r=d<ӂYTP@Ԃ늡' \f!Bu3) eQ-2kN%wNWkmȆt&ՙq Bׅ%o(+օG Bv b\BrC| p)( hg_,_D'Osǟ]kJH9 endstream endobj 256 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 260 0 obj << /Length 149 /Filter /FlateDecode >> stream x3135R0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.sud endstream endobj 271 0 obj << /Length 135 /Filter /FlateDecode >> stream x3631Q0P0U0R02S02VH1*22PA#CDr.'~PKW4K)YwQ6T0tQ`H``(`   ~$~K  dE@Yb..WO@.gC' endstream endobj 272 0 obj << /Length 118 /Filter /FlateDecode >> stream x3232T0P0Q54T02U06SH1*22PAsTr.'~PKW4K)YKE!hT,C(j  P); endstream endobj 167 0 obj << /Type /ObjStm /N 100 /First 867 /Length 2547 /Filter /FlateDecode >> stream xZێ7}W1nx_<3;`H6yhK=h$.ْZmIlkbbuX,R(1B9)B߀W|Z M 4a kZ8)݋XAj#x.*@   IUay,*HAF  RhiAў)3 diY^N8 *Ѳ0`BFT< k1p2z,AiT p,PCL6Y<4D @7ria.9 6x,j)ĄD XL҆ tCL!4(ƚxA rN'l%LKXV Xɐ"z-Y d!kP LP\r< W OQqLA%F1 pJ8TJ*mLs:$؜\dQNCzkҨ0~0A2`م<ܗW*(ŋAy-n'kQ_TxQ6Yw:CA Pt/^)Sa q|?{=|gl:|S/ĭ(BſC=(0U=Y̱4Ϡ|]ϧٰؐHգ~>f#`Չv/Bt@Ca8AdP(^ 7@'P-OV-T zONU-Ѫuҳ ,= md2t\ZvL"m&lTϒhyW~S*nUjbnT?iR||B u{z#ʯoPq<,guA HGp hߏ+$vD!J~'Y]-Z ґWFE7=YZ|=>osraHJzƽ0h2b[;FRLTPuBpLU2+z[hՠd8A\J;r:{[!#P:sFdOdld"+r.+.q}S|ޔ귺E]px??f;-"s㼿%e,H_XvxspB[OpTP% A](ye/HTP8Sasup<?pB@V`eapC>.ĠC!\7"6*~{1+ ߾})=(g%}v4m2?2xYwPyU]GDC} : I3_Qu ~mhn#O9nmweXhz% }e ܜX95+3,J0L㉕7Ws_Ț'pTY4ҷL]韨Lڷo,`6͆+er=w8 endstream endobj 279 0 obj << /Length 150 /Filter /FlateDecode >> stream x3632W0P0Q0R06CB.#3%X"9ɓK?\ȌK(ʥPRTʥ`ȥm` *og`?: A u } )v endstream endobj 280 0 obj << /Length 119 /Filter /FlateDecode >> stream x3636U0P0Q54Q0P01WH1*22(Bs<=\ %E\N @BA,C dXlt5# 'W v)1 endstream endobj 288 0 obj << /Length1 1511 /Length2 7641 /Length3 0 /Length 8640 /Filter /FlateDecode >> stream xڍT6 "]C7̀twt0 00C HHJtI H7!% -zνk}ߚfg5̺ H;* %Jڊ  a(8o1>1DH@ Fɔ;;m$ QI$%e(am&gWByPwiupA 1?W F(']F0@B`PvB$}||HGYn> ЇzB= ]u&0ty%7@:|P@w^{.9@@ _|g o߁`?`F Q}$E߆`' vw*TnsCy x[n*{%+]2 _7@ 0&0w/&w"(/IwxC?7]nH7]@ k2ck&.qR.z*έp0o5D65]\$鏬5O S~*RɀGo(#=8E8n!5f#&~"~5gkR6^`πsߗdt~-f/~vpwoO yҰјS3`WHӤ//]N M˘.GXLvr|H2?\!&tq`lnu{רWBUa#i긹aprɜt^<4:T?J2\Gٖk[ sryn !۠900mw[,0X=ADԓI\[W女D +K͗]#{?{S?#> vi5З[&HDx3[:4n=$j(s=_q5,<q{\@,8uB8w@xsK:y'CnBY^SpB*y}%-`u5Q=T)fT|C:Y7Bg?dZ54O8C?4%5wyZM=dP&K;Rv0`H-S=yA#z~91͊Y5x'ȏEqL\3K2c k`ǩ\t:͕oa&;I"&69c&s^ I]O2XCy]|^NWURVQ[Ou:@vW=l33KAݸm.zl3D+AU?R V&}Sx9<.CUtE.^ju4j\:?/Ѻn68{UD^֟rr?C_q>v"Z?[4!3YHk>"zq@*_Qg}r}e%GS}V^:LNS]k$!3@#XuŮgi\oj  NXn=W"Ӝ\o~֟=Z a3Y30B,e"Y)_ icMkmΣ Fe?&{bx&gYHM܍c|f,0OYNUW;^", b䗫'դڱݺU㒎x ;rGd|I4=*5pq3v,6aė ȉ d=JcJO!: Iy泹DJȁp;Zv׍‡CO}h57O5i/pnh)#4ƝZ4v~$$^LOmh>(+Uԅ[7mԓ%5Yks­y +Yld"_90bhqUBǯg\\qo%+Ԋ)[id4nhF3ODI0x7%cUn|5j,(` 2b~w_I4yxzh+ FE340w:c[Jn5 Rr;~JR8Z2 R ^ʞDvoH/],9fl[H" ʹ6ӱGĭ-~٬[ I;wTGzGN0ᢠf&%[mCZؘa1V9!ZG 6HBe~f(M[V䞥Kz!:O \ܙw.a_YԘNh":Y2}aR;%͚DD3i& vI~-q[$ ^qz0煭Yɒь='RR?x%¶l* ǑgzxTwqH!ru}}WCeCU} 9n Ѹ/>ǀǚ2QǾGp.s}'٨&-Ԃ6n-š`4{TC"g?>i`Vvω(׭"U(tJom=q /dUZOKGߵ9y\Qz6⪸~`]~';i`-^%_{#栈p p9RjmeIJP +f~ǞEu=!jrw]J#w nYVX`Hǯf1Sޠ'% y57>o]LcsnQ)݃#pyFNj59l$zfuDoR"K-~-V4TGl=nGJSIEa F;a~sz~t+rWUL1wGG۩.|Gus兗x`:\:'XRre>҄}>D.E7|2ga>|C9R)j3Bx=\TeKcVcɳW~\,M4>6PvMd䧙sfٺǰx[>{SuO*wtƥ#qY;[ 5g3NzQoiG͔7-<6 LTS?%c})(EjE=ܿ[|x4h_&E`,JًPtm,^rѭ+5mc4d wˉt&^D)J< ObPkc>~;onB)YfgNsOQͷc*t8H+&F)!(Cj|yL܅kәqi^3 UC(zmJLXK&\cL}f"/Nu0p?rs Ro9[˗InCZr9L_uT}Swm|ӧ6yãZ!Wpp%!C;z-^rt ;@L&5u{N&bjDtX;,y"M?^6-QQcI쯸y\h&fX@,q=J ]ia!\p1p@į1"kX$T`^h#ԁ~_qkڴ>^=:y2H^܍ڭӅXFyVw Vf&d6]#}LNf.l즏BA=2M;k-W &"ѻD)T#y\>g)(Ԯ9@S_YDFKv!aaz!iW ]A[Byzģ};$q;_DJBS?HN΁,)áQT8Y|&g1+,$XN%O ]MXjcAKp%ʰGrw@ ߕzp:k\`{ ;X}M\[Y9>Io7Իx0|e< NH*  |Xk/xZpig]ӂ|~=jzbnxm1-tV_C,T;hF!x C]xNGy>>%qnEc]ŸJJx/q[8L,Gωb҅G;v@E((ÍIM͕鋊}A4v|X[Y%̓BKD*{v33 h9-䶵T{QXrqȀozIrۏ.J^:rwy?4J?D'F06RlM@:7ϑѥj/_s3w:M*TnF.Ic%z^LuWۗ b:0X5Ì S!y>UR[у]B>c2/N5q9!a"߹f:NG :*Wkfmy!wޢErj>}qg.)dϚ a>q.LPL=;=Գ]1Dxv*I v/87 ;'4m⇮mbƱ{[Sk,I'KZg=~< C,P& IC؆!Qů]rW*v8ҴImvG u.p՞i^N7&#Á'?8Z+`ab-"sGoCs88 R)f{g53)=Ii8ߓ;MyOޔ^ VIX7h[[Pe):4+g RצvrABUn[!FbM*vl 3_0Tt  u(Vp-Xu7ʮCa(+݃~l_F~rsrT.23a%N!vW.~KtD|tD_򵙬b\8XB܆O9xKIO, R:om3^"TZ xv%%c"<!`(6'1|CaOhx Npj0>,5w#FZOQ*h7Yo\޸]=Bn(dXǭnsM G`_ga(ry%4F{M].cF@kB3=$)I59MG9[QsnĔ"q{jw>݉$ª\;ǤGU)b_tMh}P1#fcW>I".TsC*'EK+:z\byF^d`Tn=AVh0cE;a<}+$X$\tev?W<{^_f(>|_'uhs[Koy;@Vy}D639d *7:v]X@S>f 6XaݩI L(b/mަ3o눴$ì".rʇ=/kFm VE4O*6$$ށh>] vP?xX~Ȍ|wy\gFB^sbTI8_ӗ'jUϓ0I:l H75cIVCFCy .ur;˒B!Pz-f}-X{A+Zh[JFG31)di_Cߤ9?~)Va=ePfwcȩ endstream endobj 290 0 obj << /Length1 1888 /Length2 14280 /Length3 0 /Length 15451 /Filter /FlateDecode >> stream xڍP kp݂ 8r9jfj]ݻ{Pj0Y:ݙؘYJlVVfVVv**M=?r*mɑ_@3w#@`ggeɕ id Pb;9$]A6ysZxt9]Af%3w{F 3{?!hmݝYX<==ܘ\ w: h dҘ6 NVf@dtt{wp޳4*@ǿ2`3G fNf GkPVdvrg9Zahfo dofn'u3¿sp910mrprp:!O x7ߗkdr Kg-GPNow?2k;t,lXH S_g'g{@d0Z.Z0`}?6'?EUBWUOw2qqعXllܜQ5_rVN??=/c);O.@ϠrZ?]MQ_2SOdzo.8_S_+dourf hm6ܤA^@KU_\E9U@<-&6V{. }&TߗSJ9Z8Ye7lj~ @?x/`ǍXd8,r n?_>p v?=߻?bXQ?;7{y,gNkN1EM8G{A"ljѼon'f4O̶ ?v3s ʵV" 5ă wۗ315Q˻ki* MbBOP:Y>:\`z_n4 84JnyÆ{ƴ@E a ?sex~#ƧYt,j5!o4QYJM<-;Pā~\iJ\!}g i͌݊7V I}Sy^l( kv< DNWB&,咤F#ܽ:ᰫ௒-#ߚ$`˅HpZ%mȽt#6%{"O@y=kh`X^ "YWڝny>^,eHG-FH|4$d-!*ҧG>Bl[K6ң[r]楹-(6 nCwEo[o.X(+ȑ ,#ѽQbtLؗL%{ x18(BJ bF=謲ч(O ?OjBM-^8~ppfzbuT]e ^}y電-"LjҖOy1㞈u:8HpbC]Sf']\^(R,+zQ(e9|>ݿ8W9y%v̍a ^hZ}}ܦ-5Uaψ|-1f=@cn0J10bڋ#gp*~~Tp3eӰz/|+lE>c_s}K"[:g(,V~fƛN{JcO⃦͸f֖DxOH:nZrBWFOKYhJ~KIz(52A휖h; D8#OYWbWBBswC{#;ZZB doCmA +YJU -u_+1@1tcWUH[l7و ٰKeGVyg+?vޒ#a"[L\S>mMSXsR4uwuƎ&2M/yՂ F^nV |d򬉡Hx8@gR+:QূOUX9R:lHK Ne`+Qkt׆}s")԰[^N㕅}ɂ6">Ҏu95d-&Lk W.!9xDk]_ܑ%#]R\rAV+k7ˣ~bLtl؛kMw_ L'ـ9t!q7(|6z))&i#›*=#h?m: /mc.B첰lpFd [Ԃ7tOyTAcS*Ȑ@Ũ5 s41,ܻ3154^,9`_}4ٴՖoHTMais~0_s#lUَ-Gkk@T;gȡq+7R*-J6` 5θfs'#X Uq~H,ƛh=N gG7zס Y7FYE29Jl;"Bxg)}!~yG7̑jI2̬[q߳W_/vvN#yRO{й0Q8l4.vrbKN${-] åPd % ~q Xrmǒ$[V$XuF{$X7ǜwB:/{ډ!9^%p7F1EaWCNOG"`lAF HuK+ל|]墾o.rw3b6f/J#E8 yNyIT(K Ih7 - ٬bb͈:~c(FŶɛTjt2+K{n57B #v,2B*5j-R!>ONR4Q5S"^Qoo5sI9]|5(Y\G|eL+Dȍ}Ohڴv/zPL"CMђvu#;g䌩fDlKkj*YԤhh[lABH+pLB_6!Jݠzd"7vntx?y quC8R2 N,?=鉻thhAnvt|4 G(B/S=q^4=$ͫR~UY6&t".qp6$M,'-!v\S_J _-JUB%Kq[#s9aj6_y?-Iz/N;he't@§&e746 ]\㙣2z$SJT-Ď*@%ɭӰUѪ)G۝(1פz PijE")Pzµ^&)Cµn H>U>zpףNWH bqFޮB!7|}8 BtE1\~8gN{BZ+D~]_,=_P(;ǁ)G]K׍,1̲#l'Q8;f7SOn* iAN&xTlD5Kʏ+]]ְh֏ۃ(N'h8e¿k*ܻ+DSܯ0$ x X6ĤJ|[1,_6\tfjIp!l4|Gb>k'Ъ;Lu|3 #!G_h:,E- mCwb{ 'Y~}b<-R:! ?E'6#2pqV7Pޥx+T~p!H8ŹR]6c;48KR 7^.ǴSin=;?,WMJݰ$T|)Z"u)b唩c|_HC\Pŷj.QEn=MپI_ߝz ]d'T7rYiMv\Xߐ JiDАѷ4W\RkN7|Qx K_!$P1G3|FoXoDzAI &CE2άlg!L' =W`{B|2 6nn-hކ1^t4dOu6AwDr[grY1^s™RzG+ñzvk -&Ŭdi#TsEc|ʔWsԫM>Yo.eC`9S RHb'@M'Ü >t{lj(ꍑ6BJZ*!ˏ/A>*0E * x7nIT?pq@M 9įXF=.w}`GmJA( 3TkZmbktŋ#Kr9l|H.A,0<.xK5U@C92.]v+Ե"YHQbL pB/Hwyd ͜g`EaEE9K }Oټ-!s ܡTGߪ;=eS$yrychGeؙ`lQ6fQIsS[-Hi@v#Ml[(*|x|/k.Jt9b 6)L!5ߞS%ju*M_ùۖ?ElQ?^!>I6jگM4-µs5i`Ɂ'!<}/.wmX<nOt*~ۂ03Y/ܪPRk}E *zygWⷝ#jx">:~3nWGޢ^7A/F>myu)vL=Ukfw 'FԖq nʳH1tft =e'_aܸ 4~*Z) bc`o m3y(&AUsx ^+"=J-CmPSt#t-q<ֆcEp21P4$aoW (*vV21Qۻj?(oj; #AOȢpŽR 3-(4*6V w ->[o  Fԇ1Ԝ;4&)Zٌ *P|Ju1YY0XW4B.gkM)5DKE/'T{^>G#s1|/lxӕ[]wv$uk$Ig_nĤbz5&\7̓U,W}!"\zO/~SHۺIĄU a#qz&\\}5XP #HЙ2a6ahuq{g&jkYin L> !KZi}G{$5ܫ\_qws WgCޞ Ǫ{D6ᡟgi%(=#LG/i$@P ?-]h[BAӾGe!Lo%Cv-]ᅀgO<$L\'al >?ڿ YfDMQiFK{ZRթYN^ψ),znPswBi=ZN$jk^z C+̒-F/Q+ ޮy!(qثc8BwNKb"Ia?D|3TDƐ\^p)U>/c_b,&Zˉ-Xnj]Ys4!}TN[JyS #&{ P(v)3dp@P )098s"tOIv"F65՜uA'O0|/",Gf YADZ)1:M-h_ fA{wאqW!Wy?Q΀w `A RO)x6)f&T1x0W/*O}AǜxOV#ڍXΔb@<:oU|>:9T$'+ hPE[vy%$v |8n0QV(QV\&?;Y`jˉ;ܦT/E%B{!4#sk838.z3/ɯ] ky_%}/4/\qSAϱ"IZ|r:2<@c]`Gݟ،ɩѷ>IަXZL7ΗZ~ L)ufM"sK]_e}>bX>E#`5n=7s w"bl_[P˞/Wyh 0PS}bS~Oߚft04V +NBQŔ{VSCptpT gAY bjy$Nb|'|O s_o9I5^tэ\I&j%/x7Zhj@;Ra-i<=|/i5.0=̺p{d`,)p۬MQfQy’0ZEAl["q"ȓ^Oyd?,M;+LU([$C w'MtSҾ[l:fq}*NG xcDvА>% nqJvIV~9  bRmlu|~{LMLgp~/Pίݦ"m \CcQ3F4(?XV9rn '騩Seĥԭqu楸r!~aR?[sd>ѥU?7E4%. '޵0+nbL{0 y]g&:s_u='9g" IXf)) Gyrd+`-tf°8yb~T+cwuR22o9g9hR@bJRgHS.>ĪDf=" I9.+30Hy9'D%;0+p2 ~X*nƯhZöԋIM>P!0Dpl;h6j_pOEXiFn4W[`ZW/.R΁d/brKc! )N yez~ԙT-IGq\R%$nln5@WqGȆ3_`L)"q:R $Dc6S{z p@Ʊ)28!77tIߌlQoZy\Ñઘ w` es:')ETh*42Qm*A:Uh\w3$_?{ˇ2%͙:S!ײjA 9*"Y C α v7!%"u,BSFx;>v=3* NROr'UsgOtBnDZLSTWrg}\ qFswHЁ5EzU#E׫4ˬ!.J̹۸ mAvo]wZR3ݧ$*sw2ZɉXU$;1mV]n^tN9 + xPu 1/y6 L3B-̙M‰.< VIڙ28v̫4SlXSE6GA%/90_ +zh{2篇5#D1Yjn3% ,IBo];Lޚfzy^&Uq?pDbPTx20 %V&IS֚&B]KIñN(2i 0X/;ҥIh %ܔ9SܼSf@q=۪h-/R(Sn]]{D:x.닖sOݡS̑׭j;̞]@K'v&1Vdbo}$  4v6XC&Ϸ#O(biQs)6+]N )d Y>c$厥0( Ѐ$yI}tS~;?$Jl7̕#ѼWԟ ֆǟl Dc]q,s7oOħX O:ђC !C[w[ #>0dikkF"Us5*g^iF'j2Ӂd.c(#]GR[MMd",OٌY*;ΡB ᫝l&l$=iV509LnG؅Ҋ Fd9N/^ym;r udVd6W#mՒ!̍kTc4讥L|JuO m {l4Uk!w'ѷS6 &42j>k:RFg`:p'saQ(shC:ίWYSC?)Ʉ4Q+|LT) 4?ƩV/~DjҐQ;V/Mg:ȸ|!ʱ15Y\ctPgF/1g׉V6,U1@ۥW\%^{VPBP%4֝B{cC lgUۭGQK[qȉ U2< sC Mt@MTE0D":+}݄5WY1xھ=h+43/M<{$2;\viz_XZO)ңVHhV[d(D8]VSv=6*>s<@ej7< rm\cĘ`Y".{B2a)/b x!w6հ>XMQǖ\z8 zxaⓃ-f+ D-ykú,G05 `&"oݸ"j}ѭvށsA؋~%u"Mٷ{Lc=MX/#~}<[MApAκvTE1՗fҺ ~'ZSH8ACXbVKNT%`η"RE֯/xAa(%#YqOfޘҊ=nN֮vv[l' o:ӑli9ӣ9<Mm2ιXIsH^ۨΖm}%#;xu/C9/ endstream endobj 292 0 obj << /Length1 2016 /Length2 13437 /Length3 0 /Length 14671 /Filter /FlateDecode >> stream xڍP-'k݂;wFww \Kpw1r'sUU}&WQg3fv6~;Zb92/3y9B^``cYYr` 2 ?tfv>>^?b gk3@ٿd4f @YYY.,`gKaz&5 r9 PڃnaeAlq:/vf Ws3%;@]Vr p,@:@OkK,0v.hBt @ZL|\̜!.,.vG1K9KA?ꓴvݓ˵u;xYX;[ц#+HVo3K9@fV$tid_oG#  8|mo06LAȿ,/lg{;폟>(`JJJ2?Fqq`gr|; :~:X|2^zR(-t6n6_rOD +vNc[yxQ+e /Tm_+3_, bvEdb 1K.khv O l/ef|hOey;-l/Rx9OXYKs 37 `/`x_DeFVO7zSeFV%?F|Vb5| |_7%ۿ<0]BZ L_%ͿKv//; rp_/e~%ҀR~n_u~<8y ;˿ZfI{/ rk/mArx/ҙoB|'/u:;?/ !/̂BlCZハ3o MQok'3{/8DCHLZuKXڔ]${>lEoWmyy46݂<or{qDx-iptR^cLx%yȅEX6;Kׇ %J7'bT73 jx '؍s]TwʧӝEl!*)HCDx sz&ikE?sfCax}e_i k|"[g z&*8#o3R*MˡYȢν(*ڜƶkȼy>h":Ն_հC$%zW qS,2E pH5oeC1Vvx=ʾyyτlwF+JA,#/;Xx*I5(C ˔q$nS 7tX 1&kr|>D~}`][E"NkTig8 nZLåX1L=Bݳh}t s +ctߍ@W%WYz!W虠ɱ.(B_F2i-1/Me~7񃽶UafZfGY&pK O1Z=)ӖM[?W3h'8WVk& nv;K)Mu]:_^>8$*6p0H>L *!%`&̀B5@g?NthX!]UYʹ?K&?Gg^ƫrvy~1 IXˍZ9 'kmY=|o"ex܁ Tan^zDF 3lJjN7?x][DŽLGN吞$dEP4P\ k}]LJ)xȷO\l-TDy_\dГvHsf/$S%!8S&]eHⷬM=Gwk1B(8L)iXnLcLŕLѣ7wx"~x-=.zqCSJ4}T>/'AX=;;z /˸UFB%[ͅ[o@zi oCA*q Ϧ1>e7p<TtWL 2&o}-9З+7tJӵ̵6gjM4liתOM1'w_(>t"eQJkg%֌- ɹŊEHvṘa ZTw":q*E6:p-:.Oo*k2f)ȏ,ȡ5">2pbunz&Pu</#oR`?< &G4Ưt,QީoP8 ӏIJLckb.VdqooRjZ؛4$;eNɶBIaGza+[VnIaD'sw'=)SaO0]V `AwStѧ@< %ЬM/}ve?{];oe'"-Z0[GdMNEN /e|թH>`Թz[WS4ϞP!+j9Hq{|eVj%ƅ=ERZ>c=o$VJfiOjݛ2S˃McoG2W,dFlw/!#Z1d5̛I6 |uag\O?c )򴆮:qD]{!IhE;h3SvAuqI.2Xx"Z)m:$ =Gj⏔-*<޿NKw7* ݮ5IP:N=-k1Cmx$Pq(l$O=ћvמNWfQH,ęsj;.^$ *ȔHc.5|(M"΄p%iAMoGjMA}ZT~ nՄ|A #ٗoUCwMY8^T LVos7Gjm~;]\ESB4 h4m)VؓYVj}BMPUܷ|q`o~ӹf)s"僅J.8Cqш)ǘ kDncp/ șY|?4o'1(I+*(~/%u9eOb/= q$uб}ĤTa Sֵ۠aL NýK$d4T˜.1Ͼd&S!:. e.6vАl ϋsSKwU}FHFdƦuQM{UE) YT{"5JW嵺hoSBr31" {KzDp#OwiXnl;U?lSlR;b޼HyIjq^JFsS2)ta|e+@G5WG8+/tV{'~vq($M, }B"ԃ  s %Z;㷫2zH]@jK~-{ӥY^a79QCJa97Lk];uܰN8FV; ?X[,v%tm\lmD  j8o$+dzGHRrKz l1̇2iGGPhQS7KhhC@))%.A2_8^[VzBwXSD~ݍO(v%L7;|شLvĹzNN_M"p$0.\hUs{5lx_G.U:yIl346V O_aqv=3}ɛm7ᐪ辭#3.lŝeg{+J׻Ӷ~!PRWnL%A k ?8Mx%btw(eĴz +kɑf6]W~x]n JJtX;q\P5rb{y˟kcUFwh^2Ǐkɱҧ'O6cgK7<2O≤:'u8M:RPUǡ; mL;;bl'xkpQH``MG=_Jx+FcQ߼h? #Sŋd}3f*-䋭m=1'^]u)Ο 5~Ƕj -]# JX^2$ǵ|I[b#pH5ܫ_xTؒĴg>np|\9=߹F-̌>$6Emh~*F4¾96-OXу̵) I4yòW5(b z7Y]?}THfGoPRGYtkzJ̵~[JxZchtp&;,>=!UMkb┟o,!lN)JHFO8f9BW;4Wb8>C6I"'4쑼 T1n:8v*iK2 kTT{# pWSNr0;a`|px=&$wEN+#)?=+.nqzLҭj=GYjr#f8shs;?~kV_vMA?'g"6Bt%KͫnmWU^1D[uM93I8P>]Ǘu> &+xD/ ]Bd'HK̾dM]qjXl:3{ZZ򛡽BSY1TDIQ&&mDcL?'@y+YN^9R`$n!³RT~P6NubEk*A\9CZ(Es ,Uibf.kh6OOs>/Fp\'էǻ$^"7 . fL>Ee`oYL3͕LSL}ňC4dPx3yRP-W:qI #]!#ʔWG^jL]鉹s=៳OU<[>d3~ă3 9ҿx|? u^ʏa_#@l76Rӭ}ei̙28=>^F+ ]Ědm;2û=N-eH*Klf͎~dv1Z|sB!ַ`3Q`tu汉G*qyR$w*܅a .4\F|OA__VJ?~j5Gz[v uX, gxllp|? ;k:~ۏ Sm 3Ki&B%ܞuΛZC v-36;)f( (1ђxՏ]a}ZrsJZCt'{gؔgWtRIr|_Jc7v=G2a2wجq,~b`?D|]_\]ބnr>r@l7HWB;Nu72:k22ДJۅp߄33/7e[EDW%]*vЂ%ϲNM2K) x ܶ-iiSC7w,`?X%lTl6T4_ͧ<6aPMg,½O{l"R[Y4 5wve?ܦ{,]J=i9oN*ߖ? !lGtU P UY]y0`x )ܷv Y=2ʼnkQkӄ00Cz%:QLe"*X]d/ɢYw^dVcmY#; /+ Bil[/-rax;*1\ 9@r9ApTz7lsu?6-@ %EQ8f*o0r?1n[OnՓ![ndK7~d y<O+1PZ sE.JM8)&:6K)I gA ehp1C)yh e&B6F+y$ ?öXO |W!{mA2 QrJјp墆s%~ I̫:T:ˠ:a\WÃļo^p`t3}j0#sm$|{鞌}2dfg(J YOopf6Z[;}gLEFVhWٱ\34r"tBW5}t؇׵PVBIFԴՌT|^{A;:D +hV)6!:8^iE'Rqx?d9Y659Hoxj$Ϯ -L^^WdC4_(.wCYVa2A<׳?-;bsfMT1؋Py0'wpՆۧez[?ŗK dSyye-o,1sUGө#B=ӵp߽kGǠl$qP4|غyYu<8bpYyѕӵi)Ao5bICrXTeP:Pk'lH^XfFE`+XjB*@1 ~FŅVpϡ->в\SV?2D<(ZͧʠD%|:=%)FqE"5C铙Q.U]OOB itQ^y42I2=)vH}V'Rdi[znjs(isFSIVG}C?[]>   ~?s&کU:螣^K=T(gz"%)awqt{Crx32NDxa _|Ysc0V4+ eDXB˦,)7)p?-<]WOy{3(!R!wqbabG`9[Syx8AM I[R*{u;vcMmXO.Sxvu7KumR;kl»Sʁd4Դʌ#n_rp~=8n[B`(RVck%aj/ᮦ!GzmatF u\#!ӽA;]"L/k(~I5Ʃڻg6I QeZіSQ+}/Oϳg/I{+tu~wA8\ IΈ#CV^1aF׌?O`a~Aڽa 3׾z)@Ugt"@N1vr$\̛w>( ̶e%S)xc+cD?\_JR4ġ8;Xױ0ێ0]U%8,:ATDV/]ccўB8Nݜ,w6aqOtf0Юf QѓTnW7:+ ($ߩ%"}t  xgBdEm\RXU*+|޴z7#e)f Ʈ{sg*dq,Vĉ8@ bd7mY5|Cx͉L8QKzk3%\O.OwG)V4͡<8 MȧO&]Am B 4BB?*ֳxp@2 nX,aS?f'-@D ' ~r0`_,a1='`5+zJ'yz-LB8YY7S`R9n-YlRcBrgmGq*Qo-H*epx_& (0"0xBTo8G1;5>B/wcot?Qʴm v|ԷZi(7S3*9#zP[(z3GS~5HJ6ylTAOeiu6m%[L @ہNIжGo8 nUmʐvopN}.9.p-B?}xx9sڀv'a Q+{x9jo1#D Ԗwpv>vɐH2c{ Fd )>3ꁧɆtSeEUds".xk7p$ہh1B܊ Q7T|Op+[5蓖;V/}R&M‡W(RNOhҀ&5d:hLuo*W Ө1Gt9K|uV|g/3 ?:4_kRX]iȷ豨g{ER-xH 'H>`ټj5QwWX-agI)XtFȶL}Xէ_o5IXvLnMmkL)/^w$'Z؄`2˵lN_Rt&@iu€B{5N叏1̯r|_&ϤES]ܭG?o>?n{DճY2[fPʧir5vqӶZI*مuY*,t Ux= `dRX_3oҶ.rM?HDr6*T'WaO`\{*NpֆL~ ` s= <^!s/d+wiss~~ވ2懰BC2yW 5m;Rōu#|KPRY)~IzcRGLY$7T9Kh2tdhJvK;ITU\Id7󃱡 [mN4ͱ|UNuz_u͎՜ߛڣ"~w3媺7w$E:a0Ŗ6H\Qer}H5PKƩ`֩M[=s΍>=<-SC}pް4*<7]G5L S*,I ]Z%b_Z{iF#QgϟгicFf%l;LLr?Jݜ_vԾoC{vR&`Vs0s` fd4!Gķ ih/zsbS6.`}:atOG^c34 ;'+Ǧ.rJ8Iow*IG1]*)Hqt::&<'`aT}آDEAVuFjC~v#&z["BٳikwN@7}Σ$X%J>Ѹ]6rll:ZZ܊gpjßJHQ¼uK,[}jM"Rs]-ZAq98_#OTgXQYіTiLSs(w_C`{DS"n4ʌ|O Q`̱Oj\k\TꐎдV4ټ74>|ʼl}ccrOu9jgKɪA~[QFn!p;AҦM5{O]ߢٽ\=+ziIOOmKh.҉P;?{aB=(ݑD+S]!FR{QV辸Eui6EnĮ5>\T0+v'pmz\8MY9L|KF?6n?lRmϰ6?vLEL .]%[+n,bfIH$"T}< YMf=ә͠}}nKpa!M#V婢IGi%ɂЍϡf7 "R~A뉩oa Fia9/J>!pte&k_Իgs t=(V)QY1tJ8vׂVM.XZ˾@ߜf'͎25/KY췭[⥞SPvi$Q[C_R}<<)*W佁?xPeHwnD lcq$ Ua1[J8n񲺄_bI/80}z_-Uoֿٙa-"pAW`U}'=F0 8y)4?',K?('e B"@Jy߮gsC{N?K`VPZT j'loA':uüT*#ΆamcVkSӫ n5n iVcEBġhy 5Q%Y <> stream xڍw4ֶ ʈmD;Qc0e ND%DNhQ"B({oZ3}>y~5lLz| p[**i+>@ r5L $J)Qh6t  B 俀p}2 jja$M ::k  JJ*AP;0 F9A'ځ]p;(N(}ooo~pzCQN@5 At`9Ap7 P; C@@Cu-; {7@A~+;lgws|0GUGx`/  GǃPW-r0PUAF7=B#Z}*0{%B~է E@+g.07 wՄ1 QW A9BP@Q$.&x!>vNC~;݁& P{A('$; v(- '; qGZ~}Bs|t=x>@>QI ((($, G/F [?08POkW^ W\ҁY r QKCo E.HpݠhzІeo)hSG2P9HU^sÕ?v_s zp$C'-,;&o@}w@A!>) Q @5O !/i<~}E @sp;0纰Zo ӧ\|s7D\9O' $ k*Wp#[S~\>J6-Uǧ3 0 qz}S-SHwO}o٧ j1M˲qx8ːI|ST8(>zē'd7@*U-k )VVkqNgҗX;إ-S3BRQpnk$c!^WG4#"Q|PҊL9+CrqaTb-^DO [lgדq.^X^hs{4>^rPG^{kINi+ ,N*!BJV*AQmBDvx'>Ihz8eAɔ'6CRsMݲ{vY}7ۃV5^Wydޝ۽C 8 Tp&h0L|X\n+s/ 7 TxHIgG6+WD-3(;yNyY<`(MɁl#Y)=>=] %\ 瀏)?= áx]rV?EPʹPZSsr =ǭkgtܫ>bodlk>!>Rl.\gzB;Д9k( _Obj‚Ra* =OSMܧȼ޷:eZk{Lyat; yN$ל7,m53y6My$ K-K?)ÃOJcŬCwkz:RGPZ2tei( %Uf*SLQ PUuQP \8wgd57 vMZ๨u qeð"ps]RkO{ShvxgW؟{bws׍ԷC!l b}H,VJ= uSAUdٚ,?^60Ao/u5~eWǧcgUQ, 7?NUh5Om3*Uue6}Ѽ:f/E+,?4۬,> `)1c=Pނ8_v!yOR /^{>SrQ!TPiLDyUkrtbJR}apTJ ភ (Ġz'i"~#`0TKü'3O]ײ>fSW+cˊ x̒G <m6LXϒJQw馷߱<~WZ]}%|5[iYd3g o]qzn9 boqߛϣDV?5x^ۤu>,FO',L(Uց1> iO:/ts(L6 ;Rޚ;$xXXU hJ)p2Lݛ}";q -TsMR}{+oyDbw)C3v܇(I9BӽFo ]qqoUY{F3h0,T`~#/82>8CE[|ȮP &ݦ$ 5ie>]a]진‡C my gBĭxD~\ZKҨΏ-NC yV0jl-@J/ -~r,>d9HQʹ?ƨ83(aS!MmܽViVgʝ $Nj4Im/FZڬ8^Ce a5n{5I`.!)zG9k<=qU<<ڌhz -:NG wR8_Ig.[_PEի{JjE)ybr貔}o3OXp[Z1.e (X}LBrM6I!"`d֪ڗ'GKΏ@U,}o?6K6ޢ˛е:Ws/06l Y!D󼯻eT;B3w/n2*ޭdvulH['b7f̀SF[-/t%9R6r' ?`=HLZO~Yɹs>L(Q63ҙHֻ&:Bp"lXUzwm.$-})gfa>˛RiOZ"JBd>Fz-F c(&W&B]\͡Hj4(}(WXymV]1{$ 6qqqG 3 ]t] ؕ zB)IEybX-D pe,_^V Fo%[f͎Oޣntad)Z…Ed)z{&e@GgNuUdMaMvb-BeֿGn;0_9G3A~+ V , ,yIc`p՗WYL?v\05gOq>*ڛc|Dİyr7cr/6kTz_{'/+3oRT,/ b3ƌSẓ@i"\Xf7̞|SℛzQ/O>NsϜaYآ݀j4.CK?戴Or*;5df f8MZ7G3[ Q;@r; P J E10UZ܁UOIo[mc;ޡF1V?VcwzI6|[$cdh˝1CD* a5҆bb$K,IJto *q& ynԁV+.V pS-ZAlhj|QbHK72$vo}搚r(KzT2G:Y'LGgF}z&}2jRv6ALPi|o0~>Z]MLᰈ(\\7oU* ,xPD%*q#>ZL!5-wZDe􋉅i#eJ8t˕g4x1[ͲOlq_l%zU%y)S18g__b1Ior==#=l X͐b| *eMdmHhZQ6q #Y/_#>ñ o7_Hmg4쌯b?~5kOioӕv񁬿()Sv3ᄟ6 G+'%o*Orv:/1TS~k$/e,fe]z1d_6^]{ /U39N9qKT%VzR1dRm[6I'gM~QKL\{[HM8=)_X_EZ޹BD[`(ә"o7rB.쨯w͌GOs肺J]3z pgg=KMDI}'o%BŐbkPLM427wncJJp%h R+ܫ3Łrϗ s>~ɱZ4KytkmlUMUPg7 Ǯ(FiTw>^4x#+fubgI;)"$"DBe#Əj#`ωZVG0Zۯ%sj;X4\5jh͎١aɁn~ˑ%-FZ4plzVj^Z;2OA`I~˓.ۑr8D.Jˍ3_ZMmn-J ʂs[T d4Z#ar"bl4@6p-?$ԙlns(9<m6<D[9BAHif$k3Wx,5Yflj~Iaf{JAhlO̾!78}Sn8_z2깅%#O]Sǘ!9hC?;1C >f}(6E1)G'8c> stream xڍwT}? i7Fww ƀF ]Jw)""(")!tC繟=;g^}]2RqDh^, A@HLpsCxwz9CQᡆE@:Op4@^@,)  ߎh,Ptu(a.xB@^8,##%+"PwAx*¡@S4# zXgE>A4AXo#|d!g4a76>P,HP#rD`@S}Ar`a>OD h D90/84! ECa_C*@(a?X$!g9OCf #8D, A-9!QNc8zaDPHO/ o3IKIK@/Ee 3`a D A  O?% tD@;;Ap-EAϿN9Q~vb[zFQU  J`4Ppg[P>#V';pQg2C4 ￑n _3`~EwC=~<h`&߮5@8"<۪蠂r&@Z,. G4[H<7l~ D!nqG ! /ep7cGoG"eTCG;OTBb~ 0L#"(4$tBc狖(=Wj/#8$.ZvP#<,Oy`)*4\lG_H6˝{iay?n;`O|OSsՙ8ywa<%`$M3tU2l-8NJ%GSnjާ0kJFwV3ɘdoC%v*q?l1&&0|! ٧voE\\x: ~6uq*釗yod(o87552K/CMo8Aiҗ NĭU-i09=rϛti(N˄X҉Q{#3+.4|#/ ?}ޮ3YJ.~p yUϪWX ]@=o:^>o Lэ]bP+:A>!iUpz]wdi {m,"pLĸΤq^Ni_7ߟul"(RBABVpț&\>Unkcs>=P^28AeX'B vb?I!zݩQ{c\n{;\Y2BaܠwX3!onކ^aa@ܛל A9E~Z4 Ft'0`'8P:aNQ)R=}?O؂, #Ѳ ٢i]eg{wrPxa~eaX -O|QP'H*_uES14kzQ4#VZKZ#D +yAA09~paW%Q/0qME:Z+w4(Q`.!jCU{ZT};HFn<Ճ;?_Gٮ4<+ps+l ZR'a,z[L)_Jk$|p7a&8G8<6܈# {g 쯱Yϼ>VPh*JF CwDk7$mtVkA$D@ͫœ) m&GSI\mP{כ%M!90 n&0\]5<7%C=cdY;sug*9ΣQƏkj)yK? VSqa`Ԉdk<ּq?#KD_3Zw*#F(,f/{fD+y$v/-?lxOZ#4oe~1싸ekȕQQcܭ6eO~b{$꽜EAD5zӍ0=P8Vf-V򤱤jM"EdFt.O*m1{/GLIsPTsW[[#,-Umk ߢZ$6~ |kJwu98Yݠ֌CN5!tg ~"Z{ tMqƿ%G9i@8f<I3? ^8Ո'/vUu\0W 6 n[mo8s8.<Šaf - b%_\~Z+7#)( o*7w8 cg)I85 T4}ٽV<}>f}~D1>HlgfU];-a$ HI nMa/+]Z{"D%7ݭdaGG܌}_+:ouSr (=խI&t&`W~"NQ9P9c܍`&v\^ff5!)o uȿIv98,ʊP_#]w?ԬHvBTx. Ӑ5.||YYx<8YIwܪUkkDCK:!G@}al2^ER!}IK xu^Q4o5Loٚ>n>py~Bh4'kj'x]-#ϙ,#sܹ@ܾnOԲdCd> = r Q%B|nU9-HJiXҁ2ځ֙pR$~doU 鶷Ԃ\0G86!p70F`EŐQ8AJ.+:E9m>6ӱ ЊuQf*iBm*Yͣ =Lð~BNZKh(iBLոϼySn/uzwu4f\;KG<ځTuʩ[\[ː8Ϫհ`ѕJVEehe($Oƿ/frB#,)gاES|*e/c6pw4hHaE#I5UxSn[W"[ˮXX54S7.W݃ 5  *8,(1?IY>&BNcIY-؅=(tqvVؕ*m5Oμ;w]O2 UǚV$q}rڢk;k KDJw#(> ދ%#RO܎EFR9ÅW%YR"Mn{dCv,u n*qqr~+(-Ӕr%uʱr<ت?]d/[VpV0>tFpu?\mJ6𺧝R#Iյ*HJ^K+VYCU]}L\9MIG.Xa !=Z ̅aJYeRcI/:祤'Oi'1 /MND==* /k<ړ ݅ߥ,xy8Y= #m'v(P=M1A'cp5J`(c!9xT~rߛ*AVCn>fYOhȶ 0jR *tvbtJ3ݜM^K$r)IѪͼ^O o~¨[ri1y3D"coLYۈ][O(@D'U*ݰ% nwP649EM֊& n7g vM uvm.1 z) oK{=>)DMU8liFqꦎ ,ĤIx+nȇdô܂ h9꜋Z񗦕2bx"kbv^+/R4fA B__c9P<܁U}Ȣ׏e D[o7|LL7* .R-i!~_jңpB{"Q5j$4jώFP>3g;HQDN-J+E(^V'}@f}oO=CEdX,=ЇNai A07UyVe4vW,3-w?BK+0/ոX~ 3 i \6!h;J׾WfZ3XRS CPU7xN!>$9 E GN "54<`MH6sel<~ EVjũJzE@IEK(y2{[HtV_UJ~ w^Pe Ui/C.|#=c?b/y%ps@5f.c]g("D:NTҜW9k{77(d{p[gTdz GS@= 8yV>hN~a[B]%K9VjI9b~~FhbqA])O$LVBkfG #HF\ɾ~;lf.tb:/>4#hغWsr#g$vj}K?G*-+ AQ1>&XiעjO}2Et@ָ/*Qvi[l z`|h.ÏG}k?S$f2U)$^hSwN 9/[t:MHN%z4-I_7~͞\]1GH]ؘ 'i\miٔ<<ցJ8-v:ٲrfwɷer8@kF%QXDqtD| PߔGJl/d&AR_Z1Tل/zKal#Az_ 4)+"Џ1W2\L>@;bl"p˻ ^59Gqz^ 匾Y]ګ/t9p`Sy2S2ncmIԵᒍ>Ts_]HK{02X-rƆQeb1.kEw:C* ` R?knxXiL3s;s~q(עIU'ĺHת1Ub8꜒svaDr|2F.xꖦN{Lޅ2ގez,_ڟc&X/) #wV|vJj&9spN4G>Uƥkv_S endstream endobj 298 0 obj << /Length1 2531 /Length2 21518 /Length3 0 /Length 22972 /Filter /FlateDecode >> stream xڌP\ - qwwwwwww'$݂'̝dUUkzNCJL+hbguec*12`IIU,aIՀNv\; A2Cg-@ `dbdb`010p#@ K: {8Z;h#˜N;@halh 5t6ڀ v@g1wv碧wss3qs4㣤Y8N@GW W9CߕT-+ۙ:: 1 bktʒ2y{2 px dasvwښ24vZX  &0OyNƎNtNֿJeQ[a;D,Ơ{=Y+[;7["L\Um-\"Def@g+;'3 aKK ` *ca r2t]>^*`&#- 1o ;@{_?~oK,*$Lwꄄ^, Z&V%c}oCWw6OƮ,?A o,9;\yr_QoKsKM6.Π6U}@ t6mpp(X8-U]-Pc@ ҁN p_* rK)jklgĘX!+t&@@Ogk r9(+^o¿^7Ћb#^7bKF,z'd#oq~#&oS@|*A71hF '_b0tmoo* z:3+UE`v֠5w_ j,,!edEژ:70RZ Kog ? 7 h=́Xd@P֖@$FYA]#wP~Gfڂ=8ɀc[ fz;g,H;NP3#Or:uhbd߀ meuwiԝ6_6@? z&%N?#(ߴG4# f(4? (3?;9P$OTy8:׋  h ;?cglY|]׍v{wt[%׼c/7_;/mR\ ,<{6Լ mWlz~4;73{(XݍVE`[- i B6[{uwǙmŝ 6i h(),i,"(gZGy^ZkL1Ӟ˥*LNm$ZXx(Cd^B{R^yK=s .!=};20uV%6'$q7ӝ0F*B6uH*mOn4Œ"y#C7t+OӾiM\JJfjپ?tm)쉇pCo^r+0N]:I- !p%58J03?& Hƨp.Ÿy5'Yu8ilagq%Nѿl~Z]޳cðWr!+u/P:Ŷ0s xПLČ{ 2)M$uON)> e&%$H!MIaRk9 Ci=mBwB+ϑU cJu3 22͘ѮG[(CfL9ܑQ!^ʫcBYv$c]e?W֙t;WH.{YB6'bP\s&E}lm +<1`,[V 7"wX}䟷(%jfQ!d\mZ淑t ԩO,-Y2"e ]WVj#w`Rl髟1|GS ǖ+If^˭s: (pP˫/|vҳ:v2IE,g7kL'n Y#\D^vqHk8;' Y5xL|4p| րx l;0 li 6z2 Q:N0,GoDt38݅v{Ʋ3KYq(6K[1(DeAdj(w^'EsCVoU|xi/CRCxپ? u  ݥ <%g8)]Sj;D7@>luF1ѓOѵj׵ iDĞX_ ]/>~J.s 'A.f|r.6 - 9ɝv0o @7%wνgRx *UsOO~֗n`b|NZXaQl.Rt<;q ?qf[Y#h'Ppr2|#{.>ބ:( T=<2&7"kO)&S*吞#yNלm" ԁaN*1e|(J/bTK*{zrY܏ʤ*rJI3Gڎy)O}ݨǚ@ʹys W#bઢG/QgAmHQU|Z#HkΤ9[mڅ]dO#iS?T:5Vmm@HdaAS$ Vf%ÖyIծ.YtbTB/f7t{=nʬ.5d_1~#Cu|=qsya A[t;t}ff$cPX NO)-ܚ}7q2(H֨ )5{t]?MGz== ]<B3>^1N5CC9l 7!εM\ 2s'| }Ǿ-)࡬{&Nhf4 1͕~.B,!~yHtP;,N_"$S 8 {MT"f+˧u m;đccV;b{>&v&Z'zfWE4|N\J$lhda67ꅑ2]JBzxJB?ݫ3g5ӸXe * WwNN#ޡ4!>[憬ug$+ޚQh X-Er-k뛦p.0g^^v)UiYP- mbW+z!fhk}1zb J ~/T|Kسh#NI$eiy!*-KD)G&X7Nsr pf|u409(L!GFiD*Qva 5d- 4~#_q^U\Mٹ8b!X0Yk M0N8p \zJsp2[t8O1Wh~HR_@|9وl8QƼXv;WÐ )^4=ƍ AhS #2D8]'>Π~ NK;t| c3YV_+yv_(MǷڂq~T,f4,$h:FK7&q?{h4*2Noür8߻I$^\Kn*4n@C]馶^6ZjrP4R^8@G$^hȅߧ z,Ī%bXwHI[۩R\B9/̎jzY.0{[q+7h$|[$ܮyʺT8JȆv;bo0g~(oaVwi_Dx|ء×yYw:Q 9rǂK"U>k\('0W겷E+~"Cz:0湩6(A/Q\pM$s-欄R\hгUa+  fHм{P;f$xsz 7ܬ%PnM[̦.[-G(DobL)A,ih(7 s7F9 \^w8?c#wHjlx)IlUX͸䓧hG[f4usnhnw*ϋZky`n/˝o#6tGó,>튑C9n8o qAM!iAb~bF=p3ϊrF!ԋͭ+vD00͞ffÆ[1q.5bI<ťcoݼk0vıJ$g^$뵏9R_}4paZrcWppJoS7g:?朏_^4Y b1|Sۣ Tӽ#5> μg!H ]{W|7I%1YC5}ʬs%j 14rZ8@)ƁFY~f10ŵfbIPfΡ./A348{&QX蛝mօwHONt2jDiMsA i̙2S/j'Tj G XOHPέ=)/m/CR405!_VRa=(h/kp} \X7!]9kZRfx^ ]N9ӕZm߼gT HQEEr*ۣD C#t,H[DR׀>,3h}4*͂C5 M=9\.X,NԅѵY=61$z47&ގYO[%֏"*iV7O(|#LGagw\os_N/BIx0Ń4c%1F@x YQ^1ONI V.Y]Τg Gpw랠N94\p7LHezvz,!Ո$,=(wL1~_ f-{n9p: fEۍm!-!Dsm a2`//'^VqR'j<оk췚(o%>M٘' 8VpE%^ޒ;R*߶nf](wք@T#_b¿szLpzWO_Fy40PfLSZ-*q-#;GKEq:ž"8X%ǗoWK5lD @+{Ϙx o_f'홁[^M7h^ߤYj+ܩx}R9jTODQWGBhbgD F?eFOxɍ %6s4{j[^5sYSI/BN^A(B՛&h dG`NѧR&\>Ex]>*$^1Nߗ# v6~}HH  cƠ(}(zM@jy$[#L!k`r*JAsu&LjlDe<ݤYjUf4~QA%]xzǬn~9{lbqᛔ )fY5Ԍ:ʅM9=5kxV|)'9{C"I %뚎**F R=0-ڈ>'}J15_hozQɹ)|!O7/Ut{L+[ P}9/Y[N.-sDsPf5jNL-*ܝz{Ư˗Y^wXa]U#38lUV5@/DEɍȳ>u6*HgKdu7F2CAZc4V? 珪>s(Tx'=!χm ~wbU8?sceq)A$ ͐SHbX۝[!Q3r~$7_!{7NsְiЖ%Ӏ,-kv^u` \y.EwV+]Ğ($^P?Z'dT.k) yG4HAD xq,3o\bk^%ՃwlԌ KB5sr\)'f},U#WƷO8 ,=Y|ƯI1_ [˿ϔ3YN睰3rl5ÿp'?- Bf}wP;b54zXq{oc{cDQF'$oǧ\oq JP|jy{F)/ϱkٮT{8W4݌EĘR?W%'_j[(} Bd]fCܼ|?U>ghY·XTf;6Z?o (ASvʦڦ^4FK ~޺veD cW>ꝒϋE7دTq6xy*QU"^a a6cPڸNu?$J *ioZ^[]-`'*yPg'~#9 6Qs.nVwxl.0* 3!m=T~_LkQN?w坟-Xɔx'}Gނ7YevvTqI jgc$l2Bg;bbT4Zu'&ʱ,~t_9lNQ(ZZ#SםrԶCZB;OUtys{(Ŋr(5EFÔ=>cB<^sRFa;GGYPl6l]#q8igmwV5PiMֻL;fsΜ[Nr͊2 .x~2fP- +SڻJ !AΓ]8@D4.v\Rb`xc9$ ҌS^lIl+A JD֨U7~:`:e:iea*o Te@{ڍBx MbM+^ 1!Gc!B"j4ݨ8SD'հ5k1bL&.]lYsҦlǧvźy쑡Q#]1c&_tf5X|-SC-c)Z;국/|kʯc6 @;v\wk ~9 [.7 nF8aȇʵশ!r~i*Qd ʟ?Q;Q[%&l2?}PҠ:는H٭:L k$XNG?~97S2&DrQn8G(l"3Hi{GExVʡ3\^GH%Wڠ ;y$6sT(FW'x֢ n`(ޗ+ްqnKǺWYXz?mb3 ?o(V@^਱X&RNk7Pc]fc=kMIwzUIy>` g7c½z7v(x{lbLBB'ЕVzxv{VG@]f]sjH" & %hK*I4 ?Bn_zP&_[PdU;E頡茚|8Iͱ쾩];agS{, 0TE|bAQGohq70VkR5$g'kWSF-?xMM`)Uo/]*G4!csfo2xa f6}XExm4$ڝZGk$nܯiKrVЃ68Pz' 9VTh!6|Cad`)QÒ.\ /Of8hu]mN3r(/8pż`]ܪIƏ%'5,L9Pa*t:݈.҇C~zK>*}|.|~#*FBZi#LX%X5p(19mrA*omO *OݳŃ/!TKg˳ozgb6( }FLKO4Mur|Dݎ7+,2/Z9&$ Fjħ%J.55a[Į::>ph!Xt>~4DїY@ K>"k631\x\B-|\dNIY9EU^>uu w!iP;Nl{WcƝ !|cZLzӈIR2Y_9 #S3Z(l…u<1*TG*y>L87]{K,Tut0HZպ}C{.h+^_./zk9:TBnL7[{4Z)W)pmF(USD6Vx.RM;,cQHAG1gIb6?>yBӵY;ո0r}EHsT5?yT{X;@>%g{ﱭR}y3q3~X67pHw2Uo!/,ȢzoͤNOk;:n3v©Lf1Cc5D[V(-Pt]Y~ $6*D& LeͯqRw+y[pm+ o?)lx 3XIf[ ce%F6gV4^bՄ2wr=oJJ5nđ@q iíuڴ``iײc&g 7[v3#WyeM")&*Tw ~1!c1ujo%! o6Xr5TDX`.uHz[-_5tߎV@ƕm}Z|!g' 0*ʎI1GV ţcvv~>e輣#6AƟ +9 M=ⵑ:ib*71>LvW5 i_j$ͰՈB;rI^-cIz*/t ؇w)*C'8}PEP`#sQhLM\ b)!='eGw^a:d>1 ;3ٰ@^:O6"qTOGꈖЅl28(rr8J@\71!'AWK ;7+NχxƠ:H eO*⊚q?6Wi]KhhBW\j\oJ7xBd\Dl'M[$#-ᓨHؼa'If. glitzYh>RI&:MKS N}ZMVӨt'2;QIu$|T2&t~6DH?&+ldp qkDڴjg~:Oxh C U0%7AQDWsv?TUŋY~ N`Xuȱgf#=4T45~//.a 4p3=M'XrUэ)ޡ$[|èǘu=iYeIgaO6 <ΉG#ᡡ WCǎbxOǐNoCTŒ(:T.Bx0egar⿤ٌb7/i_BwTئ3]&G2%!ՒxNuJ[:z8vQ]*1ξȮ.gIr>x "BNݧjF⼣v=z:75>Utޛ+yd~:3cOqN\V}ǠiN"jq"B 6 De~Rݯ%F!M* C#[0 (v:nnU,5(zRmQjkeJ8[CLӪ A/:OCph/u4VY,#Max+#+.ʶپ1)Mt26lU5 SH)VH#jR zxܿ,@,<}5X8-wYK| R!NF ˄J{V0ZnFil9%j|%;9k`ݼDjsȖP4yB`X}Xf+oڊypx:KM \ ?ְL3+Mځgdihxg{mxB+ˎl,@ [u*N<(LhMG<!m]ѓF'6I 1ˣL1~⚉Ή< #,0\JWs7g@@ 鷤!џw;:}ʂ꺁y2⺞gbLСD=$ȽR 2I+ ||<:ꍇR>uo9a.o"s]š=#+kKrCZj̜|U@qOUjf_)c2`K[Yh^컿 =}M'Ub #z+3C=c-(S0s0S~7^mAAYdE݄a c4gS>>Ut}C:@ݚ{# >duq+DvϛdA@ҹZgѳ)L[r:g=L3CYqP`;@Q%,L[gRz/`0%C I)fsMc bQQۀbGf! rFܘW?!~.]M< .DZgd&9}"iLff Z`CfV <¢2,xf} G RZQ=xc>s 7( i1+2{,5j%eg9CFYay$Dѕ  =5żB XG:3-qQ#GWZArO{A[' )ZCW }-#^ ?hv+ף@&OHl<idm ׌5D 1%a]w*M-:==fЧLT &"-}. tcx!QHd*0^cN*LvVNv=$itH)L>CxQf4x; x,jtIiSt`_@9BݕcRbėsRƆ?'71Dtrgk0D q]$'zX;xfݟ֨5$E+N 860s3x Pytm)6ݤń8 L,&/-TwU#L4.L9x)!mm0۶{u}U"rCqN L॑X1)SN}) +vwŤ"# awQe :Ժ;.# :df\sEi$+4l_prTd@ߙI|Rybyt`;ġOO1?È .si/3³>DƸ"n &ƝgiREB׷~}T[KNgb Q 5/?2篗HuMP{e61KvB6]7] '%ڣHfA_y``v2jhzwSf,prxJ5\Mi=ojW1?p{BM"C^}}ᅎ[75A#}1ODZ/umחjxpe0Dt Tڎv7"#~J /xW{\'^6yd8Ghm/4X "i>NN;-?|BԻx9R]~ ˋ3 e ~އ+&AnŴUgR#Ѣ!|'"FSS#Kg`W(!&fh! ;\e_:3r˃_hsTpܼBeI!K,\{`mƷZQʿn$䋨!hŵK6e"ĉuTu`&!FAM׬"Mt_A y;թ%X۞luDlVɜ]`v!ڽ3Bf(-7Hpq ŇOײ$#vx)^*R>4yE_IwE15N ޮn?0qGdw6k2&{ ȓ/Մ,{~M:EQ]McT+!UԊa ?^bz T)Lb'C\هi-"X.89xaV(e-8IMpon)rCS=I> g/2_×R BrMv۰j_Wi\(dS"h̝[F/mGf+C9d$I)Yar ;Y: {k}8}|rjVV6_q:ܜ { ؔ2ETo9ٍE&:gH͜XA0ߐ_.8<ϫ]y8s{(EXg5L 7+UUoXIzfrI9fLyX%H LOwLB]uUf^ [pC!oCkD>zXG_r8f00=KGMqu }vD%Cjnʷ pB!1*Ub n< `5x.kej*/0׳c~yrv?qޡeX;ʤd|bQ5Sh."/]KhGjU:"?`{|R1ѽrBfY F`E'G4GZ?~*5I;Jx\XKWTD-HuWa./CFϟ'b.7Đ4-pFvWBO;o:|ti8&¬FƧ~}v>Qmi꒢[U+ jvQ,DGcrҳ K灺:05{>+CH%ؼu .ǚׁ?N+V;@[ƎUQCJή,vV9*k'e+cON"x]a0H.#b7Y R'wG3! (#`t6g"`ַ=]_@bƔV{p1% ^`*'r'<-ae1ӯ 倓Ըȱ\L=٫upz4ܕ;]^ަcwCtCCҩ0BYY/Ma39V֡fHIFhPK jЇ% P@Vtl Z4+"Kte%(#6S1BZ.W%b)C*aO;V TY@VE@#hjȝϗ #/xQ;W!0 |'w-ߚ㌹E5 uNXVJ<ත|rPh (>#g^IN#TXIs/lݚjoч|}+>{I_ak\y6wR1  endstream endobj 300 0 obj << /Length1 1694 /Length2 10035 /Length3 0 /Length 11125 /Filter /FlateDecode >> stream xڍT.S-nݝ.E )R\⥸J--;3Zﭬa唱q+@<\@Q/y1 p'_fLF0W ?A8u(@ @]`y'Pu1\\_ vcb # AAP:nv~<u/Ew9s$Y9^=@ymhvƅгiu{`` b ?fx@m0]5+gڟ7_ٿ ?A.ή K` q4ոpj;A@VT(h@ ՞5 wr8n7-+@m\P;!0㵿sP/_݄+>V+ф @!~ M_WWc`- a`;al p ?Q^6.P1_nu vOV fAO  g=?_ o. Gт,hPh?R-H7 qzWf=WwyYu *p@F"l[)? kC~*N |er?*qqH `0KL࣐x _ar C Y{`K8?^D0l8b-uU/CŹQbq0wqZ Ir.D=#Y"QgjsdɁL 5/7? GvU7a\"+%m:XwӜ1/g r?39iy͞_O>Щ&c+5Y㍻Z=3 rs)&_ٽ4UyߊUxgu=m +9( 972$r$4ܣ/*'BVIM'&,ޛ&=tF#{&:h@ b~nd],ʋac_[Dp-hڻ7rя~Q=Vds">:vٙpq0GLeli ثH͗bzMڔKq!NJ45'E k¬q5ns *r&q~L]MpA 2z|u+RҧuQˆuȸ{SÚӉwfŜ@qJ;]YiX|<֖um櫙~4p]9C)JKs,}H*{H;UT:l/:v">oH|+͘#`RRltW~ /XΔzzQ; ٯ|?5/$W6UbdY>fTE`uVgGKB}yK.pNrԦvB4 JfN\~(L:Wyf/~NŎN\9PJLZw)zX)^;"ͽe.0d^RȥrOV 7ޜU[`jOa;YU~_V藝4O_`=QZ;Z4,8m%j)?dS,kéKˏ` c*P [MzjAS<ޘ2.`W'(Vp9o,]6=^A=,"p$7W8ꮜ!CZK?KuOe޴=k&w焑xq9>y`-3 lLǮ ػu02mA=^x69ڸ[N7鎩U tC}zA_z4,ٚXdUe+OQN,RhX;?]gIS]L ܶ~ <"ۗPdhݶk.y.'SzTg~/$'ן<ꍥաѭ -(iμhźlJھ8`LPN_?=x/!7rXY,fa!eFvώp,y=ny);?M@2\*z|Y1s2 LbTE;T|E -O 4<(Ά[ 1%; 2-gKdLvPކq2Ypx9<^ PQ)lEd^+X$p*j }F1`^KU z:/\o\` BOWk-*o׸qv˃&_{m.e}011YXtgl%M4%2HFF*4&Z_GI2{R5d4:HK!bTHi׳#Iex=K1U.;k}M=sג֭$M±ae `v@c`@ ~R$j+6eQʌTJ5.nFP3 Ewύ [l$ͭW ^ L#(X!&]SL ",+p϶3햦UEz(?#V9_n]|2$*,r|V%ڿ0kޒKJނ53`k-NH>1c_x-~%E|ׯy~C9hiPM—OE*QʆJ=F2QihfVbvj1$KD'xxSNF, ާ3)( I'ǝ"Ɩ[Nj^|RW_S@GZA#Pd/ (Kb\ˬ eE^M񯝕H 8xH *=g5l_cO; 'C4vDt:e}F[x펐J+ז'Эat'ˉ<2 PcN0hbs^M9NR 7"dv? ͽ'YPh{dgs*qc)IQ=UYt=A H+ fo{'.*8@1`| R =Fjgn!B-ڲN%@y wz5f6O@D&*n94ͺ\|6sEJRZT;qmhw(_9$=Q6E=?ZGl\t1wfOK9C(„=b [ P&mMMn.'V*AsP`BT! 3<:/,)2o1 L(Z_?NsLr^dh1k:w計Nw. }$U# z (_5t^j"c T%*mݑx}KGzKV$;% =WrHd}嘚5,|YGRcU,FM֣+cd YI pn,ЏxO{ȥ\ZC:#8Ҷn`uJ}IdV(4H]D=5_* #E>w{2T9ˠ`|ykKc\CKW+OYq'5x*dXvb{@u[J߅[E>]/e|-mIH`E E~,.*vP:I{>ͳfؔbDTB-4Wxj1:9LL@RdlOR;Gc^Rzh*>c7 Uda=S㗭7޼iYg˶Z*G>n[d.#0U˶y}lPT * V +=)CBn)?mb C,|Յ)s.n[XlR4=,P`CBK{HoC$d?I"YN*4_s%x(d%<+߰Q3lug;^xhY!'ul(4GDD:ޜ d|<"Z65X[I=N+.YԒs@)/OT6<4d#6ő V ΂:Oݯ^Nf`Y |徘9vsF[>\2E ܉*Bk{g(F*͂(2=O\ KUeہ:Bj0<6X6m5AۛN]2sa-to#-&[7Pߜ3V>8X3w^Hl4wbF6ВLn̚}/0h*#-d캥v[ ~Y8bben4Թ Gi)Z(yn{>ܢe9OuSym`0uY/ gۊ`(S@~L8RAf&Rsm3&pe#>%Ldzoܧ~:71Tkuowo^^<*MNX\f(3{%΅,59y)aZ#kpWe#ovt.a B 3xA}ș}!Twz"$ q#e^v OEA $C.3&T4}t$1~tGw%_s <_!dGa|Yd57矦tm])4w1Q)~ou a6b/j5?X,.Np1-ɏG".<<2X'w-)yxE~1ܫKӃMc ::7xWZMwd|쳢 ,42i&Sfs W 4VJ]I@?I]N_3 ͮ{r0S([{㹆-TȤ¾r b{\hJBf?cdm~9qO20xNzCfR1ypm'U9'U.kB Q)/۝@&!n|gU*lCڵC="Uq}YfLL`E+idV"s:)Թ Q!/z5%YWfDk,.W:=2 xAw_?!jնׯ%(&LǥC':i@x4K{ǫr|glXGN{C{O=_OeЅB$-f2ب5uʕm|bm8GGCԂV* NUd3kϘbmf8nu8ZHy쪜&hKAUѺCˇvTKgcc6OT>6\7sTU#iϖt"#3rl VCr|F80<JwD?z1Th25'Kr&\k0rlњ 0$!BoLP@j, p3 |iR/_%Ng|2wz[3(_} hd:X#G!Y ޜ^ʄLˍyJ1 |?֔R%7'3ME_0`yzRUV,A:;S fFG(]m nQ/=,A+ -+(8| ͨ&DE]u5ř2^^Z7&iJtӾS]z"h&,J6yOCh^6nO@Vg/l1Iq[c|ruosljwUYK븖s^+(q2zXi9R,˭P+OS[\Jeg9J"gX hnw\Sӂd5^Sl[|~V0qF$/HŔ9.Þn6ĽqIQ;rq ~lɊTZM*0G9tb#ΈX(.|AW^vRK٩X!-!ĵwo1|hBwil* 'D;3tE1,FA)Wmz"( kx3G+OaYHJV|A36J *[ 3(t}-C CKS`ʀ7OHzdW?bMdbN@S $3`Xddt3 ++M4X2zVLj=cv,No{B6%W [8!\,Y"j^45*o?pU4IvvC?GNfwZ/%T_7/]r5KC_PrnRdȞObQjYpOک |TiFԗpя7=wuz_9Q݌H/[s_{M%]oYOffZ ,=պﻣ*k8}k㺑mهKwb"<_*P$Er4љQ> / %79$/grxe"cj6T;EיRn̟@ _SIpKPz53o.L.hO'i <@!}#Ol:Nz`ioޥJbY6Չ(sN lna `8Ay#!2.C| =n~/z1{0*B;~]TO,-lAD+Ceޫ۔iN.(?OƏ;#]K2|z҈ғ3 !%Y}i[" .jbH>FmՒիw n 6'%d;7_4"NgC*tһRl8v9aRK zah:o7)H1w%wu7"3fM Vw'Nxt\^NnKmegS!*:[(`D<ǧ[B!u+ |dݳ| qM#n1W!ni =#xh^\ًCJt8aTEF5#A2̳O|?М,M^M<xU?ztMrѽAK sdbBKR7zYQUJXH~:6$Uy?n0yN|:i"^)ac$h;D^g(;LIY Khw{P`kR$`ю<䠚>q- -A`Ԝy3ԒѲ3^#5OWWu\Bwfd:=C[c*ǬJԔz_P[8Me‹FK։o*ENMe]s𽺿k-]u~Z u"dqqʕWQ=e(tЙ-5 +Bo9HpY>wb:F".)hv mָxzm-:u)Ar6* {=oԆLur{1L+x.ÖAgbsU-2>aV" r[h|qx/&Rdo?zפ:, o"0_<5ݚq 4wG/tUR+}vI mf֗ ?d. ί\xސ[\RѢh>o'T&? EU|(; }HdeZ@TGVXoaQDǺ8[̞45 t{CH@B{&Ue -IJtƭ]eҮES,/a #u(ԌX]] ƒ(fYr(TFpS-k*%kb?h]O T!|ڮNj8S wBޅˌ2GU8UV\]u2cM@e52\a/`bsn_cW) 'ص't8nGwW^.5&![;V]t@=kҐꎸp`r#M=TotDveL _N5웄lJڕVib5q>ZL]ǀĒ ϵ gH2iKrc4cpqJ*9!#MXmPaJۈ-v `eԍå|K JڴPACUȘ`3jik(2}/=\/ I?݈%ACKpvnTnBb;̉kGn~1S.lf%mó + /UxBZO\R4uܨ řÎ}Ғ<,^>=Oߓ =O'ms+CbKIn|h  ;:_#p>J"-5tE%qgGT3<$,$;{tWJFe-B~9gVN jj+&ų9cOT!L[X:n[Ƅ7 cdX6Ѫ+;x_!e]2qo K %+FpR'ݝ&i(<'gn5ȅ9fYKTn\WuYo`eg9[d')/љGA@Ϙ̋>+h%k(@fRR#$ttyWˆSc#GA%R !ل endstream endobj 302 0 obj << /Length1 1674 /Length2 9690 /Length3 0 /Length 10765 /Filter /FlateDecode >> stream xڍP\. ]Kc N. 4ҍkp A,Gf̽_^u-_{}kסRdZd7vV@RYrttZ`7_bT:+  Y&el vv^ "2[Y PNu{NW%w#li(ق3Z;4`uss`cd5wte؈007۟@=!k0wVNl;H^/g?2s@-ZN?:AM֠?T_Wso#Tvv `CP,YfL/+(?˦+g$$^_NN 7 w5s_UqXC|J) }&-@Ǎ@3p#(7oA2` 9e@T*w3qv{nO%sC@jPW[y,ogF=/XB~o7L$nn/*Z0u{v<(/MO`>F|@?74,F1- GO6Av_f/_ f/ ` >b/_e̺*Lf-0Fݫm1 /]RQt r*3{i.vHD5IcM]*Fۍ=U,7^1D&nNFKy~BLYlWiVF굿3.Aҥo/6qߨ[W[{\W^Sk\M)N_ H͝szd M~%O]o,7Ԯzʬ0Ki1lEL^FLb9G3uP#S;G٠l@,>Sq$i0Tя/j?mj:5ӓ/z hmވY@037Km}Y`NqZM<l/:oR;xum >)7[u8O2DU.7FvK-"g ~|ܡVXKt1c5Fa.ԼO<FeJoqdlL+Q*2{v-G2, 7ҁ]٨~$=&//e|L=,X_ ~JMԭ2 wH#UeW2E.C/ui j21ZbLÓLss'W X^@dRہ˗jN7QeXk)lP(%ee)Pľ AO(j8sLE#2zƌDPA3TM.d쫛1}XN524}VE㾤ڹk㺖)`R|olҬx&VRaeZ}[AGnTg~3LH̓l+-9ql3IWyU#[.ӴܣZ>ד.It ,z;T;iyTy/#R<8{iLЈ2WD6Y8K3Ex\|-QM 9ܒ\ծߛC(-uPc`nPqD*B+a)Llq "| K~ccuC4k.wusHv(sUL~,lqoրϘ"Xs;KRlF&lybDhZt~ruizALvV8L@ai FEBaF9!,oug0{L%S%{.hJ@z{ԛuGB/2jf*ok᫂q؃ 1z° L(҉MԺ'v票d!Y탢[=.v6.,'ɌVH=-|86p3'dsQr%pcEdDŽY^j%1Ja1^E=9sO_~,qu!j6ҍ+I+$FkvW*f+WD~WZZEM uHәj3{}U k5M\ˊ V^<)r yBVo›9OXa *ܓsR+oC{C~:pdX~epA tbSea]W~__t-VdiApPNTvNL-YۅrIQ}Q_+ ۴8ˮ=n Rc"~{Ke)0iNF-*ԛ =J԰#wbK1ߪ}]K-wRQ` T?n3J 2LirDm7psu&$ NHZ}kfc~8_y45k$@_C7\;oeO6sabOcDߴ#qC SoѼYwz_`XΒ ,mP&9EPfi2T?@KeZBzUI+"rگEF+=XLjAS,Hp-:c=enMSŸo#V*{'n[/2,G";% $pUEi2xM5=ξ̏+9huR_=h;z 9bw^.Xx Rat4ZgcCMf79ދ =Yiܾ,{; 6~@P5>գoL"⁑!B?QODܻg8q/V D]9W 4fb\fזp͆Zc>vczQ`FYʣЗ-v(p{I}vAK0%.8aBSGKSrUYfb0Fj"GV(sxL,v@ze4YшUҊ <*@.K =LkhA|;냛b!p !}Jb Wm{c?^&F&[nFCo4 4#`+1BRC.~*6Uugg)# poK%@ZsJ>o ʊjz:vOqa33/|SmˎP¿}r2 bF Q D1j_HTbjJzC{Z>z ~ ږBwG37&'jFvx腇}2_|Wc0// uWWpWzC{y-v1ܕ?aNZ=`5/2RCX~6r(B'1A=&{p#N/{Ls1VRjĺtv7ԟ赶U5nwX*y۶ IĻ ü\5f*܇R<nȯxBnȕ%3Aat֫-AӇmps U:"_Afp =5`6::C g/+xQ c=~iJFvvWG/3, ̎%E nrESpI4+_d)3t28!ic6fvGۤtJno5ѮҾAɲlո4i 6i~"W=9 )(7 iO01D3[SH,%]AxcB)(߮%:KN!30XO$&놌8Ƕ0~~GJLql`^s5sGM8ŧ 3O^%O DZi_ YF/$Gu1*ɐDy_EݫJp695I"7oX "D1{THY9Su5?g+@pLl.CWhP"ʀx`2[rfKvS 5gB;^RfeN)]2Zo+h^>2{8e8,~ Ve:xDcE7C~O;.U70 ̬މԤlA + MPן8DR2 R ,Q9ysAbF@{<ドVtzWЪ>eik#%1LAKCxE=tXNԗ!^r$}D1 E{e9f:=D{<1riJDcyb9VMZ]V\__Bfд$q^E奖 E%7oŊw"j:6|O 2榎"EsGOd{IA [A?\!: K"y)۾Кxx10 ƙJ屛3_ZG)ڥŠ^asTkؼbZ<&Zx);d6§[ wiͶ}нJ{7mhj6AgڭdI$|PF' XaѭebaFPtv;TLҨ*WCw6i'cfJb4a{YTOt^|IiNoi*99&֦eL.$=W G 77DZ΢p{OG,yL4X׎&cQStBƥTrb $?]}*=VzR~ban%b#qJ"07 QoSl_qa2sxis! 2|O_K` Ud*CTJ՞B zY & kdOڋ+&(4sq@HUKס%*}ʟDtc=;KuhBC d!c#v3d>W1}>C?p G'v3z ɰfv쁻9޳潇u/HKT&ߔD.갵k|~aJ`-M ֛Hh:?L):WrMا!bmxGLA _$պ^ F ЫፊC )B{bPVT%^w {ɤ}wMtn7M8Y; P@kZT-o_Nk T}B瓴l\0ZD#HS4nUc3!cުv#o,xY@N|\MœN ☓'O}cULWl蟖e&㇯a&4qbo%? |ءiLT}K{ $^'HR aǕm-}['d!悈6UGt/0~vbRwFUZ/Tg06 Vg'.QEYX<`n6F.d-_Q^IxFZ1w"6JȕދF^V 'Vg:<Ë ȫ,uc%uԨyI-YVT -B1zZq>/K6|znƹ՞sS!"A?6#JsW.bO邮t~%qS.$+"_`NV&ކR4Sߨ/ 7_# oj֠OBT<٠I8jf٧:skDҀ ?VL+c}u/ /VbͨM*żsƳ^g$o5r!: ~%Fxx_.YekՠA?afk{Dx\s2ŭXV a#Ɉ5uPFƳ[ka_uy_x3iӦ!˙*3 |.\ޭ f_BӢK(]ʊ'V*L9pLZ=CR#uSZl1F`2~r&;y=g= )EuErB}=D-'Im2%8)T/FV5Iiʭޢx$*")S$ExpH? ҹō`llmm%v.;FIͣAtO `C M,`ۛqHҏ ũep8eğQ8j$"_rut=`Do>a㼤W.}GR~ش>ǚ0Iab@ٷ_Q4"_ w sV#]}Wqٽ[j5δv̼\#X_45'01mE9%Y (:]>lI~CչW3/Qܓ֧9ng4.h 1>$g}4S)zUR5YL+c^6y_rF^. u50}?W%\uE{g.ٲ̸||gxzE~Ğ\~5-W9s"ds,r{?QvH%ZR)Gv\IKJx Kt:L^Yv9KCS1UE__Ye kd'ʕ~;L|GآLZS3Y.fM4r=OJP4^m_h~BךMGrKg zq9jcrW1_ c[ÞDIøT=6%kX)j$D!e}C65z'ÃD-Y~@'Lf?'c;3' 'JnzbDk~эg0}Rk.ɑ`2[Zot?S5&޴hǩrJ;h TiQd]"al' .,QkyssxRiAca:.ȧҶچWz.GH WjHʁ?fPۿLSz [AL0Q]{H Pumb}0B#7Ss8qt[.s_H1d7}Ḹ@_vTI7<:Y h<6r4vpO6$_V:{ ]h bCϤX!C[mXrHuwN[ qrl۞ų.Tj+jxd:^sdǒGߨ:H*ՐdG-'t|cAe,AN!Xg39lztjlg a`*Sl#L"ʉ&5 CHztL ½N_ ]y #GD׵zw&_=J yST҂_MVKqR-ԻIq~PgN &̵LQN:R!=mU3c}_|tL%!dܣ ԉQ̀Aࡸ Go?xАҎ5uHA}I{u)# dVzj*y ayx;w8)#֍x۵iIPT-OiU{I%Q467nցE:(@CHțٳ\j>ç;~ڪEX֚|zE_X5ˁB n 71|> b]HJ-˿ @W#p~Ʊ3,0OTlOK&4uv)m'~JvgiP\Xځ*!9ٹq*͏1|-;qR_HҬ# endstream endobj 304 0 obj << /Length1 1373 /Length2 6096 /Length3 0 /Length 7038 /Filter /FlateDecode >> stream xڍwTl7ҍ #FnPBc6F74 !tJJ7H! !Ny~;;gw3 #E@5}I$&f0/- !ˮQ:qG:n1,d@>0G@z~H S_G "##%'E `8@rc*BnSE# !+,+vB y0 E@ݡ"\`^MN(_0 (`(  w"Sm=_Ww'!;`nP Ꮏn^L< s;`4h y`n'd  GyOB0[sp/<௳ {Goas8FE3@R2'Nnc8aF/BzCA08cPd#ah5<'[ p7\f:VIU @ sg#0.@Ն;!25ҿy&/ B< H|O ݿ?hz6V;o;( ]0ojD& u4 .A/oP#ˆahxaŐ%5ovJHH$؏sI #a!8 ` 8!$S\ y~+Ș:(_ H$f_NCh(dn|TvVrWpmDafW0`0:'|S%=W y֫ǭo^%%-VK|GLy=3"C-MnTHsQ ]]0=f^-KzY6!`oV X;NKG}ts:oU'$h'A8jU4|LԫɊ. 8WFLPi"n+64M,lgA-tejq uY<J |~ΌXz^Pij<@E{H6̒z*֪r6YwW͔%IOǘ=OC SAQ|`jo0(97!7q3TX ~(r'QDREE9/$6Z#Q QiqJ :uܮq=.gmnXN|\2~eZ/ SߴJ*K[ "`AOt>>{{\S*gȷ ^5Z踓݋|lQ_tzO`Qcvԥ{c5.qv]_$[7(4$ZyP,l#l}"kU[/-uinDdH>pG+fܚz`{AEWrkl>^yӏ&IqTt>V48˳mXmǿ`Uޒ|9]\Ti=&Fu^V—LkvCÍD9)'jgVߦYwqHARK=O՜4r$.4me] 91 ts]4)Vyv!9_"~ d|* GM5jH3l=xZʼnĨ; i8=GH=y[B~u:od-t$х>gv-VsOzmvJ/11r QqΎ!enIdRPY)/;<Ig^\]RKlu#5dFTڭ`B"#ֳ{ 9T#t,E/yi-i;Ǘ dZiiɒiRה"& NJA3(oSK˞01/|bCFCE@7{3ZlR}Qj5ʊA,Qx[4GG\8Yg3X^b%MƵ^8ٱڰ,X斞Ѽh,[gp0ߺj)yq_DnPOgYҷXaBs+n;'h=uo ﱵUtxZɷ,#&I0SZR=. Ӌ)Qw([r}FsVoȴ}0jg-@B!˓Tn]/Շ5)ۜZ,$Ģ'V6֪vt}v pgJztCXL Aw'*dw~in0>jBL[=lz+A`FR~>,%fC3f&n)K"ֺEyFM *VQg)&X*pǀ #Ȩa8@Gg_(*1lF V_Г 1ՎdT[E+bE蒋:y`=.Tfvt{ }LTzJg2U2f> <}՗'CoB19BųWFsXKUw'w)v zkjsȃZQBM;,/o#v6>,l "" XV?Ɉϑ7AEY ?0Lj3U5{ȜGͧW #M0z^#{1zD(źMU>)PY [5οДEG>>PۏOj:-%OԾ\И~\8 sXƭrH/} L^e}NO.( į{? qp3;|+q,Y|(G^Cq/&?gIU~Hgn›k-W 2K%#[j^%M#҅HDrin󓙿\K5r} я;9Y4TjP1c2>ܒ_hL[_^:cKMWf}pjgݚ7sD0T=[X鷴9I UK[yV$MyS8gIYܸ=̈́6*w) ]I t)Rut6Wp8W' /FUT\p+s?zm'JUDǮ9WvMhNw/zY -dp ќ{ONU)vf63V{dHDBt~A0u1WcΉ~f,Dǜ4/kn_vM (mF簪ŔK> 7k^?~\& !i"뭆l*Dە@NȚYRGEѮBȻ .Ⲩ+CTZm0W(dI?r>aV1|R43or/}Be$yى9ْ?N >#~H1*3j07}iON!zN$WX?;Av5njsϿS2PpMJ'OS_>k:qt3 NOߏo8|\n%T64*xƓ䫂g@S[28$7]oN1X.6=ߛ/$9 ţjcb!+Gfd$7t/y5:)vTp<^!cq! \8AM4 Xy'Fgؾpkט(=9O\rB['B3N#y &u{YfrHT'By^$."ו3O.`l8aIE@\z1~W<<iq9<ɧ>}X{ǹg'cԀL|}3usnB\"އ_ QI0,p@v珆ϵHkgiάphVoӉYJ9abV:Brc٪=]Ivo-b D'񎰇l,bɧ"صa{^6W*8{m;J&i>e -`G ? {+y^PZpvy*s%gSE| 3IG$^"汞JQ~e!72}{D5>Ju.Cϐ+%Ҭ<MHE_dq uh;߀TF J4U*7-"yXz(!B>u|.;֧H4]!:H;AJOqNJwOWXyRjYiiκriJ#nPQiYA5Vb w7cfwSY~8UQS!6s8:&*,p>G5K:"{ '2x+Ԏ1%_VthE1myZYDbAogogܾ3,楶`U._C@襼֣x VQrw7?φҤTo HW"I]:Xh@wɌ#83E*4<;;A x3Q=a×@ ~Q8 54~lFk+m{lv(V?mxnnNl:"Vtٽ /TnkΖM峣q)mF[6Ē)CFw?YIXȪl](72)-ORT,^| [nZ5Dlqq|M> stream xڍvTl7%1:I(nI 1 ch$$QA@$$.%E@RywW_}~uc3QUg\ ŠB@uCS ,!XO_Z8F/:uP,z!@.X(+<08rc@3]m/8/gD_ "w'BCa04 D\.O8𶖁6+;B=}x u;i R5B= <Oɚ(gu4 Ga}@`0G: P.GpY޾p]=*tp,P ȁpo << B{]#C.p_x) 3:](pd1]0x ';<(Y.HZ[B68Qqef1"X] (W[W~o_obG,(ۂ0BoGUBxb7DoWK_t5;#|mBPEz>Z1 s *-~}( /U0ODο%.% b0@~xI i ` H CB.h >% [Gab0x8 aI4=Wr)Zf 1-4d/s"1Gt5Uf/pobRMςRLGWS#mpQp_x߉ n$l1.d<驘=jRZhEmD8 VR(^C%^0 d+Qg t2幹O; +!Ç8 =O⹢q[ߒ8vڡK2 W}\nQ6 Dcf2]TUyIvp\ uyΟɨy|uI:.\:4=̃?nn jnj-7=. 5\<~UO9s}e}6aHB@: G!ZX1"-(q;E}Z5eРrz-i,l%mղݚr1SB sZmB8$)UrI1՝2v/GJފc{vmf |[˃(~)ҦPݯt/}5$Lȏ2l\}%6r:JGN~%@8>.X-z˰f7*sonή?,ʧ?tXFԐ!uxNMg@ϖFy=iK3n3CHxN~MsL`xm6agA8!ZЅ@q.ȧv!@+LkFm2~ϊe- ; , O}]F64]a4M:՛ @G+&IsFROr!_q*;0Z]ǹmUJM3 ΊMQc_SNF%ED"ߎ5+L㖷24jO+9kD 4w| $o"Dž8a#Ӌ؛zg]1<>^|HNTQ|ƽjHp8~D/g;oI*oސ^|bHC)پˡ3+~_: )Ip^ߓ{(Ux4ei zV[b[hwe9&Ӳ_>9.X4VwO&S ؜*> g}YsrN%XA{]c*cYJŏ4_^? AxBCy޷g{(rGBtY!NvV컘WCJ+ܒ7ȵ{1Ŷe4 %)Ԅ1jɰ|~̅o˃qlk]#fCpj7~`d.&sC'-M7-*2tS]mepWץ>D,OWniLT@FFD{kqOm.pf&P4J_M|EtjqAyM⊒UMTj~#.'1HcH,.[(vKl4i$1&DϘ)6< n˛][$g.7̓?>n~`Go*q/͎;*w5We`GuX5Zv("]zN|Hsu8nmrF^ɯs:Μ]~G[qU+ҟy ޥl]5jkܟ5ѻL&ܤҪ2#ygWxyAԶ._W}`2[hV%!Ҥׅx0;m lew|CwVs k1md!2U*f[GyYa;݌:# gD^`V gOl}wX`[^jo L6Zaumu}x_p$t\1x`Wcؓ`ܫ[l<{ySPen~ƀ(=4{ޕnһ6gצ,e9Ijl,_n Onkw^ޥ>Ǔt%G^w~_8?_֢[לT>͒@)5;J?v~ jcSۏ$SLʁJ5@+联Z=]Hxt50ꨢ\_|J>kdsۇEW*e'M}eRt8ݖ)"%W#_G|يVWlW;Q)zcK_ pu ;- D? gKB([;}r mEJ4>sYo0 ݼjl3r m#^lS4)JlٞPxy@c:xFf̽$K *!j eȀIe^+qzo3i);\bG?ӓ o*(>s?@2*1u>M NI6tB:S PBq3EKx_K^抠-/WCI\Ow8׼NK\AV EwMSG'gP;bەQ{m=X~y кDP˲B'XꝮVKZ&=߽'[vody_=0֛i27KUΝٵx/~MUCgiKyD%,, Wk;{ME^${3t\{͌TfKI{4'-Ʒ1Ē!ܳTŎFm`JHfj Ki Sh1z/>ɉ BJ{2 j~: 3WD m{1 ӷ1$桳! cR%0:߯:|^4ĵX: ;hFJMh(f7ɬE_6 鐤=!B(ټ nER 9N6 2_q|=9k^LuЉ#nf&/W6$~ ̣#̢{u=Gb# >=\/. ~esmZ ә[{wZ ~ p[<7?as:YgAh' {!Y/̻|,6nFdjxߨjK)q.יn9o gLvt옇麵j#ҫ3^4"rli ԣ3ˀkbgӃRk-ρu_2)K3&C)!1J66΁~ۅefR%|*\-ռJ՗ #^8UVWsJ`u T>&gb^pj娑dK{ugke"Kmi{ҷP_) EbVY-F] :qto/guxB3hFP%G`t0kˠ -䍝hFWeYOMTq:&[ovt% gu۬!'?gBCՊ.`)(p.iG:I4.#dŽdٖحbԝXpaAybFP,r%[L-x\^-eV吔UfޟIyM>ЪWgC?)$K|FTop\NSܳE}8 > ȅ9J*~|"UMcu%F%\A ]Uo*$Hh$ve{E6UY$erXIX!|?Fyj5`eBEd}Xܭr3Rl[5xZ=J?g^ 1JұI4B.c?3{ʽgìKmϝw#zQ.l[]\Rt|ҍKɭuB!,e>ʒ_%g>2>p |mS |^K-/kUj_[vd~Q36[Id<@ )=)5Vxv׫S(ȪpEHs\`~wdpu-.F>CY~MUq*kw ӚӖdZ,#9 wҎkz o~F_vzP܏X lzh׋LsNsig#:0{~D^ΌUP] Y,gu7]DhUrzb;@}M墄. _sO=yQ$% ewj:ԑ6#ٴ1+˥W|p{7UV^0k'لZNTC.#AlDu,"Gn,p|ωM0fy&)+n㽝pa+`Bե,S}w۷'[э/z!slUj944! JnX*ӝ}IP-GU):=@?[|;bL#Ykv/3|kWDtY h՗NZ!3k&5c:$j &.k@ǽVPfH)~ S#^ݭ*y}G$D B*^t7J5kǪ/q9:F1=P.O`$D,X-\:~⥙_mK BCL1+4:JJ9l7"P~g)8{n2ɞ N⑝4'B6RMT.XJVs09L,ųhnW'qG.Y,Dݟo;B=! &meE4E1RTmw$u[3xtGB<vMS㐟߹R.ѱ$CDE%~zKg?1P endstream endobj 308 0 obj << /Length1 2212 /Length2 16388 /Length3 0 /Length 17719 /Filter /FlateDecode >> stream xڌP]k,5; n-@pwww$8w.{WuoQs}=ɤ"SQg3w4J;:ؘYjVVfVVv** k)с_z  ]&iz7SttȻ8ll<vVV1ttH[@W* G'/kK+)50X8M@V@Lf@ A+h9xxx0ػ2;X 1<[X;[E͉E ('w%beec@O3+kx9V-~ `Ngm|j\܀~>Vo06Lw豾7>/E^K^AKoU;z|8L\6VVbb,X9X8IJn?A߱;\f?.(/ v[KGkbom{{_}G?4vZ9 9X֮֞@sk?\v8ZPLlG>UfKV߇)`htsqL\\Lޯq|wXA.wz~ G " `x,/EHXd v`c*A1xw??g_LL8c'?t}T OS1x'b[ tWn. nb_bL;?ޭw{6\m g/^9Qzӟ\/;g?ɼ;;/;G?D*_%`{OWx@{k3G;c{7 ʾ' p{nO׵{{ |g{$o?Gy5ssqy[O߇߯F hh&bSy_+F?-@1gե6&Ӗ˭XX?])5FdՎ'gDo83_ቘ4D8jBS}qvEQ)l*_ [WY|)V3F?d*4g D Gqቺxs7F*ȀwQ䣻QڋOG y19G#~*SZ25c{_IҐjK.:f]6ɾ, 3%O+rO=\Cz+ϔ~*?g#c|ǠXx%“Sf _9?\d'i=UXTƞ>)d^LŪѸnv@:()cVWMԉj iX%JzBѪz01nE ڃ"R1ZHM61F6>jhN&0A~v2,MgGVñL~YJ%tѽ28_o<yGu)` a2deXD9,pBNki.C&ⲖW)ZЎ& 6g՚;6"T`˾=ئl̶ҍFk54Zf;ZR4ZI%fC0MB>W݉56r iT qjh쉴 Ws}p2%KX۶|kXW@RQ>F&S6 <~9+Gc諾6֢ש2M ^Sk\ov_&Ip`+1 bWN. \KQ'"D8}u2;8&S;s 1 <0"$;I}ɽPqߙFufT)l)Tx3&fѕNŴӠ&#Jb$z=12(.}]s/Yr.4Wsď'5&"}c$~շv@lzJ:[묡 n؍%6u?W 3?8|XA96Fba47 oy\t$0z|8WPlXFQܚ0{*jܞ!hPX[iϷRʞa6!Vtc]DKѼ#k>nѡf@50;W߻itѯsLD6b?M1x!4m8:7.Q@0(V]ӏC2_a1φW#j\4.m$+L1-swNoJ^+G%cbbh*}%)ɵU,ۙ)>D %(~mmdsIN0 *k0CԆg#[j] &#@-SH̅$s'8q+\8ʃx7MxDG"Ab*OudLE?x9om2o ;4c%C aIc2ב=)ӛN,<gS&p~T$ pno!NigJoN|'i zȺ68ۉ$v&}\u]g4g]"Hёms{;VoC˜u xT\7m?N+*]gt]"n"1vYL2>}NbFRηg(ʽ^U!2-.f?;O8EΟ3 irQ@F~AZLxgh/҉B uĆl}Bq!HŭH2QfNQ߯f`j@&J0\ w~/53-,Tƌ8 ֹ'h?շ) ]MmL(|sbϩv胕l6*UOP^[&{`rl:;f)ij,lU>*C`Z?{-/OD} ڻҮgaKй* 4޷^Q+ilLI>6ћ*<=>#"NUhȒ6d9X)ZDǀ!NN~p ]:= _ZSDFNijǍ25%ݝv˹k2ߘĔ&p9@En?uqF;v w*{e&Ͽ0VCJr ,<Ȇ-u箫|vgĊh-L(2:j$oM!ZX Ƚvmg/,/Hz#)( #Hm0q/"%D@ =j6p|dfJSLSMq&%?i^d9Ҹ !)Gm۞L ڕJisk7?a G#Wg*XZp69DV3{`11& ƫie0$=<^o|/M6ڃ7~ ѽ n<50K->&[/B3b-́ h2˽T,uS !q(2na_Jɲ Nf'-dJP禓ͽ`6 0XA]vЧ?+r'٤T-AmuD駜wf"Xۧ j6$"mxjE5$AjIihAV4OŇt`,_/Yk-_/htialPPeU e([~4aW}zHgIP˭Q1j.JMgS6%)xd!2<2>KU1)&R8VO2 %!SIV3N7tka |lH ׳=18ҾLmB=shzu'Q=JbW ^gTA󰸆zy &ު[˔a8Rm%"57g%p`(']0 *]@^e4ڼY#}ί;z#ʇ:! VpY{kxqPn"1&ÞiS ba}F(^b45g@GVX}ŚvN^LE̙]'ϒMBcFp~m٢8D~𕍹p_$ {5jAXtp{ǵt`ڳ7Avbzt=fUuF&_+qYma|?b5u^w«a+UFD~Sݠf e!;GaYA%JIu""VQ2Z Rd1u_mLM뫧}…JyuJ%yUYמ6,BƘ%gsxϬ,zWΎ? r{a**͉-?:),ޕ!|CIj}>˭Y,z8vh8L ~ހ \J<rT p2ت*Jxkε'J;=tqܡi5 O-:ըz/9]xvxףPax=+(>Jz`=f`͘k7O݈hT4HZP}~&)W?28#U螜i_ ja3gd1C6=OԤS)y\Rϥ4HqiU5|f>Ye F%`g{ Hmg 8/T *~Dm4lN7\{ɉfFőY\(]Hq O3lzdd1 *bV ӚV8ՐfM:mYn9,KQU[rj׉¥So<GF)b#M¢.l) V{g:?H*Y~! fNi۪\xՖV|S +˥ɤМՊsz*mJ2ǵ˧&Ѯs{|Mwbo~:4, olY'ߑQ6}1t,oySr6|A)8 hϡP+/óDG~.g*n*stxNxf1.2o 8٦P- PXmNSlo{W) 2$ll) g-FSĬ")2Y57Q p0|ܺNLs$823n_*N٩I); jrW Ѹ ~޼Ub%r'6UǠ$zk~]{9UmwK MA_ GxSrEm8v><ߕb;;s[X6GElМ_Ɏ4G RG2&Ù4PڮLgV*ZfĮ7qs7`򯨠 xejo!G*XICy)$)d[ݣY Zhlfw)ޔ`XN/J{f B!l ̖$bt5 ;[Br,V9c|7!j ˴WrNH^p̖bA M 7E4/$NumZi?W6G?{g=W2JrTShu*$7Knꋥ~N'4F߈ySc;ѹ]? rqkԞjPҎskCk/CZYt\["V MN{~wrd[5;yG XWwK Q]ljܧ]uVh4k~ݱѡ%mH&b 5frA+SFzlg)4&4<,:3v9-i,ъPPa7<hٶA$H=R)Hvpu|g\ArN`2 v>S%GD뤛GF;ڜ+zd|?m>Кn;5.,w?!Y qpٖG~-d`,-25^u$Fi`:5xGw Ȅ"``,"b865+ݷ~p_q5'>7֞XX@ޥa*g4 td!?JkH/7}]1pky=mFe@֗L0PfsE؞~ߨp~x&WA(}wceۺ]Lb.m88kP${Ɍ޵<\+u4,\0;-( pvąj{`w O/K{7h4\DILNjX/.ځwG(jY~hnD6b zшfo'J Y3`0w |15*OTxu'pb|/lT L LI_Z ~в@L6Ưi3%Ƣ m]]",&f v9Y`is xXlr'ZF{Dݡu]d㍎?U6 C9k5oH1&b0 x>uxao^9|jO=?GS 2$B|&F:m+W-FȦ`m<`]+.MW̧eÜO /{ϒ0,567g82ݤ?tG!mL!cs^/Щ}]5H TR 5srcVYYyZW~5r/^_M86}VPHn{~Mփ'` =l/.<?+| ,b݉wK3]UW.o0sr-* U$#/ox4OAMR=j\l tfOJ51k ʛ_#3 宁2vU"[mHfӠ~gy/Sw}:}[{S 4d# *)-d+&w(4 K\:ѝx)J<.?gVǮh̲%nAO8zPRMy`:ߙA_/T]Go=K)T]Wgl:afǵIDI+˗{Zr;C$#"L%M25 sס#-DyZ-Gw6t,3NоK{/'uA%Al/uQcWy{\z sG.>ixm~,Ѫ`ݹ֯S²"<2r? @UȊa9c`G4ƺ72QXhXȕa*3$A Gurwo8֌ޖ_Z_ ^0U>z#u_S(R r˵%7lίnxvd ߶̂b8TP'=E$ZLY"z~7{ pH%{fTHqK~j(RX炏˼EѡTP0rbc.6sG;4 b[Dt671[Nrъi+sRt8,ewoFXr]Z9G852FB ٞeޠpkP㉔gԕP^`ޅ'M~iCy4Ö=ɆW//i_f%ID^"ɼu%%}DRvD2<8\"HTHgs[exR`鿿$#B*Dx~adoja(G0b𣤹6MaJ oKE$ݭ& tjV !:!?sˮwb:s /h֍x\ځ٭8*kb?y&ynGr_ǰ:n^?RxZ<}R#׫VJEut+[^(|ɬ磣2tQiRChBp\+ i>#yvSMvǛ|W0Va?ݭ gW}jmMϴxkprC )jsNFn ǻXXPJYEMacRJCjac3.6:{Zyy<L_Ĥ Uta\x#PWWtZþYZctp59+ኗ'bmk~&Do/`V%=s _@+Hm ;;wf&N#+drF|h^IʭLz("ܱP Qï7,<ؠ_pT~Wy/7 ">ڛF﵉4&E7ſ|gD <7BPn%BؿjsbJs8cW7~m~f:6:Δ!%GcSv `{CBp2$vW]JX leb˻VTS .|?S.`%b-&`9_q.uqFX0AaI34CɌ xEm姕;AKѸu㙓( l`pKA1ޠwYL#'q^(F}Vx̠;YaE;`=ˮNI/~uuK(ܒ/NXTpP|Jd ^ࡡrk2ObBoWaQ*m EAum-: Vu$1tW.rzP5sK,ooʙ1!g("=ta:o[EEYHrob7xGתVTw/0dڧۯ1iæn4Jo\ arevt,ۿ@Egת-.3uF+\:Oi ;CtDW;}ȸϥ8-17!uS»eXMZXQZ 1bTaJʖT$bɿbvj܃W4Gzu'҂7G6#TC*9DoyBYq< ?1y™Vi^>=gsU >cI%JT{>n)EU\4?>sI81bxOyqniU9]&a~51*VɓqUOўPiȫ;g04gTB$A]6{o$1;xFO\u5@ f~TEp,˰]\G8062%\GhQFo &J3ɲ;?M?Z1VVQb]\ZBY"yUo#7mq. HPv=:Px%_AbAqZnCMU)8OHQIc ϠU h4g>V9,OmPHPצ&/G|ļ"ɽET%W5e#Dhq2 53 tE'ɕK[ތqL+T$p>mģK*Iz*]Ȋ; b Cx~Zmnf@/֜cG{[z0u㦼guҿvETLqau۫]Ȉ L. >ror 7k*.q3gݠ??F_N{-@M*SRLǒl ]y:6j(՗{ɲNԟ=ZIc ͚N@v@[8p=ioRqgMא_G} Ɗi4 S.R\Lu&o PsueH95X9&fjWy)s.мqia%,IGJ_zt&YI~HDž~€8ϼ$\>'gIiVuլS6bդsr!YT Qt@gp6G၄ޤ3-M]Q NCuKpUv3ȽRw3>- *^S3pyǺeJj<]7&A%)nm5_] $nf \f1=,+pRKܴ<;^xsvlY57ujH%MC(LY_Yj Znp ?=t]_F`cuRH"(itZº|TXRYCCEN(H-o2K+5qw*{t)lK/:BDBL-ҧoT5 C'@ ,(_RD /d[{'(10G$* kJ> stream xڍeTJww3 ݝ%C7Cwt%]"% ]Rw>{?5k1{j ufQsGSM `cdac@ְp.֎w4 XT f` 8+"0q6(HN^.֖V ЙyR]L& +=أ@to@ 'VV{WGKaz&5 t(Iae7Ka vf@W9PU(;V[ Y1߆R613sw2qvXXR , O#X,W&)QU 8djbreq%o3BK:;@H㓰v+Om=|` ksߩ9j:X;e%#&!YAn666>pco'^N<|T~@;rq`nm-XcX{C`xhV Ee9q1-& a`0sprxy<<5bb@*`;^p?{B_[J̻>7Kk[17&)7;$+0 x@uPt/Ŋ@sk7˕B<,\<]=* 3oﵳv8Z>5fv6-/JUqpL\\LC a/9y88*p~ G߭&?U`'U*z*UA\qiy& v W3kṕAM]LloC'l3sw.{n px~#g7to8 k?َܿn.RX[~-OYy9Y%Y i/N!`o S`UdCvp7},|X/-vvp"N`N?xX'OݹErss$n 2cSU7vpT# wsw3q p,"9V _'p؆ۿ .k ؞׿ fw fn.ࢁ:_C!-; ԇv׊{0sh޾s!An@)ؖs}K͑PփV O dÂ":aix$r@7yOCw(U挢VZX| K=7^wY Q`WOe;Uّ. 6tdZ9];N,1Tpi$P)N@X7/Nw]=LEWLE#wK Io\xUڣn})Rc_ndc <'fBQ2l-) ZYwXDԗq.k@~s_RJC3ev`Nl`@r+aBq1TcAhK;P">g_3rn 4 \Ȧ~ 3H6^rt^0fH"{0+4fz8DkQC'-af.y8M<],>4WB 7uKQ[驟3d%ҷq mDEhr c 7Ã}-&'N4j=].09Oh*LȽu'~yFÏ7heIXljY#GT VaBjuY;!,.43^ Qțpf oKl7NJK."'$$b@jhnꖓ'VT]]Z_h>pE0y?%"}Am%"WdA3mP1Yƺ3H{Uus-^o`n!&~^{eDfh[SxYDCeJ c :I ÁF'f@OE*_ޟby?WaźB#cTRXK3ՃmNK^::HE_{#c\d~ԷnEol|m {$U}C[l(?i9YPg(WLpɁǷSD-,jDGbc:;эJ)OqWq1FK*mȢZUCoxcKMdD4Ž"{a.uSͤص) ?߲9Gu9:\~?H~q3Cy=ē03`atJ[hT@_fT4&X5zc7dU>_ĪX,?nYIq7j8`(|\x$"{yl{Wl%vncl[:b9-y`V(K?&k0ҁWҁf5QaԠ/(G45Cj6Ww-.5D/l=C%H02bࡳ`*6ŗS%(™}YulޗAgSiSzbuOH,FE"d%ycZr澊1pu`v{DtI|V9uUaD @27oFSʨ!ZEdU3Bt΋[?r Ӄ">{$i~CwZ;L[y@^@3ע(HX5*7 e^q5J ƗCDoU4Rn\(¹ UMSٟ ' 2rǺs⮄)Se$9L5%(6{+. IW[:臋.)\H걭?1 E-In6xY8J9b-*;bH6GO@2X4&uJƒrn aFZ+pg|0׿ 6 d_]OiD#=ǟ ASVʹkDy-~݈+ҐY%8 jkG];qd: \1P1w-&o'|vvnᗫ-{HZ(>߬Oh7S/:{a3AmyM&}KOfYسl_WJؚ\Ďyv;Gf;U l>9>>cXE'P="񨧤 =+C#}gZӊ65ℝ L9xi e L25`㜊FD.ܥOskz6w*[Uߛ)E-9x9y92,w헜_FIUdqĚX!\u R'w% ]MXHk2CMvvc*1(i``GаޖHۢQCL0&I$ASy4i8|*%;U( ҅L3Ux&+ :C*i#Ďx[w:C!՚~2C2dDpRBK@Cޘ?c]e)P>9xp-`3l`D"jaHDC) 6-E^̼scE E.?to}s[hBOӄEi"gcq4= V$, K8S6׶FW⑘Eh5Mқj>էTS3d="/y{T̠쏓^qM*2xO7|Cx%2{=;ewSB<2ax;vDnȮP0#@%HIcG\?YI}+gfs,|zd/u(>-r/p,\|5LV6;p񸠤J- a/50B_;0o8"s5Nto4*3`^8.$sDmVSA 봖aYM\0£A>D4,/&N, PͤRR\Tg=^B,.C3j~Q1չSk1V] e׬lDD '{82Kf;F&t fL$h1_a>n2S<`OA֊\m] (kl 銦˽AM /Ί9h͐I@؁p$ +1\~) P:f1,3[%\Hpn!OzjF/ͼWz_sps#3IJq,F)|xa3T 4oo5^g^zoܫFO=ZEBtSk jڻnn7KHo6%K-PkSuEq#njqi TO.Ny:Vb]ֻVi !0}_;_E0zq] ^õye4tܫ*"Lm /G%@ȋHyNy W2A֋Gǵ+dc雏x8n{.E2#-|콽ȕ[fzRY]S3j!`G(Wf 4,Si Sh frdn!$Ybqj}FYPqS,sֆ@-:1{/i!?pvMEg4cC'U\s')HAf6ԅE^:9DOk/q^ۤ׈Xǵ^>~tM Ws(#۲Dx[zUyfd헣RR* F}&W[uZXn3)oe#R"C*0ϒΊy?λ ybd&mXM~b5a('m,iɞ0̷R—17C;C1b5L v\ /sJTVf9?݅LS^m:+!ʐo ss-4mEKNv'%Us%a^QK6 06\h^9ۺO>L/R'9NMKC֋vK%/ZӒ&!"Șt^*̄nCц9?I?!]o޸MV?rQW@WfU.xGjm!)A9>"e5(-晢``D3(%m(do˿!z8^fo:CtH]2Ʊl R<#_Z ps#" z > ϭ^ %EA1r6&qZ@W_0"~X&~W|9 "'0l9t'J\tdSqLיϨ֚ \^)Tqn;!(]xj;Y5xN,B'eUe_̌i_BdSM3'mփq C!JeꬥS*&/5t|Ĥf7"ç7Q!펾Y0{Q8iՙo f(3f{\817zۣ:ȝKw3ETAUzH3D=J>]3/x ̬v3P> {@D--zNP bw*'o ;zG~ OټTr*>bYi}Cq kdw)H= Ye%v!w}ki6uaq 9O[h|̎p%Ɲy ?yG*=C|v(X9L3xXiY]+Ζ,wh센pEŽwF!iꔨ[q\AE]ō"Rq>cf^zuBZ`ȵVX[2{fdW1R+ TYQCИ>Y\&>9DzlrHqGQKj]n`&+ jaYԖ?2ѣKGKByNm5cn vU`8A[Q~s@!Y۾ف>wה {; 7R@)D/%ǟ eLYuRG5s4_߮*4e>ozNl^]*v0.ʪfRr [\ZtV@?v<95.7B kf֡T~wI:B2Ӷ94 ^6QխMAոOʸ%OD9mt^Br+NՂ8>AqI`eW=r8*$ <w̩dHm?I_-X ݎ[m#S({`Qo_n ׺ӘHU򊧼dlsXv9Sҡ fAC΅~u%*CEM}sV S, BidFc=;5v*\ހ5bK5xk[_R>rm|,=oi:tűDI1eIc7XR@$:Ѱg| t6:)ż)tղiL]CIS{#Uul2e4iTGi'l˭UL?h5z09VY/9&lڭoוC`;u]r =yX$ (ŐO0qn"膎>E,[c >ixQW0mFrrxU67$UhN<);$TD{Xy4o #jKLSVU/&2^4-2%W&IM;ݛM[#fe`!?ZUBX͝jE!`xhM*'ɶ e>ɚs:9j:a\vӎkbP𧵇 8֝wʟ2K?2AGMǍWAJevL25$*YdB&z緁VO Cޥ%[ޔ ndĚ̈sgVVdO<@2ܦ 5)1( }#^kO޵(zglTCΞjr؈O.>wتq(_ F۾wdX tf؈:)ސX}J YW=lƩ˺Yca-[،yQkJ/,4b!ɞiF9?X;6̎'_8! 7bh) aJYBQdFw\ڮUȧaw*QTv8xȲD: T<EQ7޵j2v a8W9Q̲6dJ`pcAу-C[2ϯR̿V!TDܭF[n(Q% 2(;@0Wp_G0S45>}8g6$n ?(X}}tIW&>|"5c+]; 2v:(,Zx1 <^,'&%{ OM`& A҆&%U0׵C''gi6ެ$@Z7# s=*N/;8&Lc8w%cı3  ].4tvB2`yc7p$QBK: np"1YJ%cn^M\+_2CvkW'v2p;/&S w$:F[`neFg #K)yUKq#{fyʔ-_"/PCCCpd %=[rVKύHq))aB< i;X ,k~ dMĵWΏyDXMkT-Ob{UȻ./{)Ne^l6N/b 搫(񷿂ߟ爒O=Ngy-({̀ϧh5> 2$avQ`Ns5vpN?#&`T04Cl{$V 6B Cg,+8mwMC Q3G~}dX o%@63s|@-}NeɁi8k45 YL)dֻyF^f2ivݚwpĘ16o-XCKFu18tk/,y hӇ>PMdI~m>ZwjU*2(,r83Z mܸ֨T^'mqa[w/o(FL.Q9K?l #Exؓ]n;~,l*aa %ZΌ/xCc缕 g@89W~*P50Ci`/VW,d Y3LІVx<!䍝-m=߷\Qh/$w{D\c_ȥGbP԰k\3o͂"q,yR M?ޫzvh{MOA[pg&wZmcB|=k?fx])P,L.s7eVeucNQGGjk?M BN-y"VR@aK=kke ,[j\ Dx;ݻU\MDFvYcAq_?[v27;8T#w%zɲ@A]EչC\V4zt~4)خFN$YPMK:~u?wM 9YOI#{4,.NoҒ6d1gjTi zNGݣ=t[ z?J, ǸK&:Dsn*h*8C>= )UQe QD\hSN8 >HzI m_f{3<֎u,ʄ1Rg.c#1ѧG|,Z!VI^ҢXo\F(D b}W}qJyyғtW@ .*SKA\|*̆ũ3k}{/LK#ʤc1h ڿpxx_oPn2umVT`J U@̞l*\{Y(3~ݾ,\%לdbqΫ'Q6̑LK cIC7Vlu٭[Ss2g6dGO%-}n"h`QS@D6c?ƈ?>Z<,h FQMVOt 8h0(>>:ƅ!}~niRqR6@`*2_jy%3WV3SM3zn+0 pIڡ:&>}8Lo7Y`W⼨}7aEJ[5Q[nK]WـdH e#:23gp&YhtlA{<RvX-LKj q1P65wx! V~0Y@EYc~#x}8wY a7W Lo~`5NVaDSC#AM*h.XyT-ݷjux4*fFn(g2w~hNl ˵hu:~-r[lwl=_U˰&*W˻5rӐ'c8}U΄f/|Emo@3]ʨKlxƴii6TI b.!RpV fJU]THtKA!#)3rcՃE}wB1br['23Y/1 >!wZyᅈ~l RQG꠼l|]t=]c g\P8N$2HQ_CsX,9N膟fAԈّdRq>׺̈́lKb؃|*YE5ҙw0'KnR1ta ܴxd}?Als{Sdò ",\ou)5ؗ⧱US$ט\.3jRU6\/=-I߰cz˵42N*I<]Ry.="E%g()wDRk˗ '-3#BdzXu a3jJoeYƲmQom!?)$y}.w XH|Kry;"kSU(Ԥndw={,pL)/1e_^ Zl;)vd:>Nwb4'E/!I\+PpnI+ތc/y*&r-]Dabt¶&qUb CACQXz/;) <"8cZG֗j WLkKXi[WV_"^[M3*mip}c@ [+ʵ:{ZvoDŽ2edd.[w0cGAŌ틎buv?iu 'kb("5}Bо6VQïP`;pe)&#}-GXh1ƗA6c݈_7 "m WQ 5P]NW'و#ĭ^zVR8pt,ƹ5p$*霣ly)<3-3CuОڧkؘcoJ:m9ztov\G\"j־s&̟!OV {{idn $%:JÐb{yC+cuOpJQcEn|]0,cɤC; vZ~2dbN$\z=?w؇ ֠Wdg\2bwa)űLȰKlJPODֈ}ssfߓQ`t~#e3Rɭsph{dՄ|-w*1ncx,`QUQ'7= #xBgưrg/I$aA N FK-DoWu*GB/Z?B'Sn?(B,sunb?9Gվ w6Vth? [3V6_u]#v b&w2 q̉Z!91$.Et"RS9QK/ oPak,B(o9ž,s鳇?W*OwcJN;jEj,l"Z|)F;)3_xܾ9V #$a"#>hgMzݒ:v i|no'Y6vy627 UJGr9=Zy67VE4mY!s>/ ceI9e?Q oGoեF[DheSZ``Khae{\ |(ooղ~{:OH*?W郐,u=3&X򩂗[CIy]&h|fa]q9dmL L,邅f(vqq: b>.ߜ0T6;HUzz`:2^cD͏GnGe2yRYA*M|w!ڨL$逯@p dġ14S/M洬3v^30eW~yi)݌,]6t˜6Y @;hc+)+4]">!oiW#/JhP=ژmsƵ>[;R;=@ZǣEsΡѽ|(ͭJƇB9Χ\7n~ iqPJ|rA`?ZZ]2!B.Mi9^n+-撍ZB1_xbӇu͘>{Mwz_'nx vz/WJRl|-RE9{nԫZD/?|B> Hz}MO]{uO9& Jy>{&i 0-(E;vcs: b(C䮙% "ui~Ow' ?g@Fd9} `Z$),:Wx]ޢU#YGZ{- 9g+ADZ#4&9(?FME?F_TobU)iўxpFt?CrJȼڦ۱K.(?x{3KsR}̹<>[AN/f,e}O'8 A?J:U6l+C5k4 cMA9:Z" J lXa8'1EQ1#hze+`> stream xڍxTT6Rn[A$aaARJA:$QR@ZZAB) }}9oZ{s]s]{fmN6cA%=T@ d]cK @D&04 ꁂ!2P*"]O8 "HȈHʀ@($7!`p8U0'g4߷(A=`0n00FB`P?RqFen(!< C;FP A&D 8P9ho0„x":`Cu6W?ѿ!G } xc[J3P;%(+ f*H77("՟* 컯uE a_c8x "`H\Dtc,+#uO8/z1*Ebo9/B`nB1jPB8a-(r[t/; :X0z`@aDqP,"S C; H s,FjG{Y '߹R37ҡ6ryƪof~}[lV/<*|oʨo>X0,Qu,[̈́_ڢé_Bygـ;ӑ Fvg2]]wpI/9:%TYb^͡XZ)Ƕװ42U7$9iaqEScm  Uw'w6֔Fvf/^,DU}lM?SJ#%p1|uyU_nG)\.x+,>RI8Vlx.^oMGqx|dM!OKxj %fÛf/LrZ0ѰJi^(vieM$~%,GTX2Y'J`4yVAe-7*590X09FzsG -7N$ѫ:pD}>ZViC7>V-n u+OfхLgrQ^=exFo=6C3WLggdKoulxͳJR6i&2ͭ). {"2Fs4T9CKٶG%FJ 8>hw3^Vwun&fעXLȅnwtn#j]2J $w~m\>TLނ'2Qߙy=;[ʁ ۮ K+F{<36 l˫nXcd0 ?ԄQ$,zݤ<X\ڗ|'Yw`wN攅v=R`Ҹɮ!H\d ߺIP.el*fF̗jd#9߲Gw v#@)O7}oZ}){ѪXn }[703h9V\&jx0ߢ Ӽ*2 A<2k|V$:vay.FҳkJ'&zB9@,?Bz`ݔ~ǛR%?]|MBz?e2<({2̐tt0-&Q*A}mIː,|{ұ3Z .{ڧT>.mBx"uϿjUu ህ5"'Gw&,;W𠂟EIc $Cboe8D~)FƧ[TsQ'sb{lÚVP{hh H*_}{. ilLTXn=YÓ?/H1kNBv _7_dz㣒},pF~\dRUz ]PZU&}PUGWe smNi[-zZBӷRnR{^WU~9Ca !QL1(WBkצ`G #hMt28EşI;[ͷb݃dp"/!btFÌIG*EoV ݃mUXU N޻/˦9X𾉛:N<0 < ?#`ЋʖR1])XN\K8Pdڦyf mar&PQ:(w-[JMj1~7٨XWpGi*Hl͐f[!ǡZQmckj+z-Ytw<嬭JU\yY`X͢1[tfDrrXޭ=8^Ԓ+;p 7}b)+~FZf]R?f(Toisޙ q;ZIm}E5L0BoȸIk^Zѹ-Z;EJ&2C\ajŧqSzʁzrI_9)s9js ;b^rkJtҝ,N>@M^Ƭ|Yׇ<;D] )ɻ P,= 5m5x?rmofS^4m#jj'y0\;|QLY?6^wn_0qFWsv).$'Ĕ(/RK01n뾬 ' MgOV-5YER5[l,'HpMT]82cTp?h6XTkP;]8-О7pnxhՂ5lBphB"ϼn&{=\f2atUBIq t3ΩƳdI7_{}j#CUpڐt< i 1`pIdا~N'Xe_xo7^3NK9AnXp:PH~t8}xjRn7 j{y/yzu{ݑ q"j5//Y$cLQf+|7?Ī_jx8Ḧ Kh!x^rc^*?cO ,l} 2^c=foƜ|cPCB#.L[~pnuP͓ IvnPdGfPp(b^mV(H܊➊M2*\T`|9`gjDnJ4i1WUlY=2?H_xH4 .}bj ?p:!RߔQA'AH]DUܬJ>TKʇ_UtbXr=g)%cZ|NoIJ಄##'κ%}m@#ͯ&YG+o}֚'pc y~\2鵣WN)1yc '6 )bߺo5y"q8^h ,ǃ{Kt3]h4p_Ghpk䟝7pcJ wlwDLF3TYG1-QX̩M.m *l>{kN3 9Q\Z1=@>q|"lVRQ^d?q`pȊfZ'ƹ;ޒw).J#gf},jT-gD36F=$&a ,O: ߣL KlX|㝷Ǽ0R&\_|`#ܻv"Z æ,=1nqӃҠzGYwvÎ9W ތnz /veə-+Zt*W*8uynUr<3:sRtBMzru.j)Ͳvd^9o.֚XAfB1.q+Ux1h/O$Z{MS*oҏ|>ZxBޭͪ*1Iڱ,kj'nmV2%1j5Zfk^D~MZ/F@ o\OT/Έg8)}(w\0jC"vWSV ߯z5e!w|%+l\> m+":.uznĞt?@&$GfY*=L : QrF2[7 N&:s*9~Z3殿ىv(w%~zD,-;6>ǻ%n4x𲒝^ɓ(S ,~߷P*wH@]Z5æ}sƓ:c8eK)ŀESJuaL:LtBNIK-r2hXftAtE~H$ju ;Yyۓ0I AZ] U\+ǩ>JRZg5>PG kǤ *\Z%65҉?GLX?oNמxTy9Am8 .Pؖly~aZʹ^0W@:W=cnz]kJQ~a+|; ©yA|nLy޷A8EWz:ʣi1ʏ=.8W{Fo|Rٳ*b"+6 'J2DDcD& ^|2^/9kΤ\ Hd:2PJx_]k^lv&\{2N< flέ/RssOS'd=/xHp#,UhN4.jk걀h &hk+9Va|rG_Cy TP G8u Aq "--SY&n{CSOیVw5* h,1Ehnp endstream endobj 314 0 obj << /Length1 1452 /Length2 7664 /Length3 0 /Length 8642 /Filter /FlateDecode >> stream xڍtT[6twC7Hwt(5#0 H(( ݍHHҝz}k{?{yʨ+g (aH^>~q?_jE:AAP8L7yS#Zp@ x(. " P[@ pX.nP{>/6119g hmN} W I$E;#nҜ<O(A@< _#ΐ? p;' s8Am 0]; x s8>-'W!(w2yCa;HYa`'.:[t ̇q |ӯV !8SAlrapOߖfkk [w! QSsgAEA+e wPn_ n ?r{@H7w?pP$bb}wnP/; we~0[8?W 42QU43^_^Aa/H -]G ?r`vp_ޝ-{p]K~\?D7淹w忪?);9s?`gsݑw*ЂiPc_ՂBݝ;ߩAfh^!>~P2 bE8ŚAt.bw"q{Ewi*l඿~q ܩ  KX;r!|LaS@tyE|"ahv\oxAlp'6!O+Ch=yABQGXƫJA 燂ZǿG/loM(-R)Y H]l#4A5ZZ[ l)v?}<q_HTdXzZⰋ^m0&JTT-I.TBnlYq ;3yjWHx{Jq%z!0`u]GQcskD DjG՞EtWL{rャٗ-$Z?EM' J)cvNa+{OY;oaHJK{KZU`/:-#`%@/] ӯNAC BU\VF¨Km l:C;*bLK`#;3I)pim9F׿Hϣʲ_ G4,R% [Ef!Gvc+t}!UhT>W?oSnCVEeX'FT=l RYYq̒Xubbٯ|' {i8m ,AQBlA+Jg*QKV>$uT0hIcY}.Z hWë.KOacɲY& _J7ӫt]9#H.4g2ӛ( 1QPCc6w}(|=vc$egH@)pu) 0{p&t/Px]!EKөzx:czaw<$)q {m'#Uܹ l ,|Hf){GlV[M3}i,8. d f/E(a*d0MNVQmo=:}j7zJsz/Qa.; -/\Uٳ㥣@-X3rB@El愋xOh ZYx(.U)DMb@is M>^(M:LrTaI@Ѝ(@|ZC"eH 8[ݧj"KUaY &=0ٗMq n*MI TjpOaz5l(nV{Z#}cN&se"r٪~L JӺr6KK\=Bt{4^{6qƟyL"(廒SUW$4x<}, OBC3X9XXϋN?-~KOIWQ7~Ƭ8HJOVtv0v[A+B`h¶jkF~}ܘ-Xm7hN%]8ԁc|cĒ014¶tv0d)4ܞu8ٵ(U::{&RBeNt|`˭$M7+#rZ&LzGCR /vgͱ~x1j G:G퇂Bl2+ZKPbs$T*\SBު+eiqDŽSbq/ UL:X&3vjv5&8o?}NS\ u;qYNGLWP,:{#1^U8u*\M.HZz;%F)%2@/"*gRrr:` =J_r1^r-rJKԿXTlz cC^󯯣oh5!^>o]PvrK,"C"M4h52Mmtɏ a8w:DBVoZX}\[-_fqo1hAVoO1\ V&$S,4 f}Oڝ/U")PZ R*l/9Ԋ&/ UO[=ǂpMRhٖ͆ A{ΪO#],u@~`9"+uN繖D?薥ֈcSs<ގDž. ?#m<ܗrt%Hx ub5U8dK z*,Ko.U$¥/# Iҷu=AnuՍ.eJÑWl,ƺC,7-Z:Cf;' C٧o-5drN =;G?W5}wX+ߦ##`ComMM-[nPlQ= &&W80*3f؂˘4+\ ݿZz@Hf^sOU6|x{}Xi_n!Zxyzvo-Gs5.ᖘ{sXQz2j˫Œ\܇G`=7rRYp\:|dҭnXdw^ib!tWqqA/:@+~G g*1_tpV{TUR' O^YgԶ%l1$?ؙ}PsmrB]2dO׵tꨊҎov:_ާskMT" ns29 nBLo1im9QQ@Y6AyL/>yD$f,4L9"< }@Ead7_%CIv\N`|aԤ55=2Y?Xj#"eG ɹ'NP:+ۜS'Y #hF4d*d]oj6#ĥ`.l&9<E7w }>7-R m@&Nm|zVV,'B8Cы$*i@v$ȗAw:a..tL*+^j2:t.9I0pEB (-pϘS.^v-IY&GQ;ziÒ~ (PXޢb/ %e|7 M}m|veo݌_EQ!~S I-K'u>ωdKK53jg+)kIztg(DB+۠My7}Ӥu|ܶѡٗydU7(V@CYUX^nTXU",IBP'_q) :1?~PIXi(TbHSۢy"f#H&ںWz$Wһkvʠ.<~qv)}W Bw_S ھ%7K(,2ѻAxxqx %n8̢dO6v cQBȆMD)h#Ék,c;f[I/zSvF=U/TE>| 7Xg̺/ދQ6;mo}{ظC„hLdYSɱe=]VhsJYCfMpH΁a'+Mcx;}A7Jߴ}nR->3gs$ >ѯCnͥz3|3CE&}Xgv}'ĵwg ]da<tBrr^38^tf흌7նuװ!櫗ĺٲasK!({vԞ;urKG+׏'LG4gfz&pҵꠢPX$Mzїc S0VQ o{)vL'}o܋(q[e~sŘLPZqP!8޷G{'U71n)ca=7 p*T \ul͐*y{ln)?,f,&djfO5wr_ qo]UU q_NSJ(ClLsO] .>zMj?eM~gG 53+'jۡD֮j*umbCqms-qEΙ T#( TǶm:gMA6 #{+!IThCeID&&j5c;ݓ ʲR3NWJ$E ,hgn{WɣzQdsw m րXt7F`_جPAƒ]F_k?|3!3Z($P4[*VJ `mk"ϱ2\bm^+3m߯/oϿ-l?\696e/,Ϊ@-7p^JX|OQި.I03c0V-5Kݥ|W.!a/™aJOeG]oȺsHj3i/~cq? 0rbiM9UO\:T<bs5R>PѺ_螤슒ݦ[G= H*JhPl ̷4g#$l[M!5'rz"^7&veރ8ECMp HNTf~B>cU?~=QΆ:J aL"}6ov6y`9Fu">*z];S,GLB.Z[{SBL!oMۗEM a VPcY+N bKq< +j!*`qq J>Ee2zUDz~7,w-f wɏ쭛pїyɾW^B`{O4 u6I! }%5O IQKa=fR~ۇzcWTuۄ`GQJ.bM+ϫpjڛPGvZ|Ӣ+rR@/Eգ™I{\S|yΨcB_'|ҝB,-/ixŖVkgg?;:+lƥ1ù0cdU rEONuf?lY&"u&5UC CE6)') hrf1˒KB 't.dPu.eL&L]:$(?dm+KxG93D+HZGՆ_D7QB:ݏ;0=D`A,Q@k Y<ۉ[oX;s҉ծ*ag5C=F_*)r{0)>(~i&G&1gMg ?q=sչ5Bwʮ> Mp-P^$^x>x}d]3CP;~Edt j@悩ڑn~Ѽ89M3q=)+2qcgċ{kj'T[.k∓ϧNJ)r1bXӶ,{ zxnkC%9Y4CbئUג?'¼l].ɼy; 3n=-7s7܋}ON|}PV[T+#FfΚWD0m)Dp+ϱ&J/I>9%== n-E޷HƤLXkIz쳯ـ:JvXǣ>|V\ӨdX'};ZsFۙ}a,L&,eCMBYF(lxAr~yh“3$US*!:Q!ݐiaw.5Jqش8÷^6f `xcKЉ;֬?dU;nk ̀q3ӤMC$oh"swW^k4Ķ8{i$x~;j&J79'}O:*cOy q Ob endstream endobj 316 0 obj << /Length1 2422 /Length2 17146 /Length3 0 /Length 18564 /Filter /FlateDecode >> stream xڌP cwwww00K -hpww ns+`V{ݽ@AJ/l 2JxjjL&&V&&D 5K'`GK?,D@#7ӛ< l`f0s0s01XcČ\,M Bd4pz󟏀O&fnnN¶@@h 2:OO|NN< F 5t]Z("@_ UxX\L`[v@h/cMW KLL@Fvv3K @QB͉`dg#ҍݟ ɑ F(hW}b`>\k;_m:3Y:8m&B#3:ؙXY@Ăjzz[ z:N`g?&Ncobٿ-:Lo `翟&dg#fӐUUTwUlzVV;+'Q,]?<@ v|zP7mnO\aߌuoE66?Godkiouvzy&_S WhjlNFo lgn_"-%,݀JN&ƿ홍P hgfb?2~=Fomw7 %caFLod~FSC `d9޺);Q/ѿ'Qz?(_`+Q0Ao [" J[?Sj[[v"7d7?#?ʷҌ`#kCa+5Ub_dv%g4|K EdK2\h1V?b9fbVşߨpMfV?o]=F#?b- C0OuoΠQugGmbc ~7fmTƍ3 hjƙߤ?.!?c3w|IG#GxOeo7&C|koyw|Oqo<Kơۍ3MA&Vw{3{K pPkegϓz8G'6IDjB^^[ ;e(Pr1\$~)WqȾ*T/1Θ%u'A?wCAϚx%E>d-dv?V؅GK}>:E)r(Y\D1k'4: x[rܻ_ !}OОeUB2WO06Lk*sur-{vBcXlqkIdM9S>WWUZ ygĩ۾jG/gDT4FN 6]*6cnj!e 9\ 6M$V&1?ʡPR8Jekx> ɬV MIBɇv<~hN[pt(p3bܔAp&ŮŸç]۟#@|@gd2;R} r.l"*YSNE:eDJlIױh>WԨmQ޸%>ɣ3ڋnU!5b:13Gi {sd܄mAJc6:{ #GH#]ffhl*0GNW{fLb]^BeYGznjU-&&TaևegmmnW)5Vpu_ra{_!֐t6kS_>vKKИˊR5 {c5T#ĤC(Qmt sDtZT3^o^`"}FBeOv ~:c KWcavV3kPٶn5NJ3&͔+pq-cP _~;,s&ѮHOw~Yz!a͵iPA@,E£ǎ'akYYg@P9_-im> |7$P1Ck@^ Uv{J Cg*$ n֦ >f$ᵯ6Er[-Gb%Ju"Ê۩52ƮIH}jb]C<z9mq%0pT{==HjjQevR_6:b/f',C7P>Ôi1ߔ}V*/fߙE6T#ktR7 ŸC[ v}Ljj㡾6<5ebHDj: Ĵi@dU B8x)?(Cd(0⍇~^?\q%KRiQ*3kv~4SK%׫/b܌`Ѫp%ǎLz䑡ėm8EҮWd淨~mo|Urzo?SS`oZ~ G(nۉQA^f$ ] ΃"nfO A) .9kkO8n3xs':H#2vi\A#YD.WN9OM|z 0CP'Sƙ#R 5^^?"$+8r.q~wD4󲱁\FV1R1*7~!"Ԥ'L~S(薸G`,} @6:t+}ZH R$ıL ^w]P\~sq9pxey+r4^)F5aCxpw%MSEƉeT>ArЫd#Mrׂ0oxz,r~}0H\X"Fhf_nHqZBΝК~Ck2Azt0osc5y?km0[Ynsr<gBVJ\sԜA-8:bB*x4=K.4g,Dea;zƎT<{F)lP2jqRX\Z[MvO5wNJON}XE2nu \ 3*+[ 8Æk:X$ E)ZXC8{tv 2$ /)]~WLXާM:}N .KNބ+|1U kQF[C~PGqѨr7 3ə,p}G{>sȳv* ~ս SD|?89)̀UcQτk滾9мl&: 7Z8&=aL95=wc;3j_UJg OE O)œaR\oOْ7- C 7ZhzZci2|Z pĖۍܢ*pVQ+&EzNEދXY*!-yd{^~s"5tMe;zDy* S;in~òduPAgRKs`1"9y;by3J/ӜU8xdD2!耪﬏)&nĺ2$Kx7t<.L6]}~ʹ%Kd *xa9Q)PUpIR^?$5̧jjElE Eg+n-PTOF|TS8^.݈aHDZ)bn} xؐCfbCUay{`ށ1H=(֥x\r ]`2,& }2r;"FFȁl 2i J6*Z3>38GJ_L^..4 \/ӏ2ܿ(S>&~h4iI[\*ag,=bPz`"h`.oͮ ag}6)#0p2J]cn=%΅$hhhh[z0}b ]4QOhNjWpḆ3yL.}Ua񁡌H&EѬ)A'M_mAqg|,^1H6MznJ=L:gNt=݁HyC >I¿ǷKF!la0 p[KBL*׃ G^kEpR.?nl֒OHI7,Wm]R',ge\R[s=4:njI~%'ԑCo@*<̔^}΁K'ӈbSS&܉UGH\1(sZ2lX-T`4}N@ [p9QY98:&F2ЮW3@(x36"j5M'aյmZ24R)iU!L'&kfk l5!,$y^nMSP\Sk";N|O4WXc{}&H ~şSL U,"-v*DkBd.$D!pDa9녪2GHBw;`0/feIoy ЮknϜ?/K_7QcϺh͡# =eQL}ʙDK$6+ռ bLr3׬U!N¯\FCxPv *i%ذ|@NمcxݿQ@Dܪ%a:MIa2#A/積DhʐQI\+I 1iq //V6K'TZnҤQ)^qB, xQZWH^0V94GMԛO8q}4Rfؕ[JU >Հ0qkn(֢h0L(y5B\uO۸!bZTȈBb| zqhG|ϐ(}cⲆ8> .DTX?RJ즼PS( Via.WW׷tLq &F_ RN$DojBsN^kl 1tȢ3}'&` t+iHH^opS-_:Lfr,r"ҫl[uP uɑB0J]\7]( .؏ϥ"\[SQ8f<8Н.F룮4Cs |=*$)a5[!'PFE; VU_7gĽپ!NǖԢos׽>Ԉds]{$3xQISIRmش]FWN%c~k#D;h+XS\)sccue\O=:0[UYeNjm_Q;& ڇ RE]?vH-`a?<-gх4wҮ> mMy7|= 7ZH?i,F"U ]kB~? /D$ś3\JlbtcesN (~X#u#Q#ER|L]0$ fSݷMuMIބGl\%>9u_4@"g-bbBraBU,ds!<aoQ?k?ݻܖqmp䷰g1ܸ+>A⦜ij;%E4O<ўX 9}R 'rw/ u&J+fLex{zYaۧ#`m Gu=Jߘwڕvn(R]@FFpG"|UZꁢԺKֈӐ$Kp@6ߡuZB9Bߣ["Ba#dc72`(}X3/{D9L^[ӻEV, !ޯcf׶Y\Zp֭{!:F˱ AHMQmJuys<4^gWs?ʐ8mk?ڦ#pRw:Tu,>441n*3xC{EZ)l=<.VAG)ՄE͹|bvYCF K_KW183J-[zE} QD؋'2ވE0IΝX{qFϪ[Af[j&$캾 D8@>D#lN  &+/_V*b<^A~Y j̍] \b (ǂᔏ5/!?qJfyY5cI20?͊7 1 w9pb,_V[VS7yoXK]GEEPD!?Clz%?RZ`#9 f:&(>1,}œU\td \D ?]~:1G;oύӂ|N6{(? ^ xVSfU:a~8q.k^f֨T2d;@5ؠfڼfzIv't"Yhu$rRɑ 4XN` Zu*>-\X4+КY2`cTSYGH\jCT2! Cq/Xh{)DE7؝2I"e"1TۜIF/ h$)) \dμ:J%{4ĕ Yl+դ7G&Yf fG9pBZOi>f:6◧>'!Movw׮YۣDp)f݇FvV̙g ڗpH1EI%E !gӓ0Q!peuTzzk>;r.۷ўGGݛ%}{ Tɛ2YO="?{G x$zƺE+IT tv%eZRe)ab|u;OLE.%BHq Rࢃx޳"oZrJJX%Nx dmf=8 l"٩bFa[4"=p#fxu=D~:GO+gXj/1'me]Ua7.Ej4cxlɨ-D5 F;}rM]QU-Ep*J&dqX Ʒ<>LlGI\[g6UE$yJv4blBiHJ:|IМH~HrlXSaEavb"[cwiv 5Fg^B30l@΅nzE~:-Е47ܞW@4}L V+0ćםS~*4ÝO'΁az^Zꝿŏ%15[Uݗ߃0\ksq]*fo􈩮0A^wO01ЌGJg 1F }lu.ىFw6%i3%im؞uJN/XxlڈwއkpKT).fFHS׽+WGNF$;)Wyq(|AYOq#9'aЗ1glGMj64tNQaJ$v-S8gy6£h,10Ep4dpdˎ Xe+<&|6%I!=OCYsWHndG gq^9b6TvzdhM`jMBM<&Hkɇa-tPd1{+gx$AbfQspM?(hbfF@`en_]PXSTgobEsGj b6z((OxbT} ѺbSyic(;^*,g#Rgkź4l(١ ^Qn`2B?y}2c"P.4^!&EE8:\[&{䶒&i|@7{[a;2u+-&;9Z#n%2CcEBl:9_`SeG6by\?y:=FIt<y6t*_xt;P{hF@Vn3m4C$ρy7tuqju$I@ v}~Ze JM<@"+^){+Q+P(ٗWRġ؞­D1:ܔ8.o"Bփ!|5<2W\y 9ՃbҤ㣮}yn ~?yf#JWa&XInk. xz7iLbC~;}^jX,I2ёD[{BCOr-غI:'w'H!'>υy N Wxq[v{b|Y܅Qs`1dͺ<F"$"rIDw/7:k*ۂh8Zݳ?Xk_H(;bu󰮻ړ({1m;ӬfAP:V*fƦtKv}"C=h2wu}{u|8 6|*|'-_ר~Nz}cT30<˾4츗nNorI { 8Ts?O%Tؽ x=jn f s4HLܙ8A왹kC+#Y,B6bR8زL:+KUʙT!^GQHjj[=v/lƋG#I5Dl֍UZHD>e""I0=Rz5M_<hBdpvsvȖ Ix'S#$i&>U 2GMV77e?""W0WUxK*ͪ /NRtT[R>M'9 U9Kےͮq-y{Ǭ 턠z븑Fj K*Lrb]me,?u Dֹw +fhO^?V/.v/]Ē(zW[>_q窉YAܲw!,+Q61cWEM\4W\k?.+a菻VT dys.ỗ5iTG͜@PWY쯀xp"_+Y1@NW*61%y`X!)5|3$ժy>DzX)͖[$ *orSIVS73W_{}buLK@~= |lq][Q_ή7+3Cvp@򹹦y S+6U!$#2ʣ>_pχTF!tߞy/x Yr=wWN:Cb*K蠣$-9d|g'].XkJ,\k:L}\7۩6q*j(ϟܾL1f{+ihPv k$e՚ԁk륛d$rT4;T3'!F3/'/̅/BJg 1'u&Jd ׷qr@{8#Y W "~j Y p>Ot/KqҗјM,v*V[7 XȾܙ 6wS\*?}ug* X1t5(Xn 4tip CT| DEbAc[&G(K+CW4c;9TrC,^vɞz]빭GL&:m$U(YoQ7"3;*^QÖ;|jUѽBz o_O-aZ4KvUsHҊv.T|<:@ d/d'yB0M؋6EXl.IaRء*9O+*i. K¯4.w)Jٹ["W'-/G!" 752r lѡ9`=2T2\Z-o׾ӟǟ~+h>Ј]2l+2ƞMh+Z-8U *ƕ]+Z>(+*\'hw1wgnlamxjauN, wt/۫=?0}ڮ政j>=41kc@L~)w,2pj{JOYc)}a/Y5b089ϒD)lzeY \@%&Df<:b yMD rF`4 rcrq+k՞W+~DPvɦ@|&}lMv:5$fK"w`~dLDfBҔ7);o(f^8/ ֮18O(i+1-Wlb.o)5<<&WH c7Kķ GW3'D<`brpoyR].oLhOo*B-͸mg@;sYэgf}>VT-M#Y=m6؞ ڄ1o6?]1Jwl;}M_ιXG?c_~ >| dmקYqDV_#;-Ea?Huf& v1n[.*Z[!lVٜT= lą/X~VXNc‚ic_:MX P'87͎qs:%UQBPex(QH؎&ɿ6녤<\.g`ǜ:ZTn$d*TCzsx t$%%)7JO F?FTW<%,BlV#dAb0?Ac1"ʫKi-PLT,`Q ڴP/˯~׶{}:y>80 @XՃMa)vQ ,9ǘ՚0㟍yusYh]:9h*hKr&$O-liyݱ6byA+ɳѝг]U )ZLyl`Qgh r#ؓSRX'G|h*,"y;FCW>>MQ>e^ڢT' ns"qbJo)^ *W_NarJ GFgg2ӋF.D:ǣRu @fmuE !T0%A+e> MG x{<"vHKfA'͋컂ns?̽Y_*7i_j0Bc*+׉KoIbNw{ygkd->÷+&,Gx+lH"Z7_fۭ0{U^u(hJ}b٠bn"ŝ(O1" {W@C|/t% CluԓS= S̩U4Gf-Vl|#DDcD5)>CP`E^ɬs؀QIz>t'0geU·6l`%0J#}/ǵ6?u] d::v$]./5C[WC}gȗ'Ի7wlQ.[U d'(>A3b˞oioXuDIж:,8; y>DuSD~l9puB nO eS+Qr+qeѱ_YưQ*v.OX \oXL8ۄH >tare慕`]&pk .dzo?U}l?ֿ=fخS;!JN?'9sgQTWjoD7ew&88I_=,w0'no2O~wҝI Eŗt@F !ZIX ;'+њ+-:m>[Δ!Q)8hP'=I6@"x^̮4S(ڦjpw)5rmɮ!@ZիSn aeP0Q]HpTΒ[̬ݏ 6M QJ:r'//λ1 os @,W$`KR74UPNt2XpNvW?(&EM=ykD$4j-mAr$j!+2G/8 L)s=b"Q,JO^;z tR43 CS{ ʑ s-|A\^`S~/0Pi2_Żz'(L…;9b$"vGy*dxJ0V%S}9 ^ߵR!GDBL*A"ؔ:tWt4LNJMS5mB;!9CJ#9w0,^s~qLy%g-ځOXȪc`-3u`Xu X~O${cd{;*W{&4Cs]ۉM0Lmc*o\5]j :*h endstream endobj 318 0 obj << /Length1 1680 /Length2 4395 /Length3 0 /Length 5440 /Filter /FlateDecode >> stream xڍt<Ft9g(3#;玻ٛt@FMJFFd%BQddozHZVEpCdYT 7QPy9(`8/14Hj2Mf x0%5 P D5EfrIMb|Xw2-?0R*h"fڛ$MW!Ir %{VhF; o@SnMD4@H4DãD>a X?M~uF o>w0X04#S21DH?!h#CSHH"ևL#aq;-Bv^8OF$ D4쁐Gav@@lX_? _&4; (BPy(d'MzW : !ZP,Ma &! [o(, ݱx?ib4' NP`t ^(|wSzvV?;#P`YE@.%UU A,_E@xcZiOchE?w*B/.?~D(߂ p]5xWX\/e4hKʚQX?jO5Ż~?#dQX2c?Ŷ;+іv0(?:^!hwD M[gьWu0Z~_yW dA_cA7wo MA#ن H1ueB; mY>:$:7Ixo^]e/:3r&0n/mB&{ >ixVrjX< FǪg"AߙHe>"AS]OnoGI:†7vܒÎ]1YΞֺInpr]L$؍2~ cBTlդGi)dY7^'l3K0i;sHt71z߅vuHKj+2 Cy~RdK3&jB<]>z$|}f CӲ޽`\ b<,,>L΢>Gz_8I_IPʰE-N5G9kYK-k3c'e,FdC2BZbq12xVx;$kt [q/ U.*,dz=~ʩ+nj 5 qjUn<0;vV5 _*O/PR cgLBUe2+&Ғ)XbmAD3ʐBht+~P)~,^QW8tU5cȾY|VϢ'Dǩ3kkV>mOjL JII4);KR>{y7*͞pF&D3Uz LK8NWmŷe4a^1>;gû(.X7OglW`֨޳0k־}$g-޻]Zp1/n<9ey~J)Q^U˫ݶ_+nЧh0"防mz)]]ySHj"ڣTQD7{xΔi-Y87~0KU%Y͌R,?jB uP[H1s 57X7|澼si*ޙ'CQ@ݒQ[*x^L'ÌP cw͚p/0Lf Cә:{Cҿ7||5T7f_=gs3Vu}b^k&f#imU5j d}Qo8U[EnyNEl==uʪk%M$AڨՅ [A!(2eqDLЁ|;2 I`tꀉH[;'9/}J{UtF͓O&\?'igjf'\,6Ȋ! YfOn튽h=SA̚}[I7\S.&t4<,(^uӳ(h >ymN->`֟gCソ#A>~tYl1\%J(hEYAԒJ3a{֝yg..[NM9K˶Ŀsuwhn~z!t)Sm}{)Va3BɃ{3nK[59l8RSZphrklȖM{ŋ+vV_J.c^W^ܛe2mY3j}x璴QXXhL:+YBM@ 5-Іo8 0AGb_Ѣj<եŸQ3,0 {Ć4yƒ<'5sqv&g,"ŭa:fE559H#WF:PȨþ 4(Gq qvȖW /龳BXu!'tMRҿ\ɧv=Edd(;,cꩋU~ٙ5qIGegxg}vo[Ű|w~\PhS2!s$˼ *l;PԝzK. v?_NY{@QO HdMklp/ЁḸsbʓboA _xJ::#ϝ;w)1|WەcN/66&c(GM+,PUO7AђͶ qŐKac:򺘻nsn*cT0 O"b xYLתt; !0wSzנH!&nDpc #mĉ%^_l؍Մ6.$rw9x[;ٝ}>0^ HFT=̨^NJX Y~4^W0@;Jaʺy0:MS"zG{V^bn\xc4ܴ@nEGN RSR%ua-[ӌWgO9/lTWB_~A]] ʓ-y+2t}G>hfp쟴z0ka42]j ChJ,je7ϗ9\,n8~EM ?eEIqwz}:e8+Q չm( _;fS8IgP(1/+ hb3o ΁H{[*3 +X<ąY*τ/W;†@R"P*Wߵr<{k^g̈7j5Kdg#X,Ķՠ=)F"L^ӊ1v?g<%2ϊ-I3`f9zS",wGC6͈PU ]sn,(Y{R!t.*X(׆f KKyySW9UGG?zh!4iSoL =u/sɄ(y`rWz0jwuJeUA\P~,Q זܲ*;B$A*t`e;o[SJFZtҙ}h[;YM9XVRhs:,_.VΖjΥ* ^Hr ' >BxYrXxZNﳠU%Mq4 60~E4}3$Z]pE75|NWU& ̦u=[^fl 76_%sOXjꀮG\YO_u^d~,p9GV̜f:hz!g\leR ӫRҘu>|DzU)?Ut~ŻH}RsgJ"!z!ΌoV:PjB:3IQLE,f+oD[eoz|nfA&o sZ'ԴYxFZ?^3-b;vZ#j@r[AH v4[|P\w+X'D)N^9űa>]Rr]i[ӞEX`)> endobj 281 0 obj << /Type /ObjStm /N 80 /First 703 /Length 3192 /Filter /FlateDecode >> stream xZYsJ~G)VE*a f!a!EWHnz A@ '|@lp.K@3%L@$L W ę 0mG>y|Gd0BdI +Bp$F(X !r8~-}5zx Hats ި/l1fo9>\[[3wAVI9(y ϟ?%W][h4Gr@O"T#rz>OB E(C$/REO!D,T//y1EP(AG rUtV^ 8/0 jr~h~Rp1T)2xO!T1063qC@P{f9N*Yɋ+lU-0U;Pt9Z>"47`+t,\8^Es8^hL4-nDLTaExuRg9TJgC Z xdW}J uF Vx59!c-g'3$N bOR4`l蓆3\=h 6tFv8Dɰm-XXgnwÓ??ul&f}I_<2SNj G夸,<93 A\&Ѽ.s*U7?o$|:#8aV,ow:nѬE=Sgo^;~"l'=JuoBh W{R İ;l>~zrc@ c{G{#{2G`zcF (v6%ۨϧctt{-^>J a>N`~zKMgӧ tucSt4קr#l={ӭɻÏVoXdZVXݨHgɍ ,";mMb3Anma~5'%~ɀMq1Oݡnά|j@~D r˽Ϳs}/7koi^\Knѣ^7}[A[nkwo.¨͕m[ΡLJJkoWʀ@ڵ^7a$қko$v%o):y󵦭_Y±͕[𕜓a@uo&W.o5Y >ug ? dz~ FCF[J)ݫ#fwx* Ał|p]twM0OcaSy{9YY 9PoSP.r|u77H[O~|3.[Tlgm##ؾ+NyN JMNO!6(a)mY1"aC)(27m\@GU%W]:KbtFPC#ePMn- VL&9\1ɀEq+&m:DdM pN@sƴb]5`JR7IS -Y`[g;c\5k-!W +tt_Mȶe%\趲weW]7JL6-[\ϯ8ڄZd ] /Length 831 /Filter /FlateDecode >> stream x%IlHa}ם:dv  086|wUDOϲ&ϙ9H@ }>,>S ܗ~MO&H{4%UEROƤ<=*UdT?*=]|OR՞> UV@7Їl;@w'@[\b<}v9˛r< endstream endobj startxref 243884 %%EOF sp/inst/doc/over.R0000644000176200001440000002416213124453245013524 0ustar liggesusers### R code from vignette source 'over.Rnw' ################################################### ### code chunk number 1: over.Rnw:105-107 (eval = FALSE) ################################################### ## A %over% B ## over(A, B) ################################################### ### code chunk number 2: over.Rnw:117-118 (eval = FALSE) ################################################### ## A[B,] ################################################### ### code chunk number 3: over.Rnw:121-122 (eval = FALSE) ################################################### ## A[!is.na(over(A,B)),] ################################################### ### code chunk number 4: over.Rnw:125-141 ################################################### library(sp) x = c(0.5, 0.5, 1.0, 1.5) y = c(1.5, 0.5, 0.5, 0.5) xy = cbind(x,y) dimnames(xy)[[1]] = c("a", "b", "c", "d") pts = SpatialPoints(xy) xpol = c(0,1,1,0,0) ypol = c(0,0,1,1,0) pol = SpatialPolygons(list( Polygons(list(Polygon(cbind(xpol-1.05,ypol))), ID="x1"), Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), Polygons(list(Polygon(cbind(xpol,ypol - 1.0))), ID="x3"), Polygons(list(Polygon(cbind(xpol + 1.0, ypol))), ID="x4"), Polygons(list(Polygon(cbind(xpol+.4, ypol+.1))), ID="x5") )) ################################################### ### code chunk number 5: over.Rnw:146-154 ################################################### library(RColorBrewer) pal = brewer.pal(5, "Set2") plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=pal, axes=TRUE, col = paste0(pal, "4D")) points(pts, col='red') text(c(-1,0.1,0.1,1.9,0.45), c(0.05,0.05,-.95,0.05,0.15), c("x1", "x2", "x3", "x4", "x5")) text(coordinates(pts), pos=1, row.names(pts)) ################################################### ### code chunk number 6: over.Rnw:161-162 ################################################### over(pts, pol) ################################################### ### code chunk number 7: over.Rnw:169-170 ################################################### over(pts, pol, returnList = TRUE) ################################################### ### code chunk number 8: over.Rnw:176-177 ################################################### pts[pol] ################################################### ### code chunk number 9: over.Rnw:182-185 ################################################### over(pol, pts) over(pol, pts, returnList = TRUE) row.names(pol[pts]) ################################################### ### code chunk number 10: over.Rnw:190-191 ################################################### over(pol, pol, returnList = TRUE) ################################################### ### code chunk number 11: over.Rnw:210-219 ################################################### zdf = data.frame(z1 = 1:4, z2=4:1, f = c("a", "a", "b", "b"), row.names = c("a", "b", "c", "d")) zdf ptsdf = SpatialPointsDataFrame(pts, zdf) zpl = data.frame(z = c(10, 15, 25, 3, 0), zz=1:5, f = c("z", "q", "r", "z", "q"), row.names = c("x1", "x2", "x3", "x4", "x5")) zpl poldf = SpatialPolygonsDataFrame(pol, zpl) ################################################### ### code chunk number 12: over.Rnw:223-224 ################################################### over(pts, poldf) ################################################### ### code chunk number 13: over.Rnw:232-233 ################################################### over(pts, poldf[1:2], fn = mean) ################################################### ### code chunk number 14: over.Rnw:238-239 ################################################### over(pts, poldf, returnList = TRUE) ################################################### ### code chunk number 15: over.Rnw:243-245 ################################################### over(pol, ptsdf) over(pol, ptsdf[1:2], fn = mean) ################################################### ### code chunk number 16: over.Rnw:263-266 ################################################### l1 = Lines(Line(coordinates(pts)), "L1") l2 = Lines(Line(rbind(c(1,1.5), c(1.5,1.5))), "L2") L = SpatialLines(list(l1,l2)) ################################################### ### code chunk number 17: over.Rnw:290-294 ################################################### plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=2:6, axes=TRUE) text(c(-1,0.1,0.1,1.1,0.45), c(0,0,-1.05,0,0.1), c("x1", "x2", "x3", "x4", "x5")) lines(L, col = 'green') text(c(0.52, 1.52), c(1.5, 1.5), c("L1", "L2")) ################################################### ### code chunk number 18: over.Rnw:302-311 ################################################### library(rgeos) over(pol, pol) over(pol, pol,returnList = TRUE) over(pol, L) over(L, pol) over(L, pol, returnList = TRUE) over(L, L) over(pts, L) over(L, pts) ################################################### ### code chunk number 19: over.Rnw:316-324 ################################################### data(meuse.grid) gridded(meuse.grid) = ~x+y Pt = list(x = c(178274.9,181639.6), y = c(329760.4,333343.7)) sl = SpatialLines(list(Lines(Line(cbind(Pt$x,Pt$y)), "L1"))) image(meuse.grid) xo = over(sl, geometry(meuse.grid), returnList = TRUE) image(meuse.grid[xo[[1]], ],col=grey(0.5),add=T) lines(sl) ################################################### ### code chunk number 20: over.Rnw:335-340 ################################################### g = SpatialGrid(GridTopology(c(0,0), c(1,1), c(3,3))) p = as(g, "SpatialPolygons") px = as(g, "SpatialPixels") plot(g) text(coordinates(g), labels = 1:9) ################################################### ### code chunk number 21: over.Rnw:344-348 ################################################### over(g,g) over(p,p) over(p,g) over(g,p) ################################################### ### code chunk number 22: over.Rnw:353-355 ################################################### over(px[5], g, returnList = TRUE) over(p[c(1,5)], p, returnList = TRUE) ################################################### ### code chunk number 23: over.Rnw:371-373 ################################################### over(px[5], g, returnList = TRUE, minDimension = 0) over(p[c(1,5)], p, returnList = TRUE, minDimension = 0) ################################################### ### code chunk number 24: over.Rnw:393-394 ################################################### over(p, p, minDimension = 0) ################################################### ### code chunk number 25: over.Rnw:398-409 ################################################### x2 = x1 = cbind(c(0,1,1,0,0), c(0,0,1,1,0)) x1[,1] = x1[,1]+0.5 x1[,2] = x1[,2]+0.25 sp = SpatialPolygons(list( Polygons(list(Polygon(x1)), "x1"), Polygons(list(Polygon(x2)), "x2"))) pt = SpatialPoints(cbind(0.5,0.5)) # on border of x1 row.names(pt) = "pt1" plot(sp, axes = TRUE) text(c(0.05, 0.55, 0.55), c(0.9, 1.15, 0.5), c("x1","x2", "pt")) plot(pt, add=TRUE, col='red', pch=16) ################################################### ### code chunk number 26: over.Rnw:415-421 ################################################### over(pt,sp) over(pt,sp,minDimension=0) over(pt,sp,returnList=TRUE) rgeos::overGeomGeom(pt,sp) rgeos::overGeomGeom(pt,sp,returnList=TRUE) rgeos::overGeomGeom(pt,sp,returnList=TRUE,minDimension=0) ################################################### ### code chunk number 27: over.Rnw:437-443 ################################################### over(p[5], p, returnList=TRUE, minDimension=0) over(p[5], p, returnList=TRUE, minDimension=1) over(p[5], p, returnList=TRUE, minDimension=2) rgeos::overGeomGeom(pt, pt, minDimension=2) # empty rgeos::overGeomGeom(pt, pt, minDimension=1) # empty rgeos::overGeomGeom(pt, pt, minDimension=0) ################################################### ### code chunk number 28: over.Rnw:449-455 ################################################### data(meuse.grid) gridded(meuse.grid) = ~x+y off = gridparameters(meuse.grid)$cellcentre.offset + 20 gt = GridTopology(off, c(400,400), c(8,11)) SG = SpatialGrid(gt) agg = aggregate(meuse.grid[3], SG, mean) ################################################### ### code chunk number 29: over.Rnw:465-467 ################################################### image(agg) points(meuse.grid, pch = 3, cex=.2, col = "#80808080") ################################################### ### code chunk number 30: over.Rnw:476-479 ################################################### sl.agg = aggregate(meuse.grid[,1:3], sl, mean) class(sl.agg) as.data.frame(sl.agg) ################################################### ### code chunk number 31: over.Rnw:492-501 ################################################### g = SpatialGrid(GridTopology(c(5,5), c(10,10), c(3,3))) p = as(g, "SpatialPolygons") p$z = c(1,0,1,0,1,0,1,0,1) cc = coordinates(g) p$ag1 = aggregate(p, p, mean)[[1]] p$ag1a = aggregate(p, p, mean, minDimension = 0)[[1]] p$ag2 = aggregate(p, p, mean, minDimension = 1)[[1]] p$ag3 = aggregate(p, p, mean, minDimension = 2)[[1]] p$ag4 = aggregate(p, p, areaWeighted=TRUE)[[1]] ################################################### ### code chunk number 32: over.Rnw:505-521 ################################################### pts = cbind(c(9,21,21,9,9),c(9,9,21,21,9)) sq = SpatialPolygons(list(Polygons(list(Polygon(pts)), "ID"))) rnd2 = function(x) round(x, 2) l = list( list("sp.text", cc, rnd2(p$z), which = 1), list("sp.text", cc, rnd2(p$ag1), which = 2), list("sp.text", cc, rnd2(p$ag1a), which = 3), list("sp.text", cc, rnd2(p$ag2), which = 4), list("sp.text", cc, rnd2(p$ag3), which = 5), list("sp.text", cc, rnd2(p$ag4), which = 6), list(sq, col = 'green', which = 6, first = FALSE, lwd = 2) ) spplot(p, names.attr = c("source", "default aggregate", "minDimension=0", "minDimension=1", "minDimension=2", "areaWeighted=TRUE"), layout = c(3,2), as.table=TRUE, col.regions=bpy.colors(151)[50:151], cuts=100, sp.layout = l, scales = list(draw = TRUE)) ################################################### ### code chunk number 33: over.Rnw:538-544 ################################################### round(c( aggDefault = aggregate(p, sq, mean)[[1]], aggMinDim0 = aggregate(p, sq, mean, minDimension = 0)[[1]], aggMinDim1 = aggregate(p, sq, mean, minDimension = 1)[[1]], aggMinDim2 = aggregate(p, sq, mean, minDimension = 2)[[1]], areaWeighted = aggregate(p, sq, areaWeighted=TRUE)[[1]]), 3) sp/inst/external/0000755000176200001440000000000012577541412013503 5ustar liggesuserssp/inst/external/test.ag0000644000176200001440000021711012577541412014775 0ustar liggesusersNCOLS 80 NROWS 115 XLLCORNER 178400.000000 YLLCORNER 329400.000000 CELLSIZE 40.000000 NODATA_VALUE 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 633.686 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 712.545 654.162 604.442 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 857.256 755.506 667.753 604.425 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1003.87 945.002 769.047 661.724 593.855 537.25 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1069.26 983.799 878.379 708.984 637.82 576.758 502.98 451.488 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 922.507 1083.8 945.866 762.595 649.206 634.722 553.44 440.256 374.059 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 717.213 777.331 822.986 764.945 669.406 615.916 587.683 496.213 356.752 272.71 324.623 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 660.1 650.091 638.308 611.437 571.263 533.224 497.88 442.094 350.554 286.843 325.339 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 707.795 638.026 569.719 521.819 508.89 487.974 444.416 419.558 407.454 373.116 345.292 345.966 358.068 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 887.388 825.729 652.683 517.784 426.014 445.632 438.663 376.65 357.961 379.836 356.809 327.702 329.567 343.705 355.074 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1057.1 960.383 663.773 513.045 432.197 434.055 419.217 382.225 367.365 365.737 328.78 275.022 298.508 324.793 336.698 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 843.475 884.551 791.652 601.797 510.573 456.54 420.62 397.348 379.909 367.862 353.455 326.15 294.459 302.652 304.347 312.732 334.407 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 980.331 870.736 668.36 531.929 500.892 432.629 374.083 357.068 344.89 342.894 331.291 321.267 314.795 306.631 283.028 295.349 325.278 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 749.536 895.292 791.145 607.186 511.044 468.404 399.325 350.362 306.18 300.483 310.082 283.94 285.771 304.709 309.69 301.799 308.753 328.357 345.611 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 631.296 640.188 590.924 530.624 470.292 395.259 349.999 357.78 325.979 306.601 274.873 203.641 229.114 286.122 309.413 316.915 323.831 334.795 346.651 357.442 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 581.315 525.057 452.094 466.222 440.058 378.669 345.348 353.942 333.772 292.74 229.478 219.683 239.423 282.815 307.355 319.651 328.266 337.133 346.577 355.892 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 593.992 593.677 502.993 428.128 444.087 424.202 384.19 355.385 342.818 326.71 284.05 210.864 231.36 267.287 290.369 305.865 316.241 325.276 334.566 344.095 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 577.863 572.453 555.076 505.375 463.378 439.787 406.633 357.111 299.379 305.216 317.603 299.574 273.486 272.215 284.783 293.545 298.589 305.067 315.41 327.502 339.247 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 616.093 576.684 534.222 494.367 457.892 425.191 389.124 337.657 265.805 284.072 309.288 302.796 293.71 290.996 290.403 283.931 274.104 278.413 296.946 316.655 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 648.075 702.031 600.774 527.168 479.024 437.924 402.01 372.16 342.768 314.209 307.048 299.666 281.698 279.707 286.96 284.168 259.643 220.291 230.989 272.979 305.382 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 610.327 624.361 565.76 509.988 459.092 407.8 361.026 338.658 333.212 323.209 308.382 280.676 233.383 245.381 275.148 277.523 245.565 186.932 205.428 262.143 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 620.855 564.765 495.324 513.083 488.154 437.746 371.527 287.984 270.453 307.7 312.036 299.136 273.263 240.359 247.079 269.845 277.168 262.522 235.522 242.946 276.434 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 716.603 608.398 499.394 501.058 472.886 422.197 354.654 264.571 247.842 290.878 294.749 285.979 262.732 237.419 244.838 264.221 277.954 280.664 277.296 282.298 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 683.474 614.513 536.742 498.718 461.148 412.154 355.131 306.283 286.513 273.204 262.82 270.059 247.899 202.565 222.853 252.845 276.572 289.907 297.001 304.232 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 683.136 633.049 575.288 516.064 482.195 450.062 403.227 341.609 279.107 270.211 241.246 215.1 258.917 252.394 216.72 201.163 246.167 277.374 295.776 307.339 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 797.428 651.882 573.972 447.5 451.586 439.871 398.714 335.133 260.255 257.56 249.629 246.57 265.497 264.784 242.809 234.789 260.441 285.229 302.565 314.91 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 995.286 896.848 662.984 609.289 422.834 430.906 431.593 399.801 349.908 298.068 244.094 195.847 250.853 274.965 278.36 272.639 271.769 282.222 296.965 310.519 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 807.947 748.64 628.414 513.138 347.991 411.145 426.218 400.801 361.756 317.105 258.872 221.959 261.628 282.471 283.663 281.341 285.112 294.581 306.325 317.85 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 796.278 745.489 684.348 604.969 518.226 446.448 435.994 424.695 396.703 364.131 332.56 302.733 285.965 288.46 287.014 270.424 259.52 275.603 295.844 311.401 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 880.583 859.451 769.862 689.06 606.39 538.427 486.677 450.602 416.849 380.612 348.808 328.824 317.43 309.509 302.738 286.069 241.893 213.18 256.375 293.529 314.807 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 886.723 838.169 814.994 824.124 701.26 604.516 542.752 492.369 444.777 395.817 346.107 301.868 292.4 305.844 310.845 307.537 292.142 256.134 234.883 266.611 299.678 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1291.12 1056.76 831.44 767.393 742.813 654.552 582.493 539.078 488.366 430.125 364.847 302.808 229.877 232.211 284.364 300.745 306.054 302.878 290.953 284.506 296.161 314.194 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1072.54 1366.02 1082.54 804.534 701.531 649.407 595.002 566.41 545.599 482.67 416.283 336.976 258.907 254.098 250.956 269.065 278.544 295.916 307.032 310.304 312.378 318.959 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 816.139 883.365 942.816 843.089 699.424 616.902 580.08 557.019 552.757 525.807 460.971 406.23 345.293 286.796 283.064 269.464 222.415 234.081 279.537 305.188 318.359 326.189 333.156 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 798.899 778.278 766.498 745.322 674.646 559.588 487.638 501.566 510.724 499.695 460.979 406.54 385.76 364.132 332.58 308.072 272.818 218.472 229.755 273.967 304.114 322.623 334.167 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1086.24 894.307 815.647 804.747 768.245 730.629 693.036 599.298 431.758 315.971 424.929 464.482 454.829 406.639 331.609 351.532 368.582 351.358 322.086 280.466 235.294 239.555 276.496 307.061 327.44 340.627 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1251.56 1285.23 1542.09 1243.73 939.872 826.437 830.134 772.825 738.259 707.726 579.088 445.45 371.412 410.568 428.25 424.737 397.06 354.351 361.477 373.562 361.499 333.864 289.734 234.078 240.439 284.741 315.263 334.734 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1142.02 1147.25 1497.98 1805.78 1353.4 1259.17 1331.54 1177.08 943.724 818.331 783.818 736.169 693.376 640.514 534.322 450.935 406.548 379.104 373.225 391.158 396.82 388.589 385.127 382.657 371.055 349.338 318.686 289.57 288.28 309.195 329.718 344.817 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 865.193 921.085 1127.79 1509.65 1226.56 1062.05 1260.29 1430.92 1225.73 1262.35 1550.48 1191.91 910.436 783.249 727.781 689.104 635.255 551.337 427.5 352.488 348.101 269.705 258.666 343.865 384.657 394.915 394.745 390.142 380.428 365.44 347.344 332.483 328.954 336.077 346.639 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 885.015 906.723 880.49 969.852 1068.48 917.964 866.45 931.548 1007.28 1004.1 1071.77 1208.53 998.468 814.239 727.057 703.905 709.146 616.413 493.245 303.572 192.341 302.475 225.517 215.297 323.95 375.901 393.684 397.507 394.916 388.186 378.475 367.7 359.042 355.489 357.233 361.991 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 848.335 877.994 891.809 817.151 799.077 757.336 709.088 651.957 723.552 801.264 805.75 742.749 616.788 648.457 677.093 661.405 679.682 712.322 591.458 471.965 351.324 288.895 324.635 312.396 310.026 348.305 378.634 393.309 398.248 397.653 393.67 387.662 381.075 375.6 372.615 372.429 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 947.418 952.075 840.244 778.07 713.781 672.439 678.088 662.448 569.911 643.162 695.097 674.043 542.162 274.951 434.055 570.544 587.046 587.259 574.991 514.224 435.896 380.179 357.881 355.927 354.822 357.655 370.321 384.316 393.714 398.148 398.828 396.945 393.519 389.558 386.06 383.798 383.062 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1081.63 1127.95 823.722 689.376 602.905 506.154 543.789 608.936 617.042 629.172 634.385 606.762 530.823 440.633 471.277 516.374 519.762 503.937 487.223 447.117 359.853 312.632 341.096 353.725 360.873 368.252 377.058 385.874 392.737 396.901 398.566 398.3 396.763 394.639 392.573 391.065 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 791.156 874.423 839.464 666.13 596.16 536.298 456.878 485.538 550.788 580.339 590.029 584.984 562.614 524.882 488.198 470.919 466.861 467.885 464.554 461.032 416.807 320.376 271.35 307.554 324.495 344.635 360.903 373.036 382.397 389.405 394.167 396.916 398.039 398.006 397.306 396.394 395.636 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 776.154 669.976 454.686 399.907 494.093 480.965 438.049 442.083 490.004 528.437 543.201 539.092 520.042 489.132 449.283 403.951 384.211 412.47 438.61 437.37 399.132 341.851 285.71 227.438 265.372 316.47 345.605 363.328 375.389 383.983 390.025 394.043 396.475 397.738 398.232 398.318 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 879.384 641.947 367.839 328.808 440.665 402.345 246.796 267.629 413.585 479.898 500.579 497.603 479.069 446.738 395.9 308.277 246.108 344.188 390.709 395.239 376.321 334.552 253.91 147.492 225.592 294.838 330.004 351.737 366.635 377.252 384.868 390.248 393.935 396.363 397.908 398.885 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 766.18 768.547 625.419 491.193 444.83 442.375 377.71 222.635 242.195 384.377 448.465 466.306 461.526 442.667 410.685 361.804 294.345 255.837 325.645 363.355 367.953 357.923 326.774 276.157 234.69 248.458 284.058 316.086 340.105 357.45 370.024 379.202 385.901 390.753 394.231 396.71 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 664.465 644.044 580.753 514.569 473.969 448.292 409.19 358.41 359.799 404.755 433.53 439.006 429.187 410.107 381.753 336.028 268.507 262.5 324.227 359.62 362.204 345 315.326 268.635 210.63 210.295 260.794 301.292 329.116 348.739 362.984 373.514 381.368 387.243 391.641 394.942 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 662.101 613.25 541.915 480.134 446.653 435.652 425.132 412.168 410.111 418.2 421.772 413.524 395.338 375.104 356.357 323.636 256.215 250.009 316.507 342.632 343.248 325.386 297.782 246.244 144.555 151.845 239.877 289.816 320.273 341.309 356.679 368.203 376.964 383.675 388.843 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 750.004 630.24 499.561 393.664 361.597 395.348 416.557 420.696 419.64 416.577 407.341 386.406 351.816 320.139 320.743 323.707 308.4 305.984 318.254 319.435 310.318 292.832 275.46 247.104 204.779 205.168 247.896 286.265 314.659 335.645 351.445 363.543 372.921 380.256 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 650.344 687.302 587.463 448.019 272.191 237.273 350.171 400.938 414.613 414.819 408.011 392.7 362.046 302.585 227.826 262.369 313.616 323.675 321.3 311.981 294.62 277.468 234.508 237.477 232.428 205.305 216.738 251.723 284.88 311.32 331.662 347.375 359.663 369.379 377.128 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 582.308 578.796 527.842 437.067 315.813 286.129 356.107 394.88 406.584 406.053 398.114 381.891 351.701 295.392 225.71 258.595 310.336 324.666 322.702 307.217 283.611 263.987 156.609 202.004 208.493 138.41 180.947 245.003 283.426 309.56 329.125 344.399 356.572 366.388 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 585.741 599.328 514.642 446.261 394.374 373.21 383.368 394.9 398.668 396.186 388.498 374.867 353.249 322.978 297.565 301.797 315.971 323.605 326.92 317.894 297.138 270.027 225.769 229.442 222.465 184.068 206.304 252.936 286.127 309.719 327.842 342.353 354.191 363.935 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 581.079 614.351 462.83 424.462 408.083 395.808 390.982 389.695 388.178 384.726 378.308 368.163 354.045 337.503 323.388 314.9 308.877 314.556 343.555 344.035 315.4 291.188 270.876 260.28 250.556 240.664 248.039 269.298 291.635 311.038 327.333 340.965 352.382 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 506.282 478.119 353.255 293.217 377.247 393.734 388.061 379.77 374.552 372.339 370.323 366.217 359.24 349.556 337.866 324.632 307.22 278.294 264.379 348.519 356.456 322.45 301.79 285.815 271.939 259.951 254.61 260.981 276.265 294.405 311.694 326.903 339.927 350.997 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 532.605 459.4 342.172 306.695 363.883 376.912 366.958 352.1 345.879 348.786 352.046 351.499 347.335 340.52 331.383 318.95 299.246 262.026 230.869 294.012 320.274 312.777 300.513 285.317 263.934 237.393 226.075 243.475 269.414 292.168 310.822 326.218 339.088 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 570.719 633.301 481.689 397.441 369.053 366.784 360.571 334.855 298.228 293.756 316.029 330.556 334.234 332.16 327.569 321.075 311.447 296.952 278.519 270.279 283.797 296.415 298.861 293.15 277.573 243.128 180.702 151.612 204.481 255.57 287.771 309.444 325.623 338.549 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 521.268 480.586 373.766 373.265 354.195 347.772 344.408 299.34 208.943 215.844 282.654 309.73 314.765 312.492 309.595 306.692 300.772 289.376 273.141 258.457 258.638 272.966 283.977 284.621 271.69 234.896 162.295 128.434 192.652 251.606 286.919 309.538 325.812 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 601.559 495.012 299.088 223.93 342.281 328.287 327.725 337.466 295.117 211.239 216.526 273.918 293.518 291.723 284.007 282.55 286.749 286.617 275.618 247.307 198.884 193.865 240.465 268.687 277.303 271.431 249.335 213.069 197.914 227.032 264.252 292.153 312.107 327.174 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 699.524 768.446 571.541 391.136 332.556 351.179 349.984 346.125 340.536 313.28 278.967 270.159 278.541 277.856 261.543 235.883 237.114 260.336 271.458 263.977 231.071 161.407 154.181 222.417 258.672 271.711 272.642 265.118 253.806 250.484 262.367 281.761 300.535 316.365 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 654.275 689.757 724.314 577.368 427.927 334.055 332.95 358.18 357.931 343.069 317.218 290.147 273.807 266.913 257.681 230.786 167.318 175.7 235.458 258.81 257.763 239.553 209.409 205.905 234.162 255.668 266.26 270.532 271.445 271.57 274.553 282.809 294.991 308.258 320.831 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 691.684 715.497 668.058 618.769 535.517 414.857 263.715 292.903 361.213 363.303 339.669 302.339 257.404 233.312 235.407 228.539 220.606 180.548 186.637 232.664 250.201 250.111 244.014 236.659 235.465 242.377 250.499 256.447 261.443 267.341 274.355 282.413 291.858 302.542 313.69 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 673.884 727.216 780.813 686.208 602.936 535.845 459.044 379.983 373.969 389.961 370.973 331.874 279.484 196.846 150.43 200.339 173.46 206.936 224.573 230.543 240.633 238.675 230.221 230.026 232.217 231.081 231.82 234.944 236.509 240.47 251.77 266.761 281.141 294.032 305.858 316.914 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 666.589 696.381 714.845 709.193 660.112 603.234 563.056 535.807 512.162 482.563 438.544 379.638 315.42 262.758 205.867 171.159 204.213 179.647 212.585 240.598 246.114 239.752 215.406 183.389 197.242 212.793 203.437 201.072 208.609 201.237 199.03 222.738 252.006 275.226 292.796 306.832 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 682.694 728.915 759.29 692.081 640.162 606.615 601.211 640.781 697.049 637.7 505.193 385.223 268.435 199.718 228.178 236.439 239.948 237.077 245.178 253.061 249.295 234.401 199.693 146.296 176.065 196.13 155.999 152.225 183.53 153.693 136.08 188.633 237.6 269.531 291.187 307.246 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 692.324 689.657 706.879 716.014 669.684 627.024 608.736 633.422 757.74 991.279 857.256 575.167 398.318 244.738 149.828 226.533 263.478 269.331 268.466 266.59 259.786 242.967 222.443 208.206 192.905 200.737 199.155 155.657 151.769 181.764 149.243 130.502 185.148 235.555 268.784 291.577 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 740.076 707.826 683.79 665.193 637.578 610.763 600.917 629.939 744.693 930.851 821.613 577.015 419.619 311.453 257.384 269.538 284.255 287.25 284.774 277.63 260.536 222.913 173.838 186.735 214.725 223.669 219.334 202.595 197.561 201.945 191.882 188.86 214.378 246.885 273.867 294.758 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 838.342 749.5 688.021 648.796 617.919 593.68 582.211 593.73 637.214 679.938 630.897 519.146 421.325 351.764 312.076 298.281 295.891 295.217 292.548 284.599 264.488 215.865 140.384 168.173 221.999 238.994 238.532 230.349 222.159 216.602 215.33 222.198 238.823 260.549 281.716 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1064.08 998.067 779.357 694.73 643.5 604.651 575.959 558.167 552.654 556.456 553.424 521.74 464.991 403.538 349.349 308.693 288.88 287.622 291.233 293.248 289.632 276.681 248.166 213.513 219.006 243.178 253.783 252.078 241.243 221.536 199.639 201.353 224.366 248.608 270.38 289.681 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 946.029 911.572 987.39 898.942 726.565 688.643 635.348 589.413 555.231 531.869 516.964 505.966 491.331 465.679 427.581 379.839 322.755 258.624 230.684 257.271 273.106 286.333 288.778 284.965 278.223 267.118 263.712 267.042 267.826 261.867 244.791 205.889 149.188 157.294 211.969 251.619 277.928 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 829.295 1013.56 1274.4 950.23 806.904 748.166 703.655 672.814 616.296 565.226 526.962 501.453 483.996 469.185 452.9 431.804 402.828 361.822 298.428 192.606 130.336 229.726 235.795 276.545 272.814 270.406 290.989 292.4 287.362 282.592 277.374 269.327 252.082 212.615 157.034 164.339 218.739 260.341 287.479 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 742.566 810.279 946.957 1103.47 742.529 732.676 706.311 675.972 639.908 582.741 524.672 482.878 461.718 448.974 435.506 420.903 405.676 386.101 355.763 306.118 231.74 198.59 246.664 244.183 297.642 271.525 264.787 305.188 306.592 297.389 286.77 276.98 270.897 263.336 244.358 220.68 222.831 250.283 278.914 301.172 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 697.398 743.922 783.818 798.579 746.17 590.516 783.929 695.059 669.826 609.653 535.734 454.208 402.867 405.473 409.81 398.242 383.709 377.263 371.576 356.707 330.459 300.157 289.499 305.369 337.232 400.551 411.337 366.017 336.826 311.18 294.852 276.668 255.372 254.939 267.203 270.407 267.372 270.893 284.51 301.837 317.919 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 699.58 777.09 863.647 801.178 706.596 669.786 674.4 646.331 612.522 557.709 478.014 342.957 251.534 337.655 372.751 351.984 324.174 335.808 354.274 356.761 348.268 338.64 339.656 362.176 427.499 588.231 695.275 488.434 343.823 279.67 276.696 258.463 208.598 219.19 263.031 286.327 296.062 303.375 313.029 324.504 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 635.368 686.305 801.308 1080.06 847.993 662.454 643.815 619.153 592.132 559.238 490.921 432.733 317.537 225.725 322.006 352.571 304.728 237.889 287.991 338.304 354.747 356.837 356.929 364.417 390.584 458.558 608.859 697.425 495.582 302.522 206.109 253.427 260.912 216.496 226.573 273.046 302.919 318.691 328.751 337.497 346.132 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 589.608 606.575 639.708 712.045 780.119 554.342 608.678 658.936 597.461 577.205 501.586 344.829 379.31 375.231 347.984 357.075 353.525 309.71 259.007 294.858 336.493 353.556 359.16 362.659 370.828 390.868 431.558 490.279 505.853 426.817 316.419 251.544 273.559 287.069 275.489 280.243 304.68 327.305 342.659 353.067 361 367.708 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 564.305 571.688 575.383 581.747 617.885 634.789 603.075 610.869 619.228 574.466 538.65 427.112 221.291 346.665 391.424 385.734 374.592 359.314 337.555 321.459 328.303 343.319 352.706 357 359.85 364.866 375.624 394.299 415.008 418.145 391.062 348.555 319.3 317.176 322.024 323.394 329.588 343.354 358.492 370.736 379.596 385.919 390.538 393.988 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 554.364 558.582 561.252 560.816 572.914 579.41 574.071 566.225 553.409 561.478 595.344 483.113 397.291 393.957 400.465 390.218 370.468 348.346 334.541 332.819 337.89 344.383 348.703 350.41 350.488 350.034 351.048 357.186 368.82 377.494 375.186 364.579 355.52 354.401 358.678 364.814 373.21 384.007 394.997 403.988 410.231 413.981 415.821 416.332 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 547.671 551.919 549.569 548.62 547.927 542.401 539.203 536.005 530.387 532.243 541.054 601.09 448.504 422.541 412.615 402.04 382.405 348.137 302.683 287.488 310.445 328.959 337.22 339.671 339.023 335.659 327.372 313.602 306.694 322.36 347.472 364.924 373.667 379.356 386.57 396.29 407.446 418.923 429.616 438.25 443.958 446.624 446.641 444.622 441.259 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 538.18 554.042 568.231 550.216 529.658 514.881 500.292 498.53 502.069 495.301 471.638 465.714 315.769 286.354 394.489 405.606 394.817 370.39 320.577 228.079 204.478 278.66 314.904 325.048 324.996 321.999 316.876 300.399 259.55 223.146 259.328 317.896 357.412 382.342 401.369 419.664 438.862 457.9 474.349 485.987 492.017 493.148 490.591 485.264 477.874 469.265 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 524.782 533.122 551.21 570.552 544.276 510.256 481.24 445.408 452.508 474.898 475.535 466.675 476.26 404.974 365.912 390.731 393.847 383.513 361.698 318.623 246.528 227.509 279.306 305.969 309.877 302.082 294.972 295.018 281.654 222.967 157.218 216.561 302.23 357.455 395.16 427.129 459.276 492.944 525.103 549.682 561.773 561.786 554.367 543.633 530.877 516.22 500.531 485.272 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 517.945 522.032 525.025 529.498 530.89 513.526 488.225 462.818 431.947 438.381 457.536 461.082 474.605 526.079 438.919 398.908 384.791 375.132 367.364 354.571 330.528 300.094 286.426 292.466 297.614 291.523 266.683 246.321 266.26 278.273 250.474 217.778 253.302 317.052 370.191 415.079 459.895 510.311 567.245 623.292 662.264 670.934 654.044 628.47 605.09 583.289 559.58 534.572 511.063 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 520.016 528.188 527.504 515.492 501.098 482.832 463.899 450.484 442.875 442.636 443.799 439.506 431.32 397.622 363.115 373.682 349.233 331.99 340.282 343.072 331.995 312.529 292.338 278.974 278.789 274.948 238.278 199.309 243.424 281.45 287.636 287.421 308.347 347.617 392.476 441.428 499.944 575.301 671.191 774.965 844.363 837.594 773.989 708.739 667.884 639.224 606.126 569.476 535.865 508.253 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 511.043 523.726 543.206 546.376 514.572 482.109 453.373 429.128 420.825 424.693 428.305 427.935 419.139 402.997 358.281 324.494 347.385 273.272 238.639 303.98 329.162 325.183 303.214 262.51 222.103 239.728 264.091 253.502 236.411 261.393 292.523 310.418 324.003 344.489 375.596 416.644 469.824 542.832 649.201 804.656 1001.65 1145.11 1097.52 919.672 773.874 713.291 689.244 649.865 600.543 556.278 521.285 494.814 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 506.599 518.992 537.202 538.579 504.313 464.005 422.388 376.868 369.862 393.362 405.011 412.843 410.099 400.965 392.224 373.771 347.994 261.054 226.041 295.077 321.421 318.237 293.446 236.036 164.075 206.441 256.654 270.068 274.376 287.854 307.345 325.785 343.995 366.254 396.217 437.033 494.17 578.875 712.551 929.888 1251.38 1529.66 1423 1062.14 804.247 724.269 716.734 677.469 619.656 567.806 527.25 496.815 474.642 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 498.508 505.029 511.043 505.489 481.6 447.793 405.453 351.938 344.768 363.361 373.501 398.562 407.177 409.004 416.526 412.378 373.588 325.818 303.738 313.379 319.747 314.087 294.497 256.709 220.004 232.846 254.861 268.791 283.31 299.665 317.583 336.184 356.097 379.618 409.841 450.818 509.196 597.274 737.915 968.788 1315.09 1621.83 1505.66 1106.78 823.057 728.338 714.327 676.691 620.194 567.276 524.238 490.941 466.583 450.577 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 489.39 490.602 489.26 481.107 463.922 439.538 409.971 381.33 369.968 350.573 359.285 390.426 403.985 417.426 462.427 477.238 395.442 346.554 324.732 317.615 314.122 308.773 297.647 278.967 259.446 243.865 229.799 243.231 273.636 300.08 322.009 342.34 363.393 387.507 417.515 457.287 512.83 594.095 716.974 900.73 1138.91 1315.84 1249.77 1015.65 822.674 732.388 694.934 654.657 604.775 555.698 512.529 476.607 449.465 433.194 427.333 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 481.466 479.719 475.556 467.324 454.286 437.233 418.176 400.773 387.625 376.895 379.489 390.6 397.822 408.603 436.354 436.269 370.469 322.43 306.432 301.229 296.573 296.324 294.48 284.635 264.518 222.569 167.044 199.27 258.655 297.11 323.603 345.753 367.506 391.532 420.424 457.381 506.823 574.91 668.928 791.915 925.667 1.0e31 1.0e31 1.0e31 1.0e31 711.135 666.371 625.581 582.023 537.879 495.382 456.148 424.438 407.477 406.934 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 475.49 472.446 467.518 460.037 449.8 437.345 423.925 411.241 400.592 392.983 389.598 387.879 385.449 384.56 383.729 363.154 303.718 244.42 260.608 271.783 260.528 273.297 285.532 282.608 265.934 227.714 180.986 207.423 261.141 298.866 325.687 348.068 369.663 392.891 419.888 452.998 494.988 548.855 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 519.526 478.682 437.056 400.654 382.582 387.753 403.149 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 473.833 471.463 468.056 463.234 456.698 448.401 438.655 428.112 417.562 407.615 398.406 389.124 377.936 364.639 353.261 344.465 321.467 255.633 167.556 225.373 252.179 224.066 254.288 276.795 276.001 266.201 252.458 240.679 251.719 279.158 306.072 329.183 350.086 370.664 392.529 417.187 446.163 480.963 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 429.008 393.65 376.182 382.644 399.728 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 471.573 469.19 465.972 461.692 456.173 449.348 441.301 432.237 422.363 411.652 399.46 383.985 362.045 331.55 304.613 305.098 304.169 272.255 236.303 249.463 259.478 252.445 264.701 271.363 258.052 245.895 252.187 263.291 276.358 293.884 313.337 332.676 351.661 370.867 391.132 413.369 438.471 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 391.359 394.237 406.078 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 468.485 465.856 462.464 458.146 452.74 446.08 437.983 428.201 416.264 401.079 380.092 347.652 293.866 232.78 256.494 294.128 289.27 269.75 254.023 256.662 269.569 275.803 264.385 220.012 185.861 224.284 261.324 282.598 299.765 316.995 334.592 352.354 370.409 389.177 409.193 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 411.646 417.035 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 469.193 467.532 465.446 462.764 459.194 454.276 447.379 437.784 424.764 407.336 383.41 348.209 294.033 237.491 258.543 296.143 295.27 265.247 208.841 219.191 268.485 283.376 266.356 207.532 161.681 214.696 257.976 280.011 298.045 316.246 334.344 352.033 369.472 387.048 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 471.155 470.872 470.655 470.384 469.68 467.718 463.146 454.412 440.488 421.193 396.46 365.566 329.57 302.095 302.928 311.309 304.423 275.719 226.432 235.285 282.408 299.838 288.407 254.611 231.259 243.064 253.963 266.517 288.179 311.409 332.384 351.118 368.447 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 474.142 475.66 478.008 481.307 485.318 488.893 489.383 483.079 467.769 444.945 418.093 390.002 363.507 343.529 332.244 323.722 314.814 303.712 290.835 297.303 319.616 330.799 322.324 300.426 277.009 249.89 217.402 229.783 270.513 304.892 330.419 350.603 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 481.455 487.045 495.296 506.735 520.569 532.276 532.368 513.638 481.389 446.935 416.298 390.24 367.374 344.054 317.608 303.923 315.553 329.176 345.377 367.486 378.64 364.305 336.972 302.386 243.877 173.32 198.623 260.852 303.376 331.268 351.763 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 487.499 496.655 510.839 532.42 563.076 597.852 614.457 587.52 532.431 481.309 443.779 415.247 387.626 350.8 295.559 262.544 308.593 350.769 381.04 418.955 443.37 409.746 370.012 334.935 282.049 227.838 236.938 278.453 312.551 336.913 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 492.769 505.039 524.644 556.382 606.771 675.74 724.395 683.488 589.026 515.062 471.504 444.346 417.761 377.76 320.887 291.045 332.041 375.99 405.956 441.125 467.697 427.942 392.174 373.598 339.438 304.164 296.27 310.32 329.304 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 510.266 532.635 569.166 628.61 714.267 781.245 733.905 619.168 536.765 497.074 482.03 468.179 434.643 391.136 371.713 389.126 416.386 431.483 437.408 437.306 416.669 401.139 399.435 375.403 348.73 336.59 338.233 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 532.67 565.839 615.736 679.571 721.588 686.055 603.213 541.19 518.26 528.351 542.097 509.362 457.16 435.489 449.99 480.411 486.387 461.37 436.11 415.113 402.591 399.131 385.905 369.681 360.038 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 551.071 583.696 617.703 633.566 612.464 568.902 535.246 530.572 561.667 598.999 562.516 498.169 475.595 501.87 563.093 574.707 508.764 454.405 423.78 407.209 398.501 389.86 380.7 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 567.652 572.35 560.846 540.246 525.235 528.144 553.139 576.34 551.317 507.041 492.692 521.605 584.038 596.165 528.025 468.105 433.818 414.767 403.534 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 535.315 529.265 519.669 513.194 515.394 525.783 531.785 519.048 498.716 492.507 509.295 538.387 541.539 506.405 466.743 438.735 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 500.987 501.027 503.321 502.935 496.202 487.323 484.31 490.338 499.111 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 1.0e31 sp/inst/external/simple.ag0000644000176200001440000000020212577541412015277 0ustar liggesusersNCOLS 3 NROWS 4 XLLCORNER 0 YLLCORNER 0 CELLSIZE 1 NODATA_VALUE -9999 -9999 0.1 2 3 4 5 6 7 8 9 10 -9999 sp/inst/external/seamap105_mod.csv0000644000176200001440000003711212577541412016557 0ustar liggesusers"id","lat","lon","obs_date" 388,37.941,140.946,"08/13/1997 05:37:29" 389,37.914,140.944,"08/13/1997 06:23:41" 390,37.929,140.923,"08/13/1997 08:02:24" 391,37.902,140.933,"08/13/1997 16:19:49" 392,37.904,140.925,"08/13/1997 17:58:32" 393,37.922,140.938,"08/13/1997 19:39:51" 394,37.902,140.933,"08/13/1997 20:19:46" 375,39.675,143.858,"07/21/1997 03:07:08" 376,39.696,143.867,"07/21/1997 04:46:11" 377,39.721,143.885,"07/21/1997 06:28:27" 378,39.712,143.826,"07/21/1997 18:51:38" 379,39.535,143.534,"07/22/1997 04:32:51" 380,39.426,143.369,"07/22/1997 18:38:03" 381,39.806,142.59,"07/26/1997 03:51:11" 382,39.821,142.608,"07/26/1997 07:58:23" 383,39.843,142.6,"07/26/1997 20:16:06" 384,39.325,142.207,"07/27/1997 16:03:04" 385,38.442,141.361,"07/30/1997 08:06:06" 386,38.532,141.234,"07/30/1997 18:56:24" 387,37.946,140.964,08/12/1997 19:50:49 337,33.229,152.672,"05/24/1997 19:57:08" 338,34.279,153.899,"05/25/1997 19:31:16" 339,35.016,154.007,"05/26/1997 03:19:17" 340,34.814,153.552,"05/26/1997 06:56:46" 341,35.104,153.696,"05/26/1997 15:36:53" 342,35.312,153.026,"05/27/1997 06:28:25" 368,39.532,146.041,07/08/1997 03:47:14 369,39.524,145.01,"07/18/1997 03:38:39" 370,39.55,144.9,"07/18/1997 07:35:49" 371,39.633,144.631,"07/19/1997 03:28:43" 372,39.634,144.642,"07/19/1997 05:11:38" 373,39.68,144.086,"07/20/1997 17:22:05" 374,39.574,144.062,"07/20/1997 19:02:15" 324,30.646,157.093,05/10/1997 20:00:54 325,30.921,156.606,05/11/1997 07:17:51 326,31.094,157.161,05/11/1997 16:41:46 327,31.426,156.919,05/12/1997 02:27:30 328,31.966,156.668,05/12/1997 14:57:40 329,32.318,155.668,"05/13/1997 03:57:33" 330,31.838,154.058,"05/15/1997 19:53:33" 331,31.58,152.687,"05/20/1997 02:40:38" 332,31.568,152.847,"05/21/1997 04:12:31" 333,31.473,152.164,"05/21/1997 07:05:53" 334,31.704,152.212,"05/21/1997 18:17:14" 335,31.973,152.132,"05/22/1997 03:57:36" 336,32.066,152.156,"05/22/1997 19:01:18" 311,29.488,160.451,"04/30/1997 06:25:46" 312,29.424,159.832,05/02/1997 15:01:35 313,29.433,159.617,05/03/1997 02:27:22 314,29.318,159.274,05/03/1997 03:59:23 315,29.638,159.552,05/04/1997 03:51:46 316,29.653,159.712,05/04/1997 06:29:45 317,29.736,159.145,05/04/1997 18:59:57 318,30.074,160.089,05/07/1997 03:24:25 319,30.064,158.397,05/07/1997 19:29:23 320,29.981,158.098,05/08/1997 03:09:48 321,30.06,158.091,05/08/1997 06:44:31 322,30.305,157.43,05/09/1997 18:45:29 323,30.351,157.395,05/10/1997 02:43:43 298,26.575,165.505,04/12/1997 15:22:22 299,26.606,165.323,04/12/1997 18:34:35 300,26.805,165.13,"04/13/1997 07:27:55" 301,26.564,164.109,"04/14/1997 14:52:40" 302,27.025,164.221,"04/15/1997 14:50:17" 303,27.317,164.039,"04/16/1997 03:49:15" 304,27.526,163.779,"04/16/1997 16:13:49" 305,27.794,163.638,"04/19/1997 15:44:52" 306,27.43,163.276,"04/22/1997 02:39:03" 307,27.523,162.162,"04/23/1997 19:39:20" 308,28.54,161.342,"04/27/1997 03:29:50" 309,28.601,160.868,"04/27/1997 19:48:51" 310,29.244,160.212,"04/29/1997 19:10:08" 285,25.344,167.274,04/03/1997 18:35:22 286,25.497,167.098,04/04/1997 05:49:34 287,25.487,167.014,04/04/1997 15:01:35 288,25.508,166.865,04/05/1997 02:26:48 289,25.382,166.489,04/05/1997 14:52:18 290,25.841,166.609,04/07/1997 03:43:39 291,25.829,166.608,04/07/1997 06:24:11 292,25.83,166.605,04/07/1997 08:01:40 293,26.029,166.164,04/08/1997 20:06:04 294,26.072,166.198,04/09/1997 07:17:36 295,26.081,166.026,04/09/1997 15:54:08 296,26.079,165.708,04/10/1997 19:17:04 297,26.228,165.794,04/11/1997 03:03:15 272,24.349,170.157,"03/27/1997 16:33:03" 273,24.356,170.248,"03/27/1997 19:29:13" 274,24.358,169.812,"03/28/1997 06:43:15" 275,24.398,169.624,"03/28/1997 14:42:21" 276,24.439,169.581,"03/28/1997 16:25:44" 277,24.464,169.211,"03/29/1997 18:45:21" 278,24.257,169.292,"03/29/1997 20:20:14" 279,24.461,168.705,"03/30/1997 20:02:20" 280,24.583,168.525,"03/31/1997 03:21:49" 281,25.224,168.058,04/01/1997 15:40:35 282,25.323,167.836,04/02/1997 02:58:15 283,25.308,167.838,04/02/1997 08:14:27 284,25.308,167.627,04/02/1997 15:33:20 259,23.484,172.896,"03/21/1997 03:29:26" 260,23.48,172.939,"03/21/1997 07:32:34" 261,23.494,172.769,"03/21/1997 14:23:48" 262,23.445,172.767,"03/21/1997 16:00:39" 263,23.497,172.678,"03/21/1997 18:22:08" 264,23.457,172.692,"03/21/1997 19:59:23" 265,23.429,172.349,"03/22/1997 05:35:06" 266,23.429,172.371,"03/22/1997 07:09:50" 267,23.764,172.317,"03/22/1997 19:44:11" 268,24.013,171.489,"03/24/1997 08:05:41" 269,24.01,171.582,"03/24/1997 15:26:34" 270,24.134,171.417,"03/25/1997 07:46:31" 271,24.17,171.317,"03/25/1997 15:17:32" 246,23.464,175.05,"03/13/1997 07:13:21" 247,23.562,174.865,"03/13/1997 15:52:31" 248,23.456,174.868,"03/13/1997 17:55:07" 249,23.463,174.874,"03/13/1997 19:39:42" 250,23.256,174.572,"03/14/1997 02:59:01" 251,23.564,174.651,"03/14/1997 15:41:38" 245,23.498,175.031,"03/13/1997 03:15:58" 102,25.671,-137.485,"10/31/1996 16:21:59" 103,25.719,-137.884,11/01/1996 16:00:00 104,25.694,-138.365,11/02/1996 17:17:11 105,25.643,-138.776,11/03/1996 15:18:14 106,25.638,-138.789,11/03/1996 16:54:33 107,25.662,-138.974,11/04/1996 02:28:05 108,25.421,-138.794,11/05/1996 03:52:50 109,25.561,-139.579,11/05/1996 17:51:46 110,25.563,-140.274,11/07/1996 15:26:50 111,25.528,-140.267,11/07/1996 17:06:55 112,25.548,-140.815,11/09/1996 16:24:30 113,25.593,-141.048,11/10/1996 03:36:42 114,25.615,-141.252,11/10/1996 17:45:21 89,25.65,-135.568,"10/25/1996 15:15:15" 90,25.643,-135.579,"10/25/1996 16:53:06" 91,25.618,-135.77,"10/26/1996 02:28:26" 92,25.643,-135.633,"10/26/1996 04:04:04" 93,25.649,-135.865,"10/26/1996 16:30:03" 94,25.682,-135.856,"10/27/1996 03:40:38" 95,25.769,-136.848,"10/27/1996 16:12:53" 96,25.661,-136.189,"10/27/1996 17:48:55" 97,25.777,-136.543,"10/28/1996 15:47:56" 98,25.804,-136.654,"10/29/1996 02:58:02" 99,25.782,-136.896,"10/29/1996 15:27:31" 100,25.742,-137.339,"10/31/1996 02:17:44" 101,25.747,-137.569,"10/31/1996 14:44:13" 76,25.352,-132.356,"10/16/1996 15:10:43" 77,25.365,-132.815,"10/17/1996 14:47:32" 78,25.342,-132.846,"10/17/1996 16:23:56" 79,25.392,-133.153,"10/18/1996 16:08:17" 80,25.376,-133.889,"10/20/1996 17:00:37" 81,25.418,-134.033,"10/21/1996 02:30:42" 82,25.398,-134.232,"10/21/1996 14:59:47" 83,25.374,-134.241,"10/21/1996 16:37:45" 84,25.439,-134.545,"10/22/1996 16:19:21" 85,25.555,-134.964,"10/23/1996 15:56:27" 86,25.684,-135.241,"10/24/1996 15:31:29" 87,25.699,-135.264,"10/24/1996 17:13:00" 88,25.679,-135.482,"10/25/1996 04:32:06" 63,24.844,-128.285,10/05/1996 15:46:32 64,24.995,-128.834,10/06/1996 17:06:29 65,25.143,-129.202,10/07/1996 15:05:57 66,25.131,-129.206,10/07/1996 16:45:17 67,25.148,-129.493,10/08/1996 14:46:55 68,25.13,-129.579,10/08/1996 16:22:50 69,25.039,-129.741,10/10/1996 15:40:15 70,25.159,-131.075,10/12/1996 14:58:18 71,25.146,-131.106,10/12/1996 16:38:32 72,25.182,-131.317,"10/13/1996 03:47:48" 73,25.138,-131.353,"10/13/1996 14:36:15" 74,25.134,-131.472,"10/14/1996 15:50:51" 75,25.181,-132.047,"10/15/1996 17:11:06" 50,25.192,-123.185,"09/20/1996 20:06:42" 51,25.118,-123.446,"09/21/1996 15:54:40" 52,25.053,-123.725,"09/22/1996 15:30:57" 53,25.101,-123.835,"09/23/1996 02:46:18" 54,25.015,-124.523,"09/24/1996 14:52:36" 55,25.028,-124.641,"09/25/1996 03:45:22" 56,25.003,-124.818,"09/25/1996 14:27:07" 57,24.984,-124.843,"09/25/1996 16:07:56" 58,25.003,-125.182,"09/26/1996 15:48:20" 59,24.988,-125.888,"09/28/1996 16:41:37" 60,24.967,-126.176,"09/29/1996 16:21:31" 61,24.88,-126.514,"09/30/1996 15:59:01" 62,24.863,-127.272,10/02/1996 15:12:58 37,26.756,-119.533,09/07/1996 15:59:45 38,26.61,-119.543,09/08/1996 03:18:23 39,26.546,-119.728,09/08/1996 15:40:16 40,26.25,-120.619,09/09/1996 15:20:47 41,26.041,-119.922,09/10/1996 14:55:13 42,25.827,-120.256,09/12/1996 15:51:08 43,25.372,-121.303,"09/15/1996 14:47:36" 44,25.362,-121.337,"09/15/1996 16:24:08" 45,25.506,-121.718,"09/17/1996 15:47:52" 46,25.306,-122.33,"09/18/1996 17:00:17" 47,25.339,-122.52,"09/19/1996 04:11:52" 48,25.265,-122.73,"09/19/1996 16:37:26" 49,25.243,-122.934,"09/20/1996 03:50:55" 24,26.767,-118.484,"08/29/1996 03:33:18" 25,26.766,-118.537,"08/29/1996 14:19:14" 26,26.745,-118.549,"08/29/1996 15:58:14" 27,26.729,-118.76,"08/30/1996 15:39:03" 28,26.735,-118.922,"08/31/1996 15:14:57" 29,26.711,-118.937,"08/31/1996 16:52:11" 30,26.699,-119.09,09/01/1996 14:50:02 31,26.687,-119.093,09/01/1996 16:31:40 32,26.69,-119.019,09/03/1996 03:19:17 33,26.622,-119.121,09/03/1996 15:50:20 34,26.749,-119.215,09/05/1996 15:05:03 35,26.773,-119.391,09/06/1996 02:18:50 36,26.79,-119.519,09/07/1996 14:19:30 356,34.491,147.547,"06/16/1997 04:30:31" 357,34.696,147.617,"06/17/1997 02:33:50" 358,35.937,147.317,"06/19/1997 16:20:54" 359,36.002,147.268,"06/19/1997 20:28:27" 360,36.377,147.153,"06/20/1997 17:50:18" 361,36.323,147.244,"06/20/1997 20:01:07" 362,37.519,147.514,"06/23/1997 03:10:08" 363,39.061,146.783,"06/26/1997 15:01:48" 364,39.263,146.131,"06/30/1997 07:25:02" 365,39.699,143.94,07/02/1997 03:08:56 366,39.732,147.277,07/02/1997 18:55:08 367,39.717,146.511,07/06/1997 16:35:01 23,26.718,-118.443,"08/28/1996 16:18:30" 343,35.5,153.244,"05/29/1997 02:41:49" 344,36.345,154.614,"05/29/1997 07:30:06" 345,36.248,152.599,06/01/1997 06:21:49 346,35.578,151.03,06/03/1997 03:28:24 347,35.583,151.088,06/03/1997 15:52:20 348,35.389,151.121,06/04/1997 15:37:28 349,35.302,151.441,06/05/1997 03:02:51 350,34.148,150.77,06/06/1997 15:17:43 351,33.396,149.776,06/08/1997 04:12:37 352,33.08,148.745,06/10/1997 20:23:36 353,33.122,148.524,06/11/1997 16:03:40 354,33.155,148.426,06/11/1997 17:42:58 355,33.633,147.843,"06/14/1997 03:08:53" 212,22.279,-171.627,02/08/1997 04:08:49 11,26.876,-117.009,"08/24/1996 14:28:13" 12,26.84,-117.053,"08/24/1996 16:05:20" 13,26.83,-117.081,"08/24/1996 20:00:25" 14,26.781,-117.126,"08/25/1996 03:18:47" 15,26.762,-117.324,"08/25/1996 15:41:11" 16,26.659,-117.516,"08/26/1996 02:58:06" 17,26.684,-117.75,"08/26/1996 15:21:44" 18,26.669,-117.895,"08/27/1996 02:33:20" 19,26.733,-118.17,"08/27/1996 15:01:13" 20,26.722,-118.116,"08/27/1996 16:41:26" 21,26.711,-118.335,"08/28/1996 02:14:41" 22,26.726,-118.412,"08/28/1996 14:39:16" 199,24.033,-169.748,"01/29/1997 04:34:05" 200,24.123,-170.373,"01/29/1997 18:38:40" 201,24.09,-170.462,"01/31/1997 02:20:57" 202,24.095,-170.467,"01/31/1997 05:26:23" 203,23.92,-170.554,"01/31/1997 19:31:05" 204,23.926,-170.837,02/01/1997 05:05:50 205,23.926,-170.742,02/01/1997 19:07:11 206,24.042,-171.061,02/02/1997 17:10:44 207,23.487,-171.533,02/05/1997 06:52:02 208,22.748,-171.046,02/06/1997 18:57:23 209,22.669,-171.182,02/07/1997 04:32:35 210,22.465,-171.269,02/07/1997 15:18:07 211,22.271,-171.536,02/08/1997 02:33:31 186,23.326,-163.545,"01/15/1997 17:01:40" 187,23.341,-163.669,"01/16/1997 05:56:57" 188,23.405,-163.881,"01/16/1997 18:15:58" 189,23.51,-164.279,"01/17/1997 05:28:11" 190,23.752,-164.785,"01/18/1997 19:18:09" 191,24.025,-165.188,"01/19/1997 17:10:56" 192,24.386,-165.938,"01/20/1997 18:32:00" 193,23.972,-167.66,"01/22/1997 17:44:12" 194,24.133,-167.113,"01/22/1997 19:27:58" 195,24.09,-167.527,"01/23/1997 04:57:41" 196,24.128,-167.75,"01/23/1997 19:09:34" 197,24.088,-167.741,"01/24/1997 04:42:04" 198,23.561,-168.323,"01/25/1997 18:19:58" 173,24.842,-158.42,01/02/1997 05:56:25 174,24.502,-159.206,01/04/1997 17:41:54 175,24.422,-159.64,01/05/1997 17:20:07 176,24.326,-159.937,01/06/1997 04:31:13 177,24.328,-159.977,01/06/1997 06:12:56 178,24.262,-160.153,01/06/1997 16:52:08 179,24.232,-160.132,01/06/1997 18:35:12 180,23.964,-160.905,01/09/1997 03:25:44 181,23.897,-161.545,01/10/1997 17:10:12 182,23.737,-161.77,01/11/1997 04:25:57 183,23.565,-162.454,01/12/1997 18:07:33 184,23.397,-163.479,"01/15/1997 04:36:07" 185,23.407,-163.474,"01/15/1997 06:12:20" 160,24.901,-154.221,"12/17/1996 05:12:40" 161,24.874,-154.368,"12/17/1996 17:35:15" 162,24.706,-154.825,"12/18/1996 18:52:29" 163,24.674,-154.463,"12/19/1996 04:19:55" 164,24.635,-155.283,"12/20/1996 05:43:53" 165,24.62,-155.637,"12/21/1996 03:41:10" 166,24.615,-155.828,"12/21/1996 17:49:33" 167,24.89,-156.221,"12/22/1996 15:47:57" 168,25.131,-156.632,"12/22/1996 17:27:22" 169,25.141,-156.953,"12/25/1996 18:01:45" 170,25.265,-157.252,"12/26/1996 03:30:51" 171,25.6,-158.647,"12/30/1996 05:29:53" 172,24.84,-158.447,01/02/1997 04:16:53 147,25.521,-151.197,12/07/1996 05:31:55 148,25.42,-151.333,12/07/1996 17:53:59 149,25.286,-151.631,12/08/1996 03:24:34 150,25.211,-151.832,12/09/1996 04:43:41 151,25.117,-152.111,12/09/1996 18:50:02 152,25.118,-152.496,12/10/1996 18:26:09 153,25.09,-152.903,12/11/1996 18:05:18 154,25.188,-152.98,12/12/1996 05:21:24 155,25.151,-153.173,12/12/1996 17:46:29 156,25.213,-153.347,"12/13/1996 03:15:50" 157,25.261,-153.502,"12/13/1996 19:02:03" 158,25.331,-153.651,"12/14/1996 18:42:16" 159,24.997,-153.87,"12/16/1996 05:32:25" 134,26.333,-146.43,"11/24/1996 05:15:27" 135,26.329,-146.559,"11/24/1996 15:54:12" 136,26.072,-147.459,"11/26/1996 16:57:55" 137,26.878,-144.154,"11/27/1996 04:06:55" 138,25.963,-148.3,"11/28/1996 03:47:10" 139,25.954,-148.35,"11/28/1996 05:22:36" 140,25.913,-148.55,"11/28/1996 16:12:43" 141,25.859,-148.519,"11/28/1996 17:49:08" 142,25.902,-150.386,12/04/1996 03:13:21 143,25.813,-150.648,12/05/1996 02:51:42 144,25.794,-150.802,12/05/1996 16:57:28 145,25.669,-151.089,12/06/1996 16:33:20 146,25.576,-151.231,12/07/1996 03:47:36 121,25.75,-142.462,"11/13/1996 16:38:15" 122,26.056,-143.149,"11/15/1996 15:55:02" 123,26.005,-143.427,"11/16/1996 17:11:44" 124,26.027,-143.652,"11/17/1996 04:24:42" 125,25.966,-143.69,"11/17/1996 16:48:47" 126,25.982,-143.847,"11/18/1996 02:24:36" 127,26.002,-143.835,"11/18/1996 04:03:01" 128,26.161,-144.44,"11/20/1996 03:18:39" 129,26.111,-144.957,"11/21/1996 03:00:39" 130,26.293,-144.885,"11/21/1996 04:33:00" 131,26.337,-145.239,"11/21/1996 17:04:04" 132,26.263,-145.72,"11/22/1996 15:01:21" 133,26.774,-147.146,"11/22/1996 16:45:50" 226,22.3,-176.076,"02/21/1997 14:24:26" 227,22.012,-176.466,"02/22/1997 03:20:46" 228,22.143,-177.38,"02/23/1997 07:00:33" 229,22.417,-177.215,"02/24/1997 06:38:40" 230,22.451,-179.722,"02/25/1997 02:52:59" 231,21.574,-178.324,"02/26/1997 15:06:54" 232,21.886,-179.325,"02/26/1997 20:06:58" 233,21.988,-179.734,"02/27/1997 02:29:26" 234,23.158,-178.148,"02/27/1997 07:09:04" 235,21.951,-179.88,"02/27/1997 15:00:04" 118,25.625,-141.731,11/12/1996 04:38:48 119,25.738,-142.05,11/12/1996 15:18:14 120,25.74,-142.097,11/12/1996 16:59:41 213,22.361,-172.684,02/10/1997 05:01:28 214,22.243,-172.275,02/10/1997 06:44:18 215,22.401,-172.899,02/12/1997 14:25:15 216,22.248,-172.755,02/12/1997 20:08:17 217,22.226,-172.716,"02/13/1997 07:18:27" 218,22.184,-173.176,"02/14/1997 06:57:44" 219,22.263,-173.475,"02/15/1997 04:56:55" 220,22.169,-173.53,"02/15/1997 15:26:45" 221,22.306,-173.693,"02/16/1997 06:15:08" 222,21.896,-174.396,"02/18/1997 17:57:45" 223,21.924,-174.63,"02/19/1997 05:07:50" 224,21.831,-174.894,"02/19/1997 17:36:30" 225,22.306,-175.88,"02/21/1997 04:27:59" 1,28.668,-114.237,08/11/1996 01:15:00 2,28.365,-115.573,"08/17/1996 15:18:23" 3,28.26,-115.62,"08/18/1996 14:57:44" 4,28.252,-115.677,"08/18/1996 16:34:26" 5,28.185,-115.559,"08/19/1996 14:31:33" 6,28.168,-115.765,"08/19/1996 16:14:17" 7,28.171,-115.926,"08/20/1996 14:12:10" 8,28.133,-115.896,"08/20/1996 15:54:27" 9,27.361,-116.422,"08/22/1996 15:11:14" 10,27.004,-116.718,"08/23/1996 16:28:05" 252,23.704,173.653,"03/16/1997 15:18:09" 253,23.635,173.402,"03/17/1997 02:31:52" 254,23.544,173.242,"03/17/1997 19:47:09" 255,23.577,173.112,"03/18/1997 04:01:07" 256,23.627,168.484,"03/18/1997 19:26:36" 257,23.69,172.979,"03/19/1997 03:49:31" 258,23.497,173.023,"03/20/1997 20:18:05" 115,25.653,-141.611,11/11/1996 04:53:32 116,25.635,-141.71,11/11/1996 15:41:21 117,25.647,-141.857,11/12/1996 02:54:16 236,21.905,179.925,"02/28/1997 06:50:04" 237,21.754,179.587,03/01/1997 18:59:34 238,22.049,178.971,03/03/1997 05:43:15 239,22.356,178.215,03/04/1997 05:24:04 240,22.289,178.06,03/04/1997 15:41:50 241,23.182,176.165,03/08/1997 19:42:38 242,23.136,176.046,03/09/1997 02:24:28 243,23.481,175.637,03/11/1997 06:11:34 244,23.458,175.518,03/11/1997 20:15:48 sp/inst/include/0000755000176200001440000000000013124434530013273 5ustar liggesuserssp/inst/include/sp.h0000644000176200001440000000572613124453226014103 0ustar liggesusers#ifndef R_SP_H #define R_SP_H #ifdef SP_XPORT # define SP_PREFIX(name) SP_XPORT(name) #else # define SP_PREFIX(name) name #endif /* remember to touch local_stubs.c */ #define SP_VERSION "1.2-5" #include /* RSB 091203 */ #include #define R_OFFSET 1 #include #include /* from insiders.c int pipbb(double pt1, double pt2, double *bbs); int between(double x, double low, double up); SEXP insiders(SEXP n1, SEXP bbs); */ /* from pip.c */ #ifndef MIN # define MIN(a,b) ((a)>(b)?(b):(a)) #endif #ifndef MAX # define MAX(a,b) ((a)>(b)?(a):(b)) #endif #define BUFSIZE 8192 /* polygon structs: */ typedef struct { double x, y; } PLOT_POINT; typedef struct { PLOT_POINT min, max; } MBR; typedef struct polygon { MBR mbr; int lines; PLOT_POINT *p; int close; /* 1 - is closed polygon */ } POLYGON; void setup_poly_minmax(POLYGON *pl); char InPoly(PLOT_POINT q, POLYGON *Poly); SEXP R_point_in_polygon_sp(SEXP px, SEXP py, SEXP polx, SEXP poly); void sarea(double *heights, int *nx, int *ny, double *w, double *h, double *sa, int *bycell); void spRFindCG( int *n, double *x, double *y, double *xc, double *yc, double *area ); void sp_gcdist(double *lon1, double *lon2, double *lat1, double *lat2, double *dist); void sp_dists(double *u, double *v, double *uout, double *vout, int *n, double *dists, int *lonlat); void sp_dists_NN(double *u1, double *v1, double *u2, double *v2, int *n, double *dists, int *lonlat); void sp_lengths(double *u, double *v, int *n, double *lengths, int *lonlat); SEXP sp_zerodist(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat, SEXP mcmp); SEXP sp_duplicates(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat, SEXP mcmp); SEXP pointsInBox(SEXP lb, SEXP px, SEXP py); SEXP tList(SEXP nl, SEXP m); /* RSB 091203 */ #define DIM 2 /* Dimension of points */ typedef double tPointd[DIM]; /* type double point */ double SP_PREFIX(Area2)(const tPointd a, const tPointd b, const tPointd c); void SP_PREFIX(FindCG)(int n, tPointd *P, tPointd CG, double *Areasum2); void SP_PREFIX(Centroid3)(const tPointd p1, const tPointd p2, const tPointd p3, tPointd c); void SP_PREFIX(spRFindCG_c)(const SEXP n, const SEXP coords, double *xc, double *yc, double *area ); void SP_PREFIX(comm2comment)(char *buf, int bufsiz, int *comm, int nps); SEXP SP_PREFIX(Polygon_c)(const SEXP coords, const SEXP n, const SEXP hole); SEXP SP_PREFIX(Polygons_c)(const SEXP pls, const SEXP ID); SEXP SP_PREFIX(SpatialPolygons_c)(const SEXP pls, const SEXP pO, const SEXP p4s); SEXP SP_PREFIX(bboxCalcR_c)(const SEXP pls); SEXP SP_PREFIX(Polygon_validate_c)(const SEXP obj); SEXP SP_PREFIX(Polygons_validate_c)(const SEXP obj); SEXP SP_PREFIX(SpatialPolygons_validate_c)(const SEXP obj); SEXP SP_PREFIX(SpatialPolygons_getIDs_c)(const SEXP obj); SEXP SP_PREFIX(SpatialPolygons_plotOrder_c)(const SEXP pls); SEXP SP_PREFIX(comment2comm)(const SEXP obj); SEXP SP_PREFIX(sp_linkingTo_version)(); #endif /* remember to touch local_stubs.c */ sp/inst/include/sp_xports.c0000644000176200001440000004615313071125541015511 0ustar liggesusers#define USING_R 1 #include "sp.h" /* remember to touch local_stubs.c */ SEXP SP_PREFIX(sp_linkingTo_version)(void) { SEXP ans; PROTECT(ans = NEW_CHARACTER(1)); SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(SP_VERSION)); UNPROTECT(1); return(ans); } SEXP SP_PREFIX(Polygon_c)(const SEXP coords, const SEXP n, const SEXP ihole) { SEXP SPans, labpt, Area, ringDir, hole; double area, xc, yc; double *x, *y; int pc=0, rev=FALSE; int i, ii, nn=INTEGER_POINTER(n)[0]; SEXP valid; SEXP ccopy, /* copy of coords to go into returned structure */ dim1; for (i=0; i 2) { xc = (NUMERIC_POINTER(ccopy)[0] + NUMERIC_POINTER(ccopy)[(nn-1)])/2.0; yc = (NUMERIC_POINTER(ccopy)[nn] + NUMERIC_POINTER(ccopy)[nn+(nn-1)])/2.0; } } } PROTECT(SPans = NEW_OBJECT(MAKE_CLASS("Polygon"))); pc++; PROTECT(ringDir = NEW_INTEGER(1)); pc++; INTEGER_POINTER(ringDir)[0] = (area > 0.0) ? -1 : 1; // -1 cw hole, 1 ccw not-hole /* RSB 100126 fixing hole assumption thanks to Javier Munoz for report */ if (INTEGER_POINTER(ihole)[0] == NA_INTEGER) { // trust ring direction if (INTEGER_POINTER(ringDir)[0] == 1) INTEGER_POINTER(ihole)[0] = 0; else if (INTEGER_POINTER(ringDir)[0] == -1) INTEGER_POINTER(ihole)[0] = 1; } else { // trust hole if (INTEGER_POINTER(ihole)[0] == 1 && INTEGER_POINTER(ringDir)[0] == 1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = -1; } if (INTEGER_POINTER(ihole)[0] == 0 && INTEGER_POINTER(ringDir)[0] == -1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = 1; } } PROTECT(hole = NEW_LOGICAL(1)); pc++; if (INTEGER_POINTER(ihole)[0] == 1) LOGICAL_POINTER(hole)[0] = TRUE; else LOGICAL_POINTER(hole)[0] = FALSE; if (rev) { x = (double *) R_alloc((size_t) nn, sizeof(double)); y = (double *) R_alloc((size_t) nn, sizeof(double)); for (i=0; i 1) { for (i=0; i UX) UX = x; if (y > UY) UY = y; if (x < LX) LX = x; if (y < LY) LY = y; } } } PROTECT(ans = NEW_NUMERIC(4)); pc++; NUMERIC_POINTER(ans)[0] = LX; NUMERIC_POINTER(ans)[1] = LY; NUMERIC_POINTER(ans)[2] = UX; NUMERIC_POINTER(ans)[3] = UY; PROTECT(dim = NEW_INTEGER(2)); pc++; INTEGER_POINTER(dim)[0] = 2; INTEGER_POINTER(dim)[1] = 2; setAttrib(ans, R_DimSymbol, dim); PROTECT(dimnames = NEW_LIST(2)); pc++; SET_VECTOR_ELT(dimnames, 0, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 0, COPY_TO_USER_STRING("x")); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 1, COPY_TO_USER_STRING("y")); SET_VECTOR_ELT(dimnames, 1, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 0, COPY_TO_USER_STRING("min")); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 1, COPY_TO_USER_STRING("max")); setAttrib(ans, R_DimNamesSymbol, dimnames); UNPROTECT(pc); return(ans); } void SP_PREFIX(spRFindCG_c)(const SEXP n, const SEXP coords, double *xc, double *yc, double *area ) { int i, nn; tPointd *P; tPointd CG; double Areasum2; nn = INTEGER_POINTER(n)[0]; P = (tPointd *) R_alloc((size_t) nn, sizeof(tPointd)); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[0], (size_t) nss[0]); s[nss[0]] = '\0'; c[0] = atoi(s); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[(nss[i]+1)], (size_t) k); s[k] = '\0'; c[i+1] = atoi(s); } for (i=0, k=0; i<(ns+1); i++) if (c[i] == 0) k++; PROTECT(ans = NEW_LIST((k))); pc++; co = (int *) R_alloc((size_t) k, sizeof(int)); coo = (int *) R_alloc((size_t) k, sizeof(int)); for (i=0; i 1) { for (j=0; j<(ns+1); j++) if (c[j] == coo[i]) INTEGER_POINTER(VECTOR_ELT(ans, i))[jj++] = j + R_OFFSET; } } UNPROTECT(pc); return(ans); } void SP_PREFIX(comm2comment)(char *buf, int bufsiz, int *comm, int nps) { char cbuf[15]; int i, nc, nc1; nc = (int) (ceil(log10(nps)+1.0)+1.0); nc1 = (nc*nps)+1; if (bufsiz < nc1) error("comm2comment: buffer overflow"); sprintf(buf, "%d", comm[0]); for (i=1; i= bufsiz) error("comm2comment: buffer overflow"); strcat(buf, cbuf); } strcat(buf, "\0"); return; } /* remember to touch local_stubs.c */ sp/tests/0000755000176200001440000000000012722650511012037 5ustar liggesuserssp/tests/point.in.polygon.Rout.save0000644000176200001440000000147012577541412017104 0ustar liggesusers R : Copyright 2004, The R Foundation for Statistical Computing Version 2.0.1 (2004-11-15), ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for a HTML browser interface to help. Type 'q()' to quit R. > library(sp) > > # open polygon: > print(point.in.polygon(1:10,1:10,c(3,5,5,3),c(3,3,5,5))) [1] 0 0 3 1 3 0 0 0 0 0 > # closed polygon: > print(point.in.polygon(1:10,rep(4,10),c(3,5,5,3,3),c(3,3,5,5,3))) [1] 0 0 2 1 2 0 0 0 0 0 > sp/tests/pass1.Rout.save0000644000176200001440000005016712577541412014716 0ustar liggesusers R version 3.2.2 (2015-08-14) -- "Fire Safety" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > x = meuse > coordinates(x) = cbind(rnorm(155), rnorm(155)) > # should pass: > names(x@data) [1] "x" "y" "cadmium" "copper" "lead" "zinc" "elev" [8] "dist" "om" "ffreq" "soil" "lime" "landuse" "dist.m" > names(as.data.frame(x)) [1] "x" "y" "cadmium" "copper" "lead" "zinc" [7] "elev" "dist" "om" "ffreq" "soil" "lime" [13] "landuse" "dist.m" "coords.x1" "coords.x2" > class(as(x, "data.frame")) [1] "data.frame" > x = meuse > # coordinates defined as data: > coordinates(x) = cbind(xcoord = rnorm(155), ycoord = rnorm(155)) > # should pass: > names(x@data) [1] "x" "y" "cadmium" "copper" "lead" "zinc" "elev" [8] "dist" "om" "ffreq" "soil" "lime" "landuse" "dist.m" > names(as.data.frame(x)) [1] "x" "y" "cadmium" "copper" "lead" "zinc" "elev" [8] "dist" "om" "ffreq" "soil" "lime" "landuse" "dist.m" [15] "xcoord" "ycoord" > is.projected(x) [1] NA > proj4string(x) [1] NA > > set.seed(13131) # make sample reproducable: > x = meuse[, sample(ncol(meuse))] # 'randomly' shuffle columns > # coordinates defined as variable names: > coordinates(x) = c("x", "y") # no matter their position > #plot(x, cex=.05 * sqrt(x@data[,"zinc"]), > plot(x, cex=.05 * sqrt(as.data.frame(x)[["zinc"]]),pch=1) > title("Meuse: zinc bubble plot") > print(summary(x)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: lime landuse zinc elev dist.m 0:111 W :50 Min. : 113.0 Min. : 5.180 Min. : 10.0 1: 44 Ah :39 1st Qu.: 198.0 1st Qu.: 7.546 1st Qu.: 80.0 Am :22 Median : 326.0 Median : 8.180 Median : 270.0 Fw :10 Mean : 469.7 Mean : 8.165 Mean : 290.3 Ab : 8 3rd Qu.: 674.5 3rd Qu.: 8.955 3rd Qu.: 450.0 (Other):25 Max. :1839.0 Max. :10.520 Max. :1000.0 NA's : 1 dist soil copper om lead Min. :0.00000 1:97 Min. : 14.00 Min. : 1.000 Min. : 37.0 1st Qu.:0.07569 2:46 1st Qu.: 23.00 1st Qu.: 5.300 1st Qu.: 72.5 Median :0.21184 3:12 Median : 31.00 Median : 6.900 Median :123.0 Mean :0.24002 Mean : 40.32 Mean : 7.478 Mean :153.4 3rd Qu.:0.36407 3rd Qu.: 49.50 3rd Qu.: 9.000 3rd Qu.:207.0 Max. :0.88039 Max. :128.00 Max. :17.000 Max. :654.0 NA's :2 cadmium ffreq Min. : 0.200 1:84 1st Qu.: 0.800 2:48 Median : 2.100 3:23 Mean : 3.246 3rd Qu.: 3.850 Max. :18.100 > > # coordinates defined as formula: > x = meuse[, 1:5] > coordinates(x) = ~x+y > print(summary(x)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead Min. : 0.200 Min. : 14.00 Min. : 37.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 Median : 2.100 Median : 31.00 Median :123.0 Mean : 3.246 Mean : 40.32 Mean :153.4 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 Max. :18.100 Max. :128.00 Max. :654.0 > > # a = NULL > # cc = cbind(sample(1:10), sample(1:10), sample(1:10)) > # coordinates(a) = cc > # summary(a) > > xx = SpatialPointsDataFrame(matrix(1:10,5,2),data.frame(f = 1:5)) > rbind(xx,xx,xx,xx) coordinates f 1 (1, 6) 1 2 (2, 7) 2 3 (3, 8) 3 4 (4, 9) 4 5 (5, 10) 5 6 (1, 6) 1 7 (2, 7) 2 8 (3, 8) 3 9 (4, 9) 4 10 (5, 10) 5 11 (1, 6) 1 12 (2, 7) 2 13 (3, 8) 3 14 (4, 9) 4 15 (5, 10) 5 16 (1, 6) 1 17 (2, 7) 2 18 (3, 8) 3 19 (4, 9) 4 20 (5, 10) 5 > > grd <- GridTopology(c(1,1), c(1,1), c(10,10)) > polys <- as.SpatialPolygons.GridTopology(grd) > summary(rbind(polys[1:10], polys[11:20], polys[21:30])) Object of class SpatialPolygons Coordinates: min max x 0.5 10.5 y 7.5 10.5 Is projected: NA proj4string : [NA] > plot(rbind(polys[1:10],polys[21:30])) > title("2 x 10 blocks -- test rbind on SpatialPolygons") > > l1 = cbind(c(1,2,3),c(3,2,2)) > l1a = cbind(l1[,1]+.05,l1[,2]+.05) > l2 = cbind(c(1,2,3),c(1,1.5,1)) > Sl1 = Line(l1) > Sl1a = Line(l1a) > Sl2 = Line(l2) > S1 = Lines(list(Sl1, Sl1a), ID="a") > S2 = Lines(list(Sl2), ID="b") > Sl = SpatialLines(list(S1,S2)) > > summary(as(polys, "SpatialLines")) Object of class SpatialLines Coordinates: min max x 0.5 10.5 y 0.5 10.5 Is projected: NA proj4string : [NA] > summary(as(Sl, "SpatialPoints")) Object of class SpatialPoints Coordinates: min max coords.x1 1 3.05 coords.x2 1 3.05 Is projected: NA proj4string : [NA] Number of points: 9 > summary(as(Sl, "SpatialPointsDataFrame")) Object of class SpatialPointsDataFrame Coordinates: min max coords.x1 1 3.05 coords.x2 1 3.05 Is projected: NA proj4string : [NA] Number of points: 9 Data attributes: Lines.NR Lines.ID Line.NR Min. :1.000 a:6 Min. :1.000 1st Qu.:1.000 b:3 1st Qu.:1.000 Median :1.000 Median :1.000 Mean :1.333 Mean :1.333 3rd Qu.:2.000 3rd Qu.:2.000 Max. :2.000 Max. :2.000 > SlDf = SpatialLinesDataFrame(Sl, data.frame(xx = c("foo", "bar")), match.ID = FALSE) > summary(as(SlDf, "SpatialPointsDataFrame")) Object of class SpatialPointsDataFrame Coordinates: min max coords.x1 1 3.05 coords.x2 1 3.05 Is projected: NA proj4string : [NA] Number of points: 9 Data attributes: xx Lines.NR Lines.ID Line.NR bar:3 Min. :1.000 a:6 Min. :1.000 foo:6 1st Qu.:1.000 b:3 1st Qu.:1.000 Median :1.000 Median :1.000 Mean :1.333 Mean :1.333 3rd Qu.:2.000 3rd Qu.:2.000 Max. :2.000 Max. :2.000 > > meuse[["xxx"]] = log(meuse$zinc) > summary(meuse) x y cadmium copper Min. :178605 Min. :329714 Min. : 0.200 Min. : 14.00 1st Qu.:179371 1st Qu.:330762 1st Qu.: 0.800 1st Qu.: 23.00 Median :179991 Median :331633 Median : 2.100 Median : 31.00 Mean :180005 Mean :331635 Mean : 3.246 Mean : 40.32 3rd Qu.:180630 3rd Qu.:332463 3rd Qu.: 3.850 3rd Qu.: 49.50 Max. :181390 Max. :333611 Max. :18.100 Max. :128.00 lead zinc elev dist Min. : 37.0 Min. : 113.0 Min. : 5.180 Min. :0.00000 1st Qu.: 72.5 1st Qu.: 198.0 1st Qu.: 7.546 1st Qu.:0.07569 Median :123.0 Median : 326.0 Median : 8.180 Median :0.21184 Mean :153.4 Mean : 469.7 Mean : 8.165 Mean :0.24002 3rd Qu.:207.0 3rd Qu.: 674.5 3rd Qu.: 8.955 3rd Qu.:0.36407 Max. :654.0 Max. :1839.0 Max. :10.520 Max. :0.88039 om ffreq soil lime landuse dist.m Min. : 1.000 1:84 1:97 0:111 W :50 Min. : 10.0 1st Qu.: 5.300 2:48 2:46 1: 44 Ah :39 1st Qu.: 80.0 Median : 6.900 3:23 3:12 Am :22 Median : 270.0 Mean : 7.478 Fw :10 Mean : 290.3 3rd Qu.: 9.000 Ab : 8 3rd Qu.: 450.0 Max. :17.000 (Other):25 Max. :1000.0 NA's :2 NA's : 1 xxx Min. :4.727 1st Qu.:5.288 Median :5.787 Mean :5.886 3rd Qu.:6.514 Max. :7.517 > meuse$xxy = log(meuse[["zinc"]]) > summary(meuse) x y cadmium copper Min. :178605 Min. :329714 Min. : 0.200 Min. : 14.00 1st Qu.:179371 1st Qu.:330762 1st Qu.: 0.800 1st Qu.: 23.00 Median :179991 Median :331633 Median : 2.100 Median : 31.00 Mean :180005 Mean :331635 Mean : 3.246 Mean : 40.32 3rd Qu.:180630 3rd Qu.:332463 3rd Qu.: 3.850 3rd Qu.: 49.50 Max. :181390 Max. :333611 Max. :18.100 Max. :128.00 lead zinc elev dist Min. : 37.0 Min. : 113.0 Min. : 5.180 Min. :0.00000 1st Qu.: 72.5 1st Qu.: 198.0 1st Qu.: 7.546 1st Qu.:0.07569 Median :123.0 Median : 326.0 Median : 8.180 Median :0.21184 Mean :153.4 Mean : 469.7 Mean : 8.165 Mean :0.24002 3rd Qu.:207.0 3rd Qu.: 674.5 3rd Qu.: 8.955 3rd Qu.:0.36407 Max. :654.0 Max. :1839.0 Max. :10.520 Max. :0.88039 om ffreq soil lime landuse dist.m Min. : 1.000 1:84 1:97 0:111 W :50 Min. : 10.0 1st Qu.: 5.300 2:48 2:46 1: 44 Ah :39 1st Qu.: 80.0 Median : 6.900 3:23 3:12 Am :22 Median : 270.0 Mean : 7.478 Fw :10 Mean : 290.3 3rd Qu.: 9.000 Ab : 8 3rd Qu.: 450.0 Max. :17.000 (Other):25 Max. :1000.0 NA's :2 NA's : 1 xxx xxy Min. :4.727 Min. :4.727 1st Qu.:5.288 1st Qu.:5.288 Median :5.787 Median :5.787 Mean :5.886 Mean :5.886 3rd Qu.:6.514 3rd Qu.:6.514 Max. :7.517 Max. :7.517 > > # test behaviour on zero-length objects: > demo(meuse, ask = FALSE, echo = FALSE) > p = as(meuse, "SpatialPoints") > > p[0] SpatialPoints: x y Coordinate Reference System (CRS) arguments: +init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs > dim(p[0]) NULL > > meuse[0,] [1] coordinates cadmium copper lead zinc elev [7] dist om ffreq soil lime landuse [13] dist.m <0 rows> (or 0-length row.names) > dim(meuse[1:3,0]) [1] 3 0 > dim(subset(meuse, zinc < 100, 0)) [1] 0 0 > dim(subset(meuse, , 0)) [1] 155 0 > dim(subset(meuse, F, 0)) [1] 0 0 > > dim(meuse.grid[0,]) [1] 0 5 > fullgrid(meuse.grid) = TRUE > dim(meuse.grid[0,]) [1] 8112 5 > summary(meuse.grid[0,]) Object of class SpatialGridDataFrame Coordinates: min max x 178440 181560 y 329600 333760 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] Grid attributes: cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 Data attributes: part.a part.b dist soil ffreq Mode:logical Mode:logical Mode:logical Mode:logical Mode:logical NA's:8112 NA's:8112 NA's:8112 NA's:8112 NA's:8112 > dim(meuse.grid[,0]) [1] 8112 5 > summary(meuse.grid[,0]) Object of class SpatialGridDataFrame Coordinates: min max x 178440 181560 y 329600 333760 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] Grid attributes: cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 Data attributes: part.a part.b dist soil ffreq Mode:logical Mode:logical Mode:logical Mode:logical Mode:logical NA's:8112 NA's:8112 NA's:8112 NA's:8112 NA's:8112 > dim(meuse.grid[0,,0]) [1] 8112 0 > summary(meuse.grid[0,,0]) Object of class SpatialGridDataFrame Coordinates: min max x 178440 181560 y 329600 333760 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] Grid attributes: cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 > > # SpatialPolygons: > L = as(meuse.riv, "SpatialPolygons") > length(L[1]) [1] 1 > length(L[0]) [1] 0 > summary(L[0]) Object of class SpatialPolygons Coordinates: min max x 178304.0 182331.5 y 325698.5 337684.8 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] > > # SpatialPolygonsDataFrame: > L$something = "bla" > class(L) [1] "SpatialPolygonsDataFrame" attr(,"package") [1] "sp" > length(L[1]) [1] 1 > summary(L[1]) Object of class SpatialPolygonsDataFrame Coordinates: min max x 178304.0 182331.5 y 325698.5 337684.8 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] Data attributes: something bla:1 > length(L[0]) [1] 1 > summary(L[0]) Object of class SpatialPolygonsDataFrame Coordinates: min max x 178304.0 182331.5 y 325698.5 337684.8 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] > > # SpatialLines > L = as(meuse.riv, "SpatialLines") > length(L[1]) [1] 1 > length(L[0]) [1] 0 > summary(L[0]) Object of class SpatialLines Coordinates: min max x 178304.0 182331.5 y 325698.5 337684.8 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] > > # SpatialLinesDataFrame > L$something = "bla" > class(L) [1] "SpatialLinesDataFrame" attr(,"package") [1] "sp" > length(L[1]) [1] 1 > summary(L[1]) Object of class SpatialLinesDataFrame Coordinates: min max x 178304.0 182331.5 y 325698.5 337684.8 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] Data attributes: something bla:1 > length(L[0]) [1] 1 > summary(L[0]) Object of class SpatialLinesDataFrame Coordinates: min max x 178304.0 182331.5 y 325698.5 337684.8 Is projected: TRUE proj4string : [+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs] > > m = meuse > all.equal(rbind(m[1:3,], m[5:7,]), rbind(m[1:3,], m[0,], m[5:7,])) [1] TRUE > all.equal(rbind(m[1:3,], m[5:7,]), rbind(m[0,], m[1:3,], m[0,], m[5:7,])) [1] TRUE > all.equal(rbind(m[1:3,], m[5:7,]), rbind(m[1:3,], m[0,], m[5:7,], m[0,])) [1] TRUE > > # match.ID settings for SpatialPointsDataFrame(): > set.seed(1331) > pts = cbind(1:5, 1:5) > dimnames(pts)[[1]] = letters[1:5] > df = data.frame(a = 1:5) > row.names(df) = letters[5:1] > > library(sp) > options(warn=1) # show warnings where they occur > SpatialPointsDataFrame(pts, df) # warn Warning in SpatialPointsDataFrame(pts, df) : forming a SpatialPointsDataFrame based on maching IDs, not on record order. Use match.ID = FALSE to match on record order coordinates a a (1, 1) 5 b (2, 2) 4 c (3, 3) 3 d (4, 4) 2 e (5, 5) 1 > SpatialPointsDataFrame(pts, df, match.ID = TRUE) # don't warn coordinates a a (1, 1) 5 b (2, 2) 4 c (3, 3) 3 d (4, 4) 2 e (5, 5) 1 > SpatialPointsDataFrame(pts, df, match.ID = FALSE) # don't warn coordinates a e (1, 1) 1 d (2, 2) 2 c (3, 3) 3 b (4, 4) 4 a (5, 5) 5 > df$m = letters[5:1] > SpatialPointsDataFrame(pts, df, match.ID = "m") # don't warn coordinates a m a (1, 1) 5 a b (2, 2) 4 b c (3, 3) 3 c d (4, 4) 2 d e (5, 5) 1 e > > dimnames(pts)[[1]] = letters[5:1] > pts [,1] [,2] e 1 1 d 2 2 c 3 3 b 4 4 a 5 5 > SpatialPointsDataFrame(pts, df) # don't warn: match doesn't reorder coordinates a m e (1, 1) 1 e d (2, 2) 2 d c (3, 3) 3 c b (4, 4) 4 b a (5, 5) 5 a > > # duplicated row name: > dimnames(pts)[[1]] = letters[c(1:4,1)] > pts [,1] [,2] a 1 1 b 2 2 c 3 3 d 4 4 a 5 5 > xx = try(x <- SpatialPointsDataFrame(pts, df)) Warning in SpatialPointsDataFrame(pts, df) : forming a SpatialPointsDataFrame based on maching IDs, not on record order. Use match.ID = FALSE to match on record order Error in SpatialPointsDataFrame(pts, df) : row.names of data and dimnames of coords do not match > class(xx) [1] "try-error" > xx [1] "Error in SpatialPointsDataFrame(pts, df) : \n row.names of data and dimnames of coords do not match\n" attr(,"class") [1] "try-error" attr(,"condition") > SpatialPointsDataFrame(pts, df, match.ID = FALSE) Warning in validityMethod(object) : duplicate rownames are interpreted by rgeos as MultiPoints; use SpatialMultiPoints to define these; in future sp versions this warning will become an error coordinates a m e (1, 1) 1 e d (2, 2) 2 d c (3, 3) 3 c b (4, 4) 4 b a (5, 5) 5 a > try(x <- SpatialPointsDataFrame(pts, df, match.ID = TRUE)) # fail Error in SpatialPointsDataFrame(pts, df, match.ID = TRUE) : row.names of data and dimnames of coords do not match > > dimnames(pts)[[1]] = letters[5:1] > row.names(df) = letters[6:2] # non-matching row.names > SpatialPointsDataFrame(pts, df) # do not match.ID coordinates a m f (1, 1) 1 e e (2, 2) 2 d d (3, 3) 3 c c (4, 4) 4 b b (5, 5) 5 a > SpatialPointsDataFrame(pts, df, match.ID = FALSE) coordinates a m f (1, 1) 1 e e (2, 2) 2 d d (3, 3) 3 c c (4, 4) 4 b b (5, 5) 5 a > try(x <- SpatialPointsDataFrame(pts, df, match.ID = TRUE)) # fail Error in SpatialPointsDataFrame(pts, df, match.ID = TRUE) : row.names of data and coords do not match > > proc.time() user system elapsed 0.889 0.324 0.889 sp/tests/spDists.R0000644000176200001440000000067012577541412013625 0ustar liggesuserslibrary(sp) data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y coordinates(meuse.grid) = ~x+y x = coordinates(meuse) y = coordinates(meuse.grid) out = spDists(meuse,meuse.grid) out2 = as.matrix(dist(rbind(coordinates(meuse),coordinates(meuse.grid)))) out2 = out2[1:155,155+1:nrow(y)] # should be equal: sum(out2 - out) summary(as.vector(out2 - out)) out = spDists(meuse.grid,meuse) sum(out2 - t(out)) summary(as.vector(out2 - t(out))) sp/tests/point.in.polygon.R0000644000176200001440000000025212577541412015414 0ustar liggesuserslibrary(sp) # open polygon: print(point.in.polygon(1:10,1:10,c(3,5,5,3),c(3,3,5,5))) # closed polygon: print(point.in.polygon(1:10,rep(4,10),c(3,5,5,3,3),c(3,3,5,5,3))) sp/tests/over2.Rout.save0000644000176200001440000000602112577541412014712 0ustar liggesusers R version 3.2.2 (2015-08-14) -- "Fire Safety" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > > g = SpatialGrid(GridTopology(c(0,0), c(1,1), c(3,3))) > p = as(g, "SpatialPolygons") > over(g,g) 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 > over(p,p) g1.g1 g2.g1 g3.g2 g4.g1 g5.g1 g6.g2 g7.g4 g8.g4 g9.g5 1 1 2 1 1 2 4 4 5 > over(p,p, minDimension = 0) # orders; different names g1 g2 g3 g4 g5 g6 g7 g8 g9 1 2 3 4 5 6 7 8 9 > over(p,g) g1 g2 g3 g4 g5 g6 g7 g8 g9 1 2 3 4 5 6 7 8 9 > over(g,p) 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 > > over(p,p,returnList=TRUE) $g1 g1 g2 g4 g5 1 2 4 5 $g2 g1 g2 g3 g4 g5 g6 1 2 3 4 5 6 $g3 g2 g3 g5 g6 2 3 5 6 $g4 g1 g2 g4 g5 g7 g8 1 2 4 5 7 8 $g5 g1 g2 g3 g4 g5 g6 g7 g8 g9 1 2 3 4 5 6 7 8 9 $g6 g2 g3 g5 g6 g8 g9 2 3 5 6 8 9 $g7 g4 g5 g7 g8 4 5 7 8 $g8 g4 g5 g6 g7 g8 g9 4 5 6 7 8 9 $g9 g5 g6 g8 g9 5 6 8 9 > over(p,p,returnList=TRUE, minDimension=0) $g1 [1] 1 2 4 5 $g2 [1] 2 1 3 5 4 6 $g3 [1] 3 2 6 5 $g4 [1] 4 1 5 7 2 8 $g5 [1] 5 2 4 6 8 1 3 7 9 $g6 [1] 6 3 5 9 2 8 $g7 [1] 7 4 8 5 $g8 [1] 8 5 7 9 4 6 $g9 [1] 9 6 8 5 > over(p,p,returnList=TRUE, minDimension=1) $g1 [1] 1 2 4 $g2 [1] 2 1 3 5 $g3 [1] 3 2 6 $g4 [1] 4 1 5 7 $g5 [1] 5 2 4 6 8 $g6 [1] 6 3 5 9 $g7 [1] 7 4 8 $g8 [1] 8 5 7 9 $g9 [1] 9 6 8 > over(p,p,returnList=TRUE, minDimension=2) $g1 [1] 1 $g2 [1] 2 $g3 [1] 3 $g4 [1] 4 $g5 [1] 5 $g6 [1] 6 $g7 [1] 7 $g8 [1] 8 $g9 [1] 9 > over(p,p[1:6],minDimension=2) g1 g2 g3 g4 g5 g6 g7 g8 g9 1 2 3 4 5 6 NA NA NA > > x2 = x1 = cbind(c(0,1,1,0,0), c(0,0,1,1,0)) > x1[,1] = x1[,1]+0.5 > x1[,2] = x1[,2]+0.25 > sp = SpatialPolygons(list( + Polygons(list(Polygon(x1)), "x1"), + Polygons(list(Polygon(x2)), "x2"))) > pt = SpatialPoints(cbind(0.5,0.5)) # on border of x1 > row.names(pt) = "pt1" > over(pt,sp) pt1 2 > over(pt,sp,returnList=TRUE) $pt1 [1] 1 2 > > rgeos::overGeomGeom(pt,sp) pt1.x1 1 > rgeos::overGeomGeom(pt,sp,returnList=TRUE) $pt1 x1 x2 1 2 > > plot(sp) > plot(pt,add=TRUE,col='red',pch=16) > # x1 x2 > # "F0FF" "0FFF" > # it would be nice to have these sorted "2, 1" instead of "1, 2" - use > rgeos::overGeomGeom(pt,sp,returnList=TRUE, minDimension = 0) $pt1 [1] 2 1 > > rgeos::overGeomGeom(pt,pt,minDimension=2) [1] NA > rgeos::overGeomGeom(pt,pt,minDimension=1) [1] NA > rgeos::overGeomGeom(pt,pt,minDimension=0) pt1 1 > > proc.time() user system elapsed 0.587 0.295 0.559 sp/tests/zerodist.R0000644000176200001440000000111412577541412014031 0ustar liggesuserslibrary(sp) data(meuse) # pick 10 rows n = 10 set.seed(1357) # fix seed for exact reproduction of test: ran10 = sample(nrow(meuse), size = n, replace = FALSE) meusedup = rbind(meuse, meuse[ran10, ]) coordinates(meusedup) = c("x", "y") zd = zerodist(meusedup) sum(abs(sort(zd[,1]) - sort(ran10))) # 0! zerodist(meusedup, unique.ID = TRUE) # remove the duplicate rows: meusedup2 = meusedup[-zd[,2], ] print(summary(meusedup2)) meusedup3 <- subset(meusedup, !(1:nrow(meusedup) %in% zd[,2])) print(summary(meusedup3)) dim(meuse) dim(meusedup2) dim(meusedup3) dim(remove.duplicates(meusedup)) sp/tests/fail1.R0000644000176200001440000001042712577541412013171 0ustar liggesuserslibrary(sp) data(meuse) x = meuse coordinates(x) <- c("x", "y") try(proj4string(x) <- 1.5) try(coordinates(a) <- cbind(1:10, 10:1)) # fails because a is not found; passes if a assigned NULL, see pass1.R x = meuse # invalid coordinate formulae: try(coordinates(x) <- ~log(x)+sqrt(y)) # no expressions allowed try(coordinates(x) <- ~x+y+z) # z is not present x$x2 = x$x^2 x$y2 = x$y^2 try(coordinates(x) <- ~x+y+x2+y2) # 4D now passes check... x = meuse try(coordinates(x) <- ~x) # 1D not allowed # is.na.sp.coords a = data.frame(cbind(xx=c(1,NA,2,10),yy=c(2,NA,NA,20))) try(coordinates(a) <- c("xx", "yy")) # should fail! x = meuse[1:4,] coordinates(x) = c(1,2) # this should fail -- zinc is not a row: #(and will break automatic testing, so outcommented!) #try(q <- x["zinc",]) # this will issue warning under S-Plus, or a silent rename under R try(x[c("zinc", "copper", "zinc")]) # this will fail, as "x" is not in the data part: try(x[c("zinc", "x", "copper", "zinc")]) # row index containing missing values will fail: try(xx <- x[c(1:3,NA),]) xx = data.frame(x=1:10, y=1:10) # fails; use SpatialPoints() to create points without attribute try(coordinates(xx) <- c("x", "y")) x = matrix(3, 5, 2) dimnames(x) = list(c(1,1:4), NULL) y = data.frame(a = 1:5, b = 5:1) try(SpatialPointsDataFrame(x, y)) # will complain: SpatialPointsDataFrame(x, y, match.ID = FALSE) # won't complain Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s2") try(SR <- SpatialPolygons(list(Srs1,Srs2,Srs3))) # will complain Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SR = SpatialPolygons(list(Srs1,Srs2,Srs3)) # won't complain try(SRx <- SR[c(1,2,NA),]) attr = data.frame(a=1:3, b=3:1, row.names=c("s1", "s2", "s3")) try(SrDf <- SpatialPolygonsDataFrame(SR, attr)) # will complain SrDf = SpatialPolygonsDataFrame(SR, attr, match.ID = FALSE) # won't complain attr = data.frame(a=1:3, b=3:1, row.names=c("s1", "s2", "s3/4")) SrDf = SpatialPolygonsDataFrame(SR, attr) # won't complain l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") S3 = Lines(list(Sl2), ID="a") Sl = SpatialLines(list(S1,S2)) # won't complain try(Sl1 <- SpatialLines(list(S1,S3))) # will complain try(Sl1 <- Sl[c(NA,2),]) # will fail df = data.frame(z = c(1,2), row.names=sapply(slot(Sl, "lines"), function(x) slot(x, "ID"))) Sldf = SpatialLinesDataFrame(Sl, data = df) # won't complain df1 = data.frame(z = c(1,2)) try(Sldf1 <- SpatialLinesDataFrame(Sl, data = df1)) # will complain Sldf1 = SpatialLinesDataFrame(Sl, data = df1, match.ID = FALSE) # won't complain try(Sldf1 <- Sldf1[c(1,NA),]) data(meuse.grid) gridded(meuse.grid) = ~x+y try(x <- meuse.grid[c(1:10,NA,12),]) fullgrid(meuse.grid) = TRUE try(x <- meuse.grid[c(1:10,NA,12),]) try(x <- meuse[[c("zinc", "cadmium")]]) try(meuse[[c("zn", "cd")]] <- cbind(meuse$zinc, meuse$cadmium)) data(meuse.grid) coordinates(meuse.grid) <- c("x", "y") gridded(meuse.grid) <- TRUE gridparameters(meuse.grid) image(meuse.grid) image(meuse.grid[2]) image(meuse.grid, 2) try(image(meuse.grid, 0)) image(meuse.grid[3], breaks=c(0,.2,.5,.8,1), col = bpy.colors(4)) image(meuse.grid, 3, zlim = c(0,.3)) image(meuse.grid, 3, zlim = c(.3,.1)) image(meuse.grid, 3, zlim = c(.2,.8)) image(meuse.grid, 3, zlim = c(.2,.8), breaks = c(.2,.4,.6,.8), col = bpy.colors(3)) data(meuse.grid) set.seed(1) meuse.grid$x <- meuse.grid$x + rnorm(length(meuse.grid$x), 0, 0.0002) meuse.grid$y <- meuse.grid$y + rnorm(length(meuse.grid$y), 0, 0.0002) coordinates(meuse.grid) <- c("x", "y") try(gridded(meuse.grid) <- TRUE) try(meuse.grid <- SpatialPixelsDataFrame(as(meuse.grid, "SpatialPoints"), data=as(meuse.grid, "data.frame"), tolerance=0.077)) gridparameters(meuse.grid) data(meuse.grid_ll) try(gridded(meuse.grid_ll) <- TRUE) try(meuse.grid_ll <- SpatialPixelsDataFrame(as(meuse.grid_ll, "SpatialPoints"), data=as(meuse.grid_ll, "data.frame"), tolerance=0.9)) gridparameters(meuse.grid_ll) try(CRS("+proj=latlon +ellps=WGS84")) try(CRS("+proj=lonlat +ellps=WGS84")) sp/tests/agg.Rout.save0000644000176200001440000000465312676056504014427 0ustar liggesusers R version 3.2.4 Revised (2016-03-16 r70336) -- "Very Secure Dishes" Copyright (C) 2016 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > g = SpatialGrid(GridTopology(c(5,5), c(10,10), c(3,3))) > p = as(g, "SpatialPolygons") > p$z = c(1,0,1,0,1,0,1,0,1) > cc = coordinates(g) > p$ag1 = aggregate(p, p, mean)[[1]] > p$ag1a = aggregate(p, p, mean, minDimension = 0)[[1]] > p$ag2 = aggregate(p, p, mean, minDimension = 1)[[1]] > p$ag3 = aggregate(p, p, mean, minDimension = 2)[[1]] > p$ag4 = aggregate(p, p, mean, areaWeighted=TRUE)[[1]] Warning message: In aggregate.Spatial(p, p, mean, areaWeighted = TRUE) : argument FUN is ignored in area-weighted aggregation, see documentation > pts = cbind(c(9,21,21,9,9),c(9,9,21,21,9)) > sq = SpatialPolygons(list(Polygons(list(Polygon(pts)), "ID"))) > rnd2 = function(x) round(x, 2) > l = list( + list("sp.text", cc, rnd2(p$z), which = 1), + list("sp.text", cc, rnd2(p$ag1), which = 2), + list("sp.text", cc, rnd2(p$ag1a), which = 3), + list("sp.text", cc, rnd2(p$ag2), which = 4), + list("sp.text", cc, rnd2(p$ag3), which = 5), + list("sp.text", cc, rnd2(p$ag4), which = 6), + list(sq, col = 'green', which = 6, first = FALSE, lwd = 2) + ) > spplot(p, names.attr = c("source", "default aggregate", "minDimension=0", + "minDimension=1", "minDimension=2", "areaWeighted=TRUE"), layout = c(3,2), + as.table=TRUE, col.regions=bpy.colors(151)[50:151], cuts=100, + sp.layout = l, scales = list(draw = TRUE)) > > rnd2(c(aggregate(p, sq, mean)[[1]], + aggregate(p, sq, mean, minDimension = 0)[[1]], + aggregate(p, sq, mean, minDimension = 1)[[1]], + aggregate(p, sq, mean, minDimension = 2)[[1]], + aggregate(p, sq, mean, areaWeighted=TRUE)[[1]])) [1] 0.56 0.56 0.56 0.56 0.72 Warning message: In aggregate.Spatial(p, sq, mean, areaWeighted = TRUE) : argument FUN is ignored in area-weighted aggregation, see documentation > > proc.time() user system elapsed 0.932 0.312 0.939 sp/tests/base.Rout.save0000644000176200001440000004433612577541412014602 0ustar liggesusers R version 3.2.0 (2015-04-16) -- "Full of Ingredients" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > x = meuse[1:10, ] # limit the output > coordinates(x) = c("x", "y") # names > bbox(x) min max x 181025 181390 y 333168 333611 > is.projected(x) [1] NA > dimensions(x) [1] 2 > x coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 3 (181165, 333537) 6.5 68 199 640 7.800 0.10302900 13.0 1 1 4 (181298, 333484) 2.6 81 116 257 7.655 0.19009400 8.0 1 2 5 (181307, 333330) 2.8 48 117 269 7.480 0.27709000 8.7 1 2 6 (181390, 333260) 3.0 61 137 281 7.791 0.36406700 7.8 1 2 7 (181165, 333370) 3.2 31 132 346 8.217 0.19009400 9.2 1 2 8 (181027, 333363) 2.8 29 150 406 8.490 0.09215160 9.5 1 1 9 (181060, 333231) 2.4 37 133 347 8.668 0.18461400 10.6 1 1 10 (181232, 333168) 1.6 24 80 183 9.049 0.30970200 6.3 1 2 lime landuse dist.m 1 1 Ah 50 2 1 Ah 30 3 1 Ah 150 4 0 Ga 270 5 0 Ah 380 6 0 Ga 470 7 0 Ah 240 8 0 Ab 120 9 0 Ab 240 10 0 W 420 > > x = meuse[1:10, ] > coordinates(x) = c(1, 2) # coordinate column numbers > x coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 3 (181165, 333537) 6.5 68 199 640 7.800 0.10302900 13.0 1 1 4 (181298, 333484) 2.6 81 116 257 7.655 0.19009400 8.0 1 2 5 (181307, 333330) 2.8 48 117 269 7.480 0.27709000 8.7 1 2 6 (181390, 333260) 3.0 61 137 281 7.791 0.36406700 7.8 1 2 7 (181165, 333370) 3.2 31 132 346 8.217 0.19009400 9.2 1 2 8 (181027, 333363) 2.8 29 150 406 8.490 0.09215160 9.5 1 1 9 (181060, 333231) 2.4 37 133 347 8.668 0.18461400 10.6 1 1 10 (181232, 333168) 1.6 24 80 183 9.049 0.30970200 6.3 1 2 lime landuse dist.m 1 1 Ah 50 2 1 Ah 30 3 1 Ah 150 4 0 Ga 270 5 0 Ah 380 6 0 Ga 470 7 0 Ah 240 8 0 Ab 120 9 0 Ab 240 10 0 W 420 > > x = meuse[1:10, ] > coordinates(x) = ~x+y # coordinates formula > x coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 3 (181165, 333537) 6.5 68 199 640 7.800 0.10302900 13.0 1 1 4 (181298, 333484) 2.6 81 116 257 7.655 0.19009400 8.0 1 2 5 (181307, 333330) 2.8 48 117 269 7.480 0.27709000 8.7 1 2 6 (181390, 333260) 3.0 61 137 281 7.791 0.36406700 7.8 1 2 7 (181165, 333370) 3.2 31 132 346 8.217 0.19009400 9.2 1 2 8 (181027, 333363) 2.8 29 150 406 8.490 0.09215160 9.5 1 1 9 (181060, 333231) 2.4 37 133 347 8.668 0.18461400 10.6 1 1 10 (181232, 333168) 1.6 24 80 183 9.049 0.30970200 6.3 1 2 lime landuse dist.m 1 1 Ah 50 2 1 Ah 30 3 1 Ah 150 4 0 Ga 270 5 0 Ah 380 6 0 Ga 470 7 0 Ah 240 8 0 Ab 120 9 0 Ab 240 10 0 W 420 > > x = meuse[1:10, ] > coordinates(x) = meuse[1:10, c("x", "y")] # coords, as data.frame > x coordinates x y cadmium copper lead zinc elev dist 1 (181072, 333611) 181072 333611 11.7 85 299 1022 7.909 0.00135803 2 (181025, 333558) 181025 333558 8.6 81 277 1141 6.983 0.01222430 3 (181165, 333537) 181165 333537 6.5 68 199 640 7.800 0.10302900 4 (181298, 333484) 181298 333484 2.6 81 116 257 7.655 0.19009400 5 (181307, 333330) 181307 333330 2.8 48 117 269 7.480 0.27709000 6 (181390, 333260) 181390 333260 3.0 61 137 281 7.791 0.36406700 7 (181165, 333370) 181165 333370 3.2 31 132 346 8.217 0.19009400 8 (181027, 333363) 181027 333363 2.8 29 150 406 8.490 0.09215160 9 (181060, 333231) 181060 333231 2.4 37 133 347 8.668 0.18461400 10 (181232, 333168) 181232 333168 1.6 24 80 183 9.049 0.30970200 om ffreq soil lime landuse dist.m 1 13.6 1 1 1 Ah 50 2 14.0 1 1 1 Ah 30 3 13.0 1 1 1 Ah 150 4 8.0 1 2 0 Ga 270 5 8.7 1 2 0 Ah 380 6 7.8 1 2 0 Ga 470 7 9.2 1 2 0 Ah 240 8 9.5 1 1 0 Ab 120 9 10.6 1 1 0 Ab 240 10 6.3 1 2 0 W 420 > > x = meuse[1:10, ] > coordinates(x) = as.matrix(meuse[1:10, c("x", "y")]) # coords, as matrix > x coordinates x y cadmium copper lead zinc elev dist 1 (181072, 333611) 181072 333611 11.7 85 299 1022 7.909 0.00135803 2 (181025, 333558) 181025 333558 8.6 81 277 1141 6.983 0.01222430 3 (181165, 333537) 181165 333537 6.5 68 199 640 7.800 0.10302900 4 (181298, 333484) 181298 333484 2.6 81 116 257 7.655 0.19009400 5 (181307, 333330) 181307 333330 2.8 48 117 269 7.480 0.27709000 6 (181390, 333260) 181390 333260 3.0 61 137 281 7.791 0.36406700 7 (181165, 333370) 181165 333370 3.2 31 132 346 8.217 0.19009400 8 (181027, 333363) 181027 333363 2.8 29 150 406 8.490 0.09215160 9 (181060, 333231) 181060 333231 2.4 37 133 347 8.668 0.18461400 10 (181232, 333168) 181232 333168 1.6 24 80 183 9.049 0.30970200 om ffreq soil lime landuse dist.m 1 13.6 1 1 1 Ah 50 2 14.0 1 1 1 Ah 30 3 13.0 1 1 1 Ah 150 4 8.0 1 2 0 Ga 270 5 8.7 1 2 0 Ah 380 6 7.8 1 2 0 Ga 470 7 9.2 1 2 0 Ah 240 8 9.5 1 1 0 Ab 120 9 10.6 1 1 0 Ab 240 10 6.3 1 2 0 W 420 > > x = meuse[1:20,] > coordinates(x) = c("x", "y") # coordinate column names > print(summary(x)) Object of class SpatialPointsDataFrame Coordinates: min max x 180555 181390 y 332707 333611 Is projected: NA proj4string : [NA] Number of points: 20 Data attributes: cadmium copper lead zinc Min. : 1.400 Min. :24.00 Min. : 80.0 Min. : 183.0 1st Qu.: 2.475 1st Qu.:30.50 1st Qu.:126.8 1st Qu.: 278.0 Median : 3.100 Median :64.50 Median :142.5 Median : 455.0 Mean : 5.465 Mean :56.95 Mean :171.7 Mean : 569.7 3rd Qu.: 8.625 3rd Qu.:81.00 3rd Qu.:215.2 3rd Qu.: 806.8 Max. :12.900 Max. :95.00 Max. :299.0 Max. :1141.0 elev dist om ffreq soil lime Min. :6.860 Min. :0.000000 Min. : 6.300 1:20 1:14 0:11 1st Qu.:7.280 1st Qu.:0.009508 1st Qu.: 8.625 2: 0 2: 6 1: 9 Median :7.795 Median :0.108480 Median :10.050 3: 0 3: 0 Mean :7.952 Mean :0.128719 Mean :11.285 3rd Qu.:8.705 3rd Qu.:0.199601 3rd Qu.:14.200 Max. :9.073 Max. :0.364067 Max. :16.200 landuse dist.m Ah :7 Min. : 10.0 W :6 1st Qu.: 17.5 Ab :2 Median :140.0 Ga :2 Mean :174.5 Ag :1 3rd Qu.:277.5 (Other):1 Max. :470.0 NA's :1 > > x[1:10] # first 10 columns coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 3 (181165, 333537) 6.5 68 199 640 7.800 0.10302900 13.0 1 1 4 (181298, 333484) 2.6 81 116 257 7.655 0.19009400 8.0 1 2 5 (181307, 333330) 2.8 48 117 269 7.480 0.27709000 8.7 1 2 6 (181390, 333260) 3.0 61 137 281 7.791 0.36406700 7.8 1 2 7 (181165, 333370) 3.2 31 132 346 8.217 0.19009400 9.2 1 2 8 (181027, 333363) 2.8 29 150 406 8.490 0.09215160 9.5 1 1 9 (181060, 333231) 2.4 37 133 347 8.668 0.18461400 10.6 1 1 10 (181232, 333168) 1.6 24 80 183 9.049 0.30970200 6.3 1 2 11 (181191, 333115) 1.4 25 86 189 9.015 0.31511600 6.4 1 2 12 (181032, 333031) 1.8 25 97 251 9.073 0.22812300 9.0 1 1 13 (180874, 333339) 11.2 93 285 1096 7.320 0.00000000 15.4 1 1 14 (180969, 333252) 2.5 31 183 504 8.815 0.11393200 8.4 1 1 15 (181011, 333161) 2.0 27 130 326 8.937 0.16833600 9.1 1 1 16 (180830, 333246) 9.5 86 240 1032 7.702 0.00000000 16.2 1 1 17 (180763, 333104) 7.0 74 133 606 7.160 0.01222430 16.0 1 1 18 (180694, 332972) 7.1 69 148 711 7.100 0.01222430 16.0 1 1 19 (180625, 332847) 8.7 69 207 735 7.020 0.00000000 13.7 1 1 20 (180555, 332707) 12.9 95 284 1052 6.860 0.00000000 14.8 1 1 lime 1 1 2 1 3 1 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 1 14 0 15 0 16 1 17 1 18 1 19 1 20 1 > x[, 1:10] # first 10 columns coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 3 (181165, 333537) 6.5 68 199 640 7.800 0.10302900 13.0 1 1 4 (181298, 333484) 2.6 81 116 257 7.655 0.19009400 8.0 1 2 5 (181307, 333330) 2.8 48 117 269 7.480 0.27709000 8.7 1 2 6 (181390, 333260) 3.0 61 137 281 7.791 0.36406700 7.8 1 2 7 (181165, 333370) 3.2 31 132 346 8.217 0.19009400 9.2 1 2 8 (181027, 333363) 2.8 29 150 406 8.490 0.09215160 9.5 1 1 9 (181060, 333231) 2.4 37 133 347 8.668 0.18461400 10.6 1 1 10 (181232, 333168) 1.6 24 80 183 9.049 0.30970200 6.3 1 2 11 (181191, 333115) 1.4 25 86 189 9.015 0.31511600 6.4 1 2 12 (181032, 333031) 1.8 25 97 251 9.073 0.22812300 9.0 1 1 13 (180874, 333339) 11.2 93 285 1096 7.320 0.00000000 15.4 1 1 14 (180969, 333252) 2.5 31 183 504 8.815 0.11393200 8.4 1 1 15 (181011, 333161) 2.0 27 130 326 8.937 0.16833600 9.1 1 1 16 (180830, 333246) 9.5 86 240 1032 7.702 0.00000000 16.2 1 1 17 (180763, 333104) 7.0 74 133 606 7.160 0.01222430 16.0 1 1 18 (180694, 332972) 7.1 69 148 711 7.100 0.01222430 16.0 1 1 19 (180625, 332847) 8.7 69 207 735 7.020 0.00000000 13.7 1 1 20 (180555, 332707) 12.9 95 284 1052 6.860 0.00000000 14.8 1 1 lime 1 1 2 1 3 1 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 1 14 0 15 0 16 1 17 1 18 1 19 1 20 1 > x[1:10,] # rows 1-10 coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 3 (181165, 333537) 6.5 68 199 640 7.800 0.10302900 13.0 1 1 4 (181298, 333484) 2.6 81 116 257 7.655 0.19009400 8.0 1 2 5 (181307, 333330) 2.8 48 117 269 7.480 0.27709000 8.7 1 2 6 (181390, 333260) 3.0 61 137 281 7.791 0.36406700 7.8 1 2 7 (181165, 333370) 3.2 31 132 346 8.217 0.19009400 9.2 1 2 8 (181027, 333363) 2.8 29 150 406 8.490 0.09215160 9.5 1 1 9 (181060, 333231) 2.4 37 133 347 8.668 0.18461400 10.6 1 1 10 (181232, 333168) 1.6 24 80 183 9.049 0.30970200 6.3 1 2 lime landuse dist.m 1 1 Ah 50 2 1 Ah 30 3 1 Ah 150 4 0 Ga 270 5 0 Ah 380 6 0 Ga 470 7 0 Ah 240 8 0 Ab 120 9 0 Ab 240 10 0 W 420 > x["zinc"] # column zinc + coords coordinates zinc 1 (181072, 333611) 1022 2 (181025, 333558) 1141 3 (181165, 333537) 640 4 (181298, 333484) 257 5 (181307, 333330) 269 6 (181390, 333260) 281 7 (181165, 333370) 346 8 (181027, 333363) 406 9 (181060, 333231) 347 10 (181232, 333168) 183 11 (181191, 333115) 189 12 (181032, 333031) 251 13 (180874, 333339) 1096 14 (180969, 333252) 504 15 (181011, 333161) 326 16 (180830, 333246) 1032 17 (180763, 333104) 606 18 (180694, 332972) 711 19 (180625, 332847) 735 20 (180555, 332707) 1052 > x[, "zinc"] # idem coordinates zinc 1 (181072, 333611) 1022 2 (181025, 333558) 1141 3 (181165, 333537) 640 4 (181298, 333484) 257 5 (181307, 333330) 269 6 (181390, 333260) 281 7 (181165, 333370) 346 8 (181027, 333363) 406 9 (181060, 333231) 347 10 (181232, 333168) 183 11 (181191, 333115) 189 12 (181032, 333031) 251 13 (180874, 333339) 1096 14 (180969, 333252) 504 15 (181011, 333161) 326 16 (180830, 333246) 1032 17 (180763, 333104) 606 18 (180694, 332972) 711 19 (180625, 332847) 735 20 (180555, 332707) 1052 > x[1:10, "zinc"] # idem coordinates zinc 1 (181072, 333611) 1022 2 (181025, 333558) 1141 3 (181165, 333537) 640 4 (181298, 333484) 257 5 (181307, 333330) 269 6 (181390, 333260) 281 7 (181165, 333370) 346 8 (181027, 333363) 406 9 (181060, 333231) 347 10 (181232, 333168) 183 > x[1:10, c("zinc", "cadmium")] # idem coordinates zinc cadmium 1 (181072, 333611) 1022 11.7 2 (181025, 333558) 1141 8.6 3 (181165, 333537) 640 6.5 4 (181298, 333484) 257 2.6 5 (181307, 333330) 269 2.8 6 (181390, 333260) 281 3.0 7 (181165, 333370) 346 3.2 8 (181027, 333363) 406 2.8 9 (181060, 333231) 347 2.4 10 (181232, 333168) 183 1.6 > x[["zinc"]] [1] 1022 1141 640 257 269 281 346 406 347 183 189 251 1096 504 326 [16] 1032 606 711 735 1052 > x[["lnzinc"]] <- log(x[["zinc"]]) > x coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 3 (181165, 333537) 6.5 68 199 640 7.800 0.10302900 13.0 1 1 4 (181298, 333484) 2.6 81 116 257 7.655 0.19009400 8.0 1 2 5 (181307, 333330) 2.8 48 117 269 7.480 0.27709000 8.7 1 2 6 (181390, 333260) 3.0 61 137 281 7.791 0.36406700 7.8 1 2 7 (181165, 333370) 3.2 31 132 346 8.217 0.19009400 9.2 1 2 8 (181027, 333363) 2.8 29 150 406 8.490 0.09215160 9.5 1 1 9 (181060, 333231) 2.4 37 133 347 8.668 0.18461400 10.6 1 1 10 (181232, 333168) 1.6 24 80 183 9.049 0.30970200 6.3 1 2 11 (181191, 333115) 1.4 25 86 189 9.015 0.31511600 6.4 1 2 12 (181032, 333031) 1.8 25 97 251 9.073 0.22812300 9.0 1 1 13 (180874, 333339) 11.2 93 285 1096 7.320 0.00000000 15.4 1 1 14 (180969, 333252) 2.5 31 183 504 8.815 0.11393200 8.4 1 1 15 (181011, 333161) 2.0 27 130 326 8.937 0.16833600 9.1 1 1 16 (180830, 333246) 9.5 86 240 1032 7.702 0.00000000 16.2 1 1 17 (180763, 333104) 7.0 74 133 606 7.160 0.01222430 16.0 1 1 18 (180694, 332972) 7.1 69 148 711 7.100 0.01222430 16.0 1 1 19 (180625, 332847) 8.7 69 207 735 7.020 0.00000000 13.7 1 1 20 (180555, 332707) 12.9 95 284 1052 6.860 0.00000000 14.8 1 1 lime landuse dist.m lnzinc 1 1 Ah 50 6.929517 2 1 Ah 30 7.039660 3 1 Ah 150 6.461468 4 0 Ga 270 5.549076 5 0 Ah 380 5.594711 6 0 Ga 470 5.638355 7 0 Ah 240 5.846439 8 0 Ab 120 6.006353 9 0 Ab 240 5.849325 10 0 W 420 5.209486 11 0 Fh 400 5.241747 12 0 Ag 300 5.525453 13 1 W 20 6.999422 14 0 Ah 130 6.222576 15 0 Ah 220 5.786897 16 1 W 10 6.939254 17 1 W 10 6.406880 18 1 W 10 6.566672 19 1 W 10 6.599870 20 1 10 6.958448 > > print(summary(x[1:10, "zinc"])) # check bbox Object of class SpatialPointsDataFrame Coordinates: min max x 181025 181390 y 333168 333611 Is projected: NA proj4string : [NA] Number of points: 10 Data attributes: zinc Min. : 183.0 1st Qu.: 272.0 Median : 346.5 Mean : 489.2 3rd Qu.: 581.5 Max. :1141.0 > print(summary(x["zinc"])) # compare bbox Object of class SpatialPointsDataFrame Coordinates: min max x 180555 181390 y 332707 333611 Is projected: NA proj4string : [NA] Number of points: 20 Data attributes: zinc Min. : 183.0 1st Qu.: 278.0 Median : 455.0 Mean : 569.7 3rd Qu.: 806.8 Max. :1141.0 > > data(meuse.grid) > coordinates(meuse.grid) = ~x+y > gridded(meuse.grid) = TRUE > plot(meuse.grid) > > proc.time() user system elapsed 0.524 0.342 0.561 sp/tests/pass1.R0000644000176200001440000000756212577541412013232 0ustar liggesuserslibrary(sp) data(meuse) x = meuse coordinates(x) = cbind(rnorm(155), rnorm(155)) # should pass: names(x@data) names(as.data.frame(x)) class(as(x, "data.frame")) x = meuse # coordinates defined as data: coordinates(x) = cbind(xcoord = rnorm(155), ycoord = rnorm(155)) # should pass: names(x@data) names(as.data.frame(x)) is.projected(x) proj4string(x) set.seed(13131) # make sample reproducable: x = meuse[, sample(ncol(meuse))] # 'randomly' shuffle columns # coordinates defined as variable names: coordinates(x) = c("x", "y") # no matter their position #plot(x, cex=.05 * sqrt(x@data[,"zinc"]), plot(x, cex=.05 * sqrt(as.data.frame(x)[["zinc"]]),pch=1) title("Meuse: zinc bubble plot") print(summary(x)) # coordinates defined as formula: x = meuse[, 1:5] coordinates(x) = ~x+y print(summary(x)) # a = NULL # cc = cbind(sample(1:10), sample(1:10), sample(1:10)) # coordinates(a) = cc # summary(a) xx = SpatialPointsDataFrame(matrix(1:10,5,2),data.frame(f = 1:5)) rbind(xx,xx,xx,xx) grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as.SpatialPolygons.GridTopology(grd) summary(rbind(polys[1:10], polys[11:20], polys[21:30])) plot(rbind(polys[1:10],polys[21:30])) title("2 x 10 blocks -- test rbind on SpatialPolygons") l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") Sl = SpatialLines(list(S1,S2)) summary(as(polys, "SpatialLines")) summary(as(Sl, "SpatialPoints")) summary(as(Sl, "SpatialPointsDataFrame")) SlDf = SpatialLinesDataFrame(Sl, data.frame(xx = c("foo", "bar")), match.ID = FALSE) summary(as(SlDf, "SpatialPointsDataFrame")) meuse[["xxx"]] = log(meuse$zinc) summary(meuse) meuse$xxy = log(meuse[["zinc"]]) summary(meuse) # test behaviour on zero-length objects: demo(meuse, ask = FALSE, echo = FALSE) p = as(meuse, "SpatialPoints") p[0] dim(p[0]) meuse[0,] dim(meuse[1:3,0]) dim(subset(meuse, zinc < 100, 0)) dim(subset(meuse, , 0)) dim(subset(meuse, F, 0)) dim(meuse.grid[0,]) fullgrid(meuse.grid) = TRUE dim(meuse.grid[0,]) summary(meuse.grid[0,]) dim(meuse.grid[,0]) summary(meuse.grid[,0]) dim(meuse.grid[0,,0]) summary(meuse.grid[0,,0]) # SpatialPolygons: L = as(meuse.riv, "SpatialPolygons") length(L[1]) length(L[0]) summary(L[0]) # SpatialPolygonsDataFrame: L$something = "bla" class(L) length(L[1]) summary(L[1]) length(L[0]) summary(L[0]) # SpatialLines L = as(meuse.riv, "SpatialLines") length(L[1]) length(L[0]) summary(L[0]) # SpatialLinesDataFrame L$something = "bla" class(L) length(L[1]) summary(L[1]) length(L[0]) summary(L[0]) m = meuse all.equal(rbind(m[1:3,], m[5:7,]), rbind(m[1:3,], m[0,], m[5:7,])) all.equal(rbind(m[1:3,], m[5:7,]), rbind(m[0,], m[1:3,], m[0,], m[5:7,])) all.equal(rbind(m[1:3,], m[5:7,]), rbind(m[1:3,], m[0,], m[5:7,], m[0,])) # match.ID settings for SpatialPointsDataFrame(): set.seed(1331) pts = cbind(1:5, 1:5) dimnames(pts)[[1]] = letters[1:5] df = data.frame(a = 1:5) row.names(df) = letters[5:1] library(sp) options(warn=1) # show warnings where they occur SpatialPointsDataFrame(pts, df) # warn SpatialPointsDataFrame(pts, df, match.ID = TRUE) # don't warn SpatialPointsDataFrame(pts, df, match.ID = FALSE) # don't warn df$m = letters[5:1] SpatialPointsDataFrame(pts, df, match.ID = "m") # don't warn dimnames(pts)[[1]] = letters[5:1] pts SpatialPointsDataFrame(pts, df) # don't warn: match doesn't reorder # duplicated row name: dimnames(pts)[[1]] = letters[c(1:4,1)] pts xx = try(x <- SpatialPointsDataFrame(pts, df)) class(xx) xx SpatialPointsDataFrame(pts, df, match.ID = FALSE) try(x <- SpatialPointsDataFrame(pts, df, match.ID = TRUE)) # fail dimnames(pts)[[1]] = letters[5:1] row.names(df) = letters[6:2] # non-matching row.names SpatialPointsDataFrame(pts, df) # do not match.ID SpatialPointsDataFrame(pts, df, match.ID = FALSE) try(x <- SpatialPointsDataFrame(pts, df, match.ID = TRUE)) # fail sp/tests/zerodist.Rout.save0000644000176200001440000001216312577541412015524 0ustar liggesusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > # pick 10 rows > n = 10 > set.seed(1357) # fix seed for exact reproduction of test: > ran10 = sample(nrow(meuse), size = n, replace = FALSE) > meusedup = rbind(meuse, meuse[ran10, ]) > coordinates(meusedup) = c("x", "y") > zd = zerodist(meusedup) > sum(abs(sort(zd[,1]) - sort(ran10))) # 0! [1] 0 > zerodist(meusedup, unique.ID = TRUE) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 [91] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 [145] 145 146 147 148 149 150 151 152 153 154 155 100 91 148 141 25 64 97 [163] 71 5 92 > # remove the duplicate rows: > meusedup2 = meusedup[-zd[,2], ] > print(summary(meusedup2)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead zinc Min. : 0.200 Min. : 14.00 Min. : 37.0 Min. : 113.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 1st Qu.: 198.0 Median : 2.100 Median : 31.00 Median :123.0 Median : 326.0 Mean : 3.246 Mean : 40.32 Mean :153.4 Mean : 469.7 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 3rd Qu.: 674.5 Max. :18.100 Max. :128.00 Max. :654.0 Max. :1839.0 elev dist om ffreq soil lime Min. : 5.180 Min. :0.00000 Min. : 1.000 1:84 1:97 0:111 1st Qu.: 7.546 1st Qu.:0.07569 1st Qu.: 5.300 2:48 2:46 1: 44 Median : 8.180 Median :0.21184 Median : 6.900 3:23 3:12 Mean : 8.165 Mean :0.24002 Mean : 7.478 3rd Qu.: 8.955 3rd Qu.:0.36407 3rd Qu.: 9.000 Max. :10.520 Max. :0.88039 Max. :17.000 NA's :2 landuse dist.m W :50 Min. : 10.0 Ah :39 1st Qu.: 80.0 Am :22 Median : 270.0 Fw :10 Mean : 290.3 Ab : 8 3rd Qu.: 450.0 (Other):25 Max. :1000.0 NA's : 1 > meusedup3 <- subset(meusedup, !(1:nrow(meusedup) %in% zd[,2])) > print(summary(meusedup3)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead zinc Min. : 0.200 Min. : 14.00 Min. : 37.0 Min. : 113.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 1st Qu.: 198.0 Median : 2.100 Median : 31.00 Median :123.0 Median : 326.0 Mean : 3.246 Mean : 40.32 Mean :153.4 Mean : 469.7 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 3rd Qu.: 674.5 Max. :18.100 Max. :128.00 Max. :654.0 Max. :1839.0 elev dist om ffreq soil lime Min. : 5.180 Min. :0.00000 Min. : 1.000 1:84 1:97 0:111 1st Qu.: 7.546 1st Qu.:0.07569 1st Qu.: 5.300 2:48 2:46 1: 44 Median : 8.180 Median :0.21184 Median : 6.900 3:23 3:12 Mean : 8.165 Mean :0.24002 Mean : 7.478 3rd Qu.: 8.955 3rd Qu.:0.36407 3rd Qu.: 9.000 Max. :10.520 Max. :0.88039 Max. :17.000 NA's :2 landuse dist.m W :50 Min. : 10.0 Ah :39 1st Qu.: 80.0 Am :22 Median : 270.0 Fw :10 Mean : 290.3 Ab : 8 3rd Qu.: 450.0 (Other):25 Max. :1000.0 NA's : 1 > dim(meuse) [1] 155 14 > dim(meusedup2) [1] 155 12 > dim(meusedup3) [1] 155 12 > dim(remove.duplicates(meusedup)) [1] 155 12 > > proc.time() user system elapsed 0.456 0.036 0.486 sp/tests/over.Rout.save0000644000176200001440000000656612577541412014646 0ustar liggesusers R version 3.2.2 (2015-08-14) -- "Fire Safety" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > x = c(0.5, 0.5, 1.2, 1.5) > y = c(1.5, 0.5, 0.5, 0.5) > xy = cbind(x,y) > dimnames(xy)[[1]] = c("a", "b", "c", "d") > pts = SpatialPoints(xy) > > xpol = c(0,1,1,0,0) > ypol = c(0,0,1,1,0) > pol = SpatialPolygons(list( + Polygons(list(Polygon(cbind(xpol-1.05,ypol))), ID="x1"), + Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), + Polygons(list(Polygon(cbind(xpol,ypol-1.05))), ID="x3"), + Polygons(list(Polygon(cbind(xpol+1.05,ypol))), ID="x4"), + Polygons(list(Polygon(cbind(xpol+.4, ypol+.1))), ID="x5") + )) > > zdf = data.frame(z1 = 1:4, z2=4:1, f = c("a", "a", "b", "b"), + row.names = c("a", "b", "c", "d")) > zdf z1 z2 f a 1 4 a b 2 3 a c 3 2 b d 4 1 b > ptsdf = SpatialPointsDataFrame(pts, zdf) > > zpl = data.frame(z = c(10, 15, 25, 3, 0), zz=1:5, + f = c("z", "q", "r", "z", "q"), row.names = c("x1", "x2", "x3", "x4", "x5")) > zpl z zz f x1 10 1 z x2 15 2 q x3 25 3 r x4 3 4 z x5 0 5 q > poldf = SpatialPolygonsDataFrame(pol, zpl) > > gt = GridTopology(c(.5,.5), c(1,1), c(3,2)) > sg = SpatialGrid(gt) > df6 = data.frame(z = 6:1, f = c("a", "a", "b", "b", "c", "c")) > sgdf = SpatialGridDataFrame(gt, df6) > over(sg, pol) 1 2 3 4 5 6 NA NA NA 5 4 NA > over(sg, poldf) z zz f 1 NA NA 2 NA NA 3 NA NA 4 15 2 q 5 3 4 z 6 NA NA > over(sg, poldf[1:2]) z zz 1 NA NA 2 NA NA 3 NA NA 4 15 2 5 3 4 6 NA NA > > spix = as(sg, "SpatialPixels") > spixdf = as(sgdf, "SpatialPixelsDataFrame") > over(spix, pol) 1 2 3 4 5 6 NA NA NA 5 4 NA > over(spix, poldf) z zz f 1 NA NA 2 NA NA 3 NA NA 4 15 2 q 5 3 4 z 6 NA NA > over(spix, poldf[1:2]) z zz 1 NA NA 2 NA NA 3 NA NA 4 15 2 5 3 4 6 NA NA > > over(pol, sg) x1 x2 x3 x4 x5 NA 4 NA 5 4 > over(pol, sgdf) z f x1 NA x2 3 b x3 NA x4 2 c x5 3 b > over(pol, sgdf[1], fn = mean) z x1 NA x2 3 x3 NA x4 2 x5 3 > > over(pol, spix) x1 x2 x3 x4 x5 NA 4 NA 5 4 > over(pol, spixdf) z f x1 NA x2 3 b x3 NA x4 2 c x5 3 b > over(pol, spixdf[1], fn = mean) z x1 NA x2 3 x3 NA x4 2 x5 3 > > over(pts, sg) a b c d 1 4 5 5 > over(pts, spix) a b c d 1 4 5 5 > over(pts, sgdf) z f a 6 a b 3 b c 2 c d 2 c > over(pts, spixdf) z f a 6 a b 3 b c 2 c d 2 c > > over(sg, sg) 1 2 3 4 5 6 1 2 3 4 5 6 > over(sg, spix) 1 2 3 4 5 6 1 2 3 4 5 6 > over(sg, sgdf) z f 1 6 a 2 5 a 3 4 b 4 3 b 5 2 c 6 1 c > over(sg, spixdf) z f 1 6 a 2 5 a 3 4 b 4 3 b 5 2 c 6 1 c > > over(spix, sg) 1 2 3 4 5 6 1 2 3 4 5 6 > over(spix, spix) 1 2 3 4 5 6 1 2 3 4 5 6 > over(spix, sgdf) z f 1 6 a 2 5 a 3 4 b 4 3 b 5 2 c 6 1 c > over(spix, spixdf) z f 1 6 a 2 5 a 3 4 b 4 3 b 5 2 c 6 1 c > > proc.time() user system elapsed 0.536 0.281 0.506 sp/tests/agg.R0000644000176200001440000000253412577541412012733 0ustar liggesuserslibrary(sp) g = SpatialGrid(GridTopology(c(5,5), c(10,10), c(3,3))) p = as(g, "SpatialPolygons") p$z = c(1,0,1,0,1,0,1,0,1) cc = coordinates(g) p$ag1 = aggregate(p, p, mean)[[1]] p$ag1a = aggregate(p, p, mean, minDimension = 0)[[1]] p$ag2 = aggregate(p, p, mean, minDimension = 1)[[1]] p$ag3 = aggregate(p, p, mean, minDimension = 2)[[1]] p$ag4 = aggregate(p, p, mean, areaWeighted=TRUE)[[1]] pts = cbind(c(9,21,21,9,9),c(9,9,21,21,9)) sq = SpatialPolygons(list(Polygons(list(Polygon(pts)), "ID"))) rnd2 = function(x) round(x, 2) l = list( list("sp.text", cc, rnd2(p$z), which = 1), list("sp.text", cc, rnd2(p$ag1), which = 2), list("sp.text", cc, rnd2(p$ag1a), which = 3), list("sp.text", cc, rnd2(p$ag2), which = 4), list("sp.text", cc, rnd2(p$ag3), which = 5), list("sp.text", cc, rnd2(p$ag4), which = 6), list(sq, col = 'green', which = 6, first = FALSE, lwd = 2) ) spplot(p, names.attr = c("source", "default aggregate", "minDimension=0", "minDimension=1", "minDimension=2", "areaWeighted=TRUE"), layout = c(3,2), as.table=TRUE, col.regions=bpy.colors(151)[50:151], cuts=100, sp.layout = l, scales = list(draw = TRUE)) rnd2(c(aggregate(p, sq, mean)[[1]], aggregate(p, sq, mean, minDimension = 0)[[1]], aggregate(p, sq, mean, minDimension = 1)[[1]], aggregate(p, sq, mean, minDimension = 2)[[1]], aggregate(p, sq, mean, areaWeighted=TRUE)[[1]])) sp/tests/fail1.Rout.save0000644000176200001440000002133413120746524014651 0ustar liggesusers R version 3.4.0 (2017-04-21) -- "You Stupid Darkness" Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > x = meuse > > coordinates(x) <- c("x", "y") > try(proj4string(x) <- 1.5) Error in (function (classes, fdef, mtable) : unable to find an inherited method for function 'proj4string<-' for signature '"SpatialPointsDataFrame", "numeric"' > try(coordinates(a) <- cbind(1:10, 10:1)) Error in coordinates(a) <- cbind(1:10, 10:1) : object 'a' not found > # fails because a is not found; passes if a assigned NULL, see pass1.R > > x = meuse > # invalid coordinate formulae: > try(coordinates(x) <- ~log(x)+sqrt(y)) # no expressions allowed Error in `[.data.frame`(object, , -coord.numbers, drop = FALSE) : undefined columns selected > try(coordinates(x) <- ~x+y+z) # z is not present Error in eval(predvars, data, env) : object 'z' not found > x$x2 = x$x^2 > x$y2 = x$y^2 > try(coordinates(x) <- ~x+y+x2+y2) # 4D now passes check... > x = meuse > try(coordinates(x) <- ~x) # 1D not allowed Error in validObject(.Object) : invalid class "SpatialPoints" object: spatial.dimension should be 2 or more > > # is.na.sp.coords > a = data.frame(cbind(xx=c(1,NA,2,10),yy=c(2,NA,NA,20))) > try(coordinates(a) <- c("xx", "yy")) # should fail! Error in `coordinates<-`(`*tmp*`, value = c("xx", "yy")) : coordinates are not allowed to contain missing values > > x = meuse[1:4,] > coordinates(x) = c(1,2) > # this should fail -- zinc is not a row: > #(and will break automatic testing, so outcommented!) > #try(q <- x["zinc",]) > # this will issue warning under S-Plus, or a silent rename under R > try(x[c("zinc", "copper", "zinc")]) coordinates zinc copper zinc.1 1 (181072, 333611) 1022 85 1022 2 (181025, 333558) 1141 81 1141 3 (181165, 333537) 640 68 640 4 (181298, 333484) 257 81 257 > > # this will fail, as "x" is not in the data part: > try(x[c("zinc", "x", "copper", "zinc")]) Error in `[.data.frame`(x@data, i, j, ..., drop = FALSE) : undefined columns selected > > # row index containing missing values will fail: > try(xx <- x[c(1:3,NA),]) Error in x[c(1:3, NA), ] : NAs not permitted in row index > > xx = data.frame(x=1:10, y=1:10) > > # fails; use SpatialPoints() to create points without attribute > try(coordinates(xx) <- c("x", "y")) > > x = matrix(3, 5, 2) > dimnames(x) = list(c(1,1:4), NULL) > y = data.frame(a = 1:5, b = 5:1) > try(SpatialPointsDataFrame(x, y)) # will complain: Error in SpatialPointsDataFrame(x, y) : row.names of data and dimnames of coords do not match In addition: Warning message: In SpatialPointsDataFrame(x, y) : forming a SpatialPointsDataFrame based on maching IDs, not on record order. Use match.ID = FALSE to match on record order > SpatialPointsDataFrame(x, y, match.ID = FALSE) # won't complain coordinates a b 1 (3, 3) 1 5 2 (3, 3) 2 4 3 (3, 3) 3 3 4 (3, 3) 4 2 5 (3, 3) 5 1 Warning messages: 1: In validityMethod(object) : duplicate rownames are interpreted by rgeos as MultiPoints; use SpatialMultiPoints to define these; in future sp versions this warning will become an error 2: In validityMethod(as(object, superClass)) : duplicate rownames are interpreted by rgeos as MultiPoints; use SpatialMultiPoints to define these; in future sp versions this warning will become an error > > Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) > Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) > Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) > Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) > > Srs1 = Polygons(list(Sr1), "s1") > Srs2 = Polygons(list(Sr2), "s2") > Srs3 = Polygons(list(Sr3, Sr4), "s2") > try(SR <- SpatialPolygons(list(Srs1,Srs2,Srs3))) # will complain Error in validObject(res) : invalid class "SpatialPolygons" object: non-unique Polygons ID slot values > Srs3 = Polygons(list(Sr3, Sr4), "s3/4") > SR = SpatialPolygons(list(Srs1,Srs2,Srs3)) # won't complain > try(SRx <- SR[c(1,2,NA),]) Error in SR[c(1, 2, NA), ] : NAs not permitted in row index > > attr = data.frame(a=1:3, b=3:1, row.names=c("s1", "s2", "s3")) > try(SrDf <- SpatialPolygonsDataFrame(SR, attr)) # will complain Error in SpatialPolygonsDataFrame(SR, attr) : row.names of data and Polygons IDs do not match > SrDf = SpatialPolygonsDataFrame(SR, attr, match.ID = FALSE) # won't complain > attr = data.frame(a=1:3, b=3:1, row.names=c("s1", "s2", "s3/4")) > SrDf = SpatialPolygonsDataFrame(SR, attr) # won't complain > > l1 = cbind(c(1,2,3),c(3,2,2)) > l1a = cbind(l1[,1]+.05,l1[,2]+.05) > l2 = cbind(c(1,2,3),c(1,1.5,1)) > Sl1 = Line(l1) > Sl1a = Line(l1a) > Sl2 = Line(l2) > S1 = Lines(list(Sl1, Sl1a), ID="a") > S2 = Lines(list(Sl2), ID="b") > S3 = Lines(list(Sl2), ID="a") > Sl = SpatialLines(list(S1,S2)) # won't complain > try(Sl1 <- SpatialLines(list(S1,S3))) # will complain Error in validObject(.Object) : invalid class "SpatialLines" object: non-unique Lines ID slot values > try(Sl1 <- Sl[c(NA,2),]) # will fail Error in Sl[c(NA, 2), ] : NAs not permitted in row index > > df = data.frame(z = c(1,2), row.names=sapply(slot(Sl, "lines"), function(x) slot(x, "ID"))) > Sldf = SpatialLinesDataFrame(Sl, data = df) # won't complain > df1 = data.frame(z = c(1,2)) > try(Sldf1 <- SpatialLinesDataFrame(Sl, data = df1)) # will complain Error in SpatialLinesDataFrame(Sl, data = df1) : row.names of data and Lines IDs do not match > Sldf1 = SpatialLinesDataFrame(Sl, data = df1, match.ID = FALSE) # won't complain > try(Sldf1 <- Sldf1[c(1,NA),]) Error in Sldf1[c(1, NA), ] : NAs not permitted in row index > > data(meuse.grid) > gridded(meuse.grid) = ~x+y > try(x <- meuse.grid[c(1:10,NA,12),]) Error in meuse.grid[c(1:10, NA, 12), ] : NAs not permitted in row index > fullgrid(meuse.grid) = TRUE > try(x <- meuse.grid[c(1:10,NA,12),]) Error in meuse.grid[c(1:10, NA, 12), ] : NAs not permitted in index > > try(x <- meuse[[c("zinc", "cadmium")]]) Error in .subset2(x, i, exact = exact) : subscript out of bounds > try(meuse[[c("zn", "cd")]] <- cbind(meuse$zinc, meuse$cadmium)) Error in `[[<-`(`*tmp*`, i, value = value) : no such index at level 1 > > data(meuse.grid) > coordinates(meuse.grid) <- c("x", "y") > gridded(meuse.grid) <- TRUE > gridparameters(meuse.grid) cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 > > image(meuse.grid) > image(meuse.grid[2]) > image(meuse.grid, 2) > try(image(meuse.grid, 0)) Error in .subset2(x, i, exact = exact) : subscript out of bounds > image(meuse.grid[3], breaks=c(0,.2,.5,.8,1), col = bpy.colors(4)) > image(meuse.grid, 3, zlim = c(0,.3)) > image(meuse.grid, 3, zlim = c(.3,.1)) > image(meuse.grid, 3, zlim = c(.2,.8)) > image(meuse.grid, 3, zlim = c(.2,.8), breaks = c(.2,.4,.6,.8), + col = bpy.colors(3)) > > data(meuse.grid) > set.seed(1) > meuse.grid$x <- meuse.grid$x + rnorm(length(meuse.grid$x), 0, 0.0002) > meuse.grid$y <- meuse.grid$y + rnorm(length(meuse.grid$y), 0, 0.0002) > coordinates(meuse.grid) <- c("x", "y") > try(gridded(meuse.grid) <- TRUE) suggested tolerance minimum: 0.964318 Error in points2grid(points, tolerance, round) : dimension 1 : coordinate intervals are not constant > try(meuse.grid <- SpatialPixelsDataFrame(as(meuse.grid, "SpatialPoints"), + data=as(meuse.grid, "data.frame"), tolerance=0.077)) > gridparameters(meuse.grid) cellcentre.offset cellsize cells.dim x 178460 39.99912 78 y 329620 39.99920 104 > > data(meuse.grid_ll) > try(gridded(meuse.grid_ll) <- TRUE) suggested tolerance minimum: 0.818323 Error in points2grid(points, tolerance, round) : dimension 1 : coordinate intervals are not constant > try(meuse.grid_ll <- SpatialPixelsDataFrame(as(meuse.grid_ll, "SpatialPoints"), data=as(meuse.grid_ll, "data.frame"), tolerance=0.9)) > gridparameters(meuse.grid_ll) cellcentre.offset cellsize cells.dim x 5.721109 0.0005312853 84 y 50.955770 0.0003318105 112 > > try(CRS("+proj=latlon +ellps=WGS84")) Error in CRS("+proj=latlon +ellps=WGS84") : northings must follow eastings: +proj=latlon +ellps=WGS84 > try(CRS("+proj=lonlat +ellps=WGS84")) CRS arguments: +proj=longlat +ellps=WGS84 Warning message: In CRS("+proj=lonlat +ellps=WGS84") : 'lonlat' changed to 'longlat': +proj=longlat +ellps=WGS84 > > proc.time() user system elapsed 1.044 0.236 1.080 sp/tests/grid.Rout.save0000644000176200001440000001453712667563247014627 0ustar liggesusers R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse.grid) > x = meuse.grid > coordinates(x) = c("x", "y") > gridded(x) = TRUE > gridded(x) [1] TRUE > image(x["dist"]) > > fullgrid(x) = TRUE > fullgrid(x) [1] TRUE > summary(x) Object of class SpatialGridDataFrame Coordinates: min max x 178440 181560 y 329600 333760 Is projected: NA proj4string : [NA] Grid attributes: cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 Data attributes: part.a part.b dist soil ffreq Min. :0.000 Min. :0.000 Min. :0.000 1 :1665 1 : 779 1st Qu.:0.000 1st Qu.:0.000 1st Qu.:0.119 2 :1084 2 :1335 Median :0.000 Median :1.000 Median :0.272 3 : 354 3 : 989 Mean :0.399 Mean :0.601 Mean :0.297 NA's:5009 NA's:5009 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:0.440 Max. :1.000 Max. :1.000 Max. :0.993 NA's :5009 NA's :5009 NA's :5009 > gridparameters(x) cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 > class(as(x, "matrix")) [1] "matrix" Warning message: In as.matrix.SpatialGridDataFrame(from) : as.matrix.SpatialGridDataFrame uses first column; use subset or [] for other columns > > fullgrid(x) = FALSE > fullgrid(x) [1] FALSE > summary(x) Object of class SpatialPixelsDataFrame Coordinates: min max x 178440 181560 y 329600 333760 Is projected: NA proj4string : [NA] Number of points: 3103 Grid attributes: cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 Data attributes: part.a part.b dist soil ffreq Min. :0.0000 Min. :0.0000 Min. :0.0000 1:1665 1: 779 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.1193 2:1084 2:1335 Median :0.0000 Median :1.0000 Median :0.2715 3: 354 3: 989 Mean :0.3986 Mean :0.6014 Mean :0.2971 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.4402 Max. :1.0000 Max. :1.0000 Max. :0.9926 > class(as(x, "matrix")) [1] "matrix" Warning message: In as.matrix.SpatialGridDataFrame(x, ...) : as.matrix.SpatialGridDataFrame uses first column; use subset or [] for other columns > gridparameters(x) cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 > > df = data.frame(z = c(1:6,NA,8,9), + xc = c(1,1,1,2,2,2,3,3,3), + yc = c(rep(c(0, 1.5, 3),3))) > > coordinates(df) = ~xc+yc > gridded(df) = TRUE > gridparameters(df) cellcentre.offset cellsize cells.dim xc 1 1.0 3 yc 0 1.5 3 > as(df, "matrix") [,1] [,2] [,3] [1,] 3 2 1 [2,] 6 5 4 [3,] 9 8 NA > > # get grid topology: > grd = points2grid(as(df, "SpatialPoints"), 1e-31) > grd xc yc cellcentre.offset 1 0.0 cellsize 1 1.5 cells.dim 3 3.0 > getGridIndex(coordinates(df), grd) [1] 7 4 1 8 5 2 9 6 3 > > g = SpatialGrid(grid = grd) > fullgrid(g) [1] TRUE > fullgrid(g) = TRUE > class(g) [1] "SpatialGrid" attr(,"package") [1] "sp" > # the next one has to fail: > fullgrid(g) <- FALSE > class(g) [1] "SpatialPixels" attr(,"package") [1] "sp" > > print(summary(df)) Object of class SpatialPixelsDataFrame Coordinates: min max xc 0.50 3.50 yc -0.75 3.75 Is projected: NA proj4string : [NA] Number of points: 9 Grid attributes: cellcentre.offset cellsize cells.dim xc 1 1.0 3 yc 0 1.5 3 Data attributes: z Min. :1.00 1st Qu.:2.75 Median :4.50 Mean :4.75 3rd Qu.:6.50 Max. :9.00 NA's :1 > image(df["z"]) > as.image.SpatialGridDataFrame(df) $x [1] 1 2 3 $y [1] 0.0 1.5 3.0 $z [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] NA 8 9 > as.image.SpatialGridDataFrame(df["z"]) $x [1] 1 2 3 $y [1] 0.0 1.5 3.0 $z [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] NA 8 9 > coordinatevalues(getGridTopology(df)) $xc [1] 1 2 3 $yc [1] 3.0 1.5 0.0 > > as.data.frame(df) z xc yc 1 1 1 0.0 2 2 1 1.5 3 3 1 3.0 4 4 2 0.0 5 5 2 1.5 6 6 2 3.0 7 NA 3 0.0 8 8 3 1.5 9 9 3 3.0 > > fullgrid(df) = TRUE > as.data.frame(df) z xc yc 1 3 1 3.0 2 6 2 3.0 3 9 3 3.0 4 2 1 1.5 5 5 2 1.5 6 8 3 1.5 7 1 1 0.0 8 4 2 0.0 > > fullgrid(df) = FALSE > as.data.frame(df) z xc yc 1 3 1 3.0 2 6 2 3.0 3 9 3 3.0 4 2 1 1.5 5 5 2 1.5 6 8 3 1.5 7 1 1 0.0 8 4 2 0.0 > > fullgrid(df) = TRUE > fullgrid(df) = FALSE > as.data.frame(df) z xc yc 1 3 1 3.0 2 6 2 3.0 3 9 3 3.0 4 2 1 1.5 5 5 2 1.5 6 8 3 1.5 7 1 1 0.0 8 4 2 0.0 > > df = as.data.frame(df) > set.seed(133331) > df$xc = df$xc + rep(.001*rnorm(3), 3)[1:8] > df.sp = SpatialPoints(df[c("xc", "yc")]) > df.grd = SpatialPixels(df.sp, tolerance = .01) > df.grd[1:4,,tolerance=.01,drop=TRUE] Object of class SpatialPixels Grid topology: cellcentre.offset cellsize cells.dim xc 1.000433 0.9995197 3 yc 1.500000 1.5000000 2 SpatialPoints: xc yc 1 1.000433 3.0 2 1.997926 3.0 3 2.999472 3.0 4 1.000433 1.5 Coordinate Reference System (CRS) arguments: NA > df.grd[1:4,,tolerance=.01] Object of class SpatialPixels Grid topology: cellcentre.offset cellsize cells.dim xc 1.000433 0.9995197 3 yc 0.000000 1.5000000 3 SpatialPoints: xc yc 1 1.000433 3.0 2 1.997926 3.0 3 2.999472 3.0 4 1.000433 1.5 Coordinate Reference System (CRS) arguments: NA > > proc.time() user system elapsed 0.568 0.256 0.570 sp/tests/base.R0000644000176200001440000000170712577541412013110 0ustar liggesuserslibrary(sp) data(meuse) x = meuse[1:10, ] # limit the output coordinates(x) = c("x", "y") # names bbox(x) is.projected(x) dimensions(x) x x = meuse[1:10, ] coordinates(x) = c(1, 2) # coordinate column numbers x x = meuse[1:10, ] coordinates(x) = ~x+y # coordinates formula x x = meuse[1:10, ] coordinates(x) = meuse[1:10, c("x", "y")] # coords, as data.frame x x = meuse[1:10, ] coordinates(x) = as.matrix(meuse[1:10, c("x", "y")]) # coords, as matrix x x = meuse[1:20,] coordinates(x) = c("x", "y") # coordinate column names print(summary(x)) x[1:10] # first 10 columns x[, 1:10] # first 10 columns x[1:10,] # rows 1-10 x["zinc"] # column zinc + coords x[, "zinc"] # idem x[1:10, "zinc"] # idem x[1:10, c("zinc", "cadmium")] # idem x[["zinc"]] x[["lnzinc"]] <- log(x[["zinc"]]) x print(summary(x[1:10, "zinc"])) # check bbox print(summary(x["zinc"])) # compare bbox data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE plot(meuse.grid) sp/tests/sel.Rout.save0000644000176200001440000000741312577541412014446 0ustar liggesusers R version 3.1.1 (2014-07-10) -- "Sock it to Me" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > x = c(0.5, 1.5, 0.5, 1.5, 1.6) > y = c(1.5, 1.5, 0.5, 0.5, 0.5) > xy = cbind(x,y) > dimnames(xy)[[1]] = c("a", "b", "c", "d", "e") > pts = SpatialPoints(xy) > z = data.frame(z1 = 1:5, z2=5:1, f = c("a", "a", "b", "b", "b")) > row.names(z) = c("a", "b", "c", "d", "e") > ptsdf = SpatialPointsDataFrame(pts, z) > > xpol = c(0,1,1,0,0) > ypol = c(0,0,1,1,0) > pol = SpatialPolygons(list( + Polygons(list(Polygon(cbind(xpol-1,ypol))), ID="x9"), + Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), + Polygons(list(Polygon(cbind(xpol,ypol-1))), ID="x3"), + Polygons(list(Polygon(cbind(xpol+1,ypol))), ID="x4") + )) > z = data.frame(z = c(10, 15, 25, 3), zz = 1:4, f = c("z", "q", "r", "z"), + row.names = c("x9", "x2", "x3", "x4")) > poldf = SpatialPolygonsDataFrame(pol, z) > plot(pol, xlim = c(-1.5, 2)) > points(pts, col='red') > > over(pts, pol) a b c d e NA NA 2 4 4 > over(pts, poldf) z zz f a NA NA b NA NA c 15 2 q d 3 4 z e 3 4 z > over(pts, poldf[1:2], fn = mean) z zz a NA NA b NA NA c 15 2 d 3 4 e 3 4 > > #rbind(poldf, over(pts, poldf[1:2], fn = mean)) > > over(pol, pts) x9 x2 x3 x4 NA 3 NA 4 > over(pol, ptsdf) z1 z2 f x9 NA NA x2 3 3 b x3 NA NA x4 4 2 b > over(pol, ptsdf[1:2], fn = mean) z1 z2 x9 NA NA x2 3.0 3.0 x3 NA NA x4 4.5 1.5 > > pts[pol] SpatialPoints: x y c 0.5 0.5 d 1.5 0.5 e 1.6 0.5 Coordinate Reference System (CRS) arguments: NA > > points(pts[pol], col='green', pch=16, cex=.8) > summary(pol[pts]) Object of class SpatialPolygons Coordinates: min max x 0 2 y 0 1 Is projected: NA proj4string : [NA] > plot(pol[pts], border='blue', add=TRUE) > > gt = GridTopology(c(.5,.5), c(1,1), c(3,2)) > sg = SpatialGrid(gt) > df6 = data.frame(z = 6:1, f = c("a", "a", "b", "b", "c", "c")) > sgdf = SpatialGridDataFrame(gt, df6) > over(sg, pol) 1 2 3 4 5 6 NA NA NA 2 4 NA > over(sg, poldf) z zz f 1 NA NA 2 NA NA 3 NA NA 4 15 2 q 5 3 4 z 6 NA NA > over(sg, poldf[1:2]) z zz 1 NA NA 2 NA NA 3 NA NA 4 15 2 5 3 4 6 NA NA > > spix = as(sg, "SpatialPixels") > spixdf = as(sgdf, "SpatialPixelsDataFrame") > over(spix, pol) 1 2 3 4 5 6 NA NA NA 2 4 NA > over(spix, poldf) z zz f 1 NA NA 2 NA NA 3 NA NA 4 15 2 q 5 3 4 z 6 NA NA > over(spix, poldf[1:2]) z zz 1 NA NA 2 NA NA 3 NA NA 4 15 2 5 3 4 6 NA NA > > over(pol, sg) x9 x2 x3 x4 NA 4 NA 5 > over(pol, sgdf) z f x9 NA x2 3 b x3 NA x4 2 c > over(pol, sgdf[1], fn = mean) z x9 NA x2 3 x3 NA x4 2 > > over(pol, spix) x9 x2 x3 x4 NA 4 NA 5 > over(pol, spixdf) z f x9 NA x2 3 b x3 NA x4 2 c > over(pol, spixdf[1], fn = mean) z x9 NA x2 3 x3 NA x4 2 > > over(pts, sg) a b c d e 1 2 4 5 5 > over(pts, spix) a b c d e 1 2 4 5 5 > over(pts, sgdf) z f a 6 a b 5 a c 3 b d 2 c e 2 c > over(pts, spixdf) z f a 6 a b 5 a c 3 b d 2 c e 2 c > > #over(pts, sg, returnList=TRUE) > #over(pts, spix, returnList=TRUE) > #over(pts, sgdf, returnList=TRUE) > #over(pts, spixdf, returnList=TRUE) > > proc.time() user system elapsed 0.554 0.030 0.569 sp/tests/nc.Rout.save0000644000176200001440000000212412577541412014255 0ustar liggesusers R : Copyright 2005, The R Foundation for Statistical Computing Version 2.1.1 (2005-06-20), ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for a HTML browser interface to help. Type 'q()' to quit R. > # library(sp) > # library(maptools) > # data(ncshp) > # nc1 <- as.SpatialPolygons.Shapes(nc.shp$Shapes, as.character(nc.shp$att.data$FIPS)) > # df <- nc.shp$att.data > # rownames(df) <- as.character(nc.shp$att.data$FIPS) > # identical(rownames(df), sapply(slot(nc1, "polygons"), function(i) slot(i, "ID"))) > # nc <- SpatialPolygonsDataFrame(nc1, df) > # > # nc$X = factor(sample(1:5,100,replace=T),labels=letters[1:5]) > # nc$Y = factor(sample(1:5,100,replace=T),labels=letters[6:10]) > # spplot(nc, c("X","Y")) > sp/tests/spplot.Rout.save0000644000176200001440000000247512577541412015207 0ustar liggesusers R version 3.1.0 (2014-04-10) -- "Spring Dance" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > xy = expand.grid(x = 1:4, y = 1:4) > xy.sp = SpatialPoints(xy) > gridded(xy.sp) = T > # deselect 1 row and 2 col: > tst = xy.sp[-c(2,6,10,14,9,11,12)] > tst Object of class SpatialPixels Grid topology: cellcentre.offset cellsize cells.dim x 1 1 4 y 1 1 4 SpatialPoints: x y [1,] 1 1 [2,] 3 1 [3,] 4 1 [4,] 1 2 [5,] 3 2 [6,] 4 2 [7,] 1 4 [8,] 3 4 [9,] 4 4 Coordinate Reference System (CRS) arguments: NA > # convert to SpatialPixelsDataFrame: > tst = SpatialPixelsDataFrame(tst, data.frame(xx = rnorm(9))) > spplot(tst["xx"], main = "empty row + col") > > proc.time() user system elapsed 0.516 0.020 0.529 sp/tests/sp1.Rout.save0000644000176200001440000002043312577541412014363 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > x = meuse > nm <- names(meuse) > # rename to non-default names: > nm[1] <- "xcoord" > nm[2] <- "ycoord" > names(x) <- nm > # change column order > x = x[ , c(3:14,2,1)] > coordinates(x) <- c("xcoord", "ycoord") # columns named xcoord and ycoord > coordinates(x)[1:10,] xcoord ycoord 1 181072 333611 2 181025 333558 3 181165 333537 4 181298 333484 5 181307 333330 6 181390 333260 7 181165 333370 8 181027 333363 9 181060 333231 10 181232 333168 > meuse[1:10,] x y cadmium copper lead zinc elev dist om ffreq soil lime 1 181072 333611 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 1 2 181025 333558 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 1 3 181165 333537 6.5 68 199 640 7.800 0.10302900 13.0 1 1 1 4 181298 333484 2.6 81 116 257 7.655 0.19009400 8.0 1 2 0 5 181307 333330 2.8 48 117 269 7.480 0.27709000 8.7 1 2 0 6 181390 333260 3.0 61 137 281 7.791 0.36406700 7.8 1 2 0 7 181165 333370 3.2 31 132 346 8.217 0.19009400 9.2 1 2 0 8 181027 333363 2.8 29 150 406 8.490 0.09215160 9.5 1 1 0 9 181060 333231 2.4 37 133 347 8.668 0.18461400 10.6 1 1 0 10 181232 333168 1.6 24 80 183 9.049 0.30970200 6.3 1 2 0 landuse dist.m 1 Ah 50 2 Ah 30 3 Ah 150 4 Ga 270 5 Ah 380 6 Ga 470 7 Ah 240 8 Ab 120 9 Ab 240 10 W 420 > class(x) [1] "SpatialPointsDataFrame" attr(,"package") [1] "sp" > sum = summary(x) > print(sum) Object of class SpatialPointsDataFrame Coordinates: min max xcoord 178605 181390 ycoord 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead zinc Min. : 0.200 Min. : 14.00 Min. : 37.0 Min. : 113.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 1st Qu.: 198.0 Median : 2.100 Median : 31.00 Median :123.0 Median : 326.0 Mean : 3.246 Mean : 40.32 Mean :153.4 Mean : 469.7 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 3rd Qu.: 674.5 Max. :18.100 Max. :128.00 Max. :654.0 Max. :1839.0 elev dist om ffreq soil lime Min. : 5.180 Min. :0.00000 Min. : 1.000 1:84 1:97 0:111 1st Qu.: 7.546 1st Qu.:0.07569 1st Qu.: 5.300 2:48 2:46 1: 44 Median : 8.180 Median :0.21184 Median : 6.900 3:23 3:12 Mean : 8.165 Mean :0.24002 Mean : 7.478 3rd Qu.: 8.955 3rd Qu.:0.36407 3rd Qu.: 9.000 Max. :10.520 Max. :0.88039 Max. :17.000 NA's :2 landuse dist.m W :50 Min. : 10.0 Ah :39 1st Qu.: 80.0 Am :22 Median : 270.0 Fw :10 Mean : 290.3 Ab : 8 3rd Qu.: 450.0 (Other):25 Max. :1000.0 NA's : 1 > coordinates(x) xcoord ycoord 1 181072 333611 2 181025 333558 3 181165 333537 4 181298 333484 5 181307 333330 6 181390 333260 7 181165 333370 8 181027 333363 9 181060 333231 10 181232 333168 11 181191 333115 12 181032 333031 13 180874 333339 14 180969 333252 15 181011 333161 16 180830 333246 17 180763 333104 18 180694 332972 19 180625 332847 20 180555 332707 21 180642 332708 22 180704 332717 23 180704 332664 24 181153 332925 25 181147 332823 26 181167 332778 27 181008 332777 28 180973 332687 29 180916 332753 30 181352 332946 31 181133 332570 32 180878 332489 33 180829 332450 34 180954 332399 35 180956 332318 37 180710 332330 38 180632 332445 39 180530 332538 40 180478 332578 41 180383 332476 42 180494 332330 43 180561 332193 44 180451 332175 45 180410 332031 46 180355 332299 47 180292 332157 48 180283 332014 49 180282 331861 50 180270 331707 51 180199 331591 52 180135 331552 53 180237 332351 54 180103 332297 55 179973 332255 56 179826 332217 57 179687 332161 58 179792 332035 59 179902 332113 60 180100 332213 61 179604 332059 62 179526 331936 63 179495 331770 64 179489 331633 65 179414 331494 66 179334 331366 67 179255 331264 69 179470 331125 75 179692 330933 76 179852 330801 79 179140 330955 80 179128 330867 81 179065 330864 82 179007 330727 83 179110 330758 84 179032 330645 85 179095 330636 86 179058 330510 87 178810 330666 88 178912 330779 89 178981 330924 90 179076 331005 123 180151 330353 160 179211 331175 163 181118 333214 70 179474 331304 71 179559 331423 91 179022 330873 92 178953 330742 93 178875 330516 94 178803 330349 95 179029 330394 96 178605 330406 97 178701 330557 98 179547 330245 99 179301 330179 100 179405 330567 101 179462 330766 102 179293 330797 103 179180 330710 104 179206 330398 105 179618 330458 106 179782 330540 108 179980 330773 109 180067 331185 110 180162 331387 111 180451 331473 112 180328 331158 113 180276 330963 114 180114 330803 115 179881 330912 116 179774 330921 117 179657 331150 118 179731 331245 119 179717 331441 120 179446 331422 121 179524 331565 122 179644 331730 124 180321 330366 125 180162 331837 126 180029 331720 127 179797 331919 128 179642 331955 129 179849 332142 130 180265 332297 131 180107 332101 132 180462 331947 133 180478 331822 134 180347 331700 135 180862 333116 136 180700 332882 161 180201 331160 162 180173 331923 137 180923 332874 138 180467 331694 140 179917 331325 141 179822 331242 142 179991 331069 143 179120 330578 144 179034 330561 145 179085 330433 146 179236 330046 147 179456 330072 148 179550 329940 149 179445 329807 150 179337 329870 151 179245 329714 152 179024 329733 153 178786 329822 154 179135 329890 155 179030 330082 156 179184 330182 157 179085 330292 158 178875 330311 159 179466 330381 164 180627 330190 > > x <- as.data.frame(x) > class(x) [1] "data.frame" > > x[1:10, c("xcoord", "ycoord")] xcoord ycoord 1 181072 333611 2 181025 333558 3 181165 333537 4 181298 333484 5 181307 333330 6 181390 333260 7 181165 333370 8 181027 333363 9 181060 333231 10 181232 333168 > > x = meuse[1:4,] > coordinates(x) = c(1,2) > # row 1,2; cols 1:10 > x[1:2,1:10] coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 lime 1 1 2 1 > # row 2, coord+col 9,10 > x[2,9:10] coordinates soil lime 2 (181025, 333558) 1 1 > # coordinates, col 9+10 > x[,9:10] coordinates soil lime 1 (181072, 333611) 1 1 2 (181025, 333558) 1 1 3 (181165, 333537) 1 1 4 (181298, 333484) 2 0 > # coordinates + col 9: > x[,9] coordinates soil 1 (181072, 333611) 1 2 (181025, 333558) 1 3 (181165, 333537) 1 4 (181298, 333484) 2 > # coordinates + zinc column: > x["zinc"] coordinates zinc 1 (181072, 333611) 1022 2 (181025, 333558) 1141 3 (181165, 333537) 640 4 (181298, 333484) 257 > # second row, coordinates + zinc > x[2,"zinc"] coordinates zinc 2 (181025, 333558) 1141 > # select; re-orders: > x[c("zinc","copper")] coordinates zinc copper 1 (181072, 333611) 1022 85 2 (181025, 333558) 1141 81 3 (181165, 333537) 640 68 4 (181298, 333484) 257 81 > # back as data.frame > as.data.frame(x)[1:3, c("zinc","copper","x", "y")] zinc copper x y 1 1022 85 181072 333611 2 1141 81 181025 333558 3 640 68 181165 333537 > > proc.time() user system elapsed 0.460 0.052 0.506 sp/tests/mp.Rout.save0000644000176200001440000001302012577541412014266 0ustar liggesusers R version 3.2.2 (2015-08-14) -- "Fire Safety" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > set.seed(1331) > cl1 = cbind(rnorm(3, 10), rnorm(3, 10)) > cl2 = cbind(rnorm(5, 10), rnorm(5, 0)) > cl3 = cbind(rnorm(7, 0), rnorm(7, 10)) > > library(sp) > mp = SpatialMultiPoints(list(cl1, cl2, cl3)) > plot(mp, col = 2, cex = 1, pch = 1:3) > mp SpatialMultiPoints: [[1]] [,1] [,2] [1,] 9.377732 11.529001 [2,] 11.136951 9.845501 [3,] 9.762133 11.236448 [[2]] [,1] [,2] [1,] 10.386325 -0.5827836 [2,] 10.532143 -0.3125824 [3,] 9.796604 -1.0536246 [4,] 10.272737 -0.7188880 [5,] 11.364576 -1.0525404 [[3]] [,1] [,2] [1,] -0.8441413 9.184820 [2,] 1.1420848 10.767842 [3,] 1.9479070 10.844674 [4,] -0.4512836 10.718613 [5,] 0.6695716 10.349259 [6,] 0.1269003 10.508655 [7,] -0.7273297 9.233874 Coordinate Reference System (CRS) arguments: NA > mp[1:2] SpatialMultiPoints: [[1]] [,1] [,2] [1,] 9.377732 11.529001 [2,] 11.136951 9.845501 [3,] 9.762133 11.236448 [[2]] [,1] [,2] [1,] 10.386325 -0.5827836 [2,] 10.532143 -0.3125824 [3,] 9.796604 -1.0536246 [4,] 10.272737 -0.7188880 [5,] 11.364576 -1.0525404 Coordinate Reference System (CRS) arguments: NA > as(mp, "SpatialPoints") SpatialPoints: coords.x1 coords.x2 [1,] 9.3777317 11.5290011 [2,] 11.1369510 9.8455013 [3,] 9.7621333 11.2364485 [4,] 10.3863251 -0.5827836 [5,] 10.5321429 -0.3125824 [6,] 9.7966038 -1.0536246 [7,] 10.2727371 -0.7188880 [8,] 11.3645757 -1.0525404 [9,] -0.8441413 9.1848197 [10,] 1.1420848 10.7678420 [11,] 1.9479070 10.8446745 [12,] -0.4512836 10.7186131 [13,] 0.6695716 10.3492587 [14,] 0.1269003 10.5086550 [15,] -0.7273297 9.2338744 attr(,"groupIndex") [1] "1" "1" "1" "2" "2" "2" "2" "2" "3" "3" "3" "3" "3" "3" "3" Coordinate Reference System (CRS) arguments: NA > > print(mp, asWKT=TRUE, digits=3) SpatialMultiPoints: geometry 1 MULTIPOINT (9.38 11.5,11.1 9.85,9.76 11.2) 2 MULTIPOINT (10.4 -0.583,10.5 -0.313,9.8 -1.05,10.3 -0.719,11.4 -1.05) 3 MULTIPOINT (-0.844 9.18,1.14 10.8,1.95 10.8,-0.451 10.7,0.67 10.3,0.127 10.5,-0.727 9.23) Coordinate Reference System (CRS) arguments: NA > > mpdf = SpatialMultiPointsDataFrame(list(cl1, cl2, cl3), data.frame(a = 1:3)) > mpdf coordinates a 1 (9.377732, 11.529) 1 1.1 (11.13695, 9.845501) 1 1.2 (9.762133, 11.23645) 1 2 (10.38633, -0.5827836) 2 2.1 (10.53214, -0.3125824) 2 2.2 (9.796604, -1.053625) 2 2.3 (10.27274, -0.718888) 2 2.4 (11.36458, -1.05254) 2 3 (-0.8441413, 9.18482) 3 3.1 (1.142085, 10.76784) 3 3.2 (1.947907, 10.84467) 3 3.3 (-0.4512836, 10.71861) 3 3.4 (0.6695716, 10.34926) 3 3.5 (0.1269003, 10.50866) 3 3.6 (-0.7273297, 9.233874) 3 > print(mpdf, asWKT=TRUE, digits=3) geometry 1 MULTIPOINT (9.38 11.5,11.1 9.85,9.76 11.2) 2 MULTIPOINT (10.4 -0.583,10.5 -0.313,9.8 -1.05,10.3 -0.719,11.4 -1.05) 3 MULTIPOINT (-0.844 9.18,1.14 10.8,1.95 10.8,-0.451 10.7,0.67 10.3,0.127 10.5,-0.727 9.23) a 1 1 2 2 3 3 > > plot(mpdf, col = mpdf$a, cex = 1:3) > as(mpdf, "data.frame") X1 X2 index a 1 9.3777317 11.5290011 1 1 1.1 11.1369510 9.8455013 1 1 1.2 9.7621333 11.2364485 1 1 2 10.3863251 -0.5827836 2 2 2.1 10.5321429 -0.3125824 2 2 2.2 9.7966038 -1.0536246 2 2 2.3 10.2727371 -0.7188880 2 2 2.4 11.3645757 -1.0525404 2 2 3 -0.8441413 9.1848197 3 3 3.1 1.1420848 10.7678420 3 3 3.2 1.9479070 10.8446745 3 3 3.3 -0.4512836 10.7186131 3 3 3.4 0.6695716 10.3492587 3 3 3.5 0.1269003 10.5086550 3 3 3.6 -0.7273297 9.2338744 3 3 Warning message: In data.row.names(row.names, rowsi, i) : some row.names duplicated: 2,3,5,6,7,8,10,11,12,13,14,15 --> row.names NOT used > mpdf[1:2,] coordinates a 1 (9.377732, 11.529) 1 1.1 (11.13695, 9.845501) 1 1.2 (9.762133, 11.23645) 1 2 (10.38633, -0.5827836) 2 2.1 (10.53214, -0.3125824) 2 2.2 (9.796604, -1.053625) 2 2.3 (10.27274, -0.718888) 2 2.4 (11.36458, -1.05254) 2 > as(mpdf, "SpatialPointsDataFrame") coordinates a 1 (9.377732, 11.529) 1 1.1 (11.13695, 9.845501) 1 1.2 (9.762133, 11.23645) 1 2 (10.38633, -0.5827836) 2 2.1 (10.53214, -0.3125824) 2 2.2 (9.796604, -1.053625) 2 2.3 (10.27274, -0.718888) 2 2.4 (11.36458, -1.05254) 2 3 (-0.8441413, 9.18482) 3 3.1 (1.142085, 10.76784) 3 3.2 (1.947907, 10.84467) 3 3.3 (-0.4512836, 10.71861) 3 3.4 (0.6695716, 10.34926) 3 3.5 (0.1269003, 10.50866) 3 3.6 (-0.7273297, 9.233874) 3 > > # aggregate SpatialPointsDataFrame to SpatialMultiPointsDataFrame: > demo(meuse, ask = FALSE, echo = FALSE) > a = aggregate(meuse[c("zinc", "lead")], list(meuse$ffreq)) > spplot(a[c("zinc", "lead")]) > > proc.time() user system elapsed 0.660 0.323 0.656 sp/tests/spDists.Rout.save0000644000176200001440000000237312577541412015314 0ustar liggesusers R version 2.10.0 (2009-10-26) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > data(meuse.grid) > coordinates(meuse) = ~x+y > coordinates(meuse.grid) = ~x+y > x = coordinates(meuse) > y = coordinates(meuse.grid) > out = spDists(meuse,meuse.grid) > out2 = as.matrix(dist(rbind(coordinates(meuse),coordinates(meuse.grid)))) > out2 = out2[1:155,155+1:nrow(y)] > # should be equal: > sum(out2 - out) [1] 0 > summary(as.vector(out2 - out)) Min. 1st Qu. Median Mean 3rd Qu. Max. 0 0 0 0 0 0 > > out = spDists(meuse.grid,meuse) > sum(out2 - t(out)) [1] 0 > summary(as.vector(out2 - t(out))) Min. 1st Qu. Median Mean 3rd Qu. Max. 0 0 0 0 0 0 > sp/tests/grid.R0000644000176200001440000000233612577541412013122 0ustar liggesuserslibrary(sp) data(meuse.grid) x = meuse.grid coordinates(x) = c("x", "y") gridded(x) = TRUE gridded(x) image(x["dist"]) fullgrid(x) = TRUE fullgrid(x) summary(x) gridparameters(x) class(as(x, "matrix")) fullgrid(x) = FALSE fullgrid(x) summary(x) class(as(x, "matrix")) gridparameters(x) df = data.frame(z = c(1:6,NA,8,9), xc = c(1,1,1,2,2,2,3,3,3), yc = c(rep(c(0, 1.5, 3),3))) coordinates(df) = ~xc+yc gridded(df) = TRUE gridparameters(df) as(df, "matrix") # get grid topology: grd = points2grid(as(df, "SpatialPoints"), 1e-31) grd getGridIndex(coordinates(df), grd) g = SpatialGrid(grid = grd) fullgrid(g) fullgrid(g) = TRUE class(g) # the next one has to fail: fullgrid(g) <- FALSE class(g) print(summary(df)) image(df["z"]) as.image.SpatialGridDataFrame(df) as.image.SpatialGridDataFrame(df["z"]) coordinatevalues(getGridTopology(df)) as.data.frame(df) fullgrid(df) = TRUE as.data.frame(df) fullgrid(df) = FALSE as.data.frame(df) fullgrid(df) = TRUE fullgrid(df) = FALSE as.data.frame(df) df = as.data.frame(df) set.seed(133331) df$xc = df$xc + rep(.001*rnorm(3), 3)[1:8] df.sp = SpatialPoints(df[c("xc", "yc")]) df.grd = SpatialPixels(df.sp, tolerance = .01) df.grd[1:4,,tolerance=.01,drop=TRUE] df.grd[1:4,,tolerance=.01] sp/tests/sp1.R0000644000176200001440000000141012577541412012670 0ustar liggesuserslibrary(sp) data(meuse) x = meuse nm <- names(meuse) # rename to non-default names: nm[1] <- "xcoord" nm[2] <- "ycoord" names(x) <- nm # change column order x = x[ , c(3:14,2,1)] coordinates(x) <- c("xcoord", "ycoord") # columns named xcoord and ycoord coordinates(x)[1:10,] meuse[1:10,] class(x) sum = summary(x) print(sum) coordinates(x) x <- as.data.frame(x) class(x) x[1:10, c("xcoord", "ycoord")] x = meuse[1:4,] coordinates(x) = c(1,2) # row 1,2; cols 1:10 x[1:2,1:10] # row 2, coord+col 9,10 x[2,9:10] # coordinates, col 9+10 x[,9:10] # coordinates + col 9: x[,9] # coordinates + zinc column: x["zinc"] # second row, coordinates + zinc x[2,"zinc"] # select; re-orders: x[c("zinc","copper")] # back as data.frame as.data.frame(x)[1:3, c("zinc","copper","x", "y")] sp/tests/spplot.R0000644000176200001440000000045512577541412013516 0ustar liggesuserslibrary(sp) xy = expand.grid(x = 1:4, y = 1:4) xy.sp = SpatialPoints(xy) gridded(xy.sp) = T # deselect 1 row and 2 col: tst = xy.sp[-c(2,6,10,14,9,11,12)] tst # convert to SpatialPixelsDataFrame: tst = SpatialPixelsDataFrame(tst, data.frame(xx = rnorm(9))) spplot(tst["xx"], main = "empty row + col") sp/tests/over2.R0000644000176200001440000000207212577541412013227 0ustar liggesuserslibrary(sp) g = SpatialGrid(GridTopology(c(0,0), c(1,1), c(3,3))) p = as(g, "SpatialPolygons") over(g,g) over(p,p) over(p,p, minDimension = 0) # orders; different names over(p,g) over(g,p) over(p,p,returnList=TRUE) over(p,p,returnList=TRUE, minDimension=0) over(p,p,returnList=TRUE, minDimension=1) over(p,p,returnList=TRUE, minDimension=2) over(p,p[1:6],minDimension=2) x2 = x1 = cbind(c(0,1,1,0,0), c(0,0,1,1,0)) x1[,1] = x1[,1]+0.5 x1[,2] = x1[,2]+0.25 sp = SpatialPolygons(list( Polygons(list(Polygon(x1)), "x1"), Polygons(list(Polygon(x2)), "x2"))) pt = SpatialPoints(cbind(0.5,0.5)) # on border of x1 row.names(pt) = "pt1" over(pt,sp) over(pt,sp,returnList=TRUE) rgeos::overGeomGeom(pt,sp) rgeos::overGeomGeom(pt,sp,returnList=TRUE) plot(sp) plot(pt,add=TRUE,col='red',pch=16) # x1 x2 # "F0FF" "0FFF" # it would be nice to have these sorted "2, 1" instead of "1, 2" - use rgeos::overGeomGeom(pt,sp,returnList=TRUE, minDimension = 0) rgeos::overGeomGeom(pt,pt,minDimension=2) rgeos::overGeomGeom(pt,pt,minDimension=1) rgeos::overGeomGeom(pt,pt,minDimension=0) sp/tests/sel.R0000644000176200001440000000336512577541412012763 0ustar liggesuserslibrary(sp) x = c(0.5, 1.5, 0.5, 1.5, 1.6) y = c(1.5, 1.5, 0.5, 0.5, 0.5) xy = cbind(x,y) dimnames(xy)[[1]] = c("a", "b", "c", "d", "e") pts = SpatialPoints(xy) z = data.frame(z1 = 1:5, z2=5:1, f = c("a", "a", "b", "b", "b")) row.names(z) = c("a", "b", "c", "d", "e") ptsdf = SpatialPointsDataFrame(pts, z) xpol = c(0,1,1,0,0) ypol = c(0,0,1,1,0) pol = SpatialPolygons(list( Polygons(list(Polygon(cbind(xpol-1,ypol))), ID="x9"), Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), Polygons(list(Polygon(cbind(xpol,ypol-1))), ID="x3"), Polygons(list(Polygon(cbind(xpol+1,ypol))), ID="x4") )) z = data.frame(z = c(10, 15, 25, 3), zz = 1:4, f = c("z", "q", "r", "z"), row.names = c("x9", "x2", "x3", "x4")) poldf = SpatialPolygonsDataFrame(pol, z) plot(pol, xlim = c(-1.5, 2)) points(pts, col='red') over(pts, pol) over(pts, poldf) over(pts, poldf[1:2], fn = mean) #rbind(poldf, over(pts, poldf[1:2], fn = mean)) over(pol, pts) over(pol, ptsdf) over(pol, ptsdf[1:2], fn = mean) pts[pol] points(pts[pol], col='green', pch=16, cex=.8) summary(pol[pts]) plot(pol[pts], border='blue', add=TRUE) gt = GridTopology(c(.5,.5), c(1,1), c(3,2)) sg = SpatialGrid(gt) df6 = data.frame(z = 6:1, f = c("a", "a", "b", "b", "c", "c")) sgdf = SpatialGridDataFrame(gt, df6) over(sg, pol) over(sg, poldf) over(sg, poldf[1:2]) spix = as(sg, "SpatialPixels") spixdf = as(sgdf, "SpatialPixelsDataFrame") over(spix, pol) over(spix, poldf) over(spix, poldf[1:2]) over(pol, sg) over(pol, sgdf) over(pol, sgdf[1], fn = mean) over(pol, spix) over(pol, spixdf) over(pol, spixdf[1], fn = mean) over(pts, sg) over(pts, spix) over(pts, sgdf) over(pts, spixdf) #over(pts, sg, returnList=TRUE) #over(pts, spix, returnList=TRUE) #over(pts, sgdf, returnList=TRUE) #over(pts, spixdf, returnList=TRUE) sp/src/0000755000176200001440000000000013124453245011466 5ustar liggesuserssp/src/pip2.c0000644000176200001440000000562313124453245012512 0ustar liggesusers# include "sp.h" # include #define ROFFSET 1 int pipbb(double pt1, double pt2, double *bbs); int between(double x, double low, double up); SEXP pointsInBox(const SEXP lb, const SEXP px, const SEXP py); SEXP tList(const SEXP nl, const SEXP m); SEXP tList(const SEXP nl, const SEXP m0) { int n=length(nl), m=INTEGER_POINTER(m0)[0], i, ii, j, jj, *k, pc=0; SEXP res; PROTECT(res = NEW_LIST(m)); pc++; k = (int *) R_alloc((size_t) m, sizeof(int)); for (j=0; j 0) { for (j=0; j= m) error("invalid indices"); k[jj]++; } } } for (j=0; j 0) { for (j=0; j= low && x <= up) return(1); else return(0); } int pipbb(double pt1, double pt2, double *bbs) { if ((between(pt1, bbs[0], bbs[2]) == 1) && (between(pt2, bbs[1], bbs[3]) == 1)) return(1); else return(0); } sp/src/sp.h0000644000176200001440000000572613124453245012273 0ustar liggesusers#ifndef R_SP_H #define R_SP_H #ifdef SP_XPORT # define SP_PREFIX(name) SP_XPORT(name) #else # define SP_PREFIX(name) name #endif /* remember to touch local_stubs.c */ #define SP_VERSION "1.2-5" #include /* RSB 091203 */ #include #define R_OFFSET 1 #include #include /* from insiders.c int pipbb(double pt1, double pt2, double *bbs); int between(double x, double low, double up); SEXP insiders(SEXP n1, SEXP bbs); */ /* from pip.c */ #ifndef MIN # define MIN(a,b) ((a)>(b)?(b):(a)) #endif #ifndef MAX # define MAX(a,b) ((a)>(b)?(a):(b)) #endif #define BUFSIZE 8192 /* polygon structs: */ typedef struct { double x, y; } PLOT_POINT; typedef struct { PLOT_POINT min, max; } MBR; typedef struct polygon { MBR mbr; int lines; PLOT_POINT *p; int close; /* 1 - is closed polygon */ } POLYGON; void setup_poly_minmax(POLYGON *pl); char InPoly(PLOT_POINT q, POLYGON *Poly); SEXP R_point_in_polygon_sp(SEXP px, SEXP py, SEXP polx, SEXP poly); void sarea(double *heights, int *nx, int *ny, double *w, double *h, double *sa, int *bycell); void spRFindCG( int *n, double *x, double *y, double *xc, double *yc, double *area ); void sp_gcdist(double *lon1, double *lon2, double *lat1, double *lat2, double *dist); void sp_dists(double *u, double *v, double *uout, double *vout, int *n, double *dists, int *lonlat); void sp_dists_NN(double *u1, double *v1, double *u2, double *v2, int *n, double *dists, int *lonlat); void sp_lengths(double *u, double *v, int *n, double *lengths, int *lonlat); SEXP sp_zerodist(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat, SEXP mcmp); SEXP sp_duplicates(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat, SEXP mcmp); SEXP pointsInBox(SEXP lb, SEXP px, SEXP py); SEXP tList(SEXP nl, SEXP m); /* RSB 091203 */ #define DIM 2 /* Dimension of points */ typedef double tPointd[DIM]; /* type double point */ double SP_PREFIX(Area2)(const tPointd a, const tPointd b, const tPointd c); void SP_PREFIX(FindCG)(int n, tPointd *P, tPointd CG, double *Areasum2); void SP_PREFIX(Centroid3)(const tPointd p1, const tPointd p2, const tPointd p3, tPointd c); void SP_PREFIX(spRFindCG_c)(const SEXP n, const SEXP coords, double *xc, double *yc, double *area ); void SP_PREFIX(comm2comment)(char *buf, int bufsiz, int *comm, int nps); SEXP SP_PREFIX(Polygon_c)(const SEXP coords, const SEXP n, const SEXP hole); SEXP SP_PREFIX(Polygons_c)(const SEXP pls, const SEXP ID); SEXP SP_PREFIX(SpatialPolygons_c)(const SEXP pls, const SEXP pO, const SEXP p4s); SEXP SP_PREFIX(bboxCalcR_c)(const SEXP pls); SEXP SP_PREFIX(Polygon_validate_c)(const SEXP obj); SEXP SP_PREFIX(Polygons_validate_c)(const SEXP obj); SEXP SP_PREFIX(SpatialPolygons_validate_c)(const SEXP obj); SEXP SP_PREFIX(SpatialPolygons_getIDs_c)(const SEXP obj); SEXP SP_PREFIX(SpatialPolygons_plotOrder_c)(const SEXP pls); SEXP SP_PREFIX(comment2comm)(const SEXP obj); SEXP SP_PREFIX(sp_linkingTo_version)(); #endif /* remember to touch local_stubs.c */ sp/src/gcdist.c0000644000176200001440000000552213124453245013113 0ustar liggesusers#define USING_R 1 /* Copyright by Roger Bivand (C) 2005-2009 */ #include "sp.h" #ifdef USING_R # define POWDI(x,i) R_pow_di(x,i) #else # include # define POWDI(x,i) pow(x,i) /*# define pythag(a,b) sqrt(a*a+b*b)*/ #endif void sp_dists(double *u, double *v, double *uout, double *vout, int *n, double *dists, int *lonlat) { int N = *n, j; double gc[1]; if (lonlat[0] == 0) { for (j = 0; j < N; j++) dists[j] = hypot(u[j] - uout[0], v[j] - vout[0]); } else { for (j = 0; j < N; j++) { sp_gcdist(u+j, uout, v+j, vout, gc); dists[j] = gc[0]; } } } void sp_dists_NN(double *u1, double *v1, double *u2, double *v2, int *n, double *dists, int *lonlat) { int N = *n, j; double gc[1]; if (lonlat[0] == 0) for (j = 0; j < N; j++) dists[j] = hypot(u1[j] - u2[j], v1[j] - v2[j]); else { for (j = 0; j < N; j++) { sp_gcdist(u1+j, u2+j, v1+j, v2+j, gc); dists[j] = gc[0]; } } } void sp_lengths(double *u, double *v, int *n, double *lengths, int *lonlat) { int N = *n, j; double gc[1]; if (N < 2) error("N less than 2"); if (lonlat[0] == 0) for (j=0; j < N-1; j++) lengths[j] = hypot(u[j]-u[j+1], v[j]-v[j+1]); else { for (j=0; j < N-1; j++) { sp_gcdist(u+j, u+j+1, v+j, v+j+1, gc); lengths[j] = gc[0]; } } } /* http://en.wikipedia.org/wiki/World_Geodetic_System#A_new_World_Geodetic_System:_WGS_84 */ void sp_gcdist(double *lon1, double *lon2, double *lat1, double *lat2, double *dist) { double F, G, L, sinG2, cosG2, sinF2, cosF2, sinL2, cosL2, S, C; double w, R, a, f, D, H1, H2; double lat1R, lat2R, lon1R, lon2R, DE2RA; DE2RA = M_PI/180; a = 6378.137; /* WGS-84 equatorial radius in km */ f = 1.0/298.257223563; /* WGS-84 ellipsoid flattening factor */ if (fabs(lat1[0] - lat2[0]) < DOUBLE_EPS) { if (fabs(lon1[0] - lon2[0]) < DOUBLE_EPS) { dist[0] = 0.0; return; /* Wouter Buytaert bug caught 100211 */ } else if (fabs((fabs(lon1[0]) + fabs(lon2[0])) - 360.0) < DOUBLE_EPS) { dist[0] = 0.0; return; } } lat1R = lat1[0]*DE2RA; lat2R = lat2[0]*DE2RA; lon1R = lon1[0]*DE2RA; lon2R = lon2[0]*DE2RA; F = ( lat1R + lat2R )/2.0; G = ( lat1R - lat2R )/2.0; L = ( lon1R - lon2R )/2.0; /* printf("%g %g %g %g; %g %g %g\n", *lon1, *lon2, *lat1, *lat2, F, G, L); */ sinG2 = POWDI( sin( G ), 2 ); cosG2 = POWDI( cos( G ), 2 ); sinF2 = POWDI( sin( F ), 2 ); cosF2 = POWDI( cos( F ), 2 ); sinL2 = POWDI( sin( L ), 2 ); cosL2 = POWDI( cos( L ), 2 ); S = sinG2*cosL2 + cosF2*sinL2; C = cosG2*cosL2 + sinF2*sinL2; w = atan( sqrt( S/C ) ); R = sqrt( S*C )/w; D = 2*w*a; H1 = ( 3*R - 1 )/( 2*C ); H2 = ( 3*R + 1 )/( 2*S ); dist[0] = D*( 1 + f*H1*sinF2*cosG2 - f*H2*cosF2*sinG2 ); } sp/src/Rcentroid.c0000644000176200001440000000261013124453245013562 0ustar liggesusers#define USING_R 1 /* Modified 24 May 2005 Roger S. Bivand for maptools Written by Joseph O'Rourke orourke@cs.smith.edu October 27, 1995 Computes the centroid (center of gravity) of an arbitrary simple polygon via a weighted sum of signed triangle areas, weighted by the centroid of each triangle. Reads x,y coordinates from stdin. NB: Assumes points are entered in ccw order! E.g., input for square: 0 0 10 0 10 10 0 10 This solves Exercise 12, p.47, of my text, Computational Geometry in C. See the book for an explanation of why this works. Follow links from http://cs.smith.edu/~orourke/ */ #ifndef USING_R # define R_alloc(n,size) S_alloc(n,size,S_evaluator) #endif #include "sp.h" /*#define PMAX 1000 Max # of pts in polygon */ /* typedef tPointd *tPolygond; */ /* type double polygon */ void spRFindCG( int *n, double *x, double *y, double *xc, double *yc, double *area ) { int i, nn; tPointd *P; tPointd CG; double Areasum2; nn = n[0]; P = (tPointd *) R_alloc((size_t) nn, sizeof(tPointd)); for (i=0; i 2) { xc = (NUMERIC_POINTER(ccopy)[0] + NUMERIC_POINTER(ccopy)[(nn-1)])/2.0; yc = (NUMERIC_POINTER(ccopy)[nn] + NUMERIC_POINTER(ccopy)[nn+(nn-1)])/2.0; } } } PROTECT(SPans = NEW_OBJECT(MAKE_CLASS("Polygon"))); pc++; PROTECT(ringDir = NEW_INTEGER(1)); pc++; INTEGER_POINTER(ringDir)[0] = (area > 0.0) ? -1 : 1; // -1 cw hole, 1 ccw not-hole /* RSB 100126 fixing hole assumption thanks to Javier Munoz for report */ if (INTEGER_POINTER(ihole)[0] == NA_INTEGER) { // trust ring direction if (INTEGER_POINTER(ringDir)[0] == 1) INTEGER_POINTER(ihole)[0] = 0; else if (INTEGER_POINTER(ringDir)[0] == -1) INTEGER_POINTER(ihole)[0] = 1; } else { // trust hole if (INTEGER_POINTER(ihole)[0] == 1 && INTEGER_POINTER(ringDir)[0] == 1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = -1; } if (INTEGER_POINTER(ihole)[0] == 0 && INTEGER_POINTER(ringDir)[0] == -1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = 1; } } PROTECT(hole = NEW_LOGICAL(1)); pc++; if (INTEGER_POINTER(ihole)[0] == 1) LOGICAL_POINTER(hole)[0] = TRUE; else LOGICAL_POINTER(hole)[0] = FALSE; if (rev) { x = (double *) R_alloc((size_t) nn, sizeof(double)); y = (double *) R_alloc((size_t) nn, sizeof(double)); for (i=0; i 1) { for (i=0; i UX) UX = x; if (y > UY) UY = y; if (x < LX) LX = x; if (y < LY) LY = y; } } } PROTECT(ans = NEW_NUMERIC(4)); pc++; NUMERIC_POINTER(ans)[0] = LX; NUMERIC_POINTER(ans)[1] = LY; NUMERIC_POINTER(ans)[2] = UX; NUMERIC_POINTER(ans)[3] = UY; PROTECT(dim = NEW_INTEGER(2)); pc++; INTEGER_POINTER(dim)[0] = 2; INTEGER_POINTER(dim)[1] = 2; setAttrib(ans, R_DimSymbol, dim); PROTECT(dimnames = NEW_LIST(2)); pc++; SET_VECTOR_ELT(dimnames, 0, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 0, COPY_TO_USER_STRING("x")); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 1, COPY_TO_USER_STRING("y")); SET_VECTOR_ELT(dimnames, 1, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 0, COPY_TO_USER_STRING("min")); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 1, COPY_TO_USER_STRING("max")); setAttrib(ans, R_DimNamesSymbol, dimnames); UNPROTECT(pc); return(ans); } void SP_PREFIX(spRFindCG_c)(const SEXP n, const SEXP coords, double *xc, double *yc, double *area ) { int i, nn; tPointd *P; tPointd CG; double Areasum2; nn = INTEGER_POINTER(n)[0]; P = (tPointd *) R_alloc((size_t) nn, sizeof(tPointd)); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[0], (size_t) nss[0]); s[nss[0]] = '\0'; c[0] = atoi(s); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[(nss[i]+1)], (size_t) k); s[k] = '\0'; c[i+1] = atoi(s); } for (i=0, k=0; i<(ns+1); i++) if (c[i] == 0) k++; PROTECT(ans = NEW_LIST((k))); pc++; co = (int *) R_alloc((size_t) k, sizeof(int)); coo = (int *) R_alloc((size_t) k, sizeof(int)); for (i=0; i 1) { for (j=0; j<(ns+1); j++) if (c[j] == coo[i]) INTEGER_POINTER(VECTOR_ELT(ans, i))[jj++] = j + R_OFFSET; } } UNPROTECT(pc); return(ans); } void SP_PREFIX(comm2comment)(char *buf, int bufsiz, int *comm, int nps) { char cbuf[15]; int i, nc, nc1; nc = (int) (ceil(log10(nps)+1.0)+1.0); nc1 = (nc*nps)+1; if (bufsiz < nc1) error("comm2comment: buffer overflow"); sprintf(buf, "%d", comm[0]); for (i=1; i= bufsiz) error("comm2comment: buffer overflow"); strcat(buf, cbuf); } strcat(buf, "\0"); return; } /* remember to touch local_stubs.c */ sp/src/init.c0000644000176200001440000000366313124453245012605 0ustar liggesusers#include #include #include "sp.h" #include static const R_CMethodDef CEntries[] = { /* {"pipbb", (DL_FUNC) &pipbb, 3}, {"between", (DL_FUNC) &between, 3}, */ {"setup_poly_minmax", (DL_FUNC) &setup_poly_minmax, 1}, {"InPoly", (DL_FUNC) &InPoly, 2}, {"sarea", (DL_FUNC) &sarea, 7}, {"spRFindCG", (DL_FUNC) &spRFindCG, 6}, {"sp_gcdist", (DL_FUNC) &sp_gcdist, 5}, {"sp_dists", (DL_FUNC) &sp_dists, 7}, {"sp_dists_NN", (DL_FUNC) &sp_dists_NN, 7}, {"sp_lengths", (DL_FUNC) &sp_lengths, 5}, /* RSB 091203 */ {"spRFindCG_c", (DL_FUNC) &spRFindCG_c, 5}, {"comm2comment", (DL_FUNC) &comm2comment, 4}, {NULL, NULL, 0} }; static R_CallMethodDef CallEntries[] = { /* {"insiders", (DL_FUNC) &insiders, 2}, */ {"R_point_in_polygon_sp", (DL_FUNC) &R_point_in_polygon_sp, 4}, {"sp_zerodist", (DL_FUNC) &sp_zerodist, 5}, {"sp_duplicates", (DL_FUNC) &sp_duplicates, 5}, {"pointsInBox", (DL_FUNC) &pointsInBox, 3}, {"tList", (DL_FUNC) &tList, 2}, /* RSB 091203 */ {"Polygon_c", (DL_FUNC) &Polygon_c, 3}, {"Polygons_c", (DL_FUNC) &Polygons_c, 2}, {"SpatialPolygons_c", (DL_FUNC) &SpatialPolygons_c, 3}, {"bboxCalcR_c", (DL_FUNC) &bboxCalcR_c, 1}, {"Polygon_validate_c", (DL_FUNC) &Polygon_validate_c, 1}, {"Polygons_validate_c", (DL_FUNC) &Polygons_validate_c, 1}, {"SpatialPolygons_validate_c", (DL_FUNC) &SpatialPolygons_validate_c, 1}, {"SpatialPolygons_getIDs_c", (DL_FUNC) &SpatialPolygons_getIDs_c, 1}, {"SpatialPolygons_plotOrder_c", (DL_FUNC) &SpatialPolygons_plotOrder_c, 1}, {"comment2comm", (DL_FUNC) &comment2comm, 1}, {"sp_linkingTo_version", (DL_FUNC) &sp_linkingTo_version, 0}, {NULL, NULL, 0} }; void #ifdef HAVE_VISIBILITY_ATTRIBUTE __attribute__ ((visibility ("default"))) #endif R_init_sp(DllInfo *dll) { R_registerRoutines(dll, CEntries, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } sp/src/zerodist.c0000644000176200001440000000601413124453245013476 0ustar liggesusers#include /* memcmp */ #include #include #include "sp.h" int is_zero(double *xi, double *xj, int ncol, int ll, double zerodist2, int cmp) { int k; double d, dist; if (zerodist2 <= 0.0) /* check bitwise equality */ return (memcmp(xi, xj, ncol * sizeof(double)) == 0); /* bit-wise difference: compute dist, and compare to zerodist2 */ if (ll) { sp_gcdist(xi, xj, xi+1, xj+1, &d); dist = d * d; } else { for (k = 0, dist = 0.0; k < ncol; k++) { d = (xi[k] - xj[k]); dist += d * d; } } return(dist <= zerodist2); } SEXP sp_zerodist(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat, SEXP mcmp) { unsigned int i, j, ncol, nrow, nzero = 0, *which = NULL, ll, cmp; double **x, zerodist2; SEXP ret = NULL; ncol = INTEGER_POINTER(pncol)[0]; ll = INTEGER_POINTER(lonlat)[0]; cmp = INTEGER_POINTER(mcmp)[0]; if (ll && ncol != 2) error("for longlat data, coordinates should be two-dimensional"); nrow = LENGTH(pp)/ncol; zerodist2 = NUMERIC_POINTER(zero)[0] * NUMERIC_POINTER(zero)[0]; x = (double **) malloc((size_t) nrow * sizeof(double *)); if (x == NULL) error("could not allocate vector of %u bytes in zerodist", nrow * sizeof(double *)); for (i = 0; i < nrow; i++) x[i] = &(NUMERIC_POINTER(pp)[i*ncol]); for (i = 0; i < nrow; i++) { for (j = 0; j < i; j++) { if (is_zero(x[i], x[j], ncol, ll, zerodist2, cmp)) { which = (unsigned int *) realloc(which, (size_t) (nzero+2) * sizeof(unsigned int)); if (which == NULL) error("could not allocate vector of %u bytes in zerodist", nzero + 2); which[nzero] = j; /* lowest */ which[nzero + 1] = i; nzero += 2; } } R_CheckUserInterrupt(); } free(x); PROTECT(ret = NEW_INTEGER(nzero)); for (i = 0; i < nzero; i++) INTEGER_POINTER(ret)[i] = which[i]; if (which != NULL) free(which); UNPROTECT(1); return(ret); } SEXP sp_duplicates(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat, SEXP mcmp) { unsigned int i, j, ncol, nrow, ll, next, cmp; double **x, zerodist2; SEXP ret = NULL; ncol = INTEGER_POINTER(pncol)[0]; ll = INTEGER_POINTER(lonlat)[0]; cmp = INTEGER_POINTER(mcmp)[0]; if (ll && ncol != 2) error("for longlat data, coordinates should be two-dimensional"); nrow = LENGTH(pp)/ncol; zerodist2 = NUMERIC_POINTER(zero)[0] * NUMERIC_POINTER(zero)[0]; x = (double **) malloc((size_t) nrow * sizeof(double *)); if (x == NULL) error("could not allocate vector of %u bytes in zerodist", nrow * sizeof(double *)); for (i = 0; i < nrow; i++) x[i] = &(NUMERIC_POINTER(pp)[i*ncol]); PROTECT(ret = NEW_INTEGER(nrow)); if (nrow > 0) INTEGER_POINTER(ret)[0] = 0; for (i = 1; i < nrow; i++) { INTEGER_POINTER(ret)[i] = i; next = 0; for (j = 0; next == 0 && j < i; j++) { /* find match */ if (INTEGER_POINTER(ret)[j] == j) { /* this is a new point */ if (is_zero(x[i], x[j], ncol, ll, zerodist2, cmp)) { /* match: */ INTEGER_POINTER(ret)[i] = j; next = 1; /* break for loop */ } } } /* for j */ R_CheckUserInterrupt(); } free(x); UNPROTECT(1); return(ret); } sp/src/pip.c0000644000176200001440000001250113124453245012421 0ustar liggesusers# include # include #include "sp.h" SEXP R_point_in_polygon_sp(const SEXP px, const SEXP py, const SEXP polx, const SEXP poly) { int i, pc=0; PLOT_POINT p; POLYGON pol; SEXP ret, px1, py1, polx1, poly1; if (NAMED(px)) { PROTECT(px1 = duplicate(px)); pc++; } else px1 = px; if (NAMED(py)) { PROTECT(py1 = duplicate(py)); pc++; } else py1 = py; if (NAMED(polx)) { PROTECT(polx1 = duplicate(polx)); pc++; } else polx1 = polx; if (NAMED(poly)) { PROTECT(poly1 = duplicate(poly)); pc++; } else poly1 = poly; pol.lines = LENGTH(polx); /* check later that first == last */ pol.p = (PLOT_POINT *) R_alloc((size_t) pol.lines, sizeof(PLOT_POINT)); /* transient; will be freed by R; freed by R on user interrupt */ for (i = 0; i < LENGTH(polx); i++) { pol.p[i].x = NUMERIC_POINTER(polx)[i]; pol.p[i].y = NUMERIC_POINTER(poly)[i]; } pol.close = (pol.p[0].x == pol.p[pol.lines - 1].x && pol.p[0].y == pol.p[pol.lines - 1].y); setup_poly_minmax(&pol); PROTECT(ret = NEW_INTEGER(LENGTH(px))); pc++; for (i = 0; i < LENGTH(px); i++) { p.x = NUMERIC_POINTER(px)[i]; p.y = NUMERIC_POINTER(py)[i]; /* For each query point q, InPoly returns one of four char's: i : q is strictly interior to P o : q is strictly exterior to P v : q is a vertex of P e : q lies on the relative interior of an edge of P */ switch (InPoly(p, &pol)) { case 'i': INTEGER_POINTER(ret)[i] = 1; break; case 'o': INTEGER_POINTER(ret)[i] = 0; break; case 'v': INTEGER_POINTER(ret)[i] = 3; break; case 'e': INTEGER_POINTER(ret)[i] = 2; break; default: INTEGER_POINTER(ret)[i] = -1; break; } } UNPROTECT(pc); return(ret); } void setup_poly_minmax(POLYGON *pl) { int i, n=pl->lines; double minx,maxx,miny,maxy; minx=miny=DBL_MAX; maxx=maxy=-DBL_MAX; for (i=0;ip[i].x); miny = MIN(miny, pl->p[i].y); maxx = MAX(maxx, pl->p[i].x); maxy = MAX(maxy, pl->p[i].y); } pl->mbr.min.x = minx; pl->mbr.min.y = miny; pl->mbr.max.x = maxx; pl->mbr.max.y = maxy; } /* This code is described in "Computational Geometry in C" (Second Edition), Chapter 7. It is not written to be comprehensible without the explanation in that book. For each query point q, InPoly returns one of four char's: i : q is strictly interior to P o : q is strictly exterior to P v : q is a vertex of P e : q lies on the relative interior of an edge of P These represent mutually exclusive categories. For an explanation of the code, see Chapter 7 of "Computational Geometry in C (Second Edition)." Written by Joseph O'Rourke, contributions by Min Xu, June 1997. Questions to orourke@cs.smith.edu. -------------------------------------------------------------------- This code is Copyright 1998 by Joseph O'Rourke. It may be freely redistributed in its entirety provided that this copyright notice is not removed. -------------------------------------------------------------------- */ /* InPoly returns a char in {i,o,v,e}. See above for definitions. */ char InPoly(PLOT_POINT q, POLYGON *Poly) { int n = Poly->lines; PLOT_POINT *P=Poly->p; int i, i1; /* point index; i1 = i-1 mod n */ double x; /* x intersection of e with ray */ double xx=q.x, yy=q.y; int Rcross = 0; /* number of right edge/ray crossings */ int Lcross = 0; /* number of left edge/ray crossings */ /* For each edge e=(i-1,i), see if crosses ray. */ for( i = 0; i < n; i++ ) { /* First see if q=(0,0) is a vertex. */ if (( P[i].x - xx )==0 &&( P[i].y - yy )==0 ) return 'v'; i1 = ( i + n - 1 ) % n; /* printf("e=(%d,%d)\t", i1, i); */ /* if e "straddles" the x-axis... */ /* The commented-out statement is logically equivalent to the one following. */ /* if( ( ( P[i].y > 0 ) && ( P[i1].y <= 0 ) ) || ( ( P[i1].y > 0 ) && ( P[i] .y <= 0 ) ) ) { }*/ if( (( P[i].y - yy ) > 0 ) != (( P[i1].y - yy ) > 0 ) ) { /* e straddles ray, so compute intersection with ray. */ x = (( P[i].x - xx) *( P[i1].y - yy ) -( P[i1].x - xx ) *( P[i].y - yy )) / (P[i1].y - P[i].y ); /* printf("straddles: x = %g\t", x); */ /* crosses ray if strictly positive intersection. */ if (x > 0) Rcross++; } /* printf("Right cross=%d\t", Rcross); */ /* if e straddles the x-axis when reversed... */ /* if( ( ( P[i] .y < 0 ) && ( P[i1].y >= 0 ) ) || ( ( P[i1].y < 0 ) && ( P[i] .y >= 0 ) ) ) { }*/ if ( (( P[i].y - yy ) < 0 ) != (( P[i1].y - yy ) < 0 ) ) { /* e straddles ray, so compute intersection with ray. */ x = (( P[i].x - xx) *( P[i1].y - yy ) -( P[i1].x - xx ) *( P[i].y - yy )) / (P[i1].y - P[i].y); /* printf("straddles: x = %g\t", x); */ /* crosses ray if strictly positive intersection. */ if (x < 0) Lcross++; } /* printf("Left cross=%d\n", Lcross); */ } /* q on the edge if left and right cross are not the same parity. */ if( ( Rcross % 2 ) != (Lcross % 2 ) ) return 'e'; /* q inside iff an odd number of crossings. */ if( (Rcross % 2) == 1 ) return 'i'; else return 'o'; } sp/src/surfaceArea.c0000644000176200001440000000446113124453245014060 0ustar liggesusers#include #include #include #include "sp.h" /* Compute surface area, using method from: Calculating Landscape Surface Area from Digital Elevation Models Author(s): Jeff S. Jenness Source: Wildlife Society Bulletin, Vol. 32, No. 3 (Autumn, 2004), pp. 829-839 Published by: Allen Press Stable URL: http://www.jstor.org/stable/3784807 with edge adjustments. (c) Barry Rowlingson 2010 */ double height(double *heights, int *nx, int i, int j){ return(heights[(i)+(*nx)*(j)]); } double triarea(double a, double b, double c){ /* triangle area given side lengths */ double s; s=(a+b+c)/2.0; return(sqrt(s*(s-a)*(s-b)*(s-c))); } void sarea(double *heights, int *nx, int *ny, double *w, double *h, double *sa, int *bycell){ /* given an *nx by *ny matrix of *heights with single-cell edge border, compute the surface area. If bycell==1, then return a matrix of individual cell area estimates, otherwise add them all up and return the sum in *sa (allocated in R) */ /* point values */ double z1,z2,z3; /* side lengths */ double l1,l2,l3; /* diagonal length */ double s2 = sqrt((*w)*(*w)+(*h)*(*h)); /* offsets to neighbours */ int dxv[]={-1,0,1,1,1,0,-1,-1,-1}; int dyv[]={-1,-1,-1,0,1,1,1,0,-1}; /* triangle side lengths */ /* first the radial sides */ double side[]={s2,*h,s2,*w,s2,*h,s2,*w,s2}; /* outer edges */ double l3v[]={*w,*w,*h,*h,*w,*w,*h,*h}; double cellArea; int cellI; if(*bycell==0){ *sa = 0.0; }else{ cellI=0; /* saves us computing 2-d array indices */ } for(int j=1;j<(*ny-1);j++){ for(int i=1;i<(*nx-1);i++){ z1 = height(heights,nx,i,j); cellArea=0; if(!ISNA(z1)){ for(int tri=0;tri<8;tri++){ z2=height(heights,nx,i+dxv[tri],j+dyv[tri]); /* replace missing adjacent values with the current cell value */ if(ISNA(z2))z2=z1; z3=height(heights,nx,i+dxv[tri+1],j+dyv[tri+1]); if(ISNA(z3))z3=z1; l1 = 0.5 * sqrt(side[tri]*side[tri]+(z1-z2)*(z1-z2)); l2 = 0.5 * sqrt(side[tri+1]*side[tri+1]+(z1-z3)*(z1-z3)); l3 = 0.5 * sqrt(l3v[tri]*l3v[tri]+(z2-z3)*(z2-z3)); cellArea += triarea(l1,l2,l3); } } if(*bycell==0){ *sa += cellArea; }else{ if(!ISNA(z1)){ sa[cellI]=cellArea; } cellI++; } } } } sp/NAMESPACE0000644000176200001440000002131113124436016012111 0ustar liggesusersuseDynLib(sp, bboxCalcR_c, pointsInBox, Polygon_c, Polygon_validate_c, Polygons_c, R_point_in_polygon_sp, sp_zerodist, sp_duplicates, SpatialPolygons_c, SpatialPolygons_getIDs_c, SpatialPolygons_plotOrder_c, SpatialPolygons_validate_c, tList ) importFrom(graphics, plot, hist, polygon, par, polypath, lines, strheight, text, contour, axTicks, axis, rasterImage, image, box, plot.new, plot.window, rect, segments, points, locator, identify, title, layout, lcm) importFrom(stats, aggregate, na.omit, aggregate.data.frame, complete.cases, quantile, as.formula, dist, runif, model.frame, na.fail) import(utils) importFrom(grid, grid.polygon, grid.path, grid.rect, polygonGrob, gpar, grid.layout, unit, frameGrob, placeGrob, rectGrob, grid.locator, grid.raster) importFrom(grDevices, rgb, heat.colors) import(methods) import(lattice) export( CRS, identicalCRS, # print.CRS, -> S3Method() # bbox, getGridIndex, points2grid, bpy.colors, bubble, mapasp, point.in.polygon, spmap.to.lev, zerodist, zerodist2, remove.duplicates, degAxis, "%over%", get_ll_warn, set_ll_warn, get_ll_TOL, set_ll_TOL, get_ReplCRS_warn, set_ReplCRS_warn, get_Polypath, set_Polypath, get_PolypathRule, set_PolypathRule, set_col_regions, get_col_regions, coordinatevalues, dimensions, Spatial, SpatialPoints, SpatialPointsDataFrame, SpatialMultiPoints, SpatialMultiPointsDataFrame, Line, Lines, SpatialLines, SpatialLinesDataFrame, as.SpatialLines.SLDF, LineLength, LinesLength, SpatialLinesLengths, layout.scale.bar, layout.north.arrow, sp.theme, mapLegendGrob, spplot.key, panel.ggmap, panel.gridplot, panel.polygonsplot, panel.pointsplot, panel.RgoogleMaps, sp.polygons, sp.lines, sp.text, sp.points, sp.grid, SpatialPolygonsRescale, spplot.locator, sp.panel.layout, degreeLabelsEW, degreeLabelsNS, longlat.scales, bbexpand, compassRose, as.image.SpatialGridDataFrame, image2Grid, imageScale, gridparameters, SpatialPixels, SpatialPixelsDataFrame, SpatialGrid, SpatialGridDataFrame, GridTopology, getGridTopology, areaSpatialGrid, gridlines, gridat, gridIndex2nb, getSLlinesSlot, getLinesLinesSlot, getLinesIDSlot, getSLLinesIDSlots, getSpatialLinesMidPoints, getPolygonCoordsSlot, getPolygonLabptSlot, getPolygonAreaSlot, getPolygonHoleSlot, getPolygonsPolygonsSlot, getPolygonsplotOrderSlot, getPolygonsLabptSlot, getPolygonsIDSlot, getSpPpolygonsSlot, getSpPplotOrderSlot, getSpPPolygonsLabptSlots, getSpPPolygonsIDSlots, getSpPnParts, getSpPnHoles, getSpatialPolygonsLabelPoints, select.spatial, as.SpatialPolygons.PolygonsList, # as.SpatialPolygonsDataFrame.SpatialPolygons, -> use coerce() # DMS: dd2dms, print.DMS, char2dms, as.character.DMS, as.double.DMS, as.numeric.DMS, # is coerce, but needed to add proj4string: as.SpatialPolygons.GridTopology, # as.SpatialPolygons.SpatialPixels, -> is a coerce(), but plotKML uses it IDvaluesGridTopology, IDvaluesSpatialPixels, HexPoints2SpatialPolygons, flipHorizontal, flipVertical, loadMeuse, makegrid, overDF_for_rgeos, # for rgeos only! read.asciigrid, Polygon, Polygons, cbind.Spatial, rbind.SpatialPoints, rbind.SpatialPointsDataFrame, rbind.SpatialMultiPoints, rbind.SpatialMultiPointsDataFrame, rbind.SpatialPixels, rbind.SpatialPixelsDataFrame, rbind.SpatialPolygons, rbind.SpatialPolygonsDataFrame, rbind.SpatialLines, rbind.SpatialLinesDataFrame, # sample.Spatial, -> coerce()... # sample.Line, # sample.Polygon, # sample.Polygons, # sample.Sgrid, # ShowSpatialPointsDataFrame -> coerce()... SpatialPolygons, SpatialPolygonsDataFrame, spDistsN1, spDists, write.asciigrid ) exportClasses( DMS, CRS, GridTopology, Line, Lines, Polygon, Polygons, Spatial, SpatialGrid, SpatialGridDataFrame, SpatialLines, SpatialLinesDataFrame, SpatialPixels, SpatialPixelsDataFrame, SpatialPoints, SpatialPointsDataFrame, SpatialMultiPoints, SpatialMultiPointsDataFrame, SpatialPolygons, SpatialPolygonsDataFrame, # spatstat classes: ppp, im, owin, psp ) exportMethods( "[", "[[", "$", "$<-", addAttrToGeom, bbox, coerce, coordinates, "coordinates<-", coordnames, "coordnames<-", dimensions, disaggregate, fullgrid, "fullgrid<-", geometry, "geometry<-", gridded, "gridded<-", is.projected, merge, over, # overlay, plot, polygons, "polygons<-", proj4string, "proj4string<-", recenter, show, spChFIDs, "spChFIDs<-", split, sppanel, spplot, spsample, summary, surfaceArea, spTransform ) S3method(as.array, SpatialGridDataFrame) S3method(as.character, DMS) S3method(as.data.frame, SpatialPoints) S3method(as.data.frame, SpatialMultiPoints) S3method(as.data.frame, SpatialPixels) S3method(as.data.frame, SpatialGrid) S3method(as.data.frame, SpatialPointsDataFrame) S3method(as.data.frame, SpatialMultiPointsDataFrame) S3method(as.data.frame, SpatialPixelsDataFrame) S3method(as.data.frame, SpatialGridDataFrame) S3method(as.data.frame, SpatialLinesDataFrame) S3method(as.data.frame, SpatialPolygonsDataFrame) S3method(as.data.frame, GridTopology) S3method(as.double, DMS) S3method(as.numeric, DMS) S3method(as.matrix, SpatialGridDataFrame) S3method(as.matrix, SpatialPixelsDataFrame) S3method(aggregate, Spatial) S3method(cbind, Spatial) S3method(cbind, SpatialGridDataFrame) S3method(contour, SpatialPixelsDataFrame) S3method(contour, SpatialGridDataFrame) S3method(dim, SpatialPointsDataFrame) S3method(dim, SpatialMultiPointsDataFrame) S3method(dim, SpatialLinesDataFrame) S3method(dim, SpatialPolygonsDataFrame) S3method(dim, SpatialPixelsDataFrame) S3method(dim, SpatialGridDataFrame) S3method(head, Spatial) S3method(image, SpatialPixelsDataFrame) S3method(image, SpatialPixels) S3method(image, SpatialGridDataFrame) S3method(labels, SpatialLines) S3method(length, SpatialGrid) S3method(length, SpatialLines) S3method(length, SpatialPixels) S3method(length, SpatialPoints) S3method(length, SpatialMultiPoints) S3method(length, SpatialPolygons) S3method(length, SpatialGridDataFrame) S3method(length, SpatialLinesDataFrame) S3method(length, SpatialPixelsDataFrame) S3method(length, SpatialPointsDataFrame) S3method(length, SpatialMultiPointsDataFrame) S3method(length, SpatialPolygonsDataFrame) S3method(lines, Line) S3method(lines, Lines) S3method(lines, SpatialLines) S3method(lines, SpatialLinesDataFrame) S3method(names, SpatialPointsDataFrame) S3method(names, SpatialMultiPointsDataFrame) S3method(names, SpatialPixelsDataFrame) S3method(names, SpatialGridDataFrame) S3method(names, SpatialLinesDataFrame) S3method(names, SpatialPolygonsDataFrame) S3method(names, SpatialLines) S3method(names, SpatialPolygons) S3method(names, SpatialMultiPoints) S3method("names<-", SpatialPointsDataFrame) S3method("names<-", SpatialPolygonsDataFrame) S3method("names<-", SpatialLinesDataFrame) S3method("names<-", SpatialPixelsDataFrame) S3method("names<-", SpatialGridDataFrame) S3method(row.names, SpatialPoints) S3method(row.names, SpatialMultiPoints) S3method(row.names, SpatialLines) S3method(row.names, SpatialPolygons) S3method(row.names, SpatialPixels) S3method(row.names, SpatialGrid) S3method(row.names, SpatialPointsDataFrame) S3method(row.names, SpatialLinesDataFrame) S3method(row.names, SpatialPolygonsDataFrame) S3method(row.names, SpatialGridDataFrame) S3method("row.names<-", SpatialPoints) S3method("row.names<-", SpatialMultiPoints) S3method("row.names<-", SpatialPointsDataFrame) S3method("row.names<-", SpatialPolygons) S3method("row.names<-", SpatialPolygonsDataFrame) S3method("row.names<-", SpatialLines) S3method("row.names<-", SpatialLinesDataFrame) S3method(points, SpatialPoints) S3method(points, SpatialPointsDataFrame) S3method(points, SpatialMultiPoints) S3method(points, SpatialMultiPointsDataFrame) S3method(print, CRS) S3method(print, DMS) S3method(print, GridTopology) S3method(print, SpatialPoints) S3method(print, SpatialMultiPoints) S3method(print, SpatialPixels) S3method(print, SpatialLines) S3method(print, SpatialPointsDataFrame) S3method(print, SpatialMultiPointsDataFrame) S3method(print, SpatialPixelsDataFrame) S3method(print, SpatialLinesDataFrame) S3method(print, summary.Spatial) S3method(print, summary.GridTopology) S3method(rbind, SpatialLines) S3method(rbind, SpatialLinesDataFrame) S3method(rbind, SpatialMultiPoints) S3method(rbind, SpatialMultiPointsDataFrame) S3method(rbind, SpatialPixels) S3method(rbind, SpatialPixelsDataFrame) S3method(rbind, SpatialPoints) S3method(rbind, SpatialPointsDataFrame) S3method(rbind, SpatialPolygons) S3method(rbind, SpatialPolygonsDataFrame) S3method(split, SpatialPoints) S3method(stack, SpatialPointsDataFrame) S3method(stack, SpatialPixelsDataFrame) S3method(stack, SpatialGridDataFrame) S3method(subset, Spatial) S3method(tail, Spatial) S3method(text, SpatialPointsDataFrame) sp/demo/0000755000176200001440000000000012761331402011617 5ustar liggesuserssp/demo/depend.R0000644000176200001440000000024212600313766013204 0ustar liggesusersrequire(tools) x = check_packages_in_dir(".", #check_args = c("--as-cran", ""), check_args = c("", ""), reverse = list(repos = getOption("repos"))) summary(x) sp/demo/webmap.R0000644000176200001440000000251312577541412013227 0ustar liggesuserslibrary(sp) library(ggmap) demo(meuse, ask=FALSE, echo = FALSE) merc = CRS("+init=epsg:3857") WGS84 = CRS("+init=epsg:4326") meuse = spTransform(meuse, WGS84) bgMap = get_map(as.vector(bbox(meuse)), source = "google", zoom = 13) # useless without zoom level # plot with ggmap-google bg: plot(spTransform(meuse, merc), bgMap = bgMap, pch = 16, cex = .5) # spplot with ggmap-google bg: spplot(spTransform(meuse, merc), c("zinc", "lead"), colorkey = TRUE, sp.layout = list(panel.ggmap, bgMap, first = TRUE)) # plot with ggmap-osm bg: bb = t(apply(bbox(meuse), 1, bbexpand, .04)) bgMap = get_map(as.vector(bb), source = "osm") # WGS84 for background map plot(spTransform(meuse, merc), bgMap = bgMap, pch = 16, cex = .5) # RgoogleMaps: center = apply(coordinates(meuse), 2, mean)[2:1] library(RgoogleMaps) g = GetMap(center=center, zoom=13) # google par(mar = rep(0,4)) # fill full device plot(spTransform(meuse, merc), bgMap = g, pch = 16, cex = .5) spplot(spTransform(meuse, merc), c("zinc", "lead"), colorkey = TRUE, sp.layout = list(panel.RgoogleMaps, g, first = TRUE), scales = list(draw = TRUE)) # Norway boundary example: library(cshapes) cshp = cshp(as.Date("2000-01-1")) norway = cshp[cshp$ISO1AL2 == "NO",] bgMap = get_map(as.vector(bbox(norway))) # no is already in WGS84 plot(spTransform(norway, merc), bgMap = bgMap, border = 'red') sp/demo/mp.R0000644000176200001440000000133512577541412012371 0ustar liggesusersset.seed(1331) cl1 = cbind(rnorm(3, 10), rnorm(3, 10)) cl2 = cbind(rnorm(5, 10), rnorm(5, 0)) cl3 = cbind(rnorm(7, 0), rnorm(7, 10)) library(sp) mp = SpatialMultiPoints(list(cl1, cl2, cl3)) plot(mp, col = 2, cex = 1, pch = 1:3) mp mp[1:2] as(mp, "SpatialPoints") mp[0,] print(mp, asWKT=TRUE, digits=3) mpdf = SpatialMultiPointsDataFrame(list(cl1, cl2, cl3), data.frame(a = 1:3)) mpdf print(mpdf, asWKT=TRUE, digits=3) mpdf[0,] plot(mpdf, col = mpdf$a, cex = 1:3) as(mpdf, "data.frame") mpdf[1:2,] as(mpdf, "SpatialPointsDataFrame") # aggregate SpatialPointsDataFrame to SpatialMultiPointsDataFrame: demo(meuse, ask = FALSE, echo = FALSE) a = aggregate(meuse[c("zinc", "lead")], list(meuse$ffreq)) spplot(a[c("zinc", "lead")]) sp/demo/meuse.R0000644000176200001440000000074012577541412013072 0ustar liggesusersrequire(sp) crs = CRS("+init=epsg:28992") data("meuse") coordinates(meuse) <- ~x+y proj4string(meuse) <- crs data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE proj4string(meuse.grid) <- crs data("meuse.riv") meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) proj4string(meuse.riv) <- crs data("meuse.area") meuse.area = SpatialPolygons(list(Polygons(list(Polygon(meuse.area)), "area"))) proj4string(meuse.area) <- crs sp/demo/00Index0000644000176200001440000000107412654406446012767 0ustar liggesusersgallery scripts to generate graph gallery on http://r-spatial.sourceforge.net/ fib demo script for Fibonacci sampling on the sphere depend script that runs check on all R packages depending on sp meuse script that loads the meuse data set, converts the objects into sp classes, and sets coordinate reference system mp demonstrate use of SpatialMultiPoints and SpatialMultiPointsDataFrame polar polar plot showing gridlines and gridline labels in epsg 3031 webmap OpenStreetMap or google map backgrounds in sp::plot and sp::spplot, using ggmap or RgoogleMaps maps sp/demo/gallery.R0000644000176200001440000004140512577541412013416 0ustar liggesuserslibrary(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() data(meuse) coordinates(meuse)=~x+y ## coloured points plot with legend in plotting area and scales: spplot(meuse, "zinc", do.log = TRUE, key.space=list(x=0.2,y=0.9,corner=c(0,1)), scales=list(draw=T)) library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() data(meuse) coordinates(meuse)=~x+y ## coloured points plot with legend in plotting area and scales; ## non-default number of cuts with user-supplied legend entries: spplot(meuse, "zinc", do.log = TRUE, key.space=list(x=0.2,y=0.9,corner=c(0,1)), scales=list(draw=T), cuts = 3, legendEntries = c("low", "intermediate", "high")) library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() data(meuse) coordinates(meuse)=~x+y scale = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(178600,332990), scale = 500, fill=c("transparent","black")) text1 = list("sp.text", c(178600,333090), "0") text2 = list("sp.text", c(179100,333090), "500 m") arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(178750,332500), scale = 400) ## points plot with scale bar, scale bar text, north arrow and title: spplot(meuse, "zinc", do.log=T, key.space=list(x=0.1,y=0.93,corner=c(0,1)), sp.layout=list(scale,text1,text2,arrow), main = "Zinc (top soil)") library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() data(meuse) coordinates(meuse)=~x+y data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) rv = list("sp.polygons", meuse.sr, fill = "lightblue") scale = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(180500,329800), scale = 500, fill=c("transparent","black"), which = 1) text1 = list("sp.text", c(180500,329900), "0", which = 1) text2 = list("sp.text", c(181000,329900), "500 m", which = 1) arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(178750,332500), scale = 400) ## plot with north arrow and text outside panels ## (scale can, as of yet, not be plotted outside panels) spplot(meuse["zinc"], do.log = TRUE, key.space = "bottom", sp.layout = list(rv, scale, text1, text2), main = "Zinc (top soil)", legend = list(right = list(fun = mapLegendGrob(layout.north.arrow())))) library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() data(meuse) coordinates(meuse)=~x+y data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) ## same plot; north arrow now inside panel, custom panel function instead of sp.layout spplot(meuse, "zinc", panel = function(x, y, ...) { sp.polygons(meuse.sr, fill = "lightblue") SpatialPolygonsRescale(layout.scale.bar(), offset = c(179900,329600), scale = 500, fill=c("transparent","black")) sp.text(c(179900,329700), "0") sp.text(c(180400,329700), "500 m") SpatialPolygonsRescale(layout.north.arrow(), offset = c(178750,332500), scale = 400) panel.pointsplot(x, y, ...) }, do.log = TRUE, cuts = 7, key.space = list(x = 0.1, y = 0.93, corner = c(0,1)), main = "Top soil zinc concentration (ppm)") library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() data(meuse) coordinates(meuse)=~x+y data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) rv = list("sp.polygons", meuse.sr, fill = "lightblue") ## multi-panel plot, scales + north arrow only in last plot: ## using the "which" argument in a layout component ## (if which=4 was set as list component of sp.layout, the river ## would as well be drawn only in that (last) panel) scale = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(180500,329800), scale = 500, fill=c("transparent","black"), which = 4) text1 = list("sp.text", c(180500,329900), "0", cex = .5, which = 4) text2 = list("sp.text", c(181000,329900), "500 m", cex = .5, which = 4) arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(181300,329800), scale = 400, which = 4) cuts = c(.2,.5,1,2,5,10,20,50,100,200,500,1000,2000) spplot(meuse, c("cadmium", "copper", "lead", "zinc"), do.log = TRUE, key.space = "right", as.table = TRUE, sp.layout=list(rv, scale, text1, text2, arrow), # note that rv is up front! main = "Heavy metals (top soil), ppm", cex = .7, cuts = cuts) library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() alphaChannelSupported = function() { !is.na(match(names(dev.cur()), c("pdf"))) } data(meuse) coordinates(meuse)=~x+y data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) rv = list("sp.polygons", meuse.sr, fill = ifelse(alphaChannelSupported(), "blue", "transparent"), alpha = ifelse(alphaChannelSupported(), 0.1, 1)) pts = list("sp.points", meuse, pch = 3, col = "grey", alpha = ifelse(alphaChannelSupported(), .5, 1)) text1 = list("sp.text", c(180500,329900), "0", cex = .5, which = 4) text2 = list("sp.text", c(181000,329900), "500 m", cex = .5, which = 4) scale = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(180500,329800), scale = 500, fill=c("transparent","black"), which = 4) library(gstat, pos = match(paste("package", "sp", sep=":"), search()) + 1) data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE v.ok = variogram(log(zinc)~1, meuse) ok.model = fit.variogram(v.ok, vgm(1, "Exp", 500, 1)) # plot(v.ok, ok.model, main = "ordinary kriging") v.uk = variogram(log(zinc)~sqrt(dist), meuse) uk.model = fit.variogram(v.uk, vgm(1, "Exp", 300, 1)) # plot(v.uk, uk.model, main = "universal kriging") meuse[["ff"]] = factor(meuse[["ffreq"]]) meuse.grid[["ff"]] = factor(meuse.grid[["ffreq"]]) v.sk = variogram(log(zinc)~ff, meuse) sk.model = fit.variogram(v.sk, vgm(1, "Exp", 300, 1)) # plot(v.sk, sk.model, main = "stratified kriging") zn.ok = krige(log(zinc)~1, meuse, meuse.grid, model = ok.model) zn.uk = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = uk.model) zn.sk = krige(log(zinc)~ff, meuse, meuse.grid, model = sk.model) zn.id = krige(log(zinc)~1, meuse, meuse.grid) zn = zn.ok zn[["a"]] = zn.ok[["var1.pred"]] zn[["b"]] = zn.uk[["var1.pred"]] zn[["c"]] = zn.sk[["var1.pred"]] zn[["d"]] = zn.id[["var1.pred"]] spplot(zn, c("a", "b", "c", "d"), names.attr = c("ordinary kriging", "universal kriging with dist to river", "stratified kriging with flood freq", "inverse distance"), as.table = TRUE, main = "log-zinc interpolation", sp.layout = list(rv, scale, text1, text2) ) library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() alphaChannelSupported = function() { !is.na(match(names(dev.cur()), c("pdf"))) } data(meuse) coordinates(meuse)=~x+y data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) rv = list("sp.polygons", meuse.sr, fill = "lightblue") scale = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(180500,329800), scale = 500, fill=c("transparent","black"), which = 4) text1 = list("sp.text", c(180500,329900), "0", cex = .5, which = 4) text2 = list("sp.text", c(181000,329900), "500 m", cex = .5, which = 4) arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(181300,329800), scale = 400, which = 4) library(gstat, pos = match(paste("package", "sp", sep=":"), search()) + 1) data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE v.ok = variogram(log(zinc)~1, meuse) ok.model = fit.variogram(v.ok, vgm(1, "Exp", 500, 1)) # plot(v.ok, ok.model, main = "ordinary kriging") v.uk = variogram(log(zinc)~sqrt(dist), meuse) uk.model = fit.variogram(v.uk, vgm(1, "Exp", 300, 1)) # plot(v.uk, uk.model, main = "universal kriging") meuse[["ff"]] = factor(meuse[["ffreq"]]) meuse.grid[["ff"]] = factor(meuse.grid[["ffreq"]]) v.sk = variogram(log(zinc)~ff, meuse) sk.model = fit.variogram(v.sk, vgm(1, "Exp", 300, 1)) # plot(v.sk, sk.model, main = "stratified kriging") zn.ok = krige(log(zinc)~1, meuse, meuse.grid, model = ok.model) zn.uk = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = uk.model) zn.sk = krige(log(zinc)~ff, meuse, meuse.grid, model = sk.model) zn.id = krige(log(zinc)~1, meuse, meuse.grid) rv = list("sp.polygons", meuse.sr, fill = ifelse(alphaChannelSupported(), "blue", "transparent"), alpha = ifelse(alphaChannelSupported(), 0.1, 1)) pts = list("sp.points", meuse, pch = 3, col = "grey", alpha = ifelse(alphaChannelSupported(), .7, 1)) spplot(zn.uk, "var1.pred", sp.layout = list(rv, scale, text1, text2, pts), main = "log(zinc); universal kriging using sqrt(dist to Meuse)") zn.uk[["se"]] = sqrt(zn.uk[["var1.var"]]) ## Universal kriging standard errors; grid plot with point locations ## and polygon (river), pdf has transparency on points and river spplot(zn.uk, "se", sp.layout = list(rv, scale, text1, text2, pts), main = "log(zinc); universal kriging standard errors") library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() # prepare nc sids data set: library(maptools) nc <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], proj4string=CRS("+proj=longlat +datum=NAD27")) arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(-76,34), scale = 0.5, which = 2) #scale = list("SpatialPolygonsRescale", layout.scale.bar(), # offset = c(-77.5,34), scale = 1, fill=c("transparent","black"), which = 2) #text1 = list("sp.text", c(-77.5,34.15), "0", which = 2) #text2 = list("sp.text", c(-76.5,34.15), "1 degree", which = 2) ## multi-panel plot with filled polygons: North Carolina SIDS spplot(nc, c("SID74", "SID79"), names.attr = c("1974","1979"), colorkey=list(space="bottom"), scales = list(draw = TRUE), main = "SIDS (sudden infant death syndrome) in North Carolina", sp.layout = list(arrow), as.table = TRUE) # sp.layout = list(arrow, scale, text1, text2), as.table = TRUE) library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(-76,34), scale = 0.5, which = 2) #scale = list("SpatialPolygonsRescale", layout.scale.bar(), # offset = c(-77.5,34), scale = 1, fill=c("transparent","black"), which = 2) #text1 = list("sp.text", c(-77.5,34.15), "0", which = 2) #text2 = list("sp.text", c(-76.5,34.15), "1 degree", which = 2) # create a fake lines data set: library(maptools) ncl <- readShapeLines(system.file("shapes/sids.shp", package="maptools")[1], proj4string=CRS("+proj=longlat +datum=NAD27")) ## multi-panel plot with coloured lines: North Carolina SIDS spplot(ncl, c("SID74","SID79"), names.attr = c("1974","1979"), colorkey=list(space="bottom"), main = "SIDS (sudden infant death syndrome) in North Carolina", sp.layout = arrow, as.table = TRUE) library(sp) data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE data(meuse) coordinates(meuse) = ~x+y data(meuse.riv) meuse.sl = SpatialLines(list(Lines(list(Line(meuse.riv)), "ID"))) #meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) ## image plot with points and lines image(meuse.grid["dist"], main = "meuse river data set; colour indicates distance to river") points(meuse, pch = 3) lines(meuse.sl) library(sp) library(lattice) data(meuse) coordinates(meuse) = ~x+y ## bubble plots for cadmium and zinc data(meuse) coordinates(meuse) <- c("x", "y") # promote to SpatialPointsDataFrame b1 = bubble(meuse, "cadmium", maxsize = 1.5, main = "cadmium concentrations (ppm)", key.entries = 2^(-1:4)) b2 = bubble(meuse, "zinc", maxsize = 1.5, main = "zinc concentrations (ppm)", key.entries = 100 * 2^(0:4)) print(b1, split = c(1,1,2,1), more = TRUE) print(b2, split = c(2,1,2,1), more = FALSE) library(sp) ## plot for SpatialPolygons, with county name at label point library(maptools) nc2 <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], proj4string=CRS("+proj=longlat +datum=NAD27")) plot(nc2) invisible(text(coordinates(nc2), labels=as.character(nc2$NAME), cex=0.4)) library(sp) ## plot of SpatialPolygonsDataFrame, using grey shades library(maptools) nc1 <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], proj4string=CRS("+proj=longlat +datum=NAD27")) names(nc1) rrt <- nc1$SID74/nc1$BIR74 brks <- quantile(rrt, seq(0,1,1/7)) cols <- grey((length(brks):2)/length(brks)) dens <- (2:length(brks))*3 plot(nc1, col=cols[findInterval(rrt, brks, all.inside=TRUE)]) library(sp) ## plot of SpatialPolygonsDataFrame, using line densities library(maptools) nc <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], proj4string=CRS("+proj=longlat +datum=NAD27")) names(nc) rrt <- nc$SID74/nc$BIR74 brks <- quantile(rrt, seq(0,1,1/7)) cols <- grey((length(brks):2)/length(brks)) dens <- (2:length(brks))*3 plot(nc, density=dens[findInterval(rrt, brks, all.inside=TRUE)]) library(sp) data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)), "x"))) plot(meuse.sr) ## stratified sampling within a polygon points(spsample(meuse.sr@polygons[[1]], n = 200, "stratified"), pch = 3, cex=.3) ## random sampling over a grid library(sp) data(meuse.grid) gridded(meuse.grid) = ~x+y image(meuse.grid) points(spsample(meuse.grid,n=1000,type="random"), pch=3, cex=.4) ## regular sampling over a grid library(sp) data(meuse.grid) gridded(meuse.grid) = ~x+y image(meuse.grid["dist"]) points(spsample(meuse.grid,n=1000,type="regular"), pch=3, cex=.4) ## nonaligned systematic sampling over a grid library(sp) data(meuse.grid) gridded(meuse.grid) = ~x+y image(meuse.grid["dist"]) points(spsample(meuse.grid,n=1000,type="nonaligned"), pch=3, cex=.4) library(sp) library(lattice) # required for trellis.par.set(): trellis.par.set(sp.theme()) # sets color ramp to bpy.colors() alphaChannelSupported = function() { !is.na(match(names(dev.cur()), c("pdf"))) } data(meuse) coordinates(meuse)=~x+y data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) rv = list("sp.polygons", meuse.sr, fill = "lightblue") scale = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(180500,329800), scale = 500, fill=c("transparent","black"), which = 4) text1 = list("sp.text", c(180500,329900), "0", cex = .5, which = 4) text2 = list("sp.text", c(181000,329900), "500 m", cex = .5, which = 4) arrow = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(181300,329800), scale = 400, which = 4) library(gstat, pos = match(paste("package", "sp", sep=":"), search()) + 1) data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE v.ok = variogram(log(zinc)~1, meuse) ok.model = fit.variogram(v.ok, vgm(1, "Exp", 500, 1)) # plot(v.ok, ok.model, main = "ordinary kriging") v.uk = variogram(log(zinc)~sqrt(dist), meuse) uk.model = fit.variogram(v.uk, vgm(1, "Exp", 300, 1)) # plot(v.uk, uk.model, main = "universal kriging") meuse[["ff"]] = factor(meuse[["ffreq"]]) meuse.grid[["ff"]] = factor(meuse.grid[["ffreq"]]) v.sk = variogram(log(zinc)~ff, meuse) sk.model = fit.variogram(v.sk, vgm(1, "Exp", 300, 1)) # plot(v.sk, sk.model, main = "stratified kriging") zn.ok = krige(log(zinc)~1, meuse, meuse.grid, model = ok.model) zn.uk = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = uk.model) zn.sk = krige(log(zinc)~ff, meuse, meuse.grid, model = sk.model) zn.id = krige(log(zinc)~1, meuse, meuse.grid) rv = list("sp.polygons", meuse.sr, fill = ifelse(alphaChannelSupported(), "blue", "transparent"), alpha = ifelse(alphaChannelSupported(), 0.1, 1)) pts = list("sp.points", meuse, pch = 3, col = "grey", alpha = ifelse(alphaChannelSupported(), .5, 1)) spplot(zn.uk, "var1.pred", sp.layout = list(rv, scale, text1, text2, pts), main = "log(zinc); universal kriging using sqrt(dist to Meuse)") zn.uk[["se"]] = sqrt(zn.uk[["var1.var"]]) ## Universal kriging standard errors; grid plot with point locations ## and polygon (river), pdf has transparency on points and river spplot(zn.uk, "se", sp.layout = list(rv, scale, text1, text2, pts), main = "log(zinc); universal kriging standard errors") library(sp) library(maptools) nc <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], proj4string=CRS("+proj=longlat +datum=NAD27")) names(nc) # create two dummy factor variables, with equal labels: set.seed(31) nc$f = factor(sample(1:5,100,replace=T),labels=letters[1:5]) nc$g = factor(sample(1:5,100,replace=T),labels=letters[1:5]) library(RColorBrewer) ## Two (dummy) factor variables shown with qualitative colour ramp; degrees in axes spplot(nc, c("f","g"), col.regions=brewer.pal(5, "Set3"), scales=list(draw = TRUE)) sp/demo/polar.R0000644000176200001440000000134112655704500013063 0ustar liggesusers# polar projection with map: library(maps) m = map(xlim = c(-180,180), ylim = c(-90,-70), plot = FALSE, fill = TRUE) IDs <- sapply(strsplit(m$names, ":"), function(x) x[1]) library(maptools) m <- map2SpatialPolygons(m, IDs=IDs, proj4string = CRS("+init=epsg:4326")) polar = CRS("+init=epsg:3031") gl = spTransform(gridlines(m, easts = seq(-180,180,20)), polar) plot(gl) plot(spTransform(m, polar), add = TRUE, col = grey(0.8, 0.8)) l = labels(gl, CRS("+init=epsg:4326"), side = 3) # pos is too simple here, use adj: l$pos = NULL text(l, adj = c(0.5, -0.3), cex = .85) l = labels(gl, CRS("+init=epsg:4326"), side = 2) l$srt = 0 # otherwise they are upside-down text(l, cex = .85) title("grid line labels on polar projection, epsg 3031") sp/demo/fib.R0000644000176200001440000000110012577541412012503 0ustar liggesusersxy = expand.grid(x = seq(5,355,by=10),y=seq(-85,85,by=10)) xyp = SpatialPoints(xy, CRS("+proj=longlat")) gridded(xyp)=T gridparameters(xyp) xyf = spsample(xyp, 1000, type="Fibonacci") plot(xyf, axes=TRUE) if (require(rgdal)) { xy = expand.grid(x = seq(-85,85,by=10),y=seq(-85,85,by=10)) xyp = SpatialPoints(xy, CRS("+proj=longlat")) gridded(xyp) = TRUE tocrs = CRS("+proj=ortho +lat_0=0 +lon_0=0 +x0=0 +y0=0") plot(spTransform(xyp, tocrs), pch=16,cex=.7) xyf = spsample(xyp, 1000, type="Fibonacci") plot(spTransform(xyf, tocrs), pch=16,cex=.7) dim(coordinates(xyf)) } sp/data/0000755000176200001440000000000012577541412011615 5ustar liggesuserssp/data/meuse.grid_ll.rda0000644000176200001440000016073012577541412015045 0ustar liggesusersl<ۛYeUJ)#P(EF)2JV@RQ4BP4R*߲>^q=-ױ?Fˆi/3' FN"a_o\w302G us_Joiz {m<ɿ^fgøǿ{ .5ljîG%fǵ=Y'̵zœV;++Vj2ۙi ,'\N`]BoVuߚض~҉MO#J\<=~.ceU˲DnYy50m@O;KD0e ʮYz̓XqKY^uo%=WKMT.7FOgSΝ|'}+3_[$&6r2oolKfX]o-68q8Hwkq \OxbWmt˜E މ\l hdlpuBs:ݤL/܁ q-=dQ+q)~Wxy\wɯĻ~=?z86-CzsDZE,Kn&X'Gbҫ7Sxtz].MKZ#z¼/ &pӘ!U]fW_ %i(A;sø.%tϫ8Xu}nObeUs䙎q̕t }- $WmTʄ Ė]-+ˏH؍XYs̕♕[L^'Ǧ<~Nݳw[Hn^ܟGm=Wjo1bN޺ fW buWh9jKY=gW=_V>Z<'̷I~3kS3$t.5#*w'>$wm#;oZr)_2l6p^ӂƄdϰ\?F[wsĄ"kyߛS~NʜfQS~pm<),Aس13Y$' $a-33K=Y\|-k.oߋ"UFaD̀ٳۗCXQ!}v-=G:j=LvD4*JcE-eZ=qn&n<q/ `ʡ=dj tb+njװK`Xo`xa,^9agSFaKɕM7a[ꁃZG3>uOfvI=yG*$Wa/DmZxVMZX>y4y']{^ؘɧ.uX\N}c{[Te}2=)^7䬢R]cyB~/4B-dC|Q{A3@ -?aچ4FȆä7??6Nz=}D+꣤ % > ;.]zDElyJgoع].9& ] ة8:68߮ >GxWyFǨ2>#LvzD'N7}Ti?L V컬)&yԜ$;LEiSQ*o~ʫ-CvjedgX&,ҟ)Jc927Gu;5noE5ϔ׾T9{[kO-q^Q4v4~LO#n];ヴS]S;v.jA}I^b5홀 qNYdsRAָ/ЧW(_Xzf&gSc?v.k<}JO_ ع|2b}2Sp!y׉q [N:RGQةtM7SVp} 1AY>عt M,}S2sN1O '9iiKh[g7 ڔmv)_[CPaBt?^eeds4g0ezsO9=C='cOB uXdRCOl3ATɮ{(?9B,G1 oпC̼ҁå!is+Raw;ط*J^МzŒ!hcz\2 ;10[9XPeQB}S+җāgg}OsbgcXg3ڭĮ$ðs>wж?Ό/1*1Ps}=^UBvzsv.>/=ݗTBYEka2"Ά}ި>dCh,5B쓯nuRU}T9NyhwK1:';iNUp>E\i /V>n)/ b訖<{Iw1 z=N3t>AK_\<_|ޭ b_YwFcO[FSطoLN츱#%i7֝#_]Dµ׮4طB7\#Htщö5aaM'LOnNCu0'Jrp%qx{b-o3| ;5>&|^7Bv s9ND$SL{7e;ܗb<+:{ð{l/x,wyL+`0缬vA8S!pim|鷞cc-Md'}`a1/{5!v7 [x~14'0Ӟx;  [jo1&<=|8'Os:1⇴>@d7:Ok3;wc ι7:ߖ9Eڶ"y[ kj1<'fGOh|I1s/it-O-&-9S'ps_@=TDӹ]IN#>WI-|}W>{ _ _X&҃;?x*2H&ƍy4w2W'U"QBz^K[w8*쥭(|D}Tw8yRX'4|Ǵv1NX4J[~8vRn"Xǒbr!Y!,ۃ}dﱓPFKg@Eq|:LTw7O{nt1nOL2hGQ%}>|JO-[}M(ǥ"f˓.zLӹ&d%]Z[@OA^&罀>}囈.Jυ'I-\ƭ6ey6˯}gM;L!оȔq b%[ҁu[YF[`e.:za ٤oP\t^}4^ܦ2ǷYбFa ƈIoNN>'Vz\EyQxeM:]#}RU9CLIf˖@'t$Wi_Fag]+HZ#'6"~ ^\CaO#$j_R|1q?[ <9Ygߧ\ò{ a,#Wrul$C'u4o:.]璍oO -t ,ss}9:IzBnO?؍ ȶ!Wc瓒sKX6AS?vXk:IN[>\)󷔬N#JvV7%}v'/"w[B'rYeM?On6I³fCԧ}zL[{tia^sm:eBz#;q]CY#>N#R=s&7漬wNLSqgy 4 'Z &}: Saظv{+w^{b+87qӼÔՑIἾ6xZw,CriOlv?Ӽ4GG1QJl aKufnB'k>. }S܏,~6ncB1qϗSI ]o\\V2ߎkN6[P NOF~G${ʚ8ut /zx }]+4RNg__O@'Mq³I[3s.jͫDNǁp\Љxz)#T"uR04ON+sҾx-{b3thžWhasAbSإcK`I$x~9n1׃\aGG5_E@IHӨK/2ϏT:}؞FƟX9a;k?;+C5 (O -yGU}YvnѼ0c'0CpZFl4G-b^E|B)d\S8sSp}f әW%mOGCv1,SIsMC=;^xނࠉV7?Ӵ)yUfCuF4 ߊLYU' :Ia?Apt 79:16s/WF?[wD1n:VTj艊u BMdFtYwc7p+sΛ\X@' ڃ]i^fhx$9|NaTfL7:褴Ԕ;ǟЉ72YdLjhL-9sȯE~SmX~H&gAY4tpޣ9{'ըC+$o;\>jdhn=[A-lHyt.{ϳ_ 2.vӞcـk~zqr⍯ͳߡϴ3u+ϡ!aZ1F:5[Gq&v{vPn{4 },*Ȏ!30맋Ebes9k} ŦS;{Y%qgnq'DRA*H~}r[n?sZS?Y@t7ÿW19,lRԈ8a0yhn `僣O#tQwfM(Onx9s zCԷ[Dx|Ț<]n:KpD%3Y hQ袿^v߅_]d:<(&d~>}e?sJHkѷ‰ܵriGso{3m [/#;{r>!zKsÖ'A40jS|,.N|9jjCy8[s9tY|s3OkӞ0a8bQ]G.7c`?]eޱ7bi~`ػɪe?r:z*D~},_^ߨ38C6+21[Lߤ}).-5M?A>HyzSn@Mu)ć!3T +Qg/JsБ+fKIq[ GJW:9je t ȧ=cJUʳq̦Ĭkig>bõ91EܖT δrv ɽh^1}0D|Fl}E 1~]iYs406IOz0EmYAc@j,9A䈺/μoU4>I̪{X(pXz:t~[ ӀR4zyD鑒ɛ>Can3bow,4+CFnB彤qo|BN> 4'N+0Cu{Sݘ!3ՒC uA3sYꡛIѨ'c}_=bCc1$D*CE2+l1X-e,;O d9۠M)w xv?Jp"=~I$0RQH WkRhK~C㙡=_}?}iݑ}6b5AfC=M:޷!qW/B﹌`Yqok׮YfC[.1~:tPLe__zA!1U9b`A5O}Ok~4J)!0Sl_ưtqz:wV衡Nĸ)ggTԕ*B2ԏ'ȠEo7m\4{衴ɅqOBj6_k/KgGzD7r;rAkDCO}#J;+;=7HC3u%eGIJC@sm_7M# w~=W\z G;w'\? z|4`5jR~L|i9|M9o/Gt{!vW. H΋K>}T=+Q|ϥdsus^o'\/6!~h)A)kC)ңә߆2m =?7/_+@s9&wSo$b^O{|1=3юRVInSCaM8܉uMRBeڗ&]<=9%.t4tttՃ9d̶Ϸ@%!TfIǽ5+i~fbmuG|^zm[}vw;&\<) z$1%I:=H!WUfٔUW)u-z=Vs&J^=vx,r͸@|7iY1[^j=D">*Ovꚉ(i.r zH0_p%YP֊-.ٙ=t!tOQ]`A](}[Mм8s؈ҁrbMxngw9[m?AYAu GSSi~7=/L2󄩏0G-Ρ|L8D|y'8鲵cmG2;g]qn~ TIM 0|yX:]ߩT{f4ln[FX^C?jo}$\2 pj*ڃz Æ|C*[Vn }x.8S?yͷ[~@]4CAMYhD 5ћ?_\ICGBۼl/2I4Lh=g}-ޖ9 ЇAt9=ls.ETN&p&}.y{MԞqUHOAi:_I," &ɔչFeCRTJN|wP _q#277.#/,dNrkKaOx yIMߡ{;Zg\}SC@8i#@0e> I7Sf,<Ӟ<Ӝ[`* p9pJ[ i]̃>r9{{J:@q⯹wY2r/~&oC^zPe#7<ܹyY6|[gyMCGim~ߝT~ }/PO92ڃ'V> >+@8ﴩ@}-?@ԥ˖ˠi:H63^Og&UKCygs|g} ݭfɂ>viď;ejNv}N‹uhϹB:]cJ}wY[˃I9П{O8''f[g'G){Q~*ONgSr%XC}h"1eU>H+|>nSniSJ8߹yʹSЉ?l!w~$}n]ˠ}qrH"$w饇RL?r -89pn3wzYͩsw=0̠-!k#P.$t;;<''*=HK`gW~;h?3/_}BsOE~I~[+(}Dl%~tH ]24.n}T.KU<(z7eF޳D?8oU\|nn͍nPݝ!A#aMD뭧O/y|܁J0>M 4o >+@/۬ppsw>~_#UGj4t;=Ƈq0AT_. |{^qp?״.j9/ߪVAes j}}n>+cGz,yqmH\Xt 1 37p-gZԿ轣lByT&JuxocƟS}|3-= ʿEq2cvη7\>^OHs[K'璯:ѥUHKU6>zKHȳ.yo}q_%]l+8wL_qG*>xg)Ft/WC5VN(|5|Koa f>&Wf>dPG$Y(F-*z1/?Qob}DMux<9IL]>Zϡa\tqϕP}=fvS9((m.ɫ>;{4^UA/4Q{,+bS] [{v(Nf w6~ss `Guc 9[oԇD^N{44Zpz6"5 1xisY%C;feϳ3oIgOEA?('*FN{}42Szi~R<9%_V^2R73mU9{S渾,xLgz z'x΄Rt&Wܷ nқ{C;ori?vCԏ&?C7݉:|sO+tZ]7&uuեA71_sw?1;Whj )jGQOR؃lh9OTK~,%V"7mj /uP=k݄Ofl7CMG9:]2QfQ'[w.us]wQQxE*]7r-xhR-`=k)3jaNJ%7Bzh*ρǞdyKI0Ls v_|Ni{O~>[ 2xTmͳT'ލot>9|TTDi~YǮYBMԏg6^zzw;{;!s.ҖޞӾzDuIQ2Lg5 ]jm&4)9h?9jnLsRg4WJo0 RtrG?g_c7ȶà:nb 1J4%QpS]{F#M G?z'dU;3K4ύnLE5+$ CLGWOTit 1earM)!NJct=mxs <6mq둙3阳gk5ݷ}!{.BGNiLGkPQ}ԙ{%՗n؃3$L?ٚz+y@7.5bZe9 9&qhܛ:Rpf|i)FMAIWc޵0Α?0CsѵMQo '*NHn%"ʿCGάkIpϡT/FyOj*}!S5諿lRzR~<y1:m=lBXsbyP)]O4O5 Xe(,S5NrI`O}hhcb55 6cdGәTҠ޹XJ t﷟{'ϯNYx׵:1C] C{|Cַ0i+PzKiG`_w ^-/#9)nӜ5%8/ez>%ay3(>FO20COAQrϣ?LBOГFʯ[iXU9j%NGvivӃ˩s_e1/y=f9[~]y?S&G|:2t6ƝAiee ]E(/M/3W}%/tq}c6v :WۃTv;˲>a\}'}&fْځ~Sƭgr4o=stǛ/Di(d\R?7}|Fˋ{ԸTt(;i}o~b5ev7i믥{j䏓}9hv?Ox>iXZz'2x5M}Ӗ:k:N=yYu櫮U>]e'|n\]9:B: ȔӻХ1{N :}9!+oά^a:ʈ}a \x uO,x>{EGĪas1mb|̣=tJ=p]K䗉7T &{C:IQ\D[jLvAgce 6#ݻy 沁G[*jy үe%c\T]\x-ZU^]~9s/轮AΛuV+토Q5=~s4E:7bxc)oZN ^ƪw?pe}=}Cl<%wJoBzƇۚϡ;_g o-bh}jVs[;\QlC;Qiʟ>OB/ E}m?olNz:x;?tʘOsޒ#d;C46&(@wfcG B0ŵAwysY&J:6GhnR^H9(œʌAJG aJ[1=J]rFBO%+-w\~=q-j>YR_l=y;M,4N>Ad7?lhה{J0x?٥bW΀,on%ޡmA܍t9{峤h4>]! }}O5q%%}òvtK^6C6mҌ_ç,i?r$3ihU;YDqn^,µ3){P(y4LvLVȣMziO)3 >ǜWKά{Xst47LqЬOu3l VU1/'v؄+ݽnlԟ{N?Y"]Y}W}Y"%dWងkKosѸ#RT~(Bz e]{ ?TѠfB Gx[3ʻoOVCw5uoH -_#:Uqb4NvW^3-47ϑ35~iO|}OCJZ QfP|E{{䇦'>t^d3Zl>u봞z4z|=]CuvgiNhXqkBs%. 4(mYݓ{aOǝE4f7I{A^ }} #v/c)VJм9pAY̕J;D1록'U9uwpȄw6.n$D}1oTcD~k14F:x싲t ɡKd6g;6]/}ڒ_NM%yvy!}=&!guO Ә3t8~N7&R[f\P&{B?-6RmK/k c(Bs][V)glS_9kڇ:y'Ӥ{WIh+/w R(zCc%g*&6I~Э/%~c xTmhGq;9C I\@(>;atS5(>P,2e?z">'0K~~Va I,{(Zw^s)Ѽ0~yhydsv>9xyg?*x(@Oq{QŞVI8ݿ)n;#S%[tЫ!. ׬z ?^HGIoQ;iNp4?ҒVϔ.ǀ9S<}3u_(zB.xۑ>JLOoVQo9553*'~ٜŠ\ ?q}tm'B}sTL*wqv['NUu}TϴRPs+0GIcLd ^z'^Yl ?Id`S'ϲm UσXdB'g~4_|9muֵdc ~oGl^O%O 7=43ML.c7]O8mVj --r ?tZ怖;a(ZCt~%eyH~|A_=]'o'r/n ?)l:-6Dq׽.ѓ%To{Nئ 97Ö>]/}nh`ر+ρ֔ uK0&Bfz[b@wOv_WVlO?2^? 39sԇǣ#m)'䫒]ۏ7}Ɏ6S^}9f?먿ά ;LmYY(ʕ}>`kgH~Z^&N bfm3XlJl91'Y1M!ؑۚ!bOeSwt ~VYϣjʅϗ:W-bz+5'wvQe|fǾ#4(`@-XT~Y}5xn"aNbh}[Di>iQ 钤Dғ L˷y/CoSu=af =$G{`[sS*Cọtm.7lЛ)3X:NLz6ޥ+0kzk%םX;ee\b53pkz!B1yжFu}vIwPƢr+# :N6@o>kQ;HњW6&YS|`FZғ;v쾳o>!], _N/CV;qlrzH,L7s+7T(eHk@maeu gr _er Qy =_ќwO&蠴nf9Wx7]iolޠ5j-oQwt5(n۫-o#;;_Jx혪*gDq<#ea$aW-C*({ӧ9S 1ҭO_P :(s:l2妦A.͗/i[Jj:'/,Cthlo)h7νz-4dާ6[V%\>'FG].?sqnWyU-o׋O+Bpnmto/,_::j).r8<^G}?@u~g'b?έs2m3^x~Oڇ̛n¹ߙ9aׅ6](f ˾so {ZE}9Kj2df |tϗmvGz|pn$ʯI>ﲚPw-k<بs/K춰Q)їQ9w k:1As\ď%fKڒrtKO\>U|ޯ؏:`t;?:~VI⼒Jw2v ^/oꤹŢ5w^w}o:缰7hkK)OyҾvn>Ϋ#|ʁc٦ ;/^еLϙ^:mZך{Y4]iZOnk7}Fq^^8og5Q,PHop6͏8?{[|.CEyYGCvbkmJo=qS, ve/xP?hx~{Ner]S8p$Χ[,I{{(dܻe@:\˛׎zvfp, }vQs鷍8iY{ Ա%_DF'߇̊[`טK;tcZ:/ryd)IЮy{ChfGPr 7q"i5 R&K#I|LѽEO";=ǟEo韷bv:fig}Uw+{ ;Ҟ0pqɾA+烹ul)IswZ?,Nj 52|~?M4u'|1vl3Ց΋ lӃ4u噷mv^XR&M̰دB|K+>'L/=+$`]T7GRHA{~Py޸ҾՖ];1r/r=Y?ɡU!]eG4O41??' {Mg*SJz'Z~3ˏK94/'3g %-.50h=%?'?[jh:~E9.8y&x[|_z(q7vKփzkLLC١`Ǯs`/ۏw]\_]_l0|'WK}j,JOb9j- 4X4|Uw7 #Xv>00L6I|?T:EdF#@;iu(gmOE <MNf13|5xbxQ ltTn{?µ\TRQpbf WAQ'{ ́Ϳ ZROೊ|XsmJ&!"=6T`&^1[u?ʗVba@nJ婹 I5kMq~(u׿H50E|wQO{{ŸgNOùxI͌Z Z=}qk{vg X}2}Xbz9sx y<8[z2cv75.g#EW4!93^jM.\v^ۃ8?cvtګ>2}IXvtU{&W<{:{{RYU;B6k鞬M`)֞K='W x.:e] Ztmc>{Ty2=KUgLQ4[ V%.p^k-pyd1n n_{\_~Gn/]F~lw4~o{ؿ}ׁlƷwsR9 z03xt7?|QGxT^WjSiVv#u4ca46-ӫD=uOOUSĉz,IOC7{*\W#u.Eյv{ss#tS|@9.+~ vrlg:XDUÁ裪kd2EQ?Un>TٽPVD?Z1 %ubkU/0; *Cne#"/VyVsn2Y7}je5 K.c|%#QNv=}L:-  v|CH젰&1a5렢 pQԏDљ傰_&^s !q"#|M%ϣ="MU>> ]>'"l|TbKb(DR% :絵ωq3rzŧO$(d|ck~;UmC_?st}ץ;AVgDQ}`OӷN"!0?s=_L79 yQF=drw=[@sL>* $[yZʇ7nWނvfwA- M$xp^mȐ8'Ā<k~pKgSZ_1>-^X0/w~fh&v=>quZ<<UM Z;jA-ALf9(ƛtq 'vN v˵~2~,A|l L\^~DwPז/`0&,Tu3eKu8w>zW2dW;kӍ@|guN^i:M>ձ/+N;/ >:]ò\` ]5m-^W[VT]ٵ Gc k-ZæٝHP Tnh%|&y,Ċ,FkI]Ԗ)~A~l2V߆`57'Y^>.|rf(ֲ ~,?szw*O]&*߱{)렂eХJ_ܧF?PC%-Ne>; /$NQoA9Щ@D#c{ ?è7.pmy^gl9l 7b <zMeq=N\C$Ľz:?0jxU 2.w<}qz^OhPêNHy'}7`K>y튩c-;5xG7WV 6@5Hݽ F3cuV"ȋw /*Q/.f=//A_Zp߱d:2E  CS=< 8 iy_H|Vy!$ ^~WF'siTpݐ]JQ8(u&u6(u2qv3`/&kW;}1F];q"nuP:ԓc# P74D𝽫}t?}K^#V__}KDQw|e}SsjvW,x-Ei8͑ GߵmƠ͏Eoz.[{Z}߭RVp0n[Bf <ĉ[7/S]Ľ> s0/m8s~uS]Et9uݍ/:zڵ uaĿ2YAī|ϮWvע~ ;{ ܶډnhvVg@[E#(6` !v3 "N8\|:~-:XŌ/xt|=~×րG|6?z@8껖>:V?*p~GV7O_#G܅QC>c ҹႸ"A>km+z-{M(|W{!xWo|K!_xc۶E69Vu}F?$ZՎbޱ\ kE~X1 x:~ig1ZƏzgf([)+!>0YiA'+r]9P"^s<MJ.Y=%[v]S:MYWMFYvqo 8I`0[D΅&Wl&!w30gx βj8ib|1ꉉFA7Iyi"Ƽvp_Wec4YoSӦ}n\0xMן|1 }]/;BWM?TQwg,z2(:#u6FE]YtX1Gl2Bk[nbA?Ү0XEFs~ȃO+wÜr} `[=!PIJ3aJ>G@/]eWڱ&C+1/ C]Q J\:_:2wN* 'T8HexW*+E>NHTs7k1+>+3+NCe֍(K>K>GUϢqn: ӢTQ7D,J0o4@^|I^E|7.Dn7ΉDZ;:%1.-bua9꾈ừ$RDv#:=PE8$`pggC _ewya[E}/lj+nT7 {H Nl_WQW7(<(|8(;w9ѷxw\ݲ4]x>|UԔ1?/yVoEy'0_9v}ysUyQs'P?y;"y7Cy<%7UWNcY}G!ZGƠwk߾${q^ZG}3y} 7;Ho}dA ׈7nQ܏5#)^]ƣ͘adyEFEeQ^Ÿ|v؁HSFfd3g ̇ ^af1RK"4Ծ_b42fa?b}\O\]&io3VnW _$K [10<[Osb@JL$R{ Xi <3 ޛ^Vظah ~IX0o$&5^}FYt@@Yᓂ'ڼw@YP87@d䤺8Of#jQ~0@Lo^ <$D.i!}寠(!P>r`-(gnrۧQ ֚zZPvܿz׋}?Fנe4hy_qQ4I'Pgω m?Xm ,Y|*2;扸/ˁe%UZCbЧ,y+[RI^]q+!Ub"cZkmO8r=؞"~oG G޼-أx}uQLxu*ކ^SA'uf/pMԟt[9[s3Ϳo&;oGoF?xb{m?[_tRXV>F\^1ƹ_yG};^ݸ pU Aݳ u:}<ߩ?Q 5$12+y_tȿ)Oeo~ 7ZF+p UV%|%AUv+YpIoC_>Ruu2xԯG 2΀͞`J/@?,@]Tl@/xy-CyBoÍ/A =ԓJs//D1k*V}֟`- 'Fh̑>D}%D3zV3ìlRY/Y,ϬO[h vh;-_p-?_?8= 4'wYw_=$_ߝvC;;3uoT?TJj[DWw8>wBZH^bmGw}_h$Y^<ľxk}#yA}/y;8 J~5[wONx ͩ׳+8*;pMuB{z2za;ՅHW\#) IYț Wׄ`p:4ߕ ;C_11JV Ama%? ߧ0_E+y|[5x[>-9|&yl}P zfx W>:/U^C;q|J*y\:um#NqC}9YӀyŝ8ɗG~Y" XPN^aG ώ:z+椳:p=iO1pQ{#퍑n_d~aᄐsGü|)؛ly%xc^gkhs&>o7|>;>vLVosQ[`c먗p[|oH,̩oO8^D̃Vg1oyA?5ǐ޲No [7մzMc>GjH Ve=n^SY^)+1 ؋f >&^F;x`)摃Cw4.fσ;M߀GП.G=ȷ} hh#na?P; qy@na^[ī8@}OQ#Ŋm3t:Mqu`IqXQvb?_56s!-2ujE^=!]U1a_ r}A}2qyd{EZv;\MP_,Lhbpb V'^[ԑ d/1_5+e6,rƼgn l4{~I?Sc嚰ݣ#rEзFq_Fk_<ޏx4:qtA|Y|C^ua^4R.ݷH0}XKvh!̻\eΡO׺<1|1u0*uܘK9}ȉ`"gڽ">n3_5j;p5֊^wεiN_˸ uX=sfWOo)."a86M`m̟5C ?]ɴ4{ƐjFv-`ue-ܥx55ĩr}N\4u7xr6\O@]/K?U#8)ʻOaP<^xW6Xx"e:^¶2G14):Z9Ufg:O1oS엩Jɓ0W)][ ;X8SES2yg2X1%-G#nCT] Ì#Z IKQOp\+=ă%ݻ"y }Y|.(=FN|Nz_̙{#C/iw>5F;i {Є9GZOeꆴ`I2i6AFNjlC=$|RTVYTV-TBJ86sԩяJ9*`>·Jmwþ&Qy)p- ZraJY* @5./!Y{B%q~!Qs;x__ ?c[Xly|~0e'|a̋ ] wo' f'/N-T1>P*B[س2F^+loRk5тa|ns`z s7zw c'\sW7׽K`'ul\:['.-fk.O\<\WpmDp- /\B5PrN$ {4Ophw>n nQu}<+ڟR[7Af>}\o`a<ؒ' |c a+LZE0S4c0K )jn\=ga卌AM@۵WI%㡌8wój;fm]UQ/ʁs޵ k Ț=ul_/⬵#|&V L{G߀I.um@_pUڬ)1޿V%sw^P<` z2, hTF|Mmk ZrsW [o> Z"N $>LrKo7$p٘g{ݱgo_Acˆ]A71.y) _xmXp~j`Q>H=ނ5uﷻ>_~B^ LYx"P @^afY ]h.~]=g rC^rF>|6h?L@~/>̈qY2u03 s sqAͲx#]9 yE 0iϹ*><]7R#o>X α Ig=r*(=8? N[V#?~z}};Y|P%{>F?>s׀L~^ Gc;AÇ_e/eO9^}ء|;:K+|1Tdw~r%Y/#J_r¯g_Q?K߳ن/DQJ<]"KC\'.v\s4Ԓq*&3/ŅmA?kԕ%_8ow{PwKwY% Jwyo['A ={%Ҝ<#Pux;pQx<ĵyNӇA{Vjs숏]oS{}`oP/bÂ\H_l4U3X'y,>S#_x9EÿyVjԟFȡ?Wq@˝1d9r{/:6~Qʾ%[lZ^[)sc\?V5s;ɩyYu2ܡzd[fdf~y[d.xexz<tf}*T$)f*/?M ݋s+}^댋mP2 ?'nA~$m@JX[&üx?xx6P ơ$:1BMg"U%gK~3ˈxwȿ b?п":9Ap/')j}&¨^̇>bm>1oJ@!+1|gyR#ָsr8gxnJ}xڦk~~3v7A"[T!{_ᖏ*ѧ 1OIAp!M\}٪qU0,ԽaUv.Kfyu̷WoG<( BS[q+0D.s0?ގ9sV=\C݇9eYnݻw.mK&Ν-Z?*EWjk.'j=3g/yįƌ95ZJ/j>Sgz8Ӝ7Sx5s9iWռZعHK ֮lGGם$]Q/vG}s}~1et{.vn`%.]:vrAKۮ&n_Y׶a-Vq|gM?Wn^ub=q xH%N[䱭IٿTlWY.PVа{-c1,`{--6/ʃ'6xaUg>nh+v;6!#'l*jN@k0q6zx.ca sr/fa#Rzj<~f>*}߼}/?c7 <*]oL"$ka4Nn>C1܃~l en177|f9|d3/C7_x3g݅yc˄p {K[-?CQ7|Tf˫n'#'m'wd0o9r5qUeWY[̔,1lѽe*l?Hm-& :_f^ZAo,fF3.kQn6c5d}c-=vj33Cj>CYdž+8Q  6?F0dqfFB}0hME}Aq`m9JO'Fu [ 1?~kr67XW ]{o ؄wu;0U#7E"I[QRG?yIՄzO` =ӏ;=Zj zks2cOWc¾/:<þϠԋzb{ ^mE)Ϋ?񨗻u+BzqF0El߄]z }_ûl `7 #46FjlE=XЇECm3ف꣇ݧ1w}HJ]}LHv?Փ\~YK[ mE=fVC]wuURqNui ~CVg6ȇE(?soDV{愹RLuKZ·sԮh?FV 5sa f}5j j?ǩwǟwk5=S/F wk>+D^) G[ uݼ v޸ތyA(6yM-`XRE2@qsE.̇lLG:6w IĻV\vWdB+2cPhy}[:G"ċBݸ#$ءTjb gv`SmD(XUU\BA v((waP< ɣq+?:}Se z3tXx @~?qvR~!)"1^ď{=ħc2?o uk9>,},\5U7Q*#^%C0I6EO`.{udyLKbEd<#yeUH#O%kbQY $7I o%JJ |&~d>$=#jGZu""Q s{OS?K. ?$>V_Q MP$B`1|z.ݸ]F9SB&#1/! c<#>ph-ToNOBooFb.Ͻ o{+1gNaNwDw0 ;010CWUYU|' {w,Qϋ[Y0 on|"( oj\N+fmS`BBZ .B.@r!A%!u๐@(+]^;C? hoCPb$@_Iˠ \ȋ-y< *fn  {ՂL% nG^p ԛ/}NiSwZ{D|+`1̕ 2%{v#l:z{%?J 'L")ZE<?ށ(!4.f3c٭0ZcWف}{W[96C.\ǡW::qN@|s0psNyv؛`.ae ?a`3f0_vsJCvo@K7wƜnnص_+#py0ײ3@SZЙY,ײ\QQٞg|@:eX8dϏϣ؂7!_<~`d۫lVxkӨQݱ+qZa/V7(Syx 7A @#m' lFP~E>yɏSs /`S(XIKnzSKOMS~O@h:,24Qn5? @ p9i? '.qkoƟ.s:5x_'^|<f/o} Fhn"W$W/ !=M`|iBTZ zԯ~ ָs70(_ v/S BuĿob-8Us5q=n,qDɃϜo8Fz|N}',=sc?ZOӜg{@g@l_,w`w/WY7pg)`:,Ms$_5B2ހr6T|ȕA\6M~ n\ oZ6qWӚw㈇&58ߟiOo1|p5cR(]x8鑄 сo1 V?\K;o$_/CY;@5ڲ^?jTwۅ<_'^,};6 [ok0A^|+͕90̷8 w[D[Z l~AAWA}0hTʄ^X _VC|zU5ZDɠnU5-CVUȋ7JUqe8gR[Y q87|j~Lcsgz?<,gAs_8ӳUgi ѫ dyo B?i`lf2a/N+cx\xwK%cz* w!lԵt1|? u&]5 u=}rP&d_LLB]IZ}"1N{=nwC_ݠ ]oX +~'@%uw@ ~RݜWCepqt{㻈۫ܶKPo @߽ 5>qv##a!ؠӭv'׿Hh uꦑ&.+Uq[J/~W WYEGרx}ԏ`wTU U‡FeנDw&6Uh"H@Y{l TTK!6P(R4HPD`g"RqO8s{^ߵ^Z~ٻϡ6sq]M[]Hasbwcy3~S*_{WuUb?Wbֱweu3c3w}j1Nt}];%6Oz⷇i~v<bQDe.2?nr캐qgbyyb1Wf:\;g?;ˏ3/ƿ+="we51>u^yqccO;O|'QR(E)JQR(E)JQR(E)JQR(E)JQR(E)JQRӁY!JQR(E)JQR(E)JQR(E)JEHߑ.EKVp~Nb)=ɂS{N=Ew.jvQReOCIm=%]tKZv+iUgOףϞ.Im=]ޒN{%%OtJZty<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣdyiLݸ?V羽*_Zm{¯K_~{vf=poӪU:.xg |~T_v?4g<ּ'cy>z"?䊵 W}ev˴ǛSh#'l ڊM:e~cWGYKoR9vY7qvk6vOoqZG=ׯ{QwOo=6qh3%NRe{w{{UY:ʷ?w<a~U^twy)]Ia`}+pcO|h;>C}֯-SslgWW^L T~uTs>u|c>Ou\q3 _ms;~k߯s~n籞{w{m蒺A[/.77͚Stk Xkͽ/c^sד*O_OkM5:_6yۣikx6/8rގ>Wy_k"9 ԉ/~)?t9a9_ft8~Ԕ:+g>^'3n&z`ߠ0ּ1vsB. }Q3YA;^w_x~6I+Rxxvɹz֪+G>r'\\c~u?~vcJ^3qqvuxfFЎgro^]s͓RCL>N:ϩ\<#<~^݅n?}Ϝxyy՘G=y؉)pJyLp~/T~F.u͌χשJ*S==Me&}qҭͮ|g*=8~WG{1djΤc o;7i7;vJ8o\TNl>3 %֝2OÅu_r;GWo/ݼaO|y7ur0'm)~2ppq_^~ç>s9:3S_zmƽ?Ԕ=wjl>s^'\67dLl3UoGA~8?zyC~9jgw{EӮGgGY7NAqZW]'/9w)g1`tv⇦OZߍ}{Orc`!ůSvnGk{m>5]~h}ׯH<1/n9'-U׭_Y՞HO9jjQo zM΃>YϘ~߼ܭOO:OKZb]gN}˗nvݙvاJl՗E'_z4b`SyIgb=}zxݻ[:活 ׁmܰ~ĺJaK/pd|jjGA}RsH;<`}F^p}C7#zr[2>my{n}\OXWyQjZ}yp}p}FЏ_3ۧW*/9z4ox3㱿߷GH;rO y~cp,VӃC:e=Ob};=z*>RGp\X~fye&>9SտK#Rrg@'7_ΌCwPm]'|\!rOS~bAwҵ4_2v3z[d2.YDŽvXM?ȋפc'0ˑ4nUp@xs/~Cz~Cb>_)W~v#>DҾ?zz.p<4XoPqGT[pH0N~Iit F\p?BTӂ9:}ūͻY͟-Oui~'.uNR|#y4OM/׭8Y_9o'O2F1k`9OroqG8s|S)XuzOnz -8K/]\V鬼?lNUƤoIڧI_o|=S&~ z%ÂwxMaңzAӯ_/ܤO/-KYWv诇41};Išzod>_Wȃd_qW̸~FP߻QOz_wAMV;K~W3_-;ᝠw[__;M<=pطvIޗO'n4dy>Th =>8k2wP˰g&^úWhy=_:s~)nYnSǠy >Lf:t;է]KgZhҋ5^}2o}\}V}ĸOǿvk4y'oZ2oG:nMp,_s3wlo;O:p:rOX ͛#W1_1}m\~˘jp]AӌW<~?c2TʾX}w2ޓyg]=˽u[ Y6qJu7]63u?&ߐ?&SսZҰmsճKy}3ݟK'kzdf=_?JW~}ƺNU_MN/ o|ua#k@~=, A97Ue-5)87XAPa?yA=X3ආfϵf3o͘~zON{2#/R%ߓ=:}Tb]27UדdGe73𺰼ق&'@U]/y>{{Pwk実m mk^6qYw =\Q_\⇏K;N9SI>n{ ȗ^ºGt0<W-#QxY6 Lv\Iww\NyD}Megk{E5z=pgu'7Kpc}o7=R߂}"'?NxΙG"urfFRѕcb{7MJ޹jubթM덅!X{ِ cҚt5X3__nWy_߫FT7TK7\߬C9K\2O>1|]G_sЅSFo4[6dūG;𺱺WC<8E8Nϭh+A1c m:e9A.)uO7eQE,\ry^,? ?w?o;L>}z|,q'lyM /Cůē}xsϭVn˼boTo`8e~q}Ž*ُ:e|m΅uipKV)ǫz@߀5~֭uk`<]39Xä ڗߘGnq L]R=&Ms,rYeŀ7\tK{n=d| }нv=畭cjgza¨_Ԗ z-Xgw_q}bk`:cXnwF8뙕;.}uϗ˖7nq.k_ۯJ7.riȸϯ!]R(NY$uL,nHoV7w&hgnX}{n~7௶jViu㷚Rׂc t?J&>|>eS>]sb"e]v>?_gl4|Ҍѵ _,p?_~ٲuzA__1󒹤~Ūn_zf+r췇U"/tM_[dkR-/o(> cz]߯OR41yo{p9 VU;pw/:oM~)>d;KEi:_Oy/1~yctΨ-/9A90SrYV=(_6%R7\@~>kj_xtIk ;mZ\A~V1 j_zቷ'w yZ9{;v?){5%R:9\}?+WuUkǺ{`}xػ_\vuioynA?M1>}?e~]8ksf n˃cC8YCej-/11?'1.{(܇~Zô`}pi3{>w6ΰW K9My鵶ǩ}c[ǹ*\/~cej?.=%H'+8*'_H{btY_mA+Ӽ?˼kW= 5}80r^㏏=^%wJx$?WssOz,\^k_FO|~f *xeu{y`ǟ:hӂc:Uۧϫ?1s8oxݽurާϸs[)Ub@wuLxzqϥC{%+|ոß/_h9샽o{?e? 6MN!O|OgMg*ߗx,ߊKv~IuAp$|Cy9gWy Uwl>ymo>~~y{8}Y{swҶ>>澾c%gg4g4];A=4kT!KGI,e#}G+Yz{.8}ˢ ٷ>n"N#$~I}˴ubެs'7| _HL^9M~|&Ͳq{1~g21`Լ ר-9|@Ͽx|[o Ixx|OC^s=Iqӛ -i.J{E?v#q^yM^zyd!z_G?GkY':O~>-Hc;sK{܏Ͽ绒Y~Oʳ88޹'|~s^zz_S{Y?_ѳzjzvي_A)붴Ue:̹qsz~yUVSu^rs sgyٓ3޷bκ~?ӚL{1K=_q~W/}}YRS󉙞oǦܼtnoz̔bt=}!#̼GXY:繉Mr?]?4;|A'6'^e1gseוFrygyܳ]qC9>2*>NEc9tJ= Ӷk~]̫~>vzC3~̓uL|^5٪+UkwM ҭSeb3|>0i#_L^V>if;n'wv>[~׏D?IiL-yjyeu%9ٮƌ+Ns}θ?{H>tKI_lR,xtURAxYA[?QXϤ]ѰyQ?yL?4/~mcwzz&W=޲]߅M\_|< %Iކoz|帎HGz.1}/}Kw~꿾>uﱧ|T?n_O>/ze${=pe_!w<:>oOG>#{>A\uy=mS P%K )>>g(WJ>Z$?9OOH7y{yy{JtU=^AML6{w|OkOOgQxE-_}:Už꘻E=殎]\Υx%-?-KI,ϞQJVYJ+LyɲDS))e%,{ 22r;d2r1Zr쮲d.;$h(O6cm6e'˓\L)JYr)Oe*I)jY s+neU\Te+*ie+|>˗\l>Wޮ˚˘)Lu\f[P *oI)srzXR_>{ZOԩ$\㊻^%]/եԞ.[JYKjJbW^ѫ2kAOwh!xW>/Fߖ27*ŝ9Vy>@&:>x={!zWQ7KoW˭[˴Ll,AyڒMrl'Ort˽ln.ɟ{eql뻫TAQ1ӝ]kWv/]\XS̖On.Â[f M_/rvWrʜ<溤Kl괫s^x-¾ nsMYeUaʘ!ʒkW<)0'];t̢']5FqrKٖ)WQYP9OO2'S [t$] *O6u*$ٴcQ˓w}(eIׇ-vΦ-Zwvw9r*G(J(LYlXMt=*j ˣrt,>^AmV2mQ6ҷkr%^O=q܆m1)}ׁb\e_y5=u_?[`w:A\Ρu|+=~}ϠB}ߨuu7h@.v]D.#oP`A3$>#?=!ĥB Lh|3~~t>\q}to)Gn8׵iYVA. ' y T{xLiC~4!?~r%/BEuw`1݈WH*~380cP臟}wcq } Ǯ^M@? ;G"򞈼uF6u_P/<#N ˎ|;qCH S;^;b=~ux6WG;%`}t{{&#]7;R xّ; $v.qułzF}=ގ:N;?-XD#wD]8Aۆ8D{ -u"휘o͸?fu>?mc 0gϊNǕr[C.Abd-7<.s9{N <3Qq E.l`] ;o#h>( Qhu; HH[#-H"Inl_ɮ`u0]KqpJ]W/i!%'gqǧrP$L >XOtncݔAo'b].@ȏA Hc(ӟG#*{AX? Ox+g%n"0~\67V3,1㤸U9X1A. ~dR;`y*!`uSXɰ3Q3`o 3aOT̀?0>z)}MyX? }G~ΧJ)߿x~@BzNR!=w !CFu3XKxQåut3ϱR(c14*ηŨ祻Hp~B4S/i`| |2江s9{:G?䥺񉰿Bر#gGSHS/ⴂ?p٪M+{@n"\{?b|nKϒ%Y!/7y\;`<ĵbơ)._;c9>K ̓οL_3,)㙵}JF3spdJ9Jϵ|o|j}Rfa~LB3B>J.3PE r ? r3G<@]-(#z^Qf }$η1ۧRӕa6}3/E}3ϼ1,n{d㽙 ʶ2#^3=Ĭ#[>Y›??ق^3M?ҟTI),[7潲OJf/{ȵ{v/-RR%YBf7/Yonl*UY/BF#Ù5`uYWcĸ96cf-IN;Yѱ>z/]gV_:̢Ue#VhzC9lef5Y]b f[\?7{pmq%yzGSRo~gf\4/df2 ,qxwy^- QGx>h܄u}#-{b%Q/ޝ"yp8Duz-k̰/m>Mu6-Xf0kڄ-U̼ =ڬdYW~i߲N˼`UEo4ar,;ˆ23}=Ϋb6s^["[ُ:zWL>62zfz,ywuU^bb"Qwpb.gAm|T%}Y:,M;Bz'cvF mOFB']7"QԼ61i%oוLh?2cvSV-R9ly]8SvLZa̋8 ҟR>Es꩑^5+R/=zC/)_^{x󻳇*5)ZD9ƺ&(;skV(;|ʁ[Vm]|9KJƜ~v9nj (n4#Uc׬W>zi*V@+O/lT>n#*描T/5O)z^9iS U#{gjWN|lxk+vo,sAzpe7-f}_&~S6jgaOg*B v|0rR]2+a!UVZ99BD¯$Cʄ"=6cƇ\!ޟG\>J%-HW-{lqO]o>K-@^Ч8ӽW86w; r #:zAH߻\߅f}= '<ݣ}EGt;^_ dGS7=1WC.S<{KzEV>ŵ[S~ ~+޵%鞽()4n{tm!$-NI=3ŃL$:G&~T0ia=ŋsX'Aܴo.ZO@twa_)/孉T&Ar~R|lT'>~GA|9"aszb=~/㯀 rrV$~԰S!R=+/ m2J ֍[Զ6u67}#^ϘE|FuFki3WCXcI>A73ބf/_ߌ>x<.Xw‡@d1> ˲=6lh{W9G-ՔL+ZEkhSS0{L}Ŋ4ߏ8=h~xu;8 ~ E)TgfoH7}t3I7E_ eH7lא~q@7?,ܸU,`j9)L\7%/J _{ {K7~)/Z. >t:?,z=9I1R]~' ؛qC9YNiheef! 0ljOϝE%sK@. =qrHqAnPCyO4j/RT0/+[pRE 75F2Y Ze-h9E%ZnJ-h      pppBShv N)4;f;Sp8KpKpKpKpKp[p[p[p[p[hNrIB.IzGzGzG}yG2q$r Htk{Iœ$aN%°daX0,Y, KN ZӮ55{Zӥ5Zӣ55D"QH(5D"QH(NV[f f]kv®Q5 F(Csȡ9464}4h684S[Ԗ95bFԈSpPhn46\Kcsil.ͥ4670;$Ӹg#ÍCsp/data/Rlogo.rda0000644000176200001440000005411012577541412013370 0ustar liggesuserst ==9 bc` H ()tҵ4H))ݠ`J5;^| zffgC/;۝==gocUYf?:W ' x/[^\"h>ߩ;x/gex ދp>?|8cu4wUlm-16Z>=v>/Bp}Dp7")Pl}[Z[+ckYl-57f!kI555ִZlw'ON=V 0R9mDCV=%89E5?ʁ1]4T{qXSy[}3% G~*ɍ]“O@Գ=y)^90XYa-g}Ng|/gk 7lMDvLM7_^w [b+ {9 &!eyvE Ϣ!ţ|7GoxF_ B' Mr=~!N̺V[b#w\{;|h6eL[w;Kj[ b+f *flUrU>ʰJ9Uڱ^ln(hfml#GBlhg7n'6ȋOvߟ@G5ӄs㚏9aGU-^cz8[wuGl[-<9?u/)[Vz>* 1am{KprG4Q@(NL _ʁ~ gMnQY#M/B}>r9ű;ok\Il]䬫c:`w*o71rkA31z2]OxZ8>Lj2Π.ur]Tb:r׾Bv,>G{Eedj9p;rz x,^#s׳-*pYAmDm Y+~zȡ˛bzq+ANy S^ܙnk]_'nm|xNԁ.*Ȓy`7k0ʹU2p5tww._XmP)ʂndŀK \rdSsc';y-EgȲkhj" lJb7UG'ڇFGЫbocoGK\!d&袔Yt/;x ygCf:~:>zn+dst &Bdbб;x.a-֟ɲG<毚)1ɰG=NsoZp5Cb\ٜBdH i҂2q噜:d*(Ks|oKUpfT;k] Dop8hmʲ/$_tNlijULG&1- i 4~{<4_«-'=TA-&( _~]$ر?K;IFuxUsmB-fpOz#Ր7kCaa)[,=:uIQ]9bl)N/2ߕ<5&gį\r S#;f+5q'qՐUC!) } (1]`:$slOʃgё KG2)6BmΜI}k2or6OO1!8ЇLB~w5 ~֑XmEXfY]' }B/^؃4xÇU͖8֜M|޾ m/Njy6쥼v8Htd` g[:N%r )ݠ1EsVBa\b{o'$ֻoyx(`|`w]gG/6k-~;g// [2<~8՞nZzf}8 >^.g| O5}#a)>:xg^{'[xq`J+]p;4db 7Я)p#_%v^oLgHuɇ9װ'vq:0iB'-x{=>_~x9=R>:G'~'-[>y==$~~~X ZWH @`b3C\NB|ZWBϑNx0WsY7?{g`z[h@|fu]S?D`ig7 v@Z]>D#tIc^KF?2@:ZC}&ÕokDho@ v7bZ-= .9,`?#,63X@E8r]-F'R x]D8Mtȏ_xg+~jһ^ďGg |^#GXz +/Ft^_nF٦ɻs]"{zA}c8Ѕ[Z|q !a9!0ʙ4Ŏ)Ppnd^M#i.pԑwumRSe< < LweԳis m 1EW^m}OJ6un/~bk ɓkKAxW;ѡC׸~ :1.ǽı։(Ol;xf/ 8:\䗟u;7/d S:#7z7r>thyӀ(pʠGr+zx0&01àW}MS$85>ϱ§c}}[>"W+ WYVӰZx0+Pxivդ'>qh" ֏ tTl_=/bUc[\$h'$p40yty ܈l]mUf^^K]/塅W62{_[^ S8G+GnYkվ@uӻ9w(asNY=1 ҃![r{Jky$m*jd'c?<rBNbg7“"<ȴf߄A~UG9ߪ pNd*%l2:"qjW=:p[5,"f-Y!^W F k~&r.]5L9o!SEG)˹FVhdv?[itNy ]9W绺 2Y'tہ;R|;8\_HщSCH$|W,>[M7xՀX8`|oyyOno/G `30L/+-9bף']rRp >N="ߗp^~Kct)[Mee-#{"SNJ]-DH:}YU'';:S|*%y]8Okά:HlDpAM#ŝ~;ՅV(y{ȑAЎ&.K=6bs'Z(0[DL6.v9"5ASZ9y(8:"9ã.wlkkxS? pi%qm%75`rys%<8|&6w-(sfi=c/e%v>ӓN^W׵֊=7k1㺋߽m9%j{0LN.#w7MibC帏7cVlF |jjx^=rr"*>!:t:* \£<RFyZ9Y`Ԛ3\I$Q|)>QIԬ7sR?RXpK~]dH3p!xYx'0Ņ,ѡ3I 9t1R\7|+ӫŁI9.O;/;~ X ͘<2Mh Wy72=r=1=6&/x)2^j~e3IF`l9ѧ[7#~K 2Eε x-?<*|I²]f|3Ne.Z:gqjܣP*-q+wO/Y.u9R.迨BzgOeG7?9\C7[ c[j ]Cy._y0bs ͵A+`ao' 0< 5g˰OтAk#W#. '_tI'L'ѐ|0swr f:? \;~~N^sv^/yI 'Fi\ɓ9]>ɣr0Q<]"zt~q f ˌN ◍x8=JCe fOð_M'w7>S_'$~)vN<^I"qbqo=rʐ7S*$Lᇞs>+`.ؼdAL !Srv`SZi q!laxEN ‫y\<}ܳI?5bDzlNTX߀ ׉kK3yq} 6t Lycݯ~=jŵ^{V879`NEXrJRc0Zqk1X|f1 u/bm\k@m`>ksk!a z#>6wЗB|}C&4b3m*F`©陚q'Ϫpy`ȹpAw^3e=}[ yLc@6/u0'|3=Yea3׸`6*k`OHg0-{sCg0w\OȈS?{g0l/o񣯹 * . RgsIU\/[sbk.5ĭ9Bk<8{HnF3AZ؇-\\6$ӵs[,w3u6MW̟`J9^O9gn3.si~cOf.rz½zM-l1`6u*3[\07KdF'xoCb3x9!hfFܺ4G!7_߀>f0ODY+6::y{h3%$SQw3Y.oϒ\y`3o{V Xc^3O6kNxG=} :oId4Uwٌ2J/n)D9N5[8|RGVCRQ?Y4Fd; Ur_ٿOC^Z[wK}eXnaDީ!}bƇ\6E#MA;O˫![B#6{=,̇Y3y?vx}Ev; ;G]^Qoz#I\,q)$&ebsW/ \l| Zw3ro3+`~4/g2sضLgYvSޚ^G&`{qR vWz.|]a;+){NeҮ<_ wp+$eq[(-|C[K[w,\ |s$i19;Ț7 z(y^uBi|Ta3'W?y ` 3Y+~y`SdK<#]rL|c=c#kpV<&{J b`y7j}!C -jX2poZu!X&|3bƝ fRu;7{FV䭖<"gK"> BQF6|y OIl6!M32YdpwV?+u-^p ZAlWǦ zU(ي6_J HMwj3.K1^.'&A`U-uϯpAx#\0bIG6uA\ g#))׭.,_3{`;J'AeahW@#;9Fխ* vA^gWJ{Q5m+4bf`~7p?3/зO즋GL>r峥v/ĽLM8q^=9,y-E(BiS?|l,|+̕[=ٙ h2$KFے]0ߡWF>ᕈ܀0)n-$Bfعl:sC`&#*G4ya3śܕ{++|<34 &ݹIpC8= HpwsO`f逝.:Xd[ X޻,v:@ / l#.Dy^t u=⓽rwnD\x_T6`lgLFyFo%`?\e.ϧ=jt.?ף x0.=JrB|޹CK ^.p COF\v:ƣR!f0mŽ3pBNLNqd|[^)0<UG)XV|0mͷk}'"Dl_;lX`.llÞVJRxȣOxZ{IJ'Okr;|,;$O7{o3%FN|4ԟ<:i_WA=!/^y2ȃ^ySrbMokfLJ\hQz% Z|:鄿hʲ:f0χ:¿^oÎ>.&6s{tAЇ]9a2=]o)F *ֿC8f!d>=al}aǼ=ٜ De<|Qv:ш'[b“ C$r'"H:LV,#<+úp7N??b?΅͉{,'*O">g fރ]p>$,,tgX}깭vAO־.V0&lәL LIpd zɃ茵9G_dz2j-KtZHO|Inb蟗9KLNF~3-F==,\x-ya G'6cu/?@?6[]뻧aY,_q6d}[~pAt dI= q9yp܃I6p'f0wA^ [+՝ $Qtm@o{|8z7}e6̗7o5cט}3zHΝ$#7.趇wZЯ?9*:ryu,`41xB>νtTX:i/RdH{ $N"Js %gqZg 𩳀/y`X4;$){h } nmV0b:pI$ːf0k.[ l]#t&b3l6[}+`a X~@[/% ȵ| RU=yn66sb햚2ٲ}\0jKVk|vN!xo;"-Ȃ.mn0L-}V;-ܿGǙ\ u,lea~v'g3 t>+3UR𯛑ٷB//[- 1o'`Pt.3zmO3?3qOz*y V`3IVf߇]^f&}Yd C^܌Lͫ·7J~3vV"\0[7ŝ?c?6#1`u./4^E򤺹`s|lGɍ@4DHA,܃ͪ,OW6|_cy? џz8>I3Օk Gww17qܠx0'C,lmXտ?X̖~^}4)`SIsG?Ջ$K| ?`*dGW?5+%O?.6s7ilˣWr5 fś\x~+v@XӞXa"01?1L;x~,f r`({4}K"l̇0絀~.B:5ֽ葏@?/Z}$>}`oGca0Q: ּ=y V7^~,񀎒:|cǧCُ5$c F^\K,X ycpZ%.轺rh fփe2z޲C|:tg0 OGs0ApqtcBbz/?yr2~ z71{v孿h6IL9Ͻ<̳ؔQ' ^X]83{᣺] i&<撌FO7s7=|z]M ݾ=7Vj@7]fo`W-=_6y9gQ}4f0_oF0RJHnd` &rʁÏ×>⧼s+#H^\WXV2{k"tU$"p9`W~yt2 A {Fzq^.y!;[l6ş,? ݽM}C.wo3`3mb$lMɡ"9SbGͯ/o]33<W.~gl+~e`ߏ9tf0w,w/r`Lp9](l/W6WM?^O{ݦϕˁLX"r7HtJU>ӝKL59"]|M3>lˣ3]l]83FcOzײ_׃䒘ezaGG^~Rv,z͆a9oÐ+\У oE #>ַ ,1PQr8A_\r'`otYqy_g <^Fz}ƽDϐZS- 85֋^gKGEu?*{/w~):ƭ3޸?auGS[;A&/Ƀ5qNmOw{ ~.KozW{?9uYO7rlFy.wAf?aݟً}߶cW(ҎS\5׆8 {ek;z8 [ u)Y Y? lF_ W 79}OJ}g#!}$Nv:K0zhgy>K]RMڎ,>!Å( y7.wLy_`V=Fޤ{Yr캭vJuej$L ]B|oǽf}Hl.]n}Hmn.\Ǜl1_֐sg"ǙLY,&G=nul6zc=Sa?pqR#E$9RrQgŸ+mm͙Y6ctЅcW7AE, |^cC[= yCYV(9"f0k0lrau3]0wW[[ϐy.`}u{iUYT=?_߇g0|C~6̒|+T7(>lp0-4O<1^8^򖬖/Ϟ`~c'ޗ}3Ox~L}&N.7m*WvlIĿ.:n?KocܷM8Zī:3u[а>d\* }W繠wX􍷾Ig".kmֺ1(m.6[8 p`9ƒIg>I~+=L&vǤ2lTĝFfCkSy\#Θ}vZŷ ˝{J~ő^d=oz%zz%bW6{ԝ.23۝A[5Kb蟃Y]0k쏅y_낞q %em݄b{_g{9킙WKMl5o} A;]dגxLG9CvS;J.3٦jπ鹳W[Ss8O'%=߅ɶu1^6*."97I}. \"ہ7]0'Ӧ8zQ/r!5)y{Y u6d#]޻A;rN|s CK= Zb_y3|+5yx̕R1칽 zQfMASv l>mf̐,0X| E.-^R$3˝<:ۓB;}m6d]. >UکB6sY kl+Ȳ9Qgd➋JSqU5:;20Z*09&H\Sb=rd~Q*@}>-LBVM]]`)8G<٘Qaqɱk?Őyh*Xur$"S}=,ş=jX :$qQL; ]EKĈQc)o(<sAv9^k%<7=d .# 8:GY1m6htu>|3c}O͹ ^ߟ:n khu/m>q#A+4~/O`ȕlMwNcO+$8x$t8z܄o\лnZ1a{5b}.?c?_ۃ.wr.{mU{Gl7w`l5z䩖D_nx8ጳ$<i\w Kj@E/=o?I.ۧr5y.^,p_ 6Ʒ f8_#:ruU}$r*˳wov{*Kn q݃tf0<"'wAϳar5,Z<>1=ƿ) 7`ny_-~U/.0es<x77 |A,y`` fX?k pAa"g;.>Csw&Hl`ׅsn -r_ίx.T d:t~w)?";|8] `.h.r z /bV'y zCc5ݎ\(ua o]7jࠝN]z?fؐ:qgZ=[_}_!%~ߝ r6s6{#3rWAV#rC.fXʼnoO#3x,G,aL~aݐ֧0uw1ϫy -׭.ĉ&w?=:x\_;_1װs~-~nK LAu)T̵}_tG+y[~m1wLJA_jBǾp3͜0Oףk&? \߄TCFV~'x|o>5Kr "~s%SXN!l)k|Bo `?+V:+ǯ9sL&˸xdYpN*!|ᐗ}& < ulvkp .? ?ܩ] zLS&OCM9eVK 񙠓!t2 yb.v7d?IR%nb?'B7[(拀_uыMXo^cBLzR8%n&>d\g0Plx,_r tR#M}Xh#Ma}H`vHB3$L&ۍɽudxRtbxH6Gp/Ŭq%6w)b7LV?"dCɓ^CcFB?}Rlo.]y'$~(6]< 39vj1>:As1ߢknqgf҉)ȏ$u뇐aǼ8q$GeiM Z1Fd:tbl^Dy=fL_3(O>⬭`2^鐜gVs3}Wcdx`{;{'p,6-ou;='Ao!iR1 {B[eÇttc0Y*0 Xj]φ|vHnaIu v%S;ntdJއ0g3neg4;bX>L|\0_Zr>ɋ- htF`bD6v'0|-Wީ3sTkELvM?Z.Z؜IogQr60dAw>N] z z>RGG \] b*>S|OۍЃ3-פpϭA'삹5(ϚNVi%]~˿u;X;O ϯ7SL"B3]\c.vuȽċ2%R$λ &;C yGǴB7gO N?F+o?3z2xTd+k(-9;y=b6n=##rshR VFO' ޺%u -G:^w+3 ~dyfvu`_r_{9钇3'|Om A j~VB}zo߰GOfp9=o1QuHޔJ:ō{>^ݢ>H&Aw7<")uLX>>_V{=crF.{ƾ!`$77g3~`-fU</"?|`;DNlf\0s a?{Rk%)Z`GbF7-o=["q&f{9f0~`$͞?+{#[j@clSAb73;2z<C97ˆb"> >cΡ<%|x3`Qix2ڰZe:91t<\bQ;"G@{bSܿu¿Π3ϧاjw 2Ykf )O{|ZB3}DKÑ-whN4ی ķb>EخuA-;8xZy2I ؍YA38^pt;H ;Wry>WCaK;t)tfg:W~ Y 8OWrvV ys}_~`]X/e_#`Oxاx\=$UCV5 ;pmGЃqoM3xE6e?\V_o%%Whͧ{WNߛ=si{k 'V' :Aexy3λ2o/0 S];q Z[ &>j9oDŽI|5>@rčnL)0k2M399UllO6dOV\Ɯӳx3Ha9[bţO?-lwronSLvA?e b}?_,oo[&z:w5x5HGg͝ix<C\0sq\AS |<٩%,ڮ%mr~6%Οc`ڮ]=`0~g~Klv`:'<aRZ}3;u zNCT߇ER`yK%r"x`8:939y#q.v;s5=3頋ȓbt0^hiS\Чx>>  5=,B#-ѭ|]?T_oF}̬\_.p*d5ū1=up8ϒЀAՐ-Ox.0]ٿgH\hD=NǼ:~~]S r w,ދo%rɟ&{rl %~>V]~W7(3@>/ ]NZ [?dD+7w.fVf2N p~ hVFs/"yP[FB󠹍R=f??V?`.)%2y:tdU tXxgp{xSoMOb0ž5j^ޑ懀`kHM=-> a5AȑIud*xw.wNȃEZ rûs .Y=?S@B?1vZ$fG282|uQ~asC7&V~/ x0^w Jdm%=+g H5te&D^5 ze䠎|g>-L|M'GY06zuuBb89~>?Zɭޭ$q 軼:-P=lfiLGWI=k>Zy>oJ}sE63h,MK/7K]x,>`э[ƒw,r;[#R\Y?Y]ljKG|.V8 -;]gVDBr|^JbA?z7nPkƁI' x4 |38 =LyFv/m1=l_ۃ=2 k9 =r4]\j9lż븧DB􎬐.5`bunyl.aws~ȵz\ 6D$lɎ0;xj[5Z['}a6S]۪{a--Gq3]g0NOoOsg\qю:''YMb_=wٕHRW?.r5msp/data/meuse.grid.rda0000644000176200001440000004653212577541412014361 0ustar liggesusers USǯ&tIxT2u~km("I!B)Ce̘HEdL*^dh'  9{{9[ޟ콾{8a+TiU%//\^= W!tp}G_޵cU#/oNtuɕj Gjc6E^_P}}۔,ضVk߫n|)ۼ{-uV;ʱ U֎Ѿo vF;w4ڹ[\o߮9\o_ogoomvvVc‚X.flNvW3犛?o n^?j↠?kp|;]OT\էTT*^)STqШNQJ\>i2SQuէ8T\Q+KTuգzT\ GTzT\:4GTzT\&cq.T Du). F)>G)>:U>i3'SQuէ88;O6wQWY^-}&_I73cTDzc :FY/k<67㶪A۪SEm])Q,*6"c~3 Dx(fDxJA'by' b1?.Q,,8- (nǯb(n b~cD;- XXt XXG%6Gb(B(F1Qb(F1Qb(F1Qb(/꭬ۑ1Vʵn+ut+vz}nwGoe\8r.z+ɵz$ne}|ZqZ=VǛk[Yw!q+:Z=ա-G[T·EoQ=ޢdEul'-OE[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[e?(FD[E[E[E[E[E[E[E[E[E[E[E[[?EoHeEKV}[[=EoIEGZ}߷ ߢ걣e{#WRVuպur.e}ܹV>\KY_ե+SǑ)jʺ^ngT[Y+bVb(F1Qb(F1Qb(F1Qb(F1Qb(F1Qb(vK?m{Nr+ٚF>9k9f??e!MWؤ~_ګRߦg}}-QOzr_ӆ7mϻ{eI^^7yg7Il}[L@3M:/o{+omva=Zo|z m|Yrg_dto*nGuV޿dqM>ބvN̗zS`)'yn6F޳>95=p>~ Kʓ~ozz/5V{_֪oOy=;awOy ɿV~YNaH]>Mp7ŲE'/<.oFu]ͼo}f96_e _?Kyj`r^}AY]ٶ{ߜ?fiϏu ޸=_]m=69wTr`/~_yn?YvIn _4i}W}}n97{j㟇W]c !{tkě1_Vk#/ݜԎoF\3ow} z}{m?o鸇oO[i_.W3CwOCogݬ7+rE'闞|»?t[I/NͰU_//3n/]M^RvŽxڛ?̶x`GU9$흞S.f֟|M5:Orٵuo߇|ӿWr6?[vmi3G εmtʺ_YK%oO_Vz+xᎂz߾Owy Kd̩q{|49o7u6ξ}݇U]>r9[/ګv&~oZ:M|zo5~Wm8?{֛\N O[gPeP>}w|^7nyw5Ot}GcAbbx͝-8\fͺYcx?Oŀߌ(OT 4-W}X3!:q㸚i?^}?-GO^ET<>7>=[gV!1G{pQKu-;"}/-[n2'c_ 2NHMpgƯij0a};p\Ez|lu[?n޵NW:Y#NrХk̔L^ m#{|~}Qߡ%oa?|>XԳR2o9_]E8\p.+{hI{>2^?*|r^89p7 I{%lA@s]wϑ鑩留WչdXҤǣǫz&\7 +%>wq1?==)O_w/c8Zoz]HַEp?(q>&>VnY,_Щ)W}IY{W}]z_ϙ= | xhj[yW>OOI 2|}~6I9ł5yo_,:Ͽ΃q^7yДi^;}fy*W=2ez8-k&5 -޿sg}]6C=j=O/m1p^`ȑ 7M''|.>=ex'oކju#>pE/>&i==J~8rκwaKp?MΚ;oF}.We|ԄE/7_uG뒲N+9__N]3`P̿jrxϓz| J}G?1\ 6IfO9ա.͛V{U?jTp~(#:6j l_:#;zP48_Lg7?yFsDauc%,׍.eM/6MX/O<},oz%v~?{Ec)| g^+qd]5U[cUa4ot3.zz˼>gڧҮi~Sϑ8̯~1}鱽 Mzp3J;:^kKݥl~7幃z2<駃"`Z=IUS7}h4=(e? 5gt?]_:u;Io^lpp>~)m:W{ɚamrBg5?ٯ,zrC}ܵqscl=MxK=2䵯 뒸.MvyMXgzҤuI њyqDC{_{x^&inGx_eq3M>ܡ~mYM{KZ=|Eǟ_=qdĴIxK}﫫T?Vy5Wg}g){\ <>9j?6:誆c'kmx˛J$S'i9]=ߙEgnn1O&%=KX\^o858ɷ\U7ݧ -zθ[󢛿l?3zǮx=tܼܟ? ־>dE)^^OlTV"_y ެ7ÓӒ%<<`I~9>6#2<1ޚ֮8w-[ 3GZ-^[1申6>ފy-{roeWwtɌ`!qu/eGz=;/}_/$%=g 8Ce^TIkz2<S]^4Gbe0Xm;[Ypm~U^˿z~M|.q<oD(|;[~5͛SJZ/ +/y}a˫֛5k͕uPvY%m.% oiwr{T<8X58voğ;,oՆG_>ou-`Z^$=K'ztz++s`^2Η:7UsϬtK#CkCx_Xn^~ yx?up]-rꔇyުIU.Uouq/[?оNy׏W?SL}Τq{ϧ=cmzs`>2}Ə=[0wn gɸbU&~wP_QC.ae4үǀag>ac#&}}pcM/ފ"m=ߢ}$"'MXw±"y*fB׽\--o^>aԻorêSG4|buWs<ۯUK?}jA=ޚ*?|~߬׽5&5~Yuu]}ؤ{Ϩ9ks[/|d77?vꔝ_^'vK^Y#ᣫrxXYm y_uo5ٓv=9G_zSץ9[W5[wNyN'/N'xzcaA<񼞧,>տ/~%+u}][U~򪦷~:ono- Ƒ>flYKZdh9ɧIGuE5lymp|-ͦj3x]eRpi{5lysg6~߯?Ym8[Cn5ߚvS'y/vCYS;ZÏmޚW}ejOӮuҪKqMfe[V >vOq q?=ǭ~?wZxUNj>~;tV*y&K'됥U+ :Yx%# j掇w>}w^㴪/o֌CVV-ޥuw'%y~YZuIDzΐ4o2e9U c˛]'WV~/|[iVr6/ѡoѧl{[\1s$(g̫suRS:]s4z<}-c"ǟ7,9uWou%{ARyz'cZzŊ!_9Ӻ55 |W ~2V}×k-Wm;UIu }>i&OX*/9I~)-iOs!-u-5>am~b n"_Rsϓ>{q%w$E|V_)`'}ϟuu}ӫyGz-ms}=a~q}EgIӁbx%Go8Kuuy:k[qޢ9iޢ5w:wkx\[i~ݫǿN],~_IxlR'yxRY}`˽??o/]-Էn+{~{#q~2ˑԏR#~2^ܗվ[|]*cϫyc ^;h |NeO63\g~԰T~pe*7k~<碕Kyc?li6i|}9㷫{NQ/cej?.=pu J z=,9w6ɛJ3GEU9f~mbOaoNTy 3{ڜ?ƏS{;%R<^{!+7чI/'>M|=Var?xɛk6?ܳQ~n*U}; +{KӮek//Vw>OO=>s^sY?3^f۫ϏO^xr ZS',b>NJv].cX}ϒ#OtKj΋9_;U:~?Gyo돟ό=~- i27s )9X=~ 63[]y9g}`^YD`?zmj}Iٮ{=dA7 ʼyLk8GO߭x"SlplMiv}G> O#$yIu˔u0n|ϺFO_/|_|O5򽽉C>zwvG>E=T Q3iKʷ ר-Y`<_?k[y~'^E ޗq|K}cz(aPϛ}NE|DEC4^ϙ>i1ii>4Z=jYou}yT[;'^OL|l~>u&S}?N}V9]=ǚϚٞ= ꛲i?'|̢>=Я?71fĮ^3˿_kr?ڧ~]5%W i=~W~-z5U(e]S]9oyHҸJ+5}8sɝoH=<]5_7xyk3.Oj|]1pRg2\z[{|yjܡT>י^ןN\g?ϐk=iHL>D~h~Gp$%?yyJ簓f::iW0NqN|}{H|~N9ṗgq'/37gߦztϟ$< ߇_Ox~?w'u? 3<~|4<`\&>W/v~7끺Lu?t~?D"4'{OQxx ɟNB~>WdD{s^j}.*pq:iUxy<^ QqL' 9w, 㤿qyc }p>OIsuۛPN/C=L>.7~ __}NӮ~zIbOXOH7y}yyw;O৤ÿ=o[Kb_e>mq>J:X+i3i_iڗK=j{%ga.}nvgsm|[սmյ)ڒ}8ٖmSɕ[ڑKm)kǿ ۫lk2]r۫۫-ܩmd~4RɤuIe{ە=%iK6ɴMԞ8竴fۖt ѿړMJm9_ֶڗwۙ+ⴱ$?ݾ;j;wf2v(ڛ+mNlK?sp Hw,){8\Ǖqdz#KQcn[ھ\lSD?O ~*Ǯ*R7tv)_@P oخSn}.kk6m:D?sRqWܫ8*j. .cf6Qdƒ3㿒3/ZKlcd3-vWu|T竰}L[%qkŽ9kJcf3W,jELS\ŝ_nwqct /8ɓ1v΋/3e}뺸?Eq79Ȥ-8mLǐTmɶM+yK՞TY'U ;gIړF%͑lL۔OIYP)윧Nҵ']ۦT$UۊjO&TȊ3cIۓ{S^IڒδI-Jږww;JjGZ(N[^#65m(.Y~JzEլ$mȶ(Kk\X;ˍ\hOIٶVmʤeۦlnOIKٴi{')>ME{N}ԨZj[Q#n&]bT6eZ?u3ic7]ژy+\}XԹ.l6fs=-?]%mkm̤LrmvdRlrn6glkms'Ӻ'އs{X ko&"1;)鱤;G}lE7JzesLq\3~=T{YysKIE]kٞ[ܶjoi3ɦ}ũc&L*]۪M5ݺDIjCxu[];E/>mK3w*f[67giwi*Ksߙ^_W(B-y~B??\ݶsn]wХmn?]Bݮӯ]ӱeupmB]hʹAEM/L/l/EXU,| _+3|e s ́0s ́0s ́0 s0 s0 s0 s0 s00Fsa#a900f sa3a900f sXa+a90V sXa+a90vsa;a90pN s8a'90pn sa790pn941y y!/MyiK[^:R$[L$[L$[L$[L$[LAAAAAAAAAA)ɦ$lJ)ɦ$lJ)ɦ$! fH6C͐ld3$! fJ6S͔ld3%)LfJ6SY͒ld$%,fI6KY͒ld%-lfK6[ْ͖ld%#H6G9͑lds$#J6W͕lds%+\J6a %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX Kܐ%b Bl}נ׊^ڤC)o(o(o(o(o(/(/(/(/(/(/(/(/(/(/(*ʫ(*ʫ(נ5(Ay kP^נ&5)IyMkR^פ&5)Ey-kQ^Zע(Ey-kS^ڔצ6)MymkS^:סu(CyP^:ס.u)Ky]R^ץ.%^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe I2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,MW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xKrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+jߞW\^^-Ҿumk?m3sp/data/meuse.riv.rda0000644000176200001440000000245412577541412014227 0ustar liggesusers]{PUǗOy $1@ j*s +  LjYLah =Și̜ql1Ĉ O9s{v=b0ۿFۯ7_ω^`W8dYʭg,к`aO~l&I/MYi1/'?.y&=!o$o"'Qn>Զ~>vQbϫ N=Ziz9Lܩ9? Qk:]ݵ,-B[oa\AZgm2s8 jk3ms:HiRoUqNľ_.^V.L:&-'>s?w#t_).zɻ|umU/پ*bj3}S2oHzUP}u3]>|QQ.| OBd'y=Nކ>nY7^@9RW*HyR_rxz$ya_#Tl=qbϑ9\%/Sw6a߸z7@/2f·!uTR2O2* ˷`8 8?Xq_ sp/data/meuse.area.rda0000644000176200001440000000216312577541412014334 0ustar liggesusersoUUu{[5V5Q8Pꀊ"**NEη}>HLmo?e?qC5qCz׷ nz]=u N.L٘u;c6|ձq0pryK{_XZMu֝k+Nơ%v=q0naa_ߍ-FlO16C`7~o~_ǟSw2}qyܧ~_ȯ?0}{ ;ƾoEaim_jhv﫥Ǽ::wuݰX_u>%T3X{2"{:窞Ҧ8%C=Z^h}BB=C:zu-oV36D=P_TC-8=/nf7f#{~jc/ E8{i`DvkjvC3i ljV`)o>~aJKuݠ/}u@WP,Wץ_:/o鼗C֫mImd>f[}.盾l靕kvhD[W wb`g>fc%bn fGg[[uüyy<-S7f=J|WثL{\k*1x{MׅuGvǽqX7EJL->ޭ&xǹ<|wV绫mb'h=[z&XF{8xGLqz5;yU}>b?죞=c=q=A'#T%&z=_~|/̣ow;D?ټOtX?ݗد>l><`w; N >o^aL%|xٯrNsp/R/0000755000176200001440000000000013120733512011072 5ustar liggesuserssp/R/SpatialPointsDataFrame-methods.R0000644000176200001440000001560212654404244017231 0ustar liggesusers"SpatialPointsDataFrame" = function(coords, data, coords.nrs = numeric(0), proj4string = CRS(as.character(NA)), match.ID, bbox = NULL) { if (!is(coords, "SpatialPoints")) coords = coordinates(coords) # make sure data.frame becomes double matrix; NA checks mtch = NULL cc.ID = row.names(coords) # row.names works for both matrix AND SpatialPoints if (missing(match.ID)) { # sort it out: if (is.null(cc.ID)) match.ID = FALSE # nothing to match to! else { mtch = match(cc.ID, row.names(data)) match.ID = !any(is.na(mtch)) # && length(unique(mtch)) == nrow(data) if (match.ID && any(mtch != 1:nrow(data))) warning("forming a SpatialPointsDataFrame based on maching IDs, not on record order. Use match.ID = FALSE to match on record order") } } else if (is.character(match.ID)) { row.names(data) = data[, match.ID[1]] match.ID = TRUE } if (match.ID) { if (!is.null(cc.ID) && is(data, "data.frame")) { # match ID: if (is.null(mtch)) mtch = match(cc.ID, row.names(data)) if (any(is.na(mtch))) stop("row.names of data and coords do not match") if (length(unique(mtch)) != nrow(data)) stop("row.names of data and dimnames of coords do not match") data = data[mtch, , drop = FALSE] } } if (!is(coords, "SpatialPoints")) coords = SpatialPoints(coords, proj4string = proj4string, bbox = bbox) # EJP, Tue Aug 13 19:54:04 CEST 2013 if (is.character(attr(data, "row.names"))) # i.e., data has "real" row names dimnames(coords@coords)[[1]] = row.names(data) new("SpatialPointsDataFrame", coords, data = data, coords.nrs = coords.nrs) } setMethod("coordinates", "SpatialPointsDataFrame", function(obj) obj@coords) setMethod("addAttrToGeom", signature(x = "SpatialPoints", y = "data.frame"), function(x, y, match.ID, ...) SpatialPointsDataFrame(x, y, match.ID = match.ID, ...) ) setReplaceMethod("coordinates", signature(object = "data.frame", value = "ANY"), function(object, value) { coord.numbers = NULL if (inherits(value, "formula")) { cc = model.frame(value, object, na.action = na.fail) # retrieve coords if (dim(cc)[2] == 2) { nm = as.character(as.list(value)[[2]])[2:3] coord.numbers = match(nm, names(object)) } else if (dim(cc)[2] == 3) { nm = c(as.character(as.list((as.list(value)[[2]])[2])[[1]])[2:3], as.character(as.list(value)[[2]])[3]) coord.numbers = match(nm, names(object)) } # else: give up. } else if (is.character(value)) { cc = object[, value] # retrieve coords coord.numbers = match(value, names(object)) } else if (is.null(dim(value)) && length(value) > 1) { # coord.columns? if (any(value != as.integer(value) || any(value < 1))) stop("coordinate columns should be positive integers") cc = object[, value] # retrieve coords coord.numbers = value } else # raw coordinates given; try transform them to matrix: cc = coordinates(value) if (any(is.na(cc))) stop("coordinates are not allowed to contain missing values") if (!is.null(coord.numbers)) { object = object[ , -coord.numbers, drop = FALSE] stripped = coord.numbers # ... but as.data.frame(x) will merge them back in, so nothing gets lost. if (ncol(object) == 0) #stop("only coords columns present: use SpatialPoints to create a points object") return(SpatialPoints(cc)) } else stripped = numeric(0) SpatialPointsDataFrame(coords = cc, data = object, coords.nrs = stripped, match.ID = FALSE) } ) .asWKT = FALSE print.SpatialPointsDataFrame = function(x, ..., digits = getOption("digits"), asWKT = .asWKT) { #EJP, Fri May 21 12:40:59 CEST 2010 if (asWKT) df = data.frame(asWKTSpatialPoints(x, digits), x@data) else { # old style cc = substring(paste(as.data.frame( t(signif(coordinates(x), digits)))),2,999) df = data.frame("coordinates" = cc, x@data) } row.names(df) = row.names(x@data) print(df, ..., digits = digits) } setMethod("show", "SpatialPointsDataFrame", function(object) print(object)) dim.SpatialPointsDataFrame = function(x) dim(x@data) as.data.frame.SpatialPointsDataFrame = function(x, ...) { if (length(x@coords.nrs) > 0) { maxi = max(x@coords.nrs, (ncol(x@data) + ncol(x@coords))) ret = list() for (i in 1:ncol(x@coords)) ret[[x@coords.nrs[i]]] = x@coords[,i] names(ret)[x@coords.nrs] = dimnames(x@coords)[[2]] idx.new = (1:maxi)[-(x@coords.nrs)] for (i in 1:ncol(x@data)) ret[[idx.new[i]]] = x@data[,i] names(ret)[idx.new] = names(x@data) ret = ret[unlist(lapply(ret, function(x) !is.null(x)))] data.frame(ret, ...) } else data.frame(x@data, x@coords, ...) } setAs("SpatialPointsDataFrame", "data.frame", function(from) as.data.frame.SpatialPointsDataFrame(from)) names.SpatialPointsDataFrame <- function(x) names(x@data) "names<-.SpatialPointsDataFrame" <- function(x, value) { checkNames(value) names(x@data) = value x } points.SpatialPointsDataFrame = function(x, y = NULL, ...) points(as(x, "SpatialPoints"), ...) text.SpatialPointsDataFrame = function(x, ...) { lst = list(...) if (!is.null(x$srt)) { if (length(unique(x$srt)) == 1) lst$srt = x$srt[1] else { # print each label individually: lapply(seq_len(length(x)), function(i) text(x[i,], ...)) return(invisible()) } } lst$x = coordinates(x) if (!is.null(x$pos) && is.null(lst$pos)) lst$pos = x$pos if (!is.null(x$offset) && is.null(lst$offset)) lst$offset = x$offset if (!is.null(x$labels) && is.null(lst$labels)) lst$labels = parse(text = x$labels) if (!is.null(x$adjx) && !is.null(x$adjy)) lst$adj = c(x$adjx, x$adjy) do.call(text, lst) } row.names.SpatialPointsDataFrame <- function(x) { ret = dimnames(slot(x, "coords"))[[1]] if (is.null(ret)) ret = row.names(x@data) ret } "row.names<-.SpatialPointsDataFrame" <- function(x, value) { dimnames(slot(x, "coords"))[[1]] <- value rownames(slot(x, "data")) <- value x } setMethod("[", "SpatialPointsDataFrame", function(x, i, j, ..., drop = TRUE) { missing.i = missing(i) missing.j = missing(j) nargs = nargs() # e.g., a[3,] gives 2 for nargs, a[3] gives 1. if (missing.i && missing.j) { i = TRUE j = TRUE } else if (missing.j && !missing.i) { if (nargs == 2) { j = i i = TRUE } else { j = TRUE } } else if (missing.i && !missing.j) i = TRUE if (is.matrix(i)) stop("matrix argument not supported in SpatialPointsDataFrame selection") if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (is.character(i)) i <- match(i, row.names(x)) if (any(is.na(i))) stop("NAs not permitted in row index") if (!isTRUE(j)) # i.e., we do some sort of column selection x@coords.nrs = numeric(0) # will move coordinate colums last x@coords = x@coords[i, , drop = FALSE] if (nrow(x@coords)) x@bbox = .bboxCoords(x@coords) x@data = x@data[i, j, ..., drop = FALSE] x }) setMethod("split", "SpatialPointsDataFrame", split.data.frame) setMethod("geometry", "SpatialPointsDataFrame", function(obj) as(obj, "SpatialPoints")) length.SpatialPointsDataFrame = function(x) { nrow(x@coords) } sp/R/surfaceArea.R0000644000176200001440000000223712577541412013455 0ustar liggesuserssurfaceArea.matrix <- function(m,cellx=1,celly=1,byCell=FALSE){ if(byCell){ mout = matrix(NA,nrow=nrow(m),ncol=ncol(m)) }else{ mout = NA } m=cbind(m[,1],m,m[,ncol(m)]) m=rbind(m[1,],m,m[nrow(m),]) storage.mode(m) <- "double" ret = .C("sarea", m, as.integer(nrow(m)), as.integer(ncol(m)), as.double(cellx), as.double(celly), sa=as.double(mout), bycell=as.integer(byCell), NAOK=TRUE) if(!byCell){ return(ret$sa) }else{ return(matrix(ret$sa,ncol=ncol(mout),nrow=nrow(mout))) } } setMethod("surfaceArea", signature("matrix"), surfaceArea.matrix) surfaceArea.SpatialGridDataFrame <- function(m,cellx=1,celly=1,byCell=FALSE){ cs = gridparameters(m)$cellsize ret = surfaceArea(as.matrix(m), cs[1], cs[2], byCell = byCell) if (is.matrix(ret)) { m[[1]] = as.vector(ret) m } else ret } setMethod("surfaceArea", signature("SpatialGridDataFrame"), surfaceArea.SpatialGridDataFrame) surfaceArea.SpatialPixelsDataFrame <- function(m, byCell=FALSE) surfaceArea(as(m, "SpatialGridDataFrame"), byCell = byCell) setMethod("surfaceArea", signature("SpatialPixelsDataFrame"), surfaceArea.SpatialPixelsDataFrame) sp/R/flipSGDF.R0000644000176200001440000000124212577541412012625 0ustar liggesusersflipHorizontal <- function(x) { if (!inherits(x, "SpatialGridDataFrame")) stop("x must be a SpatialGridDataFrame") grd <- getGridTopology(x) idx = 1:prod(grd@cells.dim[1:2]) m = matrix(idx, grd@cells.dim[2], grd@cells.dim[1], byrow = TRUE)[,grd@cells.dim[1]:1] idx = as.vector(t(m)) x@data <- x@data[idx, TRUE, drop = FALSE] x } flipVertical <- function(x) { if (!inherits(x, "SpatialGridDataFrame")) stop("x must be a SpatialGridDataFrame") grd <- getGridTopology(x) idx = 1:prod(grd@cells.dim[1:2]) m = matrix(idx, grd@cells.dim[2], grd@cells.dim[1], byrow = TRUE)[grd@cells.dim[2]:1, ] idx = as.vector(t(m)) x@data <- x@data[idx, TRUE, drop = FALSE] x } sp/R/subset.R0000644000176200001440000000145512577541412012542 0ustar liggesusers# taken from subset.data.frame: subset.Spatial = function(x, subset, select, drop = FALSE, ...) { if (! "data" %in% slotNames(x)) stop("subset only works for Spatial*DataFrame objects") if (missing(subset)) r <- TRUE else { # outcomment, suggested by Sebastian Meyer, 06/26/2012: # if (is.logical(subset) && missing(select)) # return(x[subset & !is.na(subset),]) e <- substitute(subset) r <- eval(e, x@data, parent.frame()) if (!is.logical(r)) stop("'subset' must be or evaluate to logical") r <- r & !is.na(r) } if (missing(select)) vars <- TRUE else { nl <- as.list(seq_along(x@data)) names(nl) <- names(x@data) vars <- eval(substitute(select), nl, parent.frame()) } x[r, vars, drop = drop] } sp/R/Spatial-methods.R0000644000176200001440000002701212722650617014270 0ustar liggesusersSpatial <- function(bbox, proj4string = CRS(as.character(NA))) { new("Spatial", bbox=bbox, proj4string=proj4string) } if (!isGeneric("addAttrToGeom")) setGeneric("addAttrToGeom", function(x, y, match.ID, ...) standardGeneric("addAttrToGeom")) if (!isGeneric("bbox")) setGeneric("bbox", function(obj) standardGeneric("bbox")) if (!isGeneric("coordinates")) setGeneric("coordinates", function(obj, ...) standardGeneric("coordinates")) if (!isGeneric("coordinates<-")) setGeneric("coordinates<-", function(object, value) standardGeneric("coordinates<-")) if (!isGeneric("coordnames")) setGeneric("coordnames", function(x) standardGeneric("coordnames")) if (!isGeneric("coordnames<-")) setGeneric("coordnames<-", function(x,value) standardGeneric("coordnames<-")) if (!isGeneric("dimensions")) setGeneric("dimensions", function(obj) standardGeneric("dimensions")) if (!isGeneric("fullgrid")) setGeneric("fullgrid", function(obj) standardGeneric("fullgrid")) if (!isGeneric("fullgrid<-")) setGeneric("fullgrid<-", function(obj, value) standardGeneric("fullgrid<-")) if (!isGeneric("geometry")) setGeneric("geometry", function(obj) standardGeneric("geometry")) if (!isGeneric("geometry<-")) setGeneric("geometry<-", function(obj, value) standardGeneric("geometry<-")) if (!isGeneric("gridded")) setGeneric("gridded", function(obj) standardGeneric("gridded")) if (!isGeneric("gridded<-")) setGeneric("gridded<-", function(obj, value) standardGeneric("gridded<-")) if (!isGeneric("is.projected")) setGeneric("is.projected", function(obj) standardGeneric("is.projected")) #if (!isGeneric("overlay")) # setGeneric("overlay", function(x, y, ...) # standardGeneric("overlay")) if (!isGeneric("over")) setGeneric("over", function(x, y, returnList = FALSE, fn = NULL, ...) standardGeneric("over")) if (!isGeneric("plot")) setGeneric("plot", function(x, y, ...) standardGeneric("plot")) if (!isGeneric("polygons")) setGeneric("polygons", function(obj) standardGeneric("polygons")) if (!isGeneric("polygons<-")) setGeneric("polygons<-", function(object, value) standardGeneric("polygons<-")) if (!isGeneric("proj4string")) setGeneric("proj4string", function(obj) standardGeneric("proj4string")) if (!isGeneric("proj4string<-")) setGeneric("proj4string<-", function(obj, value) standardGeneric("proj4string<-")) if (!isGeneric("sppanel")) setGeneric("sppanel", function(obj, ...) standardGeneric("sppanel")) if (!isGeneric("spplot")) setGeneric("spplot", function(obj, ...) standardGeneric("spplot")) if (!isGeneric("spsample")) setGeneric("spsample", function(x, n, type, ...) standardGeneric("spsample")) if (!isGeneric("summary")) setGeneric("summary", function(object, ...) standardGeneric("summary")) if (!isGeneric("spChFIDs")) setGeneric("spChFIDs", function(obj, x) standardGeneric("spChFIDs")) if (!isGeneric("spChFIDs<-")) setGeneric("spChFIDs<-", function(obj, value) standardGeneric("spChFIDs<-")) if (!isGeneric("surfaceArea")) setGeneric("surfaceArea", function(m, ...) standardGeneric("surfaceArea")) if (!isGeneric("split")) setGeneric("split", function(x, f, drop = FALSE, ...) standardGeneric("split")) if (!isGeneric("spTransform")) setGeneric("spTransform", function(x, CRSobj, ...) standardGeneric("spTransform")) setMethod("spTransform", signature("Spatial", "CRS"), function(x, CRSobj, ...) { if (!requireNamespace("rgdal", quietly = TRUE)) stop("package rgdal is required for spTransform methods") spTransform(x, CRSobj, ...) # calls the rgdal methods } ) setMethod("spTransform", signature("Spatial", "character"), function(x, CRSobj, ...) spTransform(x, CRS(CRSobj), ...) ) setMethod("spTransform", signature("Spatial", "ANY"), function(x, CRSobj, ...) stop("second argument needs to be of class CRS") ) bbox.default <- function(obj) { is_points <- function(obj) { is <- FALSE if(is.array(obj)) if(length(dim(obj))==2) if(dim(obj)[2]>=2) is <- TRUE is } if(!is_points(obj))stop('object not a >= 2-column array') xr <- range(obj[,1],na.rm=TRUE) yr <- range(obj[,2],na.rm=TRUE) res <- rbind(x=xr, y=yr) colnames(res) <- c("min","max") res } setMethod("bbox", "ANY", bbox.default) setMethod("bbox", "Spatial", function(obj) obj@bbox) setMethod("dimensions", "Spatial", function(obj) nrow(bbox(obj))) setMethod("polygons", "Spatial", function(obj) { if (is(obj, "SpatialPolygons")) as(obj, "SpatialPolygons") else stop("polygons method only available for objects of class or deriving from SpatialPolygons") } ) summary.Spatial = function(object, ...) { obj = list() obj[["class"]] = class(object) obj[["bbox"]] = bbox(object) obj[["is.projected"]] = is.projected(object) obj[["proj4string"]] = object@proj4string@projargs if (is(object, "SpatialPoints")) obj[["npoints"]] = nrow(object@coords) if (is(object, "SpatialGrid") || is(object, "SpatialPixels")) obj[["grid"]] = gridparameters(object) if ("data" %in% slotNames(object) && ncol(object@data) > 0) obj[["data"]] = summary(object@data) class(obj) = "summary.Spatial" obj } setMethod("summary", "Spatial", summary.Spatial) print.summary.Spatial = function(x, ...) { cat(paste("Object of class ", x[["class"]], "\n", sep = "")) cat("Coordinates:\n") print(x[["bbox"]], ...) cat(paste("Is projected:", x[["is.projected"]], "\n")) # cat(paste("proj4string : [", x[["proj4string"]], "]\n", sep="")) pst <- paste(strwrap(x[["proj4string"]]), collapse="\n") if (nchar(pst) < 40) cat(paste("proj4string : [", pst, "]\n", sep="")) else cat(paste("proj4string :\n[", pst, "]\n", sep="")) if (!is.null(x$npoints)) { cat("Number of points: ") cat(x$npoints) cat("\n") } if (!is.null(x$n.polygons)) { cat("Number of polygons: ") cat(x$n.polygons) cat("\n") } if (!is.null(x$grid)) { cat("Grid attributes:\n") print(x$grid, ...) } if (!is.null(x$data)) { cat("Data attributes:\n") print(x$data, ...) } invisible(x) } # sp.axes = FALSE #asp <- function(x, ylim) { # if (is.na(proj4string(x)) || is.projected(x)) # return(1.0) # else # return(1/cos((mean(ylim) * pi)/180)) #} bb2merc = function(x, cls = "ggmap") { # return bbox in the appropriate "web mercator" CRS WGS84 = CRS("+init=epsg:4326") # merc = CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs") merc = CRS("+init=epsg:3857") # http://wiki.openstreetmap.org/wiki/EPSG:3857 if (cls == "ggmap") { b = sapply(attr(x, "bb"), c) pts = cbind(c(b[2],b[4]),c(b[1],b[3])) } else if (cls == "RgoogleMaps") pts = rbind(x$BBOX$ll, x$BBOX$ur)[,2:1] else stop("unknown cls") bbox(spTransform(SpatialPoints(pts, WGS84), merc)) } plot.Spatial <- function(x, xlim = NULL, ylim = NULL, asp = NA, axes = FALSE, bg = par("bg"), ..., xaxs, yaxs, lab, setParUsrBB = FALSE, bgMap = NULL, expandBB = c(0,0,0,0)) { # expandBB: 1=below, 2=left, 3=above and 4=right. bbox <- bbox(x) expBB = function(lim, expand) c(lim[1] - expand[1] * diff(lim), lim[2] + expand[2] * diff(lim)) if (is.null(xlim)) xlim <- expBB(bbox[1,], expandBB[c(2,4)]) if (is.null(ylim)) ylim <- expBB(bbox[2,], expandBB[c(1,3)]) if (is.na(asp)) asp <- ifelse(is.na(proj4string(x)) || is.projected(x), 1.0, 1/cos((mean(ylim) * pi)/180)) plot.new() args = list(xlim = xlim, ylim = ylim, asp = asp) if (!missing(xaxs)) args$xaxs = xaxs if (!missing(yaxs)) args$yaxs = yaxs if (!missing(lab)) args$lab = lab do.call(plot.window, args) if (setParUsrBB) par(usr=c(xlim, ylim)) pl_reg <- par("usr") rect(xleft=pl_reg[1], ybottom=pl_reg[3], xright=pl_reg[2], ytop=pl_reg[4], col=bg, border=FALSE) if (axes) { # set up default axes system & box: box() if (identical(is.projected(x), FALSE)) { degAxis(1, ...) degAxis(2, ...) } else { axis(1, ...) axis(2, ...) } # axis(3, labels = FALSE, ...) # axis(4, labels = FALSE, ...) } localTitle <- function(..., col, bg, pch, cex, lty, lwd) title(...) localTitle(...) if (!is.null(bgMap)) { is3875 = function(x) length(grep("+init=epsg:3857", x@proj4string@projargs)) > 0 mercator = FALSE if (is(bgMap, "ggmap")) { bb = bb2merc(bgMap, "ggmap") mercator = TRUE } else if (all(c("lat.center","lon.center","zoom","myTile","BBOX") %in% names(bgMap))) { # an object returned by RgoogleMaps::GetMap bb = bb2merc(bgMap, "RgoogleMaps") bgMap = bgMap$myTile mercator = TRUE } else bb = rbind(xlim, ylim) # can be any CRS! if (mercator && !is3875(x)) warning(paste('CRS of plotting object differs from that of bgMap, which is assumed to be CRS("+init=epsg:3857")')) rasterImage(bgMap, bb[1,1], bb[2,1], bb[1,2], bb[2,2], interpolate = FALSE) } } setMethod("plot", signature(x = "Spatial", y = "missing"), function(x,y,...) plot.Spatial(x,...)) degAxis = function (side, at, labels, ...) { if (missing(at)) at = axTicks(side) if (missing(labels)) { labels = FALSE if (side == 1 || side == 3) labels = parse(text = degreeLabelsEW(at)) else if (side == 2 || side == 4) labels = parse(text = degreeLabelsNS(at)) } axis(side, at = at, labels = labels, ...) } setReplaceMethod("spChFIDs", signature(obj = "Spatial", value = "ANY"), function(obj, value) { spChFIDs(obj, as.character(value)) } ) setReplaceMethod("coordinates", signature(object = "Spatial", value = "ANY"), function(object, value) stop("setting coordinates cannot be done on Spatial objects, where they have already been set") ) setMethod("[[", c("Spatial", "ANY", "missing"), function(x, i, j, ...) { if (!("data" %in% slotNames(x))) stop("no [[ method for object without attributes") x@data[[i]] } ) setReplaceMethod("[[", c("Spatial", "ANY", "missing", "ANY"), function(x, i, j, value) { if (!("data" %in% slotNames(x))) stop("no [[ method for object without attributes") if (is.character(i) && any(!is.na(match(i, dimnames(coordinates(x))[[2]])))) stop(paste(i, "is already present as a coordinate name!")) x@data[[i]] <- value x } ) setMethod("$", "Spatial", function(x, name) { if (!("data" %in% slotNames(x))) stop("no $ method for object without attributes") x@data[[name]] } ) setReplaceMethod("$", "Spatial", function(x, name, value) { if (name %in% coordnames(x)) stop(paste(name, "is a coordinate name, please choose another name")) if (!("data" %in% slotNames(x))) { df = list(value); names(df) = name return(addAttrToGeom(x, data.frame(df), match.ID = FALSE)) # stop("no $<- method for object without attributes") } #if (is.list(value)) # warning("assigning list or data.frame to attribute vector") x@data[[name]] = value x } ) setMethod("geometry", "Spatial", function(obj) { if ("data" %in% slotNames(obj)) stop(paste("geometry method missing for class", class(obj))) obj } ) setReplaceMethod("geometry", c("data.frame", "Spatial"), function(obj, value) addAttrToGeom(value, obj) ) setReplaceMethod("[", c("Spatial", "ANY", "ANY", "ANY"), function(x, i, j, value) { if (!("data" %in% slotNames(x))) stop("no [ method for object without attributes") if (is.character(i) && any(!is.na(match(i, dimnames(coordinates(x))[[2]])))) stop(paste(i, "is already present as a coordinate name!")) x@data[i,j] <- value x } ) # Don MacQueen provided head & tail: head.Spatial <- function(x, n=6L, ...) { ix <- sign(n)*seq(abs(n)) x[ ix , , drop=FALSE] } tail.Spatial <- function(x, n=6L, ...) { ix <- sign(n)*rev(seq(nrow(x), by=-1L, len=abs(n))) x[ ix , , drop=FALSE] } sp/R/point.in.polygon.R0000644000176200001440000000613612577541412014462 0ustar liggesuserspoint.in.polygon = function(point.x, point.y, pol.x, pol.y, mode.checked=FALSE) { if (mode.checked) res <- .Call(R_point_in_polygon_sp, point.x, point.y, pol.x, pol.y) else res <- .Call(R_point_in_polygon_sp, as.numeric(point.x), as.numeric(point.y), as.numeric(pol.x), as.numeric(pol.y)) res } pointsInPolygon = function(pts, Polygon, mode.checked=FALSE) { pts = coordinates(pts) cc = slot(Polygon, "coords") point.in.polygon(pts[,1], pts[,2], cc[,1], cc[,2], mode.checked=mode.checked) } pointsInPolygons = function(pts, Polygons, #which = FALSE, mode.checked=FALSE) { rings = slot(Polygons, "Polygons") res = matrix(unlist(lapply(rings, function(x, pts) pointsInPolygon(pts, x, mode.checked=mode.checked), pts = pts)), ncol=length(rings)) res <- res > 0 # holes <- sapply(rings, function(y) slot(y, "hole")) # areas <- sapply(rings, function(x) slot(x, "area")) # if (any(holes) && any(res[,holes])) { # holerows <- which(res[,holes,drop=FALSE], arr.ind=TRUE)[,1] # odd <- rowSums(res[holerows,,drop=FALSE])%%2 != 0 # for (i in seq(along = holerows)) { # in_p <- which.min(areas[res[holerows[i],,drop=FALSE]]) # res[holerows[i],] <- FALSE # if (odd[i]) res[holerows[i], in_p] <- TRUE # } # res[,holes] <- FALSE # } # revised 100716 ret <- rowSums(res) %% 2 != 0 # ret <- apply(res, 1, any) # if (which) { # reta <- integer(length(ret)) # for (i in seq(along = ret)) { # if (ret[i]) reta[i] <- which(res[i,]) # else reta[i] <- as.integer(NA) # } # ret <- reta # } ret } pointsInSpatialPolygons0 = function(pts, SpPolygons) { sr = slot(SpPolygons, "polygons") res = lapply(sr, function(x, pts) pointsInPolygons(pts, x), pts = pts) #ret = rep(as.numeric(NA), nrow(coordinates(pts))) #for (i in seq(along = res)) # ret[res[[i]] > 0] = i #apply(do.call(rbind, res), 2, which) do.call(rbind, res) } pointsInSpatialPolygons = function(pts, SpPolygons, returnList = FALSE) { pls = slot(SpPolygons, "polygons") lb <- lapply(pls, function(x) as.double(bbox(x))) cpts <- coordinates(pts) storage.mode(cpts) <- "double" mode.checked <- storage.mode(cpts) == "double" cand <- .Call(tList, .Call(pointsInBox, lb, cpts[,1], cpts[,2]), as.integer(length(pls))) # rm(cand0) # gc(verbose=FALSE) res <- pointsInPolys2(pls, cand, cpts, mode.checked=mode.checked, returnList = returnList) res } pointsInPolys2 <- function(pls, cand, pts, mode.checked=FALSE, returnList = FALSE) { n <- nrow(pts) if (returnList) res = sapply(1:length(pls), function(x) integer(0)) else res <- rep(as.integer(NA), n) # print(cand) for (i in seq(along=cand)) { candi <- cand[[i]] if (length(candi) > 0) { ptsi <- pts[candi,,drop=FALSE] ret <- pointsInPolygons(ptsi, pls[[i]], mode.checked=mode.checked) #for (j in seq(along=candi)) { # jj <- candi[j] # if (is.na(res[jj])) # res[jj] <- ifelse(ret[j], i, as.integer(NA)) #} if (returnList) res[[i]] = candi[ret] else res[candi[ret]] = i } } res } sp/R/chfids.R0000644000176200001440000000355712577541412012502 0ustar liggesuserschFIDsSpatialLines <- function(obj, x) { nl <- length(slot(obj, "lines")) if (length(x) != nl) stop("lengths differ") if (length(x) > length(unique(x))) stop("duplicate IDs") # for (i in 1:nl) slot(slot(obj, "lines")[[i]], "ID") <- x[i] lns <- slot(obj, "lines") lns1 <- vector(mode="list", length=nl) for (i in 1:nl) { lni <- lns[[i]] slot(lni, "ID") <- x[i] lns1[[i]] <- lni } slot(obj, "lines") <- lns1 obj } setMethod("spChFIDs", signature(obj="SpatialLines", x="character"), chFIDsSpatialLines) chFIDsSpatialLinesDataFrame <- function(obj, x) { SL <- as(obj, "SpatialLines") SLx <- spChFIDs(SL, x) df <- as(obj, "data.frame") row.names(df) <- sapply(slot(SLx, "lines"), function(x) slot(x, "ID")) SpatialLinesDataFrame(SLx, data=df) } setMethod("spChFIDs", signature(obj="SpatialLinesDataFrame", x="character"), chFIDsSpatialLinesDataFrame) chFIDsSpatialPolygons <- function(obj, x) { np <- length(slot(obj, "polygons")) if (length(x) != np) stop("lengths differ") if (isTRUE(anyDuplicated(x))) stop("duplicate IDs") # for (i in 1:np) slot(slot(obj, "polygons")[[i]], "ID") <- x[i] pls <- slot(obj, "polygons") pls1 <- vector(mode="list", length=np) for (i in 1:np) { pli <- pls[[i]] slot(pli, "ID") <- x[i] pls1[[i]] <- pli } slot(obj, "polygons") <- pls1 obj } setMethod("spChFIDs", signature(obj="SpatialPolygons", x="character"), chFIDsSpatialPolygons) chFIDsSpatialPolygonsDataFrame <- function(obj, x) { SP <- as(obj, "SpatialPolygons") SPx <- spChFIDs(SP, x) df <- as(obj, "data.frame") row.names(df) <- .Call(SpatialPolygons_getIDs_c, SPx) SpatialPolygonsDataFrame(SPx, data=df) } setMethod("spChFIDs", signature(obj="SpatialPolygonsDataFrame", x="character"), chFIDsSpatialPolygonsDataFrame) sp/R/CRS-methods.R0000644000176200001440000000467412602503173013322 0ustar liggesusers# Copyright (c) 2003-8 by Barry Rowlingson and Roger Bivand if (!is.R()) { strsplit <- function(a,b) { if (a == as.character(NA)) return(as.character(NA)) else list(unlist(unpaste(a, b))) } } "CRS" <- function(projargs=NA_character_, doCheckCRSArgs=TRUE) { # cautious change BDR 150424 if (!is.na(projargs) && !nzchar(projargs)) projargs <- NA_character_ # condition added 140301 stopifnot(is.logical(doCheckCRSArgs)) stopifnot(length(doCheckCRSArgs) == 1L) stopifnot(is.character(projargs)) if (!is.na(projargs)) { if (length(grep("^[ ]*\\+", projargs)) == 0) stop(paste("PROJ4 argument-value pairs must begin with +:", projargs)) } if (!is.na(projargs)) { if (length(grep("latlon", projargs)) != 0) stop("northings must follow eastings: ", projargs) if (length(grep("lonlat", projargs)) != 0) { projargs <- sub("lon", "long", projargs) warning("'lonlat' changed to 'longlat': ", projargs) } } if (is.na(projargs)) uprojargs <- projargs else uprojargs <- paste(unique(unlist(strsplit(projargs, " "))), collapse=" ") if (length(grep("= ", uprojargs)) != 0) stop(paste("No spaces permitted in PROJ4 argument-value pairs:", uprojargs)) if (length(grep(" [:alnum:]", uprojargs)) != 0) stop(paste("PROJ4 argument-value pairs must begin with +:", uprojargs)) # if (length(grep("rgdal", search()) > 0) && # (sessionInfo()$otherPkgs$rgdal$Version > "0.4-2")) { # sessionInfo()/read.dcf() problem in loop 080307 if (doCheckCRSArgs) { if (!is.na(uprojargs) && requireNamespace("rgdal", quietly = TRUE)) { res <- rgdal::checkCRSArgs(uprojargs) if (!res[[1]]) stop(res[[2]]) uprojargs <- res[[2]] } } res <- new("CRS", projargs=uprojargs) res } "print.CRS" <- function(x, ...) { pst <- paste(strwrap(x@projargs), collapse="\n") if (nchar(pst) < 40) cat(paste("CRS arguments:", pst, "\n")) else cat(paste("CRS arguments:\n", pst, "\n")) invisible(pst) } setMethod("show", "CRS", function(object) print.CRS(object)) identicalCRS = function(x, y) { if (! missing(y)) identical(CRS(proj4string(x)), CRS(proj4string(y))) else { # x has to be list: stopifnot(is.list(x)) if (length(x) > 1) { p1 = CRS(proj4string(x[[1]])) !any(!sapply(x[-1], function(p2) identical(CRS(proj4string(p2)), p1))) } else TRUE } } sp/R/SpatialGridDataFrame-methods.R0000644000176200001440000004024012671627135016643 0ustar liggesusersSpatialPixelsDataFrame = function(points, data, tolerance = sqrt(.Machine$double.eps), proj4string = CRS(as.character(NA)), round = NULL, grid = NULL) { if (is.null(points)) stop("points argument is NULL") if (is(points, "SpatialPixels") && is.null(grid)) grid = points@grid if (!is(points, "SpatialPoints")) points = SpatialPoints(points, proj4string = proj4string) points = SpatialPixels(points, tolerance = tolerance, round = round, grid = grid) new("SpatialPixelsDataFrame", points, data = data) } SpatialGridDataFrame = function(grid, data, proj4string = CRS(as.character(NA))) { if (!is(grid, "SpatialGrid")) grid = SpatialGrid(grid, proj4string) new("SpatialGridDataFrame", grid, data = data) } setMethod("addAttrToGeom", signature(x = "SpatialPixels", y = "data.frame"), function(x, y, match.ID, ...) SpatialPixelsDataFrame(geometry(x), y, ...) ) setMethod("addAttrToGeom", signature(x = "SpatialGrid", y = "data.frame"), function(x, y, match.ID, ...) SpatialGridDataFrame(geometry(x), y, ...) ) as.SPixDF.SGDF = function(from) { data = list() n = .NumberOfCells(from@grid) for (i in seq(along = from@data)) { v = vector(mode(from@data[[i]]), n) if (is.factor(from@data[[i]])) v = factor(rep(NA, n), levels = levels(from@data[[i]])) else v[-from@grid.index] = NA v[from@grid.index] = from@data[[i]] data[[i]] = v } data = data.frame(data, stringsAsFactors = FALSE) names(data) = names(from@data) SpatialGridDataFrame(from@grid, data, CRS(proj4string(from))) } #setAs("SpatialPixelsDataFrame", "SpatialGridDataFrame", as.SPixDF.SGDF) # Jon Skoien, Apr 18, 2013: # Version where from@data is first added to data, then the columns with # factors are correctly added in a second step. By far the fastest when # there are few factor columns. pix2grid = function(from) { n = .NumberOfCells(from@grid) data = data.frame(matrix(nrow = n, ncol = ncol(from@data))) data[from@grid.index,] = from@data # takes care of character columns names(data) = names(from@data) # Which columns have factors fids = which(sapply(from@data, is.factor)) if (length(fids) > 0) { for (fi in fids) { v = vector(mode(from@data[[fi]]), n) v = factor(rep(NA, n), levels = levels(from@data[[fi]])) v[from@grid.index] = from@data[[fi]] data[,fi] = v } } SpatialGridDataFrame(from@grid, data, CRS(proj4string(from))) } setAs("SpatialPixelsDataFrame", "SpatialGridDataFrame", pix2grid) as.SGDF.SPixDF = function(from) { # find rows with only NA's in attribute table: sel = apply(sapply(from@data, is.na), 1, function(x) !all(x)) #sel = TRUE if (!any(sel)) { warning("complete map seems to be NA's -- no selection was made") sel = rep(TRUE, length(sel)) } #SpatialPixelsDataFrame(points = coordinates(from)[sel,], # data = from@data[sel,,drop=FALSE], proj4string = CRS(proj4string(from))) new("SpatialPixelsDataFrame", new("SpatialPixels", new("SpatialPoints", coords = coordinates(from)[sel,,drop=FALSE], bbox = from@bbox, proj4string = from@proj4string), grid = from@grid, grid.index = which(sel)), data = from@data[sel,,drop=FALSE]) } setAs("SpatialGridDataFrame", "SpatialPixelsDataFrame", as.SGDF.SPixDF) setAs("SpatialGridDataFrame", "SpatialPointsDataFrame", function(from) as(as(from, "SpatialPixelsDataFrame"), "SpatialPointsDataFrame")) setMethod("coordinates", "SpatialPixelsDataFrame", function(obj) coordinates(as(obj, "SpatialPixels"))) setMethod("coordinates", "SpatialGridDataFrame", function(obj) coordinates(as(obj, "SpatialGrid"))) row.names.SpatialGridDataFrame <- function(x) { #warning("row.names order might be wrong!") #1:prod(x@grid@cells.dim) row.names(x@data) } as.SpPixDF.SpPoiDF = function(from) new("SpatialPointsDataFrame", as(from, "SpatialPoints"), data = from@data, coords.nrs = from@coords.nrs) setAs("SpatialPixelsDataFrame", "SpatialPointsDataFrame", as.SpPixDF.SpPoiDF) as.SpatialPolygonsDataFrame.SpatialPixelsDataFrame = function(from) { df <- from@data SP <- as(from, "SpatialPolygons") row.names(df) <- row.names(SP) SpatialPolygonsDataFrame(SP, df) } setAs("SpatialPixelsDataFrame", "SpatialPolygonsDataFrame", as.SpatialPolygonsDataFrame.SpatialPixelsDataFrame) as.matrix.SpatialPixelsDataFrame = function(x, ...) { # fullgrid(x) = TRUE x = as(x, "SpatialGridDataFrame") as.matrix(x, ...) } as.array.SpatialGridDataFrame = function(x,...) { d = gridparameters(x)$cells.dim if (ncol(x@data) > 1) d = c(d, ncol(x@data)) array(do.call(c, x@data), dim = d) } setAs("SpatialGridDataFrame", "array", function(from) as.array.SpatialGridDataFrame(from)) setAs("SpatialPixelsDataFrame", "array", function(from) as(as(from, "SpatialGridDataFrame"), "array")) as.matrix.SpatialGridDataFrame = function(x, ..., byrow = FALSE) { if (ncol(x@data) > 1) warning( "as.matrix.SpatialGridDataFrame uses first column;\n use subset or [] for other columns") if (byrow) matrix(x@data[[1]], x@grid@cells.dim[2], x@grid@cells.dim[1], byrow=byrow) else matrix(x@data[[1]], x@grid@cells.dim[1], x@grid@cells.dim[2], byrow=byrow) } setAs("SpatialPixelsDataFrame", "matrix", function(from) as.matrix.SpatialPixelsDataFrame(from)) setAs("SpatialGridDataFrame", "matrix", function(from) as.matrix.SpatialGridDataFrame(from)) as.data.frame.SpatialPixelsDataFrame = function(x, row.names, optional, ...) as.data.frame(as(x, "SpatialPointsDataFrame")) as.data.frame.SpatialGridDataFrame = function(x, row.names, optional, ...) as.data.frame(as(x, "SpatialPixelsDataFrame")) setAs("SpatialPixelsDataFrame", "data.frame", function(from) as.data.frame.SpatialPixelsDataFrame(from)) setAs("SpatialGridDataFrame", "data.frame", function(from) as.data.frame.SpatialGridDataFrame(from)) setMethod("[", "SpatialPixelsDataFrame", function(x, i, j, ... , drop = FALSE) { grid = x@grid x = as(x, "SpatialPointsDataFrame") missing.i = missing(i) missing.j = missing(j) nargs = nargs() # e.g., a[3,] gives 2 for nargs, a[3] gives 1. if (missing.i && missing.j) { i = TRUE j = TRUE } else if (missing.j && !missing.i) { if (nargs == 2) { j = i i = TRUE } else { j = TRUE } } else if (missing.i && !missing.j) i = TRUE if (is.matrix(i)) stop("matrix argument not supported in SpatialPointsDataFrame selection") if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (any(is.na(i))) stop("NAs not permitted in row index") x@coords = x@coords[i, , drop = FALSE] if (nrow(x@coords)) x@bbox = .bboxCoords(x@coords) x@data = x@data[i, j, ..., drop = FALSE] if (drop) gridded(x) = TRUE else gridded(x) = list(TRUE, grid) x }) #setMethod("[", "SpatialPixelsDataFrame", subs.SpatialPixelsDataFrame) subs.SpatialGridDataFrame <- function(x, i, j, ... , drop = FALSE) { n.args = nargs() dots = list(...) if (drop) stop("argument drop needs to be FALSE") missing.i = missing(i) missing.j = missing(j) if (length(dots) > 0) { missing.k = FALSE k = dots[[1]] } else missing.k = TRUE if (missing.i && missing.j && missing.k) return(x) grd = x@grid if (missing.k) { k = TRUE if (missing.j && n.args != 3) { # not like : x[i,] but x[i] x@data = x@data[ , i, drop = FALSE] return(x) } } else if (missing.j && n.args == 2) { x@data = x@data[ , k, drop = FALSE] return(x) } if (missing.i) rows = 1:grd@cells.dim[2] else { # we have an i if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (is.integer(i)) { if ((length(i) > grd@cells.dim[2] && length(i) < nrow(x@data)) || max(i) > grd@cells.dim[2]) { if (all(i < 0)) { i = -i negate = TRUE } else negate = FALSE i = (1:nrow(x@data)) %in% i if (negate) i = !i } } if (length(i) == nrow(x@data)) { if (!missing.j) x@data = x@data[j] x@data = data.frame(lapply(x@data, function(C) { C[!i] = NA; C })) return(x) } rows = i } if (missing.j) cols = 1:grd@cells.dim[1] else cols = j idx = 1:prod(grd@cells.dim[1:2]) m = matrix(idx, grd@cells.dim[2], grd@cells.dim[1], byrow = TRUE)[rows,cols] idx = as.vector(m) # t(m)? if (any(is.na(idx))) stop("NAs not permitted in index") if (length(idx) == 0) { x@data = x@data[,k,drop=FALSE] x@data[] = NA return(x) } pts = SpatialPoints(coordinates(x)[idx,,drop=FALSE], CRS(proj4string(x))) if (length(idx) == 1) SpatialPointsDataFrame(pts, x@data[idx, k, drop = FALSE]) else { res = SpatialPixelsDataFrame(SpatialPixels(pts), x@data[idx, k, drop = FALSE]) as(res, "SpatialGridDataFrame") } } setMethod("[", "SpatialGridDataFrame", subs.SpatialGridDataFrame) cbind.SpatialGridDataFrame = function(...) { stop.ifnot.equal = function(a, b) { res = all.equal(getGridTopology(a), getGridTopology(b)) if (!is.logical(res) || !res) stop("topology is not equal") } grds = list(...) ngrds = length(grds) if (ngrds < 1) stop("no arguments supplied") if (ngrds == 1) return(grds[[1]]) # verify matching topology: sapply(grds[2:ngrds], function(x) stop.ifnot.equal(x, grds[[1]])) gr = grds[[1]] gr@data = do.call(cbind, lapply(grds, function(x) x@data)) #for (i in 2:ngrds) # gr@data = cbind(gr@data, grds[[i]]@data) proj4string(gr) = CRS(proj4string(grds[[1]])) gr } print.SpatialPixelsDataFrame = function(x, ...) { cat("Object of class SpatialPixelsDataFrame\n") print(as(x, "SpatialPixels")) if (length(x) > 0) { cat("\n") cat("Data summary:\n") if (ncol(x@data) > 0) print(summary(x@data)) } invisible(x) } setMethod("show", "SpatialPixelsDataFrame", function(object) print.SpatialPixelsDataFrame(object)) print.SpatialGridDataFrame = function(x, ...) { cat("Object of class SpatialGridDataFrame\n") print(as(x, "SpatialGrid")) if (length(x) > 0) { cat("\n") cat("Data summary:\n") if (ncol(x@data) > 1) sobj = summary(x@data) else sobj = summary(x@data[[1]]) print(sobj) } invisible(x) } setMethod("show", "SpatialGridDataFrame", function(object) print.SpatialGridDataFrame(object)) names.SpatialPixelsDataFrame = function(x) names(x@data) names.SpatialGridDataFrame = function(x) names(x@data) checkNames = function(x) { if (!identical(x, make.names(x))) warning("attempt to set invalid names: this may lead to problems later on. See ?make.names") } "names<-.SpatialPixelsDataFrame" = function(x,value) { checkNames(value); names(x@data) = value; x } "names<-.SpatialGridDataFrame" = function(x,value) { checkNames(value); names(x@data) = value; x } dim.SpatialPixelsDataFrame = function(x) dim(x@data) dim.SpatialGridDataFrame = function(x) dim(x@data) setMethod("split", "SpatialPixelsDataFrame", split.data.frame) setMethod("geometry", "SpatialGridDataFrame", function(obj) as(obj, "SpatialGrid")) setMethod("geometry", "SpatialPixelsDataFrame", function(obj) as(obj, "SpatialPixels")) setAs("SpatialGridDataFrame", "SpatialPolygonsDataFrame", function(from) { fullgrid(from) = FALSE as(from, "SpatialPolygonsDataFrame") } ) length.SpatialPixelsDataFrame = function(x) { nrow(x@coords) } length.SpatialGridDataFrame = function(x) { .NumberOfCells(x@grid) } # http://menugget.blogspot.de/2013/12/new-version-of-imagescale-function.html #This function creates a color scale for use with the image() #function. Input parameters should be consistent with those #used in the corresponding image plot. The "axis.pos" argument #defines the side of the axis. The "add.axis" argument defines #whether the axis is added (default: TRUE)or not (FALSE). image.scale <- function(z, zlim, col = heat.colors(12), breaks, axis.pos=1, add.axis = TRUE, at = NULL, shrink = 0, ...) { stopifnot(!is.factor(z)) if (!missing(breaks) && length(breaks) != (length(col) + 1)) stop("must have one more break than colour") if (missing(zlim)) zlim <- range(z, na.rm=TRUE) if (missing(breaks)) breaks <- seq(zlim[1], zlim[2], length.out = length(col) + 1) Shrink = function(r, s) { w = diff(r) c(r[1] - 0.5 * s * w, r[2] + 0.5 * s * w) } if (axis.pos %in% c(1,3)) { ylim <- c(0, 1) xlim <- Shrink(range(breaks), shrink) } if (axis.pos %in% c(2,4)) { ylim <- Shrink(range(breaks), shrink) xlim <- c(0, 1) } poly <- vector(mode="list", length(col)) for (i in seq(poly)) poly[[i]] <- c(breaks[i], breaks[i+1], breaks[i+1], breaks[i]) plot(1,1,t="n", ylim = ylim, xlim = xlim, axes = FALSE, xlab = "", ylab = "", xaxs = "i", yaxs = "i", ...) for(i in seq(poly)) { if (axis.pos %in% c(1,3)) polygon(poly[[i]], c(0,0,1,1), col=col[i], border=NA) if (axis.pos %in% c(2,4)) polygon(c(0,0,1,1), poly[[i]], col=col[i], border=NA) } if (shrink > 0) { if (is.null(at)) at = pretty(breaks) b = c(breaks[1], breaks[length(breaks)]) if (axis.pos %in% c(1,3)) lines(y = c(0,1,1,0,0), x = c(b[1],b[1],b[2],b[2],b[1])) if (axis.pos %in% c(2,4)) lines(x = c(0,1,1,0,0), y = c(b[1],b[1],b[2],b[2],b[1])) } else box() if (add.axis) axis(axis.pos, at) } image.scale.factor <- function(z, col = heat.colors(nlevels(z)), axis.pos = 1, scale.frac = 0.3, scale.n = 15, ...) { stopifnot(is.factor(z)) stopifnot(axis.pos %in% c(1,4)) frc = scale.frac stre = scale.n plot(1, 1, t="n", ylim = c(0,1), xlim = c(0,1), axes = FALSE, xlab = "", ylab = "", xaxs = "i", yaxs = "i", ...) n = nlevels(z) if (n != length(col)) stop("# of colors must be equal to # of factor levels") lb = (1:n - 0.5)/max(n, stre) # place of the labels poly <- vector(mode="list", length(col)) breaks = (0:n) / max(n, stre) if (n < stre) { # center breaks = breaks + (stre - n)/(2 * stre) lb = lb + (stre - n)/(2 * stre) } for (i in seq(poly)) poly[[i]] <- c(breaks[i], breaks[i+1], breaks[i+1], breaks[i]) for(i in seq(poly)) { if (axis.pos %in% c(1,3)) polygon(poly[[i]], c(1,1,1-frc,1-frc), col=col[i], border=NA) if (axis.pos %in% c(2,4)) polygon(c(0,0,frc,frc), poly[[i]], col=col[i], border=NA) } b = c(breaks[1], breaks[length(breaks)]) if (axis.pos %in% c(1,3)) { lines(y = c(1,1-frc,1-frc,1,1), x = c(b[1],b[1],b[2],b[2],b[1])) # text(x = 1.05 * frc, y = lb, levels(z), pos = axis.pos) text(y = (1-frc)/1.05, x = lb, levels(z), pos = axis.pos) } if (axis.pos %in% c(2,4)) { lines(x = c(0,frc,frc,0,0), y = c(b[1],b[1],b[2],b[2],b[1])) text(x = 1.05 * frc, y = lb, levels(z), pos = axis.pos) } } plot.SpatialGridDataFrame = function(x, ..., attr = 1, col, breaks, zlim = range(as.numeric(x[[attr]])[is.finite(x[[attr]])]), axes = FALSE, xaxs = "i", yaxs = xaxs, at = NULL, border = NA, axis.pos = 4, add.axis = TRUE, what = "both", scale.size = lcm(2.8), scale.shrink = 0, scale.frac = 0.3, scale.n = 15) { if (missing(col)) { if (is.factor(x[[1]])) col = RColorBrewer::brewer.pal(nlevels(x[[1]]), "Set2") else col = bpy.colors(100) # heat.colors(12) } image.args = list(x = x, col = col, zlim = zlim, axes = axes, xaxs = xaxs, yaxs = yaxs, ...) if (all(c("red", "green", "blue") %in% names(image.args))) # legend off: what = "image" else # plot band 1: image.args$x = x[1] if (!missing(breaks)) image.args$breaks = breaks si = scale.size if (what == "both") switch (axis.pos, layout(matrix(c(2,1), nrow=2, ncol=1), widths=1, heights=c(1,si)), # 1 layout(matrix(c(1,2), nrow=1, ncol=2), widths=c(si,1), heights=1), # 2 layout(matrix(c(1,2), nrow=2, ncol=1), widths=1, heights=c(si,1)), # 3 layout(matrix(c(2,1), nrow=1, ncol=2), widths=c(1,si), heights=1) # 4 ) # scale: if (what %in% c("both", "scale")) { mar = c(1,1,1,1) if (! is.factor(x[[1]])) mar[axis.pos] = 3 if (axes && axis.pos %in% c(2,4)) mar[1] = 3 if (axes && axis.pos %in% c(1,3)) mar[2] = 3 par(mar = mar) if (is.factor(x[[1]])) image.scale.factor(x[[1]], col = col, axis.pos = axis.pos, scale.frac = scale.frac, scale.n = scale.n) else image.scale(x[[1]], zlim = zlim, col = col, breaks = breaks, axis.pos = axis.pos, add.axis = add.axis, at = at, shrink = scale.shrink) # axis(axis.pos) } if (what %in% c("both", "image")) { if (is.factor(x[[1]])) image.args$x[[1]] = as.numeric(x[[1]]) mar=c(1,1,1,1) if (axes) mar[1:2] = 3 par(mar = mar) do.call(image, image.args) if (!is.na(border)) plot(geometry(x), col = border, add = TRUE) } } setMethod("plot", signature(x = "SpatialGridDataFrame", y = "missing"), function(x,y,...) plot.SpatialGridDataFrame(x,...)) setMethod("plot", signature(x = "SpatialPixelsDataFrame", y = "missing"), function(x,y,...) plot.SpatialGridDataFrame(x,...)) sp/R/zerodist.R0000644000176200001440000000306612577541412013100 0ustar liggesuserszerodist <- function(obj, zero = 0.0, unique.ID = FALSE, memcmp = TRUE) { if (!extends(class(obj), "SpatialPoints")) stop("obj should be of, or extend, class SpatialPoints") lonlat = as.integer(!is.na(is.projected(obj)) && !is.projected(obj)) cc = coordinates(obj) cmp = as.integer(memcmp) if (unique.ID) # return unique IDs only, not all zero dist pairs .Call(sp_duplicates, as.vector(t(cc)), ncol(cc), zero, lonlat, cmp) + 1 else matrix(.Call(sp_zerodist, as.vector(t(cc)), ncol(cc), zero, lonlat, cmp), ncol = 2, byrow = TRUE) + 1 } zerodist2 <- function (obj1, obj2, zero = 0, memcmp = TRUE) { if (!(extends(class(obj1), "SpatialPoints") && extends(class(obj2), "SpatialPoints"))) stop("obj1 and obj2 should be of, or extend, class SpatialPoints") stopifnot(identicalCRS(obj1, obj2)) lonlat = as.integer(!is.na(is.projected(obj1)) && !is.projected(obj1)) cmp = as.integer(memcmp) cc1 = coordinates(obj1) cc2 = coordinates(obj2) n = nrow(cc1) cc = rbind(cc1, cc2) ret = matrix(.Call(sp_zerodist, as.vector(t(cc)), ncol(cc), zero, lonlat, cmp), ncol = 2, byrow = TRUE) + 1 ret = ret[ret[,1] <= n & ret[,2] > n, , drop=FALSE] ret[,2] = ret[,2] - n ret } remove.duplicates <- function(obj, zero = 0.0, remove.second = TRUE, memcmp = TRUE) { if (! remove.second) obj = obj[length(obj):1,] zd = zerodist(obj, zero, unique.ID = TRUE, memcmp = memcmp) uq = zd == (1:length(obj)) if (any(!uq)) { # if any non-unique points obj = obj[uq,] # select the unique ones if (! remove.second) obj = obj[length(obj):1,] } obj } sp/R/aggregate.R0000644000176200001440000000756212676063763013200 0ustar liggesusersaggregate.data.frame.SP <- function (x, by, FUN, ..., dissolve = TRUE) { # EP added: stopifnot(is(x, "Spatial")) stopifnot("data" %in% slotNames(x)) geom = geometry(x) x = x@data stopifnot(NROW(x) > 0L) stopifnot(NCOL(x) > 0L) FUN <- match.fun(FUN) # next: fragment taken from stats::aggregate.data.frame, in # R 3.2.4, svn 70336, to find grp if (!is.list(by)) stop("'by' must be a list") if (is.null(names(by)) && length(by)) names(by) <- paste("Group", seq_along(by), sep = ".") else { nam <- names(by) ind <- which(!nzchar(nam)) names(by)[ind] <- paste("Group", ind, sep = ".") } nrx <- NROW(x) # if (any(lengths(by) != nrx)) if (any(sapply(by, length) != nrx)) stop("arguments must have same length") y <- as.data.frame(by, stringsAsFactors = FALSE) keep <- complete.cases(by) y <- y[keep, , drop = FALSE] x <- x[keep, , drop = FALSE] nrx <- NROW(x) ident <- function(x) { y <- as.integer(as.factor(x)) z <- gsub(" ", "0", format(y, scientific = FALSE)) return(z) } grp <- if (ncol(y)) { grp <- lapply(rev(y), ident) names(grp) <- NULL do.call(paste, c(grp, list(sep = "."))) } else integer(nrx) # let aggregate.data.frame do the attribute work: y = aggregate(x, by, FUN, ..., simplify = TRUE) # original would now return y; I added: if (dissolve) { # dissolve/merge: if (!gridded(geom) && is(geom, "SpatialPoints")) geom = split(geom, factor(grp)) # creates SpatialMultiPoints else { if (!requireNamespace("rgeos", quietly = TRUE)) stop("rgeos required") if (is(geom, "SpatialLines")) geom = rgeos::gLineMerge(geom, grp) else { if (gridded(geom)) geom = as(geom, "SpatialPolygons") geom = rgeos::gUnaryUnion(geom, grp) } } } else y = y[as.integer(factor(grp)),,drop=FALSE] # repeat addAttrToGeom(geom, y, match.ID = FALSE) } aggregate.Spatial = function(x, by = list(ID = rep(1, length(x))), FUN, ..., dissolve = TRUE, areaWeighted = FALSE) { if (is(by, "Spatial")) { # maybe better do S4 method dispatch? by0 = by if (gridded(by)) by = as(by, "SpatialPolygons") if (is(x, "SpatialPolygonsDataFrame") && is(by, "SpatialPolygons") && areaWeighted) { if (!missing(FUN)) warning("argument FUN is ignored in area-weighted aggregation, see documentation") df = aggregatePolyWeighted(x, by) } else { FUN <- match.fun(FUN) df = over(by, x, fn = FUN, ...) } addAttrToGeom(by0, df, match.ID = FALSE) } else aggregate.data.frame.SP(x, by, FUN, ..., dissolve = dissolve) } aggregatePolyWeighted = function(x, by) { if (!requireNamespace("rgeos", quietly = TRUE)) stop("rgeos required") i = rgeos::gIntersection(x, by, byid = TRUE, drop_lower_td = TRUE) area = sapply(i@polygons, function(x) slot(x, name = "area")) ids.i = sapply(i@polygons, function(x) slot(x, name = "ID")) IDs = strsplit(ids.i, " ") # IDs, as list if (any(sapply(IDs, length) != 2)) # sanity check: stop("IDs contain spaces: this breaks identification after gIntersection()") grp = do.call(rbind, IDs) # IDs matrix; col 1 = x, col 2 = by obs = x[grp[, 1], ]@data # match by IDs of x: get the attributes to aggregate if (all(sapply(obs, is.factor))) { # find level with largest area ... obs$aReA = area spl = split(obs, grp[,2]) # grouped by `by' ret = do.call(rbind, lapply(spl, function(x) x[which.max(x$aReA),])) # take mode ret$aReA = NULL # clean up ret[match(row.names(by), row.names(ret)), , drop=FALSE] # match to by's order } else { if(any(sapply(obs, is.factor))) warning("for factor aggregation, provide factor only data") x_area = data.frame(lapply(obs, function(x) x * area)) agg = aggregate(data.frame(area, x_area), list(grp[,2]), sum) ret = data.frame(lapply(agg[-(1:2)], function(x) x / agg$area)) ret[match(row.names(by), agg$Group.1), , drop=FALSE] } } sp/R/Class-SpatialMultiPointsDataFrame.R0000644000176200001440000000063712577541412017653 0ustar liggesuserssetClass("SpatialMultiPointsDataFrame", contains = "SpatialMultiPoints", slots = c(data = "data.frame"), prototype = list(bbox = matrix(NA), proj4string = CRS(as.character(NA)), coords = list(), data = data.frame()), validity = function(object) { if (nrow(object@data) != length(object@coords)) return("number of rows in data.frame and point sets in SpatialMultiPoints don't match") return(TRUE) } ) sp/R/compassRose.R0000644000176200001440000000131112577541412013522 0ustar liggesuserscompassRose<-function(x,y,rot=0,cex=1) { oldcex<-par(cex=cex) mheight<-strheight("M") xylim<-par("usr") plotdim<-par("pin") xmult<-(xylim[2]-xylim[1])/(xylim[4]-xylim[3])*plotdim[2]/plotdim[1] point.angles<-seq(0,2*pi,by=pi/4)+pi*rot/180 crspans<-rep(c(mheight*3,mheight/2),length.out=9) xpoints<-cos(point.angles)*crspans*xmult+x ypoints<-sin(point.angles)*crspans+y for(point in 1:8) { pcol<-ifelse(point%%2,"black","white") polygon(c(xpoints[c(point,point+1)],x),c(ypoints[c(point,point+1)],y),col=pcol) } txtxpoints<-cos(point.angles[c(1,3,5,7)])*1.2*crspans[1]*xmult+x txtypoints<-sin(point.angles[c(1,3,5,7)])*1.2*crspans[1]+y text(txtxpoints,txtypoints,c("E","N","W","S")) par(oldcex) } sp/R/Class-CRS.R0000644000176200001440000000041612577541412012723 0ustar liggesusers# Copyright (c) 2003-7 by Barry Rowlingson and Roger Bivand setClass("CRS", slots = c(projargs = "character"), prototype = list(projargs = character(1)), validity = function(object) { if (length(object@projargs) != 1) return("projargs must be of length 1") } ) sp/R/Class-SpatialPointsDataFrame.R0000644000176200001440000000131512577541412016632 0ustar liggesuserssetClass("SpatialPointsDataFrame", contains = "SpatialPoints", slots = c(data = "data.frame", coords.nrs = "numeric"), prototype = list(bbox = matrix(NA), proj4string = CRS(as.character(NA)), coords = matrix(NA), data = data.frame(), coords.nrs = numeric(0)), validity = function(object) { # if (ncol(object@data) == 0) # stop("data.frame is empty (possibly after stripping coordinate columns): use SpatialPoints() to create points-only object") if (nrow(object@data) != nrow(object@coords)) return("number of rows in data.frame and SpatialPoints don't match") n <- length(object@coords.nrs) if (n > 0 && n != ncol(object@coords)) return("inconsistent coords.nrs slot") return(TRUE) } ) sp/R/Class-SpatialLinesDataFrame.R0000644000176200001440000000064512577541412016435 0ustar liggesuserssetClass("SpatialLinesDataFrame", contains = "SpatialLines", slots = c(data = "data.frame"), validity = function(object) { if (!inherits(object@data, "data.frame")) stop("data should be of class data.frame") if (nrow(object@data) != length(object@lines)) stop("number of rows in data.frame and SpatialLines don't match") return(TRUE) } ) as.SpatialLines.SLDF <- function(SLDF) SpatialLines(SLDF@lines) sp/R/SpatialPolygonsDataFrame-methods.R0000644000176200001440000001234012635110347017560 0ustar liggesusersSpatialPolygonsDataFrame <- function(Sr, data, match.ID = TRUE) { # Barry comment 110610 if (length(Sr@polygons) != nrow(data)) stop(paste("Object length mismatch:\n ", deparse(substitute(Sr)), "has", length(Sr@polygons), "Polygons objects, but", deparse(substitute(data)), "has", nrow(data), "rows", sep=" ")) if (is.character(match.ID)) { row.names(data) = data[, match.ID[1]] match.ID = TRUE } if (match.ID) { # Sr_IDs <- sapply(slot(Sr, "polygons"), # function(i) slot(i, "ID")) Sr_IDs <- .Call(SpatialPolygons_getIDs_c, Sr) data_IDs <- row.names(data) mtch <- match(Sr_IDs, data_IDs) if (!identical(Sr_IDs, data_IDs)) { if (any(is.na(mtch))) stop("row.names of data and Polygons IDs do not match") if (length(unique(mtch)) != length(Sr_IDs)) stop("row.names of data and Polygons IDs do not match") data <- data[mtch, , drop = FALSE] } } res <- new("SpatialPolygonsDataFrame") res@bbox <- Sr@bbox res@proj4string <- Sr@proj4string res@plotOrder <- Sr@plotOrder res@data <- data res@polygons <- Sr@polygons # 120416 add top-level comment to reduce comment checking cSr <- comment(Sr) if (is.null(cSr)) comment(res) <- as.character(any(sapply(slot(res, "polygons"), function(x) !is.null(comment(x))), na.rm=TRUE)) else { if (!is.character(cSr) || is.na(cSr) || length(cSr) != 1) cSr <- as.character(any(sapply(slot(res, "polygons"), function(x) !is.null(comment(x))), na.rm=TRUE)) comment(res) <- cSr } res } setReplaceMethod("polygons", signature(object = "data.frame", value = "SpatialPolygons"), function(object, value) SpatialPolygonsDataFrame(value, object)) setMethod("polygons", signature(obj = "SpatialPolygons"), function(obj) as(obj, "SpatialPolygons")) setMethod("addAttrToGeom", signature(x = "SpatialPolygons", y = "data.frame"), function(x, y, match.ID, ...) SpatialPolygonsDataFrame(x, y, match.ID = match.ID, ...) ) names.SpatialPolygonsDataFrame = function(x) names(x@data) "names<-.SpatialPolygonsDataFrame" = function(x,value) { checkNames(value); names(x@data) = value; x } as.data.frame.SpatialPolygonsDataFrame = function(x, row.names, optional, ...) x@data setAs("SpatialPolygonsDataFrame", "data.frame", function(from) as.data.frame.SpatialPolygonsDataFrame(from)) row.names.SpatialPolygonsDataFrame <- function(x) { .Call(SpatialPolygons_getIDs_c, x) } "row.names<-.SpatialPolygonsDataFrame" <- function(x, value) { spChFIDs(x, value) } setMethod("[", "SpatialPolygonsDataFrame", function(x, i, j, ... , drop = TRUE) { missing.i = missing(i) missing.j = missing(j) nargs = nargs() # e.g., a[3,] gives 2 for nargs, a[3] gives 1. if (missing.i && missing.j) { i = TRUE j = TRUE } else if (missing.j && !missing.i) { if (nargs == 2) { j = i i = TRUE } else { j = TRUE } } else if (missing.i && !missing.j) i = TRUE if (is.matrix(i)) stop("matrix argument not supported in SpatialPolygonsDataFrame selection") if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (any(is.na(i))) stop("NAs not permitted in row index") if (is.logical(i)) { if (length(i) == 1 && i) i = 1:length(x@polygons) else i <- which(i) } if (is.character(i)) i <- match(i, row.names(x)) #SpatialPolygonsDataFrame(as(x, "SpatialPolygons")[i, , drop = FALSE], # data = x@data[i, j, drop = FALSE], match.ID = FALSE) y <- new("SpatialPolygonsDataFrame") y@proj4string <- x@proj4string y@data = x@data[i, j, ..., drop = FALSE] y@polygons = x@polygons[i] # x@bbox <- .bboxCalcR(x@polygons) if (length(i) > 0) { y@bbox <- .Call(bboxCalcR_c, y@polygons) if (is.numeric(i) && i < 0) { # area <- sapply(x@polygons, function(y) y@area) # x@plotOrder <- as.integer(order(area, decreasing=TRUE)) y@plotOrder <- .Call(SpatialPolygons_plotOrder_c, y@polygons) } else { y@plotOrder = order(match(i, x@plotOrder)) } } else y@bbox = x@bbox y ### ### RSB: do something with labelpoints here? How can I check they are present? ### (label points belong to the Polygons objects, not the SpatialPolygons object) }) setAs("SpatialPolygonsDataFrame", "SpatialLinesDataFrame", function(from) SpatialLinesDataFrame(as(from, "SpatialLines"), from@data, match.ID = FALSE)) dim.SpatialPolygonsDataFrame = function(x) dim(x@data) setMethod("split", "SpatialPolygonsDataFrame", split.data.frame) setMethod("geometry", "SpatialPolygonsDataFrame", function(obj) as(obj, "SpatialPolygons")) length.SpatialPolygonsDataFrame = function(x) { length(x@polygons) } # RSB 151030 override default coerce to preserve top-level comment setAs("SpatialPolygonsDataFrame", "SpatialPolygons", function(from) { value <- new("SpatialPolygons") for (what in c("polygons", "plotOrder", "bbox", "proj4string" )) slot(value, what) <- slot(from, what) if (!is.null(comment(from))) comment(value) <- comment(from) value } ) sp/R/sp_spat1.R0000644000176200001440000000557112647453554013001 0ustar liggesusers# sp functions: if (!isClass("ppp")) setOldClass("ppp") if (!isClass("psp")) setOldClass("psp") if (!isClass("owin")) setOldClass("owin") if (!isClass("im")) setOldClass("im") if (!isClass("deldir")) setOldClass("deldir") as.SpatialPoints.ppp = function(from) { mult <- 1 if (!is.null(from$window$units) && !is.null(from$window$units$multiplier)) mult <- from$window$units$multiplier mx <- mult*from$x storage.mode(mx) <- "double" my <- mult*from$y storage.mode(my) <- "double" crds <- cbind(mx, my) if (from$window$type == "rectangle") { ow <- from$window bbox <- rbind(mult*as.double(ow$xrange), mult*as.double(ow$yrange)) colnames(bbox) <- c("min", "max") } else bbox <- NULL SpatialPoints(coords=crds, bbox=bbox) } setAs("ppp", "SpatialPoints", as.SpatialPoints.ppp) as.SpatialPointsDataFrame.ppp = function(from) { SP <- as(from, "SpatialPoints") SpatialPointsDataFrame(SP, data.frame(marks = from$marks)) } setAs("ppp", "SpatialPointsDataFrame", as.SpatialPointsDataFrame.ppp) as.SpatialGridDataFrame.ppp = function(from) { w = from$window if (w$type != "mask") stop("window is not of type mask") offset = c(w$xrange[1] + 0.5 * w$xstep, w$yrange[1] + 0.5 * w$ystep) cellsize = c(diff(w$xrange)/w$dim[2], diff(w$yrange)/w$dim[1]) dim = c(w$dim[2], w$dim[1]) gt = GridTopology(offset, cellsize, dim) m = t(w$m[nrow(w$m):1,]) m[!m] = NA data = data.frame(mask = as.vector(m)) SpatialGridDataFrame(gt, data) } setAs("ppp", "SpatialGridDataFrame", as.SpatialGridDataFrame.ppp) as.SpatialGridDataFrame.im = function(from) { offset = c(from$xrange[1] + 0.5 * from$xstep, from$yrange[1] + 0.5 * from$ystep) cellsize = c(diff(from$xrange)/from$dim[2], diff(from$yrange)/from$dim[1]) dim = c(from$dim[2], from$dim[1]) gt = GridTopology(offset, cellsize, dim) m = t(from$v[nrow(from$v):1,]) data = data.frame(v = as.vector(m)) SpatialGridDataFrame(gt, data) } setAs("im", "SpatialGridDataFrame", as.SpatialGridDataFrame.im) #as.im.SpatialGridDataFrame = function(from) { # require(spatstat) # xi <- sp:::as.image.SpatialGridDataFrame(from) # im(t(xi$z), xcol=xi$x, yrow=xi$y) #} #setAs("SpatialGridDataFrame", "im", as.im.SpatialGridDataFrame) setAs("deldir", "SpatialPolygons", function(from) { cc = cbind(from$summary$x, from$summary$y) if (!requireNamespace("deldir", quietly = TRUE)) stop("package deldir required") tm = deldir::triMat(from) fn = function(i) Polygons(list(Polygon(rbind(cc[tm[c(i, i[1]),], ]))), i) SpatialPolygons(lapply(1:nrow(tm), fn), proj4string = from@proj4string) }) setAs("deldir", "SpatialLines", function(from) { cc = cbind(from$summary$x, from$summary$y) segs = from$delsgs fn = function(i) Lines(list(Line(cc[c(segs[i, 5], segs[i, 6]), ])), i) SpatialLines(lapply(1:nrow(segs), fn), proj4string = from@proj4string) }) sp/R/recenter.R0000644000176200001440000000342212577541412013040 0ustar liggesusersif (!isGeneric("recenter")) setGeneric("recenter", function(obj) standardGeneric("recenter")) recenter.SpatialPolygons <- function(obj) { proj <- is.projected(obj) if (is.na(proj)) stop("unknown coordinate reference system") if (proj) stop("cannot recenter projected coordinate reference system") projargs <- CRS(proj4string(obj)) pls <- slot(obj, "polygons") Srl <- lapply(pls, recenter.Polygons) res <- SpatialPolygons(Srl, proj4string=projargs) res } setMethod("recenter", "SpatialPolygons", recenter.SpatialPolygons) recenter.Polygons <- function(obj) { ID <- slot(obj, "ID") rings <- slot(obj, "Polygons") srl <- lapply(rings, recenter.Polygon) res <- Polygons(srl, ID=ID) res } recenter.Polygon <- function(obj) { crds <- slot(obj, "coords") hole <- slot(obj, "hole") inout <- (crds[,1] < 0) if (all(inout)) { crds[,1] <- crds[,1]+360 } else { if (any(inout)) { crds[,1] <- ifelse(inout, crds[,1]+360, crds[,1]) } } res <- Polygon(crds, hole) res } recenter.SpatialLines <- function(obj) { proj <- is.projected(obj) if (is.na(proj)) stop("unknown coordinate reference system") if (proj) stop("cannot recenter projected coordinate reference system") projargs <- CRS(proj4string(obj)) lns <- slot(obj, "lines") Sll <- lapply(lns, recenter.Lines) res <- SpatialLines(Sll, projargs) res } setMethod("recenter", "SpatialLines", recenter.SpatialLines) recenter.Lines <- function(obj) { ID <- slot(obj, "ID") lines <- slot(obj, "Lines") sll <- lapply(lines, recenter.Line) res <- Lines(sll, ID=ID) res } recenter.Line <- function(obj) { crds <- coordinates(obj) inout <- (crds[,1] < 0) if (all(inout)) { crds[,1] <- crds[,1]+360 } else { if (any(inout)) { crds[,1] <- ifelse(inout, crds[,1]+360, crds[,1]) } } res <- Line(crds) res } sp/R/Class-SpatialGridDataFrame.R0000644000176200001440000000127012577541412016243 0ustar liggesuserssetClass("SpatialPixelsDataFrame", contains = c("SpatialPixels", "SpatialPointsDataFrame"), slots = c(data = "data.frame", coords.nrs = "numeric"), validity = function(object) { if (length(object@grid.index) != nrow(object@data)) return("grid.index should have length equal to data slot") if (nrow(object@coords) != nrow(object@data)) return("unequal number of objects in points and data.frame") return(TRUE) } ) setClass("SpatialGridDataFrame", contains = "SpatialGrid", slots = c(data = "data.frame"), validity = function(object) { if (.NumberOfCells(object@grid) != nrow(object@data)) return("unequal number of objects in full grid and data slot") return(TRUE) } ) sp/R/gridlines.R0000644000176200001440000000432012655675773013226 0ustar liggesusersdegreeLabelsNS = function(x) { pos = sign(x) + 2 dir = c("*S", "", "*N") paste0(abs(x), "*degree", dir[pos]) } degreeLabelsEW = function(x) { x <- ifelse(x > 180, x - 360, x) pos = sign(x) + 2 if (any(x == -180)) pos[x == -180] = 2 if (any(x == 180)) pos[x == 180] = 2 dir = c("*W", "", "*E") paste0(abs(x), "*degree", dir[pos]) } gridlines = function(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), ndiscr = 100) { if (missing(x)) { if (missing(easts) && missing(norths)) { easts = seq(-180, 180, 20) norths = seq(-80, 80, 20) bb = matrix(c(-180, 180, -90, 90), 2, 2, byrow = TRUE) } crs = CRS("+init=epsg:4326") } else { bb = bbox(x) crs = CRS(proj4string(x)) easts <- easts[easts >= bb[1,1] & easts <= bb[1,2]] norths <- norths[norths >= bb[2,1] & norths <= bb[2,2]] } #easts <- easts[easts > bb[1,1] & easts < bb[1,2]] eastlist <- vector(mode="list", length=length(easts)) for (i in 1:length(easts)) eastlist[[i]] <- Line(cbind(rep(easts[i], ndiscr), seq(bb[2,1], bb[2,2], length.out=ndiscr))) #norths <- norths[norths > bb[2,1] & norths < bb[2,2]] northlist <- vector(mode="list", length=length(norths)) for (i in 1:length(norths)) northlist[[i]] <- Line(cbind(seq(bb[1,1], bb[1,2], length.out=ndiscr), rep(norths[i], ndiscr))) SpatialLines(list(Lines(northlist, "EW"), Lines(eastlist, "NS")), crs) } gridat <- function(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), offset=0.5, side="WS") { isp = is.projected(x) if (is.na(isp) || isp) stop("x must not be projected") bb = bbox(x) ac <- ifelse (side == "WS", 1L, 2L) easts <- easts[easts > bb[1,1] & easts < bb[1,2]] norths <- norths[norths > bb[2,1] & norths < bb[2,2]] a1 <- cbind(easts, rep(bb[2,ac], length(easts))) a1lab <- degreeLabelsEW(a1[,1]) a2 <- cbind(rep(bb[1,ac], length(norths)), norths) a2lab <- degreeLabelsNS(a2[,2]) as <- SpatialPoints(rbind(a1, a2), CRS(proj4string(x))) res <- SpatialPointsDataFrame(as, data.frame(labels = c(a1lab, a2lab), pos = c(rep(1L+((ac-1)*2), length(easts)), rep(2L+((ac-1)*2), length(norths))), offset = rep(offset, length(easts)+length(norths)), stringsAsFactors = FALSE ) ) res } sp/R/select.spatial.R0000644000176200001440000000110612577541412014141 0ustar liggesusers"select.spatial" <- function(data, digitize = TRUE, pch = "+", rownames = FALSE) { if (!is(data, "SpatialPoints")) stop("data should be of, or extend, class SpatialPoints") x = coordinates(data)[, 1] y = coordinates(data)[, 2] plot(x, y, pch = pch, asp = 1) if (rownames && is(data, "SpatialPointsDataFrame")) labels = row.names(as.data.frame(data)) else labels = 1:length(x) if (digitize) { pol = locator(n = 512, type = "o") sel = 1:length(x) sel = sel[point.in.polygon(x, y, pol$x, pol$y) > 0] } else sel = identify(x, y, labels = labels) labels[sel] } sp/R/Class-SpatialPolygons.R0000644000176200001440000001015712577541412015427 0ustar liggesuserssetClass("Polygon", contains = "Line", slots = c(labpt = "numeric", area = "numeric", hole = "logical", ringDir = "integer"), validity = function(object) { res <- .Call(Polygon_validate_c, object) res # coords <- object@coords # start <- coords[1,] # final <- coords[nrow(coords),] # if (!identical(start, final)) # return("ring not closed") # if (any(!is.finite(object@labpt))) # return("infinite label point") # return(TRUE) } ) setClass("Polygons", slots = c(Polygons = "list", plotOrder = "integer", labpt = "numeric", ID = "character", area = "numeric"), validity = function(object) { res <- .Call(Polygons_validate_c, object) res # if (any(sapply(object@Polygons, function(x) !is(x, "Polygon")))) # return("not a list of Polygon objects") # if (length(object@Polygons) != length(object@plotOrder)) # return("plotOrder and Polygons differ in length") # if (any(!is.finite(object@labpt))) # return("infinite label point") # return(TRUE) } ) setClass("SpatialPolygons", contains = "Spatial", slots = c(polygons = "list", plotOrder = "integer"), validity = function(object) { # if (length(object@polygons) != length(object@plotOrder)) # return("length mismatch") # if (any(unlist(lapply(object@polygons, function(x) # !is(x, "Polygons"))))) # return("polygons not Polygons objects") # pls <- slot(object, "polygons") # IDs <- sapply(pls, slot, "ID") IDs <- .Call(SpatialPolygons_getIDs_c, object) if (anyDuplicated(IDs)) return("non-unique Polygons ID slot values") res <- .Call(SpatialPolygons_validate_c, object) res # if (length(object@polygons) != # length(unique(sapply(slot(object, "polygons"), # function(i) slot(i, "ID"))))) # return("non-unique Polygons ID slot values") # return(TRUE) } ) getPolygonCoordsSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@coords } getPolygonLabptSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@labpt } getPolygonAreaSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@area } getPolygonHoleSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@hole } getPolygonsPolygonsSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@Polygons } getPolygonsplotOrderSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@plotOrder } getPolygonsLabptSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@labpt } getPolygonsIDSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@ID } getSpPpolygonsSlot <- function(SpP) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") SpP@polygons } getSpPplotOrderSlot <- function(SpP) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") SpP@plotOrder } getSpPPolygonsLabptSlots <- function(SpP) { .Deprecated("coordinates", msg="use coordinates method", package = "sp") Srs <- slot(SpP, "polygons") t(sapply(Srs, function(i) slot(i, "labpt"))) } getSpPPolygonsIDSlots <- function(SpP) { .Deprecated("coordinates", msg="use *apply and slot directly", package = "sp") Srs <- slot(SpP, "polygons") sapply(Srs, function(i) slot(i, "ID")) } getSpPnParts <- function(SpP) { .Deprecated("coordinates", msg="use *apply and slot directly", package = "sp") Srs <- slot(SpP, "polygons") sapply(Srs, function(x) length(slot(x, "Polygons"))) } getSpPnHoles <- function(SpP) { .Deprecated("coordinates", msg="use *apply and slot directly", package = "sp") Srs <- slot(SpP, "polygons") sapply(Srs, function(x) sapply(slot(x, "Polygons"), function(y) slot(y, "hole"))) } sp/R/Class-Spatial.R0000644000176200001440000000341412635747534013702 0ustar liggesusers# Lancaster, Thu Nov 4 14:44:00 GMT 2004, fresh start from icelfloe setClass("Spatial", slots = c(bbox = "matrix", proj4string = "CRS"), validity = function(object) { # print("Entering validation: Spatial") bb = bbox(object) if (!is.matrix(bb)) return("bbox should be a matrix") if (!mode(bb) == "numeric") return("bbox should be a numeric matrix") n = dimensions(object) if (n < 2) return("spatial.dimension should be 2 or more") if (any(is.na(bb))) return("bbox should never contain NA values") if (any(!is.finite(bb))) return("bbox should never contain infinite values") if (any(bb[,"max"] < bb[,"min"])) return("invalid bbox: max < min") if (!is(object@proj4string, "CRS")) return("proj4string slot should be of class CRS") p4str <- object@proj4string@projargs if (!is.na(p4str) && !nzchar(p4str)) { res <- grep("longlat", p4str, fixed=TRUE) if (length(res) != 0) {# unprojected, ll_sanity_res <- .ll_sanity(bb) if (!ll_sanity_res) { lst <- sapply(attr(ll_sanity_res, "details"), attr, "out") out <- paste(format(unlist(lst), digits=12), collapse=" ") mess <- paste("Geographical CRS given to", "non-conformant data:", out) if (get_ll_warn()) warning(mess) else stop(mess) } } # split out from proj4string<- and Spatial validity to cover numerical fuzz # RSB 070216 # && any(bb[1,1] < -180 || bb[1,2] > 360 || # bb[2,1] < -90 || bb[2,2] > 90)) # return("Geographical CRS given to non-conformant data") } # validate proj4string here? -- no, that's rdgal's business return(TRUE) } ) sp/R/dms.R0000644000176200001440000000555512577541412012025 0ustar liggesuserssetClass("DMS", #slots = c(WS="logical", deg="numeric", min="numeric", sec="numeric", NS="logical"), representation(WS="logical", deg="numeric", min="numeric", sec="numeric", NS="logical"), validity = function(object) { if (object@NS) { if (any(abs(object@deg) > 90)) return("abs(degree) > 90") } else { if (any(abs(object@deg) > 360)) return("abs(degree) > 360") else if (any(object@WS & (object@deg > 180))) return("degree < -180") else return(TRUE) } } ) "dd2dms" <- function(dd, NS=FALSE) { sdd <- sign(dd) WS <- ifelse(sdd < 0, TRUE, FALSE) dd <- abs(dd) deg <- as(floor(dd), "integer") dd <- (dd - deg)*60 mins <- as(floor(dd), "integer") sec <- (dd - mins)*60 tst <- abs(sec - 60.0) > sqrt(.Machine$double.eps) sec <- ifelse(tst, sec, 0.0) mins <- ifelse(tst, mins, mins+1) tst <- mins < 60 mins <- ifelse(tst, mins, 0) deg <- ifelse(tst, deg, deg+1) dms <- new("DMS", WS=WS, deg=deg, min=mins, sec=sec, NS=NS) tst <- validObject(dms) if (is.logical(tst) & tst) return(dms) else stop(tst) dms } as.double.DMS <- function(x, ...) { dd <- x@deg + x@min/60 + x@sec/3600 dd <- ifelse(x@WS, -dd, dd) dd } as.numeric.DMS <- function(x, ...) { if (!inherits(x, "DMS")) stop("not a DMS object") as.double.DMS(x) } setAs("DMS", "numeric", function(from) as.numeric.DMS(from)) as.character.DMS <- function(x, ...) { if (!inherits(x, "DMS")) stop("not a DMS object") if (!x@NS) tag <- c("W", "E") else tag <- c("S", "N") res <- ifelse(x@WS, tag[1], tag[2]) res <- paste(ifelse(round(x@sec, digits=3) != "0", paste(round(x@sec, digits=3), '\"', sep=""), ""), res, sep="") res <- paste(ifelse(((x@min != 0) | (round(x@sec, digits=3) != "0")), paste("d", x@min, "\'", sep=""), ""), res, sep="") res <- paste(x@deg, res, sep="") invisible(res) } setAs("DMS", "character", function(from) as.character.DMS(from)) "print.DMS" <- function(x, ...) { res <- as(x, "character") print(res, quote=FALSE) invisible(res) } setMethod("show", "DMS", function(object) print.DMS(object)) "char2dms" <- function(from, chd="d", chm="'", chs='"') { x <- substr(from, nchar(from), nchar(from)) NS <- any(x == "N" | x == "S") y <- substr(from, 1, nchar(from)-1) ndeg <- regexpr(chd, y) nmin <- regexpr(chm, y) nsec <- regexpr(chs, y) deg <- as(substr(y, 1, ndeg-1), "integer") smin <- substr(y, ndeg+1, nmin-1) dotmin <- regexpr("\\.", smin) ifelse (dotmin < 0, { mins <- as(ifelse(nmin < 1, 0, smin), "integer") sec <- as(ifelse(nsec < 1, 0, substr(y, nmin+1, nsec-1)), "numeric") }, { mins <- as(ifelse(nmin < 1, 0, smin), "integer") sec <- (as(smin, "numeric") - mins) * 60 }) WS <- ifelse(x == "W" | x == "S", TRUE, FALSE) dms <- new("DMS", WS=WS, deg=deg, min=mins, sec=sec, NS=NS) tst <- validObject(dms) if (is.logical(tst) & tst) return(dms) else stop(tst) dms } sp/R/SpatialPolygons-internals.R0000644000176200001440000001114312577541412016355 0ustar liggesusers .shp2srs <- function(shp, nParts#, proj4string=CRS(as.character(NA)) ) { Pstart <- shp$Pstart nVerts <- nrow(shp$verts) from <- integer(nParts) to <- integer(nParts) from[1] <- 1 for (j in 1:nParts) { if (j == nParts) to[j] <- nVerts else { to[j] <- Pstart[j+1] from[j+1] <- to[j]+1 } } srl <- vector(mode="list", length=nParts) for (j in 1:nParts) { srl[[j]] <- Polygon(coords=shp$verts[from[j]:to[j],]#, proj4string=proj4string ) } srl } nParts.shp <- function(shp) attr(shp, "nParts") .NAmat2xyList <- function(xy) { NAs <- unclass(attr(na.omit(xy), "na.action")) if ((length(NAs) == 1) && (NAs == nrow(xy))) { xy <- xy[-nrow(xy)] NAs <- NULL } nParts <- length(NAs) + 1 res <- vector(mode="list", length=nParts) from <- integer(nParts) to <- integer(nParts) from[1] <- 1 to[nParts] <- nrow(xy) if (nParts > 1) { for (i in 2:nParts) { to[(i-1)] <- NAs[(i-1)]-1 from[i] <- NAs[(i-1)]+1 } } for (i in 1:nParts) res[[i]] <- xy[from[i]:to[i],, drop = FALSE] res } .ringDirxy <- function(xy) { a <- xy[,1] b <- xy[,2] nvx <- length(b) if((a[1] == a[nvx]) && (b[1] == b[nvx])) { a <- a[-nvx] b <- b[-nvx] nvx <- nvx - 1 } if (nvx < 3) return(1) tX <- 0.0 dfYMax <- max(b) ti <- 1 for (i in 1:nvx) { if (b[i] == dfYMax && a[i] > tX) ti <- i } if ( (ti > 1) & (ti < nvx) ) { dx0 = a[ti-1] - a[ti] dx1 = a[ti+1] - a[ti] dy0 = b[ti-1] - b[ti] dy1 = b[ti+1] - b[ti] } else if (ti == nvx) { dx0 = a[ti-1] - a[ti] dx1 = a[1] - a[ti] dy0 = b[ti-1] - b[ti] dy1 = b[1] - b[ti] } else { # /* if the tested vertex is at the origin then continue from 0 (1) */ dx1 = a[2] - a[1] dx0 = a[nvx] - a[1] dy1 = b[2] - b[1] dy0 = b[nvx] - b[1] } v3 = ( (dx0 * dy1) - (dx1 * dy0) ) if ( v3 > 0 ) return(as.integer(1)) else return(as.integer(-1)) } .bboxSlot <- function(x) { r1 <- range(x[,1], na.rm=TRUE) r2 <- range(x[,2], na.rm=TRUE) res <- rbind(r1, r2) dimnames(res)[[2]] <- c("min", "max") res } .bboxR4s <- function(R4s) { x <- sapply(R4s, function(x) bbox.R4(x)[1,]) y <- sapply(R4s, function(x) bbox.R4(x)[2,]) r1 <- range(x, na.rm=TRUE) r2 <- range(y, na.rm=TRUE) res <- rbind(r1, r2) dimnames(res)[[2]] <- c("min", "max") res } .bboxSrs <- function(R4s) { x <- sapply(R4s, function(x) bbox.R4(x)[1,]) y <- sapply(R4s, function(x) bbox.R4(x)[2,]) r1 <- range(x, na.rm=TRUE) r2 <- range(y, na.rm=TRUE) res <- rbind(r1, r2) dimnames(res)[[2]] <- c("min", "max") res } .bboxCalcR <- function(lst) { rx=NULL ry=NULL for(i in 1:length(lst)) { x = lst[[i]] rxx=range(c(sapply(x@Polygons, function(x) range(x@coords[,1])))) ryy=range(c(sapply(x@Polygons, function(x) range(x@coords[,2])))) rx=range(c(rx,rxx)) ry=range(c(ry,ryy)) } res=rbind(r1=rx,r2=ry) dimnames(res)[[2]] <- c("min", "max") res } .bbox2SPts <- function(bb, proj4string=CRS(as.character(NA))) { x <- c(bb[1,1], bb[1,1], bb[1,2], bb[1,2]) y <- c(bb[2,1], bb[2,2], bb[2,2], bb[2,1]) SpatialPoints(cbind(x,y), proj4string=proj4string) } bbox.R4 <- function(x) { x@bbox } .bbox1 <- function(x) { r1 <- range(x[,1], na.rm=TRUE) r2 <- range(x[,2], na.rm=TRUE) res <- c(r1[1], r2[1], r1[2], r2[2]) res } .bbox2 <- function(x) { r1 <- range(x@coords[,1], na.rm=TRUE) r2 <- range(x@coords[,2], na.rm=TRUE) res <- c(r1[1], r2[1], r1[2], r2[2]) res } .saneRD <- function(rD) { if (length(rD) == 0) stop("Not a valid polygon: rD length 0") if (any(is.na(rD))) stop("Not a valid polygon: NA rD value") if (any(abs(rD) != 1)) stop("Not a valid polygon: abs(rD) != 1") invisible(NULL) } .RingCentrd_2d <- function(plmat) { nVert <- nrow(plmat) x_base <- plmat[1,1] y_base <- plmat[1,2] Cy_accum <- 0.0 Cx_accum <- 0.0 Area <- 0.0 ppx <- plmat[2,1] - x_base ppy <- plmat[2,2] - y_base for (iv in 2:(nVert-1)) { x = plmat[iv,1] - x_base y = plmat[iv,2] - y_base dx_Area <- ((x * ppy) - (y * ppx)) * 0.5 Area <- Area + dx_Area Cx_accum <- Cx_accum + ( ppx + x ) * dx_Area Cy_accum <- Cy_accum + ( ppy + y ) * dx_Area ppx <- x ppy <- y } xc <- (Cx_accum / (Area * 3)) + x_base yc <- (Cy_accum / (Area * 3)) + y_base list(xc=xc, yc=yc, area=abs(Area)) } .spFindCG <- function(xy) { a <- xy[,1] b <- xy[,2] storage.mode(a) <- "double" storage.mode(b) <- "double" n <- nrow(xy) res <- .C("spRFindCG", as.integer(n), a, b, as.double(0), as.double(0), as.double(0), PACKAGE="sp") cents <- c(res[[4]], res[[5]]) area <- abs(res[[6]]) rD <- ifelse(res[[6]] > 0, as.integer(-1), as.integer(1)) list(area=area, cents=cents, rD=rD) } sp/R/SpatialLines-methods.R0000644000176200001440000002552112655704162015266 0ustar liggesusersLine <- function(coords) { coords <- coordinates(coords) if (ncol(coords) != 2) stop("coords must be a two-column matrix") new("Line", coords = coords) } Lines <- function(slinelist, ID) { if (is(slinelist, "Line")) slinelist = list(slinelist) if (any(sapply(slinelist, function(x) !is(x, "Line")))) stop("slinelist not a list of Line objects") if (missing(ID)) stop("Single ID required") if (length(ID) != 1) stop("Single ID required") ID <- as.character(ID) stopifnot(nzchar(ID)) new("Lines", Lines = slinelist, ID=ID) } SpatialLines <- function(LinesList, proj4string=CRS(as.character(NA))) { if (any(sapply(LinesList, function(x) !is(x, "Lines")))) stop("lines list not exclusively filled with Lines objects") res <- new("SpatialLines", bbox = .bboxSls(LinesList), proj4string=proj4string, lines=LinesList) res } LineLength = function(cc, longlat=FALSE, sum=TRUE) { if (is(cc, "Line")) cc = coordinates(cc) if (!is.matrix(cc)) stop("cc must be a matrix") if (ncol(cc) != 2) stop("cc must have two columns") if (!is.numeric(cc)) stop("cc must be numeric") x <- as.double(cc[,1]) y <- as.double(cc[,2]) n <- as.integer(length(x)) if (n == 1) return(0) lengths <- vector(mode="double", length=(n-1)) lonlat <- as.integer(longlat) res <- .C("sp_lengths", x, y, n, lengths, lonlat, PACKAGE = "sp")[[4]] if (any(!is.finite(res))) stop("non-finite line lengths") if (sum) sum(res) else res # dxy = matrix(apply(cc, 2, diff), ncol = 2) # sum(sqrt(apply(dxy, 1, function(x) sum(x ** 2)))) } bbox.Lines <- function(obj) { rx=range(lapply(obj@Lines, function(x) range(x@coords[,1]))) ry=range(lapply(obj@Lines, function(x) range(x@coords[,2]))) res=rbind(x=rx,y=ry) dimnames(res)[[2]] <- c("min", "max") res } setMethod("bbox", "Lines", bbox.Lines) bbox.Line <- function(obj) { rx <- range(obj@coords[,1]) ry <- range(obj@coords[,2]) res = rbind(x = rx, y = ry) dimnames(res)[[2]] <- c("min", "max") res } setMethod("bbox", "Line", bbox.Line) .bboxSls <- function(lst) { bb = sapply(lst, bbox) res = matrix(c(min(bb[1,]), min(bb[2,]), max(bb[3,]), max(bb[4,])), 2, 2) dimnames(res) = list(c("x", "y"), c("min", "max")) res } ## plotSpatialLines <- function(SL, xlim = NULL, ylim = NULL, ## col = 1, lwd = 1, lty=1, add = FALSE, axes = FALSE, ..., ## setParUsrBB=FALSE) ## { ## # frame() ## # plot.window(xlim = xlim, ylim = ylim, asp = asp) ## if (! add) ## plot(as(SL, "Spatial"), xlim = xlim, ylim = ylim, ## axes = axes, ..., setParUsrBB=setParUsrBB) ## lst <- SL@lines ## for (i in seq(along=lst)) { ## sllst = lst[[i]]@Lines ## for (j in seq(along=sllst)) { ## crds <- coordinates(sllst[[j]]) ## if (length(col) != length(lst)) ## # Michael Sumner, Jul 6 2010; ## # col <- rep(col[1], length(lst)) ## col <- rep(col, length = length(lst)) ## if (length(lwd) != length(lst)) ## lwd <- rep(lwd[1], length(lst)) ## if (length(lty) != length(lst)) ## lty <- rep(lty[1], length(lst)) ## lines(crds, col = col[i], lwd = lwd[i], ## lty = lty[i], ...) ## } ## } ## } ## MDS 2010-07-07 new handling for col, lwd, lty, and new lend, ljoin, lmitre plotSpatialLines <- function(SL, xlim = NULL, ylim = NULL, col = 1, lwd = 1, lty=1, add = FALSE, axes = FALSE, lend = 0, ljoin = 0, lmitre = 10, ..., setParUsrBB=FALSE) { if (! add) plot(as(SL, "Spatial"), xlim = xlim, ylim = ylim, axes = axes, ..., setParUsrBB=setParUsrBB) lst <- SL@lines if (length(col) != length(lst)) col <- rep(col, length = length(lst)) if (length(lwd) != length(lst)) lwd <- rep(lwd, length = length(lst)) if (length(lty) != length(lst)) lty <- rep(lty, length = length(lst)) if (length(lend) != length(lst)) lend <- rep(lend, length = length(lst)) if (length(ljoin) != length(lst)) ljoin <- rep(ljoin, length = length(lst)) if (length(lmitre) != length(lst)) lmitre <- rep(lmitre, length = length(lst)) for (i in seq(along=lst)) { sllst = lst[[i]]@Lines for (j in seq(along=sllst)) { crds <- coordinates(sllst[[j]]) lines(crds, col = col[i], lwd = lwd[i], lty = lty[i], lend = lend[i], ljoin = ljoin[i], lmitre = lmitre[i]) } } } setMethod("plot", signature(x = "SpatialLines", y = "missing"), function(x, y, ...) plotSpatialLines(x, ...)) setMethod("coordinates", "Line", function(obj) obj@coords) setMethod("coordinates", "Lines", function(obj) lapply(obj@Lines, coordinates)) setMethod("coordinates", "SpatialLines", function(obj) lapply(obj@lines, coordinates)) lines.Line = function(x, y = NULL, ...) invisible(lines(coordinates(x), ...)) lines.Lines = function(x, y = NULL, ...) invisible(lapply(x@Lines, function(x, ...) lines(x, ...), ...)) lines.SpatialLines = function(x, y = NULL, ...) invisible(lapply(x@lines, function(x, ...) lines(x, ...), ...)) row.names.SpatialLines <- function(x) { sapply(slot(x, "lines"), slot, "ID") } "row.names<-.SpatialLines" <- function(x, value) { spChFIDs(x, value) } #"[.SpatialLines" = function(x, i, j, ..., drop = T) { setMethod("[", "SpatialLines", function(x, i, j, ..., drop = TRUE) { if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (is.logical(i)) { if (length(i) == 1 && i) i = 1:length(x@lines) else i <- which(i) } else if (is.character(i)) i <- match(i, row.names(x)) if (any(is.na(i))) stop("NAs not permitted in row index") #SpatialLines(x@lines[i], CRS(proj4string(x))) x@lines = x@lines[i] if (length(x@lines) > 0) x@bbox = .bboxSls(x@lines) x }) setMethod("coordnames", signature(x = "SpatialLines"), function(x) coordnames(x@lines[[1]]) ) setMethod("coordnames", signature(x = "Lines"), function(x) coordnames(x@Lines[[1]]) ) setMethod("coordnames", signature(x = "Line"), function(x) dimnames(coordinates(x))[[2]] ) setReplaceMethod("coordnames", signature(x = "SpatialLines", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value for (i in seq(along = x@lines)) coordnames(x@lines[[i]]) = value x } ) setReplaceMethod("coordnames", signature(x = "Lines", value = "character"), function(x, value) { for (i in seq(along = x@Lines)) coordnames(x@Lines[[i]]) = value x } ) setReplaceMethod("coordnames", signature(x = "Line", value = "character"), function(x, value) { dimnames(x@coords)[[2]] = value x } ) getSpatialLinesMidPoints = function(SL) { ret = lapply(SL@lines, function(x) sapply(x@Lines, function(X) apply(X@coords, 2, mean) ) ) ret = t(sapply(ret, function(x) apply(x, 1, mean))) SpatialPoints(ret, CRS(proj4string(SL))) } LinesLength = function(Ls, longlat=FALSE) sum(sapply(Ls@Lines, LineLength, longlat)) SpatialLinesLengths = function(SL, longlat) { if (missing(longlat)) { proj <- is.projected(SL) if (is.na(proj)) { longlat <- FALSE } else { longlat <- !proj } } if (!is.logical(longlat)) stop("longlat should be logical") sapply(SL@lines, LinesLength, longlat=longlat) } setAs("Lines", "SpatialPoints", function(from) { cc = do.call(rbind, coordinates(from)) if (!is.null(rownames(cc))) rownames(cc) = make.unique(rownames(cc)) SpatialPoints(cc) } ) setAs("SpatialLines", "SpatialPoints", function(from) { cc = do.call(rbind, lapply(from@lines, function(x) coordinates(as(x, "SpatialPoints")))) if (!is.null(rownames(cc))) rownames(cc) = make.unique(rownames(cc)) SpatialPoints(cc, CRS(proj4string(from))) } ) setAs("Lines", "SpatialMultiPoints", function(from) { SpatialMultiPoints(coordinates(from)) } ) setAs("SpatialLines", "SpatialMultiPoints", function(from) { l = lapply(from@lines, function(x) do.call(rbind, coordinates(x))) names(l) = sapply(from@lines, function(x) x@ID) SpatialMultiPoints(l, CRS(proj4string(from))) } ) SpatialLines2SpatialPointsDataFrame = function(from) { spp = as(as(from, "SpatialLines"), "SpatialPoints") L = lapply(from@lines, function(x) {rep(1:length(x@Lines), times = sapply(x@Lines, function(x) nrow(x@coords)))}) IDs = sapply(from@lines, function(x) x@ID) L2 = rep(IDs, times = sapply(L, length)) L3 = rep(1:length(from@lines), times = sapply(L, length)) L = unlist(L) SpatialPointsDataFrame(spp, data.frame(Lines.NR = L3, Lines.ID=L2, Line.NR=L), proj4string=CRS(proj4string(from))) } setAs("SpatialLines", "SpatialPointsDataFrame", function(from) SpatialLines2SpatialPointsDataFrame(from) ) setAs("SpatialPoints", "Line", function(from) Line(coordinates(from)) ) setAs("SpatialPoints", "Lines", function(from) Lines(as(from, "Line"), "ID") ) setAs("SpatialPoints", "SpatialLines", function(from) SpatialLines(list(as(from, "Lines")), from@proj4string) ) asWKTSpatialLines = function(x, digits = getOption("digits")) { ids = sapply(x@lines, function(x)slot(x,"ID")) df = data.frame(geometry = paste("MULTILINESTRING((", apply( signif(sapply(coordinates(x), function(x) x[[1]][1,]),digits=digits), 2, paste, collapse=" ")," ...))",sep="")) row.names(df) = ids df } print.SpatialLines = function(x, ..., digits = getOption("digits"), asWKT=FALSE) { cat("SpatialLines:\n") if (asWKT) print(asWKTSpatialLines(x, digits)) else show(x) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") } #setMethod("show", "SpatialLines", function(object) print.SpatialLines(object)) length.SpatialLines = function(x) { length(x@lines) } names.SpatialLines = function(x) { unlist(lapply(x@lines, function(X) X@ID)) } labels.SpatialLines = function(object, labelCRS, side = 1:2, ...) { # 1=below, 2=left, 3=above and 4=right. if (! identical(names(object), c("EW", "NS"))) warning("this labels method is meant to operate on SpatialLines created with sp::gridlines") if (missing(labelCRS) && !is.na(proj4string(object))) labelCRS = object@proj4string cc = coordinates(object) pts = append( lapply(cc, function(x) do.call(rbind, lapply(x, function(y) head(y, 1)))), lapply(cc, function(x) do.call(rbind, lapply(x, function(y) tail(y, 1)))) ) d = SpatialPoints(do.call(rbind, lapply(pts, function(x) { row.names(x) = NULL; x}))) d$pos = rep(c(2,1,4,3), times = rep(sapply(cc, length), 2)) ang = append( lapply(cc, function(x) apply(do.call(rbind, lapply(x, function(y) apply(head(y, 2), 2, diff))), 1, function(x) atan2(x[2], x[1])*180/pi)), lapply(cc, function(x) apply(do.call(rbind, lapply(x, function(y) apply(tail(y, 2), 2, diff))), 1, function(x) atan2(x[2], x[1])*180/pi)) ) d$srt = c(ang[[1]], ang[[2]] - 90, ang[[3]], ang[[4]] - 90) # get the labels: if (! missing(labelCRS)) object = spTransform(object, labelCRS) # may do nothing if (is.na(proj4string(object))) is.p = TRUE else is.p = is.projected(object) pts = lapply(coordinates(object), function(x) do.call(rbind, lapply(x, function(y) y[1,]))) lat = pts[[1]][,2] long = pts[[2]][,1] if (is.p) d$labels = as.character(rep(c(lat, long), 2)) else d$labels = rep(c(degreeLabelsNS(lat), degreeLabelsEW(long)), 2) d[d$pos %in% side, ] } sp/R/spsample.R0000644000176200001440000003612112672110507013050 0ustar liggesusersmakegrid = function(x, n = 10000, nsig = 2, cellsize, offset = rep(0.5, nrow(bb)), pretty = TRUE) { if (is(x, "Spatial")) bb = bbox(x) else bb = x if (missing(cellsize)) { pw = 1.0/nrow(bb) cellsize = signif((prod(apply(bb, 1, diff))/n) ^ pw, nsig) } if (length(cellsize) == 1) cellsize = rep(cellsize, nrow(bb)) # find pretty grid coordinates: min.coords = bb[,1] + offset * cellsize if (pretty) min.coords = signif(min.coords, max(ceiling(log10(abs(bb[1,]) / cellsize)))) sel = min.coords - offset * cellsize > bb[,1] if (any(sel)) min.coords[sel] = min.coords[sel] - cellsize[sel] expand.grid.arglist = list() for (i in 1:nrow(bb)) { name = paste("x", i, sep = "") from = min.coords[i] by = cellsize[i] length.out = round(1 + (bb[i,2] - from) / by) expand.grid.arglist[[name]] = seq(from, by=by, length.out=length.out) } xy = do.call(expand.grid, expand.grid.arglist) attr(xy, "cellsize") = cellsize return(xy) } makegrid0 = function(x, n = 10000, nsig = 2, cellsize, offset = rep(0.5,nrow(bb))) { #cat("n in makegrid", n, "\n") if (is(x, "Spatial")) bb = bbox(x) else bb = x # rx = bb[1,] # ry = bb[2,] if (missing(cellsize)) { pw = 1.0/nrow(bb) cellsize = signif((prod(apply(bb, 1, diff))/n) ^ pw, nsig) cellsize = min(cellsize, min(apply(bb, 1, diff))) } if (length(cellsize) == 1) cellsize = rep(cellsize, nrow(bb)) # in some cases with small n, min* can be larger than bbox max values # so guard imposed to step down from cellsize min.coords = pmax(bb[,1], signif(bb[,1] + offset * cellsize, nsig)) # minx = max(rx[1], signif(rx[1] + offset[1] * cellsize, nsig)) # miny = max(ry[1], signif(ry[1] + offset[2] * cellsize, nsig)) expand.grid.arglist = list() for (i in 1:nrow(bb)) { name = paste("x", i, sep = "") sign = ifelse(min.coords[i] < bb[i,2], 1, -1) expand.grid.arglist[[name]] = seq(min.coords[i], bb[i,2], sign * cellsize[i]) } # if (minx < rx[2]) seqx = seq(minx, rx[2], by = cellsize) # else seqx = seq(minx, rx[2], by = -cellsize) # if (miny < ry[2]) seqy = seq(miny, ry[2], by = cellsize) # else seqy = seq(miny, ry[2], by = -cellsize) # type = "regular" : xy = do.call(expand.grid, expand.grid.arglist) attr(xy, "cellsize") = cellsize return(xy) } sample.Spatial = function(x, n, type, bb = bbox(x), offset = runif(nrow(bb)), cellsize, ..., nclusters = 1) { if (missing(n)) n <- as.integer(NA) n <- ceiling(n) #cat("n in sample.Spatial", n, "\n") if (type == "random") xy = apply(bb, 1, function(x) runif(n) * diff(x) + x[1]) else if (type == "Fibonacci") { if (!identical(is.projected(x), FALSE)) warning("Fibonacci sampling is supposed to work on long/lat only") xy = fiboGrid(n %/% 2, bb[1,], bb[2,]) } else if (type == "hexagonal") xy = hexGrid(bb, n = n, offset = offset, cellsize = cellsize) else { if (is.na(n)) xy = makegrid0(bb, nsig = 20, cellsize = cellsize, offset = offset) else xy = makegrid0(bb, n = n, nsig = 20, cellsize = cellsize, offset = offset) cellsize = attr(xy, "cellsize") if (type == "stratified") { n = nrow(xy) for (j in 1:ncol(xy)) xy[,j] = xy[,j] + (runif(n) - 0.5) * cellsize[j] } else if (type == "clustered") { n = nrow(xy) # BG, Mon May 9 14:58:18 CEST 2011 clus = rep(sample(1:n, nclusters, replace = FALSE), length = n) for (j in 1:ncol(xy)) xy[,j] = xy[clus,j] + (runif(n) - 0.5) * cellsize[j] } else if (type == "nonaligned") { if (ncol(xy) != 2) stop("sorry, nonaligned is only implemented for 2D") nx = length(unique(xy[,1])) ny = length(unique(xy[,2])) x0 <- rep(runif(ny), rep(nx, ny)) y0 <- rep(runif(nx), ny) xy[,1] = xy[,1] + (x0 - 0.5) * cellsize[1] xy[,2] = xy[,2] + (y0 - 0.5) * cellsize[2] } else if (type != "regular") stop(paste("sampling type", type, "not recognized")) } # Patrick Girardoux 080217 if (!is.na(n) && n == 1 && !is.matrix(xy) && is.vector(xy)) xy <- matrix(xy, ncol=nrow(bb)) sel = xy[,1] >= bb[1,1] & xy[,1] <= bb[1,2] & xy[,2] >= bb[2,1] & xy[,2] <= bb[2,2] xy = xy[sel,, drop = FALSE] rownames(xy) = NULL SpatialPoints(xy, CRS(proj4string(x))) } setMethod("spsample", signature(x = "Spatial"), sample.Spatial) sample.Line = function(x, n, type, offset = runif(1), proj4string = CRS(as.character(NA)), ...) { offset = offset[1] if (missing(n)) n <- as.integer(NA) if (!is.finite(n) || n < 1) return(NULL) cc = coordinates(x) lengths = LineLength(cc, longlat=FALSE, sum=FALSE) if (any(abs(lengths) < .Machine$double.eps)) { wl <- which(abs(lengths) < .Machine$double.eps) cc <- cc[-(wl),] lengths <- lengths[-(wl)] } csl = c(0, cumsum(lengths)) maxl = csl[length(csl)] if (type == "random") pts = runif(n) * maxl else if (type == "stratified") pts = ((1:n) - runif(n))/n * maxl else if (type == "regular") pts = ((1:n) - (1-offset))/n * maxl else stop(paste("type", type, "not available for Line")) # find coordinates: int = findInterval(pts, csl, all.inside = TRUE) where = (pts - csl[int])/diff(csl)[int] xy = cc[int, , drop=FALSE] + where * (cc[int+1, , drop=FALSE] - cc[int, , drop=FALSE]) if (nrow(xy) < 1) return(NULL) SpatialPoints(xy, proj4string) } setMethod("spsample", signature(x = "Line"), sample.Line) sample.Lines = function(x, n, type, offset = runif(1), ...) { L = x@Lines lengths = sapply(L, function(x) LineLength(x@coords)) if (sum(lengths) < .Machine$double.eps) stop("Lines object of no length") nrs = round(lengths / sum(lengths) * n) ret = vector("list", sum(nrs > 0)) j = 1 for (i in 1:length(L)) { if (nrs[i] > 0) { ret[[j]] = sample.Line(L[[i]], nrs[i], type = type, offset = offset, ...) j = j+1 } } do.call(rbind, ret) } setMethod("spsample", signature(x = "Lines"), sample.Lines) sample.SpatialLines = function(x, n, type, offset = runif(1), ...) { # lengths = SpatialLinesLengths(x, longlat = isTRUE(!is.projected(x))) if (isTRUE(!is.projected(x))) warning("working under the assumption of projected data!") lengths = SpatialLinesLengths(x, longlat = FALSE) if (sum(lengths) < .Machine$double.eps) stop("SpatialLines object of no length") nrs = round(lengths / sum(lengths) * n) if (sum(nrs) == 0) warning("n too small, increase n and sample from output") ret = vector("list", sum(nrs > 0)) j = 1 for (i in 1:length(lengths)) { if (nrs[i] > 0) { ret[[j]] = sample.Lines(x@lines[[i]], nrs[i], type = type, offset = offset, ...) j = j+1 } } ret = do.call(rbind, ret) if (!is.null(ret)) proj4string(ret) = CRS(proj4string(x)) ret } setMethod("spsample", signature(x = "SpatialLines"), sample.SpatialLines) sample.Polygon = function(x, n, type = "random", bb = bbox(x), offset = runif(2), proj4string=CRS(as.character(NA)), iter=4, ...) { if (missing(n)) n <- as.integer(NA) #cat("n in sample.Polygon", n, "\n") area = slot(x, "area") if (area == 0.0) spsample(Line(slot(x, "coords")), n, type, offset = offset[1], proj4string=proj4string) #CRS(proj4string(x))), n, type, offset = offset[1]) else { res <- NULL its <- 0 n_now <- 0 bb.area = prod(apply(bb, 1, function(x) diff(range(x)))) bb.area <- bb.area + bb.area*its*0.1 xSP <- new("Spatial", bbox=bbox(x), proj4string=proj4string) if (type == "random") { brks <- c(1,3,6,10,20,100) reps <- c(5,4,3,2,1.5) n_is <- round(n * reps[findInterval(n, brks, all.inside=TRUE)] * bb.area/area) } else n_is <- round(n * bb.area/area) while (is.null(res) && its < iter && n_is > 0 && ifelse(type == "random", (n_now < n), TRUE)) { pts = sample.Spatial(xSP, n_is, type=type, offset = offset, ...) id = over(pts, SpatialPolygons(list(Polygons(list(x), "xx")), proj4string=proj4string)) Not_NAs <- !is.na(id) if (!any(Not_NAs)) res <- NULL else res <- pts[which(Not_NAs)] if (!is.null(res)) n_now <- nrow(res@coords) its <- its+1 } if (type == "random") if (!is.null(res) && n < nrow(res@coords)) res <- res[sample(nrow(res@coords), n)] res } } setMethod("spsample", signature(x = "Polygon"), sample.Polygon) sample.Polygons = function(x, n, type = "random", bb = bbox(x), offset = runif(2), proj4string=CRS(as.character(NA)), iter=4, ...) { if (missing(n)) n <- as.integer(NA) area = sapply(slot(x, "Polygons"), function(i) slot(i, "area")) # also available for Polygons! if (sum(area) == 0.0) # distribute n over the lines, according to their length? stop("sampling over multiple lines not functioning yet...") res <- NULL its <- 0 holes <- sapply(slot(x, "Polygons"), function(y) slot(y, "hole")) pls <- slot(x, "Polygons") smple <- rep(TRUE, length(pls)) if (length(pls) > 1) { # for (i in seq(along=pls)) { # bbi <- .bbox2SPts(bbox(pls[[i]]), proj4string=proj4string) # bb_in <- lapply(pls[-i], function(x, pts) # pointsInPolygon(pts, x), pts = bbi) # added condition 100716 # zzz <- do.call("rbind", bb_in) # if (holes[i] || (any(unlist(bb_in) == 1) && # !(sum(zzz[i,]) %% 2) == 0)) smple[i] <- FALSE # was [,i], changed to [i,] 110307 Aman Verma # } smple <- !holes # all heuristics removed, hole slots must be correctly defined 110308 } sum_area <- sum(area[smple]) while (is.null(res) && its < iter) { ptsres <- vector(mode="list", length=length(area)) for (i in seq(along=ptsres)) { if (smple[i]) { nnow <- ceiling(n*(area[i]/sum_area)) ptsres[[i]] <- sample.Polygon(x=pls[[i]], n=nnow, type = type, offset = offset, iter=iter) } } crds <- do.call(rbind, lapply(ptsres, function(x) if (!is.null(x)) {rownames(x) <- NULL; coordinates(x)})) # RSB 151013 oddity - duplicate rownames if (is.null(crds)) res <- NULL else { pts <- SpatialPoints(crds, proj4string=proj4string) id = over(pts, SpatialPolygons(list(x), proj4string=proj4string)) Not_NAs <- !is.na(id) if (!any(Not_NAs)) res <- NULL else res <- pts[which(Not_NAs)] # Patrick Girardoux 080217 # if (type == "random" && nrow(res@coords) < n) res <- NULL if(!is.null(res)) if (type == "random" && nrow(res@coords) < n) res <- NULL } its <- its+1 } if (type == "random") if (!is.null(res) && n < nrow(res@coords)) res <- res[sample(nrow(res@coords), n)] res } setMethod("spsample", signature(x = "Polygons"), sample.Polygons) sample.SpatialPolygons = function(x, n, type = "random", bb = bbox(x), offset = runif(2), iter=4, ...) { #stop("not functioning yet...") if (missing(n)) n <- as.integer(NA) #cat("n in sample.SpatialPolygons", n, "\n") # EJP, 12/6/07: replaced area calculation with negative areas for holes... #area = sum(unlist(lapply(slot(x, "polygons"), function(x) slot(x, "area")))) getArea = function(x) { getAreaPolygons = function(x) { holes = unlist(lapply(x@Polygons, function(x) x@hole)) areas = unlist(lapply(x@Polygons, function(x) x@area)) area = ifelse(holes, -1, 1) * areas area } sum(unlist(lapply(x@polygons, getAreaPolygons))) } area = getArea(x) if (area <= 0.0) stop("cannot sample in zero-area polygons") res <- NULL its <- 0 bb.area = prod(apply(bb, 1, function(x) diff(range(x)))) n_tot = round(n * bb.area/area) while (is.null(res) && its < iter) { # enlarge n each iteration: pts = sample.Spatial(as(x, "Spatial"), n_tot * (1 + its * 0.1), type=type, offset = offset, ...) Over_pts_x <- over(pts, geometry(x)) Not_NAs <- !is.na(Over_pts_x) if (!any(Not_NAs)) res <- NULL else res <- pts[Not_NAs] # Patrick Girardoux 080217 # if (type == "random" && nrow(res@coords) < n) res <- NULL if(!is.null(res)) if (type == "random" && nrow(res@coords) < n) res <- NULL its <- its+1 } if (type == "random") if (!is.null(res) && n < nrow(res@coords)) res <- res[sample(nrow(res@coords), n)] if (is.null(res)) stop("iteration did not converge; try enlarging argument iter") proj4string(res) = CRS(proj4string(x)) res } setMethod("spsample", signature(x = "SpatialPolygons"), sample.SpatialPolygons) sample.Sgrid = function(x, n, type = "random", bb = bbox(x), offset = runif(nrow(bb)), ...) { if (missing(n)) n <- as.integer(NA) #cat("n in sample.Sgrid", n, "\n") area = areaSpatialGrid(x) if (area == 0.0) stop("cannot sample from grid with zero area") pts = spsample(as(x, "Spatial"), n, type, offset = offset, ...) pts[!is.na(over(pts, geometry(x)))] } setMethod("spsample", signature(x = "SpatialGrid"), sample.Sgrid) sample.Spixels = function(x, n, type = "random", bb = bbox(x), offset = runif(nrow(bb)), ...) { if (missing(n)) n <- as.integer(NA) #cat("n in sample.Spixels", n, "\n") area = areaSpatialGrid(x) if (area == 0.0) stop("cannot sample from grid with zero area") bb.area = prod(apply(bb, 1, function(x) diff(range(x)))) pts = spsample(as(x, "Spatial"), round(n * bb.area/area), type, offset = offset, ...) pts[!is.na(over(pts, geometry(x)))] } setMethod("spsample", signature(x = "SpatialPixels"), sample.Spixels) hexGrid = function(bb, n, offset, cellsize) { if (missing(cellsize)) { if (missing(n)) stop("need either cellsize or n") area = prod(apply(bb, 1, diff))/n # dx = area / (sqrt(3)/2) # suggested by Don MacQueen, macq@llnl.gov, Fri Mar 14 16:00:07 CET 2008 dx = sqrt(area)/(sqrt(3)/2) } else dx = cellsize xy = genHexGrid(dx, bb[,1], bb[,2]) # also suggested by Don MacQueen, macq@llnl.gov, Fri Mar 14 16:00:07 CET 2008: xy[,1] <- xy[,1] + offset[1] * dx xy[,2] <- xy[,2] + offset[2] * dx * sqrt(3)/2 attr(xy, "cellsize") = dx xy } # THK, posted to r-sig-geo, 03/03/2007: genHexGrid <- function(dx, ll = c(0, 0), ur = c(1, 1)) { dy <- sqrt(3) * dx / 2 x <- seq(ll[1], ur[1] - dx / 2, dx) y <- seq(ll[2], ur[2], dy) y <- rep(y, each = length(x)) x <- rep(c(x, x + dx / 2), length.out = length(y)) x <- x + (ur[1] - max(x)) / 2 y <- y + (ur[2] - max(y)) / 2 data.frame(x = x, y = y) } genPolyList <- function(hexGrid, dx) { # EJP; changed: # how to figure out dx from a grid? THK suggested: #dx <- hexGrid$x[2] - hexGrid$x[1] # and the following will also not allways work: if (missing(dx)) dx = 2 * min(diff(sort(unique(hexGrid$x)))) dy <- dx / sqrt(3) x.offset <- c(-dx / 2, 0, dx / 2, dx / 2, 0, -dx / 2, -dx / 2) y.offset <- c(dy / 2, dy, dy / 2, -dy / 2, -dy, -dy / 2, dy / 2) f <- function(i) list(x = hexGrid$x[i] + x.offset, y = hexGrid$y[i] + y.offset) ret = lapply(1:length(hexGrid$x), f) } # EJP, added: HexPoints2SpatialPolygons = function(hex, dx) { ret = genPolyList(data.frame(coordinates(hex)), dx = dx) npoly = length(ret) Srl <- vector(mode="list", length=npoly) IDS = paste("ID", 1:npoly, sep="") for (i in 1:npoly) Srl[[i]] = Polygons(list(Polygon(ret[[i]])), IDS[i]) res <- SpatialPolygons(Srl, proj4string=CRS(proj4string(hex))) res } fiboGrid <- function(N, xlim = c(-180,180), ylim = c(-90,90)) { if (max(xlim) <= 180) subtr = 180 else subtr = 0 phi = (1 + sqrt(5))/2 i = seq(-N, N) P = 2 * N + 1 lat = asin(2*i / P) * 180 / pi lon = ((2 * pi * i / phi) %% pi) * 360 / pi - subtr sel = lon <= xlim[2] & lon >= xlim[1] & lat <= ylim[2] & lat >= ylim[1] cbind(lon, lat)[sel, ] } sp/R/asciigrid.R0000644000176200001440000000613712577541412013175 0ustar liggesusersread.asciigrid <- function(fname, as.image = FALSE, plot.image = FALSE, colname=fname, proj4string = CRS(as.character(NA))) { t = file(fname, "r") l5 = readLines(t, n = 6) # instead of: # l5s = strsplit(l5, " ") # Michael Summer, mdsumner@utas.edu.au suggested: l5s = strsplit(l5, "\\s+", perl = T) xllcenter = yllcenter = xllcorner = yllcorner = as.numeric(NA) for (i in 1:6) { fieldname = casefold(l5s[[i]][1]) if (length(grep("ncols", fieldname))) ncols = as.numeric(l5s[[i]][2]) if (length(grep("nrows", fieldname))) nrows = as.numeric(l5s[[i]][2]) if (length(grep("xllcorner", fieldname))) xllcorner = as.numeric(l5s[[i]][2]) if (length(grep("yllcorner", fieldname))) yllcorner = as.numeric(l5s[[i]][2]) if (length(grep("xllcenter", fieldname))) xllcenter = as.numeric(l5s[[i]][2]) if (length(grep("yllcenter", fieldname))) yllcenter = as.numeric(l5s[[i]][2]) if (length(grep("cellsize", fieldname))) cellsize = as.numeric(l5s[[i]][2]) if (length(grep("nodata_value", fieldname))) nodata.value = as.numeric(l5s[[i]][2]) } if (is.na(xllcorner) && !is.na(xllcenter)) xllcorner = xllcenter - 0.5 * cellsize else xllcenter = xllcorner + 0.5 * cellsize if (is.na(yllcorner) && !is.na(yllcenter)) yllcorner = yllcenter - 0.5 * cellsize else yllcenter = yllcorner + 0.5 * cellsize map = scan(t, as.numeric(0), quiet = TRUE) close(t) if (length(as.vector(map)) != nrows * ncols) stop("dimensions of map do not match that of header") map[map == nodata.value] = NA if (as.image) { img = matrix(map, ncols, nrows)[,nrows:1] img = list(z = img, x = xllcorner + cellsize * ((1:ncols) - 0.5), y = yllcorner + cellsize * ((1:nrows) - 0.5)) if (plot.image) { image(img, asp = 1) return(invisible(img)) } else return(img) } df = data.frame(map) names(df) = colname grid = GridTopology(c(xllcenter,yllcenter), rep(cellsize,2), c(ncols,nrows)) SpatialGridDataFrame(grid, data = df, proj4string=proj4string) } write.asciigrid <- function(x, fname, attr = 1, na.value = -9999, ...) { # R> gridparameters(meuse.grid) # cellcentre.offset cellsize cells.dim # x 178460 40 78 # y 329620 40 104 #NCOLS 80 #NROWS 115 #XLLCORNER 178400.000000 #YLLCORNER 329400.000000 #CELLSIZE 40.000000 #NODATA_VALUE 1e31 if (!gridded(x)) stop("can only write SpatialGridDataFrame objects to asciigrid") x = as(x, "SpatialGridDataFrame") gp = gridparameters(x) if (length(gp$cells.dim) != 2) stop("asciigrid only supports 2D grids") if (gp$cellsize[1] != gp$cellsize[2]) stop("Asciigrid does not support grids with non-square cells") f = file(fname, open = "w") writeLines(c( paste("NCOLS", gp$cells.dim[1]), paste("NROWS", gp$cells.dim[2]), paste("XLLCORNER", gp$cellcentre.offset[1] - 0.5 * gp$cellsize[1]), paste("YLLCORNER", gp$cellcentre.offset[2] - 0.5 * gp$cellsize[2]), paste("CELLSIZE", gp$cellsize[1]), paste("NODATA_VALUE", na.value) ), f) z = x@data[[attr]] z[is.na(z)] = na.value write.table(t(matrix(z, gp$cells.dim[1], gp$cells.dim[2])), file = f, row.names = FALSE, col.names = FALSE, ...) close(f) } sp/R/disaggregate.R0000644000176200001440000000733013101576053013652 0ustar liggesusers # copied from raster: if (!isGeneric("disaggregate")) { setGeneric("disaggregate", function(x, ...) standardGeneric("disaggregate")) } # Robert Hijmans: explodePolygons <- function(x, ignoreholes=FALSE, ...) { if (!requireNamespace("rgeos", quietly = TRUE)) stop('package rgeos is needed to relate holes to their corresponding polygons') npols <- length(x@polygons) crs <- x@proj4string count <- 0 p <- NULL np <- vector(length=npols) for (i in 1:npols) { np[i] <- length(x@polygons[[i]]@Polygons) if (np[i] > 1) { parts <- x@polygons[[i]]@Polygons if (ignoreholes) { holes <- FALSE } else { holes <- sapply(parts, function(x)x@hole) } if (any(holes)) { if (np[i]==2) { pp <- x@polygons[[i]] pp@ID <- as.character(count + 1) } else { cmt <- as.integer(unlist(strsplit(rgeos::createPolygonsComment(x@polygons[[i]]), ' '))) cmt <- cbind(id=1:length(cmt), holeOf=cmt) cmt <- cmt[cmt[,2] > 0, ,drop=FALSE] pp <- NULL add <- 0 for (j in unique(cmt[,2])) { # there might be multiple holes in a single polygon k <- cmt[cmt[,2]==j, 1] add <- add + 1 pp <- c(pp, Polygons(x@polygons[[i]]@Polygons[c(j, k)], count + add)) } x@polygons[[i]]@Polygons <- x@polygons[[i]]@Polygons[-unique(as.vector(cmt))] if (length(x@polygons[[i]]@Polygons) > 0) { parts <- x@polygons[[i]]@Polygons pp <- c(pp, sapply(1:length(parts), function(g) Polygons(parts[g], count + add + g))) } } np[i] <- np[i] - sum(holes) } else { pp <- sapply(1:np[i], function(g) Polygons(parts[g], count + g)) } } else { pp <- x@polygons[[i]] pp@ID <- as.character(count + 1) } count <- count + np[i] p <- c(p, pp) } p <- SpatialPolygons(p) ps <- slot(p, "polygons") for (i in seq(along=ps)) comment(ps[[i]]) <- rgeos::createPolygonsComment(ps[[i]]) slot(p, "polygons") <- ps proj4string(p) <- crs if (.hasSlot(x, 'data')) { np <- rep(1:npols, np) x <- x@data[np, , drop = FALSE] #rownames(x) <- 1:nrow(x) rownames(x) <- NULL SpatialPolygonsDataFrame(p, x, FALSE) } else { p } } setMethod("disaggregate", "SpatialPolygons", function(x,...) explodePolygons(x, ...)) setMethod("disaggregate", "SpatialPolygonsDataFrame", function(x,...) explodePolygons(x, ...)) explodeLines <- function(x, ...) { nlins <- length(x@lines) crs <- x@proj4string count <- 0 p <- NULL nl <- vector(length=nlins) for (i in 1:nlins) { parts <- x@lines[[i]]@Lines nl[i] <- length(parts) p <- c(p, sapply(1:nl[i], function(x) Lines(parts[x], count + x))) count <- count + nl[i] } p <- SpatialLines(p) proj4string(p) <- crs if (.hasSlot(x, 'data')) { nl <- rep(1:nlins, nl) x <- x@data[nl, , drop = FALSE] rownames(x) <- 1:nrow(x) SpatialLinesDataFrame(p, x, FALSE) } else p } setMethod("disaggregate", "SpatialLines", function(x,...) explodeLines(x, ...)) setMethod("disaggregate", "SpatialLinesDataFrame", function(x,...) explodeLines(x, ...)) # Roger, claims Barry wrote it first: unfoldLines = function(x) { crds <- coordinates(x) nobjs <- sum(sapply(crds, length)) out <- vector(mode="list", length=nobjs) i <- 1 for (j in seq(along=crds)) { jcrds <- crds[[j]] for (k in seq(along=jcrds)) { out[[i]] <- Lines(list(Line(jcrds[k])), as.character(i)) i <- i + 1 } } SLout <- SpatialLines(out) length(SLout) } sp/R/bubble.R0000644000176200001440000000356212577541412012471 0ustar liggesusers# Colorbrewer.org, 5-class PiYG #d01c8b #f1b6da #f7f7f7 #b8e186 #4dac26 "bubble" <- function (obj, zcol = 1, ..., fill = TRUE, maxsize = 3, do.sqrt = TRUE, pch, col = c("#d01c8b", "#4dac26"), key.entries = quantile(data[,zcol]), main = ifelse(is.numeric(zcol), names(data)[zcol], zcol), identify = FALSE, labels = row.names(data.frame(obj)), key.space = "right", scales = list(draw = FALSE), xlab = NULL, ylab = NULL, panel = panel.bubble, sp.layout = NULL, xlim = bbexpand(bbox(obj)[1,], 0.04), ylim = bbexpand(bbox(obj)[2,], 0.04)) { obj = as(obj, "SpatialPointsDataFrame") data = as.data.frame(obj) cc = coordinates(obj) x = cc[, 1] y = cc[, 2] if (NCOL(data) == 1) z = data else if (NCOL(data) == 0) z = rep(1, NROW(cc)) else z = data[, zcol] if (missing(pch)) pch = ifelse(fill, 16, 1) if (length(col) == 1) col = rep(col, 2) z.col = as.vector(ifelse(z < 0, col[1], col[2])) q = key.entries q.pch = rep(pch, length(q)) q.text = as.character(round(q, 3)) q.col = as.vector(ifelse(q < 0, col[1], col[2])) az = abs(z) q = abs(q) if (do.sqrt) { az = sqrt(az) q = sqrt(q) } cex = as.vector(maxsize * az/max(az,q)) q.cex = as.vector(maxsize * q/max(az,q)) scales = longlat.scales(obj, scales, xlim, ylim) if (identify) { plot(x, y, asp = 1, cex = cex, main = main, ...) return(identify(x, y, labels)) } else { key = list(space = key.space, points = list(pch = q.pch, col = q.col, cex = q.cex), text = list(q.text)) xyplot(y ~ x, col = z.col, cex = cex, pch = pch, asp = mapasp(obj), key = key, main = main, scales = scales, xlab = xlab, ylab = ylab, panel = panel, sp.layout = sp.layout, ...) } } panel.bubble = function(x, y, subscripts, sp.layout, ...) { # sp.panel.layout(sp.layout, panel.number()) sppanel(sp.layout, panel.number()) panel.xyplot(x, y, ...) } sp/R/bpy.colors.R0000644000176200001440000000104612577541412013323 0ustar liggesusers"bpy.colors" <- function (n = 100, cutoff.tails = 0.1, alpha = 1) { n <- as.integer(n[1]) if (n <= 0) return(character(0)) if (cutoff.tails >= 1 || cutoff.tails < 0) stop("cutoff.tails should be in [0, 1]") i = seq(0.5 * cutoff.tails, 1 - 0.5 * cutoff.tails, length = n) r = ifelse(i < .25, 0, ifelse(i < .57, i / .32 - .78125, 1)) g = ifelse(i < .42, 0, ifelse(i < .92, 2 * i - .84, 1)) b = ifelse(i < .25, 4 * i, ifelse(i < .42, 1, ifelse(i < .92, -2 * i + 1.84, i / .08 - 11.5))) rgb(r, g, b, alpha) } sp/R/Class-SpatialLines.R0000644000176200001440000000322712577541412014667 0ustar liggesuserssetClass("Line", slots = c(coords = "matrix"), validity = function(object) { if (any(is.na(object@coords))) stop("coords cannot contain missing values") if (ncol(object@coords) != 2) return("coords should have 2 columns") # if (nrow(object@coords) < 2) # return("Line should have at least 2 points") return(TRUE) } ) setClass("Lines", slots = c(Lines = "list", ID = "character"), validity = function(object) { if (any(sapply(object@Lines, function(x) !is(x, "Line")))) stop("not a list of Line objects") return(TRUE) }) setClass("SpatialLines", contains = "Spatial", slots = c(lines = "list"), validity = function(object) { if (any(unlist(lapply(object@lines, function(x) !is(x, "Lines"))))) stop("lines not Lines objects") IDs <- sapply(slot(object, "lines"), function(i) slot(i, "ID")) if (anyDuplicated(IDs)) return("non-unique Lines ID slot values") # if (length(object@lines) != # length(unique(sapply(slot(object, "lines"), # function(x) slot(x, "ID"))))) # return("non-unique Lines ID slot values") return(TRUE) } ) getSLlinesSlot <- function(SL) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") SL@lines } getLinesLinesSlot <- function(SL) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") SL@Lines } getLinesIDSlot <- function(Lines) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Lines@ID } getSLLinesIDSlots <- function(SL) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Sls <- slot(SL, "lines") sapply(Sls, function(x) slot(x, "ID")) } sp/R/Class-SpatialMultiPoints.R0000644000176200001440000000115612577541412016103 0ustar liggesuserssetClass("SpatialMultiPoints", contains = "Spatial", slots = c(coords = "list"), prototype = list(bbox = matrix(NA), proj4string = CRS(as.character(NA)), coords = list()), validity = function(object) { if (!is.list(object@coords)) return("coords slot is not a list") if (!all(sapply(object@coords, is.matrix))) return("all list elements need to be a matrix") if (!all(sapply(object@coords, is.double))) return("all coordinates must be of mode double") if (unique(sapply(object@coords, ncol)) == 1) return("all coordinate elements need to have the same number of columns") return(TRUE) } ) sp/R/GridTopology-methods.R0000644000176200001440000001363112673501115015310 0ustar liggesusersGridTopology = function(cellcentre.offset, cellsize, cells.dim) { new("GridTopology", cellcentre.offset = cellcentre.offset, cellsize = cellsize, cells.dim = as.integer(cells.dim)) } # setMethod("show", "GridTopology", function(object) summary(object)) as.data.frame.GridTopology = function(x, row.names, optional, ...) data.frame( cellcentre.offset = x@cellcentre.offset, cellsize = x@cellsize, cells.dim = x@cells.dim ) setAs("GridTopology", "data.frame", function(from) as.data.frame.GridTopology(from)) setMethod("coordinates", "GridTopology", function(obj) { cc = do.call(expand.grid, coordinatevalues(obj)) # as.matrix(sapply(cc, as.numeric)) # dropping dimension for single cell grid do.call(cbind, lapply(cc, as.numeric)) }) coordnamesGT = function(x, value) { names(x@cellcentre.offset) = value names(x@cellsize) = value names(x@cells.dim) = value x } setReplaceMethod("coordnames", signature(x = "GridTopology", value = "character"), coordnamesGT) coordinatevalues = function(obj) { if (!is(obj, "GridTopology")) stop("function only works for objects of class or extending GridTopology") ret = list() for (i in seq(along=obj@cells.dim)) { if (i == 2) # y-axis is the exception--starting at top of map, and decreasing: ret[[i]] = obj@cellcentre.offset[i] + obj@cellsize[i] * ((obj@cells.dim[i] - 1):0) else ret[[i]] = obj@cellcentre.offset[i] + obj@cellsize[i] * (0:(obj@cells.dim[i] - 1)) } ns = names(obj@cellcentre.offset) if (is.null(ns)) ns = paste("s", 1:length(ret), sep = "") #dimnames(obj@bbox)[[1]] names(ret) = ns ret } points2grid = function(points, tolerance=sqrt(.Machine$double.eps), round = NULL) { # work out grid topology from points n = dimensions(points) ret = new("GridTopology", cellcentre.offset = numeric(n), cellsize = numeric(n), cells.dim = as.integer(rep(1,n))) cc = coordinates(points) nr <- nrow(cc) for (i in 1:n) { # loop over x, y, and possibly z x = cc[, i] sux = sort(unique(x)) difx = diff(sux) if (length(difx) == 0) { warning(paste("cell size from constant coordinate", i, "possibly taken from other coordinate")) ret@cellsize[i] = NA ret@cellcentre.offset[i] = min(sux) ret@cells.dim[i] = as.integer(1) } else { ru.difx = range(unique(difx)) # min to max x coord leaps # next, find cases where some of the differences are # VERY close to zero, and remove these: if (ru.difx[1] / ru.difx[2] < tolerance) { difx = difx[difx > ru.difx[2] * tolerance] ru.difx = range(unique(difx)) # reset } err1 = diff(ru.difx) #?? /max(range(abs(sux))) # (max-min)/max(abs(x)) if (err1 > tolerance) { xx = ru.difx / min(ru.difx) err2 = max(abs(floor(xx) - xx)) # is it an integer multiple? if (err2 > tolerance) { cat(paste("suggested tolerance minimum:", signif(err2, 6), "\n")) stop(paste("dimension", i,": coordinate intervals are not constant")) } else { difx = difx[difx < ru.difx[1] + tolerance] warning(paste("grid has empty column/rows in dimension", i)) } } ret@cellsize[i] = mean(difx) ret@cellcentre.offset[i] = min(sux) ret@cells.dim[i] = as.integer(round(diff(range(sux))/ret@cellsize[i]) + 1) #was: length(sux), but this will not cope with empty rows. if (ret@cells.dim[i] > nr) warning(paste("grid topology may be corrupt in dimension", i)) } } cs = ret@cellsize if (any(is.na(cs))) { if (all(is.na(cs))) stop("cannot derive grid parameters from a single point!") ret@cellsize[is.na(cs)] = cs[!is.na(cs)][1] } nm = dimnames(cc)[[2]] names(ret@cellsize) = nm names(ret@cellcentre.offset) = nm names(ret@cells.dim) = nm ret } .NumberOfCells = function(x) { if (!is(x, "GridTopology")) stop(".NumberOfCells only works on objects of class GridTopology") prod(x@cells.dim) } print.GridTopology = function(x, ...) { res = data.frame(rbind(x@cellcentre.offset, x@cellsize, as.numeric(x@cells.dim))) rownames(res) = c("cellcentre.offset", "cellsize", "cells.dim") if (!is.null(names(x@cellcentre.offset))) names(res) = names(x@cellcentre.offset) print(res) invisible(res) } setMethod("show", "GridTopology", function(object) print.GridTopology(object)) summ.GridTopology = function(object, ...) { ret = list() ret[["values"]] = gridparameters(object) class(ret) = "summary.GridTopology" ret } setMethod("summary", "GridTopology", summ.GridTopology) print.summary.GridTopology = function(x, ...) { cat("Grid topology:\n") print(x$values) invisible(x) } # make a SpatialPolygons from a GridTopology - NERSC query as.SpatialPolygons.GridTopology <- function(grd, proj4string=CRS(as.character(NA))) { coordnam = names(grd@cellcentre.offset) grd_crds <- coordinates(grd) IDs <- IDvaluesGridTopology(grd) nPolygons <- nrow(grd_crds) cS <- grd@cellsize cS2 <- cS/2 cS2x <- cS2[1] cS2y <- cS2[2] Srl <- vector(mode="list", length=nPolygons) for (i in 1:nPolygons) { xi <- grd_crds[i,1] yi <- grd_crds[i,2] x <- c(xi-cS2x, xi-cS2x, xi+cS2x, xi+cS2x, xi-cS2x) y <- c(yi-cS2y, yi+cS2y, yi+cS2y, yi-cS2y, yi-cS2y) coords = cbind(x, y) if (!is.null(coordnam)) dimnames(coords) = list(NULL, coordnam) else rownames(coords) = NULL Srl[[i]] <- Polygons(list(Polygon(coords = coords)), ID = IDs[i]) comment(Srl[[i]]) <- "0" } res <- SpatialPolygons(Srl, proj4string = proj4string) # address https://github.com/edzer/sp/issues/3: if (!is.null(coordnam)) dimnames(res@bbox)[[1]] = coordnam res } setAs("GridTopology", "SpatialPolygons", function(from) as.SpatialPolygons.GridTopology(from)) # mostly copied from coordinates() for GridTopology, # makes IDs "c(i)r(j)" matching the coordinates # used with SpatialRing-ed grids for the data frame rowname() IDvaluesGridTopology <- function(obj) { if (!is(obj, "GridTopology")) stop("function only works for objects of class or extending GridTopology") cc <- getGridIndex(coordinates(obj), obj) res <- as.matrix(sapply(cc, as.integer)) paste("g", res, sep="") } sp/R/SpatialPolygons-methods.R0000644000176200001440000001421013062301412015777 0ustar liggesusersSpatialPolygons <- function(Srl, pO, proj4string=CRS(as.character(NA))) { # bb <- .bboxCalcR(Srl) # if (missing(pO)) { # area <- sapply(Srl, function(x) x@area) # pO <- as.integer(order(area, decreasing=TRUE)) # } # Sp <- new("Spatial", bbox=bb, proj4string=proj4string) # res <- new("SpatialPolygons", Sp, polygons=Srl, plotOrder=as.integer(pO)) # RSB 091204 if (missing(pO)) pO <- NULL else { stopifnot(is.integer(pO)) stopifnot(length(pO) == length(Srl)) } stopifnot(is.list(Srl)) # tess to Polygons bug 121028 # EJP, 2/3/2015, uncomments: # stopifnot(length(Srl) > 0) stopifnot(is(proj4string, "CRS")) res <- .Call(SpatialPolygons_c, Srl, pO, proj4string) validObject(res) # 120416 add top-level comment to reduce comment checking cSr <- as.character(any(sapply(slot(res, "polygons"), function(x) !is.null(comment(x))), na.rm=TRUE)) comment(res) <- cSr res } Polygon <- function(coords, hole=as.logical(NA)) { coords <- coordinates(coords) ## if (!is.matrix(coords)) stop("coords must be a two-column matrix") if (ncol(coords) != 2) stop("coords must be a two-column matrix") # RSB 091203 n <- dim(coords)[1] if (n < 4L) { warning("less than 4 coordinates in polygon") if (n == 1L) coords <- rbind(coords, coords, coords, coords) else if (n == 2L) coords <- rbind(coords, coords[1,], coords[1,]) else if (n == 3L) coords <- rbind(coords, coords[1,]) n <- dim(coords)[1] } stopifnot(is.logical(hole)) ihole <- as.integer(hole) # RSB 100126 fixing hole assumption # thanks to Javier Munoz for report res <- .Call(Polygon_c, coords, n, ihole) # validObject(res) res } Polygons <- function(srl, ID) { # tess to Polygons bug 121028 stopifnot(is.list(srl)) stopifnot(length(srl) > 0) if (any(sapply(srl, function(x) !is(x, "Polygon")))) stop("srl not a list of Polygon objects") ## projargs <- unique(sapply(srl, proj4string)) ## if (length(projargs) > 1) ## stop("differing projections among Polygon objects") if (missing(ID)) stop("Single ID required") if (length(ID) != 1) stop("Single ID required") ID <- as.character(ID) stopifnot(nzchar(ID)) # RSB 091203 res <- .Call(Polygons_c, srl, ID) # validObject(res) res } bbox.Polygons <- function(obj) { rx=range(c(sapply(obj@Polygons, function(x) range(x@coords[,1])))) ry=range(c(sapply(obj@Polygons, function(x) range(x@coords[,2])))) res=rbind(x=rx,y=ry) colnames(res) <- c("min", "max") res } setMethod("bbox", "Polygons", bbox.Polygons) bbox.Polygon <- function(obj) { rx <- range(obj@coords[,1]) ry <- range(obj@coords[,2]) res=rbind(x=rx,y=ry) colnames(res) <- c("min", "max") res } setMethod("bbox", "Polygon", bbox.Polygon) as.SpatialPolygons.PolygonsList <- function(Srl, proj4string=CRS(as.character(NA))) { if (any(sapply(Srl, function(x) !is(x, "Polygons")))) stop("srl not a list of Polygons objects") # projargs <- unique(sapply(Srl, proj4string)) # if (length(projargs) > 1) # stop("differing projections among Polygons objects") # n <- length(Srl) res <- SpatialPolygons(Srl, proj4string=proj4string) res } row.names.SpatialPolygons <- function(x) { .Call(SpatialPolygons_getIDs_c, x) } "row.names<-.SpatialPolygons" <- function(x, value) { spChFIDs(x, value) } setMethod("[", "SpatialPolygons", function(x, i, j, ..., drop = TRUE) { if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (is.logical(i)) { if (length(i) == 1 && i) i = 1:length(x@polygons) else i <- which(i) } else if (is.character(i)) i <- match(i, row.names(x)) if (any(is.na(i))) stop("NAs not permitted in row index") if (length(unique(i)) != length(i)) stop("SpatialPolygons selection: can't find plot order if polygons are replicated") if (length(x@polygons[i]) == 0) { x@polygons = x@polygons[i] x@plotOrder = integer(0) stopifnot(validObject(x)) x } else SpatialPolygons(x@polygons[i], proj4string=CRS(proj4string(x))) # x@polygons = x@polygons[i] # x@bbox <- .bboxCalcR(x@polygons) # area <- sapply(slot(x, "polygons"), function(i) slot(i, "area")) # x@plotOrder <- as.integer(order(area, decreasing=TRUE)) # x }) setMethod("coordnames", signature(x = "SpatialPolygons"), function(x) coordnames(x@polygons[[1]]) ) setMethod("coordnames", signature(x = "Polygons"), function(x) coordnames(x@Polygons[[1]]) ) setMethod("coordnames", signature(x = "Polygon"), function(x) dimnames(x@coords)[[2]] ) setReplaceMethod("coordnames", signature(x = "SpatialPolygons", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value #for (i in seq(along = x@polygons)) # coordnames(x@polygons[[i]]) = value x@polygons = lapply(x@polygons, function(y) Polygons(lapply(y@Polygons, function(z) { dimnames(z@coords)[[2]] = value; z }), y@ID)) x } ) setMethod("coordinates", "SpatialPolygons", function(obj) { ret = t(sapply(slot(obj, "polygons"), function(i) slot(i, "labpt"))) dimnames(ret) = list(sapply(slot(obj, "polygons"), function(i) slot(i, "ID")), NULL) ret } ) getSpatialPolygonsLabelPoints = function(SP) { .Deprecated("slot", package = "sp", msg="use *apply and slot directly, or coordinates method") ret = t(sapply(slot(SP, "polygons"), function(x) slot(x, "labpt"))) SpatialPoints(ret, CRS(proj4string(SP))) } as.Lines.Polygons = function(from) { lst = lapply(from@Polygons, function(x) as(x, "Line")) Lines(lst, from@ID) } setAs("Polygons", "Lines", as.Lines.Polygons) as.SpatialLines.SpatialPolygons = function(from) SpatialLines(lapply(from@polygons, function(x) as(x, "Lines")), CRS(proj4string(from))) setAs("SpatialPolygons", "SpatialLines", as.SpatialLines.SpatialPolygons) as.SpatialPolygonsDataFrame.SpatialPolygons = function(from) { IDs <- sapply(slot(from, "polygons"), function(x) slot(x, "ID")) df <- data.frame(dummy = rep(0, length(IDs)), row.names=IDs) SpatialPolygonsDataFrame(from, df) } setAs("SpatialPolygons", "SpatialPolygonsDataFrame", as.SpatialPolygonsDataFrame.SpatialPolygons) length.SpatialPolygons = function(x) { length(x@polygons) } names.SpatialPolygons = function(x) { unlist(lapply(x@polygons, function(X) X@ID)) } sp/R/Class-SpatialGrid.R0000644000176200001440000000121412577541412014474 0ustar liggesuserssetClass("SpatialPixels", contains = "SpatialPoints", slots = c(grid = "GridTopology", grid.index = "integer"), validity = function(object) { if (nrow(object@coords) != length(object@grid.index)) return("grid.index should have length equal to nrow(coords)") if (length(object@grid.index) > 0) { if (max(object@grid.index) > .NumberOfCells(object@grid)) return("grid.index max value too large") if (min(object@grid.index) < 0) return("grid.index min value too small") } return(TRUE) } ) setClass("SpatialGrid", contains = "Spatial", slots = c(grid = "GridTopology"), validity = function(object) { return(TRUE) } ) sp/R/image.R0000644000176200001440000001704512577541412012321 0ustar liggesusers# first argument of image generic _needs_ to be x! image.SpatialPixelsDataFrame = function(x, ...) image(as(x, "SpatialGridDataFrame"), ...) image.SpatialPixels = function(x, ...) { x <- SpatialPixelsDataFrame(x, data=data.frame(rep(1, dim(coordinates(x))[1]))) image(x, ...) } image.SpatialGridDataFrame = function(x, attr = 1, xcol = 1, ycol = 2, col = heat.colors(12), red=NULL, green=NULL, blue=NULL, axes = FALSE, xlim = NULL, ylim = NULL, add = FALSE, ..., asp = NA, setParUsrBB=FALSE, interpolate = FALSE, angle = 0, useRasterImage=(!.isSDI() && missing(breaks)), breaks, zlim = range(as.numeric(x[[attr]])[is.finite(x[[attr]])])) { if (!add) suppressWarnings(plot(as(x, "Spatial"), xlim = xlim, ylim = ylim, axes = axes, asp = asp, ..., setParUsrBB=setParUsrBB)) if (exists("rasterImage") && useRasterImage) { if (.isSDI()) warning("Bug in SDI raster handling - your R graphics window may stop displaying output") bb <- bbox(x) scl <- function(xx, zlim) { xx = matrix(as.numeric(xx), nrow(xx), ncol(xx)) #dr <- diff(range(x, na.rm = TRUE)) dr = diff(zlim) #mx <- min(x, na.rm = TRUE) mx = zlim[1] xx[xx < zlim[1] | xx > zlim[2]] = NA if (abs(dr) < .Machine$double.eps) res <- ifelse(is.na(xx), xx, 0.5) else res <- (xx - mx) / dr res } } if (is.null(red)) { if (exists("rasterImage") && useRasterImage) { if (!missing(breaks)) warning("set useRasterImage to FALSE when using breaks") #x <- x[attr] # NAs <- is.na(x[[1]]) m <- scl(t(matrix(x[attr][[1]], x@grid@cells.dim[1], x@grid@cells.dim[2])), zlim) m <- matrix(col[as.vector(m) * (length(col)-1) + 1], nrow(m), ncol(m)) ## if missing, set to transparent # m[is.na(m)] <- rgb(1, 1, 1, 0) rasterImage(m, bb[1,1], bb[2,1], bb[1,2], bb[2,2], interpolate = interpolate, angle = angle) } else { if (is.factor(x[[attr]])) x[[attr]] = as.numeric(x[[attr]]) image(as.image.SpatialGridDataFrame(x[attr], xcol, ycol), add = TRUE, col = col, zlim = zlim, breaks = breaks, ...) } } else { if (is.null(green) || is.null(blue)) stop("all colour bands must be given") # modified to handle NAs in input (typical for coercion of Spatial Pixels # to Spatial Grid) if (exists("rasterImage") && useRasterImage) { if (!missing(breaks)) warning("set useRasterImage to FALSE when using breaks") xd <- x@data[, c(red, green, blue)] NAs <- is.na(xd[, 1]) | is.na(xd[, 2]) | is.na(xd[, 3]) if (any(NAs)) xd <- xd[!NAs, ] ## create RGBs (using alpha=1 by default) RGBs <- rgb(xd, maxColorValue = 255) if (any(NAs)) { z <- rep(NA, length(NAs)) z[!NAs] <- RGBs RGBs <- z } cv <- coordinatevalues(getGridTopology(x)) m <- t(matrix(RGBs, x@grid@cells.dim[1], x@grid@cells.dim[2], byrow = FALSE)) rasterImage(m, bb[1,1], bb[2,1], bb[1,2], bb[2,2], interpolate = interpolate, angle = angle) } else { xd <- x@data[,c(red, green, blue)] NAs <- is.na(xd[,1]) | is.na(xd[,2]) | is.na(xd[,3]) if (any(NAs)) xd <- xd[!NAs,] RGBs <- rgb(xd, maxColorValue = 255) if (any(NAs)) { z <- rep(NA, length(NAs)) z[!NAs] <- RGBs RGBs <- z } fcols <- factor(RGBs) cv <- coordinatevalues(getGridTopology(x)) m <- matrix(as.integer(fcols), x@grid@cells.dim[1], x@grid@cells.dim[2], byrow=FALSE) res <- list(x=cv[[xcol]], y=sort(cv[[ycol]]), z=m[,ncol(m):1,drop=FALSE]) image(res, col=levels(fcols), add = TRUE, breaks = breaks, ...) } } } contour.SpatialGridDataFrame = function(x, attr = 1, xcol = 1, ycol = 2, col = 1, add = FALSE, xlim = NULL, ylim = NULL, axes = FALSE, ..., setParUsrBB = FALSE) { if (!add) plot(as(x, "Spatial"), xlim = xlim, ylim = ylim, axes = axes, ..., setParUsrBB=setParUsrBB) contour(as.image.SpatialGridDataFrame(x[attr], xcol, ycol), col = col, add = TRUE, ...) } contour.SpatialPixelsDataFrame = function(x, ...) contour(as(x, "SpatialGridDataFrame"), ...) as.image.SpatialGridDataFrame = function(x, xcol = 1, ycol = 2, attr = 1) { cv = coordinatevalues(getGridTopology(x)) m = as(x[attr], "matrix") list(x = cv[[xcol]], y = sort(cv[[ycol]]), z = m[,ncol(m):1,drop=FALSE]) } # contributed by Michael Sumner 24 Oct 2007 image2Grid <- function (im, p4 = as.character(NA), digits=10) { if (!all(c("x", "y", "z") %in% names(im))) stop("image must have components x, y, and z") # RSB reversed test order lux <- length(unique(signif(diff(im$x), digits=digits))) luy <- length(unique(signif(diff(im$y), digits=digits))) if (lux > 1 || luy > 1) stop("x or y not equally spaced") # RSB check for equal spacing cells.dim <- dim(im$z) xx <- im$x yy <- im$y lx <- length(xx) ly <- length(yy) if (all(c(lx, ly) == (cells.dim + 1))) { ##print("corners") if (!(lx == nrow(im$z) + 1 && ly == ncol(im$z) + 1 ) ) stop("dimensions of z are not length(x)(-1) times length(y)(-1)") xx <- xx[-1] - diff(xx[1:2])/2 yy <- yy[-1] - diff(yy[1:2])/2 } else { if (!(lx == nrow(im$z) && ly == ncol(im$z))) stop("dimensions of z are not length(x) times length(y)") } SpatialGridDataFrame(GridTopology(c(xx[1], yy[1]), c(diff(xx[1:2]), diff(yy[1:2])), cells.dim), data.frame(z = as.vector(im$z[, ncol(im$z):1])), proj4string = CRS(p4)) } # copied from the svMisc package, copyright Philippe Grosjean, # Romain Francois & Kamil Barton ".isSDI" <- function() { # This function is specific to Windows, but it is defined everywhere # so that we don't have to test the platform before use! # Check if Rgui was started in SDI mode (needed by some GUI clients) # 1) First is it Rgui? if (!.Platform$GUI[1] == "Rgui") return(FALSE) # This is not Rgui # RGui SDI mode: returns "R Console", in MDI mode: returns "RGui" if (getIdentification() == "R Console") return(TRUE) else return(FALSE) } # menugget, # from https://gist.github.com/menugget/7689145/raw/dac746aa322ca4160a5fe66c70fec16ebe26faf9/image.scale.2.r #This function creates a color scale for use with the image() #function. Input parameters should be consistent with those #used in the corresponding image plot. The "axis.pos" argument #defines the side of the axis. The "add.axis" argument defines #whether the axis is added (default: TRUE)or not (FALSE). imageScale <- function(z, zlim, col = heat.colors(12), breaks, axis.pos = 1, add.axis = TRUE, ...) { if (!missing(breaks)) if(length(breaks) != (length(col)+1)){stop("must have one more break than colour")} if (missing(breaks) & !missing(zlim)) breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) if (missing(breaks) & missing(zlim)) { zlim <- range(z, na.rm=TRUE) zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) } poly <- vector(mode="list", length(col)) for (i in seq(poly)) poly[[i]] <- c(breaks[i], breaks[i+1], breaks[i+1], breaks[i]) if (axis.pos %in% c(1,3)){ ylim<-c(0,1) xlim<-range(breaks) } if (axis.pos %in% c(2,4)) { ylim<-range(breaks) xlim<-c(0,1) } plot(1,1,t="n",ylim=ylim, xlim=xlim, axes=FALSE, xlab="", ylab="", xaxs="i", yaxs="i", ...) for (i in seq(poly)) { if(axis.pos %in% c(1,3)) polygon(poly[[i]], c(0,0,1,1), col=col[i], border=NA) if(axis.pos %in% c(2,4)) polygon(c(0,0,1,1), poly[[i]], col=col[i], border=NA) } box() if (add.axis) axis(axis.pos) } sp/R/SpatialGrid-methods.R0000644000176200001440000002750412613427376015107 0ustar liggesusersSpatialPixels = function(points, tolerance = sqrt(.Machine$double.eps), proj4string = CRS(as.character(NA)), round = NULL, grid = NULL) { if (!is(points, "SpatialPoints")) stop("points should be of class or extending SpatialPoints") is.gridded = gridded(points) if (is.na(proj4string(points))) proj4string(points) = proj4string if (is.null(grid)) grid = points2grid(points, tolerance, round) if (!is.gridded) { points@bbox[,1] = points@bbox[,1] - 0.5 * grid@cellsize points@bbox[,2] = points@bbox[,2] + 0.5 * grid@cellsize } new("SpatialPixels", points, grid = grid, grid.index = getGridIndex(coordinates(points), grid)) } SpatialGrid = function(grid, proj4string = CRS(as.character(NA))) { stopifnot(is(grid, "GridTopology")) if (is.character(proj4string)) proj4string = CRS(proj4string) cc = rbind(grid@cellcentre.offset - 0.5 * grid@cellsize, grid@cellcentre.offset + (grid@cells.dim - 0.5) * grid@cellsize) bb = .bboxCoords(cc) new("SpatialGrid", grid = grid, bbox = bb, proj4string = proj4string) } setAs("SpatialGrid", "SpatialPixels", function(from) { pts = as(from, "SpatialPoints") new("SpatialPixels", pts, grid = from@grid, grid.index = 1:length(pts)) } ) setAs("SpatialGrid", "SpatialPoints", function(from) SpatialPoints(coordinates(from), from@proj4string)) setMethod("coordinates", "SpatialPixels", function(obj) obj@coords) row.names.SpatialPixels <- function(x) { ret = dimnames(slot(x, "coords"))[[1]] if (is.null(ret)) ret = seq_len(nrow(x@coords)) ret } row.names.SpatialGrid <- function(x) 1:prod(x@grid@cells.dim) setMethod("coordinates", "SpatialGrid", function(obj) coordinates(obj@grid)) setMethod("plot", signature(x = "SpatialGrid", y = "missing"), function(x, y, ..., grid = TRUE) { if (grid) plot.SpatialGrid(x, ...) else plot(as(x, "SpatialPoints"), ...) } ) setMethod("plot", signature(x = "SpatialPixels", y = "missing"), function(x, y, ..., grid = TRUE) { if (grid) plot.SpatialPixels(x, ...) else plot(as(x, "SpatialPoints"), ...) } ) coordnamesSG = function(x, value) { dimnames(x@bbox)[[1]] = value if (is(x, "SpatialPixels")) dimnames(x@coords)[[2]] = value coordnames(x@grid) = value x } setReplaceMethod("coordnames", signature(x = "SpatialGrid", value = "character"), coordnamesSG) setReplaceMethod("coordnames", signature(x = "SpatialPixels", value = "character"), coordnamesSG) getGridTopology = function(obj) { if (!(is(obj, "SpatialPixels") || is(obj, "SpatialGrid"))) stop("object is not or does not extend class SpatialPixels or SpatialGrid") obj@grid } areaSpatialGrid = function(obj) { cellarea = prod(obj@grid@cellsize) if (is(obj, "SpatialGrid")) return(prod(obj@grid@cells.dim) * cellarea) else # take number of cells: length(obj@grid.index) * cellarea } gridparameters = function(obj) { if (is(obj, "SpatialPixels") || is(obj, "SpatialGrid")) obj = obj@grid if (is(obj, "GridTopology")) return(data.frame( cellcentre.offset = obj@cellcentre.offset, cellsize = obj@cellsize, cells.dim = obj@cells.dim)) return(numeric(0)) } getGridIndex = function(cc, grid, all.inside = TRUE) { n = ncol(cc) idx = rep(1, nrow(cc)) cumprod = 1 for (i in 1:n) { this.idx = round((cc[,i] - grid@cellcentre.offset[i])/grid@cellsize[i]) if (i == 2) this.idx = grid@cells.dim[2] - (this.idx + 1) outside = this.idx >= grid@cells.dim[i] | this.idx < 0 if (any(outside)) { if (all.inside) { print(summary(this.idx)) stop("this.idx out of range") } else this.idx[outside] = NA } idx = idx + this.idx * cumprod cumprod = cumprod * grid@cells.dim[i] } outside = idx < 1 | idx > .NumberOfCells(grid) if (any(na.omit(outside))) { print(summary(idx)) stop("index outside boundaries") } as.integer(round(idx)) } rcFromGridIndex = function(obj) { # returns entries: col,row rather than row,col obj = as(obj, "SpatialPixels") gi = obj@grid.index grid = obj@grid stopifnot(ncol(coordinates(obj)) == 2) xi = ((gi - 1) %% grid@cells.dim[1]) + 1 yi = grid@cells.dim[2] - ((gi - 1) %/% grid@cells.dim[1]) cbind(xi,yi) } gridIndex2nb = function(obj, maxdist = sqrt(2), fullMat = TRUE, ...) { xy = rcFromGridIndex(obj) if (fullMat) lst = apply(as.matrix(dist(xy, ...)), 1, function(x) which(x <= maxdist)) else { dst = function(X, Xi) apply(X, 1, function(Y) sqrt(sum((Y-Xi)^2))) n = nrow(xy) lst = vector(mode = "list", length = n) for (i in 1:n) { # avoid the n x n matrix construction: d = dst(xy, xy[i,]) lst[[i]] = which(d <= maxdist) } } class(lst) = c("nb", "list") lst } setMethod("[", "SpatialPixels", function(x, i, j, ..., drop = FALSE) { if (!missing(j)) stop("can only select pixels with a single index") if (missing(i)) return(x) if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (drop) { # if FALSE: adjust bbox and grid res = as(x, "SpatialPoints")[i] tolerance = list(...)$tolerance if (!is.null(tolerance)) res = SpatialPixels(res, tolerance = tolerance) else gridded(res) = TRUE res } else # default: don't adjust bbox and grid new("SpatialPixels", bbox = x@bbox, proj4string = x@proj4string, coords = x@coords[i, , drop = FALSE], grid = x@grid, grid.index = x@grid.index[i]) } ) setMethod("[", "SpatialGrid", function(x, i, j, ..., drop = TRUE) { drop <- FALSE # if (!missing(drop)) # stop("don't supply drop: it needs to be FALSE anyway") gr = x@grid if (missing(i)) rows = 1:gr@cells.dim[2] else { if (is(i, "Spatial")) stop("area selection only makes sense for objects of class SpatialPixels or SpatialGridDataFrame; for object of class SpatialGrid you can only select x[rows,cols]") rows = i } if (missing(j)) cols = 1:gr@cells.dim[1] else cols = j idx = 1:prod(gr@cells.dim[1:2]) if (any(is.na(rows)) || any(is.na(cols))) stop("NAs not permitted in indices") m = matrix(idx, gr@cells.dim[2], gr@cells.dim[1], byrow = TRUE)[rows,cols] idx = as.vector(m) # t(m)? cc = SpatialPixels(SpatialPoints(coordinates(x)[idx,,drop=FALSE], CRS(proj4string(x)))) cc = as(cc, "SpatialGrid") cc } ) setAs("SpatialPixels", "SpatialGrid", function(from) SpatialGrid(from@grid, from@proj4string)) #setAs("SpatialGrid", "SpatialPixels", # function(from) { # pts = new("SpatialPoints", coords = coordinates(from), # bbox = from@bbox, proj4string = from@proj4string) # new("SpatialPixels", pts, grid = from@grid, grid.index = 1:NROW(cc)) #}) as.data.frame.SpatialPixels = function(x, row.names, optional, ...) as.data.frame(coordinates(x)) as.data.frame.SpatialGrid = as.data.frame.SpatialPixels setAs("SpatialPixels", "data.frame", function(from) as.data.frame.SpatialPixels(from)) setAs("SpatialGrid", "data.frame", function(from) as.data.frame.SpatialGrid(from)) print.SpatialPixels = function(x, ...) { cat("Object of class SpatialPixels\n") print(summary(x@grid)) cat("SpatialPoints:\n") print(coordinates(x)) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") invisible(x) } setMethod("show", "SpatialPixels", function(object) print.SpatialPixels(object)) print.SpatialGrid = function(x, ...) { cat("Object of class SpatialGrid\n") print(summary(x@grid)) cat("SpatialPoints:\n") print(coordinates(x)) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") invisible(x) } setMethod("show", "SpatialGrid", function(object) print.SpatialGrid(object)) # make a SpatialPolygons from a SpatialPixels - Kohris Sahlen workshop as.SpatialPolygons.SpatialPixels <- function(obj) { obj_crds <- coordinates(obj) IDs <- IDvaluesSpatialPixels(obj) nPolygons <- nrow(obj_crds) cS <- slot(slot(obj, "grid"), "cellsize") cS2 <- cS/2 cS2x <- cS2[1] cS2y <- cS2[2] Srl <- vector(mode="list", length=nPolygons) for (i in 1:nPolygons) { xi <- obj_crds[i,1] yi <- obj_crds[i,2] x <- c(xi-cS2x, xi-cS2x, xi+cS2x, xi+cS2x, xi-cS2x) y <- c(yi-cS2y, yi+cS2y, yi+cS2y, yi-cS2y, yi-cS2y) Srl[[i]] <- Polygons(list(Polygon(coords=cbind(x, y))), ID=IDs[i]) comment(Srl[[i]]) <- "0" } res <- SpatialPolygons(Srl, proj4string=CRS(proj4string(obj))) res } setAs("SpatialPixels", "SpatialPolygons", function(from) as.SpatialPolygons.SpatialPixels(from)) IDvaluesSpatialPixels <- function(obj) { if (!is(obj, "SpatialPixels")) stop("function only works for objects of class or extending SpatialPixels") cc <- slot(obj, "grid.index") res <- as.matrix(sapply(cc, as.integer)) paste("g", res, sep="") } length.SpatialPixels = function(x) { nrow(x@coords) } length.SpatialGrid = function(x) { .NumberOfCells(x@grid) } setAs("SpatialGrid", "SpatialPolygons", function(from) { ret = as.SpatialPolygons.GridTopology(from@grid) proj4string(ret) = proj4string(from) ret } ) setMethod("coordnames", signature(x = "SpatialGrid"), function(x) dimnames(bbox(x))[[1]]) setReplaceMethod("coordnames", signature(x = "SpatialGrid", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value coordnames(x@grid) = value x } ) setAs("SpatialGrid", "GridTopology", function(from) getGridTopology(from)) setAs("SpatialPixels", "GridTopology", function(from) getGridTopology(from)) plot.SpatialGrid = function(obj, ..., col = par("fg"), lty = par("lty"), lwd = par("lwd"), add = FALSE) { if (! add) plot(as(obj, "Spatial"), ...) gr = obj@grid # Don MacQueen, Feb 12 2015 csiz <- gr@cellsize ncells <- gr@cells.dim nbounds <- ncells+1 ## first get and sort the cell centers cv <- coordinatevalues(gr) cv[[1]] <- sort(cv[[1]]) cv[[2]] <- sort(cv[[2]]) ## calculate cell boundaries cv[[1]] <- c(cv[[1]][1] - csiz[1]/2, cv[[1]] + csiz[1]/2 ) cv[[2]] <- c(cv[[2]][1] - csiz[2]/2, cv[[2]] + csiz[2]/2 ) ## construct endpoints of cell boundary lines ## vertical lines vfrom <- cbind(cv[[1]], cv[[2]][1]) vto <- cbind(cv[[1]], cv[[2]][nbounds[2]]) ## horizontal lines hfrom <- cbind(cv[[1]][1], cv[[2]]) hto <- cbind(cv[[1]][nbounds[1]], cv[[2]]) ## add to plot segments(vfrom[,1], vfrom[,2] , vto[,1], vto[,2], col = col, lty = lty, lwd = lwd) segments(hfrom[,1], hfrom[,2] , hto[,1], hto[,2], col = col, lty = lty, lwd = lwd) } plot.SpatialPixels = function(obj, ..., col = par("fg"), lty = par("lty"), lwd = par("lwd"), add = FALSE) { # based on plot.SpatialGrid: if (! add) plot(as(obj, "Spatial"), ...) gr = obj@grid csiz <- gr@cellsize ncells <- gr@cells.dim nbounds <- ncells + 1 m = matrix(FALSE, ncells[2], ncells[1]) rc = rcFromGridIndex(obj)[,c(2,1)] m[rc] = TRUE # the pattern ## first get and sort the cell centers cv <- coordinatevalues(gr) cv[[1]] <- sort(cv[[1]]) cv[[2]] <- sort(cv[[2]]) ## calculate cell boundaries x <- c(cv[[1]][1] - csiz[1]/2, cv[[1]] + csiz[1]/2 ) y <- c(cv[[2]][1] - csiz[2]/2, cv[[2]] + csiz[2]/2 ) # horizontal lines: p = do.call(rbind, lapply(1:nbounds[2], function(i) { if (i == 1) # bottom line cells = m[1,] else if (i == nbounds[2]) # top line cells = m[nbounds[2]-1,] else # in-between, draw for: cells = m[i-1,] | m[i,] r = rle(cells) # figure out line pieces if (any(r$values)) { wr = which(r$values) # where to draw/end cs0 = c(0, cumsum(r$lengths)) # all start/end indices cbind(x[cs0[wr] + 1], y[i], x[cs0[wr+1] + 1], y[i]) } } )) segments(p[,1], p[,2], p[,3], p[,4], col = col, lty = lty, lwd = lwd) # vertical lines: p = do.call(rbind, lapply(1:nbounds[1], function(i) { if (i == 1) # left boundary cells = m[,1] else if (i == nbounds[1]) # right boundary cells = m[,nbounds[1]-1] else # non-boundary lines, draw for: cells = m[,i-1] | m[,i] r = rle(cells) if (any(r$values)) { wr = which(r$values) cs0 = c(0, cumsum(r$lengths)) cbind(x[i], y[cs0[wr]+1], x[i], y[cs0[wr+1]+1]) } } )) segments(p[,1], p[,2], p[,3], p[,4], col = col, lty = lty, lwd = lwd) } sp/R/SpatialMultiPointsDataFrame-methods.R0000644000176200001440000001136112577541412020245 0ustar liggesusers"SpatialMultiPointsDataFrame" = function(coords, data, proj4string = CRS(as.character(NA)), match.ID, bbox = NULL) { if (!is(coords, "SpatialMultiPoints")) coords = SpatialMultiPoints(coords, proj4string = proj4string, bbox = bbox) mtch = NULL cc.ID = names(coords@coords) if (missing(match.ID)) { # sort it out: if (is.null(cc.ID) || any(cc.ID == "")) match.ID = FALSE # nothing to match to! else { mtch = match(cc.ID, row.names(data)) match.ID = !any(is.na(mtch)) # && length(unique(mtch)) == nrow(data) if (match.ID && any(mtch != 1:nrow(data))) warning("forming a SpatialMultiPointsDataFrame based on maching IDs, not on record order. Use match.ID = FALSE to match on record order") } } else if (is.character(match.ID)) { row.names(data) = data[, match.ID[1]] match.ID = TRUE } if (match.ID) { if (!is.null(cc.ID) && is(data, "data.frame")) { # match ID: if (is.null(mtch)) mtch = match(cc.ID, row.names(data)) if (any(is.na(mtch))) stop("row.names of data and coords do not match") if (length(unique(mtch)) != nrow(data)) stop("row.names of data and dimnames of coords do not match") data = data[mtch, , drop = FALSE] } } if (is.character(attr(data, "row.names"))) # i.e., data has "real" row names names(coords@coords) = row.names(data) new("SpatialMultiPointsDataFrame", coords, data = data) } # setMethod("coordinates", "SpatialMultiPointsDataFrame", function(obj) obj@coords) setMethod("addAttrToGeom", signature(x = "SpatialMultiPoints", y = "data.frame"), function(x, y, match.ID, ...) SpatialMultiPointsDataFrame(x, y, match.ID = match.ID, ...) ) .asWKT = FALSE print.SpatialMultiPointsDataFrame = function(x, ..., digits = getOption("digits"), asWKT = .asWKT) { if (asWKT) df = data.frame(asWKTSpatialMultiPoints(x, digits), x@data) else { # old style cc = substring(paste(as.data.frame( t(signif(coordinates(x), digits)))),2,999) ix = rep(seq_along(x@coords), sapply(x@coords, nrow)) df = data.frame("coordinates" = cc, x@data[ix, , drop=FALSE]) } print(df, ..., digits = digits) } setMethod("show", "SpatialMultiPointsDataFrame", function(object) print(object)) dim.SpatialMultiPointsDataFrame = function(x) dim(x@data) as.data.frame.SpatialMultiPointsDataFrame = function(x, ...) { l = sapply(x@coords, nrow) ix = rep(1:length(l), l) data.frame(coordinates(x), index = ix, x@data[ix,,drop=FALSE], ...) } setAs("SpatialMultiPointsDataFrame", "data.frame", function(from) as.data.frame.SpatialMultiPointsDataFrame(from)) names.SpatialMultiPointsDataFrame <- function(x) names(x@data) "names<-.SpatialMultiPointsDataFrame" <- function(x, value) { checkNames(value) names(x@data) = value x } points.SpatialMultiPointsDataFrame = function(x, y = NULL, ...) points(as(x, "SpatialMultiPoints"), ...) text.SpatialMultiPointsDataFrame = function(x, ...) { lst = list(x = coordinates(x), ...) if (!is.null(x$pos) && is.null(lst$pos)) lst$pos = x$pos if (!is.null(x$offset) && is.null(lst$offset)) lst$offset = x$offset if (!is.null(x$labels) && is.null(lst$labels)) lst$labels = parse(text = x$lab) do.call(text, lst) } #row.names.SpatialMultiPointsDataFrame <- function(x) { # ret = dimnames(slot(x, "coords"))[[1]] # if (is.null(ret)) # ret = row.names(x@data) # ret #} #"row.names<-.SpatialMultiPointsDataFrame" <- function(x, value) { # dimnames(slot(x, "coords"))[[1]] <- value # rownames(slot(x, "data")) <- value # x #} setMethod("[", "SpatialMultiPointsDataFrame", function(x, i, j, ..., drop = TRUE) { missing.i = missing(i) missing.j = missing(j) nargs = nargs() # e.g., a[3,] gives 2 for nargs, a[3] gives 1. if (missing.i && missing.j) { i = TRUE j = TRUE } else if (missing.j && !missing.i) { if (nargs == 2) { j = i i = TRUE } else { j = TRUE } } else if (missing.i && !missing.j) i = TRUE if (is.matrix(i)) stop("matrix argument not supported in SpatialMultiPointsDataFrame selection") if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (is.character(i)) i <- match(i, row.names(x)) if (any(is.na(i))) stop("NAs not permitted in row index") x@coords = x@coords[i] if (length(x@coords)) x@bbox = .bboxMultiCoords(x@coords) x@data = x@data[i, j, ..., drop = FALSE] x }) # setMethod("split", "SpatialMultiPointsDataFrame", split.data.frame) setMethod("geometry", "SpatialMultiPointsDataFrame", function(obj) as(obj, "SpatialMultiPoints")) length.SpatialMultiPointsDataFrame = function(x) { length(x@coords) } setAs("SpatialMultiPointsDataFrame", "SpatialPointsDataFrame", function(from) { l = sapply(from@coords, nrow) ix = rep(1:length(l), l) new("SpatialPointsDataFrame", as(geometry(from), "SpatialPoints"), data = from@data[ix,,drop=FALSE], coords.nrs = numeric(0)) } ) sp/R/loadmeuse.R0000644000176200001440000000225212577541412013207 0ustar liggesusers# loadMeuse = function(gridded = TRUE, river = FALSE) { # crs = CRS("+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs") # meuse = NULL # meuse.grid = NULL # meuse.riv = NULL # data("meuse", envir = environment()) # coordinates(meuse) <- ~x+y # proj4string(meuse) <- crs # assign("meuse", meuse, envir = .GlobalEnv) # # data("meuse.grid", envir = environment()) # if (gridded) { # gridded(meuse.grid) <- ~x+y # } else # coordinates(meuse.grid) <- ~x+y # proj4string(meuse.grid) <- crs # assign("meuse.grid", meuse.grid, envir = .GlobalEnv) # # if (river) { # rm(meuse.riv) # data("meuse.riv", envir = environment()) # meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) # proj4string(meuse.riv) <- crs # assign("meuse.riv", meuse.riv, envir = .GlobalEnv) # } # invisible(NULL) # } loadMeuse = function() { #.Deprecated("demo(meuse)") warning("please run demo(meuse) to load the meuse data set") demo("meuse") } sp/R/gridded.R0000644000176200001440000000527712577541412012645 0ustar liggesuserssetMethod("gridded", "Spatial", function(obj) { is(obj, "SpatialPixels") || is(obj, "SpatialGrid") }) # grid -> points: setReplaceMethod("gridded", c("SpatialGridDataFrame", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPointsDataFrame"); obj }) setReplaceMethod("gridded", c("SpatialPixelsDataFrame", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPointsDataFrame"); obj }) setReplaceMethod("gridded", c("SpatialGrid", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPoints"); obj }) setReplaceMethod("gridded", c("SpatialPixels", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPoints"); obj }) # points -> grid: setReplaceMethod("gridded", c("SpatialPointsDataFrame", "logical"), function(obj, value) { if (value) obj = as(obj, "SpatialPixelsDataFrame"); obj }) setReplaceMethod("gridded", c("SpatialPoints", "logical"), function(obj, value) { if (value) obj = as(obj, "SpatialPixels"); obj }) # points -> grid, with grid specified as list(value, grid): setReplaceMethod("gridded", c("SpatialPointsDataFrame", "list"), function(obj, value) { if (value[[1]]) obj = SpatialPixelsDataFrame(obj, obj@data, grid = value[[2]]); obj }) setReplaceMethod("gridded", c("SpatialPoints", "list"), function(obj, value) { if (value[[1]]) obj = SpatialPixels(obj, grid = value[[2]]); obj }) # data.frame -> gridded: setReplaceMethod("gridded", c("data.frame", "formula"), function(obj, value) { coordinates(obj) = value; gridded(obj) = TRUE; obj }) setReplaceMethod("gridded", c("data.frame", "character"), function(obj, value) { coordinates(obj) = value; gridded(obj) = TRUE; obj }) # data.frame -> gridded, grid specified: setReplaceMethod("gridded", c("data.frame", "GridTopology"), function(obj, value) SpatialGridDataFrame(grid = SpatialGrid(grid = value), data.frame(obj))) setAs("SpatialPoints", "SpatialPixels", function(from) { SpatialPixels(from, grid = NULL) }) setAs("SpatialPointsDataFrame", "SpatialPixelsDataFrame", function(from) { SpatialPixelsDataFrame(from, from@data, grid = NULL) }) setMethod("fullgrid", c("Spatial"), function(obj) is(obj, "SpatialGrid")) setReplaceMethod("fullgrid", c("SpatialPixels", "logical"), function(obj, value) { if(value) obj = as(obj, "SpatialGrid"); obj }) setReplaceMethod("fullgrid", c("SpatialGrid", "logical"), function(obj, value) { if(!value) obj = as(obj, "SpatialPixels"); obj }) setReplaceMethod("fullgrid", c("SpatialPixelsDataFrame", "logical"), function(obj, value) { if(value) obj = as(obj, "SpatialGridDataFrame"); obj }) setReplaceMethod("fullgrid", c("SpatialGridDataFrame", "logical"), function(obj, value) { if(!value) obj = as(obj, "SpatialPixelsDataFrame"); obj }) sp/R/SpatialPoints-methods.R0000644000176200001440000000731012651644246015466 0ustar liggesusers"SpatialPoints" = function(coords, proj4string = CRS(as.character(NA)), bbox = NULL) { coords = coordinates(coords) # checks numeric mode colNames = dimnames(coords)[[2]] if (is.null(colNames)) colNames = paste("coords.x", 1:(dim(coords)[2]), sep = "") rowNames = dimnames(coords)[[1]] dimnames(coords) = list(rowNames, colNames) # preserve row names if non-NULL if (is.null(bbox)) bbox <- .bboxCoords(coords) new("SpatialPoints", coords = coords, bbox = bbox, proj4string = proj4string) # transpose bbox? } .bboxCoords = function(coords) { stopifnot(nrow(coords) > 0) bbox = t(apply(coords, 2, range)) dimnames(bbox)[[2]] = c("min", "max") as.matrix(bbox) } setMethod("coordinates", "matrix", function(obj) { if (!is.numeric(obj)) stop("cannot derive coordinates from non-numeric matrix") storage.mode(obj) <- "double" if (any(is.na(obj))) stop("NA values in coordinates") if (any(!is.finite(obj))) stop("non-finite coordinates") obj } ) setMethod("coordinates", "data.frame", function(obj)coordinates(as.matrix(obj))) setMethod("coordinates", "list", function(obj) coordinates(as.data.frame(obj))) asWKTSpatialPoints = function(x, digits = getOption("digits")) { data.frame(geometry = paste("POINT(",unlist(lapply(data.frame( t(signif(coordinates(x),digits = digits))), paste, collapse=" ")),")",sep="")) } "print.SpatialPoints" <- function(x, ..., digits = getOption("digits"), asWKT = .asWKT) { cat("SpatialPoints:\n") if (asWKT) print(asWKTSpatialPoints(x, digits)) else print(x@coords) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") } setMethod("show", "SpatialPoints", function(object) print.SpatialPoints(object)) plot.SpatialPoints = function(x, pch = 3, axes = FALSE, add = FALSE, xlim = NULL, ylim = NULL, ..., setParUsrBB=FALSE, cex = 1, col = 1, lwd = 1, bg = 1) { if (! add) plot(as(x, "Spatial"), axes = axes, xlim = xlim, ylim = ylim, ..., setParUsrBB=setParUsrBB) cc = coordinates(x) points(cc[,1], cc[,2], pch = pch, cex = cex, col = col, lwd = lwd, bg = bg) } setMethod("plot", signature(x = "SpatialPoints", y = "missing"), function(x,y,...) plot.SpatialPoints(x,...)) points.SpatialPoints = function(x, y = NULL, ...) points(coordinates(x), ...) setMethod("coordinates", "SpatialPoints", function(obj) obj@coords) as.data.frame.SpatialPoints = function(x, row.names, optional, ...) data.frame(x@coords) setAs("SpatialPoints", "data.frame", function(from) as.data.frame(from)) row.names.SpatialPoints <- function(x) { ret = dimnames(slot(x, "coords"))[[1]] if (is.null(ret)) seq_len(nrow(slot(x, "coords"))) else ret } "row.names<-.SpatialPoints" <- function(x, value) { dimnames(slot(x, "coords"))[[1]] <- value x } setMethod("[", "SpatialPoints", function(x, i, j, ..., drop = TRUE) { if (!missing(j)) warning("j index ignored") if (is.character(i)) i <- match(i, row.names(x)) else if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (any(is.na(i))) stop("NAs not permitted in row index") x@coords = x@coords[i, , drop = FALSE] if (drop && nrow(x@coords)) x@bbox = .bboxCoords(x@coords) x }) setMethod("coordnames", signature(x = "SpatialPoints"), function(x) dimnames(x@coords)[[2]]) setReplaceMethod("coordnames", signature(x = "SpatialPoints", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value dimnames(x@coords)[[2]] = value x } ) length.SpatialPoints = function(x) { nrow(x@coords) } setMethod("$", "SpatialPoints", function(x, name) { if (name %in% coordnames(x)) return(x@coords[,name]) if (!("data" %in% slotNames(x))) stop("no $ method for object without attributes") x@data[[name]] } ) sp/R/projected.R0000644000176200001440000000470512610741504013205 0ustar liggesuserssetMethod("proj4string", signature(obj = "Spatial"), function(obj) as.character(obj@proj4string@projargs) ) ReplProj4string = function(obj, value) { p4str <- value@projargs ll <- FALSE if (!is.na(p4str)) { res <- grep("longlat", p4str, fixed=TRUE) if (length(res) != 0) ll <- TRUE } if (ll) { bb <- bbox(obj) ll_sanity_res <- .ll_sanity(bb) if (!ll_sanity_res) { lst <- sapply(attr(ll_sanity_res, "details"), attr, "out") out <- paste(format(unlist(lst), digits=12), collapse=" ") mess <- paste("Geographical CRS given to", "non-conformant data:", out) if (get_ll_warn()) warning(mess) else stop(mess) } } if (!is.na(is.projected(obj)) && !is.na(p4str)) { p4s <- proj4string(obj) if (p4s != p4str) { mess <- paste("A new CRS was assigned to an object with an existing CRS:\n", p4s, "\nwithout reprojecting.\nFor reprojection, use function spTransform", sep="") if (get_ReplCRS_warn()) warning(mess) } } obj@proj4string = value; obj } setReplaceMethod("proj4string", c("Spatial", "character"), function(obj, value) ReplProj4string(obj, CRS(value))) setReplaceMethod("proj4string", c("Spatial", "CRS"), ReplProj4string) # split out from proj4string<- and Spatial validity to cover numerical fuzz # RSB 070216 .ll_sanity <- function(bb) { TOL <- get_ll_TOL() tol <- .Machine$double.eps ^ TOL W <- bb[1,1] < -180 && !isTRUE(all.equal((bb[1, 1] - -180), 0, tolerance = tol)) if (W) attr(W, "out") <- bb[1,1] E <- bb[1,2] > 360 && !isTRUE(all.equal((bb[1, 2] - 360), 0, tolerance = tol)) if (E) attr(E, "out") <- bb[1,2] S<- bb[2,1] < -90 && !isTRUE(all.equal((bb[2, 1] - -90), 0, tolerance = tol)) if (S) attr(S, "out") <- bb[2,1] N <- bb[2,2] > 90 && !isTRUE(all.equal((bb[2, 2] - 90), 0, tolerance = tol)) if (N) attr(N, "out") <- bb[2,2] res <- !(any(W || E || S || N)) attr(res, "details") <- list(W, E, S, N) res } setMethod("is.projected", signature(obj = "Spatial"), function(obj) { p4str <- proj4string(obj) if (is.na(p4str) || !nzchar(p4str)) return(as.logical(NA)) else { res <- grep("longlat", p4str, fixed = TRUE) if (length(res) == 0) return(TRUE) else return(FALSE) } } ) sp/R/merge.R0000644000176200001440000000272312604621442012324 0ustar liggesusers# Author: Robert J. Hijmans # Date : November 2011 / October 2015 # Version 2 # Licence GPL v3 if (!isGeneric("merge")) { setGeneric("merge", function(x, y, ...) standardGeneric("merge")) } setMethod('merge', signature(x='Spatial', y='ANY'), function(x, y, ...) { y <- try(as.data.frame(y)) if (class(y) != 'data.frame') { stop('y cannot be coerced to a data.frame') } merge(x, y) } ) setMethod('merge', signature(x='Spatial', y='data.frame'), function(x, y, by=intersect(names(x), names(y)), by.x=by, by.y=by, all.x=TRUE, suffixes = c(".x",".y"), incomparables = NULL, duplicateGeoms=FALSE, ...) { if (!('data' %in% slotNames(x))) stop('x has no attributes') x$DoNotUse_temp_sequential_ID_963 <- 1:nrow(x) d <- merge(x@data, y, by=by, by.x=by.x, by.y=by.y, suffixes=suffixes, incomparables=incomparables, all.x=all.x, all.y=FALSE) if (!all.x) { # Spatial* objects cannot have NULL geometries if (nrow(d) == 0) { warning('no matching records') return(NULL) } } # sort the merged table d <- d[order(d$DoNotUse_temp_sequential_ID_963), ] # Normally we want one-to-one joins with spatial data if (!duplicateGeoms) { if (any(table(d$DoNotUse_temp_sequential_ID_963) > 1)) { stop('non-unique matches detected') } } # duplicate (duplicateGeoms = TRUE) or remove (all.x=FALSE) records if needed x <- x[d$DoNotUse_temp_sequential_ID_963, ] d$DoNotUse_temp_sequential_ID_963 <- NULL x@data <- d x } ) sp/R/stack.R0000644000176200001440000000401312577541412012333 0ustar liggesusers"spmap.to.lev" <- function (data, zcol = 1:n, n = 2, names.attr) { if (!(is(data, "SpatialPointsDataFrame") || (is(data, "SpatialGridDataFrame")))) stop("data is not of a class that extends SpatialPointsDataFrame") if (dimensions(data) > 2) { warning("spmap.to.lev ignores spatial dimensions beyond the first 2") cc = coordinates(data)[,1:2] data = as(data, "data.frame") coordinates(data) = cc } coord.names = dimnames(data@coords)[[2]] if (missing(names.attr)) { if (is.character(zcol)) names.attr = zcol else { names.attr = names(data)[zcol] zcol = names.attr } } else { if (length(names.attr) != length(zcol)) stop("length names.attr should match length of zcol") if (!is.character(zcol)) zcol = names(data)[zcol] } data = stack(as(data, "SpatialPointsDataFrame"), zcol) # replace with data.frame #data$ind = factor(as.character(data$ind), levels = zcol, labels = names.attr) # Arien Lam suggested: #data$ind = factor(data$ind, levels = unique(data$ind), labels = names.attr) # better (as it avoids unique()) is: data$ind = factor(data$ind, levels = zcol, labels = names.attr) names(data) = c(coord.names, "z", "name") data } stack.SpatialPointsDataFrame = function (x, select, ...) { lev = NULL xd = x@data cc = coordinates(x) cc.names = dimnames(cc)[[2]] if (!missing(select)) xd = xd[select] if (is.factor(xd[[1]])) { lev = levels(xd[[1]]) if (length(xd) > 1) for (i in 2:length(xd)) if (!identical(lev, levels(xd[[i]]))) stop("all factors should have identical levels") } nc = ncol(xd) xd = stack(data.frame(lapply(xd, as.numeric))) if (!is.null(lev)) xd[[1]] = factor(lev[xd[[1]]], levels = lev) ccr = data.frame(rep(cc[,1], nc)) for (i in 2:ncol(cc)) ccr = data.frame(ccr, rep(cc[,i], nc)) names(ccr) = cc.names data.frame(ccr, xd) } stack.SpatialGridDataFrame = function (x, select, ...) stack(as(x, "SpatialPointsDataFrame"), select, ...) stack.SpatialPixelsDataFrame = function (x, select, ...) stack(as(x, "SpatialPointsDataFrame"), select, ...) sp/R/mapasp.R0000644000176200001440000000073512577541412012516 0ustar liggesusersmapasp <- function(data, xlim = bbox(data)[1,], ylim = bbox(data)[2,]) { # calculates aspect ratio for levelplot of geographic data, # using proportial units (compare eqscplot) if (!is(data, "Spatial")) stop("cannot extract coordinates bounding box from data") if (!(is.na(proj4string(data)) || is.projected(data))) return( (diff(ylim)/diff(xlim)) / cos((mean(ylim) * pi)/180)) if (is.R() && version$major >= 2) return("iso") else return(diff(ylim)/diff(xlim)) } sp/R/rbind.R0000644000176200001440000000672412733304003012322 0ustar liggesusersmakeUniqueIDs <- function(lst) { ids = sapply(lst, function(i) slot(i, "ID")) if (any(duplicated(ids))) { ids <- make.unique(as.character(unlist(ids)), sep = "") for (i in seq(along = ids)) lst[[i]]@ID = ids[i] } lst } rbind.SpatialPoints <- function(...) { dots = list(...) names(dots) <- NULL stopifnot(identicalCRS(dots)) dropRowNames = is.null(dimnames(dots[[1]]@coords)[[1]]) # or check each of them? coordinates.strip = function(x) { x = coordinates(x) row.names(x) = NULL x } ret = SpatialPoints(do.call(rbind, lapply(dots, coordinates.strip)), CRS(proj4string(dots[[1]]))) if (!dropRowNames) row.names(ret) = make.unique(do.call(c, lapply(dots, row.names))) ret } rbind.SpatialPointsDataFrame <- function(...) { dots = list(...) names(dots) <- NULL # bugfix Clement Calenge 100417 sp = do.call(rbind, lapply(dots, function(x) as(x, "SpatialPoints"))) df = do.call(rbind, lapply(dots, function(x) x@data)) SpatialPointsDataFrame(sp, df, coords.nrs = dots[[1]]@coords.nrs) } # contributed by Kent Johnson, r-sig-geo, Dec 5, 2015: rbind.SpatialMultiPoints <- function(...) { dots = list(...) names(dots) <- NULL stopifnot(identicalCRS(dots)) SpatialMultiPoints(do.call(c, lapply(dots, slot, name="coords")), CRS(proj4string(dots[[1]]))) } rbind.SpatialMultiPointsDataFrame <- function(...) { dots = list(...) names(dots) <- NULL sp = do.call(rbind, lapply(dots, function(x) as(x, "SpatialMultiPoints"))) df = do.call(rbind, lapply(dots, function(x) x@data)) SpatialMultiPointsDataFrame(sp, df) } rbind.SpatialPixels = function(...) { dots = list(...) names(dots) <- NULL sp = do.call(rbind, lapply(dots, function(x) as(x, "SpatialPoints"))) gridded(sp) = T sp } rbind.SpatialPixelsDataFrame = function(...) { dots = list(...) names(dots) <- NULL sp = do.call(rbind, lapply(dots, function(x) as(x, "SpatialPointsDataFrame"))) gridded(sp) = T sp } rbind.SpatialPolygons = function(..., makeUniqueIDs = FALSE) { dots = list(...) names(dots) <- NULL stopifnot(identicalCRS(dots)) # checkIDSclash(dots) pl = do.call(c, lapply(dots, function(x) slot(x, "polygons"))) if (makeUniqueIDs) pl = makeUniqueIDs(pl) SpatialPolygons(pl, proj4string = CRS(proj4string(dots[[1]]))) } rbind.SpatialPolygonsDataFrame <- function(..., makeUniqueIDs = TRUE) { dots = list(...) names(dots) <- NULL # bugfix Clement Calenge 100417 lst = lapply(dots, function(x) as(x, "SpatialPolygons")) lst$makeUniqueIDs = makeUniqueIDs pl = do.call(rbind.SpatialPolygons, lst) df = do.call(rbind, lapply(dots, function(x) x@data)) SpatialPolygonsDataFrame(pl, df, match.ID = FALSE) } rbind.SpatialLines = function(..., makeUniqueIDs = TRUE) { dots = list(...) names(dots) <- NULL stopifnot(identicalCRS(dots)) ll = do.call(c, lapply(dots, function(x) slot(x, "lines"))) if (makeUniqueIDs) ll = makeUniqueIDs(ll) SpatialLines(ll, proj4string = CRS(proj4string(dots[[1]]))) } rbind.SpatialLinesDataFrame <- function(...) { dots = list(...) names(dots) <- NULL # bugfix Clement Calenge 100417 ll = do.call(rbind, lapply(dots, function(x) as(x, "SpatialLines"))) df = do.call(rbind, lapply(dots, function(x) x@data)) SpatialLinesDataFrame(ll, df, match.ID = FALSE) } cbind.Spatial <- function(...) { dots = list(...) names(dots) <- NULL stopifnot(identicalCRS(dots[ which(sapply(dots, function(x) is(x, "Spatial"))) ])) dfs = lapply(dots, function(x) if(is(x, "Spatial")) x@data else x) d = do.call(cbind, dfs) addAttrToGeom(geometry(dots[[1]]), data.frame(d), FALSE) } sp/R/spOptions.R0000644000176200001440000000322512577541412013230 0ustar liggesusersget_ll_warn <- function() { get("ll_warn", envir = .spOptions) } get_ll_TOL <- function() { get("ll_TOL", envir = .spOptions) } get_ReplCRS_warn <- function() { get("ReplCRS_warn", envir = .spOptions) } set_ll_warn <- function(value) { stopifnot(is.logical(value)) stopifnot(length(value) == 1) assign("ll_warn", value, envir = .spOptions) get_ll_warn() } set_ll_TOL <- function(value) { stopifnot(is.numeric(value)) stopifnot(length(value) == 1) stopifnot(value > 0) assign("ll_TOL", value, envir = .spOptions) get_ll_TOL() } set_ReplCRS_warn <- function(value) { stopifnot(is.logical(value)) stopifnot(length(value) == 1) assign("ReplCRS_warn", value, envir = .spOptions) get_ReplCRS_warn() } get_Polypath <- function() { get("Polypath", envir = .spOptions) } set_Polypath <- function(value) { stopifnot(is.logical(value)) stopifnot(length(value) == 1) assign("Polypath", value, envir = .spOptions) get_Polypath() } get_PolypathRule <- function() { get("PolypathRule", envir = .spOptions) } set_PolypathRule <- function(value) { stopifnot(is.character(value)) stopifnot(length(value) == 1) stopifnot(value %in% c("winding", "evenodd")) assign("PolypathRule", value, envir = .spOptions) get_PolypathRule() } set_col_regions <- function(value) { stopifnot(is.character(value)) stopifnot(length(value) > 1) assign("col.regions", value, envir = .spOptions) get_col_regions() } get_col_regions <- function() { get("col.regions", envir = .spOptions) } sp/R/SpatialMultiPoints-methods.R0000644000176200001440000001064712577541412016506 0ustar liggesusers"SpatialMultiPoints" = function(coords, proj4string = CRS(as.character(NA)), bbox = NULL) { coords = lapply(coords, coordinates) # checks numeric mode #colNames = dimnames(coords[[1]])[[2]] #if (is.null(colNames)) # colNames = paste("coords.x", 1:(dim(coords)[2]), sep = "") #rowNames = dimnames(coords)[[1]] #dimnames(coords) = list(rowNames, colNames) # preserve row names if non-NULL if (is.null(bbox)) bbox <- .bboxMultiCoords(coords) new("SpatialMultiPoints", coords = coords, bbox = bbox, proj4string = proj4string) } .bboxMultiCoords = function(coords) { coords = do.call(rbind, coords) stopifnot(nrow(coords) > 0) bbox = t(apply(coords, 2, range)) dimnames(bbox)[[2]] = c("min", "max") as.matrix(bbox) } asWKTSpatialMultiPoints = function(x, digits = getOption("digits")) { data.frame(geometry = paste("MULTIPOINT (", sapply(x@coords, function(x) paste(apply(signif(x, digits = digits), 1, paste, collapse = " "), collapse = ",")) , ")" , sep = "")) } "print.SpatialMultiPoints" <- function(x, ..., digits = getOption("digits"), asWKT = .asWKT) { cat("SpatialMultiPoints:\n") if (asWKT) print(asWKTSpatialMultiPoints(x, digits)) else print(x@coords) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") } setMethod("show", "SpatialMultiPoints", function(object) print.SpatialMultiPoints(object)) plot.SpatialMultiPoints = function(x, pch = 3, axes = FALSE, add = FALSE, xlim = NULL, ylim = NULL, ..., setParUsrBB=FALSE, cex = 1, col = 1, lwd = 1, bg = 1) { if (! add) plot(as(x, "Spatial"), axes = axes, xlim = xlim, ylim = ylim, ..., setParUsrBB=setParUsrBB) cc = coordinates(x) n = length(x) l = sapply(x@coords, nrow) points(cc[,1], cc[,2], pch = rep(rep(pch, length.out = n), l), cex = rep(rep(cex, length.out = n), l), col = rep(rep(col, length.out = n), l), lwd = rep(rep(lwd, length.out = n), l), bg = rep(rep(bg, length.out = n), l)) } setMethod("plot", signature(x = "SpatialMultiPoints", y = "missing"), function(x,y,...) plot.SpatialMultiPoints(x,...)) points.SpatialMultiPoints = function(x, y = NULL, ...) plot(x, add = TRUE, ...) setMethod("coordinates", "SpatialMultiPoints", function(obj) { if (length(obj@coords) == 0) matrix(nrow = 0, ncol = 2) else matrix(do.call(rbind, obj@coords), ncol = ncol(obj@coords[[1]]), dimnames = list(rep(1:length(obj@coords), sapply(obj@coords, nrow)))) } ) as.data.frame.SpatialMultiPoints = function(x, row.names, optional, ...) data.frame(coordinates(x@coords)) setAs("SpatialMultiPoints", "data.frame", function(from) as.data.frame(from)) row.names.SpatialMultiPoints <- function(x) { ret = names(slot(x, "coords")) if (is.null(ret)) ret = seq_len(slot(x, "coords")) ret } names.SpatialMultiPoints <- row.names.SpatialMultiPoints "row.names<-.SpatialMultiPoints" <- function(x, value) { names(slot(x, "coords")) <- value x } setMethod("[", "SpatialMultiPoints", function(x, i, j, ..., drop = TRUE) { if (!missing(j)) warning("j index ignored") if (is.character(i)) i <- match(i, row.names(x)) else if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (any(is.na(i))) stop("NAs not permitted in row index") x@coords = x@coords[i] if (drop && length(x@coords)) x@bbox = .bboxMultiCoords(x@coords) x }) setMethod("coordnames", signature(x = "SpatialMultiPoints"), function(x) dimnames(x@coords[[1]])[[2]]) setReplaceMethod("coordnames", signature(x = "SpatialMultiPoints", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value dimnames(x@coords[[1]])[[2]] = value x } ) length.SpatialMultiPoints = function(x) length(x@coords) setMethod("$", "SpatialMultiPoints", function(x, name) { if (name %in% coordnames(x)) return(SpatialMultiPoints(lapply(x@coords, function(x) x[,name]))) if (!("data" %in% slotNames(x))) # we're not a SpatialMultiPointsDataFrame stop("no $ method for object without attributes") x@data[[name]] } ) setAs("SpatialMultiPoints", "SpatialPoints", function(from) { cc = coordinates(from) attr(cc, "groupIndex") = dimnames(cc)[[1]] dimnames(cc)[[1]] = NULL # if we'd retain them, rgeos would interpret the SpatialPoints as SpatialMultiPoints SpatialPoints(cc, from@proj4string, from@bbox) } ) split.SpatialPoints = function(x, f, drop = FALSE, ...) { lst = lapply(split(as.data.frame(coordinates(x)), f), as.matrix) SpatialMultiPoints(lst, x@proj4string, x@bbox) } sp/R/spdists.R0000644000176200001440000000530312577541412012722 0ustar liggesusersspDistsN1 <- function(pts, pt, longlat=FALSE) { if (inherits(pts, "SpatialPoints")) pts <- coordinates(pts) if (!is.matrix(pts)) stop("pts must be a matrix") if (ncol(pts) != 2) stop("pts must have two columns") if (!is.numeric(pts)) stop("pts must be numeric") if (inherits(pt, "SpatialPoints")) pt <- coordinates(pt) if (!is.numeric(pt)) stop("pt must be numeric") if (length(pt) != 2) stop("pt must have length two") storage.mode(pts) <- "double" storage.mode(pt) <- "double" x <- pts[,1] y <- pts[,2] xx <- pt[1] yy <- pt[2] n <- as.integer(length(x)) dists <- vector(mode="double", length=n) lonlat <- as.integer(longlat) res <- .C("sp_dists", x, y, xx, yy, n, dists, lonlat, PACKAGE = "sp")[[6]] if (any(!is.finite(res))) { nAn <- which(!is.finite(res)) dx <- abs(x[nAn] - xx) dy <- abs(y[nAn] - yy) if (all((c(dx, dy) < .Machine$double.eps ^ 0.5))) res[nAn] <- 0 else stop(paste("non-finite distances in spDistsN1")) } res } spDists <- function(x, y = x, longlat = FALSE, segments = FALSE, diagonal = FALSE) { if (segments) stopifnot(missing(y)) if (diagonal) stopifnot(! missing(y)) missing.y = missing(y) # assigning y later on changes missing(y) if (is(x, "Spatial")) { if (! missing(y)) stopifnot(identicalCRS(x, y)) ll = !is.na(is.projected(x)) && !is.projected(x) if (!missing(longlat) && longlat != ll) warning(paste("spDists: argument longlat conflicts with CRS(x); using the value", longlat)) else longlat = ll x = coordinates(x) y = coordinates(y) } stopifnot(ncol(x) == ncol(y)) if (segments) { stopifnot(ncol(x) == 2) n = nrow(x) if (n == 1) return(0) res <- .C("sp_lengths", as.double(x[,1]), as.double(x[,2]), as.integer(n), vector(mode = "double", length=(n-1)), as.integer(longlat), PACKAGE = "sp")[[4]] if (any(!is.finite(res))) stop("non-finite segment lengths") res } else if (diagonal) { stopifnot(ncol(x) == 2) stopifnot(nrow(x) == nrow(y)) res = .C("sp_dists_NN", as.double(x[,1]), as.double(x[,2]), as.double(y[,1]), as.double(y[,2]), as.integer(nrow(x)), vector(mode = "double", length = nrow(x)), as.integer(longlat), PACKAGE = "sp")[[6]] if (any(!is.finite(res))) stop("non-finite lengths") res } else if (ncol(x) != 2) { if (longlat) stop("cannot compute spherical distances for longlat data in more than 2 dimensions") if (missing.y) as.matrix(dist(x)) else sqrt(Reduce("+", Map(function(i) outer(x[,i], y[,i], "-") ^ 2, 1:ncol(x)))) } else { spDiN1 = function(x, y, ll) spDistsN1(y, x, ll) if (nrow(x) < nrow(y)) matrix(t(apply(x, 1, spDiN1, y = y, ll = longlat)), nrow(x), nrow(y)) else matrix(apply(y, 1, spDiN1, y = x, ll = longlat), nrow(x), nrow(y)) } } sp/R/Class-GridTopology.R0000644000176200001440000000061112577541412014713 0ustar liggesuserssetClass("GridTopology", slots = c(cellcentre.offset = "numeric", cellsize = "numeric", cells.dim = "integer"), validity = function(object) { n = length(na.omit(object@cellcentre.offset)) if (length(na.omit(object@cellsize)) != n) return("cellsize has incorrect dimension") if (sum(object@cells.dim > 0) != n) return("cells.dim has incorrect dimension") return(TRUE) } ) sp/R/Class-SpatialPoints.R0000644000176200001440000000134012577541412015063 0ustar liggesuserssetClass("SpatialPoints", contains = "Spatial", slots = c(coords = "matrix"), prototype = list(bbox = matrix(NA), proj4string = CRS(as.character(NA)), coords = matrix(0)), validity = function(object) { if (!is.matrix(object@coords)) return("coords slot is not a matrix") if (ncol(object@coords) < 2) return("SpatialPoints: too few coordinate columns") if (!is.double(object@coords[,1])) return("coordinates should be double") rowNames = dimnames(object@coords)[[1]] if (!is.null(rowNames) && anyDuplicated(rowNames)) warning("duplicate rownames are interpreted by rgeos as MultiPoints; use SpatialMultiPoints to define these; in future sp versions this warning will become an error") return(TRUE) } ) sp/R/spplot.R0000644000176200001440000006461713120733512012554 0ustar liggesuserssetMethod("sppanel", "SpatialPolygons", function(obj, col = 1, fill = "transparent", ...) { if (is.character(obj)) obj = get(obj) if (!is(obj, "SpatialPolygons")) stop(paste( "object extending class SpatialPolygons expected; got class", class(obj))) else obj = as(obj, "SpatialPolygons") if (get_Polypath()) { lo = length(obj) obj = as(as(obj, "SpatialLines"), "SpatialPointsDataFrame") cc = coordinates(obj) #id = as.numeric(obj$Line.NR) id = as.numeric(obj$Lines.NR * max(obj$Line.NR) + (obj$Line.NR - 1)) if (length(fill) > 1 || length(col) > 1) { fill = rep(fill, length.out = lo) col = rep(col, length.out = lo) for (i in 1:lo) { sel = obj$Lines.NR == i grid.path(cc[sel,1], cc[sel,2], id[sel], default.units = "native", gp = gpar(col = col[i], fill = fill[i], ...)) } } else grid.path(cc[,1], cc[,2], id, default.units = "native", gp = gpar(col = col, fill = fill, ...)) } else { sp.polygon3 = function(x, col, fill, ...) { cc = slot(x, "coords") grid.polygon(cc[,1], cc[,2], default.units = "native", gp = gpar(col = col, fill = fill, ...)) panel.lines(cc, col = col, ...) } pls = slot(obj, "polygons") pO <- slot(obj, "plotOrder") if (length(fill) != length(pO)) fill <- rep(fill[1], length(pO)) for (i in pO) { Srs <- slot(pls[[i]], "Polygons") pOi <- slot(pls[[i]], "plotOrder") for (j in pOi) sp.polygon3(Srs[[j]], col = col, fill = fill[i], ...) } } }) # backward compatibility: sp.polygons = function(obj, col = 1, fill = "transparent",...) sppanel(obj, col = col, fill = fill, ...) setMethod("sppanel", "SpatialLines", function (obj, col = 1, ...) { ## contributed by Josh O'Brien, Mar 15, 2015 lo <- length(obj@lines) col <- rep(col, length.out = lo) lapply(seq_len(lo), function(ii) sppanel(obj@lines[[ii]], col = col[ii], ...)) }) setMethod("sppanel", "Lines", function (obj, col = 1, ...) lapply(obj@Lines, sppanel, col = col, ...)) setMethod("sppanel", "Line", function (obj, col = 1, ...) panel.lines(coordinates(obj), col = col, ...)) # backward compatibility: sp.lines = function(obj, col = 1,...) sppanel(obj, col = col,...) setMethod("sppanel", "SpatialPoints", function(obj, pch = 3, ...) panel.points(coordinates(obj), pch = pch, ...)) # backward compatibility: sp.points = function(obj, pch=3, ...) sppanel(obj, pch = pch, ...) sp.grid = function(obj, col = 1, alpha = 1, ..., at = pretty(obj[[1]]), col.regions = col) { xy = coordinates(obj) if (length(col) > 1 && ("data" %in% slotNames(obj))) { z = obj[[1]] if (is.factor(z)) col = col[z] else # cut: col = level.colors(z, at, col.regions, colors = TRUE) } gt = as(getGridTopology(obj), "data.frame") grid.rect(x = xy[,1], y = xy[,2], width = gt$cellsize[1], height = gt$cellsize[2], default.units = "native", gp = gpar(fill = col, col = NA, alpha = alpha)) } setMethod("sppanel", "SpatialPixels", sp.grid) setMethod("sppanel", "SpatialGrid", sp.grid) sp.text = function(loc, txt, ...) { if (!is.numeric(loc)) stop("loc (first argument) should be numeric, indicating text locations") if (length(loc) == 2) panel.text(loc[1], loc[2], txt, ...) else if (is.matrix(loc) && ncol(loc) == 2 && nrow(loc) == length(txt)) panel.text(loc[,1], loc[,2], txt, ...) else stop("loc and txt have non-matching dimensions") } setMethod("sppanel", "character", function(obj,txt, ...) sp.text(obj, txt, ...)) sp.panel.layout = function(lst, p.number, ...) { # now obsolete... .Deprecated("sppanel") sp.panel0 = function(x, first = FALSE, ...) { if (inherits(x, "list")) { if (!is.null(x$which) && is.na(match(p.number, x$which))) return() # print(paste(class(x), "first val", first, "first obj", x$first)) if (!is.null(x$first)) { if (x$first == first) do.call(x[[1]], x[2:length(x)]) } else if (!first) do.call(x[[1]], x[2:length(x)]) } } if (!is.null(lst$which) && is.na(match(p.number, lst$which))) return() else lst$which = NULL if (is.null(lst)) return() if (inherits(lst, "list")) { if (inherits(lst[[1]], "list")) lapply(lst, sp.panel0, ...) else sp.panel0(lst, ...) } else stop(paste("expected object of class list; got object of class", class(lst))) } setMethod("sppanel", "NULL", function(obj,...) { }) sppanelList = function(obj, p.number, first, ...) { missingFirst = missing(first) if (length(obj) == 1 & is.null(obj[[1]])) return() if (!is.null(obj$which) && is.na(match(p.number, obj$which))) return() # false panel else obj$which = NULL # continue: either all panels, or right panel if (is.list(obj[[1]])) # list-of-lists, recurse: return(lapply(obj, sppanel, p.number = p.number, first = first, ...)) opaque = function(x) (is(x, "SpatialPolygons") || is(x, "SpatialGrid") || is(x, "SpatialPixels")) if (is.character(obj[[1]]) || is.function(obj[[1]])) { if (is.null(obj$first)) obj$first = opaque(obj[[2]]) # default: grids/polygons behind, rest front if (missingFirst) # meaning: do plot it first = obj$first if (obj$first == first) { obj$first = NULL do.call(obj[[1]], obj[-1], ...) } } else { sp = sapply(obj, is, "Spatial") stopifnot(any(sp)) lapply(obj[sp], function(x) { if (missingFirst || identical(obj$first, first) || opaque(x) == first) do.call(sppanel, append(x, obj[!sp]), ...) }) } } setMethod("sppanel", "list", sppanelList) getFormulaLevelplot = function(sdf, zcol) { if (length(zcol) > 1) as.formula(paste("z~", paste(dimnames(coordinates(sdf))[[2]], collapse = "+"), "|name")) else { if (!is.character(zcol)) zcol = names(sdf)[zcol] as.formula(paste(zcol, "~", paste(dimnames(coordinates(sdf))[[2]], collapse = "+"))) } } spplot.grid = function(obj, zcol = names(obj), ..., names.attr, scales = list(draw = FALSE), xlab = NULL, ylab = NULL, aspect = mapasp(obj,xlim,ylim), panel = panel.gridplot, sp.layout = NULL, formula, xlim = bbox(obj)[1,], ylim = bbox(obj)[2,], checkEmptyRC = TRUE, col.regions = get_col_regions()) { if (is.null(zcol)) stop("no names method for object") if (checkEmptyRC) sdf = addNAemptyRowsCols(obj) # returns SpatialPointsDataFrame else sdf = as(obj, "SpatialPointsDataFrame") if (missing(formula)) formula = getFormulaLevelplot(sdf, zcol) if (length(zcol) > 1) { sdf = spmap.to.lev(sdf, zcol = zcol, names.attr = names.attr) zcol2 = "z" } else zcol2 = zcol if (exists("panel.levelplot.raster")) { opan <- lattice.options("panel.levelplot")[[1]] lattice.options("panel.levelplot"="panel.levelplot.raster") # cat("using raster panel\n") } scales = longlat.scales(obj, scales, xlim, ylim) args = append(list(formula, data = as(sdf, "data.frame"), aspect = aspect, panel = panel, xlab = xlab, ylab = ylab, scales = scales, sp.layout = sp.layout, xlim = xlim, ylim = ylim, col.regions = col.regions), list(...)) # deal with factor variables: if (all(unlist(lapply(obj@data[zcol], is.factor)))) { #if (!is.null(args$col.regions) && # nlevels(obj@data[[zcol[1]]]) != length(args$col.regions)) # stop("length of col.regions should match number of factor levels") args$data[[zcol2]] = as.numeric(args$data[[zcol2]]) if (is.null(args$colorkey) || (is.logical(args$colorkey) && args$colorkey) || (is.list(args$colorkey) && is.null(args$colorkey$at) && is.null(args$colorkey$labels))) { if (!is.list(args$colorkey)) args$colorkey = list() ck = args$colorkey args$colorkey = NULL args = append(args, colorkey.factor(obj[[zcol[1]]], ck)) } else args = append(args, colorkey.factor(obj[[zcol[1]]], ck, FALSE)) } ret = do.call(levelplot, args) if (exists("panel.levelplot.raster")) lattice.options("panel.levelplot" = opan) ret } setMethod("spplot", signature("SpatialPixelsDataFrame"), spplot.grid) setMethod("spplot", signature("SpatialGridDataFrame"), function(obj, ...) spplot.grid(as(obj, "SpatialPixelsDataFrame"), ...)) spplot.polygons = function(obj, zcol = names(obj), ..., names.attr, scales = list(draw = FALSE), xlab = NULL, ylab = NULL, aspect = mapasp(obj,xlim,ylim), panel = panel.polygonsplot, sp.layout = NULL, formula, xlim = bbox(obj)[1,], ylim = bbox(obj)[2,], col.regions = get_col_regions()) { if (is.null(zcol)) stop("no names method for object") sdf = as(obj, "data.frame") if (is(obj, "SpatialPolygonsDataFrame")) labpts = coordinates(obj) else { # get first points of each lines object: n = length(obj@lines) labpts = matrix(unlist(lapply(obj@lines, function(x) lapply(x@Lines[1], function(x) coordinates(x)[1,]))), n, 2, byrow=TRUE) } dimnames(labpts)[[2]] = c("xlabelpoint", "ylabelpoint") sdf = as.data.frame(cbind(labpts, sdf)) coordinates(sdf) = c("xlabelpoint", "ylabelpoint") if (missing(formula)) formula = getFormulaLevelplot(sdf, zcol) if (length(zcol) > 1) { sdf = spmap.to.lev(sdf, zcol = zcol, names.attr = names.attr) zcol2 = "z" } else zcol2 = zcol if (is(obj, "SpatialPolygonsDataFrame")) grid.polygons = as(obj, "SpatialPolygons") else grid.polygons = as(obj, "SpatialLines") scales = longlat.scales(obj, scales, xlim, ylim) args = append(list(formula, data = as(sdf, "data.frame"), aspect = aspect, grid.polygons = grid.polygons, panel = panel, xlab = xlab, ylab = ylab, scales = scales, sp.layout = sp.layout, xlim = xlim, ylim = ylim, col.regions = col.regions), list(...)) if (all(unlist(lapply(obj@data[zcol], is.factor)))) { #if (!is.null(args$col.regions) && # nlevels(obj@data[[zcol[1]]]) != length(args$col.regions)) # stop("length of col.regions should match number of factor levels") args$data[[zcol2]] = as.numeric(args$data[[zcol2]]) if (is.null(args$colorkey) || (is.logical(args$colorkey) && args$colorkey) || (is.list(args$colorkey) && is.null(args$colorkey$at) && is.null(args$colorkey$labels))) { if (!is.list(args$colorkey)) args$colorkey = list() ck = args$colorkey args$colorkey = NULL args = append(args, colorkey.factor(obj[[zcol[1]]], ck)) } else args = append(args, colorkey.factor(obj[[zcol[1]]], ck, FALSE)) } do.call(levelplot, args) } setMethod("spplot", signature("SpatialPolygonsDataFrame"), spplot.polygons) setMethod("spplot", signature("SpatialLinesDataFrame"), spplot.polygons) spplot.points = function(obj, zcol = names(obj), ..., names.attr, scales = list(draw = FALSE), xlab = NULL, ylab = NULL, aspect = mapasp(obj,xlim,ylim), panel = panel.pointsplot, sp.layout = NULL, identify = FALSE, formula, xlim = bbexpand(bbox(obj)[1,], 0.04), ylim = bbexpand(bbox(obj)[2,], 0.04), edge.col = "transparent", colorkey = FALSE, col.regions = get_col_regions()) { if (is.null(zcol)) stop("no names method for object") dots = list(...) sdf = obj if (!is.character(zcol)) zcol = names(sdf)[zcol] # create formula: if (missing(formula)) { if (length(zcol) > 1) { formula = as.formula(paste(paste(dimnames(coordinates(sdf))[[2]][2:1], collapse = "~"), "|name")) sdf = spmap.to.lev(sdf, zcol = zcol, names.attr = names.attr) } else { if (!is.character(zcol)) zcol = names(sdf)[zcol] ccn = dimnames(coordinates(sdf))[[2]] formula = as.formula(paste(ccn[2], "~", ccn[1])) } } scales = longlat.scales(obj, scales, xlim, ylim) args.xyplot = append(list(formula, data = as(sdf, "data.frame"), panel = panel, aspect = aspect, scales = scales, xlab = xlab, ylab = ylab, sp.layout = sp.layout, xlim = xlim, ylim = ylim, edge.col = edge.col, col.regions = col.regions), dots) z = create.z(as(obj, "data.frame"), zcol) args.xyplot = fill.call.groups(args.xyplot, z = z, edge.col = edge.col, colorkey = colorkey, ...) # debug: #print(args.xyplot) plt = do.call(xyplot, args.xyplot) if (!(is.logical(identify) && identify==FALSE) && interactive()) { print(plt) if (!(is.numeric(identify) && length(identify) == 2)) identify = c(1,1) trellis.focus("panel", identify[1], identify[2]) labels = row.names(as(sdf, "data.frame")) cat("left-mouse to identify points; right-mouse to end\n") cc = coordinates(obj) ret = panel.identify(cc[,1], cc[,2], labels) trellis.unfocus() return(ret) } else plt } setMethod("spplot", signature("SpatialPointsDataFrame"), spplot.points) setMethod("spplot", signature("SpatialMultiPointsDataFrame"), function(obj, ...) spplot.points(as(obj, "SpatialPointsDataFrame"), ...)) create.z = function(df, zcol) { if (is.logical(df[[zcol[1]]])) { z = stack(df[zcol])[[1]] z = as.factor(z) } else if (is.numeric(df[[zcol[1]]])) z = stack(df[zcol])[[1]] else if (is.factor(df[[zcol[1]]])) { lev = levels(df[[zcol[1]]]) z = factor(as.vector(sapply(df[zcol], as.character)), levels = lev) } else stop("no support for variable of this type") z } panel.gridplot = function(x, y, z, subscripts, ..., sp.layout) { sppanel(list(sp.layout), panel.number(), first = TRUE) panel.levelplot(x, y, z, subscripts, ...) sppanel(list(sp.layout), panel.number(), first = FALSE) } panel.polygonsplot = function (x, y, z, subscripts, at = pretty(z), shrink, labels = NULL, label.style = c("mixed", "flat", "align"), contour = FALSE, region = TRUE, col = add.line$col, lty = add.line$lty, lwd = add.line$lwd, cex = add.text$cex, font = add.text$font, fontfamily = add.text$fontfamily, fontface = add.text$fontface, col.text = add.text$col, ..., col.regions = regions$col, alpha.regions = regions$alpha, grid.polygons, sp.layout) { regions <- trellis.par.get("regions") add.line <- trellis.par.get("add.line") add.text <- trellis.par.get("add.text") numcol <- length(at) - 1 numcol.r <- length(col.regions) col.regions <- if (numcol.r <= numcol) rep(col.regions, length = numcol) else col.regions[floor(1 + (1:numcol - 1) * (numcol.r - 1)/(numcol - 1))] zcol <- rep(NA, length(z)) for (i in seq(along = col.regions)) zcol[!is.na(x) & !is.na(y) & !is.na(z) & z >= at[i] & z < at[i + 1]] <- i label.style <- match.arg(label.style) x <- as.numeric(x[subscripts]) y <- as.numeric(y[subscripts]) z <- as.numeric(z[subscripts]) zcol <- as.numeric(zcol[subscripts]) sppanel(list(sp.layout), panel.number(), first = TRUE) if (any(subscripts)) { if (is(grid.polygons, "SpatialLines")) { sp.lines3 = function(x, col, ...) panel.lines(coordinates(x), col = col, ...) sp.lines2 = function(x, col, ...) lapply(x@Lines, sp.lines3, col, ...) for (i in 1:length(grid.polygons@lines)) sp.lines2(grid.polygons@lines[[i]], col = col.regions[zcol[i]], lwd = lwd, lty = lty, ...) } else { pls = slot(grid.polygons, "polygons") pO = slot(grid.polygons, "plotOrder") col = rep(col, length.out = length(grid.polygons)) for (i in pO) { if (get_Polypath()) { obj = as(as(grid.polygons[i,], "SpatialLines"), "SpatialPointsDataFrame") cc = coordinates(obj) id = as.numeric(obj$Line.NR) fill = col.regions[zcol[i]] alpha = alpha.regions grid.path(cc[,1], cc[,2], id, default.units = "native", gp = gpar(col = col[i], fill = fill, alpha = alpha, lwd = lwd, lty = lty, ...)) } else { Srs <- slot(pls[[i]], "Polygons") pOi <- slot(pls[[i]], "plotOrder") for (j in pOi) { coords = slot(Srs[[j]], "coords") if (slot(Srs[[j]], "hole")) { bg = trellis.par.get()$background if (bg$col == "transparent") fill = "white" else fill = bg$col alpha = bg$alpha } else { fill = col.regions[zcol[i]] alpha = alpha.regions } gp = gpar(fill = fill, alpha = alpha, col = col, lwd = lwd, lty = lty) grid.polygon(coords[,1], coords[,2], default.units = "native", gp = gp) } } } } } sppanel(list(sp.layout), panel.number(), first = FALSE) } panel.pointsplot = function(sp.layout, x, y, subscripts, groups, col, cex, pch, ...) { sppanel(list(sp.layout), panel.number(), first = TRUE) lpoints(x, y, fill = groups[subscripts], col = col[subscripts], cex = cex[subscripts], pch = pch[subscripts], ...) sppanel(list(sp.layout), panel.number(), first = FALSE) } SpatialPolygons2Grob = function(obj, fill) { if (!is(obj, "SpatialPolygons")) stop("object is not of class SpatialPolygons") x = numeric(0) y = numeric(0) id = integer(0) pls = slot(obj, "polygons") pO <- slot(obj, "plotOrder") n = 0 for (i in pO) { Srs <- slot(pls[[i]], "Polygons") pOi <- slot(pls[[i]], "plotOrder") for (j in pOi) { n = n + 1 cc = slot(Srs[[j]], "coords") x = c(x, cc[,1]) y = c(y, cc[,2]) id = c(id, rep(n, nrow(cc))) } } polygonGrob(x=x, y=y, id=id, gp = gpar(fill = fill)) } SpatialPolygonsRescale = function(obj, offset, scale = 1, fill = "black", col = "black", plot.grid = TRUE, ...) { if (!is(obj, "SpatialPolygons")) stop("object is not of class SpatialPolygons") if (length(offset) != 2) stop("offset should have length 2") if (is.list(offset)) offset = c(offset[[1]], offset[[2]]) if (length(scale) == 1) scale = rep(scale,2) pls = slot(obj, "polygons") pO = slot(obj, "plotOrder") fill = rep(fill, length = length(pls)) for (i in pO) { Srs <- slot(pls[[i]], "Polygons") pOi <- slot(pls[[i]], "plotOrder") for (j in pOi) { cc = slot(Srs[[j]], "coords") x = offset[1] + (cc[,1] * scale[1]) y = offset[2] + (cc[,2] * scale[2]) if (plot.grid) { grid.polygon(x, y, default.units = "native", gp = gpar(col = col, fill = fill[i], ...)) } else { polygon(x, y, col = fill[i]) lines(x, y, col = col) } } } } mapLegendGrob <- function(obj, widths = unit(1, "cm"), heights = unit(1, "cm"), fill = "black", just = "right") { grb = SpatialPolygons2Grob(obj, fill) key.layout <- grid.layout(nrow = 1, ncol = 1, widths = widths, heights = heights, respect = TRUE, just = just) key.gf <- frameGrob(layout = key.layout) key.gf <- placeGrob(key.gf, rectGrob(gp = gpar(fill = "transparent", col = NULL)), row = NULL, col = NULL) key.gf <- placeGrob(key.gf, grb, row = 1, col = 1) key.gf } layout.north.arrow = function(type = 1) { if (type == 1) { x1 = c(0.1653, 0.2241, 0.2241, 0.2830, 0.1947, 0.1065, 0.1653, 0.1653) x2 = c(0, 0.0967, 0.0967, 0.2928, 0.3908, 0.3908, 0.2928, 0.2928, 0.1032, 0, 0) y1 = c(0, 0, 0.8823, 0.8235, 1, 0.8235, 0.8823, 0) y2 = c(0.2352, 0.2352, 0.5686, 0.2352, 0.2352, 0.7189, 0.7189, 0.3986, 0.7189, 0.7189, 0.2352 ) return(SpatialPolygons(list(Polygons(list(Polygon(cbind(x1,y1)), Polygon(cbind(rev(x2),rev(y2)))), ID="north")))) } if (type == 2) { x = c(0.143,0.143,0.0143,0.207,0.400,0.271,0.271,0.143) y = c(0,0.707,0.707,0.964,0.707,0.707,0.00,0.0) return(SpatialPolygons(list(Polygons(list(Polygon(cbind(x,y))), ID="north")))) } stop("unknown value for type") } layout.scale.bar = function(height = 0.05) { x1 = c(0, 0.5, 0.5, 0, 0) y1 = c(0, 0, height, height, 0) x2 = x1 + 0.5 y2 = y1 SpatialPolygons(list(Polygons(list(Polygon(cbind(x1,y1))), ID="left"), Polygons(list(Polygon(cbind(rev(x2),rev(y2)))), ID="right"))) } # scale.bar = .scale.bar() sp.theme = function(set = FALSE, regions = list(col = bpy.colors(100)), ...) { lst = list(regions = regions, ...) if (set) trellis.par.set(lst) else lst } spplot.key = function(sp.layout, rows = 1, cols = 1) { for (i in seq(along=rows)) { for (j in seq(along=cols)) { trellis.focus("panel", cols[j], rows[i], highlight = FALSE) sppanel(sp.layout) trellis.unfocus() } } } #sp.pagefn = function(n) { # pos = lattice:::lattice.getStatus("current.panel.positions") # spplot.key(sp.layout, pos[1], pos[2]) #} longlat.scales = function(obj, scales, xlim, ylim) { isp = is.projected(obj) if (!is.null(scales$draw) && scales$draw && !is.na(isp) && !isp) { # long lat -- x: if (is.null(scales$x)) scales$x = list() if (is.null(scales$x$at)) scales$x$at = pretty(xlim) if (is.null(scales$x$labels)) scales$x$labels = parse(text = degreeLabelsEW(scales$x$at)) # long lat -- y: if (is.null(scales$y)) scales$y = list() if (is.null(scales$y$at)) scales$y$at = pretty(ylim) if (is.null(scales$y$labels)) scales$y$labels = parse(text = degreeLabelsNS(scales$y$at)) } scales } bbexpand = function(x, fraction) { r = diff(x) c(x[1] - fraction * r, x[2] + fraction * r) } colorkey.factor = function(f, colorkey = list(), doColorkey = TRUE) { lf = levels(f) at = seq(0.5, nlevels(f)+0.501) at.labels = seq(1, nlevels(f)) if (doColorkey) { colorkey=append(colorkey, list(labels=list(at=at.labels, labels=lf), height=min(1, .05 * length(lf)))) list(at = at, colorkey = colorkey) } else list(at = at) } "spplot.locator" <- function(n = 512, type = "n", ...) { stopifnot(n > 0) res = as.numeric(grid.locator(unit = "native")) if (type == "o" || type == "p") panel.points(res[1], res[2], ...) if (n > 1) for (i in 2:n) { xy = grid.locator(unit = "native") if (is.null(xy)) # return(res) break else xy = as.numeric(xy) res = rbind(res, xy) if (type == "o" || type == "p") panel.points(xy[1], xy[2], ...) if (type == "o" || type == "l") panel.lines(res[(i-1):i,]) } if (is.matrix(res)) dimnames(res) = list(NULL, NULL) res } addNAemptyRowsCols = function(obj) { # accept gridded; return SpatialPointsDataFrame with NA records on empty row/cols fullgrid(obj) = FALSE nfull = obj@grid@cells.dim[1] * obj@grid@cells.dim[2] missingpatt = rep(TRUE, nfull) missingpatt[obj@grid.index] = FALSE missingpatt = matrix(missingpatt, obj@grid@cells.dim[1], obj@grid@cells.dim[2], byrow = FALSE) missing.x = which(apply(missingpatt, 1, all)) missing.y = which(apply(missingpatt, 2, all)) xy = coordinates(obj)[,1:2,drop=FALSE] coordvals = coordinatevalues(obj@grid) missing.x = coordvals[[1]][missing.x] missing.y = coordvals[[2]][missing.y] n = length(missing.x) + length(missing.y) if (n > 0) { if (length(missing.x) > 0) xy = rbind(xy, cbind(missing.x, rep(xy[1,2], length(missing.x)))) if (length(missing.y) > 0) xy = rbind(xy, cbind(rep(xy[1,1], length(missing.y)), missing.y)) newatt = data.frame(lapply(obj@data, function(x) c(x, rep(NA, n)))) row.names(xy) = seq_len(nrow(xy)) obj = SpatialPointsDataFrame(xy, newatt, obj@coords.nrs, obj@proj4string, FALSE) } else obj = as(obj, "SpatialPointsDataFrame") obj } fill.call.groups <- function (lst, z, ..., cuts = ifelse(identical(FALSE, colorkey), 5, 100), #col.regions = trellis.par.get("regions")$col, legendEntries = "", pch, cex = 1, do.fill = TRUE, do.log = FALSE, key.space = ifelse(identical(FALSE, colorkey), "bottom", "right"), cex.key, edge.col, colorkey) { dots = list(...) col.regions = lst$col.regions if (is.numeric(z)) { if (length(cuts) > 1) ncuts = length(cuts) - 1 else ncuts = cuts if (ncuts != length(col.regions)) { cols = round(1 + (length(col.regions) - 1) * (0:(ncuts - 1))/(ncuts - 1)) fill = col.regions[cols] } else fill = col.regions valid = !is.na(z) if (length(cuts) == 1) { if (do.log) { lz = log(z) cuts = c(min(z[valid]), exp(seq(min(lz[valid]), max(lz[valid]), length = cuts + 1))[2:(cuts)], max(z[valid])) } else cuts = seq(min(z[valid]), max(z[valid]), length = cuts + 1) } groups = cut(as.matrix(z), cuts, dig.lab = 4, include.lowest = TRUE) } else if (is.factor(z)) { if (length(col.regions) == 1) col.regions = rep(col.regions, nlevels(z)) if (length(col.regions) < nlevels(z)) stop("number of colors smaller than number of factor levels") if (length(col.regions) > nlevels(z)) { ncuts = nlevels(z) cols = round(1 + (length(col.regions) - 1) * (0:(ncuts - 1))/(ncuts - 1)) col.regions = col.regions[cols] } if (!missing(cuts)) stop("ncuts cannot be set for factor variable") groups = z fill = col.regions } else stop("dependent of not-supported class") n = nlevels(groups) # deal with col: lst$groups = fill[groups] #print(lst$col) # deal with pch: if (edge.col != "transparent") { # WITH border: use fill if (missing(pch)) pch = rep(ifelse(do.fill, 21, 1), n) lst$col = rep(edge.col, length.out = length(groups)) } else { # no border: use col instead of fill if (missing(pch)) pch = rep(ifelse(do.fill, 16, 1), n) lst$col = lst$groups } if (length(pch) == 1) pch = rep(pch, n) lst$pch = pch[groups] # deal with cex: if (missing(cex)) cex = rep(1, n) if (length(cex) == 1) cex = rep(cex, n) if (length(cex) == n) { cex.key = cex lst$cex = cex[groups] lst$cex[is.na(lst$cex)] = 0 } else if (missing(cex.key)) cex.key = mean(cex, na.rm = TRUE) # do key: if (is.list(colorkey)) lst$legend = colorkey else if (isTRUE(colorkey)) { lst$legend = list( right = list( fun = draw.colorkey, args = list( key = list( col = col.regions, at = cuts ), draw = FALSE ) ) ) if (is.character(key.space)) names(lst$legend) = key.space } else { if (!identical(dots$auto.key, FALSE)) { # xxx if (missing(legendEntries)) legendEntries = levels(groups) if (!is.null(dots$key)) lst$key = dots$key else { if(is.list(dots$auto.key)) lst$key = dots$auto.key else lst$key = list() if (edge.col != "transparent") { lst$key = append(lst$key, list(points = list( pch = rep(pch, length.out = n), col = rep(edge.col, length.out = n), fill = fill, cex = rep(cex.key, length.out = n) ), text = list(legendEntries) )) } else { lst$key = append(lst$key, list(points = list( pch = rep(pch, length.out = n), col = rep(fill, length.out = n), cex = rep(cex.key, length.out = n) ), text = list(legendEntries) )) } } if (is.character(key.space)) lst$key$space = key.space else if (is.list(key.space)) lst$key = append(lst$key, key.space) else warning("key.space argument ignored (not list or character)") # print(lst$key) } if (!is.null(dots$auto.key)) lst$auto.key <- dots$auto.key } return(lst) } panel.RgoogleMaps <- function(map) { bb = bb2merc(map, "RgoogleMaps") grid.raster(map$myTile, mean(bb[1,]), mean(bb[2,]), diff(bb[1,]), diff(bb[2,]), default.units = "native", interpolate = FALSE) } panel.ggmap <- function(map) { bb = bb2merc(map, "ggmap") grid.raster(map, mean(bb[1,]), mean(bb[2,]), diff(bb[1,]), diff(bb[2,]), default.units = "native", interpolate = FALSE) } sp/R/SpatialPolygons-displayMethods.R0000644000176200001440000000703712577541412017356 0ustar liggesusers# plot.SpatialPolygons <- function(x, col, border = par("fg"), add=FALSE, xlim=NULL, ylim=NULL, xpd = NULL, density = NULL, angle = 45, pbg=NULL, axes = FALSE, lty = par("lty"), ..., setParUsrBB=FALSE, usePolypath=NULL, rule=NULL, bgMap = NULL) { if (is.null(pbg)) pbg = par("bg") # transparent! if (!is(x, "SpatialPolygons")) stop("Not a SpatialPolygons object") if (is.null(usePolypath)) usePolypath <- get_Polypath() if (is.null(rule)) rule <- get_PolypathRule() if (! add) plot(as(x, "Spatial"), xlim=xlim, ylim=ylim, axes = axes, ..., setParUsrBB=setParUsrBB, bgMap = bgMap) n <- length(slot(x, "polygons")) if (length(border) != n) border <- rep(border, n, n) polys <- slot(x, "polygons") pO <- slot(x, "plotOrder") if (!is.null(density)) { if (missing(col)) col <- par("fg") if (length(col) != n) col <- rep(col, n, n) if (length(density) != n) density <- rep(density, n, n) if (length(angle) != n) angle <- rep(angle, n, n) for (j in pO) .polygonRingHoles(polys[[j]], border = border[j], xpd = xpd, density = density[j], angle = angle[j], col = col[j], pbg = pbg, lty=lty, ...) } else { if (missing(col)) col <- NA if (length(col) != n) col <- rep(col, n, n) for (j in pO) .polygonRingHoles(polys[[j]], col=col[j], border=border[j], xpd = xpd, pbg = pbg, lty=lty, ..., usePolypath=usePolypath, rule=rule) } } setMethod("plot", signature(x = "SpatialPolygons", y = "missing"), function(x, y, ...) plot.SpatialPolygons(x, ...)) .polygonRingHoles <- function(Sr, col=NA, border=NULL, xpd=NULL, density=NULL, angle=45, pbg, lty = par("lty"), ..., usePolypath=NULL, rule=NULL) { if (!is(Sr, "Polygons")) stop("Not an Polygons object") if (is.null(usePolypath)) usePolypath <- get_Polypath() if (is.null(rule)) rule <- get_PolypathRule() if (!is.null(density)) hatch <- TRUE else hatch <- FALSE pO <- slot(Sr, "plotOrder") polys <- slot(Sr, "Polygons") if (hatch) { for (i in pO) { if (!slot(polys[[i]], "hole")) .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, density = density, angle = angle, col=col, hatch=TRUE, lty=lty, ...) else .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, col=pbg, density = NULL, lty=lty, ...) } } else if (exists("polypath") && usePolypath) { Srl <- as(Sr, "Lines") crds <- coordinates(Srl) if (length(crds) == 1) mcrds <- crds[[1]] else { NAr <- as.double(c(NA, NA)) crds1 <- lapply(crds, function(x) rbind(x, NAr)) mcrds <- do.call(rbind, crds1) mcrds <- mcrds[-nrow(mcrds),] rownames(mcrds) <- NULL } polypath(x=mcrds[,1], y=mcrds[,2], border=border, col=col, lty=lty, rule=rule, xpd=xpd, ...) } else { for (i in pO) { if (!slot(polys[[i]], "hole")) .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, col=col, lty=lty, ...) else .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, col=pbg, lty=lty, ...) } } } .polygon = function(x, y = NULL, density = NULL, angle = 45, border = NULL, col = NA, lty = NULL, xpd = NULL, hatch=NA, ...) { if (is.na(hatch)) polygon(x = x, y = y, border = border, col = col, lty = lty, xpd = xpd, ...) else polygon(x = x, y = y, density = density, angle = angle, border = border, lty = lty, xpd = xpd, col=col, ...) } sp/R/AAA.R0000644000176200001440000000071512577541412011615 0ustar liggesusers#.onLoad <- function(lib, pkg) { # require(methods) #} .spOptions <- new.env(FALSE, globalenv()) assign("ll_warn", FALSE, envir = .spOptions) assign("ll_TOL", 0.25, envir = .spOptions) assign("ReplCRS_warn", TRUE, envir = .spOptions) assign("Polypath", TRUE, envir = .spOptions) assign("PolypathRule", "winding", envir = .spOptions) assign("col.regions", bpy.colors(), envir = .spOptions) .onUnload <- function(libpath) library.dynam.unload("sp", libpath) sp/R/Class-SpatialPolygonsDataFrame.R0000644000176200001440000000057512577541412017177 0ustar liggesuserssetClass("SpatialPolygonsDataFrame", contains = "SpatialPolygons", slots = c(data = "data.frame"), validity = function(object) { if (!inherits(object@data, "data.frame")) stop("data should be of class data.frame") if (nrow(object@data) != length(object@polygons)) stop("number of rows in data.frame and polygons in SpatialPolygons don't match") return(TRUE) } ) sp/R/over.R0000644000176200001440000001762012633630576012214 0ustar liggesusers.overDF = function(r, data, n, returnList, fn, ...) { if (returnList == FALSE && is.null(fn)) ret = data[sapply(r, function(x) x[1]), , drop=FALSE] else { ret = lapply(1:n, function(x) data[r[[x]],,drop=FALSE]) # list of data.frames if (returnList == FALSE) { # apply fn: ret = do.call(rbind, # rbind each aggregated record lapply(ret, # apply to each data.frame in ret: function(x) { if (nrow(x) == 0) data.frame(lapply(x, function(xx) c(xx, NA))) else data.frame(lapply(x, fn, ...)) } ) ) ret[is.na(ret)] = NA # removes NaN's ret = as.data.frame(ret) } } ret } overDF_for_rgeos = .overDF # to be exported, for rgeos, and spacetime # we need to invert a list of indexes, i.e. # list(c(1,4), c(2,4,5)) # needs to become # list(c(1), c(2), integer(0), c(1,2), c(2)) # the expensive way is to form the full matrix, as in: # #.invert = function(lst, nr, nc) { # stopifnot(nr == length(lst)) # m = matrix(FALSE, nr, nc) # for (i in 1:nr) # m[i,lst[[i]]] = TRUE # lapply(1:nc, function(x) which(m[,x])) #} # but the following does this more efficient, memory-wise: .invert = function(x, nr, nc) { stopifnot(nr == length(x)) # obsolete argument! ret = cbind(rep(1:nr, times = sapply(x, length)), unlist(x)) ret = split(ret[,1], ret[,2]) # initialize return list with empty cells: lst = lapply(1:nc, function(x) integer(0)) idx = as.integer(names(ret)) lst[idx] = ret lst } '%over%' = function(x,y) over(x,y) # when changing this function, we also might want to change # overGeomGeomDF in rgeos, # ... and overDFGenericST in spacetime. overDFGeneric = function(x, y, returnList = FALSE, fn = NULL, ..., minDimension = -1) { stopifnot(identicalCRS(x, y)) r = over(x, geometry(y), returnList = TRUE, minDimension = minDimension) ret = .overDF(r, y@data, length(x), returnList, fn, ...) if (returnList) names(ret) = row.names(x) else row.names(ret) = row.names(x) ret } setMethod("over", signature(x = "SpatialPoints", y = "SpatialPoints"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x, y)) zd = zerodist2(x, y) if (returnList) { ret = lapply(1:length(x), function(X) integer(0)) s = split(zd[,2],zd[,1]) ix = as.integer(names(s)) ret[ix] = s } else { ret = rep(as.integer(NA), length(x)) ret[zd[,1]] = zd[,2] } names(ret) = row.names(x) ret } ) setMethod("over", signature(x = "SpatialPoints", y = "SpatialPolygons"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x, y)) r = pointsInSpatialPolygons(x, y, returnList) if (returnList) r = .invert(r, length(y), length(x)) names(r) = row.names(x) r } ) setMethod("over", signature(x = "SpatialPolygons", y = "SpatialPoints"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x,y)) r = pointsInSpatialPolygons(geometry(y), geometry(x), TRUE) if (!returnList) r = sapply(r, function(x) x[1]) names(r) = row.names(x) r } ) setMethod("over", signature(x = "SpatialGrid", y = "SpatialPoints"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialGrid", y = "SpatialPolygons"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialGrid", y = "SpatialPixels"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialGrid", y = "SpatialGrid"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialPolygons", y = "SpatialGrid"), function(x, y, returnList = FALSE, fn = NULL, ...) over(x = x, y = as(y, "SpatialPoints"), returnList = returnList, fn = fn, ...) ) setMethod("over", signature("SpatialPoints", "SpatialGrid"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x,y)) idx = getGridIndex(coordinates(x), y@grid, all.inside = FALSE) r = .index2list(idx, returnList) names(r) = row.names(x) r } ) setMethod("over", signature("SpatialPoints", "SpatialPixels"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x,y)) idx = getGridIndex(coordinates(x), y@grid, all.inside = FALSE) idx = match(idx, y@grid.index) r = .index2list(idx, returnList) names(r) = row.names(x) r } ) setMethod("over", signature(x = "SpatialPoints", y = "SpatialPointsDataFrame"), overDFGeneric) setMethod("over", signature(x = "SpatialPoints", y = "SpatialPolygonsDataFrame"), overDFGeneric) setMethod("over", signature(x = "SpatialGrid", y = "SpatialPointsDataFrame"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialGrid", y = "SpatialPolygonsDataFrame"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialGrid", y = "SpatialPixelsDataFrame"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialGrid", y = "SpatialGridDataFrame"), function(x, y, returnList = FALSE, fn = NULL, ...) over(as(x, "SpatialPoints"), y = y, returnList = returnList, fn = fn, ...) ) setMethod("over", signature(x = "SpatialPolygons", y = "SpatialPointsDataFrame"), overDFGeneric) setMethod("over", signature(x = "SpatialPolygons", y = "SpatialGridDataFrame"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x,y)) over(x, as(y, "SpatialPixelsDataFrame"), returnList = returnList, fn = fn, ...) } ) setMethod("over", signature("SpatialPoints", "SpatialGridDataFrame"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x,y)) idx = over(x, geometry(y)) ret = y@data[idx,,drop=FALSE] row.names(ret) = row.names(x) .index2list(ret, returnList) } ) setMethod("over", signature("SpatialPoints", "SpatialPixelsDataFrame"), function(x, y, returnList = FALSE, fn = NULL, ...) { stopifnot(identicalCRS(x,y)) idx = over(x, geometry(y)) ret = y@data[idx,,drop=FALSE] row.names(ret) = row.names(x) .index2list(ret, returnList) } ) setMethod("over", signature("Spatial", "Spatial"), # catch remaining: function(x, y, returnList = FALSE, fn = NULL, ...) { if (!requireNamespace("rgeos", quietly = TRUE)) stop("package rgeos is required for additional over methods") if (is(x, "SpatialMultiPoints") || is(y, "SpatialMultiPoints")) overMultiPoints(x, y, returnList = returnList, fn = fn, ...) else over(x, y, returnList = returnList, fn = fn, ...) # rgeos methods } ) overMultiPoints = function(x, y, returnList, fn, ...) { if (is(x, "SpatialMultiPoints")) { x = as(x, "SpatialPoints") dimnames(x@coords)[[1]] = attr(x@coords, "groupIndex") # rgeos abuse } if (is(y, "SpatialMultiPoints")) { if (is(y, "SpatialMultiPointsDataFrame")) { yy = as(y, "SpatialPointsDataFrame") yy@data = y@data # strong sp abuse - yy no longer validates! y = yy } else y = as(y, "SpatialPoints") dimnames(y@coords)[[1]] = attr(y@coords, "groupIndex") # rgeos abuse } if (!requireNamespace("rgeos", quietly = TRUE)) stop("package rgeos is required for additional over methods") if ("data" %in% slotNames(y)) rgeos::overGeomGeomDF(x, y, returnList = returnList, fn = fn, ...) else rgeos::overGeomGeom(x, y, returnList = returnList, fn = fn, ...) } .index2list = function(x, returnList) { if (returnList) { l = lapply(1:length(x), function(x) { integer(0) }) notNA = !is.na(x) l[notNA] = x[notNA] l } else x } sp/R/SpatialLinesDataFrame-methods.R0000644000176200001440000000666712635107673017047 0ustar liggesusersSpatialLinesDataFrame = function(sl, data, match.ID = TRUE) { if (is.character(match.ID)) { row.names(data) = data[, match.ID[1]] match.ID = TRUE } if (match.ID) { Sl_IDs <- sapply(slot(sl, "lines"), function(x) slot(x, "ID")) data_IDs <- row.names(data) mtch <- match(Sl_IDs, data_IDs) if (any(is.na(mtch))) stop("row.names of data and Lines IDs do not match") if (length(unique(mtch)) != length(Sl_IDs)) stop("row.names of data and Lines IDs do not match") data <- data[mtch, , drop=FALSE] } if (nrow(data) != length(sl@lines)) stop("length of data.frame does not match number of Lines elements") new("SpatialLinesDataFrame", sl, data = data) } names.SpatialLinesDataFrame = function(x) names(x@data) "names<-.SpatialLinesDataFrame" = function(x,value) { checkNames(value); names(x@data)<-value; x } as.data.frame.SpatialLinesDataFrame = function(x, row.names, optional, ...) x@data setMethod("addAttrToGeom", signature(x = "SpatialLines", y = "data.frame"), function(x, y, match.ID, ...) SpatialLinesDataFrame(x, y, match.ID = match.ID, ...) ) setAs("SpatialLinesDataFrame", "SpatialMultiPointsDataFrame", function(from) SpatialMultiPointsDataFrame(as(geometry(from), "SpatialMultiPoints"), from@data) ) setAs("SpatialLinesDataFrame", "data.frame", function(from) as.data.frame.SpatialLinesDataFrame(from)) row.names.SpatialLinesDataFrame <- function(x) { sapply(slot(x, "lines"), slot, "ID") } "row.names<-.SpatialLinesDataFrame" <- function(x, value) { spChFIDs(x, value) } setMethod("[", c("SpatialLinesDataFrame", "ANY", "ANY"), function(x, i, j, ... , drop = TRUE) { missing.i = missing(i) missing.j = missing(j) nargs = nargs() # e.g., a[3,] gives 2 for nargs, a[3] gives 1. if (missing.i && missing.j) { i = TRUE j = TRUE } else if (missing.j && !missing.i) { if (nargs == 2) { j = i i = TRUE } else { j = TRUE } } else if (missing.i && !missing.j) i = TRUE if (is.matrix(i)) stop("matrix argument not supported in SpatialLinesDataFrame selection") if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (is.logical(i)) { if (length(i) == 1 && i) i = 1:length(x@lines) else i <- which(i) } else if (is.character(i)) { i <- match(i, row.names(x)) } if (any(is.na(i))) stop("NAs not permitted in row index") #SpatialLinesDataFrame(as(x, "SpatialLines")[i, , drop = FALSE], # data = x@data[i, j, drop = FALSE], match.ID = FALSE) x@lines = x@lines[i] x@data = x@data[i, j, ..., drop = FALSE] # RSB 081003 if (length(x@lines) > 0) # EJP, 151218 x@bbox = .bboxSls(x@lines) x }) lines.SpatialLinesDataFrame = function(x, y = NULL, ...) lines(as(x, "SpatialLines"), ...) setAs("SpatialLinesDataFrame", "SpatialPointsDataFrame", function(from) { spp = as(as(from, "SpatialLines"), "SpatialPointsDataFrame") dfl = from@data[spp$Lines.NR, , drop = FALSE] spp@data = cbind(dfl, spp@data) spp } ) dim.SpatialLinesDataFrame = function(x) dim(x@data) setMethod("split", "SpatialLinesDataFrame", split.data.frame) print.SpatialLinesDataFrame = function(x, ..., digits = getOption("digits"), asWKT = .asWKT) print(data.frame(asWKTSpatialLines(x, digits), x@data),..., digits = digits) setMethod("geometry", "SpatialLinesDataFrame", function(obj) as(obj, "SpatialLines")) length.SpatialLinesDataFrame = function(x) { length(x@lines) } sp/vignettes/0000755000176200001440000000000013124453245012707 5ustar liggesuserssp/vignettes/over.Rnw0000644000176200001440000005054413026705206014360 0ustar liggesusers% dimensions(x) returns number of spatial dimensions % y = transform(x, "proj4string") % bbox(x) % coordinates(x) ; <- % rings(x) ; <- % method to retrieve lines? --> Lines()? % gridded(x) ; <- % \documentclass{article} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} % \VignetteIndexEntry{ sp: overlay and aggregation } \usepackage{color} \usepackage{Sweave} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \newcommand{\code}[1]{{\tt #1}} \let\pkg=\strong \title{\bf Map overlay and \\ spatial aggregation in {\tt sp}} \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt edzer.pebesma@uni-muenster.de}}} \date{\today} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \begin{abstract} Numerical ``map overlay'' combines spatial features from one map layer with the attribute (numerical) properties of another. This vignette explains the R method ``over'', which provides a consistent way to retrieve indices or attributes from a given spatial object (map layer) at the locations of another. Using this, the R generic ``aggregate'' is extended for spatial data, so that any spatial properties can be used to define an aggregation predicate, and any R function can be used as aggregation function. \end{abstract} \tableofcontents \section{Introduction} According to the free e-book by Davidson (2008), \begin{quotation} {\em An overlay is a clear sheet of plastic or semi-transparent paper. It is used to display supplemental map and tactical information related to military operations. It is often used as a supplement to orders given in the field. Information is plotted on the overlay at the same scale as on the map, aerial photograph, or other graphic being used. When the overlay is placed over the graphic, the details plotted on the overlay are shown in their true position. } \end{quotation} This suggests that {\em map overlay} is concerned with combining two, or possibly more, map layers by putting them on top of each other. This kind of overlay can be obtained in R e.g. by plotting one map layer, and plotting a second map layer on top of it. If the second one contains polygons, transparent colours can be used to avoid hiding of the first layer. When using the {\tt spplot} command, the {\tt sp.layout} argument can be used to combine multiple layers. O'Sullivan and Unwin (2003) argue in chapter 10 (Putting maps together: map overlay) that map overlay has to do with the combination of two (or more) maps. They mainly focus on the combination of the selection criteria stemming from several map layers, e.g. finding the deciduous forest area that is less than 5 km from the nearest road. They call this {\em boolean overlays}. One could look at this problem as a polygon-polygon overlay, where we are looking for the intersection of the polygons with the deciduous forest with the polygons delineating the area less than 5 km from a road. Other possibilities are to represent one or both coverages as grid maps, and find the grid cells for which both criteria are valid (grid-grid overlay). A third possibility would be that one of the criteria is represented by a polygon, and the other by a grid (polygon-grid overlay, or grid-polygon overlay). In the end, as O'Sullivan and Unwin argue, we can overlay any spatial type (points, lines, polygons, pixels/grids) with any other. In addition, we can address spatial attributes (as the case of grid data), or only the geometry (as in the case of the polygon-polygon intersection). This vignette will explain how the {\tt over} method in package {\tt sp} can be used to compute map overlays, meaning that instead of overlaying maps visually, the digital information that comes from combining two digital map layers is retrieved. From there, methods to {\em aggregate} (compute summary statistics; Heuvelink and Pebesma, 1999) over a spatial domain will be developed and demonstrated. Pebesma (2012) describes overlay and aggregation for spatio-temporal data. \section{Geometry overlays} We will use the word {\em geometry} to denote the purely spatial characteristics, meaning that attributes (qualities, properties of something at a particular location) are ignored. With {\em location} we denote a point, line, polygon or grid cell. Section \ref{attr} will discuss how to retrieve and possibly aggregate or summarize attributes found there. Given two geometries, {\tt A} and {\tt B}, the following equivalent commands <>= A %over% B over(A, B) @ retrieve the geometry (location) indices of \code{B} at the locations of \code{A}. More in particular, an integer vector of length {\tt length(A)} is returned, with {\tt NA} values for locations in {\tt A} not matching with locations in {\tt B} (e.g. those points outside a set of polygons). Selecting points of \code{A} {\em inside} or {\em on} some geometry \code{B} (e.g. a set of polygons) {\tt B} is done by <>= A[B,] @ which is short for <>= A[!is.na(over(A,B)),] @ We will now illustrate this with toy data created by <>= library(sp) x = c(0.5, 0.5, 1.0, 1.5) y = c(1.5, 0.5, 0.5, 0.5) xy = cbind(x,y) dimnames(xy)[[1]] = c("a", "b", "c", "d") pts = SpatialPoints(xy) xpol = c(0,1,1,0,0) ypol = c(0,0,1,1,0) pol = SpatialPolygons(list( Polygons(list(Polygon(cbind(xpol-1.05,ypol))), ID="x1"), Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), Polygons(list(Polygon(cbind(xpol,ypol - 1.0))), ID="x3"), Polygons(list(Polygon(cbind(xpol + 1.0, ypol))), ID="x4"), Polygons(list(Polygon(cbind(xpol+.4, ypol+.1))), ID="x5") )) @ and shown in figure \ref{fig:toy}. \begin{figure}[htb] <>= library(RColorBrewer) pal = brewer.pal(5, "Set2") plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=pal, axes=TRUE, col = paste0(pal, "4D")) points(pts, col='red') text(c(-1,0.1,0.1,1.9,0.45), c(0.05,0.05,-.95,0.05,0.15), c("x1", "x2", "x3", "x4", "x5")) text(coordinates(pts), pos=1, row.names(pts)) @ \caption{ Toy data: points (a-d), and (overlapping) polygons (x1-x5) } \label{fig:toy} \end{figure} Now, the polygons \code{pol} in which points \code{pts} lie are <<>>= over(pts, pol) @ As points \code{b} and \code{c} touch two overlapping polygons, the output from the previous command does not provide all information about the overlaps, only returning the \emph{last} polygon which touched them (polygon 5 in both cases). The complete information can be retrieved as a list: <<>>= over(pts, pol, returnList = TRUE) @ This shows that \code{over} returns true if geometries in one element touch geometries in another: they do not have to fully overlap (see section \ref{dim} to constrain the selection criteria). The points falling in or touching any of the polygons are selected by: <<>>= pts[pol] @ The reverse, identical sequence of commands for selecting polygons \code{pol} that have (one or more) points of \code{pts} in them is done by <<>>= over(pol, pts) over(pol, pts, returnList = TRUE) row.names(pol[pts]) @ \code{over} can also be used to query polygons in a single object overlay each other: <<>>= over(pol, pol, returnList = TRUE) @ \noindent The output tells us that \code{x1} does not intersect with any polygons other than itself, within the \code{pol} object. \code{x2} intersects with itself and \code{x3}, \code{x4} and \code{x5}, and so on. Note that the \emph{types} of overlap queried by \code{over} include any intersecting points or edges under the \href{https://en.wikipedia.org/wiki/DE-9IM}{DE-9IM} standard. More generic types of spatial overlap can be queried using functions from the rgeos package, as illustrated by the help page launched with \code{?rgeos::gRelate}. Constraining polygon-polygon intersections to e.g. {\em overlap} using \code{over} is explained in section \ref{dim}. \section{Using \code{over} to extract attributes} \label{attr} This section shows how \code{over(x,y)} is used to extract attribute values of argument \code{y} at locations of \code{x}. The return value is either an (aggregated) data frame, or a list. We now create an example \code{SpatialPointsDataFrame} and a \code{SpatialPolygonsDataFrame} using the toy data created earlier: <<>>= zdf = data.frame(z1 = 1:4, z2=4:1, f = c("a", "a", "b", "b"), row.names = c("a", "b", "c", "d")) zdf ptsdf = SpatialPointsDataFrame(pts, zdf) zpl = data.frame(z = c(10, 15, 25, 3, 0), zz=1:5, f = c("z", "q", "r", "z", "q"), row.names = c("x1", "x2", "x3", "x4", "x5")) zpl poldf = SpatialPolygonsDataFrame(pol, zpl) @ In the simplest example <<>>= over(pts, poldf) @ a \code{data.frame} is created with each row corresponding to the first element of the \code{poldf} attributes at locations in \code{pts}. As an alternative, we can pass a user-defined function to process the table (selecting those columns to which the function makes sense): <<>>= over(pts, poldf[1:2], fn = mean) @ To obtain the complete list of table entries at each point of \code{pts}, we use the \code{returnList} argument: <<>>= over(pts, poldf, returnList = TRUE) @ The same actions can be done when the arguments are reversed: <<>>= over(pol, ptsdf) over(pol, ptsdf[1:2], fn = mean) @ \section{Lines, and Polygon-Polygon overlays require {\tt rgeos}} Package \code{sp} provides many of the \code{over} methods, but not all. Package \code{rgeos} can compute geometry intersections, i.e. for any set of (points, lines, polygons) to determine whether they have one ore more points in common. This means that the \code{over} methods provided by package \code{sp} can be completed by \code{rgeos} for {\em any} \code{over} methods where a \code{SpatialLines} object is involved (either as \code{x} or \code{y}), or where \code{x} and \code{y} are both of class \code{SpatialPolygons} (table \ref{tab}). For this purpose, objects of class \code{SpatialPixels} or \code{SpatialGrid} are converted to \code{SpatialPolygons}. A toy example combines polygons with lines, created by <<>>= l1 = Lines(Line(coordinates(pts)), "L1") l2 = Lines(Line(rbind(c(1,1.5), c(1.5,1.5))), "L2") L = SpatialLines(list(l1,l2)) @ and shown in figure \ref{fig:lines}. \begin{table} \centering \begin{tabular}{|l|ccccc|} \hline & y: Points & y: Lines & y: Polygons & y: Pixels & y: Grid \\ \hline x: Points & s & r & s & s & s \\ x: Lines & r & r & r & r:y & r:y \\ x: Polygons & s & r & r & s:y & s:y \\ x: Pixels & s:x & r:x & s:x & s:x & s:x \\ \hline x: Grid & s:x & r:x & s:x & s:x & s:x \\ \hline \end{tabular} \caption{ \code{over} methods implemented for different \code{x} and \code{y} arguments. s: provided by \pkg{sp}; r: provided by \pkg{rgeos}. s:x or s:y indicates that the x or y argument is converted to grid cell center points; r:x or r:y indicate grids or pixels are converted to polygons equal to the grid cell. } \label{tab} \end{table} \begin{figure}[htb] <>= plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=2:6, axes=TRUE) text(c(-1,0.1,0.1,1.1,0.45), c(0,0,-1.05,0,0.1), c("x1", "x2", "x3", "x4", "x5")) lines(L, col = 'green') text(c(0.52, 1.52), c(1.5, 1.5), c("L1", "L2")) @ \caption{ Toy data: two lines and (overlapping) polygons (x1-x5) } \label{fig:lines} \end{figure} The set of \code{over} operations on the polygons, lines and points is shown below (note that lists and vectors are named in this case): <<>>= library(rgeos) over(pol, pol) over(pol, pol,returnList = TRUE) over(pol, L) over(L, pol) over(L, pol, returnList = TRUE) over(L, L) over(pts, L) over(L, pts) @ Another example overlays a line with a grid, shown in figure \ref{fig:grid}. \begin{figure} <>= data(meuse.grid) gridded(meuse.grid) = ~x+y Pt = list(x = c(178274.9,181639.6), y = c(329760.4,333343.7)) sl = SpatialLines(list(Lines(Line(cbind(Pt$x,Pt$y)), "L1"))) image(meuse.grid) xo = over(sl, geometry(meuse.grid), returnList = TRUE) image(meuse.grid[xo[[1]], ],col=grey(0.5),add=T) lines(sl) @ \caption{ Overlay of line with grid, identifying cells crossed (or touched) by the line } \label{fig:grid} \end{figure} \section{Ordering and constraining of \code{rgeos}-based intersects} Consider the following ``identical'' $3 \times 3$ grid, represented as \code{SpatialGrid}, \code{SpatialPolygons} and \code{SpatialPixels}: <>= g = SpatialGrid(GridTopology(c(0,0), c(1,1), c(3,3))) p = as(g, "SpatialPolygons") px = as(g, "SpatialPixels") plot(g) text(coordinates(g), labels = 1:9) @ We can match these geometries with themselves by <<>>= over(g,g) over(p,p) over(p,g) over(g,p) @ and see that most give a 1:1 match, except for polygons-polygons \code{(p,p)}. When we ask for the full set of matches, we see <<>>= over(px[5], g, returnList = TRUE) over(p[c(1,5)], p, returnList = TRUE) @ and note that the implementation lets grids/pixels not match (intersect) with neighbour grid cells, but that polygons do. There are two issues we'd like to improve here: the order in which matching features (here: polygons) are returned, and the possibility to limit this by the dimension of the intersection (point/line/area). Both will be explained now. \subsection{Ordering of matches} By default, polygon-polygon features are matched by \code{rgeos::gIntersects}, which just returns {\em any} match in {\em any} order (feature order, it seems). Although it is slower, we can however improve on this by switching to \code{rgeos::gRelate}, and see <<>>= over(px[5], g, returnList = TRUE, minDimension = 0) over(p[c(1,5)], p, returnList = TRUE, minDimension = 0) @ When \code{minDimension = 0} is specified, the matching geometries are being returned based on a nested ordering. First, ordering is done by dimensionality of the intersection, as returned by the \code{rgeos} function \code{gRelate} (which uses the \href{https://en.wikipedia.org/wiki/DE-9IM}{DE-9IM} model). This means that features that have an area overlapping (dim=2) are listed before features that have a line in common (dim=1), and that line in common features are listed before features that only have a point in common (dim=0). Remaining ties, indicating cases when there are multiple different intersections of the same dimension, are ordered such that matched feature {\em interiors} are given higher priority than matched feature boundaries. Note that the ordering also determines which feature is matched when \code{returnList=FALSE}, as in this case the first element of the ordered set is taken: <<>>= over(p, p, minDimension = 0) @ Consider the following example where a point is {\em on} \code{x1} and {\em in} \code{x2}: <>= x2 = x1 = cbind(c(0,1,1,0,0), c(0,0,1,1,0)) x1[,1] = x1[,1]+0.5 x1[,2] = x1[,2]+0.25 sp = SpatialPolygons(list( Polygons(list(Polygon(x1)), "x1"), Polygons(list(Polygon(x2)), "x2"))) pt = SpatialPoints(cbind(0.5,0.5)) # on border of x1 row.names(pt) = "pt1" plot(sp, axes = TRUE) text(c(0.05, 0.55, 0.55), c(0.9, 1.15, 0.5), c("x1","x2", "pt")) plot(pt, add=TRUE, col='red', pch=16) @ When matching the point \code{pt} with the two polygons, the sp method (default) gives no preference of the second polygon that (fully) contains the point; the rgeos method however does: <<>>= over(pt,sp) over(pt,sp,minDimension=0) over(pt,sp,returnList=TRUE) rgeos::overGeomGeom(pt,sp) rgeos::overGeomGeom(pt,sp,returnList=TRUE) rgeos::overGeomGeom(pt,sp,returnList=TRUE,minDimension=0) @ % # x1 x2 % # "F0FF" "0FFF" % # it would be nice to have these sorted "2, 1" instead of "1, 2", but % # that doesn't work now. \subsection{Constraining dimensionality of intersection} \label{dim} In some cases for feature selection it may be desired to constrain matching to features that have an area overlap, or that have an area overlap {\em or} line in common. This can be done using the parameter \code{minDimension}: <<>>= over(p[5], p, returnList=TRUE, minDimension=0) over(p[5], p, returnList=TRUE, minDimension=1) over(p[5], p, returnList=TRUE, minDimension=2) rgeos::overGeomGeom(pt, pt, minDimension=2) # empty rgeos::overGeomGeom(pt, pt, minDimension=1) # empty rgeos::overGeomGeom(pt, pt, minDimension=0) @ \section{Aggregation} In the following example, the values of a fine grid with 40 m x 40 m cells are aggregated to a course grid with 400 m x 400 m cells. <<>>= data(meuse.grid) gridded(meuse.grid) = ~x+y off = gridparameters(meuse.grid)$cellcentre.offset + 20 gt = GridTopology(off, c(400,400), c(8,11)) SG = SpatialGrid(gt) agg = aggregate(meuse.grid[3], SG, mean) @ Figure \ref{fig:agg} shows the result of this aggregation (\code{agg}, in colors) and the points (+) of the original grid (\code{meuse.grid}). Function \code{aggregate} aggregates its first argument over the geometries of the second argument, and returns a geometry with attributes. The default aggregation function (\code{mean}) can be overridden. \begin{figure}[htb] <>= image(agg) points(meuse.grid, pch = 3, cex=.2, col = "#80808080") @ \caption{ aggregation over meuse.grid distance values to a 400 m x 400 m grid} \label{fig:agg} \end{figure} An example of the aggregated values of \code{meuse.grid} along (or under) the line shown in Figure \ref{fig:lines} are <<>>= sl.agg = aggregate(meuse.grid[,1:3], sl, mean) class(sl.agg) as.data.frame(sl.agg) @ Function \code{aggregate} returns a spatial object of the same class of \code{sl} (\code{SpatialLines}), and \code{as.data.frame} shows the attribute table as a \code{data.frame}. \subsection{Constraining the dimension of intersection} Building on the simple example of section \ref{dim}, we can see what happens if we aggregate polygons {\em without} specifying {\em how} polygons intersect\footnote{sp versions 1.2-1, rgeos versions 0.3-13}, the result of which is shown in Figure \ref{fig:agg}. <<>>= g = SpatialGrid(GridTopology(c(5,5), c(10,10), c(3,3))) p = as(g, "SpatialPolygons") p$z = c(1,0,1,0,1,0,1,0,1) cc = coordinates(g) p$ag1 = aggregate(p, p, mean)[[1]] p$ag1a = aggregate(p, p, mean, minDimension = 0)[[1]] p$ag2 = aggregate(p, p, mean, minDimension = 1)[[1]] p$ag3 = aggregate(p, p, mean, minDimension = 2)[[1]] p$ag4 = aggregate(p, p, areaWeighted=TRUE)[[1]] @ \begin{figure}[ht] <>= pts = cbind(c(9,21,21,9,9),c(9,9,21,21,9)) sq = SpatialPolygons(list(Polygons(list(Polygon(pts)), "ID"))) rnd2 = function(x) round(x, 2) l = list( list("sp.text", cc, rnd2(p$z), which = 1), list("sp.text", cc, rnd2(p$ag1), which = 2), list("sp.text", cc, rnd2(p$ag1a), which = 3), list("sp.text", cc, rnd2(p$ag2), which = 4), list("sp.text", cc, rnd2(p$ag3), which = 5), list("sp.text", cc, rnd2(p$ag4), which = 6), list(sq, col = 'green', which = 6, first = FALSE, lwd = 2) ) spplot(p, names.attr = c("source", "default aggregate", "minDimension=0", "minDimension=1", "minDimension=2", "areaWeighted=TRUE"), layout = c(3,2), as.table=TRUE, col.regions=bpy.colors(151)[50:151], cuts=100, sp.layout = l, scales = list(draw = TRUE)) @ \caption{Effect of aggregating checker board {\tt SpatialPolygons} by themselves, for different values of {\tt minDimension} and {\tt areaWeighted}; the green square example is given in the text.} \label{fig:agg} \end{figure} The option \code{areaWeighted=TRUE} aggregates area-weighted, giving zero weight to polygons that only have a point or line in common with the target polygon; \code{minDimension} is passed to \code{over} to constrain the intersecting polygons used. The following example furher illustrates the difference between selection using {\tt minDimension}, and area weighting for aggregating the 0-1 checker board of figure \ref{fig:agg} by the green square polygon ({\tt sq}) shown in the last panel of that figure: <<>>= round(c( aggDefault = aggregate(p, sq, mean)[[1]], aggMinDim0 = aggregate(p, sq, mean, minDimension = 0)[[1]], aggMinDim1 = aggregate(p, sq, mean, minDimension = 1)[[1]], aggMinDim2 = aggregate(p, sq, mean, minDimension = 2)[[1]], areaWeighted = aggregate(p, sq, areaWeighted=TRUE)[[1]]), 3) @ \section*{References} \begin{itemize} \item O'Sullivan, D., Unwin, D. (2003) Geographical Information Analysis. Wiley, NJ. \item Davidson, R., 2008. Reading topographic maps. Free e-book from: \url{http://www.map-reading.com/} \item Heuvelink, G.B.M., and E.J. Pebesma, 1999. Spatial aggregation and soil process modelling. Geoderma 89, 1-2, \href{http://dx.doi.org/10.1016/S0016-7061(98)00077-9}{47-65}. \item Pebesma, E., 2012. Spatio-temporal overlay and aggregation. Package vignette for package spacetime, \url{https://cran.r-project.org/web/packages/spacetime/vignettes/sto.pdf} \end{itemize} \end{document} sp/vignettes/csdacm.Rnw0000644000176200001440000011635212577541412014646 0ustar liggesusers%% $Id: csdacm.Rnw,v 1.44 2008-04-06 20:47:04 roger Exp $ % -*- mode: noweb; noweb-default-code-mode: R-mode; -*- % merge all depth coefficients!! % Customising spatial data analysis classes and methods %\SweaveOpts{echo=TRUE} %*Intro and plan* %motivate spatial data handling \documentclass{article} % \VignetteIndexEntry{Customising spatial data classes and methods} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{color} \usepackage{Sweave} \SweaveOpts{keep.source=FALSE} \usepackage{natbib} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong \newcommand\code{\bgroup\@codex} \def\@codex#1{\small {\normalfont\ttfamily\hyphenchar\font=45 #1}\egroup} \usepackage{xspace} \def\RR{\textsf{R}\xspace} \def\SP{\texttt{S-PLUS}\texttrademark\xspace} \def\SS{\texttt{S}\xspace} \def\SIII{\texttt{S3}\xspace} \def\SIV{\texttt{S4}\xspace} \title{{\bf Customising spatial data classes and methods}\footnote{This vignette formed pp. 127--148 of the first edition of Bivand, R. S., Pebesma, E. and G\'{o}mez-Rubio V. (2008) Applied Spatial Data Analysis with R, Springer-Verlag, New York. It was retired from the second edition (2013) to accommodate material on other topics, and is made available in this form with the understanding of the publishers. It has been updated to the 2013 state of the software, e.g. using \code{over}.} } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt edzer.pebesma@uni-muenster.de}}} \date{Feb 2008} \begin{document} \maketitle \tableofcontents <>= owidth <- getOption("width") options("width"=90) .PngNo <- 0 @ <>= .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 @ <>= <> @ <>= .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) @ <>= dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") @ Although the classes defined in the \pkg{sp} package cover many needs, they do not go far beyond the most typical GIS data models. In applied research, it often happens that customised classes would suit the actual data coming from the instruments better. Since \SIV classes have mechanisms for inheritance, it may be attractive to build on the \pkg{sp} classes, so as to utilise their methods where appropriate. Here, we will demonstrate a range of different settings in which \pkg{sp} classes can be extended. Naturally, this is only useful for researchers with specific and clear needs, so our goal is to show how (relatively) easy it may be to prototype classes extending \pkg{sp} classes for specific purposes. \section{Programming with classes and methods} \label{sect:cls} This section will explain the elementary basics of programming with classes and methods in \RR. The \SS language (implemented in \RR and \SP) contains two mechanisms for creating classes and methods: the traditional \SIII system and the more recent \SIV system (see Section 2.2 in \cite{bivand}, in which classes were described for the use{\RR} --- here they are described for the develope{\RR}). This chapter is not a full introduction to \RR programming \citep[see][for more details]{braun+murdoch:07}, but it will try to give some feel of how the \code{Spatial} classes in package \pkg{sp} can be extended to be used for wider classes of problems. For full details, the interested reader is referred to e.g.\ \cite{R:Venables+Ripley:2000} and \cite{R:Chambers:1998}, the latter being a reference for new-style \SIV classes and methods. Example code is for example found in the source code for package \pkg{sp}, available from CRAN. Suppose we define myfun as \begin{footnotesize} << >>= myfun <- function(x) { x + 2 } @ \end{footnotesize} then, calling it with the numbers 1, 2 and 3 results in \begin{footnotesize} << >>= myfun(1:3) @ \end{footnotesize} or alternatively using a named argument: \begin{footnotesize} << >>= myfun(x=1:3) @ \end{footnotesize} The return value of the function is the last expression evaluated. Often, we want to wrap existing functions, such as a plot function: \begin{footnotesize} << >>= plotXplus2Yminus3 <- function(x, y, ...) { plot(x = x + 2, y = y - 3, ...) } @ \end{footnotesize} In this case, the \code{...} is used to pass information to the \code{plot} function without explicitly anticipating what it will be: named arguments \code{x} and \code{y}, or the first two arguments if they are unnamed are processed, remaining arguments are passed on. The plot function is a generic method, with an instance that depends on the class of its first (\SIII) or first $n$ arguments (\SIV). The available instances of \code{plot} are shown for \SIII-type methods by \begin{footnotesize} << >>= methods("plot") @ \end{footnotesize} and for \SIV-type methods by \begin{footnotesize} << >>= library(sp) showMethods("plot") @ \end{footnotesize} where we first loaded \pkg{sp} to make sure there are some \SIV plot methods to show. \subsection{\SIII-style classes and methods} Building \SIII-style classes is simple. Suppose we want to build an object of class \code{foo}: \begin{footnotesize} << >>= x <- rnorm(10) class(x) <- "foo" x @ \end{footnotesize} If we plot this object, e.g., by \code{plot(x)} we get the same plot as when we would not have set the class to \code{foo}. If we know, however, that objects of class \code{foo} need to be plotted without symbols but with connected lines, we can write a plot method for this class: \begin{footnotesize} << >>= plot.foo <- function(x, y, ...) { plot.default(x, type = 'l', ...) } @ \end{footnotesize} after which \code{plot(x)} will call this particular method, rather than a default plot method. Class inheritance is obtained in \SIII when an object is given multiple classes, as in \begin{footnotesize} << >>= class(x) <- c("foo", "bar") @ <>= plot(x) @ \end{footnotesize} For this plot, first function \code{plot.foo} will be looked for, and if not found the second option \code{plot.bar} will be looked for. If none of them is found, the default \code{plot.default} will be used. The \SIII class mechanism is simple and powerful. Much of \RR works with it, including key functions such as \code{lm}. \begin{footnotesize} << >>= data(meuse) class(meuse) class(lm(log(zinc)~sqrt(dist), meuse)) @ \end{footnotesize} There is, however, no checking that a class with a particular name does indeed contain the elements that a certain method for it expects. It also has design flaws, as method specification by dot separation is ambiguous in case of names such as \code{as.data.frame}, where one cannot tell whether it means that the method \code{as.data} acts on objects of class \code{frame}, or the method \code{as} acts on objects of class \code{data.frame}, or none of them (the answer is: none). For such reasons, \SIV-style classes and methods were designed. \subsection{\SIV-style classes and methods} \SIV-style classes are formally defined, using \code{setClass}. As an example, somewhat simplified versions of classes \code{CRS} and \code{Spatial} in \pkg{sp} are \begin{footnotesize} <>= options("width"=60) @ <>= setClass("CRS", representation(projargs = "character")) setClass("Spatial", representation(bbox = "matrix", proj4string = "CRS"), # NOT TOO WIDE validity <- function(object) { bb <- bbox(object) if (!is.matrix(bb)) return("bbox should be a matrix") n <- dimensions(object) if (n < 2) return("spatial.dimension should be 2 or more") if (any(is.na(bb))) return("bbox should never contain NA values") if (any(!is.finite(bb))) return("bbox should never contain infinite values") if (any(bb[,"max"] < bb[,"min"])) return("invalid bbox: max < min") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} The command \code{setClass} defines a class name as a formal class, gives the names of the class elements (called slots), and their type---type checking will happen upon construction of an instance of the class. Further checking, e.g., on valid dimensions and data ranges can be done in the \code{validity} function. Here, the validity function retrieves the bounding box using the generic \code{bbox} method. Generics, if not defined in the base R system, e.g., \begin{footnotesize} << >>= isGeneric("show") @ \end{footnotesize} can be defined with \code{setGeneric}. Defining a specific instance of a generic is done by \code{setMethod}: \begin{footnotesize} <>= setGeneric("bbox", function(obj) standardGeneric("bbox")) setMethod("bbox", signature = "Spatial", function(obj) obj@bbox) @ \end{footnotesize} where the signature tells the class of the first (or first $n$) arguments. Here, the \code{@} operator is used to access the \code{bbox} slot in an \SIV object, not to be confused with the \code{\$} operator to access list elements. We will now illustrate this mechanism by providing a few examples of classes, building on those available in package \pkg{sp}. \section{Animal track data in package \pkg{trip}} CRAN Package \pkg{trip}, written by Michael Sumner \citep{kirkwood06,page06}, provides a class for animal tracking data. Animal tracking data consist of sets of ($x,y,t$) stamps, grouped by an identifier pointing to an individual animal, sensor or perhaps isolated period of monitoring. A strategy for this (slightly simplified from that of \pkg{trip}) is to extend the {\tt SpatialPointsDataFrame} class by a length 2 character vector carrying the names of the time column and the trip identifier column in the {\tt SpatialPointsDataFrame} attribute table. Package \pkg{trip} does a lot of work to read and analyse tracking data from data formats typical for tracking data (Argos DAT), removing duplicate observations and validating the objects, e.g., checking that time stamps increase and movement speeds are realistic. We ignore this and stick to the bare bones. We now define a class called \code{trip} that extends \code{SpatialPointsDataFrame}: \begin{footnotesize} << >>= library(sp) setClass("trip", representation("SpatialPointsDataFrame", TOR.columns = "character"), validity <- function(object) { if (length(object@TOR.columns) != 2) stop("Time/id column names must be of length 2") if (!all(object@TOR.columns %in% names(object@data))) stop("Time/id columns must be present in attribute table") TRUE } ) showClass("trip") @ \end{footnotesize} that checks, upon creation of objects, that indeed two variable names are passed and that these names refer to variables present in the attribute table. \subsection{Generic and constructor functions} It would be nice to have a constructor function, just like \code{data.frame} or \code{SpatialPoints}, so we now create it and set it as the generic function to be called in case the first argument is of class \code{SpatialPointsDataFrame}. \begin{footnotesize} << >>= trip.default <- function(obj, TORnames) { if (!is(obj, "SpatialPointsDataFrame")) stop("trip only supports SpatialPointsDataFrame") if (is.numeric(TORnames)) TORnames <- names(obj)[TORnames] new("trip", obj, TOR.columns = TORnames) } if (!isGeneric("trip")) setGeneric("trip", function(obj, TORnames) standardGeneric("trip")) setMethod("trip", signature(obj = "SpatialPointsDataFrame", TORnames = "ANY"), trip.default) @ \end{footnotesize} We can now try it out, with turtle data: \begin{footnotesize} << >>= turtle <- read.csv(system.file("external/seamap105_mod.csv", package="sp")) @ << >>= timestamp <- as.POSIXlt(strptime(as.character(turtle$obs_date), "%m/%d/%Y %H:%M:%S"), "GMT") turtle <- data.frame(turtle, timestamp = timestamp) turtle$lon <- ifelse(turtle$lon < 0, turtle$lon+360, turtle$lon) turtle <- turtle[order(turtle$timestamp),] coordinates(turtle) <- c("lon", "lat") proj4string(turtle) <- CRS("+proj=longlat +ellps=WGS84") turtle$id <- c(rep(1, 200), rep(2, nrow(coordinates(turtle)) - 200)) turtle_trip <- trip(turtle, c("timestamp", "id")) summary(turtle_trip) @ \end{footnotesize} \subsection{Methods for trip objects} The summary method here is not defined for \code{trip}, but is the default summary inherited from class \code{Spatial}. As can be seen, nothing special about the trip features is mentioned, such as what the time points are and what the identifiers. We could alter this by writing a class-specific summary method \begin{footnotesize} << >>= summary.trip <- function(object, ...) { cat("Object of class \"trip\"\nTime column: ") print(object@TOR.columns[1]) cat("Identifier column: ") print(object@TOR.columns[2]) print(summary(as(object, "Spatial"))) print(summary(object@data)) } setMethod("summary", "trip", summary.trip) summary(turtle_trip) @ \end{footnotesize} As \code{trip} extends \code{SpatialPointsDataFrame}, subsetting using {\small \verb+"["+} and column selection or replacement using {\small \verb+"[["+} or {\small \verb+"$"+} all work, as these are inherited. Creating invalid trip objects can be prohibited by adding checks to the validity function in the class definition, e.g., %<>= %x <- turtle_trip[1] %@ will not work because the time and/or id column are not present any more. A custom plot method for trip could be written, for example using colour to denote a change in identifier: \begin{footnotesize} << >>= setGeneric("lines", function(x, ...) standardGeneric("lines")) setMethod("lines", signature(x = "trip"), function(x, ..., col = NULL) { # NOT TOO WIDE tor <- x@TOR.columns if (is.null(col)) { l <- length(unique(x[[tor[2]]])) col <- hsv(seq(0, 0.5, length = l)) } coords <- coordinates(x) lx <- split(1:nrow(coords), x[[tor[2]]]) for (i in 1:length(lx)) lines(coords[lx[[i]], ], col = col[i], ...) } ) @ \end{footnotesize} Here, the \code{col} argument is added to the function header so that a reasonable default can be overridden, e.g., for black/white plotting. \section{Multi-point data: \texttt{SpatialMultiPoints}} One of the feature types of the OpenGeospatial Consortium (OGC) simple feature specification that has not been implemented in \pkg{sp} is the \code{MultiPoint} object. In a \code{MultiPoint} object, each feature refers to a {\em set of} points. The \pkg{sp} classes \code{SpatialPointsDataFrame} only provide reference to a single point. Instead of building a new class up from scratch, we'll try to re-use code and build a class \code{SpatialMultiPoint} from the {\tt SpatialLines} class. After all, lines are just sets of ordered points. In fact, the \code{SpatialLines} class implements the \code{MultiLineString} simple feature, where each feature can refer to multiple lines. A special case is formed if each feature only has a single line: \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialMultiPoints", representation("SpatialLines"), validity <- function(object) { if (any(unlist(lapply(object@lines, function(x) length(x@Lines))) != 1)) # NOT TOO WIDE stop("Only Lines objects with one Line element") TRUE } ) SpatialMultiPoints <- function(object) new("SpatialMultiPoints", object) @ <>= options("width"=70) @ \end{footnotesize} As an example, we can create an instance of this class for two MultiPoint features each having three locations: \begin{footnotesize} << >>= n <- 5 set.seed(1) x1 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x2 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x3 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) L1 <- Lines(list(Line(x1)), ID="mp1") L2 <- Lines(list(Line(x2)), ID="mp2") L3 <- Lines(list(Line(x3)), ID="mp3") s <- SpatialLines(list(L1,L2,L3)) smp <- SpatialMultiPoints(s) @ \end{footnotesize} If we now plot object \code{smp}, we get the same plot as when we plot \code{s}, showing the two lines. The \code{plot} method for a \code{SpatialLines} object is not suitable, so we write a new one: \begin{footnotesize} << >>= plot.SpatialMultiPoints <- function(x, ..., pch = 1:length(x@lines), col = 1, cex = 1) { n <- length(x@lines) if (length(pch) < n) pch <- rep(pch, length.out = n) if (length(col) < n) col <- rep(col, length.out = n) if (length(cex) < n) cex <- rep(cex, length.out = n) plot(as(x, "Spatial"), ...) for (i in 1:n) points(x@lines[[i]]@Lines[[1]]@coords, pch = pch[i], col = col[i], cex = cex[i]) } setMethod("plot", signature(x = "SpatialMultiPoints", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) @ \end{footnotesize} Here we chose to pass any named \code{...} arguments to the plot method for a \code{Spatial} object. This function sets up the axes and controls the margins, aspect ratio, etc. All arguments that need to be passed to \code{points} (\code{pch} for symbol type, \code{cex} for symbol size and \code{col} for symbol colour) need explicit naming and sensible defaults, as they are passed explicitly to the consecutive calls to \code{points}. According to the documentation of \code{points}, in addition to \code{pch}, \code{cex} and \code{col}, the arguments \code{bg} and \code{lwd} (symbol fill colour and symbol line width) would need a similar treatment to make this plot method completely transparent with the base \code{plot} method---something an end user would hope for. Having \code{pch}, \code{cex} and \code{col} arrays the length of the number of \code{MultiPoints} {\em sets} rather than the number of points to be plotted is useful for two reasons. First, the whole point of {\tt MultiPoints} object is to distinguish {\em sets} of points. Second, when we extend this class to \code{SpatialMultiPointsDataFrame}, e.g., by \begin{footnotesize} << >>= cName <- "SpatialMultiPointsDataFrame" setClass(cName, representation("SpatialLinesDataFrame"), validity <- function(object) { lst <- lapply(object@lines, function(x) length(x@Lines)) if (any(unlist(lst) != 1)) stop("Only Lines objects with single Line") TRUE } ) SpatialMultiPointsDataFrame <- function(object) { new("SpatialMultiPointsDataFrame", object) } @ \end{footnotesize} then we can pass symbol characteristics by (functions of) columns in the attribute table: \begin{footnotesize} <>= df <- data.frame(x1 = 1:3, x2 = c(1,4,2), row.names = c("mp1", "mp2", "mp3")) smp_df <- SpatialMultiPointsDataFrame(SpatialLinesDataFrame(smp, df)) setMethod("plot", signature(x = "SpatialMultiPointsDataFrame", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) grys <- c("grey10", "grey40", "grey80") @ <>= plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) @ \end{footnotesize} for which the plot is shown in Figure \ref{fig:smpdf}. \begin{figure} %<>= <>= .iwidth <- 6 .iheight <- 2.5 .ipointsize <- 10 <> plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) <> <> @ \caption{Plot of the \code{SpatialMultiPointsDataFrame} object.} \label{fig:smpdf} \end{figure} Hexagonal grids are like square grids, where grid points are centres of matching hexagons, rather than squares. Package \pkg{sp} has no classes for hexagonal grids, but does have some useful functions for generating and plotting them. This could be used to build a class. Much of this code in \pkg{sp} is based on postings to the R-sig-geo mailing list by Tim Keitt, used with permission. The spatial sampling method \code{spsample} has a method for sampling points on a hexagonal grid: \begin{footnotesize} <<>>= data(meuse.grid) gridded(meuse.grid)=~x+y xx <- spsample(meuse.grid, type="hexagonal", cellsize=200) class(xx) @ \end{footnotesize} gives the points shown in the left side of Figure \ref{fig:hex}. Note that an alternative hexagonal representation is obtained by rotating this grid 90 degrees; we will not further consider that here. \begin{footnotesize} <>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) @ <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", HexPts, col = 1)) @ <>= HexPols <- HexPoints2SpatialPolygons(HexPts) df <- over(HexPols, meuse.grid) HexPolsDf <- SpatialPolygonsDataFrame(HexPols, df, match.ID = FALSE) @ <>= spplot(HexPolsDf["dist"]) @ \end{footnotesize} for which the plots are shown in Figure \ref{fig:hex}. \begin{figure} <>= .iwidth <- 6 .iheight <- 4 <> library(lattice) # RSB quietening greys grys <- grey.colors(11, 0.95, 0.55, 2.2) print(spplot(meuse.grid["dist"], cuts=10, col.regions=grys, sp.layout = list("sp.points", HexPts, col = 1)), split = c(1, 1, 2, 1), more = TRUE) print(spplot(HexPolsDf["dist"], cuts=10, col.regions=grys), split = c(2, 1, 2, 1), more = FALSE) <> <> @ \caption{Hexagonal points (left) and polygons (right).} \label{fig:hex} \end{figure} We can now generate and plot hexagonal grids, but need to deal with two representations: as points and as polygons, and both representations do not tell by themselves that they represent a hexagonal grid. For designing a hexagonal grid class we will extend \code{SpatialPoints}, assuming that computation of the polygons can be done when needed without a prohibitive overhead. \begin{footnotesize} << >>= setClass("SpatialHexGrid", representation("SpatialPoints", dx = "numeric"), validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=40) @ << >>= setClass("SpatialHexGridDataFrame", representation("SpatialPointsDataFrame", dx = "numeric"), # NOT TOO WIDE validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Note that these class definitions do not check that instances actually do form valid hexagonal grids; a more robust implementation could provide a test that distances between points with equal $y$ coordinate are separated by a multiple of \code{dx}, that the $y$-separations are correct and so on. It might make sense to adapt the generic \code{spsample} method in package \pkg{sp} to return \code{SpatialHexGrid} objects; we can also add \code{plot} and \code{spsample} methods for them. Method \code{over} should work with a \code{SpatialHexGrid} as its first argument, by inheriting from \code{SpatialPoints}. Let us first see how to create the new classes. Without a constructor function we can use \begin{footnotesize} << >>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) Hex <- new("SpatialHexGrid", HexPts, dx = 200) df <- over(Hex, meuse.grid) spdf <- SpatialPointsDataFrame(HexPts, df) HexDf <- new("SpatialHexGridDataFrame", spdf, dx = 200) @ \end{footnotesize} Because of the route taken to define both HexGrid classes, it is not obvious that the second extends the first. We can tell the \SIV system this by \code{setIs}: \begin{footnotesize} << >>= is(HexDf, "SpatialHexGrid") setIs("SpatialHexGridDataFrame", "SpatialHexGrid") is(HexDf, "SpatialHexGrid") @ \end{footnotesize} to make sure that methods for \code{SpatialHexGrid} objects work as well for objects of class \code{SpatialHexGridDataFrame}. When adding methods, several of them will need conversion to the polygon representation, so it makes sense to add the conversion function such that e.g. \code{as(x, "SpatialPolygons")} will work: \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setAs("SpatialHexGrid", "SpatialPolygons", function(from) HexPoints2SpatialPolygons(from, from@dx) ) setAs("SpatialHexGridDataFrame", "SpatialPolygonsDataFrame", function(from) SpatialPolygonsDataFrame(as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE) ) @ <>= options("width"=70) @ \end{footnotesize} We can now add \code{plot}, \code{spplot}, \code{spsample} and \code{over} methods for these classes: \begin{footnotesize} << >>= setMethod("plot", signature(x = "SpatialHexGrid", y = "missing"), function(x, y, ...) plot(as(x, "SpatialPolygons"), ...) ) setMethod("spplot", signature(obj = "SpatialHexGridDataFrame"), function(obj, ...) spplot(SpatialPolygonsDataFrame( as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE), ...) ) setMethod("spsample", "SpatialHexGrid", function(x, n, type, ...) spsample(as(x, "SpatialPolygons"), n = n, type = type, ...) ) setMethod("over", c("SpatialHexGrid", "SpatialPoints"), function(x, y, ...) over(as(x, "SpatialPolygons"), y) ) @ \end{footnotesize} After this, the following will work: \begin{footnotesize} <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", Hex, col = 1)) spplot(HexDf["dist"]) @ \end{footnotesize} Coercion to a data frame is done by \begin{footnotesize} <>= as(HexDf, "data.frame") @ \end{footnotesize} Another detail not mentioned is that the bounding box of the hexgrid objects only match the grid centre points, not the hexgrid cells: \begin{footnotesize} << >>= bbox(Hex) bbox(as(Hex, "SpatialPolygons")) @ \end{footnotesize} One solution for this is to correct for this in a constructor function, and check for it in the validity test. Explicit coercion functions to the points representation would have to set the bounding box back to the points ranges. Another solution is to write a bbox method for the hexgrid classes, taking the risk that someone still looks at the incorrect bbox slot. \section{Spatio-temporal grids} Spatio-temporal data can be represented in different ways. One simple option is when observations (or model-results, or predictions) are given on a regular space-time grid. Objects of class or extending \code{SpatialPoints}, \code{SpatialPixels} and \code{SpatialGrid} do not have the constraint that they represent a two-dimensional space; they may have arbitrary dimension; an example for a three-dimensional grid is \begin{footnotesize} << >>= n <- 10 x <- data.frame(expand.grid(x1 = 1:n, x2 = 1:n, x3 = 1:n), z = rnorm(n^3)) coordinates(x) <- ~x1+x2+x3 gridded(x) <- TRUE fullgrid(x) <- TRUE summary(x) @ \end{footnotesize} We might assume here that the third dimension, \code{x3}, represents time. If we are happy with time somehow represented by a real number (in double precision), then we are done. A simple representation is that of decimal year, with e.g. 1980.5 meaning the 183rd day of 1980, or e.g. relative time in seconds after the start of some event. When we want to use the \code{POSIXct} or \code{POSIXlt} representations, we need to do some more work to see the readable version. We will now devise a simple three-dimensional space-time grid with the \code{POSIXct} representation. \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setClass("SpatialTimeGrid", "SpatialGrid", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Along the same line, we can extend the \code{SpatialGridDataFrame} for space-time: \begin{footnotesize} << >>= setClass("SpatialTimeGridDataFrame", "SpatialGridDataFrame", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) setIs("SpatialTimeGridDataFrame", "SpatialTimeGrid") x <- new("SpatialTimeGridDataFrame", x) @ \end{footnotesize} A crude summary for this class could be written along these lines: \begin{footnotesize} << >>= summary.SpatialTimeGridDataFrame <- function(object, ...) { cat("Object of class SpatialTimeGridDataFrame\n") x <- gridparameters(object) t0 <- ISOdate(1970,1,1,0,0,0) t1 <- t0 + x[3,1] cat(paste("first time step:", t1, "\n")) t2 <- t0 + x[3,1] + (x[3,3] - 1) * x[3,2] cat(paste("last time step: ", t2, "\n")) cat(paste("time step: ", x[3,2], "\n")) summary(as(object, "SpatialGridDataFrame")) } @ <>= options("width"=50) @ << >>= # NOT TOO WIDE setMethod("summary", "SpatialTimeGridDataFrame", summary.SpatialTimeGridDataFrame) summary(x) @ <>= options("width"=70) @ \end{footnotesize} Next, suppose we need a subsetting method that selects on the time. When the first subset argument is allowed to be a time range, this is done by \begin{footnotesize} << >>= subs.SpatialTimeGridDataFrame <- function(x, i, j, ..., drop=FALSE) { t <- coordinates(x)[,3] + ISOdate(1970,1,1,0,0,0) if (missing(j)) j <- TRUE sel <- t %in% i if (! any(sel)) stop("selection results in empty set") fullgrid(x) <- FALSE if (length(i) > 1) { x <- x[i = sel, j = j,...] fullgrid(x) <- TRUE as(x, "SpatialTimeGridDataFrame") } else { gridded(x) <- FALSE x <- x[i = sel, j = j,...] cc <- coordinates(x)[,1:2] p4s <- CRS(proj4string(x)) # NOT TOO WIDE SpatialPixelsDataFrame(cc, x@data, proj4string = p4s) } } setMethod("[", c("SpatialTimeGridDataFrame", "POSIXct", "ANY"), subs.SpatialTimeGridDataFrame) t1 <- as.POSIXct("1970-01-01 0:00:03", tz = "GMT") t2 <- as.POSIXct("1970-01-01 0:00:05", tz = "GMT") summary(x[c(t1,t2)]) summary(x[t1]) @ \end{footnotesize} The reason to only convert back to \code{SpatialTimeGridDataFrame} when multiple time steps are present is that the time step (``cell size'' in time direction) cannot be found when there is only a single step. In that case, the current selection method returns an object of class \code{SpatialPixelsDataFrame} for that time slice. Plotting a set of slices could be done using levelplot, or writing another \code{spplot} method: \begin{footnotesize} << >>= spplot.stgdf <- function(obj, zcol = 1, ..., format = NULL) { # NOT TOO WIDE if (length(zcol) != 1) stop("can only plot a single attribute") if (is.null(format)) format <- "%Y-%m-%d %H:%M:%S" cc <- coordinates(obj) df <- unstack(data.frame(obj[[zcol]], cc[,3])) ns <- as.character(coordinatevalues(getGridTopology(obj))[[3]] + ISOdate(1970,1,1,0,0,0), format = format) cc2d <- cc[cc[,3] == min(cc[,3]), 1:2] obj <- SpatialPixelsDataFrame(cc2d, df) spplot(obj, names.attr = ns,...) } setMethod("spplot", "SpatialTimeGridDataFrame", spplot.stgdf) @ \end{footnotesize} \begin{figure} \begin{center} <>= .iwidth <- 6 .iheight <- 4 <> print(spplot(x, format = "%H:%M:%S", as.table=TRUE)) <> <> @ \end{center} \caption{ \code{spplot} for an object of class \code{SpatialTimeGridDataFrame}, filled with random numbers.} \label{fig:stgdf} \end{figure} Now, the result of \begin{footnotesize} <>= library(lattice) trellis.par.set(canonical.theme(color = FALSE)) spplot(x, format = "%H:%M:%S", as.table=TRUE, cuts=6, col.regions=grey.colors(7, 0.55, 0.95, 2.2)) # RSB quietening greys @ \end{footnotesize} is shown in Figure \ref{fig:stgdf}. The format argument passed controls the way time is printed; one can refer to the help of \begin{footnotesize} <>= ?as.character.POSIXt @ \end{footnotesize} for more details about the \code{format} argument. \section{Analysing spatial Monte Carlo simulations} \label{sec:simquant} Quite often, spatial statistical analysis results in a large number of spatial realisations or a random field, using some Monte Carlo simulation approach. Regardless whether individual values refer to points, lines, polygons or grid cells, we would like to write some methods or functions that aggregate over these simulations, to get summary statistics such as the mean value, quantiles, or cumulative distributions values. Such aggregation can take place in two ways. Either we aggregate over the probability space, and compute summary statistics for each geographical feature over the set of realisations (i.e., the rows of the attribute table), or for each realisation we aggregate over the complete geographical layer or a subset of it (i.e., aggregate over the columns of the attribute table). Let us first generate, as an example, a set of 100 conditional Gaussian simulations for the zinc variable in the meuse data set: \begin{footnotesize} <>= library(gstat) data(meuse) coordinates(meuse) <- ~x+y v <- vgm(.5, "Sph", 800, .05) sim <- krige(log(zinc)~1, meuse, meuse.grid, v, nsim=100, nmax=30) sim@data <- exp(sim@data) @ \end{footnotesize} where the last statement back-transforms the simulations from the log scale to the observation scale. A quantile method for Spatial object attributes can be written as \begin{footnotesize} << >>= quantile.Spatial <- function(x, ..., byLayer = FALSE) { stopifnot("data" %in% slotNames(x)) apply(x@data, ifelse(byLayer, 2, 1), quantile, ...) } @ \end{footnotesize} after which we can find the sample lower and upper 95\% confidence limits by \begin{footnotesize} << >>= sim$lower <- quantile.Spatial(sim[1:100], probs = 0.025) sim$upper <- quantile.Spatial(sim[1:100], probs = 0.975) @ \end{footnotesize} To get the sample distribution of the areal median, we can aggregate over layers: \begin{footnotesize} << >>= medians <- quantile.Spatial(sim[1:100], probs = 0.5, byLayer = TRUE) @ <>= hist(medians) @ \end{footnotesize} It should be noted that in these particular cases, the quantities computed by simulations could have been obtained faster and exact by working analytically with ordinary (block) kriging and the normal distribution (Section 8.7.2 in \cite{bivand}). A statistic that cannot be obtained analytically is the sample distribution of the area fraction that exceeds a threshold. Suppose that 500 is a crucial threshold, and we want to summarise the sampling distribution of the area fraction where 500 is exceeded: \begin{footnotesize} <>= options("width"=50) @ << >>= fractionBelow <- function(x, q, byLayer = FALSE) { stopifnot(is(x, "Spatial") || !("data" %in% slotNames(x))) apply(x@data < q, ifelse(byLayer, 2, 1), function(r) sum(r)/length(r)) # NOT TOO WIDE } @ <>= options("width"=70) @ << >>= over500 <- 1 - fractionBelow(sim[1:100], 200, byLayer = TRUE) summary(over500) quantile(over500, c(0.025, 0.975)) @ \end{footnotesize} For space-time data, we could write methods that aggregate over space, over time or over space and time. \section{Processing massive grids} Up to now we have made the assumption that gridded data can be completely read, and are kept by \RR in memory. In some cases, however, we need to process grids that exceed the memory capacity of the computers available. A method for analysing grids without fully loading them into memory then seems useful. Note that package \pkg{rgdal} allows for partial reading of grids, e.g., \begin{footnotesize} <<>>= fn <- system.file("pictures/erdas_spnad83.tif", package = "rgdal")[1] @ <>= x <- readGDAL(fn, output.dim = c(120, 132)) x$band1[x$band1 <= 0] <- NA spplot(x, col.regions=bpy.colors()) @ \end{footnotesize} reads a downsized grid, where 1\% of the grid cells remained. Another option is reading certain rectangular sections of a grid, starting at some offset. Yet another approach is to use the low-level opening routines and then subset: \begin{footnotesize} << >>= library(rgdal) x <- GDAL.open(fn) class(x) x.subs <- x[1:100, 1:100, 1] class(x.subs) gridparameters(x.subs) @ \end{footnotesize} An object of class \code{GDALReadOnlyDataset} only contains a file handle. The subset method {\small \verb+"["+} for it does not, as it quite often does, return an object of the same class but actually reads the data requested, with arguments interpreted as {\em rows}, {\em columns} and raster {\em bands}, and returns a \code{SpatialGridDataFrame}. We will now extend this approach to allow partial writing through {\small \verb+"["+} as well. As the actual code is rather lengthy and involves a lot of administration, it will not all be shown and details can be found in the \pkg{rgdal} source code. We will define two classes, \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialGDAL", representation("Spatial", grid = "GridTopology", grod = "GDALReadOnlyDataset", # NOT TOO WIDE name = "character")) setClass("SpatialGDALWrite", "SpatialGDAL") @ <>= options("width"=70) @ \end{footnotesize} that derive from \code{Spatial}, contain a \code{GridTopology} and a file handle in the \code{grod} slot. Next, we can define a function \code{open.SpatialGDAL} to open a raster file, returning a \code{SpatialGDAL} object and a function \code{copy.SpatialGDAL} that returns a writable copy of the opened raster. Note that some GDAL drivers only allow copying, some only writing and some both. \begin{footnotesize} <>= x <- open.SpatialGDAL(fn) nrows <- GDALinfo(fn)["rows"] ncols <- GDALinfo(fn)["columns"] xout <- copy.SpatialGDAL(x, "erdas_spnad83_out.tif") bls <- 20 for (i in 1:(nrows/bls - 1)) { r <- 1+(i-1)*bls for (j in 1:(ncols/bls - 1)) { c <- 1+(j-1)*bls x.in <- x[r:(r+bls),c:(c+bls)] xout[r:(r+bls),c:(c+bls)] <- x.in$band1 + 10 #$ } cat(paste("row-block", i, "\n")) } close(x) close(xout) @ \end{footnotesize} This requires the functions {\small \verb+"["+} and {\small \verb+"[<-"+} to be present. They are set by \begin{footnotesize} <>= setMethod("[", "SpatialGDAL", function(x, i, j, ... , drop = FALSE) x@grod[i = i, j = j, ...] ) setReplaceMethod("[", "SpatialGDALWrite", function(x, i, j, ..., value) { ... }) @ \end{footnotesize} where, for the latter, the implementation details are here omitted. It should be noted that single rows or columns cannot be read this way, as they cannot be converted sensibly to a grid. It should be noted that flat binary representations such as the Arc/Info Binary Grid allow much faster random access than ASCII representations or compressed formats such as jpeg varieties. Also, certain drivers in the GDAL library suggest an optimal block size for partial access (e.g., typically a single row), which is not used here\footnote{An attempt to use this block size is, at time of writing, found in the \code{blockApply} code, found in the THK branch of the \pkg{rgdal} project on R-forge.}. This chapter has sketched developments beyond the base \pkg{sp} classes and methods used otherwise in this book. Although we think that the base classes cater for many standard kinds of spatial data analysis, it is clear that specific research problems will call for specific solutions, and that the \RR environment provides the high-level abstractions needed to help busy researchers get their work done. <>= options("width"=owidth) @ \begin{thebibliography}{} \bibitem[Bivand et al., 2008]{bivand} Roger S. Bivand, Edzer J. Pebesma and Virgilio Gomez-Rubio (2008). \newblock {\em Applied spatial data analysis with {\RR}} \newblock Springer, NY \bibitem[Braun and Murdoch, 2007]{braun+murdoch:07} Braun, W.~J. and Murdoch, D.~J. (2007). \newblock {\em A first course in statistical programming with {\RR}}. \newblock Cambridge University Press, Cambridge. \bibitem[Chambers, 1998]{R:Chambers:1998} Chambers, J.M. (1998). \newblock {\em Programming with Data}. \newblock Springer, New York. \bibitem[Kirkwood et al., 2006]{kirkwood06} Kirkwood, R., Lynch, M., Gales, N., Dann, P., and Sumner, M. (2006). \newblock At-sea movements and habitat use of adult male {A}ustralian fur seals ({A}rctocephalus pusillus doriferus). \newblock {\em Canadian Journal of Zoology}, 84:1781--1788. \bibitem[Page et al., 2006]{page06} Page, B., McKenzie, J., Sumner, M., Coyne, M., and Goldsworthy, S. (2006). \newblock Spatial separation of foraging habitats among {N}ew {Z}ealand fur seals. \newblock {\em Marine Ecology Progress Series}, 323:263--279. \bibitem[Venables and Ripley, 2000]{R:Venables+Ripley:2000} Venables, W. N. and Ripley, B. D. (2000). \newblock {\em {\SS} Programming}. \newblock Springer, New York. \end{thebibliography} \end{document} sp/vignettes/intro_sp.Rnw0000644000176200001440000004775512635750062015261 0ustar liggesusers% dimensions(x) returns number of spatial dimensions % y = transform(x, "proj4string") % bbox(x) % coordinates(x) ; <- % rings(x) ; <- % method to retrieve lines? --> Lines()? % gridded(x) ; <- % \documentclass{article} % \VignetteIndexEntry{sp: classes and methods for spatial data} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{color} \usepackage{Sweave} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong \newcommand{\code}[1]{{\tt #1}} \newcommand{\proglang}[1]{{\bf #1}} \title{ Classes and Methods for Spatial Data:\\ the \pkg{sp} Package } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Heisenbergstra{\ss}e 2, 48149 M\"{u}nster, Germany. \code{edzer.pebesma@uni-muenster.de}} \and Roger S.\ Bivand\footnote{Economic Geography Section, Department of Economics, % Norwegian School of Economics and Business Administration, % Breiviksveien 40, N-5045 Bergen, Norway; \code{Roger.Bivand@nhh.no}}} \date{Feb 2005} \begin{document} \maketitle \tableofcontents \section{Introduction} The \pkg{sp} package provides classes and methods for dealing with spatial data in \proglang{R}\footnote{ The motivation to write this package was born on a \href{http://spatial.nhh.no/meetings/vienna/index.html}{pre-conference spatial data workshop} during \href{http://www.ci.tuwien.ac.at/Conferences/DSC-2003/}{DSC 2003}. At that time, the advantage of having multiple R packages for spatial statistics seemed to be hindered by a lack of a uniform interface for handling spatial data. Each package had its own conventions on how spatial data were stored and returned. With this package, and packages supporting the classes provided here, we hope that \proglang{R} with its extension packages becomes more coherent for analyzing different types of spatial data. }. The spatial data structures implemented include points, lines, polygons and grids; each of them with or without attribute data. We have chosen to use S4 classes and methods style (Chambers, 1998) to allow validation of objects created. Although we mainly aim at using spatial data in the geographical (two-dimensional) domain, the data structures that have a straightforward implementation in higher dimensions (points, grids) do allow this. From the package home page on CRAN, \url{https://cran.r-project.org/package=sp}, links to a graph gallery with R code, and the development source tree are found. This vignette describes the classes, methods and functions provided by \pkg{sp}. Instead of manipulating the class slots (components) directly\footnote{which is possible, but not recommended because validity of resulting objects is no longer verified}, we provide methods and functions to create or modify the classes from elementary types such as matrices, {\tt data.frame}s or lists and convert them back to any of these types. Also, coercion (type casting) from one class to the other is provided, where relevant. Package \pkg{sp} is loaded by <<>>= library(sp) @ <>= set.seed(13331) # library(lattice) @ \section{Spatial data classes} The spatial data classes implemented are points, grids, lines, rings and polygons. Package \pkg{sp} provides classes for the spatial-only information (the topology), e.g. \code{SpatialPoints}, and extensions for the case where attribute information stored in a \code{data.frame} is available for each spatial entity (e.g. for points, the \code{SpatialPointsDataFrame}). The available data classes are: \begin{center} \begin{tabular}{lllll} data type & class & attributes & contains \\ \hline points & \code{SpatialPoints} & No &\code{Spatial} \\ points & \code{SpatialPointsDataFrame} & \code{data.frame} &\code{SpatialPoints} \\ multipoints & \code{SpatialMultiPoints} & No &\code{Spatial} \\ multipoints & \code{SpatialMultiPointsDataFrame} & \code{data.frame} &\code{SpatialMultiPoints} \\ pixels & \code{SpatialPixels} & No &\code{SpatialPoints} \\ pixels & \code{SpatialPixelsDataFrame} & \code{data.frame} &\code{SpatialPixels} \\ & & &\code{SpatialPointsDataFrame} \\ full grid & \code{SpatialGrid } & No &\code{SpatialPixels} \\ full grid & \code{SpatialGridDataFrame} & \code{data.frame} &\code{SpatialGrid} \\ line & \code{Line} & No & \\ lines & \code{Lines} & No & \code{Line} list \\ lines & \code{SpatialLines} & No & \code{Spatial}, \code{Lines} list \\ lines & \code{SpatialLinesDataFrame} & \code{data.frame} &\code{SpatialLines} \\ polygons & \code{Polygon} & No &\code{Line} \\ polygons & \code{Polygons} & No &\code{Polygon} list \\ polygons & \code{SpatialPolygons} & No &\code{Spatial}, \code{Polygons} list \\ polygons & \code{SpatialPolygonsDataFrame} & \code{data.frame} &\code{SpatialPolygons} \\ \end{tabular} \end{center} The class \code{Spatial} only holds metadata common to all derived classes (bounding box, coordinate reference system), and is of convenient for defining methods that are common to all derived classes. In the following sections we will show how we can create objects of these classes from scratch or from other objects, and which methods and functions are available to them. \section{Manipulating spatial objects} Although entries in spatial objects are in principle accessible through their slot name, e.g. \code{x@coords} contains the coordinates of an object of class or extending \code{SpatialPoints}, we strongly encourage users to access the data by using functions and methods, in this case {\tt coordinates(x)} to retrieve the coordinates. \subsection{Standard methods} Selecting, retrieving or replacing certain attributes in spatial objects with attributes is done using standard methods \begin{itemize} \item \verb|[| select "rows" (features) and/or columns in the data attribute table; e.g. \code{meuse[1:2, "zinc"]} returns a \code{SpatialPointsDataFrame} with the first two points and an attribute table with only variable "zinc". \item \verb|[[| extracts a column from the data attribute table \item \verb|[[<-| assign or replace a column in the data attribute table. \end{itemize} Other methods available are: \code{plot}, \code{summary}, \code{print}, \code{dim} and \code{names} (operate on the data.frame part), {\tt as.data.frame}, \code{as.matrix} and \code{image} (for gridded data), \code{lines} (for line data), \code{points} (for point data), \code{subset} (points and grids), \code{stack} (point and grid data.frames), \code{over} for spatial joins, \code{spplot}, and \code{length} (number of features). \subsection{Spatial methods} A number of spatial methods are available for the classes in \pkg{sp}: \begin{itemize} \item \code{dimensions(x)} returns number of spatial dimensions \item \code{y = spTransform(x, CRS("+proj=longlat +datum=WGS84"))} convert or transform from one coordinate reference system (geographic projection) to another (requires package rgdal to be installed) \item \code{bbox(x)} returns a matrix with the coordinates bounding box; the dimensions form rows, min/max form the columns \item \code{coordinates(x)} returns a matrix with the spatial coordinates %\item \code{rings(x)} retrieve the spatial rings (polygons) of an %object deriving from \code{SpatialPolygons} % \item \code{method to retrieve lines? --> Lines()? \item \code{gridded(x)} tells whether \code{x} derives from SpatialPixels, or when used in assignment, coerces a \code{SpatialPoints} object into a \code{SpatialPixels} object. \item \code{spplot(x)} plots attributes, possibly in combination with other types of data (points, lines, grids, polygons), and possibly in as a conditioning plot for multiple attributes \item \code{over(x, y)} retrieve index or attributes of \code{y} corresponding (intersecting) with spatial locations of \code{x}. \item \code{spsample(x)} samples point coordinates in the continuous space of \code{SpatialPolygons}, a gridded area, or along a \code{SpatialLines}. Subsetting and \code{sample} can be used to randomly subsample full spatial entities. \item \code{geometry(x)} strips the \code{data.frame}, and returns the geometry-only object \end{itemize} \section{Spatial points} \subsection{Points without attributes} We can generate a set of 10 points on the unit square $[0,1] \times [0,1]$ by <>= xc = round(runif(10), 2) yc = round(runif(10), 2) xy = cbind(xc, yc) xy @ this $10 \times 2$ matrix can be converted into a \code{SpatialPoints} object by <>= xy.sp = SpatialPoints(xy) xy.sp plot(xy.sp, pch = 2) @ The plot is shown in figure \ref{fig:points}. \begin{figure} \begin{center} <>= plot(xy.sp, pch = 2) @ \end{center} \caption{plot of \code{SpatialPoints} object; aspect ratio of x and y axis units is 1} \label{fig:points} \end{figure} We can retrieve the coordinates from \code{xy.sp} by <>= xy.cc = coordinates(xy.sp) class(xy.cc) dim(xy.cc) @ and other methods retrieve the bounding box, the dimensions, select points (not dimensions or columns), coerce to a data.frame, or print a summary: <>= bbox(xy.sp) dimensions(xy.sp) xy.sp[1:2] xy.df = as.data.frame(xy.sp) class(xy.df) dim(xy.df) summary(xy.sp) @ \subsection{Points with attributes} One way of creating a \code{SpatialPointsDataFrame} object is by building it from a a \code{SpatialPoints} object and a data.frame containing the attributes: <>= df = data.frame(z1 = round(5 + rnorm(10), 2), z2 = 20:29) df xy.spdf = SpatialPointsDataFrame(xy.sp, df) xy.spdf summary(xy.spdf) dimensions(xy.spdf) xy.spdf[1:2, ] # selects row 1 and 2 xy.spdf[1] # selects attribute column 1, along with the coordinates xy.spdf[1:2, "z2"] # select row 1,2 and attribute "z2" xy.df = as.data.frame(xy.spdf) xy.df[1:2,] xy.cc = coordinates(xy.spdf) class(xy.cc) dim(xy.cc) @ A note on selection with \verb|[|: the behaviour is as much as possible copied from that of \code{data.frame}s, but coordinates are always sticky and a \code{SpatialPointsDataFrame} is always returned; {\tt drop=FALSE} is not allowed. If coordinates should be dropped, use the \code{as.data.frame} method and select the non-coordinate data, or use \verb|[[| to select a single attribute column (example below). \code{SpatialPointsDataFrame} objects can be created directly from data.frames by specifying which columns contain the coordinates: <>= df1 = data.frame(xy, df) coordinates(df1) = c("xc", "yc") df1 @ or <>= df2 = data.frame(xy, df) coordinates(df2) = ~xc+yc df2[1:2,] as.data.frame(df2)[1:2,] @ Note that in this form, \code{coordinates} by setting (specifying) the coordinates promotes its argument, an object of class \code{data.frame} to an object of class \code{SpatialPointsDataFrame}. The method {\tt as.data.frame} coerces back to the original \code{data.frame}. When used on a right-hand side of an equation, \code{coordinates} {\em retrieves} the matrix with coordinates: <<>>= coordinates(df2)[1:2,] @ Elements (columns) in the data.frame part of an object can be manipulated (retrieved, assigned) directly: <<>>= df2[["z2"]] df2[["z2"]][10] = 20 df2[["z3"]] = 1:10 summary(df2) @ Plotting attribute data can be done by using either \code{spplot} to colour symbols, or \code{bubble} which uses symbol size: <>= bubble(df2, "z1", key.space = "bottom") spplot(df2, "z1", key.space = "bottom") @ the resulting plots are shown in figure \ref{fig:spdf}. \begin{figure} \begin{center} <>= print(bubble(df2, "z1", key.space = "bottom"), split = c(1,1,2,1), more=TRUE) print(spplot(df2, "z1", key.space = "bottom"), split = c(2,1,2,1), more=FALSE) @ \end{center} \caption{plot of \code{SpatialPointsDataFrame} object, using symbol size (\code{bubble}, top) or colour (\code{spplot}, bottom) } \label{fig:spdf} \end{figure} \section{Grids} Package \pkg{sp} has two classes for grid topology: \code{SpatialPixels} and \code{SpatialGrid}. The pixels form stores coordinates and is for partial grids, or unordered points; the \code{SpatialGrid} form does not store coordinates but holds full grids (i.e., \code{SpatialGridDataFrame} holds attribute values for each grid cell). Objects can be coerced from one representation to the other. \subsection{Creating grids from topology} When we know the offset, the cell sizes and the dimensions of a grid, we can specify this by using the function \code{GridTopology}: <<>>= gt = GridTopology(cellcentre.offset = c(1,1,2), cellsize=c(1,1,1), cells.dim = c(3,4,6)) grd = SpatialGrid(gt) summary(grd) @ The grid parameters can be retrieved by the function <<>>= gridparameters(grd) @ \subsection{Creating grids from points} In the following example a three-dimensional grid is constructed from a set of point coordinates: <<>>= pts = expand.grid(x = 1:3, y = 1:4, z=2:7) grd.pts = SpatialPixels(SpatialPoints(pts)) summary(grd.pts) grd = as(grd.pts, "SpatialGrid") summary(grd) @ Note that when passed a points argument, SpatialPixels accepts a tolerance (default 10 * .Machine\$double.eps) to specify how close the points have to be to being exactly on a grid. For very large coordinates, this value may have to be increased. A warning is issued if full rows and/or columns are missing. \subsection{Gridded data with attributes} Spatial, gridded data are data with coordinates on a regular lattice. To form such a grid we can go from coordinates: <<>>= attr = expand.grid(xc = 1:3, yc = 1:3) grd.attr = data.frame(attr, z1 = 1:9, z2 = 9:1) coordinates(grd.attr) = ~xc+yc gridded(grd.attr) gridded(grd.attr) = TRUE gridded(grd.attr) summary(grd.attr) @ Package \pkg{raster} provides dedicated methods to deal with raster data, and can deal with grids that are too large to be stored in memory. \subsection{Are grids stored as points or as matrix/array?} The form in which gridded data comes depends on whether the grid was created from a set of points or from a matrix or external grid format (e.g. read through rgdal). Retrieving the form, or conversion to another can be done by \code{as(x, "class")}, or by using the function \code{fullgrid}: <<>>= fullgrid(grd) fullgrid(grd.pts) fullgrid(grd.attr) fullgrid(grd.pts) = TRUE fullgrid(grd.attr) = TRUE fullgrid(grd.pts) fullgrid(grd.attr) @ The advantage of having grids in cell form is that when a large part of the grid contains missing values, these cells are not stored. In addition, no ordering of grid cells is required. For plotting by a grid with \code{levelplot}, this form is required and \code{spplot} (for grids a front-end to \code{levelplot}) will convert grids that are not in this form. In contrast, \code{image} requires a slightly altered version of the the full grid form. A disadvantage of the cell form is that the coordinates for each point have to be stored, which may be prohibitive for large grids. Grids in cell form do have an index to allow for fast transformation to the full grid form. Besides \code{print}, \code{summary}, \code{plot}, objects of class \code{SpatialGridDataFrame} have methods for \begin{itemize} \item \verb|[| select rows (points) and/or columns (variables) \item \verb|[[| extract a column from the attribute table \item \verb|[[<-| assign or replace a column in the attribute table \item \code{coordinates} retrieve the coordinates of grid cells \item \code{as.matrix}, \code{as.array} retrieve the data as a matrix or array. The first index (rows) is the x-column, the second index (columns) the y-coordinate, different attributes the third index. Row index 1 is the smallest x-coordinate; column index 1 is the larges y-coordinate (top-to-bottom). \item \code{as} coercion methods for \code{data.frame}, \code{SpatialPointsDataFrame} \item\code{image} plot an image of the grid \end{itemize} Finally, \code{spplot}, a front-end to \code{levelplot} allows the plotting of a single grid plot or a lattice of grid plots. \subsection{Row and column selection of a region} Rows/columns selection can be done when gridded data is in the full grid form (as \code{SpatialGridDataFrame}). In this form also rows and/or columns can be de-selected (in which case a warning is issued): <<>>= fullgrid(grd.attr) = FALSE grd.attr[1:5, "z1"] fullgrid(grd.attr) = TRUE grd.attr[1:2,-2, c("z2","z1")] @ \section{Lines} \subsection{Building line objects from scratch} In many instances, line coordinates will be retrieved from external sources. The following example shows how to build an object of class \code{SpatialLines} from scratch. Note that the \code{Lines} objects have to be given character ID values, and that these values must be unique for \code{Lines} objects combined in a \code{SpatialLines} object. % build line objects <>= l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") Sl = SpatialLines(list(S1,S2)) summary(Sl) plot(Sl, col = c("red", "blue")) @ \subsection{Building line objects with attributes} The class \code{SpatialLinesDataFrame} is designed for holding lines data that have an attribute table (data.frame) attached to it: <<>>= df = data.frame(z = c(1,2), row.names=sapply(slot(Sl, "lines"), function(x) slot(x, "ID"))) Sldf = SpatialLinesDataFrame(Sl, data = df) summary(Sldf) @ Not many useful methods for it are available yet. The \code{plot} method only plots the lines, ignoring attribute table values. Suggestions for useful methods are welcome. \section{Polygons} \subsection{Building from scratch} The following example shows how a set of polygons are built from scratch. Note that \code{Sr4} has the opposite direction (anti-clockwise) as the other three (clockwise); it is meant to represent a hole in the \code{Sr3} polygon. The default value for the hole colour \code{pbg} is \code{"transparent}, which will not show, but which often does not matter, because another polygon fills the hole --- here it is set to \code{"white"}. Note that the \code{Polygons} objects have to be given character ID values, and that these values must be unique for \code{Polygons} objects combined in a \code{SpatialPolygons} object. <>= Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) plot(SpP, col = 1:3, pbg="white") # plot(SpP) @ \subsection{Polygons with attributes} Polygons with attributes, objects of class \code{SpatialPolygonsDataFrame}, are built from the \code{SpatialPolygons} object (topology) and the attributes (data.frame). The \code{row.names} of the attributes data frame are matched with the ID slots of the \code{SpatialPolygons} object, and the rows of the data frame will be re-ordered if necessary. <<>>= attr = data.frame(a=1:3, b=3:1, row.names=c("s3/4", "s2", "s1")) SrDf = SpatialPolygonsDataFrame(SpP, attr) as(SrDf, "data.frame") spplot(SrDf) @ <>= print(spplot(SrDf)) @ or, as another way to create the \code{SpatialPolygonsDataFrame} object: <<>>= SrDf = attr polygons(SrDf) = SpP @ \section{Importing and exporting data} Data import and export from external data sources and file formats is handled inthe \pkg{rgdal} package in the first instance, using the available OGR/GDAL drivers for vector and raster data. This keeps the range of drivers up to date, and secures code maintenance through working closely with the open source geospatial community. Mac OSX users unable or unwilling to install \pkg{rgdal} from source after installing its external dependencies will find some functions in the \pkg{maptools} package to import and export a limited range of formats. \section*{References} \begin{description} \item Chambers, J.M., 1998, Programming with data, a guide to the S language. Springer, New York. \end{description} \end{document} % vim:syntax=tex sp/MD50000644000176200001440000002544513125141530011211 0ustar liggesusers39fd25aee9a1741809000d836a39f571 *DESCRIPTION aedc22cbc99fb22f0c1e8e482e998d7c *NAMESPACE fce2762141312bab8313ec0d75e23c06 *R/AAA.R f4c2e52c83ef80425d1467a804b4b9ba *R/CRS-methods.R d456e8600c65ddd51043a01d79f20c18 *R/Class-CRS.R 4723a758016e8acadff5ad41118e9988 *R/Class-GridTopology.R 81ba62d3b4edd0c603e49cbe390ca0eb *R/Class-Spatial.R b09e740ee1c0204ddb85518f067b8bd6 *R/Class-SpatialGrid.R d2a586c18c73f2caea7040d119e3e80a *R/Class-SpatialGridDataFrame.R 14a8b0e0e5796cf9fef99b3b0228788c *R/Class-SpatialLines.R a30d04951b13e30a2e9266cface5bf5d *R/Class-SpatialLinesDataFrame.R e177577f87e0869585dfe2bbd0f94fcf *R/Class-SpatialMultiPoints.R c5d462d1726e891c19ec27f537964377 *R/Class-SpatialMultiPointsDataFrame.R b08435fe1c6ce720e8d85c2888db3328 *R/Class-SpatialPoints.R 968ab80fbb9fc804f654e58866e8ad97 *R/Class-SpatialPointsDataFrame.R 747ebdc0fabe2a0a11458182fa286df9 *R/Class-SpatialPolygons.R 253752974ba5f8094ebb1bc32f90cf4e *R/Class-SpatialPolygonsDataFrame.R b9fab3e3b03814dedf900e93f0ae6ca3 *R/GridTopology-methods.R 75dc7e568de7b42f50b544332162f28f *R/Spatial-methods.R adb8ef6e4380f28e7fbb3b32d0614511 *R/SpatialGrid-methods.R 0655f85dad66fca4606f5f681e1d775c *R/SpatialGridDataFrame-methods.R 919f2d97da85df5c3ade4fc36924cbf3 *R/SpatialLines-methods.R 42e40b82be113b95fc75396f7c9955e9 *R/SpatialLinesDataFrame-methods.R b820304f4ee95c02fb09858f11c62ffb *R/SpatialMultiPoints-methods.R 848b0ade662e4299d5f10a5f057a60c3 *R/SpatialMultiPointsDataFrame-methods.R 127dd216495402fb6d6ae79b8683411f *R/SpatialPoints-methods.R 1ad03dc89320c760b5dbd3c6a46856d5 *R/SpatialPointsDataFrame-methods.R 0af94ec34bd5e063722f825284048662 *R/SpatialPolygons-displayMethods.R 0d9a5bd10833af81e4532b1dd6be6f50 *R/SpatialPolygons-internals.R 06d0a0df3bbb47e5d1dfcb7f08f4c1a2 *R/SpatialPolygons-methods.R 8aacb14fe85cb4bfca66f6cd0dc400b2 *R/SpatialPolygonsDataFrame-methods.R 78694b519c982f31c77a9afd1c9f0adf *R/aggregate.R bde15617ef63b08ac721f7f9d869f614 *R/asciigrid.R 409e1e7fbf65fe54299489cbef589015 *R/bpy.colors.R 2939bb2282af1355eed8be930a5caa5e *R/bubble.R 1aa592addc9edd46c912bf5957984c93 *R/chfids.R 65a220347a38a916e839be41c7b11de0 *R/compassRose.R 6d85edd6274f4397292512dc3a713075 *R/disaggregate.R 1eb6be26e5a9de56a67bc8e5c496b9e5 *R/dms.R 80028a8aeb01f6d8e930d5a928f776a9 *R/flipSGDF.R 65578bd14f0d356a7858a4a7f3c5a243 *R/gridded.R 7cf0b72e1b4c162e638794affbf2aa8f *R/gridlines.R 1286ea0635e86b391369c90644e3b2d1 *R/image.R d5ccdeeeabffc927e3120fadac6128bd *R/loadmeuse.R 227082b122be9fea35ecdf94ea6fb01d *R/mapasp.R d96ebb6ecfed6914a635f7e9a48a0984 *R/merge.R 38af165bc24765938eba2d814daef6f8 *R/over.R 6766016266625ca1971291263fec4b22 *R/point.in.polygon.R 64e1031719e9d69ccc42c8530713bfac *R/projected.R 43c8b3be5f21dd1c47017dd22e90f921 *R/rbind.R 13710d3de7043a7efbb5910e5298bd16 *R/recenter.R d87dfe785fe09899b2e69a68da95e786 *R/select.spatial.R bdc72e1a4c8eb064c155aadba5e79cd0 *R/spOptions.R a3562db0502c05e1f2610e572b65e703 *R/sp_spat1.R 16bf1c64b291ae0b99054ab120ba11e5 *R/spdists.R 4b3f218d6b746f3c42e6777b6dccc872 *R/spplot.R 69d98a3571cc3f767a88f60746432e19 *R/spsample.R 24a1fcc357498b36a232d2368a534f17 *R/stack.R bddb25ec8f35a126373d42751aed191b *R/subset.R 1bf89e559504db11dd0379dbc071083f *R/surfaceArea.R 14a49acb33c4c77157bd320c62616c66 *R/zerodist.R a7187a79b2bb09fce1332f77824ef3a7 *build/vignette.rds 72487cc74a945f4fc4b24fffd0131844 *data/Rlogo.rda 02d4e4ae1918accd9cdadeaf1809a0a9 *data/meuse.area.rda 74625a0d7da3999356f25f54a1a0b44e *data/meuse.grid.rda a07f5780a03c0ffa5a5d8728319fb473 *data/meuse.grid_ll.rda 10f130592d778244fe3cb22b1ef0e641 *data/meuse.rda 0cb67fca70ee8760ce5505941c191451 *data/meuse.riv.rda fa1ea79163f35b50b144022aa2e26be5 *demo/00Index f406569203d64d7f88177165b5016967 *demo/depend.R 037cb395027d0d8a2091648a740ae842 *demo/fib.R f514a5ba830b6e4ac9f067092d75df3b *demo/gallery.R 78c491422251cf9e9cfdc7c869509d79 *demo/meuse.R 313d984d974b6a28d6e3e65fc5409f2e *demo/mp.R fb63300f263e9f1da4eac3746951c88c *demo/polar.R cd0b2eacb8bff453398f8cac02f83215 *demo/webmap.R 49bd4ed03833b66480609ecb246032fc *inst/CITATION d19545d6ff515de5e32e412a55ad370e *inst/NEWS.Rd 6ea05e88d7f4afaf0e6da1220c8884fb *inst/doc/csdacm.R 40c9c96c12943eab808dce21393af046 *inst/doc/csdacm.Rnw 3bf7c1f290ce1cbe595d7b700114540d *inst/doc/csdacm.pdf a42170b8c0644c7b73857a291eafb881 *inst/doc/intro_sp.R d55d2b03e6c3b28eafe79bf447970cc6 *inst/doc/intro_sp.Rnw 6e1a483d14389faa1b2ba1927705907f *inst/doc/intro_sp.pdf bd5e93d7e70556d83eaeb0401c97f2d1 *inst/doc/over.R 6457da7ce638431f7839af4375fb8acd *inst/doc/over.Rnw 603bfd53f31f29491fa670f87f6ac5ad *inst/doc/over.pdf 1d14390f7c198db1b4f3fa00ae91cf14 *inst/external/seamap105_mod.csv ef247b6c335e75e48f81da7ef7554fa6 *inst/external/simple.ag 15c2101eb916ea116f400d560f73dd7c *inst/external/test.ag e6dc8d9aaf62afda17d6377a73d17100 *inst/include/sp.h f351c52e6e0d706c360baa6d9f048572 *inst/include/sp_xports.c 947923a9e838d3f872f0456a01f3dbb2 *man/00sp.Rd 175e187b08fec0efaa2a0e97fbd584d9 *man/CRS-class.Rd 5c196729fe648dbf5d5ee3aeeeb2569c *man/DMS-class.Rd 8e3158a6e4810b3c5e9237383d071a7e *man/GridTopology-class.Rd 613de6f8c7e25da7dff1842d5107341e *man/Line-class.Rd 5d809f7ce16e60d28894655dd23c7bf2 *man/Line.Rd 50c887eafc899f7978ef6a07d09c4442 *man/Lines-class.Rd 57d7ea3fda9d6ef1b179c0d6730bdffd *man/Polygon-class.Rd f9397832758ad0bc1417c4f2e8af0e63 *man/Polygons-class.Rd c92dc2e2c0e4a5cde949d34987083d76 *man/Rlogo.Rd 3e39874f667326acd36dd64f4b7d2440 *man/Spatial-class.Rd 83b4e150736961ce00a897871a6850f5 *man/SpatialGrid-class.Rd 4bb278f0abc9f574c8b4afab05cb7837 *man/SpatialGrid.Rd b68c5a987afd7ab17240a2881fc47d68 *man/SpatialGridDataFrame-class.Rd cf0e9d73973efa3269e6a65bada1754a *man/SpatialGridDataFrame.Rd 603f0adef285c10b65a63068bc1299ec *man/SpatialLines-class.Rd 2ca00133c77f7f64b2ae955608d82cf0 *man/SpatialLines.Rd 997529be2c8060e6c0bd146b31999e08 *man/SpatialLinesDataFrame-class.Rd 68e3068be6e5ed3afe2ae63454616761 *man/SpatialMultiPoints-class.Rd 268d8cad2c90ba25f67563d08f7df34e *man/SpatialMultiPoints.Rd dca1ff62b856120f94a5f123788a55a1 *man/SpatialMultiPointsDataFrame-class.Rd 41a107e939fa9e1223f5d04c75de30e0 *man/SpatialPixels-class.Rd 38af16c0472871b9308cdc071a061b2c *man/SpatialPixelsDataFrame-class.Rd 0ff3e97d414f03f1284053ac768e5b32 *man/SpatialPoints-class.Rd 8f90e18198dc0751298379f7f4a6e4c3 *man/SpatialPoints.Rd a751fcaa7e398339498c59d5ad9e8e52 *man/SpatialPointsDataFrame-class.Rd 45a4bfcf7fedfa5243bcffc0cc3ee75e *man/SpatialPolygons-class.Rd 86a6d3989699334fa5cf64cee806bec0 *man/SpatialPolygons.Rd 094f7c5f905f72bd08d9622c170e60b6 *man/SpatialPolygonsDataFrame-class.Rd dd6f9a61ed0c2decfb810d5ac43903dd *man/addattr.Rd e11d3d46f4fdc47aa383276c59e15026 *man/aggregate.Rd e470eb1897c8c85e59617984d147408b *man/as.SpatialPolygons.GridTopology.Rd 66b4322a9ddcf43ccc9b7034d594e55e *man/as.SpatialPolygons.PolygonsList.Rd ec7752d4129e1c0adc387f6eaf6bf23d *man/asciigrid.Rd 245640af308834eb00230929a7e0bf24 *man/bbox.Rd 48c06136fdfdbb0a3d18599d6dce97e2 *man/bpy.colors.Rd 782743963f766d5c322f527fe6bff5db *man/bubble.Rd 8f74058e28aa073681f63952f96a4a32 *man/char2dms.Rd 00ccd189bee51220e3b6deca3cc81da3 *man/compassRose.Rd 26adacbdcdd6dac59e77fc2d12b4135f *man/coordinates-methods.Rd 91828b1582e869eea6dd71273ed67a65 *man/coordinates.Rd 0c29df057e7d5cb8f861379851d39043 *man/coordnames-methods.Rd d0f04d321528f5d429883bc8bda11371 *man/degaxis.Rd 7816213f9c3212422441326b5323a42f *man/dimensions.Rd 1043d6d72ecca44a607c9a5f62126f4f *man/disaggregate.Rd fd50e71d1b89b6697d733ff7ec0160df *man/flip.Rd 3545b530933efa96fa7c39ff4c52571b *man/geometry-methods.Rd 946863d5de28dc1c30dbb60d2e6b65ae *man/gridded-methods.Rd e69b17e91071d5ca729ec06c2226e9f1 *man/gridindex2nb.Rd 303740f4f3a16154c27975e4374e834f *man/gridlines.Rd c1cc9f443a05014cb92705c7b47818d2 *man/image.Rd ed61d11542e27c16a7465fb227e2a435 *man/is.projected.Rd d21143983ecd66ecb4bd0751d99579f5 *man/loadmeuse.Rd 907a8e354d75f5d080476783f9c54166 *man/mapasp.Rd e11ab871998d837c5ecc48c16f837e40 *man/merge.Rd df29ec70802551efa5697dad64f0cce6 *man/meuse.Rd f17ead2fc674b4334dbdfe667d35f247 *man/meuse.grid.Rd 67f42a0f50ed052b8cf481dc7f5c19ed *man/meuse.grid_ll.Rd 9dd51fb645ba381af6f3cf44e8223220 *man/meuse.riv.Rd c821d80c234f2bf40859f184c033594e *man/over.Rd 939d833407430d338b4560a74de9c171 *man/panel.Rd 711ce4aa4329db10a14e35b417483bbc *man/point.in.polygon.Rd 28647044030f08a19d5d40982f1cb797 *man/polygons-methods.Rd ba9488d7aef328e7c40d1ca0f9168f0c *man/polygons.Rd 6719f1cd4af1b8bc79c86983b7c14a05 *man/recenter-methods.Rd fb2d7d3cc0396cb00f9032516394da91 *man/select.spatial.Rd 6ad78b876190e698ef7f33226d021b46 *man/sp-deprecated.Rd 586721930ea6d6ac5743f9774a5cd81e *man/spChFIDs-methods.Rd 7d5e4ae4b1f21f9e2e32f6346b71a79e *man/spDistsN1.Rd ebae2801ac24d2162ed6d78b0b2f3c4e *man/spTransform.Rd 1660ee48f428b238efc50e1eb00af533 *man/spplot.Rd 0e754f4f254890f8bf884c3681a0086e *man/spsample.Rd b0a89e8c8f714d9c3be05773e23f4f5d *man/stack.Rd 2d10c7a98bbe0333f1f97e671a67d9ec *man/surfaceArea.Rd 43149291777e745770d530bbab97e992 *man/zerodist.Rd b1efa15042518ac8f870d15e2fe27d06 *src/Rcentroid.c 0c91f14e74f32fbad23af71c2c75d28a *src/gcdist.c 45c922d69dabf0504570ef94da147bd4 *src/init.c 36d13e215d58fffb9561bc3dd1e455ea *src/pip.c a7dbe4fe00de2649196847caf161f795 *src/pip2.c e6dc8d9aaf62afda17d6377a73d17100 *src/sp.h f351c52e6e0d706c360baa6d9f048572 *src/sp_xports.c 69af476fca6ecdc9d23bd31caa086283 *src/surfaceArea.c 8f31429f883966a9061bfe95d943edd5 *src/zerodist.c 036b835d76faf02e1f53048d2c4b4adf *tests/agg.R b55edd1613b373a5630b82d3c243d9ba *tests/agg.Rout.save fa6535954c1aae80289ee005a440e287 *tests/base.R bf835dfd1a5a53cf6626781bdecbc957 *tests/base.Rout.save 20d39ffd6462f0fedc6645de22a4fb62 *tests/fail1.R fbb1efaa4fc1d6714f7b00ee7d7137fe *tests/fail1.Rout.save e5f924e7615edeb9cb94f62b24de91f5 *tests/grid.R f5d03d21e7afac59633bb1f82311209f *tests/grid.Rout.save 97a7f7a2a1d07127aed02ee95435ff62 *tests/mp.Rout.save 1e0ef03882f25e548a00a02d2f515ce3 *tests/nc.Rout.save 660cb2708c370a8f40c70e1d2d9ffed8 *tests/over.Rout.save a1b47eec3c258fb259fa66f5368aeb71 *tests/over2.R 2b67694cb7cd86bf403ae7d210d64c96 *tests/over2.Rout.save 82fcaacdbfe8f9846eeccc663e6ab8ae *tests/pass1.R 7a658a2a5f837c0961d275d2e23078b6 *tests/pass1.Rout.save f7754a48738a34642132763a216d00b0 *tests/point.in.polygon.R a515e869a5324a8790ea0d5ff6a41b2b *tests/point.in.polygon.Rout.save c5b0bdc5dbc743b4b7f5fddc1af1e72b *tests/sel.R c8bf0d1d7856ed1c13bde6cb955ef8cf *tests/sel.Rout.save 2c7dc2ace08e457f31d93d94def62b74 *tests/sp1.R 275aa91e91b4e5eb49eb252b52156d4e *tests/sp1.Rout.save 928e025b83c00e48b2487482cae86a3f *tests/spDists.R b34be8182d809cfded157e46bfa04677 *tests/spDists.Rout.save 36b73fa6efec515710fc661a71bbafa5 *tests/spplot.R cabc5905d2e78d5848a2df9ff7b59295 *tests/spplot.Rout.save b8c37af31f973f318932063774a3fb8e *tests/zerodist.R 69df785bd3fd2a25c7347291a410a991 *tests/zerodist.Rout.save 40c9c96c12943eab808dce21393af046 *vignettes/csdacm.Rnw d55d2b03e6c3b28eafe79bf447970cc6 *vignettes/intro_sp.Rnw 6457da7ce638431f7839af4375fb8acd *vignettes/over.Rnw sp/build/0000755000176200001440000000000013124453245011776 5ustar liggesuserssp/build/vignette.rds0000644000176200001440000000043713124453245014341 0ustar liggesusersR=O0u$,P~+Uؐ;Rb[>Cԍ?-"=߻/ ,IMMh2.< )YYTYՕ̙Tg0߸\ ;$HP0IRUP8{ ͱkZk;/}߲ϚƊc_i<"f;,"0ٴ֣nғ#?"d=Q.@[ي($mpӍ0B7߉]-y}0 ?;'t¿IY[#}}^sp/DESCRIPTION0000644000176200001440000000543413125141530012403 0ustar liggesusersPackage: sp Version: 1.2-5 Title: Classes and Methods for Spatial Data Authors@R: c(person("Edzer", "Pebesma", role = c("aut", "cre"), email = "edzer.pebesma@uni-muenster.de"), person("Roger", "Bivand", role = "aut", email = "Roger.Bivand@nhh.no"), person("Barry", "Rowlingson", role = "ctb"), person("Virgilio", "Gomez-Rubio", role = "ctb"), person("Robert", "Hijmans", role = "ctb"), person("Michael", "Sumner", role = "ctb"), person("Don", "MacQueen", role = "ctb"), person("Jim", "Lemon", role = "ctb"), person("Josh", "O'Brien", role = "ctb")) Depends: R (>= 3.0.0), methods Imports: utils, stats, graphics, grDevices, lattice, grid Suggests: RColorBrewer, rgdal (>= 0.8-7), rgeos (>= 0.3-13), gstat, maptools, deldir Description: Classes and methods for spatial data; the classes document where the spatial location information resides, for 2D or 3D data. Utility functions are provided, e.g. for plotting data as maps, spatial selection, as well as methods for retrieving coordinates, for subsetting, print, summary, etc. License: GPL (>= 2) URL: https://github.com/edzer/sp/ https://edzer.github.io/sp/ BugReports: https://github.com/edzer/sp/issues Collate: bpy.colors.R AAA.R Class-CRS.R CRS-methods.R Class-Spatial.R Spatial-methods.R projected.R Class-SpatialPoints.R SpatialPoints-methods.R Class-SpatialPointsDataFrame.R SpatialPointsDataFrame-methods.R Class-SpatialMultiPoints.R SpatialMultiPoints-methods.R Class-SpatialMultiPointsDataFrame.R SpatialMultiPointsDataFrame-methods.R Class-GridTopology.R Class-SpatialGrid.R Class-SpatialGridDataFrame.R Class-SpatialLines.R SpatialLines-methods.R Class-SpatialLinesDataFrame.R SpatialLinesDataFrame-methods.R Class-SpatialPolygons.R Class-SpatialPolygonsDataFrame.R SpatialPolygons-methods.R SpatialPolygonsDataFrame-methods.R GridTopology-methods.R SpatialGrid-methods.R SpatialGridDataFrame-methods.R SpatialPolygons-internals.R point.in.polygon.R SpatialPolygons-displayMethods.R zerodist.R image.R stack.R bubble.R mapasp.R select.spatial.R gridded.R asciigrid.R spplot.R over.R spsample.R recenter.R dms.R gridlines.R spdists.R rbind.R flipSGDF.R chfids.R loadmeuse.R compassRose.R surfaceArea.R spOptions.R subset.R disaggregate.R sp_spat1.R merge.R aggregate.R NeedsCompilation: yes Packaged: 2017-06-27 12:59:17 UTC; edzer Author: Edzer Pebesma [aut, cre], Roger Bivand [aut], Barry Rowlingson [ctb], Virgilio Gomez-Rubio [ctb], Robert Hijmans [ctb], Michael Sumner [ctb], Don MacQueen [ctb], Jim Lemon [ctb], Josh O'Brien [ctb] Maintainer: Edzer Pebesma Repository: CRAN Date/Publication: 2017-06-29 09:07:36 UTC sp/man/0000755000176200001440000000000013101123657011446 5ustar liggesuserssp/man/SpatialMultiPoints.Rd0000644000176200001440000000546212630666551015564 0ustar liggesusers\name{SpatialMultiPoints} \alias{SpatialMultiPoints} \alias{SpatialMultiPointsDataFrame} \title{ create objects of class SpatialMultiPoints or SpatialMultiPointsDataFrame} \description{ create objects of class \link{SpatialMultiPoints-class} or \link{SpatialMultiPointsDataFrame-class} from coordinates, and from coordinates and \code{data.frame}s} \usage{ SpatialMultiPoints(coords, proj4string=CRS(as.character(NA)), bbox = NULL) SpatialMultiPointsDataFrame(coords, data, proj4string = CRS(as.character(NA)), match.ID, bbox = NULL) } \arguments{ \item{coords}{list with in each element a numeric matrix or data.frame with coordinates (each row representing a point); in case of SpatialMultiPointsDataFrame an object of class \link{SpatialMultiPoints-class} is also allowed} \item{proj4string}{ projection string of class \link{CRS-class}} \item{bbox}{bounding box matrix, usually NULL and constructed from the data, but may be passed through for coercion purposes if clearly needed} \item{data}{ object of class \code{data.frame}; the number of rows in \code{data} should equal the number of points in the \code{coords} object} \item{match.ID}{ logical or character; if missing, and \code{coords} and \code{data} both have row names, and their order does not correspond, matching is done by these row names and a warning is issued; this warning can be suppressed by setting \code{match.ID} to TRUE. If TRUE AND coords has non-automatic rownames (i.e., coerced to a matrix by \code{as.matrix}, \code{dimnames(coords)[[1]]} is not \code{NULL}), AND \code{data} has row.names (i.e. is a data.frame), then the \code{SpatialMultiPointsDataFrame} object is formed by matching the row names of both components, leaving the order of the coordinates in tact. Checks are done to see whether both row names are sufficiently unique, and all data are matched. If FALSE, coordinates and data are simply "glued" together, ignoring row names. If character: indicates the column in \code{data} with coordinates IDs to use for matching records. See examples below. } } \value{ \code{SpatialMultiPoints} returns an object of class \code{SpatialMultiPoints}; \code{SpatialMultiPointsDataFrame} returns an object of class \code{SpatialMultiPointsDataFrame}; } \seealso{ \link{coordinates}, \link{SpatialMultiPoints-class}, \link{SpatialMultiPointsDataFrame-class} } \examples{ cl1 = cbind(rnorm(3, 10), rnorm(3, 10)) cl2 = cbind(rnorm(5, 10), rnorm(5, 0)) cl3 = cbind(rnorm(7, 0), rnorm(7, 10)) mp = SpatialMultiPoints(list(cl1, cl2, cl3)) mpx = rbind(mp, mp) # rbind method plot(mp, col = 2, cex = 1, pch = 1:3) mp mp[1:2] print(mp, asWKT=TRUE, digits=3) mpdf = SpatialMultiPointsDataFrame(list(cl1, cl2, cl3), data.frame(a = 1:3)) mpdf mpdfx = rbind(mpdf, mpdf) # rbind method plot(mpdf, col = mpdf$a, cex = 1:3) as(mpdf, "data.frame") mpdf[1:2,] } \keyword{manip} sp/man/SpatialPixels-class.Rd0000644000176200001440000000435512577541412015642 0ustar liggesusers\name{SpatialPixels-class} \docType{class} \alias{SpatialPixels-class} \alias{[,SpatialPixels-method} \alias{coerce,SpatialPixels,SpatialGrid-method} \alias{print.summary.SpatialPixels} \alias{as.data.frame.SpatialPixels} \alias{summary,SpatialPixels-method} \alias{coerce,SpatialPixels,data.frame-method} \alias{show,SpatialPixels-method} \alias{plot,SpatialPixels,missing-method} \alias{rbind.SpatialPixels} \title{Class "SpatialPixels" } \description{ class for defining a pixels, forming a possibly incomplete rectangular grid of arbitrary dimension } \section{Objects from the Class}{ Objects are created by using e.g. SpatialPixels(points) with points of class \link{SpatialPoints-class} } \section{Slots}{ \describe{ \item{\code{grid}}{ object of class \link{GridTopology-class}, defining the grid topology (offset, cellsize, dim) } \item{\code{grid.index}}{integer; index of points in full grid} \item{\code{coords}}{ coordinates of points, or bbox of grid } \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box } \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection } } } \section{Extends}{ Class \code{"SpatialPoints"} directly; Class \code{"Spatial"}, by class \code{"SpatialPoints"}. } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(x = "SpatialPixels")}: calculates coordinates for each point on the grid; coordinates are not stored in objects of class SpatialGrid} \item{summary}{\code{signature(object = "SpatialPixels")}: summarize object} \item{plot}{\code{signature(x = "SpatialPixels")}: plots cell centers } \item{"["}{\code{signature(x = "SpatialPixels")}: select pixel cells; the argument \code{drop=FALSE} (default) does not recalculate grid topology for the selection, if \code{drop=TRUE} the grid topology is recomputed, and might change. } \item{rbind}{\code{signature(x = "SpatialPixels")}: rbind-like method} } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialPixelsDataFrame-class}}, \code{\link{SpatialGrid-class}} } \examples{ data(meuse.grid) pts = meuse.grid[c("x", "y")] y = SpatialPixels(SpatialPoints(pts)) class(y) y summary(y) plot(y) # plots grid plot(y, grid = FALSE) # plots points } \keyword{classes} sp/man/disaggregate.Rd0000644000176200001440000000327013101123657014365 0ustar liggesusers\name{disaggregate-methods} \docType{methods} \alias{disaggregate} \alias{disaggregate-methods} \alias{disaggregate,SpatialPolygons-method} \alias{disaggregate,SpatialPolygonsDataFrame-method} \alias{disaggregate,SpatialLines-method} \alias{disaggregate,SpatialLinesDataFrame-method} \title{ disaggregate SpatialLines, SpatialLinesDataFrame, SpatialPolygons, or SpatialPolygonsDataFrame objects } \description{ disaggregate SpatialLines, SpatialLinesDataFrame, SpatialPolygons, or SpatialPolygonsDataFrame objects, using functions from rgeos to handle polygon hole nesting } \usage{ disaggregate(x, ...) } \arguments{ \item{x}{object of class \link{SpatialLines} or \link{SpatialPolygons}} \item{...}{ignored} } \value{ object of class \link{SpatialLines} or \link{SpatialPolygons}, where groups of \link{Line} or \link{Polygon} are disaggregated to one \link{Line} per \link{Lines}, or one \link{Polygon} per \link{Polygons}, respectively. } \author{ Robert Hijmans, Edzer Pebesma } \examples{ Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)), hole = FALSE) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)), hole = FALSE) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)), hole = FALSE) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1, Sr2), "s1/2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") sp = SpatialPolygons(list(Srs1,Srs3), 1:2) length(sp) ## [1] 2 length(disaggregate(sp)) ## [1] 3 l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") sl = SpatialLines(list(S1,S2)) length(sl) length(disaggregate(sl)) } \keyword{methods} sp/man/sp-deprecated.Rd0000644000176200001440000000274612610663360014472 0ustar liggesusers\name{sp-deprecated} %\alias{overlay} %\alias{overlay-methods} %\alias{overlay,SpatialPointsDataFrame,SpatialPolygons-method} %\alias{overlay,SpatialPoints,SpatialPolygons-method} %\alias{overlay,SpatialPoints,SpatialPolygonsDataFrame-method} %\alias{overlay,SpatialPolygons,SpatialPoints-method} %\alias{overlay,SpatialGridDataFrame,SpatialPolygons-method} %\alias{overlay,SpatialGrid,SpatialPolygons-method} %\alias{overlay,SpatialGrid,SpatialPolygonsDataFrame-method} %\alias{overlay,SpatialPolygons,SpatialGrid-method} %\alias{overlay,SpatialGridDataFrame,SpatialPoints-method} %\alias{overlay,SpatialGrid,SpatialPoints-method} %\alias{overlay,SpatialPixelsDataFrame,SpatialPoints-method} %\alias{overlay,SpatialPixels,SpatialPoints-method} \alias{getSpPPolygonsIDSlots} \alias{getSpPPolygonsLabptSlots} \alias{getSpPnParts} \alias{getSpPnHoles} \alias{getSpPplotOrderSlot} \alias{getSpPpolygonsSlot} \alias{getPolygonAreaSlot} \alias{getPolygonCoordsSlot} \alias{getPolygonLabptSlot} \alias{getPolygonHoleSlot} \alias{getPolygonsIDSlot} \alias{getPolygonsLabptSlot} \alias{getPolygonsPolygonsSlot} \alias{getPolygonsplotOrderSlot} \alias{getLinesLinesSlot} \alias{getLinesIDSlot} \alias{getSLlinesSlot} \alias{getSLLinesIDSlots} \title{ Deprecated functions in sp } \description{ Deprecated functions is sp: getSpP*, getPolygon*, getLines* getSL* } \note{ For \code{overlay} the new implementation is found in the \link{over} method; this works slightly different and more consistent. } \keyword{manip} sp/man/SpatialGrid-class.Rd0000644000176200001440000000355112577541412015260 0ustar liggesusers\name{SpatialGrid-class} \docType{class} \alias{SpatialGrid-class} \alias{[,SpatialGrid-method} \alias{print.summary.SpatialGrid} \alias{as.data.frame.SpatialGrid} \alias{summary,SpatialGrid-method} \alias{coerce,SpatialGrid,data.frame-method} \alias{coerce,SpatialGrid,SpatialPixels-method} \alias{coerce,SpatialGrid,SpatialPoints-method} \alias{coerce,SpatialGrid,SpatialPolygons-method} \alias{show,SpatialGrid-method} \alias{plot,SpatialGrid,missing-method} \alias{coordnames,SpatialGrid-method} \title{Class "SpatialGrid" } \description{ class for defining a full, rectangular grid of arbitrary dimension } \section{Objects from the Class}{ Objects are created by using e.g. SpatialGrid(grid) with grid of class \link{GridTopology-class} } \section{Slots}{ \describe{ \item{\code{grid}}{ object of class \link{GridTopology-class}, defining the grid topology (offset, cellsize, dim) } \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box } \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection } } } \section{Extends}{ Class \code{"SpatialPoints"} directly; Class \code{"Spatial"}, by class \code{"SpatialPoints"}. } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(x = "SpatialGrid")}: calculates coordinates for each point on the grid; coordinates are not stored in objects of class SpatialGrid} \item{summary}{\code{signature(object = "SpatialGrid")}: summarize object} \item{plot}{\code{signature(x = "SpatialGrid")}: plots cell centers } \item{"["}{\code{signature(x = "SpatialGrid")}: select rows and columns } } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialGridDataFrame-class}}, \code{\link{SpatialGrid}} } \examples{ x = GridTopology(c(0,0), c(1,1), c(5,5)) class(x) x summary(x) coordinates(x) y = SpatialGrid(grid = x) class(y) y } \keyword{classes} sp/man/bubble.Rd0000644000176200001440000000546312577541412013211 0ustar liggesusers\name{bubble} \alias{bubble} \title{ Create a bubble plot of spatial data } \description{ Create a bubble plot of spatial data, with options for bicolour residual plots (xyplot wrapper) } \usage{ bubble(obj, zcol = 1, ..., fill = TRUE, maxsize = 3, do.sqrt = TRUE, pch, col = c("#d01c8b", "#4dac26"), key.entries = quantile(data[,zcol]), main, identify = FALSE, labels = row.names(data.frame(obj)), key.space = "right", scales = list(draw = FALSE), xlab = NULL, ylab = NULL, panel = panel.bubble, sp.layout = NULL, xlim = bbexpand(bbox(obj)[1,], 0.04), ylim = bbexpand(bbox(obj)[2,], 0.04)) } \arguments{ \item{obj}{ object of, or extending, class SpatialPointsDataFrame or SpatialGridDataFrame, see \link{coordinates} or \link{SpatialPointsDataFrame}; the object knows about its spatial coordinates} \item{zcol}{ z-variable column name, or column number after removing spatial coordinates from x@data: 1 refers to the first non-coordinate column } \item{fill}{ logical; if TRUE, filled circles are plotted (pch = 16), else open circles (pch = 1); the pch argument overrides this } \item{maxsize}{ \code{cex} value for largest circle } \item{do.sqrt}{ logical; if TRUE the plotting symbol area (sqrt(diameter)) is proportional to the value of the z-variable; if FALSE, the symbol size (diameter) is proportional to the z-variable } \item{pch}{ plotting character } \item{col}{ colours to be used; numeric vector of size two: first value is for negative values, second for positive values. Default colors: 5-class PiYG from colorbrewer.org. } \item{key.entries}{ the values that will be plotted in the key; by default the five quantiles min, q.25, median q.75, max } \item{main}{ main plotting title } \item{identify}{ logical; if true, regular \code{plot} is called instead of \code{xyplot}, and followed by a call to \code{identify()}. } \item{labels}{ labels argument passed to \code{plot} if \code{identify} is TRUE } \item{...}{ arguments, passed to \code{xyplot}, or \code{plot} if identification is required. } \item{key.space}{location of the key} \item{scales}{scales argument as passed to \link{xyplot}} \item{xlab}{x-axis label} \item{ylab}{y-axis label} \item{panel}{panel function used} \item{sp.layout}{possible layout items; see \link{spplot}} \item{xlim}{x axis limit} \item{ylim}{y axis limit} } \value{ returns (or plots) the bubble plot; if \code{identify} is TRUE, returns the indexes (row numbers) of identified points. } %\references{ } \author{ Edzer Pebesma } \seealso{\link{xyplot}, \link{mapasp}, \link{identify}} \examples{ data(meuse) coordinates(meuse) <- c("x", "y") # promote to SpatialPointsDataFrame bubble(meuse, "cadmium", maxsize = 2.5, main = "cadmium concentrations (ppm)", key.entries = 2^(-1:4)) bubble(meuse, "zinc", main = "zinc concentrations (ppm)", key.entries = 100 * 2^(0:4)) } \keyword{dplot} sp/man/SpatialGridDataFrame.Rd0000644000176200001440000000351412577541412015721 0ustar liggesusers\name{SpatialPixelsDataFrame} \alias{SpatialPixelsDataFrame} \alias{SpatialGridDataFrame} \title{ define spatial grid with attribute data } \description{ defines spatial grid by offset, cell size and dimensions } \usage{ SpatialPixelsDataFrame(points, data, tolerance = sqrt(.Machine$double.eps), proj4string = CRS(as.character(NA)), round = NULL, grid = NULL) SpatialGridDataFrame(grid, data, proj4string = CRS(as.character(NA))) } \arguments{ \item{points}{ coordinates, either as numeric matrix or as object of class \link{SpatialPoints-class} } \item{grid}{ grid topology; object of class \link{GridTopology-class}; for calls to \code{SpatialPixelsDataFrame} a value of NULL implies that this will be derived from the point coordinates } \item{data}{ data.frame; contains the attribute (actual grid) data } \item{tolerance}{ precision up to which extent points should be exactly on a grid } \item{round}{default NULL, otherwise a value passed to as the digits argument to \code{round} for setting cell size} \item{proj4string}{object of class \link{CRS-class} in the first form only used when \code{points} does not inherit from \link{Spatial-class}} } \value{ SpatialPixelsDataFrame returns an object of class \link{SpatialPixelsDataFrame-class}; SpatialGridDataFrame returns an object of class \link{SpatialGridDataFrame-class}. } \note{ SpatialPixels stores grid topology and coordinates of the actual points, which may be in the form of a subset (set of pixels) of a full grid. To find out or change this, see \link{fullgrid} and \link{SpatialGrid-class}. } \author{ Edzer Pebesma } \seealso{ \link{gridded}, \link{gridded<-}, \link{SpatialGrid}, \link{SpatialGrid-class} } \examples{ data(meuse.grid) m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data = meuse.grid) class(m) summary(m) } \keyword{spatial} sp/man/compassRose.Rd0000644000176200001440000000132512577541412014245 0ustar liggesusers\name{compassRose} \alias{compassRose} \title{Display a compass rose.} \description{Displays a basic compass rose, usually to orient a map.} \usage{ compassRose(x,y,rot=0,cex=1) } \arguments{ \item{x,y}{The position of the center of the compass rose in user units.} \item{rot}{Rotation for the compass rose in degrees. See Details.} \item{cex}{The character expansion to use in the display.} } \details{ \samp{compassRose} displays a conventional compass rose at the position requested. The size of the compass rose is determined by the character expansion, as the central "rose" is calculated relative to the character size. Rotation is in degrees counterclockwise. } \value{nil} \author{Jim Lemon} \keyword{misc} sp/man/select.spatial.Rd0000644000176200001440000000237112577541412014664 0ustar liggesusers\name{select.spatial} \alias{select.spatial} \title{ select points spatially } \description{ select a number of points by digitizing the area they fall in } \usage{ select.spatial(data, digitize = TRUE, pch = "+", rownames = FALSE) } \arguments{ \item{data}{data object of class, or extending \code{SpatialPoints}; this object knows about its x and y coordinate } \item{digitize}{ logical; if TRUE, points in a digitized polygon are selected; if FALSE, points identified by mouse clicks are selected } \item{pch}{plotting character used for points} \item{rownames}{logical; if FALSE, row (coordinate) numbers are returned; if TRUE and data contains a data.frame part, row.names for selected points in the data.frame are returned. } } \value{ if rownames == FALSE, array with either indexes (row numbers) of points inside the digitized polygon; if rownames == TRUE, character array with corresponding row names in the data.frame part } \seealso{\link{point.in.polygon}, \link{locator}, \link{SpatialPoints-class}, \link{SpatialPointsDataFrame-class} } \examples{ data(meuse) ## the following command requires user interaction: left mouse ## selects points, right mouse ends digitizing data(meuse) coordinates(meuse) = c("x", "y") # select.spatial(meuse) } \keyword{models} sp/man/Polygons-class.Rd0000644000176200001440000000351112577541412014663 0ustar liggesusers\name{Polygons-class} \docType{class} \alias{Polygons-class} \title{Class "Polygons"} \description{ Collection of objects of class \code{"Polygon"} } \section{Objects from the Class}{ Objects can be created by calls to the function \code{Polygons} } \section{Slots}{ \describe{ \item{\code{Polygons}:}{Object of class \code{"list"}; list with objects of class \link{Polygon-class} } \item{\code{plotOrder}:}{Object of class \code{"integer"}; order in which the Polygon objects should be plotted, currently by order of decreasing size } \item{\code{labpt}:}{Object of class \code{"numeric"}; pair of x, y coordinates giving a label point, the label point of the largest polygon component } \item{\code{ID}:}{Object of class \code{"character"}; unique identifier string } \item{\code{area}:}{Object of class \code{"numeric"}; the gross total planar area of the Polygon list but not double-counting holes (changed from 0.9-58 - islands are summed, holes are ignored rather than subtracted); these values are used to make sure that polygons of a smaller area are plotted after polygons of a larger area, does not respect projection as objects of this class have no projection defined } } } \section{Methods}{ No methods defined with class "Polygons" in the signature. } \author{ Roger Bivand } \note{ By default, single polygons (where Polygons is a list of length one) are not expected to be holes, but in multiple polygons, hole definitions for member polygons can be set. Polygon objects belonging to an Polygons object should either not overlap one-other, or should be fully included (as lakes or islands in lakes). They should not be self-intersecting. Checking of hole FALSE/TRUE status for Polygons objects is included in the maptools package using functions in the rgeos package, function checkPolygonsHoles(). } \keyword{classes} sp/man/SpatialPoints.Rd0000644000176200001440000000564412577541412014551 0ustar liggesusers\name{SpatialPoints} \alias{SpatialPoints} \alias{SpatialPointsDataFrame} \title{ create objects of class SpatialPoints or SpatialPointsDataFrame} \description{ create objects of class \link{SpatialPoints-class} or \link{SpatialPointsDataFrame-class} from coordinates, and from coordinates and \code{data.frame}s} \usage{ SpatialPoints(coords, proj4string=CRS(as.character(NA)), bbox = NULL) SpatialPointsDataFrame(coords, data, coords.nrs = numeric(0), proj4string = CRS(as.character(NA)), match.ID, bbox = NULL) } \arguments{ \item{coords}{numeric matrix or data.frame with coordinates (each row is a point); in case of SpatialPointsDataFrame an object of class \link{SpatialPoints-class} is also allowed} \item{proj4string}{ projection string of class \link{CRS-class}} \item{bbox}{bounding box matrix, usually NULL and constructed from the data, but may be passed through for coercion purposes if clearly needed} \item{data}{ object of class \code{data.frame}; the number of rows in \code{data} should equal the number of points in the \code{coords} object} \item{coords.nrs}{numeric; if present, records the column positions where in \code{data} the coordinates were taken from (used by \link{coordinates<-})} \item{match.ID}{ logical or character; if missing, and \code{coords} and \code{data} both have row names, and their order does not correspond, matching is done by these row names and a warning is issued; this warning can be suppressed by setting \code{match.ID} to TRUE. If TRUE AND coords has non-automatic rownames (i.e., coerced to a matrix by \code{as.matrix}, \code{dimnames(coords)[[1]]} is not \code{NULL}), AND \code{data} has row.names (i.e. is a data.frame), then the \code{SpatialPointsDataFrame} object is formed by matching the row names of both components, leaving the order of the coordinates in tact. Checks are done to see whether both row names are sufficiently unique, and all data are matched. If FALSE, coordinates and data are simply "glued" together, ignoring row names. If character: indicates the column in \code{data} with coordinates IDs to use for matching records. See examples below. } } \value{ \code{SpatialPoints} returns an object of class \code{SpatialPoints}; \code{SpatialPointsDataFrame} returns an object of class \code{SpatialPointsDataFrame}; } \seealso{ \link{coordinates}, \link{SpatialPoints-class}, \link{SpatialPointsDataFrame-class} } \examples{ set.seed(1331) pts = cbind(1:5, 1:5) dimnames(pts)[[1]] = letters[1:5] df = data.frame(a = 1:5) row.names(df) = letters[5:1] library(sp) options(warn=1) # show warnings where they occur SpatialPointsDataFrame(pts, df) # warn SpatialPointsDataFrame(pts, df, match.ID = TRUE) # don't warn SpatialPointsDataFrame(pts, df, match.ID = FALSE) # don't warn df$m = letters[5:1] SpatialPointsDataFrame(pts, df, match.ID = "m") # don't warn dimnames(pts)[[1]] = letters[5:1] SpatialPointsDataFrame(pts, df) # don't warn: ID matching doesn't reorder } \keyword{manip} sp/man/spsample.Rd0000644000176200001440000001461413026520303013562 0ustar liggesusers\name{spsample} \docType{methods} \alias{spsample-methods} \alias{spsample,Spatial-method} \alias{spsample,Line-method} \alias{spsample,Lines-method} \alias{spsample,SpatialLines-method} \alias{spsample,Polygon-method} \alias{spsample,Polygons-method} \alias{spsample,SpatialGrid-method} \alias{spsample,SpatialPixels-method} \alias{spsample,SpatialPolygons-method} \alias{spsample} \alias{makegrid} \title{ sample point locations in (or on) a spatial object } \description{ sample point locations within a square area, a grid, a polygon, or on a spatial line, using regular or random sampling methods; the methods used assume that the geometry used is not spherical, so objects should be in planar coordinates } \usage{ spsample(x, n, type, ...) makegrid(x, n = 10000, nsig = 2, cellsize, offset = rep(0.5, nrow(bb)), pretty = TRUE) } \arguments{ \item{x}{Spatial object; \code{spsample(x,...)} is a generic method for the existing \code{sample.Xxx} fumctions} \item{...}{ optional arguments, passed to the appropriate \code{sample.Xxx} functions; see NOTES for \code{nclusters} and \code{iter}} \item{n}{ (approximate) sample size } \item{type}{ character; \code{"random"} for completely spatial random; \code{"regular"} for regular (systematically aligned) sampling; \code{"stratified"} for stratified random (one single random location in each "cell"); \code{"nonaligned"} for nonaligned systematic sampling (nx random y coordinates, ny random x coordinates); \code{"hexagonal"} for sampling on a hexagonal lattice; \code{"clustered"} for clustered sampling; \code{"Fibonacci"} for Fibonacci sampling on the sphere (see references).} \item{bb}{ bounding box of the sampled domain; setting this to a smaller value leads to sub-region sampling } \item{offset}{ for square cell-based sampling types (regular, stratified, nonaligned, hexagonal): the offset (position) of the regular grid; the default for \code{spsample} methods is a random location in the unit cell [0,1] x [0,1], leading to a different grid after each call; if this is set to \code{c(0.5,0.5)}, the returned grid is not random (but, in Ripley's wording, "centric systematic"). For line objects, a single offset value is taken, where the value varies within the [0, 1] interval, and 0 is the beginning of each Line object, and 1 its end } \item{cellsize}{ if missing, a cell size is derived from the sample size \code{n}; otherwise, this cell size is used for all sampling methods except \code{"random"} } \item{nsig}{ for "pretty" cell size; \code{spsample} does not result in pretty grids } \item{pretty}{logical; if \code{TRUE}, choose pretty (rounded) coordinates} } \value{ an object of class \link{SpatialPoints-class}. The number of points is only guaranteed to equal \code{n} when sampling is done in a square box, i.e. (\code{sample.Spatial}). Otherwise, the obtained number of points will have expected value \code{n}. When \code{x} is of a class deriving from \link{Spatial-class} for which no \link{spsample-methods} exists, sampling is done in the bounding box of the object, using \code{spsample.Spatial}. An overlay using \link{over} may be necessary to select the features inside the geometry afterwards. Sampling type \code{"nonaligned"} is not implemented for line objects. Some methods may return NULL if no points could be successfully placed. \code{makegrid} makes a regular grid that covers \code{x}; when \code{cellsize} is not given it derives one from the number of grid points requested (approximating the number of cells). It tries to choose pretty cell size and grid coordinates. } \section{Methods}{ \describe{ \item{x = "Spatial"}{ sample in the bbox of \code{x} } \item{x = "Line"}{ sample on a line } \item{x = "Polygon"}{ sample in a Polygon } \item{x = "Polygons"}{ sample in a Polygons object, consisting of possibly multiple Polygon objects (holes must be correctly defined, use \code{checkPolygonsHoles} if need be) } \item{x = "SpatialPolygons"}{ sample in an SpatialPolygons object; sampling takes place over all Polygons objects present, use subsetting to vary sampling intensity (density); holes must be correctly defined, use \code{checkPolygonsHoles} if need be } \item{x = "SpatialGrid"}{ sample in an SpatialGrid object } \item{x = "SpatialPixels"}{ sample in an SpatialPixels object } }} \note{If an \link{Polygon-class} object has zero area (i.e. is a line), samples on this line element are returned. If the area is very close to zero, the algorithm taken here (generating points in a square area, selecting those inside the polygon) may be very resource intensive. When numbers of points per polygon are small and type="random", the number searched for is inflated to ensure hits, and the points returned sampled among these. The following two arguments can be further specified: \code{nclusters} Number of clusters (strata) to sample from. \code{iter}(default = 4) number of times to try to place sample points in a polygon before giving up and returning NULL - this may occur when trying to hit a small and awkwardly shaped polygon in a large bounding box with a small number of points } \references{Chapter 3 in B.D. Ripley, 1981. Spatial Statistics, Wiley Fibonacci sampling: Alvaro Gonzalez, 2010. Measurement of Areas on a Sphere Using Fibonacci and Latitude-Longitude Lattices. Mathematical Geosciences 42(1), p. 49-64 } \author{Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \seealso{\link{over}, \link{point.in.polygon}, \link{sample}} \examples{ data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)), "x"))) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "regular"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "random"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "stratified"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "nonaligned"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr@polygons[[1]], n = 100, "stratified"), pch = 3, cex=.5) data(meuse.grid) gridded(meuse.grid) = ~x+y image(meuse.grid) points(spsample(meuse.grid,n=1000,type="random"), pch=3, cex=.5) image(meuse.grid) points(spsample(meuse.grid,n=1000,type="stratified"), pch=3, cex=.5) image(meuse.grid) points(spsample(meuse.grid,n=1000,type="regular"), pch=3, cex=.5) image(meuse.grid) points(spsample(meuse.grid,n=1000,type="nonaligned"), pch=3, cex=.5) fullgrid(meuse.grid) = TRUE image(meuse.grid) points(spsample(meuse.grid,n=1000,type="stratified"), pch=3,cex=.5) } \keyword{manip} \keyword{methods} sp/man/mapasp.Rd0000644000176200001440000000213712577541412013232 0ustar liggesusers\name{mapasp} \alias{mapasp} \alias{degreeLabelsEW} \alias{degreeLabelsNS} \title{ Calculate aspect ratio for plotting geographic maps; create nice degree axis labels } \description{ Calculate aspect ratio for plotting geographic maps; create nice degree axis labels } \usage{ mapasp(data, xlim, ylim) degreeLabelsEW(x) degreeLabelsNS(x) } \arguments{ \item{data}{ object of class or extending \code{Spatial}} \item{xlim}{ the xlim argument passed (or derived from bounding box) } \item{ylim}{ the ylim argument passed (or derived from bounding box) } \item{x}{ numeric; values at which tics and marks will be generated } } \value{ \code{mapasp} is used for the aspect argument in lattice plots and spplot; let x = dy/dx, with dy and dx the y- and x-size of the map. let s = 1/cos((My * pi)/180) with My the y coordinate of the middle of the map (the mean of ylim) for latlong (longlat) data, \code{mapasp} returns s * x. for other data, mapasp returns "iso". } \note{the values for \code{x} are typically obtained from \link{axTicks}} \seealso{ \link{levelplot} in package \code{lattice}} \keyword{dplot} sp/man/spChFIDs-methods.Rd0000644000176200001440000000307212577541412015014 0ustar liggesusers\name{spChFIDs-methods} \docType{methods} \alias{spChFIDs-methods} \alias{spChFIDs<-} \alias{spChFIDs<-,Spatial-method} \alias{spChFIDs,SpatialLines,character-method} \alias{spChFIDs,SpatialLinesDataFrame,character-method} \alias{spChFIDs,SpatialPolygons,character-method} \alias{spChFIDs,SpatialPolygonsDataFrame,character-method} \title{change feature IDs in spatial objects} \alias{spChFIDs} \description{ When the feature IDs need to be changed in SpatialLines* or SpatialPolygons* objects, these methods may be used. The new IDs should be a character vector of unique IDs of the correct length. } \section{Methods}{ \describe{ \item{obj = "SpatialLines", x = "character"}{replace IDs in a SpatialLines object} \item{obj = "SpatialLinesDataFrame", x = "character"}{replace IDs in a SpatialLinesDataFrame object} \item{obj = "SpatialPolygons", x = "character"}{replace IDs in a SpatialPolygons object} \item{obj = "SpatialPolygonsDataFrame", x = "character"}{replace IDs in a SpatialPolygonsDataFrame object} }} \note{It is usually sensible to keep a copy of the original feature IDs in the object, but this should be done by the user.} \author{Roger Bivand} \seealso{\code{\link[maptools]{spCbind-methods}}, \code{\link[maptools]{spRbind-methods}}} \examples{ \dontrun{ require(maptools) xx <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66")) row.names(as(xx, "data.frame")) xx1 <- spChFIDs(xx, as.character(xx$CNTY_ID)) row.names(as(xx1, "data.frame")) } } \keyword{methods} \keyword{spatial} sp/man/SpatialPolygonsDataFrame-class.Rd0000644000176200001440000000603612615460465017754 0ustar liggesusers\name{SpatialPolygonsDataFrame-class} \docType{class} \alias{SpatialPolygonsDataFrame-class} \alias{[,SpatialPolygonsDataFrame-method} \alias{as.data.frame.SpatialPolygonsDataFrame} \alias{coerce,SpatialPolygonsDataFrame,data.frame-method} \alias{coerce,SpatialPolygonsDataFrame,SpatialLinesDataFrame-method} \alias{coerce,SpatialPolygonsDataFrame,SpatialPolygons-method} \alias{rbind.SpatialPolygonsDataFrame} \alias{dim.SpatialPolygonsDataFrame} \alias{row.names.SpatialPolygonsDataFrame} \title{Class "SpatialPolygonsDataFrame" } \description{ class to hold polygons with attributes } \section{Objects from the Class}{ Objects can be created by calls to the function \link{SpatialPolygonsDataFrame} } \section{Slots}{ \describe{ \item{\code{data}:}{Object of class \code{"data.frame"}; attribute table } \item{\code{polygons}:}{Object of class \code{"list"}; see \link{SpatialPolygons-class} } \item{\code{plotOrder}:}{Object of class \code{"integer"}; see \link{SpatialPolygons-class} } \item{\code{bbox}:}{Object of class \code{"matrix"}; see \link{Spatial-class}} \item{\code{proj4string}:}{Object of class \code{"CRS"}; see \link{CRS-class}} } } \section{Extends}{ Class \code{"SpatialPolygons"}, directly. Class \code{"Spatial"}, by class \code{"SpatialPolygons"}. } \section{Methods}{ Methods defined with class "SpatialPolygonsDataFrame" in the signature: \describe{ \item{[}{\code{signature(x = "SpatialPolygonsDataFrame")}: select subset of (sets of) polygons; NAs are not permitted in the row index} \item{rbind}{\code{signature(object = "SpatialPolygonsDataFrame")}: rbind-like method, see notes below} } } \author{Roger Bivand} \note{\code{SpatialPolygonsDataFrame} with default ID matching checks the data frame row names against the Polygons ID slots. They must then agree with each other, and be unique (no Polygons objects can share IDs); the data frame rows will be re-ordered if needed to match the Polygons IDs.. If you want to \code{rbind} objects with duplicated IDs, see\code{\link{spChFIDs}}.} \seealso{ \link{SpatialPolygons-class} } \examples{ # simple example, from scratch: Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) plot(SpP, col = 1:3, pbg="white") grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as(grd, "SpatialPolygons") centroids <- coordinates(polys) x <- centroids[,1] y <- centroids[,2] z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x ex_1.7 <- SpatialPolygonsDataFrame(polys, data=data.frame(x=x, y=y, z=z, row.names=row.names(polys))) brks <- quantile(z, seq(0,1,1/7)) cols <- grey((length(brks):2)/length(brks)) dens <- (2:length(brks))*3 plot(ex_1.7, col=cols[findInterval(z, brks, all.inside=TRUE)]) plot(ex_1.7, density=dens[findInterval(z, brks, all.inside=TRUE)]) } \keyword{classes} sp/man/SpatialPixelsDataFrame-class.Rd0000644000176200001440000000701312667563176017414 0ustar liggesusers\name{SpatialPixelsDataFrame-class} \docType{class} \alias{SpatialPixelsDataFrame-class} \alias{[,SpatialPixelsDataFrame-method} \alias{show,SpatialPixelsDataFrame-method} % \alias{SpatialPixelsDataFrame} \alias{plot.SpatialPixelsDataFrame} \alias{print.summary.SpatialPixelsDataFrame} \alias{coerce,SpatialPixelsDataFrame,SpatialPointsDataFrame-method} \alias{coerce,SpatialPixelsDataFrame,SpatialGridDataFrame-method} \alias{coerce,SpatialPixelsDataFrame,SpatialPolygonsDataFrame-method} \alias{coerce,SpatialPixelsDataFrame,data.frame-method} \alias{coerce,SpatialPixelsDataFrame,matrix-method} \alias{coerce,SpatialPixelsDataFrame,array-method} \alias{as.data.frame.SpatialPixelsDataFrame} \alias{rbind.SpatialPixelsDataFrame} \alias{dim.SpatialPixelsDataFrame} \alias{plot,SpatialPixelsDataFrame,missing-method} \title{Class "SpatialPixelsDataFrame" } \description{ Class for spatial attributes that have spatial locations on a regular grid. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{as(x, "SpatialPixelsDataFrame")}, where \code{x} is of class \link{SpatialPointsDataFrame-class}, or by importing through rgdal. Ordered full grids are stored instead or unordered non-NA cells; } \section{Slots}{ \describe{ \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box } \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection } \item{\code{coords}:}{see \link{SpatialPoints}; points slot } \item{\code{coords.nrs}}{see \link{SpatialPointsDataFrame}} \item{\code{grid}:}{see \link{GridTopology-class}; grid parameters } \item{\code{grid.index}:}{integer; index of points in the list to points in the full (ordered) grid. x cycles fastest; all coordinates increase from low to hight except y, which decreases from high to low } \item{\code{data}:}{Object of class data.frame, containing the attribute data } } } \section{Extends}{ Class \code{"SpatialPixels"}, directly. Class \code{"Spatial"}, by class \code{"SpatialPixels"}. } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(x = "SpatialPixelsDataFrame")}: retrieves coordinates } \item{[}{\code{signature(x = "SpatialPixelsDataFrame")}: selects row(s) and/or attribute(s), and returns an object of class \code{SpatialPixelsDataFrame}; rows refer here to the pixel numbers, not grid lines. For selecting a square block in a grid, coerce to a \link{SpatialGridDataFrame-class} first, and use \code{[} on that object} \item{as.matrix}{\code{signature(x = "SpatialPixelsDataFrame")}: coerce to matrix } \item{rbind}{\code{signature(x = "SpatialPixelsDataFrame")}: rbind-like method } \item{plot}{\code{signature(x = "SpatialPixelsDataFrame", y = "missing")}: see \link{SpatialGridDataFrame-class} for details} } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialPixels-class}}, which does not contain the attribute data } \examples{ data(meuse.grid) # only the non-missing valued cells coordinates(meuse.grid) = c("x", "y") # promote to SpatialPointsDataFrame gridded(meuse.grid) <- TRUE # promote to SpatialPixelsDataFrame meuse.grid[["idist"]] = 1 - meuse.grid[["dist"]] # assigns new attribute image(meuse.grid["idist"]) # note the single [ # toy example: df = data.frame(z = c(1:6,NA,8,9), xc = c(1,1,1,2,2,2,3,3,3), yc = c(rep(c(0, 1.5, 3),3))) coordinates(df) = ~xc+yc gridded(df) = TRUE image(df["z"]) # draw labels to verify: cc = coordinates(df) z=df[["z"]] zc=as.character(z) zc[is.na(zc)]="NA" text(cc[,1],cc[,2],zc) } \keyword{classes} sp/man/SpatialMultiPoints-class.Rd0000644000176200001440000000706512577541412016666 0ustar liggesusers\name{SpatialMultiPoints-class} \docType{class} \alias{SpatialMultiPoints-class} \alias{[,SpatialMultiPoints-method} \alias{coerce,SpatialMultiPoints,matrix-method} \alias{coerce,SpatialMultiPoints,data.frame-method} \alias{coerce,SpatialMultiPoints,SpatialPoints-method} %\alias{coerce,SpatialPoints,data.frame-method} %\alias{coerce,data.frame,SpatialPoints-method} %\alias{coerce,matrix,SpatialPoints-method} % \alias{coordinates,SpatialPoints-method} \alias{show,SpatialMultiPoints-method} %\alias{SpatialPoints} \alias{as.data.frame.SpatialMultiPoints} \alias{plot,SpatialMultiPoints,missing-method} \alias{summary,SpatialMultiPoints-method} \alias{print.SpatialMultiPoints} \alias{summary.SpatialMultiPoints} \alias{rbind.SpatialMultiPoints} \alias{$,SpatialMultiPoints-method} \alias{$<-,SpatialMultiPoints,character-method} \alias{row.names.SpatialMultiPoints} \title{Class "SpatialMultiPoints" } \description{ Class for (irregularly spaced) MultiPoints } \section{Objects from the Class}{ Objects can be created by calls of the form \code{SpatialPoints(x)}. } \section{Slots}{ \describe{ \item{\code{coords}:}{Object of class \code{"list"}, containing the coordinates of point sets (each list element is a matrix) } \item{\code{bbox}:}{Object of class \code{"matrix"}, with bounding box } \item{\code{proj4string}:}{Object of class \code{"CRS"}, projection string } } } \section{Extends}{ Class \code{"Spatial"}, directly. } \section{Methods}{ \describe{ \item{[}{\code{signature(x = "SpatialMultiPoints")}: subsets point sets} \item{coerce}{\code{signature(from = "SpatialPoints", to = "data.frame")}: coerce to data.frame} \item{coordinates}{\code{signature(obj = "SpatialMultiPoints")}: retrieves all the coordinates, as one single matrix } \item{plot}{\code{signature(x = "SpatialPoints", y = "missing")}: plot points} \item{summary}{\code{signature(object = "SpatialPoints")}: summarize object} \item{points}{\code{signature(x = "SpatialPoints")}: add point symbols to plot} \item{show}{\code{signature(object = "SpatialPoints")}: prints coordinates } \item{rbind}{\code{signature(object = "SpatialPoints")}: rbind-like method } } } \section{plot method arguments}{ The plot method for \dQuote{SpatialPoints} objects takes the following arguments: \describe{ \item{x}{object of class SpatialPoints} \item{pch}{default 3; either an integer specifying a symbol or a single character to be used as the default in plotting points} \item{axes}{default FALSE; a logical value indicating whether both axes should be drawn } \item{add}{default FALSE; add to existing plot} \item{xlim}{default NULL; the x limits (x1, x2) of the plot} \item{ylim}{default NULL; the y limits of the plot} \item{...}{passed through} \item{setParUsrBB}{default FALSE; set the \code{par} \dQuote{usr} bounding box, see note in \link{Spatial-class}} \item{cex}{default 1; numerical value giving the amount by which plotting text and symbols should be magnified relative to the default} \item{col}{default 1; default plotting color} \item{lwd}{default 1; line width} \item{bg}{default 1; colour to be used for the background of the device region} } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialMultiPointsDataFrame-class}} \code{\link{SpatialPoints-class}} } \examples{ cl1 = cbind(rnorm(3, 10), rnorm(3, 10)) cl2 = cbind(rnorm(5, 10), rnorm(5, 0)) cl3 = cbind(rnorm(7, 0), rnorm(7, 10)) mp = SpatialMultiPoints(list(cl1, cl2, cl3)) plot(mp, col = 2, cex = 1, pch = 1:3) mp mp[1:2] print(mp, asWKT=TRUE, digits=3) } \keyword{classes} sp/man/00sp.Rd0000644000176200001440000000773212577541412012541 0ustar liggesusers\name{sp} \alias{sp} \title{A package providing classes and methods for spatial data: points, lines, polygons and grids } \description{ This package provides S4 classes for importing, manipulating and exporting spatial data in R, and for methods including print/show, plot, subset, \code{[}, \code{[[}, \code{\$}, names, dim, summary, and a number of methods specific to spatial data handling. }%description \section{Introduction}{ Several spatial statistical packages have been around for a long while, but no organized set of classes for spatial data has yet been devised. Many of the spatial packages make their own assumptions, or use their own class definitions for spatial data, making it inconvenient to move from one package to another. This package tries to provide a solid set of classes for many different types of spatial data. The idea is that spatial statistical packages will either support these classes (i.e., directly read and write them) or will provide conversion to them, so that we have a base class set with which any package can exchange. This way, many-to-many conversions can be replace with one-to-many conversions, provided either in this package or the spatial packages. Wherever possible conversion (coercion) functions are automatic, or provided by sp. External packages that depend on sp will provide importing and exporting from and to external GIS formats, e.g. through GDAL, OGR or shapelib. In addition, this package tries to provide convenient methods to print, summarize and plot such spatial data. }%section{Introduction} \section{Dimensions}{ In principal, geographical data are two-dimensional, on a flat surface (a map) or on a sphere (the earth). This package provides space for dealing with higher dimensional data where possible; this is e.g. very simple for points and grids, but hard to do for polygons. Plotting functions are devised primarily for two-dimensional data, or two-dimensional projections of higher dimensional data. }%section{Dimensions} \section{Coordinate reference systems}{ Central to spatial data is that they have a coordinate reference system, which is coded in object of CRS class. Central to operations on different spatial data sets is that their coordinate reference system is compatible (i.e., identical). This CRS can be a character string describing a reference system in a way understood by the PROJ.4 projection library, or a (character) missing value. An interface to the PROJ.4 library is available only if the R package rgdal is present. } \section{Class structure}{ All spatial classes derive from a basic class \code{Spatial}, which only provides a bounding box and a CRS. This class has no useful instances, but useful derived classes. SpatialPoints extends Spatial and has coordinates. The method \link{coordinates} extracts the numeric matrix with coordinates from an object of class SpatialPoints, or from other (possibly derived) classes that have points. Objects of class SpatialGrid points on a regular grid. Either a full grid is stored or a partial grid (i.e., only the non-missing valued cells); calling \link{coordinates} on them will give the coordinates for the grid cells. SpatialPoints, SpatialPixels and SpatialGrid can be of arbitray dimension, although most of the effort is in making them work for two dimensional data. SpatialLines provides lines, and SpatialPolygons provides polygons, i.e., lines that end where they start and do not intersect with itself. SpatialLines and SpatialPolygons only have two-dimensional data. SpatialPointsDataFrame extends SpatialPoints with a data slot, having a data.frame with attribute data. Similarly, SpatialPixelsDataFrame, SpatialLinesDataFrame, SpatialPolygonsDataFrame extend the primary spatial information with attribute data. } \section{References}{ PROJ.4: \url{https://github.com/OSGeo/proj.4} GDAL and OGR: \url{http://www.gdal.org/}. } \section{Authors}{ sp is a collaborative effort of Edzer Pebesma, Roger Bivand, Barry Rowlingson and Virgilo G\'omez-Rubio. } \keyword{spatial} sp/man/SpatialPolygons.Rd0000644000176200001440000000770512577541412015107 0ustar liggesusers\name{SpatialPolygons} \alias{SpatialPolygons} \alias{SpatialPolygonsDataFrame} \alias{Polygon} \alias{Polygons} \alias{getSpatialPolygonsLabelPoints} \title{ create objects of class SpatialPolygons or SpatialPolygonsDataFrame} \description{ create objects of class \code{SpatialPolygons} or \code{SpatialPolygonsDataFrame} from lists of \code{Polygons} objects and \code{data.frame}s} \usage{ Polygon(coords, hole=as.logical(NA)) Polygons(srl, ID) SpatialPolygons(Srl, pO, proj4string=CRS(as.character(NA))) SpatialPolygonsDataFrame(Sr, data, match.ID = TRUE) getSpatialPolygonsLabelPoints(SP) } \arguments{ \item{coords}{2-column numeric matrix with coordinates; first point (row) should equal last coordinates (row); if the hole argument is not given, the status of the polygon as a hole or an island will be taken from the ring direction, with clockwise meaning island, and counter-clockwise meaning hole} \item{hole}{logical value for setting polygon as hole or not; if the hole argument is not given, the status of the polygon as a hole or an island will be taken from the ring direction, with clockwise meaning island, and counter-clockwise meaning hole} \item{proj4string}{ projection string of class \link{CRS-class}} \item{srl}{list with \link{Polygon-class} objects} \item{ID}{character vector of length one with identifier} \item{Srl}{ list with objects of class \link{Polygons-class}} \item{pO}{ integer vector; plotting order; if missing in reverse order of Polygons area } \item{Sr}{ object of class \link{SpatialPolygons-class}} \item{data}{ object of class \code{data.frame}; the number of rows in \code{data} should equal the number of \link{Polygons-class} objects in \code{Sr}} \item{match.ID}{logical: (default TRUE): match SpatialPolygons member Polygons ID slot values with data frame row names, and re-order the data frame rows if necessary. If character: indicates the column in \code{data} with Polygons IDs to match} \item{SP}{object of class \link{SpatialPolygons-class}} } \details{ In \code{Polygon}, if the hole argument is not given, the status of the polygon as a hole or an island will be taken from the ring direction, with clockwise meaning island, and counter-clockwise meaning hole. In \code{Polygons}, if all of the member Polygon objects are holes, the largest by area will be converted to island status. Until 2010-04-17, version 0.9-61, the area of this converted object was erroneously left at its hole value of zero. Thanks to Patrick Giraudoux for spotting the bug. The class definitions used for polygons in \pkg{sp} do not accord with those of the simple features specification of the Open Geospatial Consortium. The \pkg{rgeos} package, an interface to Geometry Engine -- Open Source (GEOS), uses this specification, in which each hole (interior ring) must be associated with its containing exterior ring. In order to avoid introducing incompatible changes into the class definition of Polygons objects, a comment has been added as a single character string to each such object. Here we can trust the data source to assign the hole status correctly, and use the simple function \code{\link[rgeos]{createSPComment}} to add such comments to each Polygons member of the polygons slot of this SpatialPolygons object. Exterior rings are coded zero, while interior rings are coded with the 1-based index of the exterior ring to which they belong. SpatialPolygons objects created by reading using \code{\link[rgdal]{readOGR}} from \pkg{rgdal} have the comments set on input, as OGR also uses SFS. } \value{ \code{Polygon} returns an object of class \code{Polygon}; \code{Polygons} returns an object of class \code{Polygons}; \code{SpatialPolygons} returns object of class \code{SpatialPolygons}; \code{SpatialPolygonsDataFrame} returns object of class \code{SpatialPolygonsDataFrame} \code{getSpatialPolygonsLabelPoints} returns an object of class \code{SpatialPoints} with label points. } \seealso{ \link{SpatialPolygons-class}, \link{SpatialPolygonsDataFrame-class} } \keyword{manip} sp/man/surfaceArea.Rd0000644000176200001440000000461612577541412014176 0ustar liggesusers\name{surfaceArea} \alias{surfaceArea} \alias{surfaceArea.matrix} \alias{surfaceArea,SpatialPixelsDataFrame-method} \alias{surfaceArea,SpatialGridDataFrame-method} \alias{surfaceArea,matrix-method} \title{ Compute surface area of a digital elevation model. } \description{ It is often said that if Wales was flattened out it would have an area bigger than England. This function computes the surface area of a grid of heights taking into account the sloping nature of the surface. } \usage{ surfaceArea(m, ...) surfaceArea.matrix(m, cellx = 1, celly = 1, byCell = FALSE) } \arguments{ \item{m}{ a matrix of height values, or an object of class \link{SpatialPixelsDataFrame} or \link{SpatialGridDataFrame}. } \item{cellx}{ the size of the grid cells in the x-direction, in the same units as the height values. } \item{celly}{ the size of the grid cells in the y-direction, in the same units as the height values. } \item{byCell}{ return single value or matrix of values } \item{...}{ignored} } \value{ Either a single value of the total area if byCell=FALSE, or a matrix the same shape as m of individual cell surface areas if byCell=TRUE. In this case, the sum of the returned matrix should be the same value as that which is returned if byCell=FALSE. Missing values (NA) in the input matrix are allowed. They will produce an NA in the output matrix for byCell=TRUE, and contribute zero to the total area. They also have an effect on adjacent cells - see code comments for details. } \section{Methods}{ \describe{ \item{obj = "matrix"}{ takes a matrix as input, requires cellx and celly to be set } \item{obj = "SpatialGridDataFrame"}{ takes an object of class \link{SpatialGridDataFrame} as input, and retrieves cellx and celly from this } \item{obj = "SpatialPixelsDataFrame"}{ takes an object of class \link{SpatialPixelsDataFrame} as input, and retrieves cellx and celly from this } }} \references{ Calculating Landscape Surface Area from Digital Elevation Models, Jeff S. Jenness Wildlife Society Bulletin, Vol. 32, No. 3 (Autumn, 2004), pp. 829-839 } \author{ Barry Rowlingson , integration in sp Edzer Pebesma. } \examples{ surfaceArea(volcano) image(surfaceArea(volcano,byCell=TRUE)) data(meuse.grid) gridded(meuse.grid) = ~x+y image(surfaceArea(meuse.grid["dist"], byCell=TRUE)) surfaceArea(meuse.grid["dist"]) } \keyword{spatial} sp/man/asciigrid.Rd0000644000176200001440000000304312577541412013704 0ustar liggesusers\name{read.asciigrid} \alias{read.asciigrid} \alias{write.asciigrid} \title{ read/write to/from (ESRI) asciigrid format } \description{ read/write to/from ESRI asciigrid format } \usage{ read.asciigrid(fname, as.image = FALSE, plot.image = FALSE, colname = fname, proj4string = CRS(as.character(NA))) write.asciigrid(x, fname, attr = 1, na.value = -9999, ...) } \arguments{ \item{fname}{ file name } \item{as.image}{logical; if FALSE, a list is returned, ready to be shown with the \code{image} command; if FALSE an object of class \link{SpatialGridDataFrame-class} is returned } \item{plot.image}{logical; if TRUE, an image of the map is plotted} \item{colname}{alternative name for data column if not file name} \item{proj4string}{A CRS object setting the projection arguments of the Spatial Grid returned} \item{x}{ object of class \link{SpatialGridDataFrame}} \item{attr}{attribute column; if missing, the first column is taken; a name or a column number may be given} \item{na.value}{numeric; value given to missing valued cells in the resulting map} \item{...}{ arguments passed to \link{write.table}, which is used to write the numeric data } } \value{ \code{read.asciigrid} returns the grid map read; either as an object of class \link{SpatialGridDataFrame-class} or, if as.image is TRUE, as list with components \code{x}, \code{y} and \code{z}. } \seealso{ \link{as.image.SpatialGridDataFrame}, \link{image} } \author{Edzer Pebesma} \examples{ x <- read.asciigrid(system.file("external/test.ag", package="sp")[1]) class(x) image(x) } \keyword{programming} sp/man/Lines-class.Rd0000644000176200001440000000156312577541412014130 0ustar liggesusers\name{Lines-class} \docType{class} \alias{Lines-class} % \alias{coordinates,Lines-method} \title{Class "Lines" } \description{ class for sets of line objects } \section{Objects from the Class}{ Objects can be created by calls to the function \link{Line} } \section{Slots}{ \describe{ \item{\code{Lines}:}{Object of class \code{"list"}, containing elements of class \link{Line-class}} \item{\code{ID}:}{\code{"character"} vector of lenght one, with unique identifier string} } } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(obj = "Line")}: retrieve coordinates from lines; returns list with matrices } \item{lines}{\code{signature(x = "Line")}: add lines to a plot} } } \arguments{ \item{SL, Lines}{an Lines object} } \author{ Roger Bivand, Edzer Pebesma } \seealso{ \link{Lines-class}, \link{SpatialLines-class} } \keyword{classes} sp/man/zerodist.Rd0000644000176200001440000000554012577541412013615 0ustar liggesusers\name{zerodist} \alias{zerodist} \alias{zerodist2} \alias{remove.duplicates} \title{ find point pairs with equal spatial coordinates } \description{ find point pairs with equal spatial coordinates } \usage{ zerodist(obj, zero = 0.0, unique.ID = FALSE, memcmp = TRUE) zerodist2(obj1, obj2, zero = 0.0, memcmp = TRUE) remove.duplicates(obj, zero = 0.0, remove.second = TRUE, memcmp = TRUE) } \arguments{ \item{obj}{ object of, or extending, class \link{SpatialPoints} } \item{obj1}{ object of, or extending, class \link{SpatialPoints} } \item{obj2}{ object of, or extending, class \link{SpatialPoints} } \item{zero}{ distance values less than or equal to this threshold value are considered to have zero distance (default 0.0); units are those of the coordinates for projected data or unknown projection, or km if coordinates are defined to be longitute/latitude } \item{unique.ID}{logical; if TRUE, return an ID (integer) for each point that is different only when two points do not share the same location } \item{memcmp}{use \code{memcmp} to find exactly equal coordinates; see NOTE} \item{remove.second}{logical; if TRUE, the second of each pair of duplicate points is removed, if FALSE remove the first} } \value{\code{zerodist} and \code{zerodist2} return a two-column matrix with in each row pairs of row numbers with identical coordinates; a matrix with zero rows is returned if no such pairs are found. For \code{zerodist}, row number pairs refer to row pairs in \code{obj}. For \code{zerodist2}, row number pairs refer to rows in \code{obj} and \code{obj2}, respectively. \code{remove.duplicates} removes duplicate observations if present, and else returns \code{obj}. } \note{ When using kriging, duplicate observations sharing identical spatial locations result in singular covariance matrices. This function may help identify and remove spatial duplices. The full matrix with all pair-wise distances is not stored; the double loop is done at the C level. When \code{unique.ID=TRUE} is used, an integer index is returned. sp 1.0-14 returned the highest index, sp 1.0-15 and later return the lowest index. When \code{zero} is 0.0 and \code{memcmp} is not \code{FALSE}, \code{zerodist} uses \code{memcmp} to evaluate exact equality of coordinates; there may be cases where this results in a different evaluation compared to doing the double arithmetic of computing distances. } \examples{ data(meuse) summary(meuse) # pick 10 rows n <- 10 ran10 <- sample(nrow(meuse), size = n, replace = TRUE) meusedup <- rbind(meuse, meuse[ran10, ]) coordinates(meusedup) <- c("x", "y") zd <- zerodist(meusedup) sum(abs(zd[1:n,1] - sort(ran10))) # 0! # remove the duplicate rows: meusedup2 <- meusedup[-zd[,2], ] summary(meusedup2) meusedup3 <- subset(meusedup, !(1:nrow(meusedup) \%in\% zd[,2])) summary(meusedup3) coordinates(meuse) <- c("x", "y") zerodist2(meuse, meuse[c(10:33,1,10),]) } \keyword{dplot} sp/man/degaxis.Rd0000644000176200001440000000161412577541412013374 0ustar liggesusers\name{degAxis} \alias{degAxis} \title{ axis with degrees } \description{ draw axes on a plot using degree symbols in numbers } \usage{ degAxis(side, at, labels, ...) } \arguments{ \item{side}{integer; see \link{axis}} \item{at}{numeric; if missing, \link{axTicks} is called for nice values; see \link{axis}} \item{labels}{character; if omitted labels are constructed with degree symbols, ending in N/S/E/W; in case of negative degrees, sign is reversed and S or W is added; see \link{axis}} \item{...}{passed to the actual \link{axis} call} } \value{ axis is plotted on current graph } \note{decimal degrees are used if variation is small, instead of minutes and seconds} \examples{ xy = cbind(x = 2 * runif(100) - 1, y = 2 * runif(100) - 1) plot(SpatialPoints(xy, proj4string = CRS("+proj=longlat +ellps=WGS84")),xlim=c(-1,1),ylim=c(-1,1)) degAxis(1) degAxis(2, at = c(-1,-0.5,0,0.5,1)) # } \keyword{dplot} sp/man/SpatialGrid.Rd0000644000176200001440000001103513014363365014145 0ustar liggesusers\name{SpatialPixels} \alias{SpatialPixels} \alias{SpatialGrid} \alias{GridTopology} \alias{SpatialGrid} \alias{plot.SpatialGrid} \alias{coordinatevalues} \alias{points2grid} \alias{getGridIndex} \alias{getGridTopology} \alias{areaSpatialGrid} \title{ define spatial grid } \description{ defines spatial grid by offset, cell size and dimensions } \usage{ GridTopology(cellcentre.offset, cellsize, cells.dim) SpatialPixels(points, tolerance = sqrt(.Machine$double.eps), proj4string = CRS(as.character(NA)), round = NULL, grid = NULL) SpatialGrid(grid, proj4string = CRS(as.character(NA))) coordinatevalues(obj) points2grid(points, tolerance = sqrt(.Machine$double.eps), round=NULL) getGridIndex(cc, grid, all.inside = TRUE) getGridTopology(obj) areaSpatialGrid(obj) } \arguments{ \item{cellcentre.offset}{numeric; vector with the smallest centroid coordinates for each dimension; coordinates refer to the cell centre} \item{cellsize}{numeric; vector with the cell size in each dimension} \item{cells.dim}{integer; vector with number of cells in each dimension} \item{points}{ coordinates, object of class \link{SpatialPoints-class} } \item{grid}{ grid topology; object of class \link{GridTopology-class}; for calls to \code{SpatialPixels}, a value of NULL implies that this will be derived from the point coordinates } \item{tolerance}{ precision, used to which extent points are exactly on a grid} \item{round}{default NULL, otherwise a value passed to as the digits argument to \code{round} for setting cell size} \item{proj4string}{ object of class \link{CRS-class}} \item{obj}{object of class or deriving from \link{SpatialGrid-class}} \item{cc}{ numeric matrix with coordinates } \item{all.inside}{ logical; if TRUE and \code{cc} points fall outside the grid area, an error message is generated; if FALSE, NA values are generated for such points } } \value{ GridTopology returns a value of class \link{GridTopology-class}; SpatialGrid returns an object of class \link{SpatialGrid-class} \code{coordinatevalues} returns a list with the unique x-coordinates, the unique y-coordinate, etc. instead of the \link{coordinates} of all grid cells SpatialGrid returns an object of class \link{SpatialGrid-class}. points2grid returns the \link{GridTopology-class} from a set of points. getGridIndex finds the index of a set of point coordinates in a given grid topology, and depending on \code{all.inside} setting, generates NA or an error message if points are outside the grid domain. getGridTopology returns the slot of class \link{GridTopology-class} from obj. areaSpatialGrid returns the spatial area of (the non-missing valued cells of) the grid. For objects of class \link{SpatialGridDataFrame-class} the area refers to cells where any (one or more) of the attribute columns are non-missing valued. } \note{ SpatialGrid stores grid topology and may or may not store the coordinates of the actual points, which may form a subset of the full grid. To find out or change this, see \link{fullgrid}. points2grid tries to figure out the grid topology from points. It succees only if points on a grid line have constant y column, and points on a grid column have constant x coordinate, etc. In other cases, use signif on the raw coordinate matrices to make sure this is the case. } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \seealso{ \link{SpatialGrid-class}, \link{SpatialGridDataFrame-class}, } \examples{ x = GridTopology(c(0,0), c(1,1), c(5,4)) class(x) x summary(x) coordinates(x) coordinates(GridTopology(c(0,0), c(1,1), c(5,4))) coordinatevalues(x) data(meuse.grid) coordinates(meuse.grid) <- c("x", "y") points2grid(meuse.grid) data(meuse.grid) set.seed(1) meuse.grid$x <- meuse.grid$x + rnorm(length(meuse.grid$x), 0, 0.002) meuse.grid$y <- meuse.grid$y + rnorm(length(meuse.grid$y), 0, 0.002) coordinates(meuse.grid) <- c("x", "y") #EJP # points2grid(meuse.grid, tolerance=0.76, round=1) data(meuse.grid) a <- which(meuse.grid$x == 180140) b <- which(meuse.grid$x == 180180) c <- which(meuse.grid$x == 179260) d <- which(meuse.grid$y == 332460) e <- which(meuse.grid$y == 332420) f <- which(meuse.grid$y == 330740) meuse.grid <- meuse.grid[-c(a, b, c, d, e, f),] coordinates(meuse.grid) <- c("x", "y") points2grid(meuse.grid) data(meuse.grid) set.seed(1) meuse.grid$x <- meuse.grid$x + rnorm(length(meuse.grid$x), 0, 0.002) meuse.grid$y <- meuse.grid$y + rnorm(length(meuse.grid$y), 0, 0.002) meuse.grid <- meuse.grid[-c(a, b, c, d, e, f),] coordinates(meuse.grid) <- c("x", "y") # EJP # points2grid(meuse.grid, tolerance=0.69, round=1) } \keyword{spatial} sp/man/meuse.Rd0000644000176200001440000000706312577541412013072 0ustar liggesusers\name{meuse} \alias{meuse} \docType{data} \title{Meuse river data set} \description{ This data set gives locations and topsoil heavy metal concentrations, along with a number of soil and landscape variablesat the observation locations, collected in a flood plain of the river Meuse, near the village of Stein (NL). Heavy metal concentrations are from composite samples of an area of approximately 15 m x 15 m. } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; Easting (m) in Rijksdriehoek (RDH) (Netherlands topographical) map coordinates } \item{y}{a numeric vector; Northing (m) in RDH coordinates } \item{cadmium}{topsoil cadmium concentration, mg kg-1 soil ("ppm"); zero cadmium values in the original data set have been shifted to 0.2 (half the lowest non-zero value) } \item{copper}{topsoil copper concentration, mg kg-1 soil ("ppm") } \item{lead}{topsoil lead concentration, mg kg-1 soil ("ppm") } \item{zinc}{topsoil zinc concentration, mg kg-1 soil ("ppm") } \item{elev}{relative elevation above local river bed, m } \item{dist}{distance to the Meuse; obtained from the nearest cell in \link{meuse.grid}, which in turn was derived by a spread (spatial distance) GIS operation, horizontal precision 20 metres; then normalized to $[0,1]$ } \item{om}{organic matter, kg (100 kg)-1 soil (percent)} \item{ffreq}{flooding frequency class: 1 = once in two years; 2 = once in ten years; 3 = one in 50 years} \item{soil}{soil type according to the 1:50 000 soil map of the Netherlands. 1 = Rd10A (Calcareous weakly-developed meadow soils, light sandy clay); 2 = Rd90C/VII (Non-calcareous weakly-developed meadow soils, heavy sandy clay to light clay); 3 = Bkd26/VII (Red Brick soil, fine-sandy, silty light clay)} \item{lime}{lime class: 0 = absent, 1 = present by field test with 5\% HCl} \item{landuse}{landuse class: Aa Agriculture/unspecified = , Ab = Agr/sugar beetsm, Ag = Agr/small grains, Ah = Agr/??, Am = Agr/maize, B = woods, Bw = trees in pasture, DEN = ??, Fh = tall fruit trees, Fl = low fruit trees; Fw = fruit trees in pasture, Ga = home gardens, SPO = sport field, STA = stable yard, Tv = ?? , W = pasture} \item{dist.m}{distance to river Meuse in metres, as obtained during the field survey} } } \usage{ data(meuse) } \note{row.names refer to the original sample number. Soil units were mapped with a minimum delination width of 150 m, and so somewhat generalize the landscape. Approximate equivalent World Reference Base 2002 for Soil Resources names are: Rd10A Gleyic Fluvisols; Rd90C Haplic Fluvisols; Bkd26 Haplic Luvisols. Units Rd90C and Bkd26 have winter groundwater > 80cm, summer > 120cm depth. } \author{Field data were collected by Ruud van Rijn and Mathieu Rikken; compiled for R by Edzer Pebesma; description extended by David Rossiter } \references{ M G J Rikken and R P G Van Rijn, 1993. Soil pollution with heavy metals - an inquiry into spatial variation, cost of mapping and the risk evaluation of copper, cadmium, lead and zinc in the floodplains of the Meuse west of Stein, the Netherlands. Doctoraalveldwerkverslag, Dept. of Physical Geography, Utrecht University P.A. Burrough, R.A. McDonnell, 1998. Principles of Geographical Information Systems. Oxford University Press. Stichting voor Bodemkartering (STIBOKA), 1970. Bodemkaart van Nederland : Blad 59 Peer, Blad 60 West en 60 Oost Sittard: schaal 1 : 50 000. Wageningen, STIBOKA. \url{http://www.gstat.org/} } \keyword{datasets} \examples{ data(meuse) summary(meuse) coordinates(meuse) <- ~x+y proj4string(meuse) <- CRS("+init=epsg:28992") } sp/man/addattr.Rd0000644000176200001440000000260012577541412013367 0ustar liggesusers\name{addAttrToGeom-methods} \docType{methods} \alias{addAttrToGeom} \alias{addAttrToGeom-methods} \alias{addAttrToGeom,SpatialPoints,data.frame-method} \alias{addAttrToGeom,SpatialMultiPoints,data.frame-method} \alias{addAttrToGeom,SpatialGrid,data.frame-method} \alias{addAttrToGeom,SpatialPixels,data.frame-method} \alias{addAttrToGeom,SpatialPolygons,data.frame-method} \alias{addAttrToGeom,SpatialLines,data.frame-method} \title{ constructs SpatialXxxDataFrame from geometry and attributes} \description{ constructs SpatialXxxDataFrame from geometry and attributes} \usage{ addAttrToGeom(x, y, match.ID, ...) } \arguments{ \item{x}{geometry (locations) of the queries} \item{y}{data.frame object with attributes} \item{match.ID}{ logical; if TRUE, the IDs of the geometry and of the data.frame are matched (possibly swapping records), and an error occurs when some IDs do not match } \item{...}{(optional) arguments passed to the constructor functions } } \value{ an object of class XxxDataFrame, where Xxx is the class of x} \section{Methods}{ \describe{ \item{x = "SpatialPoints", y = "data.frame"}{ } \item{x = "SpatialPixels", y = "data.frame"}{ } \item{x = "SpatialGrid", y = "data.frame"}{ } \item{x = "SpatialLines", y = "data.frame"}{ } \item{x = "SpatialPolygons", y = "data.frame"}{ } } } \author{Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \seealso{\link{over}} \keyword{methods} sp/man/Line-class.Rd0000644000176200001440000000135612577541412013745 0ustar liggesusers\name{Line-class} \docType{class} \alias{Line-class} % \alias{coordinates,Line-method} \title{Class "Line" } \description{ class for line objects } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Line", ...)}, or (preferred) by calls to the function \link{Line} } \section{Slots}{ \describe{ \item{\code{coords}:}{Object of class \code{"matrix"}, containing the line coordinates } } } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(obj = "Line")}: retrieve coordinates from line } \item{lines}{\code{signature(x = "Line")}: add lines to a plot } } } \author{ Roger Bivand, Edzer Pebesma } \seealso{ \link{Lines-class}, \link{SpatialLines-class} } \keyword{classes} sp/man/coordinates-methods.Rd0000644000176200001440000000472012577541412015724 0ustar liggesusers\name{coordinates-methods} \docType{methods} \alias{coordinates-methods} % \alias{coordinates} \alias{coordinates,list-method} \alias{coordinates,data.frame-method} \alias{coordinates,matrix-method} \alias{coordinates,SpatialPoints-method} \alias{coordinates,SpatialMultiPoints-method} %\alias{coordinates,SpatialPointsDataFrame-method} \alias{coordinates,SpatialPolygons-method} \alias{coordinates,SpatialPolygonsDataFrame-method} \alias{coordinates,Line-method} \alias{coordinates,Lines-method} \alias{coordinates,SpatialLines-method} \alias{coordinates,GridTopology-method} \alias{coordinates,SpatialPixels-method} \alias{coordinates,SpatialPixelsDataFrame-method} \alias{coordinates,SpatialGrid-method} \alias{coordinates,SpatialGridDataFrame-method} \alias{coordinates<-,data.frame-method} \title{ retrieve (or set) spatial coordinates } \description{ retrieve (or set) spatial coordinates from (for) spatial data } \section{Methods}{ \describe{ \item{obj = "list"}{ list with (at least) two numeric components of equal length } \item{obj = "data.frame"}{ data.frame with at least two numeric components } \item{obj = "matrix"}{ numeric matrix with at least two columns } \item{obj = "SpatialPoints"}{ object of, or deriving from, SpatialPoints } \item{obj = "SpatialPointsDataFrame"}{ object of, or deriving from, SpatialPointsDataFrame } \item{obj = "SpatialPolygons"}{ object of, or deriving from, SpatialPolygons } \item{obj = "SpatialPolygonsDataFrame"}{ object of, or deriving from, SpatialPolygonsDataFrame } \item{obj = "Line"}{ object of class Line; returned value is matrix } \item{obj = "Lines"}{ object of class Lines; returned value is list of matrices } \item{obj = "SpatialLines"}{ object of, or deriving from, SpatialLines; returned value is list of lists of matrices } \item{obj = "GridTopology"}{ object of, or deriving from, GridTopology } \item{obj = "GridTopology"}{ object of, or deriving from, GridTopology } \item{obj = "SpatialPixels"}{ object of, or deriving from, SpatialPixels } \item{obj = "SpatialPixelsDataFrame"}{ object of, or deriving from, SpatialPixelsDataFrame } \item{obj = "SpatialGrid"}{ object of, or deriving from, SpatialGrid } \item{obj = "SpatialGridDataFrame"}{ object of, or deriving from, SpatialGridDataFrame } }} \section{Methods for "coordinates<-"}{ \describe{ \item{object = "data.frame", value="ANY"}{ promote data.frame to object of class \link{SpatialPointsDataFrame-class}, by specifying coordinates; see \link{coordinates}} }} \keyword{methods} sp/man/DMS-class.Rd0000644000176200001440000000277712577541412013511 0ustar liggesusers\name{DMS-class} \docType{class} \alias{DMS-class} \alias{print.DMS} \alias{show,DMS-method} \alias{coerce,DMS-method} \alias{as.double.DMS} \alias{as.numeric.DMS} \title{Class "DMS" for degree, minute, decimal second values} \description{The class provides a container for coordinates stored as degree, minute, decimal second values.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("DMS", ...)}, converted from decimal degrees using \code{dd2dms()}, or converted from character strings using \code{char2dms()}. } \section{Slots}{ \describe{ \item{\code{WS}:}{Object of class \code{"logical"} TRUE if input value negative} \item{\code{deg}:}{Object of class \code{"numeric"} degrees} \item{\code{min}:}{Object of class \code{"numeric"} minutes} \item{\code{sec}:}{Object of class \code{"numeric"} decimal seconds} \item{\code{NS}:}{Object of class \code{"logical"} TRUE if input value is a Northing} } } \section{Methods}{ \describe{ \item{coerce}{\code{signature(from = "DMS", to = "numeric")}: convert to decimal degrees } \item{show}{\code{signature(object = "DMS")}: print data values } } } \author{Roger Bivand \email{Roger.Bivand@nhh.no} } \seealso{\code{\link{char2dms}}, \code{\link{dd2dms}}} \examples{ data(state) dd2dms(state.center$x) dd2dms(state.center$y, NS=TRUE) as.numeric(dd2dms(state.center$y)) as(dd2dms(state.center$y, NS=TRUE), "numeric") as.numeric.DMS(dd2dms(state.center$y)) state.center$y } \keyword{classes} \keyword{spatial} sp/man/polygons.Rd0000644000176200001440000000165512577541412013627 0ustar liggesusers\name{polygons} \alias{polygons<-} \alias{polygons} \title{ sets spatial coordinates to create spatial data, or retrieves spatial coordinates } \description{ sets spatial coordinates to create spatial data, or retrieves spatial coordinates } \usage{ polygons(obj) polygons(object) <- value } \arguments{ \item{obj}{ object of class "SpatialPolygons" or "SpatialPolygonsDataFrame" } \item{object}{ object of class "data.frame" } \item{value}{ object of class "SpatialPolygons" } } \value{ polygons returns the SpatialPolygons of obj; polygons<- promotes a data.frame to a SpatialPolygonsDataFrame object } \examples{ grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as.SpatialPolygons.GridTopology(grd) centroids <- coordinates(polys) x <- centroids[,1] y <- centroids[,2] z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x df <- data.frame(x=x, y=y, z=z, row.names=row.names(polys)) polygons(df) <- polys class(df) summary(df) } \keyword{manip} sp/man/stack.Rd0000644000176200001440000000451712577541412013062 0ustar liggesusers\name{stack} \alias{spmap.to.lev} \alias{stack.SpatialPointsDataFrame} \alias{stack.SpatialGridDataFrame} \title{ rearrange data in SpatialPointsDataFrame or SpatialGridDataFrame for plotting with spplot (levelplot/xyplot wrapper) } \description{ rearrange SpatialPointsDataFrame for plotting with spplot or levelplot } \usage{ spmap.to.lev(data, zcol = 1:n, n = 2, names.attr) \method{stack}{SpatialPointsDataFrame}(x, select, ...) \method{stack}{SpatialGridDataFrame}(x, select, ...) } \arguments{ \item{data}{ object of class (or extending) SpatialPointsDataFrame or SpatialGridDataFrame } \item{zcol}{ z-coordinate column name(s), or a column number (range) (after removing the spatial coordinate columns: 1 refers to the first non-coordinate column, etc. ) } \item{names.attr}{names of the set of z-columns (these names will appear in the plot); if omitted, column names of \code{zcol} } \item{n}{ number of columns to be stacked } \item{x}{ same as \code{data}} \item{select}{ same as \code{zcol}} \item{...}{ ignored } } \value{ \code{spmap.to.lev} returns a data frame with the following elements: \item{x}{ x-coordinate for each row} \item{y}{ y-coordinate for each row} \item{z}{ column vector with each of the elements in columns \code{zcol} of \code{data} stacked } \item{name}{ factor; name of each of the stacked \code{z} columns } \code{stack} is an S3 method: it return a data.frame with a column \code{values} that has the stacked coordinates and attributes, and a column \code{ind} that indicates the variable stacked; it also replicates the coordinates. } \seealso{ \link{spplot}, \link{levelplot} in package \code{lattice}, and \link{stack}} \examples{ library(lattice) data(meuse.grid) # data frame coordinates(meuse.grid) = c("x", "y") # promotes to SpatialPointsDataFrame meuse.grid[["idist"]] = 1 - meuse.grid[["dist"]] # add variable # the following is made much easier by spplot: levelplot(z~x+y|name, spmap.to.lev(meuse.grid, z=c("dist","idist"), names.attr = c("distance", "inverse of distance")), aspect = "iso") levelplot(values~x+y|ind, as.data.frame(stack(meuse.grid)),aspect = "iso") gridded(meuse.grid) = TRUE levelplot(z~x+y|name, spmap.to.lev(meuse.grid, z=c("dist","idist"), names.attr = c("distance", "inverse of distance")), aspect = "iso") levelplot(values~x+y|ind, as.data.frame(stack(meuse.grid)), asp = "iso") } \keyword{dplot} sp/man/merge.Rd0000644000176200001440000000302412577541412013044 0ustar liggesusers\name{merge} \docType{methods} \alias{merge} \alias{merge,Spatial,data.frame-method} \alias{merge,Spatial,ANY-method} \title{ Merge a Spatial* object having attributes with a data.frame } \description{ Merge a Spatial object having a data.frame (i.e. merging of non-spatial attributes). } \usage{ \S4method{merge}{Spatial,data.frame}(x, y, by = intersect(names(x), names(y)), by.x = by, by.y = by, all.x = TRUE, suffixes = c(".x",".y"), incomparables = NULL, duplicateGeoms = FALSE, ...) } \arguments{ \item{x}{object deriving from \link{Spatial}} \item{y}{object of class \code{data.frame}, or any other class that can be coerced to a data.frame with \code{as.data.frame}} \item{by, by.x, by.y}{specifications of the common columns. See 'Details' in (base) \code{\link[base]{merge}}.} \item{all.x}{logical; if TRUE, then the returned object will have all rows of x, even those that has no matching row in y. These rows will have NAs in those columns that are usually filled with values from y} \item{suffixes}{character(2) specifying the suffixes to be used for making non-by names() unique.} \item{incomparables}{values which cannot be matched. See \code{\link[base]{match}}.} \item{duplicateGeoms}{logical; if \code{TRUE} geometries in \code{x} are duplicated if there are multiple matches between records in \code{x} and \code{y}} \item{...}{arguments to be passed to or from methods.} } \value{ a Spatial* object } \author{Robert J. Hijmans} \seealso{ \code{\link[base]{merge}} } \keyword{methods} \keyword{spatial} sp/man/meuse.grid.Rd0000644000176200001440000000271412577541412014014 0ustar liggesusers\name{meuse.grid} \alias{meuse.grid} \docType{data} \title{ Prediction Grid for Meuse Data Set } \usage{data(meuse.grid)} \description{ The \code{meuse.grid} data frame has 3103 rows and 7 columns; a grid with 40 m x 40 m spacing that covers the Meuse study area (see \link{meuse}) } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; x-coordinate (see \link{meuse}) } \item{y}{a numeric vector; y-coordinate (see \link{meuse}) } \item{dist}{distance to the Meuse river; obtained by a spread (spatial distance) GIS operation, from border of river; normalized to $[0,1]$ } \item{ffreq}{flooding frequency class, for definitions see this item in \link{meuse}; it is not known how this map was generated} \item{part.a}{arbitrary division of the area in two areas, a and b} \item{part.b}{see \code{part.a}} \item{soil}{soil type, for definitions see this item in \link{meuse}; it is questionable whether these data come from a real soil map, they do not match the published 1:50 000 map} } } \details{ \code{x} and \code{y} are in RD New, the Dutch topographical map coordinate system. Roger Bivand projected this to UTM in the R-Grass interface package. } \source{ \url{http://www.gstat.org/} } \references{ See the \link{meuse} documentation } \examples{ data(meuse.grid) coordinates(meuse.grid) = ~x+y proj4string(meuse.grid) <- CRS("+init=epsg:28992") gridded(meuse.grid) = TRUE spplot(meuse.grid) } \keyword{datasets} sp/man/bpy.colors.Rd0000644000176200001440000000250012577541412014035 0ustar liggesusers\name{bpy.colors} \alias{bpy.colors} \title{ blue-pink-yellow color scheme, which also prints well on black/white printers } \description{ Create a vector of `n' ``contiguous'' colors. } \usage{ bpy.colors(n = 100, cutoff.tails = 0.1, alpha = 1.0) } \arguments{ \item{n}{number of colors (>= 1) to be in the palette} \item{cutoff.tails}{tail fraction to be cut off on each side. If 0, this palette runs from black to white; by cutting off the tails, it runs from blue to yellow, which looks nicer. } \item{alpha}{numeric; alpha transparency, 0 is fully transparent, 1 is opaque. } } \value{ A character vector, `cv', of color names. This can be used either to create a user-defined color palette for subsequent graphics by `palette(cv)', a `col=' specification in graphics functions or in `par'. } \author{ unknown; the pallette was posted to gnuplot-info a few decades ago; R implementation Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \note{ This color map prints well on black-and-white printers. } \seealso{\link{rainbow}, \link{cm.colors}} \examples{ bpy.colors(10) p <- expand.grid(x=1:30,y=1:30) p$z <- p$x + p$y coordinates(p) <- c("x", "y") gridded(p) <- TRUE image(p, col = bpy.colors(100), asp = 1) # require(lattice) # trellis.par.set("regions", list(col=bpy.colors())) # make this default pallette } \keyword{color} sp/man/aggregate.Rd0000644000176200001440000001102212676055715013676 0ustar liggesusers\name{aggregate} \docType{methods} \alias{aggregate} \alias{aggregate.Spatial} \title{ aggregation of spatial objects } \description{ spatial aggregation of thematic information in spatial objects} \usage{ \method{aggregate}{Spatial}(x, by = list(ID = rep(1, length(x))), FUN, \dots, dissolve = TRUE, areaWeighted = FALSE) } \arguments{ \item{x}{object deriving from \link{Spatial}, with attributes } \item{by}{aggregation predicate; if \code{by} is a \link{Spatial} object, the geometry by which attributes in \code{x} are aggregated; if \code{by} is a list, aggregation by attribute(s), see \link{aggregate.data.frame}} \item{FUN}{aggregation function, e.g. \link{mean}; see details} \item{...}{arguments passed on to function \code{FUN}, unless \code{minDimension} is specified, which is passed on to function \link{over}} \item{dissolve}{logical; should, when aggregating based on attributes, the resulting geometries be dissolved? Note that if \code{x} has class \code{SpatialPointsDataFrame}, this returns an object of class \code{SpatialMultiPointsDataFrame}} \item{areaWeighted}{logical; should the aggregation of \code{x} be weighted by the areas it intersects with each feature of \code{by}? See value.} } \value{ The aggregation of attribute values of \code{x} either over the geometry of \code{by} by using \link{over} for spatial matching, or by attribute values, using aggregation function \code{FUN}. If \code{areaWeighted} is \code{TRUE}, \code{FUN} is ignored and the area weighted mean is computed for numerical variables, or if all attributes are \code{factor}s, the area dominant factor level (area mode) is returned. This will compute the \link[rgeos]{gIntersection} of \code{x} and \code{by}; see examples below. If \code{by} is missing, aggregates over all features. } \details{ \code{FUN} should be a function that takes as first argument a vector, and that returns a single number. The canonical examples are \link{mean} and \link{sum}. Counting features is obtained when summing an attribute variable that has the value 1 everywhere. } \author{Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \note{ uses \link{over} to find spatial match if \code{by} is a \link{Spatial} object } \examples{ data("meuse") coordinates(meuse) <- ~x+y data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE i = cut(meuse.grid$dist, c(0,.25,.5,.75,1), include.lowest = TRUE) j = sample(1:2, 3103,replace=TRUE) \dontrun{ if (require(rgeos)) { # aggregation by spatial object: ab = gUnaryUnion(as(meuse.grid, "SpatialPolygons"), meuse.grid$part.a) x = aggregate(meuse["zinc"], ab, mean) spplot(x) # aggregation of multiple variables x = aggregate(meuse[c("zinc", "copper")], ab, mean) spplot(x) # aggregation by attribute, then dissolve to polygon: x = aggregate(meuse.grid["dist"], list(i=i), mean) spplot(x["i"]) x = aggregate(meuse.grid["dist"], list(i=i,j=j), mean) spplot(x["dist"], col.regions=bpy.colors()) spplot(x["i"], col.regions=bpy.colors(4)) spplot(x["j"], col.regions=bpy.colors()) } } x = aggregate(meuse.grid["dist"], list(i=i,j=j), mean, dissolve = FALSE) spplot(x["j"], col.regions=bpy.colors()) if (require(gstat) && require(rgeos)) { x = idw(log(zinc)~1, meuse, meuse.grid, debug.level=0)[1] spplot(x[1],col.regions=bpy.colors()) i = cut(x$var1.pred, seq(4, 7.5, by=.5), include.lowest = TRUE) xa = aggregate(x["var1.pred"], list(i=i), mean) spplot(xa[1],col.regions=bpy.colors(8)) } if (require(rgeos)) { # Area-weighted example, using two partly overlapping grids: gt1 = SpatialGrid(GridTopology(c(0,0), c(1,1), c(4,4))) gt2 = SpatialGrid(GridTopology(c(-1.25,-1.25), c(1,1), c(4,4))) # convert both to polygons; give p1 attributes to aggregate p1 = SpatialPolygonsDataFrame(as(gt1, "SpatialPolygons"), data.frame(v = 1:16, w=5:20, x=factor(1:16)), match.ID = FALSE) p2 = as(gt2, "SpatialPolygons") # plot the scene: plot(p1, xlim = c(-2,4), ylim = c(-2,4)) plot(p2, add = TRUE, border = 'red') i = gIntersection(p1, p2, byid = TRUE) plot(i, add=TRUE, density = 5, col = 'blue') # plot IDs p2: ids.p2 = sapply(p2@polygons, function(x) slot(x, name = "ID")) text(coordinates(p2), ids.p2) # plot IDs i: ids.i = sapply(i@polygons, function(x) slot(x, name = "ID")) text(coordinates(i), ids.i, cex = .8, col = 'blue') # compute & plot area-weighted average; will warn for the factor ret = aggregate(p1, p2, areaWeighted = TRUE) spplot(ret) # all-factor attributes: compute area-dominant factor level: ret = aggregate(p1["x"], p2, areaWeighted = TRUE) spplot(ret) } } \keyword{methods} sp/man/SpatialLinesDataFrame-class.Rd0000644000176200001440000000433312577610502017206 0ustar liggesusers\name{SpatialLinesDataFrame-class} \docType{class} \alias{SpatialLinesDataFrame-class} \alias{coerce,SpatialLinesDataFrame,data.frame-method} \alias{[,SpatialLinesDataFrame-method} \alias{rbind.SpatialLinesDataFrame} \alias{coerce,SpatialLinesDataFrame,SpatialPointsDataFrame-method} \alias{coerce,SpatialLinesDataFrame,SpatialMultiPointsDataFrame-method} \alias{dim.SpatialLinesDataFrame} \alias{row.names.SpatialLinesDataFrame} \title{a class for spatial lines with attributes } \description{ this class holds data consisting of (sets of lines), where each set of lines relates to an attribute row in a data.frame } \section{Objects from the Class}{ can be created by the function \link{SpatialLinesDataFrame} } \section{Slots}{ \describe{ \item{\code{data}:}{Object of class \link{data.frame} containing the attribute table } \item{\code{lines}:}{Object of class \code{"list"}; see \link{SpatialLines-class}} \item{\code{bbox}:}{Object of class \code{"matrix"}; see \link{Spatial-class} } \item{\code{proj4string}:}{Object of class \code{"CRS"}; see \link{CRS-class}} } } \section{Extends}{ Class \code{"SpatialLines"}, directly. Class \code{"Spatial"}, by class \code{"SpatialLines"}. } \section{Methods}{ Methods defined with class "SpatialLinesDataFrame" in the signature: \describe{ \item{[}{\code{signature(x = "SpatialLinesDataFrame")}: subset rows or columns; in case of row subsetting, the line sets are also subsetted; NAs are not permitted in the row index } \item{coordinates}{\code{signature(obj = "SpatialLinesDataFrame")}: retrieves a list with lists of coordinate matrices } \item{show}{\code{signature(object = "SpatialLinesDataFrame")}: print method } \item{plot}{\code{signature(x = "SpatialLinesDataFrame")}: plot points} \item{lines}{\code{signature(object = "SpatialLinesDataFrame")}: add lines to plot} \item{rbind}{\code{signature(object = "SpatialLinesDataFrame")}: rbind-like method} } } \note{ \code{rbind} for \code{SpatialLinesDataFrame} is only possible for objects with unique IDs. If you want to \code{rbind} objects with duplicated IDs, see\code{\link{spChFIDs}}. } \author{ Roger Bivand; Edzer Pebesma } \seealso{ \link{SpatialLines-class} } \keyword{classes} sp/man/SpatialGridDataFrame-class.Rd0000644000176200001440000001375412667525600017034 0ustar liggesusers\name{SpatialGridDataFrame-class} \docType{class} \alias{SpatialGridDataFrame-class} \alias{[,SpatialGridDataFrame-method} \alias{show,SpatialGridDataFrame-method} \alias{cbind.SpatialGridDataFrame} % \alias{SpatialGridDataFrame} \alias{plot.SpatialGridDataFrame} \alias{print.summary.SpatialGridDataFrame} \alias{as.array.SpatialGridDataFrame} \alias{coerce,SpatialGridDataFrame,SpatialPointsDataFrame-method} \alias{coerce,SpatialGridDataFrame,SpatialPixelsDataFrame-method} \alias{coerce,SpatialGridDataFrame,SpatialPolygonsDataFrame-method} \alias{coerce,SpatialGridDataFrame,data.frame-method} \alias{coerce,SpatialGridDataFrame,matrix-method} \alias{coerce,SpatialGridDataFrame,array-method} \alias{as.data.frame.SpatialGridDataFrame} \alias{dim.SpatialGridDataFrame} \alias{coerce,im,SpatialGridDataFrame-method} \alias{coerce,ppp,SpatialGridDataFrame-method} \alias{plot,SpatialGridDataFrame,missing-method} \title{Class "SpatialGridDataFrame" } \description{ Class for spatial attributes that have spatial locations on a (full) regular grid. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{as(x, "SpatialGridDataFrame")}, where \code{x} is of class \link{SpatialPixelsDataFrame-class}, or by importing through rgdal. Ordered full grids are stored instead or unordered non-NA cells; } \section{Slots}{ \describe{ \item{\code{grid}:}{see \link{GridTopology-class}; grid parameters } \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box } \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection } \item{\code{data}:}{Object of class data.frame, containing attribute data } } } \section{Extends}{ Class \code{"SpatialGrid"}, directly. Class \code{"Spatial"}, by class \code{"SpatialGrid"}. } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(x = "SpatialGridDataFrame")}: retrieves (and calculates!) coordinates } \item{[}{\code{signature(x = "SpatialGridDataFrame")}: selects rows, columns, and attributes; returns an object of class \code{SpatialGridDataFrame}} \item{as.matrix}{\code{signature(x = "SpatialGridDataFrame")}: coerce to matrix; increasing col index corresponds to decreasing y coordinate, row index increases with coordinate index } \item{as.array}{\code{signature(x = "SpatialGridDataFrame")}: coerce to array; increasing array index for the second dimension corresponds to decreasing coordinates, all other coordinate dimensions increase with array index } \item{cbind}{\code{signature(...)}: if arguments have identical topology, combine their attribute values} } } \section{Plot method arguments}{ The plot methods for \dQuote{SpatialPixelsDataFrame} or \dQuote{SpatialGridDataFrame} objects take the following arguments: \describe{ \item{x}{object of class \link{SpatialPixelsDataFrame} or \link{SpatialGridDataFrame}} \item{...}{ arguments passed on to \link{image.SpatialGridDataFrame}} \item{attr}{ integer or character, indicating the attribute variable to be plotted; default 1} \item{col}{ color ramp to be used; default \code{bpy.colors(100)} for continuous, or \code{RColorBrewer::brewer.pal(nlevels(x[[1]]), "Set2")} for factor variables} \item{breaks}{ for continous attributes: values at which color breaks should take place } \item{zlim}{ for continuous attributes: numeric of length 2, specifying the range of attribute values to be plotted; default to data range \code{range(as.numeric(x[[attr]])[is.finite(x[[attr]])])}} \item{axes}{ logical: draw x and y axes? default \code{FALSE}} \item{xaxs}{character, default "i", see \link{par}} \item{yaxs}{character, default equal to \code{xaxs}, see \link{par}} \item{at}{numeric or NULL, values at which axis tics and labes should be drawn; default NULL (use \link{pretty})} \item{border}{color, to be used for drawing grid lines; default NA (don't draw grid lines)} \item{axis.pos}{integer, 1-4; default 4, see \link{axis}} \item{add.axis}{logical: draw axis along scale? default \code{TRUE}} \item{what}{what to draw: \code{"image"}, \code{"scale"}, or \code{"both"}; default "both"} \item{scale.size}{size for the scale bar; use \link{lcm} to specify in absolute size, or a numeric value such as \code{1/6} to specify relative size; default \code{lcm(2.8)}} \item{scale.shrink}{ non-negative numeric indicating the amount to shrink the scale length, default 0} \item{scale.frac}{for categorical attributes: numeric between 0 and 1, indicating the scale width, default 0.3} \item{scale.n}{for categorical attributes: integer, indicating how many scale categories should fill a complete width; default 15} } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialGrid-class}}, which does not contain the attribute data, and \code{\link{SpatialPixelsDataFrame-class} which holds possibly incomplete grids } Plotting gridded data with sp: \url{http://r-spatial.org/r/2016/03/08/plotting-spatial-grids.html} } \examples{ data(meuse.grid) # only the non-missing valued cells coordinates(meuse.grid) = c("x", "y") # promote to SpatialPointsDataFrame gridded(meuse.grid) <- TRUE # promote to SpatialPixelsDataFrame x = as(meuse.grid, "SpatialGridDataFrame") # creates the full grid x[["idist"]] = 1 - x[["dist"]] # assigns new attribute image(x["idist"]) # note the single [ for attribute selection # toy example: df = data.frame(z = c(1:6,NA,8,9), xc = c(1,1,1,2,2,2,3,3,3), yc = c(rep(c(0, 1.5, 3),3))) coordinates(df) = ~xc+yc gridded(df) = TRUE df = as(df, "SpatialGridDataFrame") # to full grid image(df["z"]) # draw labels to verify: cc = coordinates(df) z=df[["z"]] zc=as.character(z) zc[is.na(zc)]="NA" text(cc[,1],cc[,2],zc) # the following is weird, but illustrates the concept of row/col selection: fullgrid(meuse.grid) = TRUE image(meuse.grid) image(meuse.grid[20:70, 10:70, "dist"], add = TRUE, col = bpy.colors()) # as.matrix, as.array sgdim = c(3,4) SG = SpatialGrid(GridTopology(rep(0,2), rep(10,2), sgdim)) SGDF = SpatialGridDataFrame(SG, data.frame(val = 1:12)) as.array(SGDF) as.matrix(SGDF) as(SGDF, "array") } \keyword{classes} sp/man/point.in.polygon.Rd0000644000176200001440000000227012577541412015173 0ustar liggesusers\name{point.in.polygon} \alias{point.in.polygon} \title{ do point(s) fall in a given polygon? } \description{ verifies for one or more points whether they fall in a given polygon } \usage{ point.in.polygon(point.x, point.y, pol.x, pol.y, mode.checked=FALSE) } \arguments{ \item{point.x}{numerical array of x-coordinates of points} \item{point.y}{numerical array of y-coordinates of points} \item{pol.x}{numerical array of x-coordinates of polygon} \item{pol.y}{numerical array of y-coordinates of polygon} \item{mode.checked}{default FALSE, used internally to save time when all the other argument are known to be of storage mode double} } \value{ integer array; values are: 0: point is strictly exterior to pol; 1: point is strictly interior to pol; 2: point lies on the relative interior of an edge of pol; 3: point is a vertex of pol. } \references{ Uses the C function InPoly(). InPoly is Copyright (c) 1998 by Joseph O'Rourke. It may be freely redistributed in its entirety provided that this copyright notice is not removed. } \examples{ # open polygon: point.in.polygon(1:10,1:10,c(3,5,5,3),c(3,3,5,5)) # closed polygon: point.in.polygon(1:10,rep(4,10),c(3,5,5,3,3),c(3,3,5,5,3)) } \keyword{manip} sp/man/spplot.Rd0000644000176200001440000003126412577541412013275 0ustar liggesusers\name{spplot} \docType{methods} \alias{spplot} \alias{spplot.grid} \alias{spplot.locator} \alias{spplot.polygons} \alias{spplot.points} \alias{layout.north.arrow} \alias{layout.scale.bar} \alias{mapLegendGrob} \alias{sp.theme} \alias{spplot-methods} \alias{spplot,SpatialPixelsDataFrame-method} \alias{spplot,SpatialGridDataFrame-method} \alias{spplot,SpatialPolygonsDataFrame-method} \alias{spplot,SpatialLinesDataFrame-method} \alias{spplot,SpatialPointsDataFrame-method} \alias{spplot,SpatialMultiPointsDataFrame-method} \alias{sppanel} \alias{sppanel,Line-method} \alias{sppanel,Lines-method} \alias{sppanel,NULL-method} \alias{sppanel,SpatialGrid-method} \alias{sppanel,SpatialLines-method} \alias{sppanel,SpatialPixels-method} \alias{sppanel,SpatialPoints-method} \alias{sppanel,SpatialPolygons-method} \alias{sppanel,character-method} \alias{sppanel,list-method} \alias{panel.RgoogleMaps} \alias{panel.ggmap} \alias{sppanel-methods} \alias{set_col_regions} \alias{get_col_regions} \title{Plot methods for spatial data with attributes} \description{Lattice (trellis) plot methods for spatial data with attributes} \usage{ spplot(obj, ...) spplot.grid(obj, zcol = names(obj), ..., names.attr, scales = list(draw = FALSE), xlab = NULL, ylab = NULL, aspect = mapasp(obj,xlim,ylim), panel = panel.gridplot, sp.layout = NULL, formula, xlim = bbox(obj)[1, ], ylim = bbox(obj)[2, ], checkEmptyRC = TRUE, col.regions = get_col_regions()) spplot.polygons(obj, zcol = names(obj), ..., names.attr, scales = list(draw = FALSE), xlab = NULL, ylab = NULL, aspect = mapasp(obj,xlim,ylim), panel = panel.polygonsplot, sp.layout = NULL, formula, xlim = bbox(obj)[1, ], ylim = bbox(obj)[2, ], col.regions = get_col_regions()) spplot.points(obj, zcol = names(obj), ..., names.attr, scales = list(draw = FALSE), xlab = NULL, ylab = NULL, aspect = mapasp(obj,xlim,ylim), panel = panel.pointsplot, sp.layout = NULL, identify = FALSE, formula, xlim = bbexpand(bbox(obj)[1, ], 0.04), ylim = bbexpand(bbox(obj)[2, ], 0.04), edge.col = "transparent", colorkey = FALSE, col.regions = get_col_regions()) mapLegendGrob(obj, widths = unit(1, "cm"), heights = unit(1, "cm"), fill = "black", just = "right") sp.theme(set = FALSE, regions = list(col = bpy.colors(100)), ...) layout.north.arrow(type = 1) layout.scale.bar(height = 0.05) spplot.locator(n = 512, type = "n", ...) set_col_regions(value) get_col_regions() } \arguments{ \item{obj}{ object of class extending \link{Spatial-class}} \item{zcol}{ character; attribute name(s) or column number(s) in attribute table } \item{names.attr}{ names to use in panel, if different from zcol names } \item{scales}{ scales argument to be passed to Lattice plots; use \code{list(draw = TRUE)} to draw axes scales; see \link{xyplot} for full options } \item{...}{ other arguments passed to \link{levelplot} (grids, polygons) or \link{xyplot} (points) } \item{xlab}{label for x-axis } \item{ylab}{label for y-axis } \item{aspect}{aspect ratio for spatial axes; defaults to "iso" (one unit on the x-axis equals one unit on the y-axis) but may be set to more suitable values if the data are e.g. if coordinates are latitude/longitude } \item{panel}{ depending on the class of obj, \link{panel.polygonsplot} (for polygons or lines), \link{panel.gridplot} (grids) or \link{panel.pointsplot} (points) is used; for further control custom panel functions can be supplied that call one of these panel functions, but do read below how the argument \code{sp.layout} may help } \item{sp.layout}{NULL or list; see notes below} \item{identify}{ if not FALSE, identify plotted objects (currently only working for points plots). Labels for identification are the row.names of the attribute table \code{row.names(as.data.frame(obj))}. If TRUE, identify on panel \code{(1,1)}; for identifying on panel \code{i,j}, pass the value \code{c(i,j)}} \item{formula}{optional; may be useful to plot a transformed value. Defaults to \code{z~x+y} for single and \code{z~x+y|name} for multiple attributes; use e.g. \code{exp(x)~x+y|name} to plot the exponent of the z-variable} \item{xlim}{ numeric; x-axis limits } \item{ylim}{ numeric; y-axis limits } \item{edge.col}{ color of symbol edge } \item{colorkey}{ if FALSE, use symbol key; if TRUE, use continuous, levelplot-like colorkey; if list, follow syntax of argument \code{colorkey} in \link[lattice]{levelplot} (see below for an example) } \item{widths}{width of grob} \item{heights}{heights of grob} \item{fill}{fill color of grob} \item{just}{grob placement justification} \item{set}{ logical; if TRUE, trellis.par.set is called, else a list is returned that can be passed to trellis.par.set() } \item{regions}{ color ramp for the theme } \item{height}{height of scale bar; width is 1.0} \item{n}{see locator} \item{type}{see locator} \item{checkEmptyRC}{logical; if TRUE, a check is done to see if empty rows or columns are present, and need to be taken care of. Setting to FALSE may improve speed. } \item{col.regions}{ vector with fill colours; in case the variable to be plotted is a factor, this vector should have length equal to the number of factor levels } \item{value}{ vector with color values, default for \code{col.regions}} } \value{ spplot returns a lattice plot of class "trellis", if you fail to "see" it, explicitly call \code{print(spplot(...))}. If \code{identify} is TRUE, the plot is plotted and the return value is a vector with row names of the selected points. \code{spplot.locator} returns a matrix with identified point locations; use \code{trellis.focus} first to focus on a given panel. \code{get_col_regions} returns the default value for \code{col.regions} } \section{Methods}{ \describe{ \item{obj = "SpatialPixelsDataFrame"}{ see \link{spplot} } \item{obj = "SpatialGridDataFrame"}{ see \link{spplot} } \item{obj = "SpatialPolygonsDataFrame"}{ see \link{spplot} } \item{obj = "SpatialLinesDataFrame"}{ see \link{spplot} } \item{obj = "SpatialPointsDataFrame"}{ see \link{spplot} } }} \note{ Missing values in the attributes are (currently) not allowed. \code{spplot.grid}, \code{spplot.polygons} and \code{spplot.points} are S4 methods for \code{spplot}; see \link{spplot-methods}. Useful arguments that can be passed as \code{...} are: \describe{ \item{\code{layout}}{integer; for the layout of panels (cols,rows)} \item{\code{pretty}}{logical; choose colour breaks at pretty numbers?} \item{\code{at}}{specify at which values colours change} \item{\code{as.table}}{logical; start drawing panels upper-left instead of lower-left} \item{\code{page}}{to add marks to each plotted page} } for useful values see the appropriate documentation of \link{xyplot} (in case of points), and \link{levelplot} (otherwise). If \code{obj} is of SpatialPointsDataFrame, the following options are useful to pass: \describe{ \item{\code{key.space}}{ character: "bottom", "right", "left" or "right" to denote key location, or list: see argument key in the help for \link{xyplot} what the options are} \item{\code{legendEntries}}{ character; array with key legend (text) entries; suitable defaults obtained from data } \item{\code{cuts}}{number of cuts, or, for objects of class \link{SpatialPointsDataFrame} only, the actual cuts to use} \item{\code{do.log}}{logical; if TRUE use log-linear scale to divide range in equal cuts, else use a linear scale if \code{cuts} is only number of cuts } \item{\code{pch}}{ integer; plotting character to use; defaults to 16 if fill is TRUE, else 1 } \item{\code{cex}}{numeric; character expansion, proportional to default value of 1} \item{\code{fill}}{ logical; use filled circles? } } \code{layout.north.arrow} and \code{layout.scale.bar} can be used to set a north arrow or scale bar. The \code{sp.layout} argument is either a single layout item, or a list with one or more layout items. A layout item is one of \itemize{ \item{a list with one or more \code{Spatial*} objects, along with style arguments like \code{col}, \code{lty}, \code{pch}, \code{fill} etc.} \item{a list with its first argument the layout function or the name of the layout function to be called: \code{sp.points} for SpatialPoints, \code{sp.polygons} for SpatialPolygons object, \code{sp.lines} for a SpatialLines object, and \code{sp.text} for text to place. The second argument contains the object (or text) to be plotted; remaining arguments are passed to the corresponding \code{panel.*} functions.}} The order of items in \code{sp.layout} matters; objects are drawn in the order they appear. With respect to \code{obj}, default plot order and precedence of \code{sp.layout} items is as follows: for points and lines, \code{sp.layout} items are drawn over (after) \code{obj}; for grids and polygons, \code{sp.layout} items are drawn behind (before) \code{obj}. Transparency may further help making multiple things visible. Adding a \code{first} argument to a layout item overrides its default plotting order with respect to \code{obj}: Special control elements of \code{sp.layout} items: \describe{ \item{\code{first}}{logical; should the layout item be drawn before the \code{obj} (TRUE), or after (FALSE)? This overrides the default order (points and lines in front, polygons and grids behind). } \item{\code{which}}{integer; controls to which panel a layout item should be added. If \code{which} is present in the main, top-level list it applies to all layout items; in sub-lists with layout items it denotes the (set of) panel(s) in which the layout item should be drawn. Without a \code{which} item, layout items are drawn in each panel.} } \code{sp.theme} returns a lattice theme; use, after loading package \code{lattice}, the command \code{trellis.par.set(sp.theme())} after a device is opened or changed to make this work. Currently, this only sets the colors to \link{bpy.colors}. If the attributes to be plotted are of type factor, spplot tries to create a legend that reflects this. In this case, the color ramp passed needs to be of the same length as the number of factor levels. The factor levels are derived from the first map; subsequent factors with different factor levels result in an error. } \references{ \url{http://rspatial.r-forge.r-project.org/gallery/} } \seealso{\link[lattice]{xyplot}, \link[lattice]{levelplot}, \link[lattice]{panel.identify} to identify objects } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \examples{ library(lattice) trellis.par.set(sp.theme()) # sets bpy.colors() ramp demo(meuse, ask = FALSE, echo = FALSE) l2 = list("SpatialPolygonsRescale", layout.north.arrow(), offset = c(181300,329800), scale = 400) l3 = list("SpatialPolygonsRescale", layout.scale.bar(), offset = c(180500,329800), scale = 500, fill=c("transparent","black")) l4 = list("sp.text", c(180500,329900), "0") l5 = list("sp.text", c(181000,329900), "500 m") spplot(meuse, c("ffreq"), sp.layout=list(l2,l3,l4,l5), col.regions= "black", pch=c(1,2,3), key.space=list(x=0.1,y=.95,corner=c(0,1))) spplot(meuse, c("zinc", "lead"), sp.layout=list(l2,l3,l4,l5, which = 2), key.space=list(x=0.1,y=.95,corner=c(0,1))) # plotting factors: meuse$f = factor(sample(letters[6:10], 155, replace=TRUE),levels=letters[1:10]) meuse$g = factor(sample(letters[1:5], 155, replace=TRUE),levels=letters[1:10]) spplot(meuse, c("f","g"), col.regions=bpy.colors(10)) if (require(RColorBrewer)) { spplot(meuse, c("ffreq"), sp.layout=list(l2,l3,l4,l5), col.regions=brewer.pal(3, "Set1")) } meuse.grid$g = factor(sample(letters[1:5], 3103, replace=TRUE), levels=letters[1:10]) meuse.grid$f = factor(sample(letters[6:10], 3103, replace=TRUE), levels=letters[1:10]) spplot(meuse.grid, c("f","g"), col.regions=bpy.colors(10)) # example modifying colorkey for points: spplot(meuse["dist"], colorkey = list( right = list( # see ?levelplot in package trellis, argument colorkey: fun = draw.colorkey, args = list( key = list( at = seq(0, 1, .1), # colour breaks col = bpy.colors(11), # colours labels = list( at = c(0, .2, .4, .6, .8, 1), labels = c("0x", "20x", "40x", "60x", "80x", "100x") ) ) ) ) )) l6 = list(meuse.grid["dist"], col = grey(seq(.5,.9,length.out=10))) spplot(meuse, c("zinc", "lead"), sp.layout = l6) spplot(meuse, c("zinc", "lead"), sp.layout = list(meuse.grid, meuse.riv, col = 'grey')) # Custom legend placement, taken from # http://stackoverflow.com/questions/29344692/custom-placement-of-spplot-legend-in-the-map s <- spplot(meuse.grid[,'dist'], colorkey = list(space = "left", height = 0.4)) args <- s$legend$left$args$key ## Prepare list of arguments needed by `legend=` argument (as described in ?xyplot) library(lattice) # draw.colorkey legendArgs <- list(fun = draw.colorkey, args = list(key = args), corner = c(0.05,.75)) ## Call spplot() again, this time passing in to legend the arguments ## needed to print a color key spplot(meuse.grid[,'dist'], colorkey = FALSE, legend = list(inside = legendArgs)) } \keyword{dplot} sp/man/spTransform.Rd0000644000176200001440000000154612577541412014272 0ustar liggesusers\name{spTransform} \alias{spTransform-methods} \alias{spTransform,Spatial,CRS-method} \alias{spTransform,Spatial,character-method} \alias{spTransform,Spatial,ANY-method} \alias{spTransform} \title{ spTransform for map projection and datum transformation } \description{ spTransform for map projection and datum transformation } \usage{ spTransform(x, CRSobj, ...) } \arguments{ \item{x}{ object to be transformed } \item{CRSobj}{ object of class \link{CRS}, or of class \code{character} in which case it is converted to \link{CRS}} \item{...}{further arguments (ignored) } } \value{ object with coordinates transformed to the new coordinate reference system. } \note{ Package \code{rgdal} provides the methods doing actual transformation, see \link[rgdal]{spTransform}; when \code{rgdal} cannot be loaded, an error message follows. } \keyword{methods} \keyword{spatial} sp/man/is.projected.Rd0000644000176200001440000000504512577541412014343 0ustar liggesusers\name{is.projected} \alias{is.projected} \alias{proj4string} \alias{proj4string<-} \alias{is.projected,Spatial-method} \alias{proj4string,Spatial-method} \alias{proj4string<-,Spatial,CRS-method} \alias{proj4string<-,Spatial,character-method} \alias{get_ll_warn} \alias{get_ll_TOL} \alias{set_ll_warn} \alias{set_ll_TOL} \alias{get_ReplCRS_warn} \alias{set_ReplCRS_warn} \title{ Sets or retrieves projection attributes on classes extending SpatialData } \description{ Sets or retrieves projection attributes on classes extending SpatialData; set or retrieve option value for error or warning on exceedance of geographical coordinate range, set or retrieve option value for exceedance tolerance of geographical coordinate range. Note that only \dQuote{+proj=longlat +ellps=WGS84} is accepted for geographical coordinates, which must be ordered (eastings, northings); the \dQuote{+ellps=} definition must be given (or expanded internally from a given \dQuote{+datum=} value) for recent versions of the PROJ.4 library, and should be set to an appropriate value.} \usage{ is.projected(obj) proj4string(obj) proj4string(obj) <- value get_ll_warn() get_ll_TOL() get_ReplCRS_warn() set_ll_warn(value) set_ll_TOL(value) set_ReplCRS_warn(value) } \arguments{ \item{obj}{An object of class or extending \link{Spatial-class}} \item{value}{For \code{proj4string} CRS object, containing a valid proj4 string; attempts to assign an object containing \dQuote{longlat} to data extending beyond longitude [-180, 360] or lattitude [-90, 90] will be stopped. For \code{set_ll_warn} a single logical value, if FALSE (default) error on range exceedance, if TRUE, warning. For \code{set_ll_TOL} the value of the power of \code{.Machine$double.eps} (default 0.25) to use as tolerance in testing range exceedance. \code{set_ReplCRS_warn} may be used to turn off warnings issued when changing object CRS with the \code{proj4string} replacement method (by setting \code{value=FALSE}).} } \value{ \code{is.projected} returns a logical that may be \code{NA}; \code{proj4string} returns a character vector of length 1.} \details{ proj4 strings are operative through CRAN package rgdal. For strings defined as \dQuote{longlat}, the minimum longitude should be -180, the maximum longitude 360, the minimum latitude -90, and the maximum latitude 90. Note that the \code{proj4string} replacement method does not project spatial data - for this use \code{spTransform} methods in the rgdal package.} \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \link{CRS} } %\examples{} \keyword{spatial} sp/man/dimensions.Rd0000644000176200001440000000150612577541412014120 0ustar liggesusers\name{dimensions-methods} \docType{methods} \alias{dimensions,Spatial-method} \alias{dimensions} \title{ retrieve spatial dimensions from spatial data} \description{ retrieves spatial dimensions box from spatial data } \usage{ dimensions(obj) } \arguments{ \item{obj}{ object deriving from class "Spatial" } } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ object deriviving from class "Spatial" } }} \value{ two-column matrix; the first column has the minimum, the second the maximum values; rows represent the spatial dimensions} \keyword{methods} \examples{ # just 9 points on a grid: x <- c(1,1,1,2,2,2,3,3,3) y <- c(1,2,3,1,2,3,1,2,3) xy <- cbind(x,y) S <- SpatialPoints(xy) dimensions(S) # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE dimensions(meuse.grid) } \keyword{methods} sp/man/Spatial-class.Rd0000644000176200001440000001301312654360164014443 0ustar liggesusers\name{Spatial-class} \docType{class} \alias{Spatial-class} \alias{Spatial} \alias{print.summary.Spatial} \alias{subset.Spatial} \alias{cbind.Spatial} \alias{head.Spatial} \alias{tail.Spatial} \alias{summary,Spatial-method} \alias{plot,Spatial,missing-method} \alias{getParUsrBB} \alias{setParUsrBB} \alias{coordinates<-,Spatial-method} \alias{[[<-,Spatial,ANY,missing-method} \alias{[<-,Spatial-method} \alias{[[,Spatial,ANY,missing-method} \alias{$<-,Spatial-method} \alias{$,Spatial-method} \alias{im-class} \alias{owin-class} \alias{ppp-class} \alias{psp-class} \title{Class "Spatial"} \description{ An abstract class from which useful spatial classes are derived } \section{Objects from the Class}{ are never to be generated; only derived classes can be meaningful } \section{Slots}{ \describe{ \item{\code{bbox}:}{Object of class \code{"matrix"}; 2-column matrix holding the minimum in first and maximum in second column for the x-coordinate (first row), y-coordinate (second row) and optionally, for points and grids only, further coordinates. The constructed Spatial object will be invalid if any bbox values are NA or infinite. The column names must be \code{c("min", "max")}} \item{\code{proj4string}:}{Object of class \code{"CRS"}; holding a valid proj4 string, which can be used for unprojecting or reprojecting coordinates; it is initialised to NA. Other strings are checked for validity in the rgdal package, but attempts to assign a string containing "longlat" to data extending beyond longitude [-180, 360] or lattitude [-90, 90] will be stopped or warned, use \code{\link{set_ll_warn}} to warn rather than stop, and \code{\link{set_ll_TOL}} to change the default tolerance for the range exceedance tests.} } } \section{Methods}{ \describe{ \item{bbox}{\code{signature(obj = "Spatial")}: retrieves the bbox element } \item{dimensions}{\code{signature(obj = "Spatial")}: retrieves the number of spatial dimensions spanned } \item{gridded}{\code{signature(obj = "Spatial")}: logical, tells whether the data is on a regular spatial grid } \item{plot}{\code{signature(x = "Spatial", y = "missing")}: plot method for spatial objects; does nothing but setting up a plotting region choosing a suitable aspect if not given(see below), colouring the plot background using either a bg= argument or par("bg"), and possibly drawing axes. } \item{summary}{\code{signature(object = "Spatial")}: summarize object} \item{\code{$}}{ retrieves attribute column } \item{\code{$<-}}{ sets or replaces attribute column, or promote a geometry-only object to an object having an attribute } } } \usage{ Spatial(bbox, proj4string = CRS(as.character(NA))) \method{subset}{Spatial}(x, subset, select, drop = FALSE, \dots) } \arguments{ \item{bbox}{a bounding box matrix} \item{proj4string}{a CRS object} \item{x}{object of class Spatial} \item{subset}{see \link{subset.data.frame}} \item{select}{see \link{subset.data.frame}} \item{drop}{see \link{subset.data.frame}} \item{...}{passed through} } \section{plot method arguments}{ The plot method for \dQuote{Spatial} objects takes the following arguments: \describe{ \item{x}{object of class Spatial} \item{xlim}{default NULL; the x limits (x1, x2) of the plot} \item{ylim}{default NULL; the y limits of the plot} \item{asp}{default NA; the y/x aspect ratio} \item{axes}{default FALSE; a logical value indicating whether both axes should be drawn } \item{bg}{default \code{par("bg")}; colour to be used for the background of the device region} \item{xaxs}{ The style of axis interval calculation to be used for the x-axis} \item{yaxs}{ The style of axis interval calculation to be used for the y-axis} \item{lab}{A numerical vector of the form \code{c(x, y, len)} which modifies the default way that axes are annotated} \item{setParUsrBB}{default FALSE; set the \code{par} \dQuote{usr} bounding box; see below} \item{bgMap}{object of class \code{ggmap}, or returned by function \code{RgoogleMaps::GetMap}} \item{expandBB}{ numeric; factor to expand the plotting region default: \code{bbox(x)} with on each side (1=below, 2=left, 3=above and 4=right); defaults to \code{c(0,0,0,0)}; setting \code{xlim} or \code{ylim} overrides this. } \item{...}{passed through} } } \author{ r-spatial team; Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} Roger Bivand, Barry Rowlingson, Virgilio G\'omez-Rubio } \note{ The default aspect for map plots is 1; if however data are not projected (coordinates are longlat), the aspect is by default set to 1/cos(My * pi)/180) with My the y coordinate of the middle of the map (the mean of ylim, which defaults to the y range of bounding box). The argument \code{setParUsrBB} may be used to pass the logical value \code{TRUE} to functions within \code{plot.Spatial}. When set to \code{TRUE}, par(\dQuote{usr}) will be overwritten with \code{c(xlim, ylim)}, which defaults to the bounding box of the spatial object. This is only needed in the particular context of graphic output to a specified device with given width and height, to be matched to the spatial object, when using par(\dQuote{xaxs}) and par(\dQuote{yaxs}) in addition to \code{par(mar=c(0,0,0,0))}. } \section{Warning }{this class is not useful in itself, but all spatial classes in this package derive from it } \seealso{ \code{\link{SpatialPoints-class}}, \code{\link{SpatialGrid-class}}, % \code{\link{SpatialPolygons-class}}, % \code{\link{SpatialArcs-class}}, \code{\link{SpatialPointsDataFrame-class}}, \code{\link{SpatialGridDataFrame-class}} % \code{\link{SpatialPolygonsDataFrame-class}}, } %\examples{} \keyword{classes} sp/man/SpatialMultiPointsDataFrame-class.Rd0000644000176200001440000000515312630666540020427 0ustar liggesusers\name{SpatialMultiPointsDataFrame-class} \docType{class} \alias{SpatialMultiPointsDataFrame-class} \alias{[,SpatialMultiPointsDataFrame-method} \alias{coerce,SpatialMultiPointsDataFrame,data.frame-method} %\alias{coerce,SpatialMultiPointsDataFrame,SpatialMultiPoints-method} \alias{coerce,SpatialMultiPointsDataFrame,SpatialPointsDataFrame-method} \alias{show,SpatialMultiPointsDataFrame-method} \alias{points,SpatialMultiPointsDataFrame-method} \alias{coordinates,SpatialMultiPointsDataFrame-method} \alias{as.data.frame.SpatialMultiPointsDataFrame} \alias{dim.SpatialMultiPointsDataFrame} \alias{print.SpatialMultiPointsDataFrame} %\alias{as.SpatialMultiPoints.SpatialMultiPointsDataFrame} \alias{rbind.SpatialMultiPointsDataFrame} \alias{row.names.SpatialMultiPointsDataFrame} \title{Class "SpatialMultiPointsDataFrame" } \description{ Class for spatial attributes that correspond to point sets } \section{Slots}{ \describe{ \item{\code{data}:}{Object of class data.frame containing the attribute data (may or may not contain the coordinates in its columns) } \item{\code{coords}:}{Object of class \code{"list"}; the list with coordinates matrices; points are rows in the matrix, the list length equals the number of rows in the \code{data} slot } \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box} \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection string} } } \section{Extends}{ Class \code{"SpatialMultiPoints"}, directly. Class \code{"Spatial"}, by class \code{"SpatialMultiPoints"}. } \usage{ \S4method{[}{SpatialMultiPointsDataFrame}(x, i, j, ..., drop = TRUE) \S4method{coerce}{SpatialMultiPointsDataFrame,data.frame}(from, to, strict=TRUE) \S4method{coordinates}{SpatialMultiPointsDataFrame}(obj) \S4method{show}{SpatialMultiPointsDataFrame}(object) \S4method{points}{SpatialMultiPointsDataFrame}(x) } \arguments{ \item{x,from,obj,object}{\code{SpatialMultiPointsDataFrame} object} \item{to}{class to which to coerce} \item{strict}{see \code{\link[methods]{as}}} \item{i}{row indices} \item{j}{column indices} \item{drop}{see \code{\link[base]{Extract}}} \item{...}{indices passed through} } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{coordinates}}, \code{\link{SpatialMultiPoints-class}} } \examples{ # create three sets of points: cl1 = cbind(rnorm(3, 10), rnorm(3, 10)) cl2 = cbind(rnorm(5, 10), rnorm(5, 0)) cl3 = cbind(rnorm(7, 0), rnorm(7, 10)) mpdf = SpatialMultiPointsDataFrame(list(cl1, cl2, cl3), data.frame(a = 1:3)) mpdf plot(mpdf, col = mpdf$a, cex = 1:3) as(mpdf, "data.frame") mpdf[1:2,] } \keyword{classes} sp/man/gridindex2nb.Rd0000644000176200001440000000237112577541412014330 0ustar liggesusers\name{gridIndex2nb} \alias{gridIndex2nb} \title{create neighbourhood (nb) object from grid geometry} \description{create neighbourhood (nb) object from grid geometry} \usage{ gridIndex2nb(obj, maxdist = sqrt(2), fullMat = TRUE, ...) } \arguments{ \item{obj}{object of class \link{SpatialGrid} or \link{SpatialPixels}} \item{maxdist}{ maximum distance to be considered (inclusive), expressed in number of grid cell (sqrt(2) results in queen neighbours) } \item{fullMat}{ use \link{dist} to compute distances from grid (row/col) indices; FALSE avoids forming the full distance matrix, at a large performance cost } \item{...}{ arguments passed on to \link{dist}} } \value{Object of class nb, which is a list. The nb object follows the convention of nb objects in package spdep; it is a list with each list element corresponding to a grid cell or pixel; the list element contains the indices of neighbours defined as cells less than maxdist away, measured in cell unit (N/S/E/W neighbour has distance 1). } \note{ Unequal grid cell size is ignored; grid cell row/col indices are taken to be the coordinates from which distances are computed. } \seealso{plot.nb in package spdep} \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } %\examples{} \keyword{manip} sp/man/Rlogo.Rd0000644000176200001440000000221612577541412013031 0ustar liggesusers\name{Rlogo} \alias{Rlogo} \alias{gt} \docType{data} \title{Rlogo jpeg image} \description{ Rlogo jpeg image data as imported by \code{getRasterData} in the rgdal package } \usage{data(Rlogo)} \format{ The format is: int [1:101, 1:77, 1:3] 255 255 255 255 255 255 255 255 255 255 ... } \examples{ \dontrun{ library(rgdal) logo <- system.file("pictures/Rlogo.jpg", package="rgdal")[1] x <- GDAL.open(logo) gt = .Call('RGDAL_GetGeoTransform', x, PACKAGE="rgdal") data <- getRasterData(x) GDAL.close(x) } data(Rlogo) d = dim(Rlogo) cellsize = abs(c(gt[2],gt[6])) cells.dim = c(d[1], d[2]) # c(d[2],d[1]) cellcentre.offset = c(x = gt[1] + 0.5 * cellsize[1], y = gt[4] - (d[2] - 0.5) * abs(cellsize[2])) grid = GridTopology(cellcentre.offset, cellsize, cells.dim) df = as.vector(Rlogo[,,1]) for (band in 2:d[3]) df = cbind(df, as.vector(Rlogo[,,band])) df = as.data.frame(df) names(df) = paste("band", 1:d[3], sep="") Rlogo <- SpatialGridDataFrame(grid = grid, data = df) summary(Rlogo) spplot(Rlogo, zcol=1:3, names.attr=c("red","green","blue"), col.regions=grey(0:100/100), main="example of three-layer (RGB) raster image", as.table=TRUE) } \keyword{datasets} sp/man/SpatialPointsDataFrame-class.Rd0000644000176200001440000000645512577541412017422 0ustar liggesusers\name{SpatialPointsDataFrame-class} \docType{class} \alias{SpatialPointsDataFrame-class} \alias{[,SpatialPointsDataFrame-method} \alias{coerce,SpatialPointsDataFrame,data.frame-method} \alias{coerce,SpatialPointsDataFrame,SpatialPoints-method} \alias{show,SpatialPointsDataFrame-method} \alias{points,SpatialPointsDataFrame-method} \alias{coordinates,SpatialPointsDataFrame-method} \alias{as.data.frame.SpatialPointsDataFrame} \alias{dim.SpatialPointsDataFrame} \alias{print.SpatialPointsDataFrame} \alias{ShowSpatialPointsDataFrame} \alias{as.SpatialPoints.SpatialPointsDataFrame} \alias{rbind.SpatialPointsDataFrame} \alias{row.names.SpatialPointsDataFrame} \alias{coerce,ppp,SpatialPointsDataFrame-method} \title{Class "SpatialPointsDataFrame" } \description{ Class for spatial attributes that have spatial point locations } \section{Objects from the Class}{ Objects can be created by calls of the form \code{coordinates(x) = c("x", "y") }. or of the form \code{coordinates(x) = xy}; see \link{coordinates}. } \section{Slots}{ \describe{ \item{\code{data}:}{Object of class data.frame containing the attribute data (may or may not contain the coordinates in its columns) } \item{\code{coords}:}{Object of class \code{"matrix"}; the coordinates matrix (points are rows in the matrix) } \item{\code{coords.nrs}}{Object of class logical; if TRUE, when the object was created the coordinates were retrieved from the data.frame, and hence stripped from it; after coercion to data.frame, e.g. by as.data.frame(x), coordinates will again be added (as first few columns) to the data.frame } \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box} \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection string} } } \section{Extends}{ Class \code{"SpatialPoints"}, directly. Class \code{"Spatial"}, by class \code{"SpatialPoints"}. } \usage{ \S4method{[}{SpatialPointsDataFrame}(x, i, j, ..., drop = TRUE) \S4method{coerce}{SpatialPointsDataFrame,SpatialPoints}(from, to, strict=TRUE) \S4method{coerce}{SpatialPointsDataFrame,data.frame}(from, to, strict=TRUE) \S4method{coordinates}{SpatialPointsDataFrame}(obj) \S4method{show}{SpatialPointsDataFrame}(object) \S4method{points}{SpatialPointsDataFrame}(x) \method{rbind}{SpatialPointsDataFrame}(...) } \arguments{ \item{x,from,obj,object}{\code{SpatialPointsDataFrame} object} \item{to}{class to which to coerce} \item{strict}{see \code{\link[methods]{as}}} \item{i}{row indices} \item{j}{column indices} \item{drop}{see \code{\link[base]{Extract}}} \item{...}{indices passed through} } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{coordinates}}, \code{\link{SpatialPoints-class}} } \examples{ data(meuse) xy = meuse[c("x", "y")] # retrieve coordinates as data.frame class(meuse) data(meuse) # reload data.frame coordinates(meuse) = c("x", "y") # specify column names class(meuse) data(meuse) # reload data.frame coordinates(meuse) = c(1, 2) # specify column names class(meuse) data(meuse) # reload data.frame coordinates(meuse) = ~x+y # formula class(meuse) data(meuse) # reload data.frame coordinates(meuse) = xy # as data frame class(meuse) data(meuse) # reload data.frame coordinates(meuse) = as.matrix(xy) # as matrix meuse$log.zn = log(meuse$zinc) class(meuse) dim(meuse) } \keyword{classes} sp/man/recenter-methods.Rd0000644000176200001440000000423512577541412015222 0ustar liggesusers\name{recenter-methods} \docType{methods} \alias{recenter-methods} \alias{recenter} \alias{recenter,SpatialPolygons-method} \alias{recenter,Polygons-method} \alias{recenter,Polygon-method} \alias{recenter,SpatialLines-method} \alias{recenter,Lines-method} \alias{recenter,Line-method} \title{Methods for Function recenter in Package `sp'} \description{ Methods for function \code{recenter} in package \pkg{sp} to shift or re-center geographical coordinates for a Pacific view. All longitudes < 0 are added to 360, to avoid for instance parts of Alaska being represented on the far left and right of a plot because they have values straddling 180 degrees. In general, using a projected coordinate reference system is to be prefered, but this method permits a geographical coordinate reference system to be used. This idea was suggested by Greg Snow, and corresponds to the two world representations in the \pkg{maps} package. } \section{Methods}{ \describe{ \item{obj = "SpatialPolygons"}{recenter a SpatialPolygons object} \item{obj = "Polygons"}{recenter a Polygons object } \item{obj = "Polygon"}{recenter an Polygon object } \item{obj = "SpatialLines"}{recenter a SpatialLines object } \item{obj = "Lines"}{recenter a Lines object } \item{obj = "Line"}{recenter an Line object } }} \examples{ crds <- matrix(c(179, -179, -179, 179, 50, 50, 52, 52), ncol=2) SL <- SpatialLines(list(Lines(list(Line(crds)), "1")), CRS("+proj=longlat +ellps=WGS84")) bbox(SL) SLr <- recenter(SL) bbox(SLr) rcrds <- rbind(crds, crds[1,]) SpP <- SpatialPolygons(list(Polygons(list(Polygon(rcrds)), ID="r1")), proj4string=CRS("+proj=longlat +ellps=WGS84")) bbox(SpP) SpPr <- recenter(SpP) bbox(SpPr) opar <- par(mfrow=c(1,2)) plot(SpP) plot(SpPr) par(opar) crds <- matrix(c(-1, 1, 1, -1, 50, 50, 52, 52), ncol=2) SL <- SpatialLines(list(Lines(list(Line(crds)), "1")), CRS("+proj=longlat +ellps=WGS84")) bbox(SL) SLr <- recenter(SL) bbox(SLr) rcrds <- rbind(crds, crds[1,]) SpP <- SpatialPolygons(list(Polygons(list(Polygon(rcrds)), ID="r1")), proj4string=CRS("+proj=longlat +ellps=WGS84")) bbox(SpP) SpPr <- recenter(SpP) bbox(SpPr) opar <- par(mfrow=c(1,2)) plot(SpP) plot(SpPr) par(opar) } \keyword{methods} sp/man/as.SpatialPolygons.PolygonsList.Rd0000644000176200001440000000633412577541412020153 0ustar liggesusers\name{as.SpatialPolygons.PolygonsList} \alias{as.SpatialPolygons.PolygonsList} %\alias{as.SpatialPolygons.Shapes} %\alias{as.SpatialPolygons.map} %\alias{as.SpatialPolygons.pal} %- Also NEED an '\alias' for EACH other topic documented here. \title{Making SpatialPolygons objects} \description{ This function is used in making SpatialPolygons objects from other formats. } \usage{ as.SpatialPolygons.PolygonsList(Srl, proj4string=CRS(as.character(NA))) %as.SpatialPolygons.Shapes(shapes, IDs, proj4string=CRS(as.character(NA))) %as.SpatialPolygons.map(map, IDs, proj4string=CRS(as.character(NA))) %as.SpatialPolygons.pal(arc, pal, IDs, dropPoly1=TRUE, proj4string=CRS(as.character(NA))) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{Srl}{A list of Polygons objects} % \item{shapes}{The Shapes component of a Map object as read by \code{read.shape}} % \item{IDs}{Unique character ID values for each output Polygons object; the input IDs can be an integer or character vector with duplicates, where the duplicates will be combined as a single output Polygons object} \item{proj4string}{Object of class \code{"CRS"}; holding a valid proj4 string} % \item{map}{Object returned by \code{map} containing polygon boundaries} % \item{arc}{Object returned by \code{get.arcdata}} % \item{pal}{Object returned by \code{get.paldata}} % \item{dropPoly1}{Should the first polygon in the AVC or e00 data be dropped; the first polygon is typically the compound boundary of the whole dataset, and can be detected by looking at the relative lengths of the list components in the second component of pal, which are the numbers of arcs making up the boundary of each polygon} } \value{ The functions return a SpatialPolygons object } \author{ Roger Bivand } \examples{ %\dontrun{ %library(maptools) %nc.shp <- read.shape(system.file("shapes/sids.shp", package="maptools")[1]) %} %data(ncshp) %nc1 <- as.SpatialPolygons.Shapes(nc.shp$Shapes, as.character(nc.shp$att.data$FIPS)) %plot(nc1) %invisible(text(coordinates(nc1), labels=getSpPPolygonsIDSlots(nc1), cex=0.6)) %\dontrun{ %library(maps) %ncmap <- map("county", "north carolina", fill=TRUE, col="transparent", plot=FALSE) %} %data(ncmap) %IDs <- sapply(strsplit(ncmap$names, "[,:]"), function(x) x[2]) %nc2 <- as.SpatialPolygons.map(ncmap, IDs) %plot(nc2) %invisible(text(coordinates(nc2), labels=getSpPPolygonsIDSlots(nc2), cex=0.6)) %\dontrun{ %library(RArcInfo) %fl <- "http://www.census.gov/geo/cob/bdy/co/co90e00/co37_d90_e00.zip" %download.file(fl, "co37_d90_e00.zip") %e00 <- zip.file.extract("co37_d90.e00", "co37_d90_e00.zip") %e00toavc(e00, "nc") %arc <- get.arcdata(".", "nc") %pal <- get.paldata(".", "nc") %pat <- get.tabledata("info", "NC.PAT") %} %data(co37_d90_arc) %data(co37_d90_pal) %sapply(pal[[2]], function(x) length(x[[1]])) %data(co37_d90_pat) %IDs <- paste(pat$ST[-1], pat$CO[-1], sep="") %nc3 <- as.SpatialPolygons.pal(arc, pal, IDs=IDs) %plot(nc3) %invisible(text(coordinates(nc3), labels=sapply(slot(nc3, "polygons"), function(i) slot(i, "ID")), cex=0.6)) grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as.SpatialPolygons.GridTopology(grd) plot(polys) text(coordinates(polys), labels=sapply(slot(polys, "polygons"), function(i) slot(i, "ID")), cex=0.6) } \keyword{spatial} sp/man/bbox.Rd0000644000176200001440000000250212577541412012677 0ustar liggesusers\name{bbox-methods} \docType{methods} \alias{bbox,Spatial-method} \alias{bbox,ANY-method} \alias{bbox,Line-method} \alias{bbox,Lines-method} \alias{bbox,Polygon-method} \alias{bbox,Polygons-method} \alias{bbox} \title{ retrieve bbox from spatial data} \description{ retrieves spatial bounding box from spatial data } \usage{ bbox(obj) } \arguments{ \item{obj}{ object deriving from class "Spatial", or one of classes: "Line", "Lines", "Polygon" or "Polygons", or ANY, which requires obj to be an array with at least two columns } } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ object deriving from class "Spatial" } \item{obj = "ANY"}{ an array with at least two columns } \item{obj = "Line"}{ object deriving from class "Line" } \item{obj = "Lines"}{ object deriving from class "Lines" } \item{obj = "Polygon"}{ object deriving from class "Polygon" } \item{obj = "Polygons"}{ object deriving from class "Polygons" } }} \value{ two-column matrix; the first column has the minimum, the second the maximum values; rows represent the spatial dimensions} \keyword{methods} \examples{ # just 9 points on a grid: x <- c(1,1,1,2,2,2,3,3,3) y <- c(1,2,3,1,2,3,1,2,3) xy <- cbind(x,y) S <- SpatialPoints(xy) bbox(S) # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE bbox(meuse.grid) } \keyword{spatial} sp/man/coordinates.Rd0000644000176200001440000000264512577541412014267 0ustar liggesusers\name{coordinates} \alias{coordinates} \alias{coordinates<-} \title{ set spatial coordinates to create a Spatial object, or retrieve spatial coordinates from a Spatial object} \description{ set spatial coordinates to create a Spatial object, or retrieve spatial coordinates from a Spatial object} \usage{ coordinates(obj, ...) coordinates(object) <- value } \arguments{ \item{obj}{ object deriving from class "Spatial" } \item{object}{ object of class "data.frame" } \item{value}{ spatial coordinates; either a matrix, list, or data frame with numeric data, or column names, column number or a reference: a formula (in the form of e.g. \code{~x+y}), column numbers (e.g. \code{c(1,2)}) or column names (e.g. \code{c("x","y")}) specifying which columns in \code{object} are the spatial coordinates. If the coordinates are part of object, giving the reference does not duplicate them, giving their value does duplicate them in the resulting structure. } \item{...}{additional arguments that may be used by particular methods} } \value{ usually an object of class SpatialPointsDataFrame; if the coordinates set cover the full set of variables in object, an object of class SpatialPoints is returned } \examples{ # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE class(meuse.grid) bbox(meuse.grid) data(meuse) meuse.xy = meuse[c("x", "y")] coordinates(meuse.xy) <- ~x+y class(meuse.xy) } \keyword{manip} sp/man/SpatialPolygons-class.Rd0000644000176200001440000001260412647452647016215 0ustar liggesusers\name{SpatialPolygons-class} \docType{class} \alias{SpatialPolygons-class} \alias{[,SpatialPolygons-method} \alias{as.data.frame.SpatialPolygons} \alias{as.SpatialPolygonsDataFrame.SpatialPolygons} \alias{coerce,SpatialPolygons,SpatialPolygonsDataFrame-method} \alias{plot,SpatialPolygons,missing-method} \alias{summary,SpatialPolygons-method} \alias{rbind.SpatialPolygons} \alias{coerce,Polygons,Lines-method} \alias{coerce,SpatialPolygons,SpatialLines-method} \alias{coerce,deldir,SpatialPolygons-method} \alias{row.names.SpatialPolygons} \alias{get_Polypath} \alias{set_Polypath} \alias{get_PolypathRule} \alias{set_PolypathRule} \title{Class "SpatialPolygons"} \description{ class to hold polygon topology (without attributes) } \section{Objects from the Class}{ Objects can be created by calls to the function \link{SpatialPolygons} } \section{Slots}{ \describe{ \item{\code{polygons}:}{Object of class \code{"list"}; list elements are all of class \link{Polygons-class}} \item{\code{plotOrder}:}{Object of class \code{"integer"}; integer array giving the order in which objects should be plotted } \item{\code{bbox}:}{Object of class \code{"matrix"}; see \link{Spatial-class} } \item{\code{proj4string}:}{Object of class \code{"CRS"}; see \link{CRS-class}} } } \section{Extends}{ Class \code{"Spatial"}, directly. } \section{Methods}{ Methods defined with class "SpatialPolygons" in the signature: \describe{ \item{[}{\code{signature(obj = "SpatialPolygons")}: select subset of (sets of) polygons; NAs are not permitted in the row index} \item{plot}{\code{signature(x = "SpatialPolygons", y = "missing")}: plot polygons in SpatialPolygons object} \item{summary}{\code{signature(object = "SpatialPolygons")}: summarize object} \item{rbind}{\code{signature(object = "SpatialPolygons")}: rbind-like method} } } \section{plot method arguments}{ The \code{plot} method for spatial polygons takes the following arguments: \describe{ \item{x}{a SpatialPolygons object} \item{col}{a vector of colour values} \item{border}{default \code{par("fg")}; the colour to draw the border} \item{add}{default FALSE; if TRUE, add to existing plot} \item{xlim, ylim}{default NULL; ranges for the plotted \sQuote{x} and \sQuote{y} values} \item{xpd}{default NULL; controls clipping, see \code{\link[graphics]{par}}} \item{density}{default NULL; the density of shading lines, in lines per inch, see \code{\link[graphics]{polygon}}} \item{angle}{default 45; the slope of shading lines, given as an angle in degrees (counter-clockwise), see \code{\link[graphics]{polygon}}} \item{pbg}{default NULL, set to \code{par("bg")} by default \dQuote{transparent}; the colour to paint holes} \item{axes}{default FALSE; draw axes} \item{lty}{default \code{par("lty")}; border line type} \item{...}{other arguments passed through} \item{setParUsrBB}{default FALSE; see \code{\link{Spatial-class}} for further details} \item{usePolypath}{default NULL to set from option value; use \code{\link[graphics]{polypath}} for hole-handling in plot} \item{rule}{default NULL to set from option value; character value specifying the path fill mode, see \code{\link[graphics]{polypath}}} } The options for \code{usePolypath} and \code{rule} may be retrieved with \code{get_Polypath} (default TRUE on package load) and \code{get_PolypathRule} (default \dQuote{winding} on package load), and set with \code{set_Polypath} and \code{set_PolypathRule} The class definitions used for polygons in \pkg{sp} do not accord with those of the simple features specification of the Open Geospatial Consortium. The \pkg{rgeos} package, an interface to Geometry Engine -- Open Source (GEOS), uses this specification, in which each hole (interior ring) must be associated with its containing exterior ring. In order to avoid introducing incompatible changes into the class definition of Polygons objects, a comment has been added as a single character string to each such object. Here we can trust the data source to assign the hole status correctly, and use the simple function \code{\link[rgeos]{createSPComment}} to add such comments to each Polygons member of the polygons slot of this SpatialPolygons object. Exterior rings are coded zero, while interior rings are coded with the 1-based index of the exterior ring to which they belong. SpatialPolygons objects created by reading using \code{\link[rgdal]{readOGR}} from \pkg{rgdal} have the comments set on input, as OGR also uses SFS. } \note{ \code{rbind} calls the function \code{\link{SpatialPolygons}}, where it is checked that all IDs are unique. If \code{rbind}-ing \code{SpatialPolygons} without unique IDs, it is possible to set the argument \code{makeUniqueIDs = TRUE}, although it is preferred to change these explicitly with \code{\link{spChFIDs}}. } \author{ Roger Bivand } \seealso{ \code{\link{SpatialPolygons}} } \examples{ # simple example, from vignette("sp"): Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) plot(SpP, col = 1:3, pbg="white") grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as(grd, "SpatialPolygons") plot(polys) text(coordinates(polys), labels=row.names(polys)) } \keyword{classes} sp/man/SpatialLines-class.Rd0000644000176200001440000000644312647452622015452 0ustar liggesusers\name{SpatialLines-class} \docType{class} \alias{SpatialLines-class} % \alias{coordinates,SpatialLines-method} \alias{[,SpatialLines-method} \alias{plot,SpatialLines,missing-method} \alias{summary,SpatialLines-method} \alias{rbind.SpatialLines} \alias{coerce,SpatialLines,SpatialPoints-method} \alias{coerce,SpatialLines,SpatialPointsDataFrame-method} \alias{coerce,Lines,SpatialPoints-method} \alias{coerce,Lines,SpatialMultiPoints-method} \alias{coerce,SpatialLines,SpatialMultiPoints-method} \alias{coerce,deldir,SpatialLines-method} \alias{row.names.SpatialLines} \title{a class for spatial lines } \description{ a class that holds spatial lines } \section{Objects from the Class}{ hold a list of Lines objects; each Lines object holds a list of Line (line) objects. } \section{Slots}{ \describe{ \item{\code{lines}:}{Object of class \code{"list"}; list members are all of class \link{Lines-class}} \item{\code{bbox}:}{Object of class \code{"matrix"}; see \link{Spatial-class} } \item{\code{proj4string}:}{Object of class \code{"CRS"}; see \link{CRS-class}} } } \section{Extends}{ Class \code{"Spatial"}, directly. } \section{Methods}{ \describe{ \item{[}{\code{signature(obj = "SpatialLines")}: select subset of (sets of) lines; NAs are not permitted in the row index} \item{coordinates}{ value is a list of lists with matrices } \item{plot}{\code{signature(x = "SpatialLines", y = "missing")}: plot lines in SpatialLines object} \item{lines}{\code{signature(x = "SpatialLines")}: add lines in SpatialLines object to a plot } \item{rbind}{\code{signature(object = "SpatialLines")}: rbind-like method, see notes } \item{summary}{\code{signature(object = "SpatialLines")}: summarize object } } } \note{ \code{rbind} calls the function \code{\link{SpatialLines}}, where it is checked that all IDs are unique. If \code{rbind}-ing \code{SpatialLines} without unique IDs, it is possible to set the argument \code{makeUniqueIDs = TRUE}, although it is preferred to change these explicitly with \code{\link{spChFIDs}}. } \section{plot method arguments}{ The plot method for \dQuote{SpatialLines} objects takes the following arguments: \describe{ \item{x}{object of class SpatialLines} \item{xlim}{default NULL; the x limits (x1, x2) of the plot} \item{ylim}{default NULL; the y limits of the plot} \item{col}{default 1; default plotting color} \item{lwd}{default 1; line width} \item{lty}{default 1; line type} \item{add}{default FALSE; add to existing plot} \item{axes}{default FALSE; a logical value indicating whether both axes should be drawn } \item{lend}{default 0; line end style} \item{ljoin}{default 0; line join style} \item{lmitre}{default 10; line mitre limit} \item{...}{passed through} \item{setParUsrBB}{set the \code{par} \dQuote{usr} bounding box, see note in \link{Spatial-class}} } } \author{ Roger Bivand, Edzer Pebesma } \seealso{ \link{Line-class}, \link{Lines-class} } \examples{ # from the sp vignette: l1 = cbind(c(1,2,3),c(3,2,2)) rownames(l1) = letters[1:3] l1a = cbind(l1[,1]+.05,l1[,2]+.05) rownames(l1a) = letters[1:3] l2 = cbind(c(1,2,3),c(1,1.5,1)) rownames(l2) = letters[1:3] Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") Sl = SpatialLines(list(S1,S2)) summary(Sl) plot(Sl, col = c("red", "blue")) } \keyword{classes} sp/man/polygons-methods.Rd0000644000176200001440000000143412577541412015263 0ustar liggesusers\name{polygons-methods} \docType{methods} \alias{polygons-methods} \alias{polygons,Spatial-method} \alias{polygons,SpatialPolygons-method} \alias{polygons<-,data.frame,SpatialPolygons-method} \title{ Retrieve polygons from SpatialPolygonsDataFrame object } \description{ Retrieve polygons from SpatialPolygonsDataFrame object } \section{Methods for polygons}{ \describe{ \item{obj = "SpatialPolygons"}{ object of, or deriving from, SpatialPolygons } \item{obj = "SpatialPolygonsDataFrame"}{ object of, or deriving from, SpatialPolygonsDataFrame } }} \section{Methods for "polygons<-"}{ \describe{ \item{object = "data.frame", value="SpatialPolygons"}{ promote data.frame to object of class \link{SpatialPolygonsDataFrame-class}, by specifying polygons } }} \keyword{methods} \keyword{spatial} sp/man/panel.Rd0000644000176200001440000000715012577541412013050 0ustar liggesusers\name{panel.spplot} \alias{panel.spplot} \alias{panel.gridplot} \alias{panel.pointsplot} \alias{panel.polygonsplot} \alias{spplot.key} % needs docs! \alias{SpatialPolygonsRescale} \alias{sp.lines} \alias{sp.points} \alias{sp.polygons} \alias{sp.text} \alias{sp.grid} \alias{sp.panel.layout} \alias{longlat.scales} \alias{bbexpand} \title{panel and panel utility functions for spplot} \description{panel functions for spplot functions, and functions that can be useful within these panel functions } \usage{ spplot.key(sp.layout, rows = 1, cols = 1) SpatialPolygonsRescale(obj, offset, scale = 1, fill = "black", col = "black", plot.grid = TRUE, ...) sp.lines(obj, col = 1, ...) sp.points(obj, pch = 3, ...) sp.polygons(obj, col = 1, fill = "transparent", ...) sp.grid(obj, col = 1, alpha = 1,..., at = pretty(obj[[1]]), col.regions = col) sp.text(loc, txt, ...) sp.panel.layout(lst, p.number, ...) bbexpand(x, fraction) } \arguments{ \item{sp.layout}{ list; see \link{spplot} for definition } \item{rows}{ integer; panel row(s) for which the layout should be drawn } \item{cols}{ integer; panel column(s) for which the layout should be drawn } \item{obj}{ object of class \link{SpatialPolygons-class} for \code{SpatialPolygonsRescale}; of class \link{SpatialLines-class}, \link{Lines-class} or \link{Line-class} for \code{sp.lines} of a class that has a \link{coordinates-methods} for \code{sp.points}; of class \link{SpatialPolygons-class} for \code{sp.polygons}. When obj is character, the actual object is retrieved by \code{get(obj)} before its class is evaluated. } \item{offset}{ offset for shifting a Polygons object } \item{scale}{ scale for rescaling } \item{fill}{ fill color } \item{col}{ line color } \item{plot.grid}{logical; plot through grid functions (TRUE), or through traditional graphics functions (FALSE)} \item{pch}{ plotting character } \item{at}{ numeric; values at which colour breaks should occur } \item{col.regions}{ colours to fill the grid cells, defaults to col } \item{loc}{ numeric vector of two elements } \item{txt}{ text to be plotted } \item{alpha}{ alpha (transparency) level } \item{lst}{ sp.layout argument, see \link{spplot}} \item{p.number}{ panel number; in a panel, panel.number() should be passed to this argument } \item{x}{length two numeric vector, containing a range} \item{fraction}{fraction to expand the range by} \item{...}{ arguments passed to the underlying panel, lattice or grid functions } } \note{ The panel functions of \link{spplot}, \code{panel.gridplot} for grids, \code{panel.pointsplot} for points, or \code{panel.polygonsplot} for lines or polygons can be called with arguments \code{(x,y,...)}. Customizing spplot plots can be done by extending the panel function, or by supplying an sp.layout argument; see the documentation for \link{spplot}. Inside these panel functions, \code{sp.panel.layout} is called to deal with plotting the items in a \code{sp.layout} object. \code{SpatialPolygonsRescale} scales and shifts an object of class \link{SpatialPolygons-class}; this is useful e.g. for scale bars, or other layout items. \code{sp.lines}, \code{sp.points}, \code{sp.polygons} and \code{sp.text} plot lines, points, polygons or text in a panel. \code{spplot.key} draws the \code{sp.layout} object at given rows/cols. \code{sp.pagefn} can be passed as a \code{page} argument, and will call function \code{spplot.key} for the last panel drawn on a page. } \references{ \url{http://rspatial.r-forge.r-project.org/gallery/} has a graph gallery with examples with R code. } \seealso{\link{spplot}, \link{spplot-methods}} \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } %\examples{} \keyword{dplot} sp/man/loadmeuse.Rd0000644000176200001440000000047312577541412013730 0ustar liggesusers\name{loadMeuse} \alias{loadMeuse} \title{ deprecated function to load the Meuse data set } \description{ deprecated function to load the Meuse data set } \usage{ loadMeuse() } \value{ none; it prints a warning to run demo(meuse) } \seealso{\link{meuse}, \link{meuse.grid}} \examples{ demo(meuse) } \keyword{dplot} sp/man/gridlines.Rd0000644000176200001440000001111112655703636013726 0ustar liggesusers\name{gridlines} \alias{gridlines} \alias{gridat} \alias{text} \alias{text.SpatialPointsDataFrame} \alias{labels} \alias{labels.SpatialLines} \title{ Create N-S and E-W grid lines over a geographic region } \description{ Create N-S and E-W grid lines over a geographic region; create and plot corresponding labels } \usage{ gridlines(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), ndiscr = 100) gridat(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), offset = 0.5, side = "WS") \method{labels}{SpatialLines}(object, labelCRS, side = 1:2, ...) \method{text}{SpatialPointsDataFrame}(x, ...) } \arguments{ \item{x}{object deriving from class \link{Spatial-class}} \item{easts}{numeric; east-west values for vertical lines} \item{norths}{numeric; north-south values for horizontal lines} \item{ndiscr}{integer; number of points used to discretize the line, could be set to 2, unless the grid is (re)projected} \item{offset}{offset value to be returned, see \link{text}} \item{object}{\link{SpatialLines-class} object, as returned by \code{gridlines}} \item{labelCRS}{the CRS in which the grid lines were drawn and labels should be printed; if missing, the CRS from \code{object} is taken} \item{side}{for \code{labels}: integer, indicating side(s) at which gridlines labels will be drawn: 1=below (S), 2=left (W), 3=above (N), and 4=right (E); for \code{gridat}: default \dQuote{WS}, if \dQuote{EN} labels placed on the top and right borders} \item{...}{ for \code{labels}: ignored; for \code{text}: arguments passed on to \link[graphics]{text}, see below for example use of \code{adj}} } \value{ \code{gridlines} returns an object of class \link{SpatialLines-class}, with lines as specified; the return object inherits the projection information of \code{x}; \code{gridat} returns a SpatialPointsDataFrame with points at the west and south ends of the grid lines created by \code{gridlines}, with degree labels. The \code{labels} method for \code{SpatialLines} objects returns a \link{SpatialPointsDataFrame-class} object with the parameters needed to print labels below and left of the gridlines. The locations for the labels are those of \code{proj4string(object)} the labels also unless \code{labelCRS} is given, in which case they are in that CRS. This object is prepared to be plotted with \code{text}: The \code{text} method for \code{SpatialPointsDataFrame} puts text labels on its coordinates, and takes care of attributes \code{pos}, \code{labels}, \code{srt} and \code{offset}; see \link[graphics]{text}. } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}, using example code of Roger Bivand. } \seealso{ \link[rgdal]{spTransform}; llgridlines in \code{rgdal} (recent versions) for plotting long-lat grid over projected data } \examples{ data(meuse) coordinates(meuse) = ~x+y plot(meuse) plot(gridlines(meuse), add = TRUE) text(labels(gridlines(meuse))) title("default gridlines within Meuse bounding box") proj4string(meuse) <- CRS("+init=epsg:28992") crs.longlat <- CRS("+init=epsg:4326") meuse_ll <- spTransform(meuse, crs.longlat) grd <- gridlines(meuse_ll) grd_x <- spTransform(grd, CRS("+init=epsg:28992")) # labels South and West: plot(meuse) plot(grd_x, add=TRUE, lty=2) grdat_ll <- gridat(meuse_ll) grdat_x <- spTransform(grdat_ll, CRS("+init=epsg:28992")) text(grdat_x) # labels North and East: plot(meuse) plot(grd_x, add=TRUE, lty=2) grdat_ll <- gridat(meuse_ll, side="EN") grdat_x <- spTransform(grdat_ll, CRS("+init=epsg:28992")) text(grdat_x) # now using labels: plot(meuse) plot(grd_x, add=TRUE, lty=2) text(labels(grd_x, crs.longlat)) # demonstrate axis labels with angle, both sides: sp = SpatialPoints(rbind(c(-101,9), c(-101,55), c(-19,9), c(-19,55)), crs.longlat) laea = CRS("+proj=laea +lat_0=30 +lon_0=-40") sp.l = spTransform(sp, laea) plot(sp.l, expandBB = c(0, 0.05, 0, .05)) gl = spTransform(gridlines(sp), laea) plot(gl, add = TRUE) text(labels(gl, crs.longlat)) text(labels(gl, crs.longlat, side = 3:4), col = 'red') title("curved text label demo") # polar: pts=SpatialPoints(rbind(c(-180,-70),c(0,-70),c(180,-89),c(180,-70)), crs.longlat) polar = CRS("+init=epsg:3031") gl = spTransform(gridlines(pts, easts = seq(-180,180,20), ndiscr = 100), polar) plot(spTransform(pts, polar), expandBB = c(.05,0,.05,0)) lines(gl) l = labels(gl, crs.longlat, side = 3) l$pos = NULL # pos is too simple, use adj: text(l, adj = c(0.5, -0.5)) l = labels(gl, crs.longlat, side = 4) l$srt = 0 # otherwise they end up upside-down text(l) title("grid line labels on polar projection, epsg 3031") \dontrun{ demo(polar) # adds the map of the antarctic } } \keyword{spatial} sp/man/Polygon-class.Rd0000644000176200001440000000223112577541412014476 0ustar liggesusers\name{Polygon-class} \docType{class} \alias{Polygon-class} \title{Class "Polygon" } \description{ class for spatial polygon } \section{Objects from the Class}{ Objects can be created by calls to the function \code{Polygon} } \section{Slots}{ \describe{ \item{\code{ringDir}:}{Object of class \code{"integer"}; the ring direction of the ring (polygon) coordinates, holes are expected to be anti-clockwise } \item{\code{labpt}:}{Object of class \code{"numeric"}; an x, y coordinate pair forming the label point of the polygon } \item{\code{area}:}{Object of class \code{"numeric"}; the planar area of the polygon, does not respect projection as objects of this class have no projection defined } \item{\code{hole}:}{Object of class \code{"logical"}; does the polygon seem to be a hole } \item{\code{coords}:}{Object of class \code{"matrix"}; coordinates of the polygon; first point should equal the last point } } } \section{Extends}{ Class \code{"Line"}, directly. } \section{Methods}{ No methods defined with class "Polygon" in the signature. } \author{ Roger Bivand } \seealso{\link{Polygons-class}, \link{SpatialPolygons-class}} \keyword{classes} sp/man/meuse.grid_ll.Rd0000644000176200001440000000074612577541412014506 0ustar liggesusers\name{meuse.grid_ll} \alias{meuse.grid_ll} \docType{data} \title{Prediction Grid for Meuse Data Set, geographical coordinates} \description{ The object contains the meuse.grid data as a SpatialPointsDataFrame after transformation to WGS84 and geographical coordinates. } \usage{data(meuse.grid_ll)} \format{ The format is: Formal class 'SpatialPointsDataFrame' [package "sp"]. } \source{ See the \link{meuse} documentation } \examples{ data(meuse.grid_ll) } \keyword{datasets} sp/man/SpatialLines.Rd0000644000176200001440000000413212577541412014336 0ustar liggesusers\name{SpatialLines} \alias{SpatialLines} \alias{SpatialLinesDataFrame} \alias{as.SpatialLines.SLDF} \alias{getSpatialLinesMidPoints} \alias{LineLength} \alias{LinesLength} \alias{SpatialLinesLengths} \title{ create objects of class SpatialLines or SpatialLinesDataFrame} \description{ create objects of class \code{SpatialLines} or \code{SpatialLinesDataFrame} from lists of \code{Lines} objects and data.frames; extract list od Lines from a SpatialLines object} \usage{ SpatialLines(LinesList, proj4string = CRS(as.character(NA))) SpatialLinesDataFrame(sl, data, match.ID = TRUE) as.SpatialLines.SLDF(SLDF) getSpatialLinesMidPoints(SL) LineLength(cc, longlat = FALSE, sum = TRUE) LinesLength(Ls, longlat = FALSE) SpatialLinesLengths(SL, longlat) } \arguments{ \item{LinesList}{ list with objects of class \link{Lines-class}} \item{proj4string}{Object of class \code{"CRS"}; holding a valid proj4 string} \item{sl, SL}{ object of class \link{SpatialLines-class}} \item{data}{ object of class \code{data.frame}; the number of rows in \code{data} should equal the number of \code{Lines} elements in \code{sl}} \item{match.ID}{logical: (default TRUE): match SpatialLines member Lines ID slot values with data.frame row names, and re-order the data frame rows if necessary; if character: indicates the column in \code{data} with Lines IDs to match} \item{SLDF}{SpatialLinesDataFrame object} \item{Ls}{Object of class \code{Lines}} \item{cc}{Object of class \code{Line}, or two-column matrix with points} \item{longlat}{if FALSE, Euclidean distance, if TRUE Great Circle distance in kilometers} \item{sum}{logical; if \code{TRUE} return scalar length of sum of segments in Line, if \code{FALSE} return vector with segment lengths} } \value{ \code{SpatialLines} returns object of class \code{SpatialLines}; \code{SpatialLinesDataFrame} returns object of class \code{SpatialLinesDataFrame} \code{getSpatialLinesMidPoints} returns an object of class \code{SpatialPoints},each point containing the (weighted) mean of the lines elements; weighted in the sense that mean is called twice. } \seealso{ \link{SpatialLines-class} } \keyword{manip} sp/man/as.SpatialPolygons.GridTopology.Rd0000644000176200001440000000516312577541412020126 0ustar liggesusers\name{as.SpatialPolygons.GridTopology} \alias{as.SpatialPolygons.GridTopology} \alias{coerce,GridTopology,SpatialPolygons-method} \alias{HexPoints2SpatialPolygons} \alias{IDvaluesGridTopology} \alias{as.SpatialPolygons.SpatialPixels} \alias{coerce,SpatialPixels,SpatialPolygons-method} \alias{IDvaluesSpatialPixels} %- Also NEED an '\alias' for EACH other topic documented here. \title{Make SpatialPolygons object from GridTopology object} \description{ Converts grids of regular rectangles into a \code{SpatialPolygons} object, which can be transformed to a different projection or datum with \code{spTransform} in package \code{rgdal}. The function is not suitable for high-resolution grids. The ordering of the grid cells is as in \code{coordinates()} of the same object, and is reported by \code{IDvaluesGridTopology}. } \usage{ as.SpatialPolygons.GridTopology(grd, proj4string = CRS(as.character(NA))) IDvaluesGridTopology(obj) as.SpatialPolygons.SpatialPixels(obj) IDvaluesSpatialPixels(obj) HexPoints2SpatialPolygons(hex, dx) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{grd}{\code{GridTopology} object} \item{proj4string}{object of class \link{CRS-class}} \item{obj}{ \code{SpatialPixels} object } \item{hex}{ \code{SpatialPoints} object with points that are generated by hexagonal sampling; see \link{spsample}} \item{dx}{ spacing of two horizontally adjacent points; if missing, this will be computed from the points } } \value{ \code{as.SpatialPolygons.GridTopology} and \code{as.SpatialPolygons.SpatialPixels} return a \code{SpatialPolygons} object; \code{IDvaluesGridTopology} and \code{IDvaluesSpatialPixels} return a character vector with the object grid indices. } \seealso{\code{\link{GridTopology}}, \code{\link{SpatialPixels}}, \code{\link{SpatialPolygons}} \code{spTransform} in package \code{rgdal} } \examples{ library(lattice) grd <- GridTopology(cellcentre.offset=c(-175,55), cellsize=c(10,10), cells.dim=c(4,4)) SpP_grd <- as.SpatialPolygons.GridTopology(grd) plot(SpP_grd) text(coordinates(SpP_grd), sapply(slot(SpP_grd, "polygons"), function(i) slot(i, "ID")), cex=0.5) trdata <- data.frame(A=rep(c(1,2,3,4), 4), B=rep(c(1,2,3,4), each=4), row.names=sapply(slot(SpP_grd, "polygons"), function(i) slot(i, "ID"))) SpPDF <- SpatialPolygonsDataFrame(SpP_grd, trdata) spplot(SpPDF) data(meuse.grid) gridded(meuse.grid)=~x+y xx = spsample(meuse.grid, type="hexagonal", cellsize=200) xxpl = HexPoints2SpatialPolygons(xx) image(meuse.grid["dist"]) plot(xxpl, add = TRUE) points(xx, cex = .5) \dontrun{ spplot(aggregate(meuse.grid[,1:3], xxpl), main = "aggregated meuse.grid") } } \keyword{spatial} sp/man/image.Rd0000644000176200001440000001336012667515636013044 0ustar liggesusers\name{image.SpatialGridDataFrame} \alias{image.SpatialGridDataFrame} \alias{image.SpatialPixelsDataFrame} \alias{image.SpatialPixels} \alias{contour.SpatialGridDataFrame} \alias{contour.SpatialPixelsDataFrame} \alias{as.image.SpatialGridDataFrame} \alias{image2Grid} \alias{imageScale} \title{ Image or contour method for gridded spatial data; convert to and from image data structure } \description{ Create image for gridded data in SpatialGridDataFrame or SpatialPixelsDataFrame objects. } \usage{ \method{image}{SpatialGridDataFrame}(x, attr = 1, xcol = 1, ycol = 2, col = heat.colors(12), red=NULL, green=NULL, blue=NULL, axes = FALSE, xlim = NULL, ylim = NULL, add = FALSE, ..., asp = NA, setParUsrBB=FALSE, interpolate = FALSE, angle = 0, useRasterImage = (!.isSDI() && missing(breaks)), breaks, zlim = range(as.numeric(x[[attr]])[is.finite(x[[attr]])])) \method{image}{SpatialPixelsDataFrame}(x, ...) \method{image}{SpatialPixels}(x, ...) \method{contour}{SpatialGridDataFrame}(x, attr = 1, xcol = 1, ycol = 2, col = 1, add = FALSE, xlim = NULL, ylim = NULL, axes = FALSE, ..., setParUsrBB = FALSE) \method{contour}{SpatialPixelsDataFrame}(x, ...) as.image.SpatialGridDataFrame(x, xcol = 1, ycol = 2, attr = 1) image2Grid(im, p4 = as.character(NA), digits=10) } \arguments{ \item{x}{ object of class \link{SpatialGridDataFrame} } \item{attr}{ column of attribute variable; this may be the column name in the data.frame of \code{data} (as.data.frame(data)), or a column number } \item{xcol}{ column number of x-coordinate, in the coordinate matrix } \item{ycol}{ column number of y-coordinate, in the coordinate matrix } \item{col}{a vector of colors } \item{red,green,blue}{columns names or numbers given instead of the \code{attr} argument when the data represent an image encoded in three colour bands on the 0-255 integer scale; all three columns must be given in this case, and the attribute values will be constructed using function \code{rgb} } %\item{asp}{ aspect ratio of unit x and unit y axis } \item{axes}{ logical; should coordinate axes be drawn? } \item{xlim}{ x-axis limits } \item{ylim}{ y-axis limits } \item{zlim}{ data limits for plotting the (raster, attribute) values } \item{add}{ logical; if FALSE, the image is added to the plot layout setup by \code{plot(as(x, "Spatial"),axes=axes,xlim=xlim,ylim=ylim,asp=asp)} which sets up axes and plotting region; if TRUE, the image is added to the existing plot. } \item{...}{ arguments passed to \link{image}, see examples } \item{asp}{ aspect ratio to be used for plot } \item{setParUsrBB}{default FALSE, see \code{\link{Spatial-class}} for further details} \item{useRasterImage}{default \code{!.isSDI()} as a workaround for a problem with repeated use in Windows SDI installations; if TRUE, use \code{\link[graphics]{rasterImage}} to render the image if available; for legacy rendering set FALSE} \item{breaks}{class breaks for coloured values} \item{interpolate}{default FALSE, a logical vector (or scalar) indicating whether to apply linear interpolation to the image when drawing, see \code{\link[graphics]{rasterImage}}} \item{angle}{default 0, angle of rotation (in degrees, anti-clockwise from positive x-axis, about the bottom-left corner), see \code{\link[graphics]{rasterImage}}} \item{im}{list with components named x, y, and z, as used for \code{image}} \item{p4}{CRS object, proj4 string} \item{digits}{default 10, number of significant digits to use for checking equal row/column spacing} } \value{ \code{as.image.SpatialGridDataFrame} returns the list with elements \code{x} and \code{y}, containing the coordinates of the cell centres of a matrix \code{z}, containing the attribute values in matrix form as needed by \link{image}. } \note{ Providing \code{xcol} and \code{ycol} attributes seems obsolete, and it is for 2D data, but it may provide opportunities for plotting certain slices in 3D data. I haven't given this much thought yet. \link{filled.contour} seems to misinterpret the coordinate values, if we take the image.default manual page as the reference. } \author{ Edzer Pebesma } \seealso{ \link{image.default}, \link{SpatialGridDataFrame-class}, \link{levelplot} in package \code{lattice}. Function \code{image.plot} in package \code{fields} can be used to make a legend for an image, see an example in \url{https://stat.ethz.ch/pipermail/r-sig-geo/2007-June/002143.html} } \examples{ data(meuse.grid) coordinates(meuse.grid) = c("x", "y") # promote to SpatialPointsDataFrame gridded(meuse.grid) = TRUE # promote to SpatialGridDataFrame data(meuse) coordinates(meuse) = c("x", "y") image(meuse.grid["dist"], main = "Distance to river Meuse") points(coordinates(meuse), pch = "+") image(meuse.grid["dist"], main = "Distance to river Meuse", useRasterImage=TRUE) points(coordinates(meuse), pch = "+") # color scale: layout(cbind(1,2), c(4,1),1) image(meuse.grid["dist"]) imageScale(meuse.grid$dist, axis.pos=4, add.axis=FALSE) axis(4,at=c(0,.2,.4,.8), las=2) data(Rlogo) d = dim(Rlogo) cellsize = abs(c(gt[2],gt[6])) cells.dim = c(d[1], d[2]) # c(d[2],d[1]) cellcentre.offset = c(x = gt[1] + 0.5 * cellsize[1], y = gt[4] - (d[2] - 0.5) * abs(cellsize[2])) grid = GridTopology(cellcentre.offset, cellsize, cells.dim) df = as.vector(Rlogo[,,1]) for (band in 2:d[3]) df = cbind(df, as.vector(Rlogo[,,band])) df = as.data.frame(df) names(df) = paste("band", 1:d[3], sep="") Rlogo <- SpatialGridDataFrame(grid = grid, data = df) summary(Rlogo) image(Rlogo, red="band1", green="band2", blue="band3") image(Rlogo, red="band1", green="band2", blue="band3", useRasterImage=FALSE) is.na(Rlogo$band1) <- Rlogo$band1 == 255 is.na(Rlogo$band2) <- Rlogo$band2 == 255 is.na(Rlogo$band3) <- Rlogo$band3 == 255 Rlogo$i7 <- 7 image(Rlogo, "i7") image(Rlogo, red="band1", green="band2", blue="band3", add=TRUE) } \keyword{spatial} sp/man/geometry-methods.Rd0000644000176200001440000000273012633635542015245 0ustar liggesusers\name{geometry-methods} \docType{methods} \alias{geometry} \alias{geometry-methods} \alias{geometry,Spatial-method} \alias{geometry,SpatialPointsDataFrame-method} \alias{geometry,SpatialMultiPointsDataFrame-method} \alias{geometry,SpatialGridDataFrame-method} \alias{geometry,SpatialPixelsDataFrame-method} \alias{geometry,SpatialLinesDataFrame-method} \alias{geometry,SpatialPolygonsDataFrame-method} \alias{geometry<-} \alias{geometry<-,data.frame,Spatial-method} \title{ Methods for retrieving the geometry from a composite (geometry + attributes) object } \usage{ geometry(obj) geometry(obj) <- value } \arguments{ \item{obj}{in case of assignment, a data.frame, else an object of class Spatial} \item{value}{object of class Spatial} } \description{ geometry retrieves the SpatialXxx object from a SpatialXxxDataFrame object, with Xxx Lines, Points, Polygons, Grid, or Pixels. geometry<- converts a data.frame into a Spatial object. } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ } \item{obj = "SpatialPointsDataFrame"}{ } \item{obj = "SpatialMultiPointsDataFrame"}{ } \item{obj = "SpatialPolygonsDataFrame"}{ } \item{obj = "SpatialPixelsDataFrame"}{ } \item{obj = "SpatialGridDataFrame"}{ } \item{obj = "SpatialLinesDataFrame"}{ } } } \author{Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \examples{ data(meuse) m = meuse coordinates(m) = meuse[, c("x", "y")] pts = geometry(m) class(pts) geometry(meuse) = pts class(meuse) identical(m, meuse) # TRUE } \keyword{methods} sp/man/CRS-class.Rd0000644000176200001440000001223612602503173013473 0ustar liggesusers\name{CRS-class} \docType{class} \alias{CRS-class} \alias{CRS} \alias{CRSargs} \alias{identicalCRS} \alias{print.CRS} \alias{show,CRS-method} \title{Class "CRS" of coordinate reference system arguments} \description{Interface class to the PROJ.4 projection system. The class is defined as an empty stub accepting value NA in the sp package. If the rgdal package is available, then the class will permit spatial data to be associated with coordinate reference systems. The arguments must be entered exactly as in the PROJ.4 documentation, in particular there cannot be any white space in += strings, and successive such strings can only be separated by blanks. Note that only \dQuote{+proj=longlat +ellps=WGS84} is accepted for geographical coordinates, which must be ordered (eastings, northings); the \dQuote{+ellps=} definition must be given (or expanded internally from a given \dQuote{+datum=} value) for recent versions of the PROJ.4 library, and should be set to an appropriate value.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{CRS("projargs")}, where "projargs" is a valid string of PROJ.4 arguments. The initiation function calls the PROJ.4 library to verify the argument set against those known in the library, returning error messages where necessary. The function \code{CRSargs()} can be used to show the expanded argument list used by the PROJ.4 library. } \section{Slots}{ \describe{ \item{\code{projargs}:}{Object of class \code{"character"}: projection arguments; the arguments must be entered exactly as in the PROJ.4 documentation, in particular there cannot be any white space in += strings, and successive such strings can only be separated by blanks. } } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "CRS")}: print projection arguments in object } } } \usage{ CRS(projargs, doCheckCRSArgs=TRUE) identicalCRS(x,y) } \arguments{ \item{projargs}{A character string of projection arguments; the arguments must be entered exactly as in the PROJ.4 documentation; if the projection is unknown, use \code{as.character(NA)}, it may be missing or an empty string of zero length and will then set to the missing value.} \item{doCheckCRSArgs}{default TRUE, must be set to FALSE by package developers including \code{CRS} in an S4 class definition to avoid uncontrolable loading of the \pkg{rgdal} namespace} \item{x}{object having a \link{proj4string} method, or if \code{y} is missing, list with objects that have a \code{proj4string} method} \item{y}{object of class \link{Spatial}, or having a \link{proj4string} method} } \value{ \code{CRS} returns on success an object of class \link{CRS}. \code{identicalCRS} returns a logical, indicating whether \code{x} and \code{y} have identical CRS, or if \code{y} is missing whether all objects in list \code{x} have identical CRS. } \references{\url{https://github.com/OSGeo/proj.4}} \author{Roger Bivand \email{Roger.Bivand@nhh.no}} \note{ Lists of projections may be seen by using the programs installed with the PROJ.4 library, in particular proj and cs2cs; with the latter, -lp lists projections, -le ellipsoids, -lu units, and -ld datum(s) known to the installed software (available in \pkg{rgdal} using \code{projInfo}). These are added to in successive releases, so tracking the website or compiling and installing the most recent revisions will give the greatest choice. Finding the very important datum transformation parameters to be given with the +towgs84 tag is a further challenge, and is essential when the datums used in data to be used together differ. Tracing projection arguments is easier now than before the mass ownership of GPS receivers raised the issue of matching coordinates from different argument sets (GPS output and paper map, for example). See \code{\link[rgdal]{GridsDatums}}, \code{\link[rgdal]{make_EPSG}} and \code{\link[rgdal]{showEPSG}} for help in finding CRS definitions. The 4.9.1 release of PROJ.4 omitted a small file of defaults, leading to reports of \dQuote{major axis or radius = 0 or not given} errors. From 0.9-3, rgdal checks for the presence of this file (proj_def.dat), and if not found, and under similar conditions to those used by PROJ.4, adds \dQuote{+ellps=WGS84} to the input string being checked by \code{checkCRSArgs} The \dQuote{+no_defs} tag ignores the file of defaults, and the default work-around implemented to get around this problem; strings including \dQuote{init} and \dQuote{datum} tags also trigger the avoidance of the work-around. Now messages are issued when a candidate CRS is checked; they may be suppressed using \code{suppressMessages}.} \examples{ CRS() CRS("") CRS(as.character(NA)) CRS("+proj=longlat +datum=WGS84") if (require(rgdal)) { print(CRSargs(CRS("+proj=longlat +datum=NAD27"))) print(CRSargs(CRS("+init=epsg:4267"))) print(CRSargs(CRS("+init=epsg:26978"))) print(CRSargs(CRS(paste("+proj=sterea +lat_0=52.15616055555555", "+lon_0=5.38763888888889 +k=0.999908 +x_0=155000 +y_0=463000 +ellps=bessel", " +towgs84=565.237,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +units=m")))) print(CRSargs(CRS("+init=epsg:28992"))) } # see http://trac.osgeo.org/gdal/ticket/1987 } \keyword{classes} \keyword{spatial} sp/man/coordnames-methods.Rd0000644000176200001440000000427212674350736015553 0ustar liggesusers\name{coordnames-methods} \docType{methods} \alias{coordnames} \alias{coordnames-methods} \alias{coordnames,SpatialPoints-method} \alias{coordnames,SpatialMultiPoints-method} \alias{coordnames,SpatialLines-method} \alias{coordnames,Lines-method} \alias{coordnames,Line-method} \alias{coordnames,Polygon-method} \alias{coordnames,Polygons-method} \alias{coordnames,SpatialPolygons-method} \alias{coordnames<-} \alias{coordnames<-,SpatialPoints,character-method} \alias{coordnames<-,SpatialMultiPoints,character-method} \alias{coordnames<-,SpatialLines,character-method} \alias{coordnames<-,Lines,character-method} \alias{coordnames<-,Line,character-method} \alias{coordnames<-,SpatialPolygons,character-method} \alias{coordnames<-,GridTopology,character-method} \alias{coordnames<-,SpatialGrid,character-method} \alias{coordnames<-,SpatialPixels,character-method} \alias{coordnames<-,GridTopology,character-method} \alias{coordnames<-,SpatialGrid,character-method} \alias{coordnames<-,SpatialPixels,character-method} \title{ retrieve or assign coordinate names for classes in sp} \description{ retrieve or assign coordinate names for classes in \pkg{sp} } \section{Methods for coordnames}{ \describe{ \item{x = "SpatialPoints"}{ retrieves coordinate names } \item{x = "SpatialLines"}{ retrieves coordinate names } \item{x = "Lines"}{ retrieves coordinate names } \item{x = "Line"}{ retrieves coordinate names } \item{x = "SpatialPolygons"}{ retrieves coordinate names } \item{x = "Polygons"}{ retrieves coordinate names } \item{x = "Polygon"}{ retrieves coordinate names } }} \section{Methods for "coordnames<-"}{ \describe{ \item{x = "SpatialPoints", value = "character"}{ replace coordinate names } \item{x = "SpatialLines", value = "character"}{ replace coordinate names } \item{x = "Lines", value = "character"}{ replace coordinate names } \item{x = "Line", value = "character"}{ replace coordinate names } \item{x = "SpatialPolygons", value = "character"}{ replace coordinate names } \item{x = "GridTopology", value = "character"}{ replace coordinate names } \item{x = "SpatialGrid", value = "character"}{ replace coordinate names } \item{x = "SpatialPixels", value = "character"}{ replace coordinate names } }} \keyword{methods} sp/man/gridded-methods.Rd0000644000176200001440000000630512577541412015015 0ustar liggesusers\name{gridded-methods} \docType{methods} \alias{gridded-methods} \alias{gridparameters} \alias{fullgrid} \alias{fullgrid,Spatial-method} \alias{gridded} \alias{gridded,Spatial-method} \alias{fullgrid<-} \alias{gridded<-} \alias{fullgrid<-,Spatial,ANY-method} \alias{fullgrid<-,SpatialGrid,logical-method} \alias{fullgrid<-,SpatialGridDataFrame,logical-method} \alias{fullgrid<-,SpatialPixels,logical-method} \alias{fullgrid<-,SpatialPixelsDataFrame,logical-method} \alias{gridded<-,SpatialGrid,logical-method} \alias{gridded<-,SpatialGridDataFrame,logical-method} \alias{gridded<-,SpatialPixels,logical-method} \alias{gridded<-,SpatialPixelsDataFrame,logical-method} \alias{gridded<-,SpatialPoints,list-method} \alias{gridded<-,SpatialPoints,logical-method} \alias{gridded<-,SpatialPointsDataFrame,list-method} \alias{gridded<-,SpatialPointsDataFrame,logical-method} \alias{gridded<-,data.frame,GridTopology-method} \alias{gridded<-,data.frame,character-method} \alias{gridded<-,data.frame,formula-method} \title{ specify spatial data as being gridded, or find out whether they are } \description{ returns logical (TRUE or FALSE) telling whether the object is gridded or not; in assignment promotes a non-gridded structure to a gridded one, or demotes a gridded structure back to a non-structured one. } \usage{ gridded(obj) gridded(obj) <- value fullgrid(obj) fullgrid(obj) <- value gridparameters(obj) } \arguments{ \item{obj}{ object deriviving from class "Spatial" (for gridded), or object of class \link{SpatialGridDataFrame-class} (for fullgrid and gridparameters)} \item{value}{logical replacement values, TRUE or FALSE} } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ object deriviving from class "Spatial" } }} \value{ if obj derives from class Spatial, gridded(object) will tell whether it is has topology on a regular grid; if assigned TRUE, if the object derives from SpatialPoints and has gridded topology, grid topology will be added to object, and the class of the object will be promoted to \link{SpatialGrid-class} or \link{SpatialGridDataFrame-class} \code{fullgrid} returns a logical, telling whether the grid is full and ordered (i.e., in full matrix form), or whether it is not full or unordered (i.e. a list of points that happen to lie on a grid. If assigned, the way the points are stored may be changed. Changing a set of points to full matrix form and back may change the original order of the points, and will remove duplicate points if they were present. \code{gridparameters} returns, if \code{obj} inherits from SpatialGridDataFrame its grid parameters, else it returns numeric(0). The returned value is a data.frame with three columns, named cellcentre.offset ("lower left cell centre coordinates"), cellsize, and cells.dim (cell dimension); the rows correspond to the spatial dimensions. } \keyword{methods} \examples{ # just 9 points on a grid: x <- c(1,1,1,2,2,2,3,3,3) y <- c(1,2,3,1,2,3,1,2,3) xy <- cbind(x,y) S <- SpatialPoints(xy) class(S) plot(S) gridded(S) <- TRUE gridded(S) class(S) summary(S) plot(S) gridded(S) <- FALSE gridded(S) class(S) # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE plot(meuse.grid) # not much good summary(meuse.grid) } \keyword{spatial} sp/man/Line.Rd0000644000176200001440000000157112577541412012641 0ustar liggesusers\name{Line} \alias{Line} \alias{Lines} \title{ create objects of class Line or Lines} \description{ create objects of class \code{Line} or \code{Lines} from coordinates} \usage{ Line(coords) Lines(slinelist, ID) } \arguments{ \item{coords}{ 2-column numeric matrix with coordinates for a single line } \item{slinelist}{ list with elements of class \link{Line-class}} \item{ID}{a single word unique character identifier, character vector of length one} } \value{ \code{Line} returns an object of class \link{Line-class}; \code{Lines} returns an object of class \link{Lines-class} } \seealso{ \link{SpatialLines-class} } \examples{ # from the sp vignette: l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") } \keyword{classes} sp/man/meuse.riv.Rd0000644000176200001440000000314212577541412013663 0ustar liggesusers\name{meuse.riv} \alias{meuse.riv} \alias{meuse.area} \docType{data} \title{ River Meuse outline } \usage{data(meuse.riv) data(meuse.area)} \description{ The \code{meuse.riv} data consists of an outline of the Meuse river in the area a few kilometers around the \link{meuse} data set. The \code{meuse.area} polygon has an outline of \link{meuse.grid}. See example below how it can be created from \link{meuse.grid}. } \format{ \code{meuse.riv}: two-column data.frame containing 176 coordinates. \code{meuse.area}: two-column matrix with coordinates of outline. } \details{ \code{x} and \code{y} are in RDM, the Dutch topographical map coordinate system. See examples of \code{spTransform} in the rgdal package for projection parameters. } \references{ See the \link{meuse} documentation } \examples{ data(meuse.riv) plot(meuse.riv, type = "l", asp = 1) data(meuse.grid) coordinates(meuse.grid) = c("x", "y") gridded(meuse.grid) = TRUE image(meuse.grid, "dist", add = TRUE) data(meuse) coordinates(meuse) = c("x", "y") meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) spplot(meuse.grid, col.regions=bpy.colors(), main = "meuse.grid", sp.layout=list( list("sp.polygons", meuse.sr), list("sp.points", meuse, pch="+", col="black") ) ) spplot(meuse, "zinc", col.regions=bpy.colors(), main = "zinc, ppm", cuts = c(100,200,400,700,1200,2000), key.space = "right", sp.layout= list("sp.polygons", meuse.sr, fill = "lightblue") ) # creating meuse.area from meuse.grid: if (require(rgeos)) { meuse.area = gUnaryUnion(as(meuse.grid, "SpatialPolygons")) plot(meuse.area) } } \keyword{datasets} sp/man/SpatialPoints-class.Rd0000644000176200001440000001017512577541412015647 0ustar liggesusers\name{SpatialPoints-class} \docType{class} \alias{SpatialPoints-class} \alias{[,SpatialPoints-method} \alias{coerce,SpatialPoints,matrix-method} \alias{coerce,SpatialPoints,data.frame-method} % here??? \alias{coerce,SpatialPoints,SpatialPixels-method} % here??? \alias{coerce,SpatialPoints,Line-method} \alias{coerce,SpatialPoints,Lines-method} \alias{coerce,SpatialPoints,SpatialLines-method} \alias{coerce,SpatialPointsDataFrame,SpatialPixelsDataFrame-method} % here??? %\alias{coerce,SpatialPoints,data.frame-method} %\alias{coerce,data.frame,SpatialPoints-method} %\alias{coerce,matrix,SpatialPoints-method} % \alias{coordinates,SpatialPoints-method} \alias{show,SpatialPoints-method} %\alias{SpatialPoints} \alias{as.data.frame.SpatialPoints} \alias{plot,SpatialPoints,missing-method} \alias{summary,SpatialPoints-method} \alias{print.SpatialPoints} \alias{summary.SpatialPoints} \alias{rbind.SpatialPoints} \alias{$,SpatialPoints-method} \alias{$<-,SpatialPoints,character-method} \alias{row.names.SpatialPoints} \alias{coerce,ppp,SpatialPoints-method} \title{Class "SpatialPoints" } \description{ Class for (irregularly spaced) points } \section{Objects from the Class}{ Objects can be created by calls of the form \code{SpatialPoints(x)}. } \section{Slots}{ \describe{ \item{\code{coords}:}{Object of class \code{"matrix"}, containing the coordinates (each row is a point) } \item{\code{bbox}:}{Object of class \code{"matrix"}, with bounding box } \item{\code{proj4string}:}{Object of class \code{"CRS"}, projection string } } } \section{Extends}{ Class \code{"Spatial"}, directly. } \section{Methods}{ \describe{ \item{[}{\code{signature(x = "SpatialPoints")}: subsets the points; only rows (points) can be subsetted } \item{coerce}{\code{signature(from = "SpatialPoints", to = "data.frame")}: retrieves the data part} \item{coerce}{\code{signature(from = "SpatialPoints", to = "SpatialPixels")}: equivalent to assigning gridded TRUE for a copy of the object} \item{coerce}{\code{signature(from = "SpatialPointsDataFrame", to = "SpatialPixelsDataFrame")}: equivalent to assigning gridded TRUE for a copy of the object} \item{coerce}{\code{signature(from = "data.frame", to = "SpatialPoints")}: sets coordinates, which may be in a data frame } \item{coerce}{\code{signature(from = "matrix", to = "SpatialPoints")}: set coordinates, which may be in a matrix } \item{coordinates}{\code{signature(obj = "SpatialPoints")}: retrieves the coordinates, as matrix } \item{plot}{\code{signature(x = "SpatialPoints", y = "missing")}: plot points} \item{summary}{\code{signature(object = "SpatialPoints")}: summarize object} \item{points}{\code{signature(x = "SpatialPoints")}: add point symbols to plot} \item{show}{\code{signature(object = "SpatialPoints")}: prints coordinates } \item{rbind}{\code{signature(object = "SpatialPoints")}: rbind-like method } } } \section{plot method arguments}{ The plot method for \dQuote{SpatialPoints} objects takes the following arguments: \describe{ \item{x}{object of class SpatialPoints} \item{pch}{default 3; either an integer specifying a symbol or a single character to be used as the default in plotting points} \item{axes}{default FALSE; a logical value indicating whether both axes should be drawn } \item{add}{default FALSE; add to existing plot} \item{xlim}{default NULL; the x limits (x1, x2) of the plot} \item{ylim}{default NULL; the y limits of the plot} \item{...}{passed through} \item{setParUsrBB}{default FALSE; set the \code{par} \dQuote{usr} bounding box, see note in \link{Spatial-class}} \item{cex}{default 1; numerical value giving the amount by which plotting text and symbols should be magnified relative to the default} \item{col}{default 1; default plotting color} \item{lwd}{default 1; line width} \item{bg}{default 1; colour to be used for the background of the device region} } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialPointsDataFrame-class}} } \examples{ x = c(1,2,3,4,5) y = c(3,2,5,1,4) S <- SpatialPoints(cbind(x,y)) S <- SpatialPoints(list(x,y)) S <- SpatialPoints(data.frame(x,y)) S plot(S) } \keyword{classes} sp/man/flip.Rd0000644000176200001440000000150012577541412012674 0ustar liggesusers\name{flip} \alias{flipHorizontal} \alias{flipVertical} \title{ rearrange data in SpatialPointsDataFrame or SpatialGridDataFrame for plotting with spplot (levelplot/xyplot wrapper) } \description{ rearrange SpatialPointsDataFrame for plotting with spplot or levelplot } \usage{ flipHorizontal(x) flipVertical(x) } \arguments{ \item{x}{ object of class SpatialGridDataFrame } } \value{ object of class SpatialGridDataFrame, with pixels flipped horizontally or vertically. Note that the spatial structure is destroyed (or at least: drastically changed). } \author{Michael Sumner} \examples{ data(meuse.grid) # data frame gridded(meuse.grid) = c("x", "y") # promotes to fullgrid(meuse.grid) = TRUE d = meuse.grid["dist"] image(d, axes=TRUE) image(flipHorizontal(d), axes=TRUE) image(flipVertical(d), axes=TRUE) } \keyword{dplot} sp/man/char2dms.Rd0000644000176200001440000000356112577541412013456 0ustar liggesusers\name{char2dms} \alias{char2dms} \alias{dd2dms} \alias{coerce,DMS,numeric-method} \alias{coerce,DMS,character-method} \alias{as.character.DMS} %- Also NEED an '\alias' for EACH other topic documented here. \title{Convert character vector to DMS-class object} \description{ These two helper functions convert character vectors and decimal degree vectors to the DMS-class representation of degrees, minutes, and decimal seconds. "DMS" objects cannot contain NAs. } \section{Methods}{\describe{ \item{from = "DMS", to = "numeric"}{coerce a \code{"DMS"} object to a \code{"numeric"} vector} \item{from = "DMS", to = "character"}{coerce a \code{"DMS"} object to a \code{"character"} vector (the \code{as.character.DMS} S3 method is also available)} }} \usage{ char2dms(from, chd = "d", chm = "'", chs = "\"") dd2dms(dd, NS = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{from}{character vector of degree, minute, decimal second data} \item{chd}{degree character terminator} \item{chm}{minute character terminator} \item{chs}{second character terminator} \item{dd}{numeric vector of decimal degrees} \item{NS}{logical, TRUE for north/south decimal degrees, FALSE for east/west decimal degrees} } \details{ In char2dms, the input data vector should use a regular format, such as that used in the PROJ.4 library, with a trailing capital (NSWE) indicating compass direction. } \value{ Both functions return a "DMS" object. } \author{Roger Bivand \email{Roger.Bivand@nhh.no} } \seealso{\code{\link{DMS-class}}} \examples{ data(state) str(state.center$y) stateN <- dd2dms(state.center$y, NS=TRUE) str(attributes(stateN)) ch.stateN <- as.character(stateN) str(ch.stateN) stateNa <- char2dms(ch.stateN) str(attributes(stateNa)) ch.stateN <- as(stateN, "character") str(ch.stateN) stateNa <- char2dms(ch.stateN) str(attributes(stateNa)) } \keyword{spatial} sp/man/over.Rd0000644000176200001440000002031312763460572012724 0ustar liggesusers\name{over-methods} \docType{methods} \alias{over} \alias{\%over\%} \alias{over-methods} \alias{over,SpatialPoints,SpatialPoints-method} \alias{over,SpatialPoints,SpatialPointsDataFrame-method} \alias{over,SpatialPoints,SpatialPolygons-method} \alias{over,SpatialPoints,SpatialPolygonsDataFrame-method} \alias{over,SpatialGridDataFrame,SpatialPolygonsDataFrame-method} \alias{over,SpatialPolygons,SpatialPoints-method} \alias{over,SpatialPolygons,SpatialPointsDataFrame-method} \alias{over,SpatialGridDataFrame,SpatialPoints-method} \alias{over,SpatialGrid,SpatialPoints-method} \alias{over,SpatialPixelsDataFrame,SpatialPoints-method} \alias{over,SpatialPixels,SpatialPoints-method} \alias{over,SpatialPoints,SpatialGrid-method} \alias{over,SpatialPoints,SpatialGridDataFrame-method} \alias{over,SpatialPoints,SpatialPixels-method} \alias{over,SpatialPoints,SpatialPixelsDataFrame-method} \alias{over,SpatialPolygons,SpatialGridDataFrame-method} \alias{over,SpatialGrid,SpatialPolygons-method} \alias{over,SpatialGrid,SpatialPolygonsDataFrame-method} \alias{over,SpatialPolygons,SpatialGrid-method} \alias{over,SpatialGrid,SpatialGrid-method} \alias{over,SpatialGrid,SpatialGridDataFrame-method} \alias{over,SpatialGrid,SpatialPixels-method} \alias{over,SpatialGrid,SpatialPixelsDataFrame-method} \alias{over,SpatialGrid,SpatialPointsDataFrame-method} \alias{over,Spatial,Spatial-method} \alias{overDF_for_rgeos} \title{ consistent spatial overlay for points, grids and polygons } \description{ consistent spatial overlay for points, grids and polygons: at the spatial locations of object x retrieves the indexes or attributes from spatial object y } \usage{ over(x, y, returnList = FALSE, fn = NULL, ...) x \%over\% y } \arguments{ \item{x}{geometry (locations) of the queries} \item{y}{layer from which the geometries or attributes are queried} \item{returnList}{ logical; see value } \item{fn}{(optional) a function; see value } \item{...}{arguments passed on to function \code{fn}, except for the special argument \code{minDimension}: minimal dimension for an intersection to be counted; -1 takes any intersection, and does not order; 0 takes any intersection but will order according to dimensionality of the intersections (if returnList is TRUE, 1 (2) selects intersections with dimension 1, meaning lines (2, meaning areas); see \code{vignette("over")} for details } } \value{ If \code{y} is only geometry an object of length \code{length(x)}. If \code{returnList} is \code{FALSE}, a vector with the (first) index of \code{y} for each geometry (point, grid cell centre, polygon or lines) matching \code{x}. if \code{returnList} is TRUE, a list of length \code{length(x)}, with list element \code{i} the vector of all indices of the geometries in \code{y} that correspond to the $i$-th geometry in \code{x}. If \code{y} has attribute data, attribute data are returned. \code{returnList} is FALSE, a \code{data.frame} with number of rows equal to \code{length(x)} is returned, if it is TRUE a list with \code{length(x)} elements is returned, with a list element the \code{data.frame} elements of all geometries in \code{y} that correspond to that element of \code{x}. In case the \code{rgeos} \code{over} methods are used, matching is done by \link[rgeos]{gRelate}, which uses DE-9IM (\url{https://en.wikipedia.org/wiki/DE-9IM}). From the string returned, characters 1, 2, 4 and 5 are used, indicating the dimension of the overlap of the inner and boundary of each \code{x} geometry with the inner and boundary of each \code{y} geometry. The order in which matched \code{y} geometries are returned is determined by the dimension of the overlap (2: area overlap, 1: line in common, 0: point in common), and then by the position in the string (1, 2, 4, 5, meaning points in polygons are prefered over points on polygon boundaries). } \section{Methods}{ \describe{ \item{x = "SpatialPoints", y = "SpatialPolygons"}{ returns a numeric vector of length equal to the number of points; the number is the index (number) of the polygon of \code{y} in which a point falls; NA denotes the point does not fall in a polygon; if a point falls in multiple polygons, the last polygon is recorded. } \item{x = "SpatialPointsDataFrame", y = "SpatialPolygons"}{ equal to the previous method, except that an argument \code{fn=xxx} is allowed, e.g. \code{fn = mean} which will then report a data.frame with the mean attribute values of the \code{x} points falling in each polygon (set) of \code{y} } \item{x = "SpatialPoints", y = "SpatialPolygonsDataFrame"}{ returns a data.frame of the second argument with row entries corresponding to the first argument } \item{x = "SpatialPolygons", y = "SpatialPoints"}{ returns the polygon index of points in \code{y}; if \code{x} is a \code{SpatialPolygonsDataFrame}, a data.frame with rows from \code{x} corresponding to points in \code{y} is returned.} \item{x = "SpatialGridDataFrame", y = "SpatialPoints"}{ returns object of class SpatialPointsDataFrame with grid attribute values x at spatial point locations y; NA for NA grid cells or points outside grid, and NA values on NA grid cells. } \item{x = "SpatialGrid", y = "SpatialPoints"}{ returns grid values x at spatial point locations y; NA for NA grid cells or points outside the grid } \item{x = "SpatialPixelsDataFrame", y = "SpatialPoints"}{ returns grid values x at spatial point locations y; NA for NA grid cells or points outside the grid } \item{x = "SpatialPixels", y = "SpatialPoints"}{ returns grid values x at spatial point locations y; NA for NA grid cells or points outside the grid } \item{x = "SpatialPoints", y = "SpatialGrid"}{ xx } \item{x = "SpatialPoints", y = "SpatialGridDataFrame"}{ xx } \item{x = "SpatialPoints", y = "SpatialPixels"}{ xx } \item{x = "SpatialPoints", y = "SpatialPixelsDataFrame"}{ xx } \item{x = "SpatialPolygons", y = "SpatialGridDataFrame"}{ xx } } } \author{Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \note{\code{over} can be seen as a left outer join in SQL; the match is a spatial intersection. points on a polygon boundary and points corresponding to a polygon vertex are considered to be inside the polygon. These methods assume that pixels and grid cells are never overlapping; for objects of class \code{SpatialPixels} this is not guaranteed. \code{over} methods that involve \code{SpatialLines} objects, or pairs of \code{SpatialPolygons} require package \code{rgeos}, and use \link[rgeos]{gIntersects}.} \seealso{ \code{vignette("over")} for examples and figures; \link{point.in.polygon}, package \link[rgeos]{gIntersects}} \examples{ r1 = cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409, 180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676, 332618, 332413, 332349)) r2 = cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437, 179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683, 331133, 331623, 332152, 332357, 332373)) r3 = cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875, 179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110), c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004, 329783, 329665, 329720, 329933, 330478, 331062, 331086)) r4 = cbind(c(180304, 180403,179632,179420,180304), c(332791, 333204, 333635, 333058, 332791)) sr1=Polygons(list(Polygon(r1)),"r1") sr2=Polygons(list(Polygon(r2)),"r2") sr3=Polygons(list(Polygon(r3)),"r3") sr4=Polygons(list(Polygon(r4)),"r4") sr=SpatialPolygons(list(sr1,sr2,sr3,sr4)) srdf=SpatialPolygonsDataFrame(sr, data.frame(cbind(1:4,5:2), row.names=c("r1","r2","r3","r4"))) data(meuse) coordinates(meuse) = ~x+y plot(meuse) polygon(r1) polygon(r2) polygon(r3) polygon(r4) # retrieve mean heavy metal concentrations per polygon: over(sr, meuse[,1:4], fn = mean) # return the number of points in each polygon: sapply(over(sr, geometry(meuse), returnList = TRUE), length) data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE over(sr, geometry(meuse)) over(sr, meuse) over(sr, geometry(meuse), returnList = TRUE) over(sr, meuse, returnList = TRUE) over(meuse, sr) over(meuse, srdf) # same thing, with grid: over(sr, meuse.grid) over(sr, meuse.grid, fn = mean) over(sr, meuse.grid, returnList = TRUE) over(meuse.grid, sr) over(meuse.grid, srdf, fn = mean) over(as(meuse.grid, "SpatialPoints"), sr) over(as(meuse.grid, "SpatialPoints"), srdf) } \keyword{methods} sp/man/spDistsN1.Rd0000644000176200001440000000754313026521457013604 0ustar liggesusers\name{spDistsN1} \alias{spDistsN1} \alias{spDists} %- Also NEED an '\alias' for EACH other topic documented here. \title{Euclidean or Great Circle distance between points} \description{ The function returns a vector of distances between a matrix of 2D points, first column longitude, second column latitude, and a single 2D point, using Euclidean or Great Circle distance (WGS84 ellipsoid) methods. } \usage{ spDistsN1(pts, pt, longlat = FALSE) spDists(x, y = x, longlat = FALSE, segments = FALSE, diagonal = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{pts}{A matrix of 2D points, first column x/longitude, second column y/latitude, or a SpatialPoints or SpatialPointsDataFrame object} \item{pt}{A single 2D point, first value x/longitude, second value y/latitude, or a SpatialPoints or SpatialPointsDataFrame object with one point only} \item{x}{A matrix of n-D points with row denoting points, first column x/longitude, second column y/latitude, or a Spatial object that has a \link{coordinates} method} \item{y}{A matrix of n-D points with row denoting points, first column x/longitude, second column y/latitude, or a Spatial object that has a \link{coordinates} method} \item{longlat}{logical; if FALSE, Euclidean distance, if TRUE Great Circle (WGS84 ellipsoid) distance; if \code{x} is a Spatial object, longlat should not be specified but will be derived from \link{is.projected}\code{(x)} } \item{segments}{logical; if \code{TRUE}, \code{y} must be missing; the vector of distances between consecutive points in \code{x} is returned. } \item{diagonal}{logical; if \code{TRUE}, \code{y} must be given and have the same number of points as \code{x}; the vector with distances between points with identical index is returned. } } \value{ \code{spDistsN1} returns a numeric vector of distances in the metric of the points if longlat=FALSE, or in kilometers if longlat=TRUE. \code{spDists} returns a full matrix of distances in the metric of the points if longlat=FALSE, or in kilometers if longlat=TRUE; it uses \code{spDistsN1} in case points are two-dimensional. In case of \code{spDists(x,x)}, it will compute all n x n distances, not the sufficient n x (n-1). } \note{The function can also be used to find a local kilometer equivalent to a plot scaled in decimal degrees in order to draw a scale bar. } \references{\code{http://www.abecedarical.com/javascript/script_greatcircle.html}} \author{Roger Bivand, Edzer Pebesma} \seealso{\code{\link{is.projected}}} \examples{ ll <- matrix(c(5, 6, 60, 60), ncol=2) km <- spDistsN1(ll, ll[1,], longlat=TRUE) zapsmall(km) utm32 <- matrix(c(276.9799, 332.7052, 6658.1572, 6655.2055), ncol=2) spDistsN1(utm32, utm32[1,]) dg <- spDistsN1(ll, ll[1,]) dg dg[2]/km[2] data(meuse) coordinates(meuse) <- c("x", "y") res <- spDistsN1(meuse, meuse[1,]) summary(res) p1 = SpatialPoints(cbind(1:3, 1:3)) spDists(p1) spDists(p1, p1) spDists(p1, p1, diagonal = TRUE) try(spDists(p1, p1, segments = TRUE)) spDists(p1, segments = TRUE) p2 = SpatialPoints(cbind(5:2, 2:5)) spDists(p1, p2) try(spDists(p1, p2, diagonal = TRUE)) # fails try(spDists(p1, p2, segments = TRUE)) # fails # longlat points: proj4string(p1) = "+proj=longlat +ellps=WGS84" proj4string(p2) = "+proj=longlat +ellps=WGS84" is.projected(p1) is.projected(p2) spDists(p1) spDists(p1, p1) spDists(p1, p1, diagonal = TRUE) spDists(p1, p2) try(spDists(p1, p2, diagonal = TRUE)) # fails spDists(p1, p2[1:length(p1),], diagonal = TRUE) spDists(p1, segments = TRUE) spDists(p1[0],p2[0],diagonal=TRUE) spDists(p1[0]) p1 = SpatialPoints(cbind(1:3, 1:3, 1:3)) spDists(p1) spDists(p1, p1) try(spDists(p1, p1, diagonal = TRUE)) try(spDists(p1, p1, segments = TRUE)) try(spDists(p1, segments = TRUE)) p2 = SpatialPoints(cbind(5:2, 2:5, 3:6)) spDists(p1, p2) try(spDists(p1, p2, diagonal = TRUE)) # fails try(spDists(p1, p2, segments = TRUE)) # fails } \keyword{spatial} sp/man/GridTopology-class.Rd0000644000176200001440000000326713014315467015477 0ustar liggesusers\name{GridTopology-class} \docType{class} \alias{GridTopology-class} \alias{print.summary.GridTopology} \alias{summary,GridTopology-method} \alias{show,GridTopology-method} \alias{show,summary.GridTopology-method} \alias{coerce,GridTopology,data.frame-method} \alias{coerce,SpatialGrid,GridTopology-method} \alias{coerce,SpatialPixels,GridTopology-method} \title{Class "GridTopology" } \description{ class for defining a rectangular grid of arbitrary dimension } \section{Objects from the Class}{ Objects are created by using e.g. GridTopology(c(0,0), c(1,1), c(5,5)) see \link{SpatialGrid} } \section{Slots}{ \describe{ \item{\code{cellcentre.offset}:}{numeric; vector with the smallest centroid coordinates for each dimension; coordinates refer to the cell centre } \item{\code{cellsize}:}{numeric; vector with the cell size in each dimension} \item{\code{cells.dim}:}{integer; vector with number of cells in each dimension} } } %\section{Extends}{ % Class \code{"Spatial"}, by class \code{"SpatialPoints"}. %} \section{Methods}{ \describe{ \item{coordinates}{\code{signature(x = "SpatialGrid")}: calculates coordinates for each point on the grid} \item{summary}{\code{signature(object = "SpatialGrid")}: summarize object} \item{coerce}{\code{signature(from = "GridTopology", to = "data.frame")}: convert to data.frame with columns cellcentre.offset, cellsize and cells.dim} } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialGridDataFrame-class}}, \code{\link{SpatialGrid-class}} } \examples{ x = GridTopology(c(0,0), c(1,1), c(5,5)) class(x) x summary(x) coordinates(x) y = SpatialGrid(grid = x) class(y) y } \keyword{classes}