sp/0000755000175000017500000000000014144231203011020 5ustar nileshnileshsp/demo/0000755000175000017500000000000013634421726011762 5ustar nileshnileshsp/demo/00Index0000644000175000017500000000107413171625774013123 0ustar nileshnileshgallery 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/meuse.R0000644000175000017500000000074013171625774013231 0ustar nileshnileshrequire(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/fib.R0000644000175000017500000000110013171625774012642 0ustar nileshnileshxy = 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/demo/webmap.R0000644000175000017500000000251313171625774013366 0ustar nileshnileshlibrary(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/polar.R0000644000175000017500000000134113171625774013226 0ustar nileshnilesh# 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/mp.R0000644000175000017500000000133513171625774012530 0ustar nileshnileshset.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/gallery.R0000644000175000017500000004140513171625774013555 0ustar nileshnileshlibrary(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/depend.R0000644000175000017500000000024213171625774013347 0ustar nileshnileshrequire(tools) x = check_packages_in_dir(".", #check_args = c("--as-cran", ""), check_args = c("", ""), reverse = list(repos = getOption("repos"))) summary(x) sp/MD50000644000175000017500000002602514144231203011335 0ustar nileshnilesha69204caf6f561ade7dfcfb27883981a *DESCRIPTION f046ee1dc9c4aa763a7fb31a6f8ce341 *NAMESPACE 65aa4228cdc1796ed0f5d3a1e32e544d *R/AAA.R 8fa6fd2f3d6210b5eddd8c9b6d50649a *R/CRS-methods.R e72581543556e6822e69febdebcc05e7 *R/Class-CRS.R 4723a758016e8acadff5ad41118e9988 *R/Class-GridTopology.R 70e999d6aaa73fb569363d4a15ab1628 *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 418fe621e84b31dcb624ead4d793dfef *R/GridTopology-methods.R a3ebd35e3a8cf581010a63833d5bdc07 *R/Spatial-methods.R ad97ba856d61a4de9f123a2e4e84d981 *R/SpatialGrid-methods.R 9df046330b871b0a1864910e8611feb8 *R/SpatialGridDataFrame-methods.R 86201139cc11f3da1dea0765ea93f165 *R/SpatialLines-methods.R 42e40b82be113b95fc75396f7c9955e9 *R/SpatialLinesDataFrame-methods.R b820304f4ee95c02fb09858f11c62ffb *R/SpatialMultiPoints-methods.R 00d9c30e78656f342b85e4bd7a78a6d1 *R/SpatialMultiPointsDataFrame-methods.R 407223377b2df63a794408b92413f59f *R/SpatialPoints-methods.R fd588b5d3a61ec9a27ff73b94c480199 *R/SpatialPointsDataFrame-methods.R 0af94ec34bd5e063722f825284048662 *R/SpatialPolygons-displayMethods.R 0d9a5bd10833af81e4532b1dd6be6f50 *R/SpatialPolygons-internals.R 58763f1437a2f2e4049284c543d8239f *R/SpatialPolygons-methods.R f87d13a709c9772414ce6bc63b67866f *R/SpatialPolygonsDataFrame-methods.R 78694b519c982f31c77a9afd1c9f0adf *R/aggregate.R bde15617ef63b08ac721f7f9d869f614 *R/asciigrid.R 60dfd224c49b292637affedd9e951531 *R/bpy.colors.R 2939bb2282af1355eed8be930a5caa5e *R/bubble.R 1aa592addc9edd46c912bf5957984c93 *R/chfids.R 65a220347a38a916e839be41c7b11de0 *R/compassRose.R 0f9eb9e6a5cfe5feec3ed4c818cb0e04 *R/disaggregate.R 1eb6be26e5a9de56a67bc8e5c496b9e5 *R/dms.R 80028a8aeb01f6d8e930d5a928f776a9 *R/flipSGDF.R 65578bd14f0d356a7858a4a7f3c5a243 *R/gridded.R c583ab13f179a62eeac82f564b7a8185 *R/gridlines.R fefde96a25c6f8dcc3168ab036c7a176 *R/image.R d5ccdeeeabffc927e3120fadac6128bd *R/loadmeuse.R 669fb818dc842e26a4f1151413fdc47b *R/mapasp.R d96ebb6ecfed6914a635f7e9a48a0984 *R/merge.R 38af165bc24765938eba2d814daef6f8 *R/over.R 94cb6549550de07c59065880eb019766 *R/point.in.polygon.R 7a1053ba0b2ea15f7c3e4940caad2dd2 *R/projected.R 74d7fbaedd125bf7bf71877f40717a8d *R/rbind.R 6586b2ecf17e47042bf8cc7262a50302 *R/recenter.R d87dfe785fe09899b2e69a68da95e786 *R/select.spatial.R bdc72e1a4c8eb064c155aadba5e79cd0 *R/spOptions.R a3562db0502c05e1f2610e572b65e703 *R/sp_spat1.R 16bf1c64b291ae0b99054ab120ba11e5 *R/spdists.R fd6571e179179148ab35bdb3c5060138 *R/spplot.R 961c82af503e08f1bd8bb592ef382178 *R/spsample.R 24a1fcc357498b36a232d2368a534f17 *R/stack.R bddb25ec8f35a126373d42751aed191b *R/subset.R 1bf89e559504db11dd0379dbc071083f *R/surfaceArea.R 14a49acb33c4c77157bd320c62616c66 *R/zerodist.R 3ff1b9df41c5bbcc2509b9c272683530 *build/vignette.rds 4a36d7e81b10c6afbac3eaf158e2ca03 *data/Rlogo.rda 29c5b5e0606d00ae7fcc57fe088b1dbf *data/meuse.area.rda f5c8aa45c632671cbb27d106ff37ccb9 *data/meuse.grid.rda 940661046d4754a0f92b75fbc9f847b2 *data/meuse.grid_ll.rda 388b0843d782f22d628ba4bd45a11eba *data/meuse.rda 200583e8572b93b6cb6d9f49f0498c92 *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 c43e0a953e76c9289fae5a8369a1d264 *inst/CITATION aefc0c0296f58950699ab45d08807efb *inst/NEWS.Rd a8aa156f3d61f799a44c95d105b99d66 *inst/doc/CRS_warnings.R 37763db0437687671aa10811a9b05338 *inst/doc/CRS_warnings.Rmd 99c9db564423a984aa4e63c95cc65959 *inst/doc/CRS_warnings.html 460d636c84664b04b58eafae36a15701 *inst/doc/csdacm.R d0256779c4d32648db1f98702427588e *inst/doc/csdacm.Rnw f34cc5cad9e1245ac87f5de888c6eaab *inst/doc/csdacm.pdf a42170b8c0644c7b73857a291eafb881 *inst/doc/intro_sp.R d55d2b03e6c3b28eafe79bf447970cc6 *inst/doc/intro_sp.Rnw f91186b30a9d52e3a1c0b40e481bb239 *inst/doc/intro_sp.pdf bd5e93d7e70556d83eaeb0401c97f2d1 *inst/doc/over.R 6457da7ce638431f7839af4375fb8acd *inst/doc/over.Rnw abe4879da7454175d7562b84e7bbe832 *inst/doc/over.pdf 1d14390f7c198db1b4f3fa00ae91cf14 *inst/external/seamap105_mod.csv ef247b6c335e75e48f81da7ef7554fa6 *inst/external/simple.ag 15c2101eb916ea116f400d560f73dd7c *inst/external/test.ag fac0957e6f3a98425f8519d0e945f65d *inst/include/sp.h 85f179076e41701782a685ad110de22b *inst/include/sp_xports.c 477aa6e09a0b7a77a7d5160c311f4399 *man/00sp.Rd 184ca2690df8f59cf61897a7d988eb2f *man/CRS-class.Rd 5c196729fe648dbf5d5ee3aeeeb2569c *man/DMS-class.Rd 8e3158a6e4810b3c5e9237383d071a7e *man/GridTopology-class.Rd 613de6f8c7e25da7dff1842d5107341e *man/Line-class.Rd 5d809f7ce16e60d28894655dd23c7bf2 *man/Line.Rd 21981e8f43ba21c764cdd5642917c09a *man/Lines-class.Rd 57d7ea3fda9d6ef1b179c0d6730bdffd *man/Polygon-class.Rd f9397832758ad0bc1417c4f2e8af0e63 *man/Polygons-class.Rd c92dc2e2c0e4a5cde949d34987083d76 *man/Rlogo.Rd a82e62845fe36d2c2b7dd73ba7a4bcc1 *man/Spatial-class.Rd 83b4e150736961ce00a897871a6850f5 *man/SpatialGrid-class.Rd 0d02a32af4348ba5672390340d1650c0 *man/SpatialGrid.Rd 224aed1a2149bcc06a216006896ed7d5 *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 434009d2e530fec3bac2cde20de472f3 *man/SpatialPolygons-class.Rd f0aeec1148d45c9f34d13076596f45f9 *man/SpatialPolygons.Rd 094f7c5f905f72bd08d9622c170e60b6 *man/SpatialPolygonsDataFrame-class.Rd dd6f9a61ed0c2decfb810d5ac43903dd *man/addattr.Rd 23a2acbf0da1de80ed660d65b9562b29 *man/aggregate.Rd a2d8a069a59f0391014fd44cb606ebdc *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 d842add84101367b1e4ad11b815d66ad *man/dimensions.Rd 1043d6d72ecca44a607c9a5f62126f4f *man/disaggregate.Rd fd50e71d1b89b6697d733ff7ec0160df *man/flip.Rd 3545b530933efa96fa7c39ff4c52571b *man/geometry-methods.Rd 9af0d87856831048b94546f0dd8b0cba *man/gridded-methods.Rd e69b17e91071d5ca729ec06c2226e9f1 *man/gridindex2nb.Rd 3b09b0446e98d69266ac482ff5649f53 *man/gridlines.Rd 3c971a97dbc0b24389423b283abe796f *man/image.Rd 0853a0313c5a264f1db87e93d5c34fa4 *man/is.projected.Rd d21143983ecd66ecb4bd0751d99579f5 *man/loadmeuse.Rd 907a8e354d75f5d080476783f9c54166 *man/mapasp.Rd e11ab871998d837c5ecc48c16f837e40 *man/merge.Rd aa25f57c388705caac6709081a57c954 *man/meuse.Rd f17ead2fc674b4334dbdfe667d35f247 *man/meuse.grid.Rd 67f42a0f50ed052b8cf481dc7f5c19ed *man/meuse.grid_ll.Rd 9dd51fb645ba381af6f3cf44e8223220 *man/meuse.riv.Rd 0c89ebd05ace26981fab0cfa6dde8726 *man/over.Rd d3e7a61b6dc438cc9d6e7b220bc2dad8 *man/panel.Rd 711ce4aa4329db10a14e35b417483bbc *man/point.in.polygon.Rd 28647044030f08a19d5d40982f1cb797 *man/polygons-methods.Rd ba9488d7aef328e7c40d1ca0f9168f0c *man/polygons.Rd 249eab8bc2808d8ef5a05333f97e8e93 *man/recenter-methods.Rd fb2d7d3cc0396cb00f9032516394da91 *man/select.spatial.Rd 6ad78b876190e698ef7f33226d021b46 *man/sp-deprecated.Rd 586721930ea6d6ac5743f9774a5cd81e *man/spChFIDs-methods.Rd 7d5e4ae4b1f21f9e2e32f6346b71a79e *man/spDistsN1.Rd c1b1b7fc96c1d47afed8ade91ffe5190 *man/spTransform.Rd 83b2e65509f21c308a6f4a669d7b1c38 *man/spplot.Rd da23cb2de494ded9ab5b7f0c4d93ba9f *man/spsample.Rd b0a89e8c8f714d9c3be05773e23f4f5d *man/stack.Rd 2d10c7a98bbe0333f1f97e671a67d9ec *man/surfaceArea.Rd 3703e84a4c133b7671f621075b721c88 *man/zerodist.Rd b1efa15042518ac8f870d15e2fe27d06 *src/Rcentroid.c 893ca5b29110a3cb7952a8bb924b056b *src/gcdist.c 45c922d69dabf0504570ef94da147bd4 *src/init.c 2a79f2e9cd38e6603c529ed704eab7b9 *src/pip.c 7b048d7af80064b653b049fce283d2a4 *src/pip2.c fac0957e6f3a98425f8519d0e945f65d *src/sp.h 85f179076e41701782a685ad110de22b *src/sp_xports.c 69af476fca6ecdc9d23bd31caa086283 *src/surfaceArea.c 8f31429f883966a9061bfe95d943edd5 *src/zerodist.c 272bd0ff3ae1e3b24498ef9ee21e589c *tests/agg.R 17d6c90a76e0bee536a07d4de646267f *tests/agg.Rout.save 9271d11ad2bb25bb925b9be3927a9079 *tests/base.R 0b54a3d7c4cc14b6984b6b7af380df8b *tests/base.Rout.save d6f8d16819e2a3ebec31c75b45f63ade *tests/fail1.R 96970e0d4f41f8b07bccafff986b338f *tests/fail1.Rout.save f4269f0ccbee1be2b5f69ac1fe15febc *tests/grid.R a0a39c8d57c1e5bf12757c552e13f88e *tests/grid.Rout.save 97a7f7a2a1d07127aed02ee95435ff62 *tests/mp.Rout.save 1e0ef03882f25e548a00a02d2f515ce3 *tests/nc.Rout.save 660cb2708c370a8f40c70e1d2d9ffed8 *tests/over.Rout.save 6b5046ed099b398a486d75de9153ad9a *tests/over2.R 455d7c5e61ee6efce3eb098d4bd29e4a *tests/over2.Rout.save 42b289488ff90cd464c580b9364843d3 *tests/pass1.R 15736fa56f049c88c9417e79d0cacc76 *tests/pass1.Rout.save f624a95efb247016547d4596caf4bb77 *tests/point.in.polygon.R 6330efd4e3857ad45e600895fa1d2840 *tests/point.in.polygon.Rout.save b46cbcc123650d0ace7ebd3153d27470 *tests/sel.R 34fd5f86cde7e8d97cbfd115f9895261 *tests/sel.Rout.save d314caf426f5126f9722140ae9c9f482 *tests/sp1.R bb672e5edcee528ca70ea336534fbe3b *tests/sp1.Rout.save c0b5d93cecc551db08bcc15512eafc0d *tests/spDists.R 8c5645fb03743d136f9f7fc1cc7d1acc *tests/spDists.Rout.save fa92c923a4ccac79949782b4e0ccb234 *tests/spplot.R adbf3b5f15ccd87b7dd2012aec30515e *tests/spplot.Rout.save bc9a9e3ce0d91dd6118a7360f0de5dfb *tests/zerodist.R 10023bd78b7fa7f90f23ec71d79c5267 *tests/zerodist.Rout.save 37763db0437687671aa10811a9b05338 *vignettes/CRS_warnings.Rmd d0256779c4d32648db1f98702427588e *vignettes/csdacm.Rnw d55d2b03e6c3b28eafe79bf447970cc6 *vignettes/intro_sp.Rnw 6457da7ce638431f7839af4375fb8acd *vignettes/over.Rnw sp/DESCRIPTION0000644000175000017500000000574614144231202012541 0ustar nileshnileshPackage: sp Version: 1.4-6 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("Finn", "Lindgren", role = "ctb"), person("Josh", "O'Brien", role = "ctb"), person("Joseph", "O'Rourke", role = "ctb")) Depends: R (>= 3.0.0), methods Imports: utils, stats, graphics, grDevices, lattice, grid Suggests: RColorBrewer, rgdal (>= 1.2-3), rgeos (>= 0.3-13), gstat, maptools, deldir, knitr, rmarkdown 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 VignetteBuilder: knitr NeedsCompilation: yes Packaged: 2021-11-13 15:42:06 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], Finn Lindgren [ctb], Josh O'Brien [ctb], Joseph O'Rourke [ctb] Maintainer: Edzer Pebesma Repository: CRAN Date/Publication: 2021-11-14 16:00:02 UTC sp/man/0000755000175000017500000000000014112150047011574 5ustar nileshnileshsp/man/polygons.Rd0000644000175000017500000000165513171625774013766 0ustar nileshnilesh\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/meuse.grid.Rd0000644000175000017500000000271413171625774014153 0ustar nileshnilesh\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/meuse.grid_ll.Rd0000644000175000017500000000074613171625774014645 0ustar nileshnilesh\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/coordinates-methods.Rd0000644000175000017500000000472013171625774016063 0ustar nileshnilesh\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/SpatialMultiPoints-class.Rd0000644000175000017500000000706513171625774017025 0ustar nileshnilesh\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/gridded-methods.Rd0000644000175000017500000000630113227440060015131 0ustar nileshnilesh\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 deriving 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 deriving 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/spTransform.Rd0000644000175000017500000000157213671766264014435 0ustar nileshnilesh\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-methods]{spTransform}; when \code{rgdal} cannot be loaded, an error message follows. } \keyword{methods} \keyword{spatial} sp/man/image.Rd0000644000175000017500000001336713305456622013172 0ustar nileshnilesh\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 = !(.Platform$GUI[1] == "Rgui" && getIdentification() == "R Console") && 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}{if TRUE, use \code{\link[graphics]{rasterImage}} to render the image if available; for legacy rendering set FALSE; should be FALSE on Windows SDI installations} \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/as.SpatialPolygons.GridTopology.Rd0000644000175000017500000000524713577144130020260 0ustar nileshnilesh\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(as(meuse.grid[,1:3], "SpatialPolygonsDataFrame"), xxpl, areaWeighted=TRUE), main = "aggregated meuse.grid") } } \keyword{spatial} sp/man/select.spatial.Rd0000644000175000017500000000237113171625774015023 0ustar nileshnilesh\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/Line-class.Rd0000644000175000017500000000135613171625774014104 0ustar nileshnilesh\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/SpatialPolygonsDataFrame-class.Rd0000644000175000017500000000603613171625774020112 0ustar nileshnilesh\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/as.SpatialPolygons.PolygonsList.Rd0000644000175000017500000000633413171625774020312 0ustar nileshnilesh\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/over.Rd0000644000175000017500000002042013671767516013064 0ustar nileshnilesh\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:pred-binary-gRelate]{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 preferred 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:pred-binary-gIntersects]{gIntersects}.} \seealso{ \code{vignette("over")} for examples and figures; \link{point.in.polygon}, package \link[rgeos:pred-binary-gIntersects]{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/CRS-class.Rd0000644000175000017500000002051114112150047013614 0ustar nileshnilesh\name{CRS-class} \docType{class} \alias{CRS-class} \alias{CRS} \alias{CRSargs} \alias{identicalCRS} \alias{print.CRS} \alias{show,CRS-method} \alias{wkt,CRS-method} \alias{rebuild_CRS} \alias{rebuild_CRS,CRS-method} \alias{is.projected,CRS-method} \title{Class "CRS" of coordinate reference system arguments} \description{Interface class to the PROJ projection and transformation system. The class is defined as an empty stub accepting value NA in the sp package. The initiation function may call the PROJ library through \pkg{rgdal} to verify the argument set against those known in the library, returning error messages where necessary. If the \code{"CRS"} object is instantiated using \code{CRS()} with \pkg{rgdal} using PROJ >= 6 and GDAL >= 3, the object may also have a WKT2 (2019) string carried as a \code{comment}. The arguments for a Proj.4 string must be entered exactly as in the Proj.4 documentation, in particular there cannot be any white space in \code{+=} 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. If the argument is a zero-length string or a character \code{NA}, the object records \code{NA}. If the \code{"CRS"} object is instantiated using \code{CRS()} with \pkg{rgdal} using PROJ >= 6 and GDAL >= 3, the object may also have a WKT2 (2019) string carried as a \code{comment}. The initiation function may call the PROJ library through \pkg{rgdal} 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 Proj.4 string used by the PROJ 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 deprecated Proj.4 projection arguments and WKT2 2019 representation if available } \item{wkt}{\code{signature(object = "CRS")}: return WKT comment on object} \item{rebuild_CRS}{rebuild a CRS object, usually used to add a WKT comment with PROJ >= 6 and GDAL >= 3} } } \usage{ CRS(projargs, doCheckCRSArgs=TRUE, SRS_string=NULL, get_source_if_boundcrs=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. With \pkg{rgdal} built with PROJ >= 6 and GDAL >= 3, the \code{+init=} key may only be used with value \code{epsg:}. From \pkg{sp} version 1.4-4, the string associated with the SRS_string argument may be entered as-is and will be set as SRS_string if the projargs argument does not begin with a \code{+} (suggested by Mikko Vihtakari).} \item{doCheckCRSArgs}{default TRUE, must be set to FALSE by package developers including \code{CRS} in an S4 class definition to avoid uncontrollable loading of the \pkg{rgdal} namespace} \item{SRS_string}{default NULL, only used when \pkg{rgdal} is built with PROJ >= 6 and GDAL >= 3; a valid WKT string or SRS definition such as \code{"EPSG:4326"} or \code{"ESRI:102761"}} \item{get_source_if_boundcrs}{(from \pkg{rgdal} 1.5-17, default TRUE) The presence of the \code{+towgs84=} key in a Proj4 string \code{projargs=} argument value may promote the output WKT2 CRS to BOUNDCRS for PROJ >= 6 and GDAL >= 3, which is a coordinate operation from the input datum to WGS84. This is often unfortunate, so a PROJ function is called through \pkg{rgdal} to retrieve the underlying source definition.} \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}} \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:showWKT]{showEPSG}} for help in finding CRS definitions. The 4.9.1 release of the PROJ library 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}. From release 6 of the PROJ library, when used in building \pkg{rgdal} with GDAL >= 3, the \code{+datum=} key in the Proj.4 string CRS representation is deprecated, and the \code{+towgs84=} and \code{+nadgrids=} keys may be deprecated soon. For this reason, \pkg{sp}, \pkg{rgdal} and \pkg{sf} are starting to use WKT2 (2019) string representations. In \pkg{sp}, the \code{"CRS"} object in itself remains unchanged, but the content of its \code{"projargs"} slot may be degraded. To work around the degradation, a \code{comment} is added around the \code{"CRS"} object containing a WKT2 (2019) string when \pkg{rgdal} is available and built with PROJ >= 6 and GDAL >=3. } \examples{ CRS() CRS("") CRS(as.character(NA)) CRS("+proj=longlat +datum=WGS84") run <- FALSE run <- require(rgdal) if (run) { print(CRSargs(CRS("+proj=longlat +datum=NAD27"))) } if (run) { print(CRSargs(CRS("+init=epsg:4267"))) } if (run) { print(CRSargs(CRS("+init=epsg:26978"))) } if (run) { 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")))) } if (run) { print(CRSargs(CRS("+init=epsg:28992"))) } if (run) { print(CRSargs(CRS("EPSG:28992"))) } if (run) { print(CRSargs(CRS(SRS_string="EPSG:28992"))) } if (run) { o <- try(CRS(SRS_string="ESRI:102760")) if (!inherits(o, "try-error")) print(CRSargs(o)) } if (run) { o <- try(CRS("EPSG:4326")) if (!inherits(o, "try-error")) print(CRSargs(o)) } if (run) { o <- try(CRS("ESRI:102760")) if (!inherits(o, "try-error")) print(CRSargs(o)) } if (run) { o <- new("Spatial") proj4string(o) <- CRS("+init=epsg:27700") } if (run && !is.null(comment(slot(o, "proj4string")))) { cat(wkt(o), sep="\n") cat(wkt(slot(o, "proj4string")), sep="\n") } } \keyword{classes} \keyword{spatial} sp/man/bubble.Rd0000644000175000017500000000546313171625774013350 0ustar nileshnilesh\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/00sp.Rd0000644000175000017500000000772613724223752012675 0ustar nileshnilesh\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 arbitrary 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} GDAL and OGR: \url{https://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/bpy.colors.Rd0000644000175000017500000000250013171625774014174 0ustar nileshnilesh\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/spsample.Rd0000644000175000017500000001461413171625774013737 0ustar nileshnilesh\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} functions} \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/point.in.polygon.Rd0000644000175000017500000000227013171625774015332 0ustar nileshnilesh\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/Polygon-class.Rd0000644000175000017500000000223113171625774014635 0ustar nileshnilesh\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/surfaceArea.Rd0000644000175000017500000000461613171625774014335 0ustar nileshnilesh\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/compassRose.Rd0000644000175000017500000000132513171625774014404 0ustar nileshnilesh\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/mapasp.Rd0000644000175000017500000000213713171625774013371 0ustar nileshnilesh\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/Lines-class.Rd0000644000175000017500000000156313227440060014250 0ustar nileshnilesh\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 length 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/GridTopology-class.Rd0000644000175000017500000000326713171625774015642 0ustar nileshnilesh\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} sp/man/Spatial-class.Rd0000644000175000017500000001511113660452030014566 0ustar nileshnilesh\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} \alias{rebuild_CRS,Spatial-method} \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"}. The name of this slot was chosen to reflect the use of Proj.4 strings to represent coordinate reference systems (CRS). The slot name will continue to be used, but as PROJ >= 6 and GDAL >= 3 are taken into use for reading files and for projection and transformation, the Proj.4 string CRS representation is being supplemented by a WKT2 (2019) representation. The reason for the modification is that important keys in the Proj.4 string representation are being deprecated in PROJ >= 6 and GDAL >= 3. Legacy \code{"CRS"} objects hold only a valid Proj.4 string, which can be used for unprojecting or reprojecting coordinates; it is initialised to NA. If the \code{"CRS"} object is instantiated using \code{CRS()} with \pkg{rgdal} using PROJ >= 6 and GDAL >= 3, the object may also have a WKT2 (2019) string carried as a \code{comment}. Non-NA strings may be 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 } \item{rebuild_CRS}{rebuild a CRS object, usually used to add a WKT comment with PROJ >= 6 and GDAL >= 3} } } \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{ o <- new("Spatial") proj4string(o) <- CRS("+init=epsg:27700") if (!is.null(comment(slot(o, "proj4string")))) { cat(strsplit(wkt(o), "\\n")[[1]], sep="\n") cat(strsplit(wkt(slot(o, "proj4string")), "\\n")[[1]], sep="\n") } } \keyword{classes} sp/man/SpatialGridDataFrame-class.Rd0000644000175000017500000001375714112150047017153 0ustar nileshnilesh\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 continuous 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 labels 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{https://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/flip.Rd0000644000175000017500000000150013171625774013033 0ustar nileshnilesh\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.Rd0000644000175000017500000000356113171625774013615 0ustar nileshnilesh\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/disaggregate.Rd0000644000175000017500000000327013171625774014535 0ustar nileshnilesh\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/meuse.riv.Rd0000644000175000017500000000314213171625774014022 0ustar nileshnilesh\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/addattr.Rd0000644000175000017500000000260013171625774013526 0ustar nileshnilesh\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/Polygons-class.Rd0000644000175000017500000000351113171625774015022 0ustar nileshnilesh\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/dimensions.Rd0000644000175000017500000000150413227440060014236 0ustar nileshnilesh\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 deriving 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/SpatialMultiPoints.Rd0000644000175000017500000000546213171625774015721 0ustar nileshnilesh\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/SpatialLines.Rd0000644000175000017500000000413213171625774014475 0ustar nileshnilesh\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/zerodist.Rd0000644000175000017500000000554013171625774013754 0ustar nileshnilesh\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 longitude/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/coordnames-methods.Rd0000644000175000017500000000427213171625774015705 0ustar nileshnilesh\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/coordinates.Rd0000644000175000017500000000264513171625774014426 0ustar nileshnilesh\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/SpatialGridDataFrame.Rd0000644000175000017500000000351413171625774016060 0ustar nileshnilesh\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/stack.Rd0000644000175000017500000000451713171625774013221 0ustar nileshnilesh\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/sp-deprecated.Rd0000644000175000017500000000274613171625774014636 0ustar nileshnilesh\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/SpatialPointsDataFrame-class.Rd0000644000175000017500000000645513171625774017561 0ustar nileshnilesh\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/spplot.Rd0000644000175000017500000003127113671767422013434 0ustar nileshnilesh\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:interaction]{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{https://edzer.github.io/sp/} } \seealso{\link[lattice]{xyplot}, \link[lattice]{levelplot}, \link[lattice:interaction]{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/SpatialGrid-class.Rd0000644000175000017500000000355113171625774015417 0ustar nileshnilesh\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/aggregate.Rd0000644000175000017500000001105113671765552014035 0ustar nileshnilesh\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:topo-bin-gIntersection]{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/spChFIDs-methods.Rd0000644000175000017500000000307213171625774015153 0ustar nileshnilesh\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/meuse.Rd0000644000175000017500000000706413171625774013232 0ustar nileshnilesh\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 variables at 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/SpatialMultiPointsDataFrame-class.Rd0000644000175000017500000000515313171625774020566 0ustar nileshnilesh\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/recenter-methods.Rd0000644000175000017500000000423613227440060015343 0ustar nileshnilesh\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 preferred, 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/SpatialGrid.Rd0000644000175000017500000001103613171625774014311 0ustar nileshnilesh\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 succeeds 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/degaxis.Rd0000644000175000017500000000161413171625774013533 0ustar nileshnilesh\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/polygons-methods.Rd0000644000175000017500000000143413171625774015422 0ustar nileshnilesh\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/loadmeuse.Rd0000644000175000017500000000047313171625774014067 0ustar nileshnilesh\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/spDistsN1.Rd0000644000175000017500000000754313171625774013746 0ustar nileshnilesh\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/DMS-class.Rd0000644000175000017500000000277713171625774013650 0ustar nileshnilesh\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/SpatialPolygons-class.Rd0000644000175000017500000001322613671765734016352 0ustar nileshnilesh\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:comment-functions]{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. Refer to Bivand et al. (2013), pages 47-48 and 132-133 for a further discussion. } \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}}. } \references{Roger Bivand, Edzer Pebesma and Virgilio Gomez-Rubio, 2013. Applied spatial data analysis with R, Second edition. Springer, NY. \url{https://asdar-book.org/}} \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/geometry-methods.Rd0000644000175000017500000000273013171625774015403 0ustar nileshnilesh\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/Line.Rd0000644000175000017500000000157113171625774013000 0ustar nileshnilesh\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/SpatialPixelsDataFrame-class.Rd0000644000175000017500000000701313171625774017540 0ustar nileshnilesh\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/Rlogo.Rd0000644000175000017500000000221613171625774013170 0ustar nileshnilesh\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/SpatialPolygons.Rd0000644000175000017500000001032513671765742015243 0ustar nileshnilesh\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:comment-functions]{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. Refer to Bivand et al. (2013), pages 47-48 and 132-133 for a further discussion. } \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} } \references{Roger Bivand, Edzer Pebesma and Virgilio Gomez-Rubio, 2013. Applied spatial data analysis with R, Second edition. Springer, NY. \url{https://asdar-book.org/}} \keyword{manip} sp/man/SpatialPixels-class.Rd0000644000175000017500000000435513171625774016001 0ustar nileshnilesh\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/gridindex2nb.Rd0000644000175000017500000000237113171625774014467 0ustar nileshnilesh\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/panel.Rd0000644000175000017500000000712513305457030013174 0ustar nileshnilesh\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{https://edzer.github.io/sp/} 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/SpatialPoints.Rd0000644000175000017500000000564413171625774014710 0ustar nileshnilesh\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/gridlines.Rd0000644000175000017500000001122613724165642014064 0ustar nileshnilesh\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-methods]{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") if (require(rgdal, quietly=TRUE)) { 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{ if (require(maps)) demo(polar) # adds the map of the antarctic } } \keyword{spatial} sp/man/is.projected.Rd0000644000175000017500000000726713724165642014507 0ustar nileshnilesh\name{is.projected} \alias{is.projected} \alias{proj4string} \alias{proj4string<-} \alias{is.projected,Spatial-method} \alias{proj4string,Spatial-method} \alias{wkt} \alias{wkt,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 library, and should be set to an appropriate value. From release 6 of the PROJ library, when used in building \pkg{rgdal} with GDAL >= 3, the \code{+datum=} key in the Proj.4 string CRS representation is deprecated, and the \code{+towgs84=} and \code{+nadgrids=} keys may be deprecated soon. For this reason, \pkg{sp}, \pkg{rgdal} and \pkg{sf} are starting to use WKT2 (2019) string representations. In \pkg{sp}, the \code{"CRS"} object in itself remains unchanged, but the content of its \code{"projargs"} slot may be degraded. To work around the degradation, a \code{comment} is added around the \code{"CRS"} object containing a WKT2 (2019) string when \pkg{rgdal} is available and built with PROJ >= 6 and GDAL >=3. The \code{wkt()} accessor function returns the WKT2 (2019) string comment belonging to the \code{"CRS"} object. } \usage{ is.projected(obj) proj4string(obj) proj4string(obj) <- value wkt(obj) 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{ o <- new("Spatial") proj4string(o) <- CRS("+init=epsg:27700") if (!is.null(comment(slot(o, "proj4string")))) { cat(strsplit(wkt(o), "\\n")[[1]], sep="\n") cat(strsplit(wkt(slot(o, "proj4string")), "\\n")[[1]], sep="\n") } is.projected(CRS("+proj=longlat")) is.projected(CRS("+proj=geocent")) is.projected(CRS("+proj=geocent +units=km")) } \keyword{spatial} sp/man/SpatialLinesDataFrame-class.Rd0000644000175000017500000000433313171625774017350 0ustar nileshnilesh\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/SpatialLines-class.Rd0000644000175000017500000000644313171625774015607 0ustar nileshnilesh\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/SpatialPoints-class.Rd0000644000175000017500000001017513171625774016006 0ustar nileshnilesh\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/merge.Rd0000644000175000017500000000302413171625774013203 0ustar nileshnilesh\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/bbox.Rd0000644000175000017500000000250213171625774013036 0ustar nileshnilesh\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/asciigrid.Rd0000644000175000017500000000304313171625774014043 0ustar nileshnilesh\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/src/0000755000175000017500000000000014143756316011627 5ustar nileshnileshsp/src/gcdist.c0000644000175000017500000000526713721473670013262 0ustar nileshnilesh#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(fmod(lon1[0] - 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/sp_xports.c0000644000175000017500000004677413305456622014052 0ustar nileshnilesh#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, cls; 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; } } } // rchk MAKE_CLASS allocates RSB 180602 PROTECT(cls = MAKE_CLASS("Polygon")); pc++; PROTECT(SPans = NEW_OBJECT(cls)); 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/Rcentroid.c0000644000175000017500000000261013171625774013726 0ustar nileshnilesh#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 # 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 (MAYBE_REFERENCED(px)) { PROTECT(px1 = duplicate(px)); pc++; } else px1 = px; if (MAYBE_REFERENCED(py)) { PROTECT(py1 = duplicate(py)); pc++; } else py1 = py; if (MAYBE_REFERENCED(polx)) { PROTECT(polx1 = duplicate(polx)); pc++; } else polx1 = polx; if (MAYBE_REFERENCED(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/sp.h0000644000175000017500000000572614143756272012435 0ustar nileshnilesh#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.4-6" #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/surfaceArea.c0000644000175000017500000000446113171625774014224 0ustar nileshnilesh#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/src/pip2.c0000644000175000017500000000572513171625774012661 0ustar nileshnilesh# 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/zerodist.c0000644000175000017500000000601413171625774013642 0ustar nileshnilesh#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/init.c0000644000175000017500000000366313171625774012751 0ustar nileshnilesh#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/vignettes/0000755000175000017500000000000014143756315013047 5ustar nileshnileshsp/vignettes/intro_sp.Rnw0000644000175000017500000004775513171625774015422 0ustar nileshnilesh% 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/vignettes/csdacm.Rnw0000644000175000017500000011655713724165642015011 0ustar nileshnilesh%% $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., <>= run <- require(rgdal, quietly=TRUE) @ \begin{footnotesize} <<>>= if (run) { 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} <<>>= if (run) { library(rgdal) x <- GDAL.open(fn) class(x) } if (run) { x.subs <- x[1:100, 1:100, 1] class(x.subs) } if (run) { 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) @ <<>>= if (run) { 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/over.Rnw0000644000175000017500000005054413171625774014526 0ustar nileshnilesh% 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/CRS_warnings.Rmd0000644000175000017500000000700314112150047016034 0ustar nileshnilesh--- title: "Testing packages using CRS objects" author: "Roger Bivand" output: html_document: toc: true toc_float: collapsed: false smooth_scroll: false toc_depth: 2 vignette: > %\VignetteIndexEntry{Testing packages using CRS objects} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ## Introduction As has been explained in https://CRAN.R-project.org/package=rgdal/vignettes/CRS_projections_transformations.html, coordinate reference systems are represented differently when PROJ < 6 and PROJ >= 6. To alert interactive users to the possibility that their workflows might be degraded unless they take the representational changes into account, the **sp** `proj4string()` method issues warnings if a `"CRS"` object does not have an accompanying `WKT2 2019` representation (stored in a `comment` attached to the `"CRS"` object). This is because `proj4string()` only returns the PROJ 4 representation, not the accompanying `WKT2 2019` representation if any, so may constitute a loss of information. See also https://stat.ethz.ch/pipermail/r-sig-geo/2020-May/028125.html for further discussion. In general, it is good practice to replace all use in packages of `proj4string()` with `slot(, "proj4string")` and its assignment form by the assignment form of `slot()`; when `sp::proj4string()` is not called, many of the warnings are suppressed anyway. On attaching **rgdal**: ```{r, echo=FALSE} run <- FALSE if (requireNamespace("rgdal", quietly=TRUE)) run <- TRUE ``` ```{r, eval=run} library(rgdal) ``` a package startup message is displayed if PROJ >= 6 and GDAL >= 3, including the important information that: > To mute warnings of possible GDAL/OSR exportToProj4() degradation, use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal. In **sp** 1.4 and **rgdal** 1.5, the default option value is `"all"`, in **sp** >= 1.5 and **rgdal** >= 1.6, the default will be flipped to `"none"`. ## Testing Both CRAN checks and use of checks by end users may trigger spurious errors, if the versions of PROJ and GDAL differ from those on the development platform. Since the `WKT2 2019` representation is only generated on systems with PROJ >= 6 (and GDAL >= 3), warnings should not be expected when the same code is run on platforms with older versions of PROJ and GDAL. There are many such platforms, including RHEL and CentOS systems, as well as Ubuntu 18 and others. Think of a large lab with a cluster runnning such a system version, and that those installing software may wish to run `R CMD check` or just your test suite to confirm that things are as they should be. They will be dismayed to find that tests fail, but will not be able to find out whether this matters for them. Consequently, it is best either not to check warnings that perform differently when run under different versions of upstream external software (PROJ and GDAL), or to condition on the software versions with different expectations depending on the version. To mute warnings in all settings, add the option above early in any relevant test file. Fine-grained control may be obtained using `rgdal::rgdal_extSoftVersion()`: ```{r, eval=run} rgdal::rgdal_extSoftVersion() ``` and its shorter version, testing only PROJ >= 6 (and GDAL >= 3): ```{r, eval=run} rgdal::new_proj_and_gdal() ``` Using this test, a warning might be expected if recent PROJ and GDAL are used, and before the warning default is flipped in **sp** > 1.4 and **rgdal** > 1.5. In **sf**, use `sf::sf_extSoftVersion()` to determine versions if necessary. sp/build/0000755000175000017500000000000014143756315012136 5ustar nileshnileshsp/build/vignette.rds0000644000175000017500000000052314143756315014475 0ustar nileshnileshR=O0MP#ĀX[uaACH4ؑ%Gsb ";w}y|5sI'odIA\dej02Em\h%X}ÆVsTUBƑmиԌh̻,& H RVr˹0[Iթa׆o&-`!ψ'W9ֺ,=Xe/*;8(lA/YZ[O^ճ]Nmp``;̚=7W\4|Z*FJ֑kvn^;]xfv"fJQ>y_{sp/tests/0000755000175000017500000000000014112150047012163 5ustar nileshnileshsp/tests/nc.Rout.save0000644000175000017500000000212413171625774014414 0ustar nileshnilesh 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/point.in.polygon.Rout.save0000644000175000017500000000173013724165642017237 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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 > > proc.time() user system elapsed 0.209 0.024 0.227 sp/tests/grid.Rout.save0000644000175000017500000001464213724165642014746 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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" "array" 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" "array" 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.483 0.031 0.509 sp/tests/grid.R0000644000175000017500000000242213724165642013252 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") library(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/over2.Rout.save0000644000175000017500000000611413724165642015051 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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.403 0.037 0.434 sp/tests/zerodist.R0000644000175000017500000000120013724165642014161 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") 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! 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/spDists.R0000644000175000017500000000075413724165642013764 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") 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) summary(as.vector(out2 - out)) out = spDists(meuse.grid,meuse) sum(out2 - t(out)) summary(as.vector(out2 - t(out))) sp/tests/sp1.Rout.save0000644000175000017500000002052713724165642014523 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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.291 0.033 0.320 sp/tests/zerodist.Rout.save0000644000175000017500000001225213724165642015657 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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 140 9 26 7 90 17 133 [163] 82 35 116 > # 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.241 0.025 0.259 sp/tests/fail1.Rout.save0000644000175000017500000002265214112150047014776 0ustar nileshnilesh R version 4.0.4 (2021-02-15) -- "Lost Library Book" Copyright (C) 2021 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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")) Coordinate Reference System: Deprecated Proj.4 representation: +proj=longlat +ellps=WGS84 +no_defs WKT2 2019 representation: GEOGCRS["unknown", DATUM["Unknown based on WGS84 ellipsoid", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1], ID["EPSG",7030]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8901]], CS[ellipsoidal,2], AXIS["longitude",east, ORDER[1], ANGLEUNIT["degree",0.0174532925199433, ID["EPSG",9122]]], AXIS["latitude",north, ORDER[2], ANGLEUNIT["degree",0.0174532925199433, ID["EPSG",9122]]]] Warning message: In CRS("+proj=lonlat +ellps=WGS84") : 'lonlat' changed to 'longlat': +proj=longlat +ellps=WGS84 > > proc.time() user system elapsed 0.500 0.042 0.536 sp/tests/mp.Rout.save0000644000175000017500000001302013171625774014425 0ustar nileshnilesh 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/sel.Rout.save0000644000175000017500000000750413724165642014603 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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.435 0.025 0.454 sp/tests/sel.R0000644000175000017500000000345113724165642013113 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") 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) 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/tests/pass1.R0000644000175000017500000000764613724165642013371 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") library(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/over2.R0000644000175000017500000000215613724165642013366 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") library(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/spplot.Rout.save0000644000175000017500000000256713724165642015345 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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.417 0.028 0.442 sp/tests/pass1.Rout.save0000644000175000017500000004660113724165642015050 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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 om landuse ffreq zinc 0:111 Min. : 1.000 W :50 1:84 Min. : 113.0 1: 44 1st Qu.: 5.300 Ah :39 2:48 1st Qu.: 198.0 Median : 6.900 Am :22 3:23 Median : 326.0 Mean : 7.478 Fw :10 Mean : 469.7 3rd Qu.: 9.000 Ab : 8 3rd Qu.: 674.5 Max. :17.000 (Other):25 Max. :1839.0 NA's :2 NA's : 1 dist copper cadmium soil dist.m Min. :0.00000 Min. : 14.00 Min. : 0.200 1:97 Min. : 10.0 1st Qu.:0.07569 1st Qu.: 23.00 1st Qu.: 0.800 2:46 1st Qu.: 80.0 Median :0.21184 Median : 31.00 Median : 2.100 3:12 Median : 270.0 Mean :0.24002 Mean : 40.32 Mean : 3.246 Mean : 290.3 3rd Qu.:0.36407 3rd Qu.: 49.50 3rd Qu.: 3.850 3rd Qu.: 450.0 Max. :0.88039 Max. :128.00 Max. :18.100 Max. :1000.0 lead elev Min. : 37.0 Min. : 5.180 1st Qu.: 72.5 1st Qu.: 7.546 Median :123.0 Median : 8.180 Mean :153.4 Mean : 8.165 3rd Qu.:207.0 3rd Qu.: 8.955 Max. :654.0 Max. :10.520 > > # 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 Length:9 Min. :1.000 1st Qu.:1.000 Class :character 1st Qu.:1.000 Median :1.000 Mode :character 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 Length:9 Min. :1.000 Length:9 Min. :1.000 Class :character 1st Qu.:1.000 Class :character 1st Qu.:1.000 Mode :character Median :1.000 Mode :character 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: +proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs] Data attributes: something Length:1 Class :character Mode :character > 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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs] Data attributes: something Length:1 Class :character Mode :character > 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 : [+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +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.651 0.042 0.692 sp/tests/agg.Rout.save0000644000175000017500000000472013724165642014553 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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.770 0.037 0.805 sp/tests/spDists.Rout.save0000644000175000017500000000263213724165642015446 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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 > > proc.time() user system elapsed 0.716 0.139 0.849 sp/tests/fail1.R0000644000175000017500000001051313724165642013321 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") library(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/spplot.R0000644000175000017500000000054113724165642013646 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") 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 # convert to SpatialPixelsDataFrame: tst = SpatialPixelsDataFrame(tst, data.frame(xx = rnorm(9))) spplot(tst["xx"], main = "empty row + col") sp/tests/over.Rout.save0000644000175000017500000000656613171625774015005 0ustar nileshnilesh 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/sp1.R0000644000175000017500000000147413724165642013036 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") 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,] 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/agg.R0000644000175000017500000000262013724165642013063 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") 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]] 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/base.R0000644000175000017500000000177313724165642013247 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") library(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/point.in.polygon.R0000644000175000017500000000033613724165642015553 0ustar nileshnileshoptions("rgdal_show_exportToProj4_warnings"="none") library(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/base.Rout.save0000644000175000017500000004442113724165642014731 0ustar nileshnilesh R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 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. > options("rgdal_show_exportToProj4_warnings"="none") > 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.426 0.040 0.459 sp/R/0000755000175000017500000000000014143756235011241 5ustar nileshnileshsp/R/Class-SpatialPolygons.R0000644000175000017500000001015713171625774015566 0ustar nileshnileshsetClass("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/SpatialGrid-methods.R0000644000175000017500000002776013660452030015231 0ustar nileshnileshSpatialPixels = 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(slot(slot(points, "proj4string"), "projargs"))) 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") pts@bbox[,1] = pts@bbox[,1] - 0.5 * from@grid@cellsize pts@bbox[,2] = pts@bbox[,2] + 0.5 * from@grid@cellsize 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], rebuild_CRS(slot(x, "proj4string")))) 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=rebuild_CRS(slot(obj, "proj4string"))) 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/chfids.R0000644000175000017500000000355713171625774012641 0ustar nileshnileshchFIDsSpatialLines <- 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/over.R0000644000175000017500000001762013171625774012350 0ustar nileshnilesh.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/mapasp.R0000644000175000017500000000076713660452030012644 0ustar nileshnileshmapasp <- 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(slot(slot(data, "proj4string"), "projargs")) || 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/sp_spat1.R0000644000175000017500000000557113171625774013131 0ustar nileshnilesh# 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/rbind.R0000644000175000017500000000702213751020016012444 0ustar nileshnileshmakeUniqueIDs <- 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)), rebuild_CRS(slot(dots[[1]], "proj4string"))) 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")), rebuild_CRS(slot(dots[[1]], "proj4string"))) } 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 = rebuild_CRS(slot(dots[[1]], "proj4string"))) } 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 = rebuild_CRS(slot(dots[[1]], "proj4string"))) } 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/Class-SpatialLines.R0000644000175000017500000000322713171625774015026 0ustar nileshnileshsetClass("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/zerodist.R0000644000175000017500000000306613171625774013237 0ustar nileshnileshzerodist <- 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/SpatialPolygons-internals.R0000644000175000017500000001114313171625774016514 0ustar nileshnilesh .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/SpatialLinesDataFrame-methods.R0000644000175000017500000000666713171625774017204 0ustar nileshnileshSpatialLinesDataFrame = 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/R/CRS-methods.R0000644000175000017500000002106314112150047013437 0ustar nileshnilesh# Copyright (c) 2003-21 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))) } } if (!isGeneric("rebuild_CRS")) setGeneric("rebuild_CRS", function(obj) standardGeneric("rebuild_CRS")) setMethod("rebuild_CRS", signature(obj = "CRS"), function(obj) { if (is.null(comment(obj))) { obj <- CRS(slot(obj, "projargs")) } obj } ) "CRS" <- function(projargs=NA_character_, doCheckCRSArgs=TRUE, SRS_string=NULL, get_source_if_boundcrs=TRUE) { # cautious change BDR 150424 # trap NULL too 200225 if (is.null(projargs)) warning("CRS: projargs should not be NULL; set to NA") if ((is.null(projargs)) || (!is.na(projargs) && !nzchar(projargs))) projargs <- NA_character_ # condition added 140301 stopifnot(is.logical(doCheckCRSArgs)) stopifnot(length(doCheckCRSArgs) == 1L) stopifnot(is.logical(get_source_if_boundcrs)) stopifnot(length(get_source_if_boundcrs) == 1L) stopifnot(is.character(projargs)) # CRS_CACHE <- get("CRS_CACHE", envir=.sp_CRS_cache) input_projargs <- projargs if (!is.na(input_projargs)) { res <- .sp_CRS_cache[[input_projargs]] if (!is.null(res)) { return(res) } } if (doCheckCRSArgs && requireNamespace("rgdal", quietly = TRUE)) { if (packageVersion("rgdal") >= "1.5.1" && !rgdal::new_proj_and_gdal()) { if (is.na(projargs) && !is.null(SRS_string)) { if (substring(SRS_string, 1, 4) == "EPSG") { pa0 <- strsplit(SRS_string, ":")[[1]] projargs <- paste0("+init=epsg:", pa0[2]) } } } } if (!is.na(projargs)) { if (length(grep("^[ ]*\\+", projargs)) == 0) { if (is.null(SRS_string)) { if (doCheckCRSArgs && requireNamespace("rgdal", quietly = TRUE)) { if (packageVersion("rgdal") >= "1.5.1") { if (rgdal::new_proj_and_gdal()) { SRS_string <- projargs projargs <- NA_character_ } else { if (substring(projargs, 1, 4) == "EPSG") { pa0 <- strsplit(projargs, ":")[[1]] projargs <- paste0("+init=epsg:", pa0[2]) } else { stop("Cannot revert", projargs, "to +init=epsg:") } } } } } else { 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 comm <- NULL if (!is.na(uprojargs) || (!is.null(SRS_string) && nzchar(SRS_string))) { if (doCheckCRSArgs && requireNamespace("rgdal", quietly = TRUE)) { if (packageVersion("rgdal") < "1.5.1") { res <- rgdal::checkCRSArgs(uprojargs) if (!res[[1]]) stop(res[[2]]) uprojargs <- res[[2]] } else if (packageVersion("rgdal") >= "1.5.1") { if (rgdal::new_proj_and_gdal()) { if (packageVersion("rgdal") >= "1.5.17") { res <- rgdal::checkCRSArgs_ng(uprojargs=uprojargs, SRS_string=SRS_string, get_source_if_boundcrs=get_source_if_boundcrs) } else { res <- rgdal::checkCRSArgs_ng(uprojargs=uprojargs, SRS_string=SRS_string) } if (!res[[1]]) stop(res[[2]]) uprojargs <- res[[2]] comm <- res[[3]] } else { #stop("rgdal version mismatch") if (!is.na(uprojargs)) { res <- rgdal::checkCRSArgs(uprojargs) if (!res[[1]]) stop(res[[2]]) uprojargs <- res[[2]] } } } else stop("rgdal version mismatch") } } res <- new("CRS", projargs=uprojargs) if (!is.null(comm)) comment(res) <- comm if (!is.na(slot(res, "projargs"))) .sp_CRS_cache[[input_projargs]] <- res # CRS_CACHE[[input_projargs]] <- res # assign("CRS_CACHE", CRS_CACHE, envir=.sp_CRS_cache) res } if (!isGeneric("wkt")) setGeneric("wkt", function(obj) standardGeneric("wkt")) setMethod("wkt", signature(obj = "CRS"), function(obj) { comm <- comment(obj) if (is.null(comm)) { if (get("rgdal_show_exportToProj4_warnings", envir=.spOptions)) { if (!get("thin_PROJ6_warnings", envir=.spOptions)) { warning("CRS object has no comment") } else { if (get("PROJ6_warnings_count", envir=.spOptions) == 0L) { warning("CRS object has no comment\n repeated warnings suppressed") } assign("PROJ6_warnings_count", get("PROJ6_warnings_count", envir=.spOptions) + 1L, envir=.spOptions) } } } comm } ) "print.CRS" <- function(x, ...) { cat("Coordinate Reference System:\n") pst <- paste(strwrap(x@projargs), collapse="\n") if (nchar(pst) < 40) cat(paste("Deprecated Proj.4 representation:", pst, "\n")) else cat(paste("Deprecated Proj.4 representation:\n", pst, "\n")) wkt <- wkt(x) if (!is.null(wkt)) { cat("WKT2 2019 representation:\n") cat(wkt, "\n") } invisible(pst) } setMethod("show", "CRS", function(object) print.CRS(object)) identicalCRS = function(x, y) { if (! missing(y)) { if (inherits(x, "ST")) x <- slot(slot(x, "sp"), "proj4string") else if (inherits(x, "Raster")) x <- slot(x, "crs") else x <- slot(x, "proj4string") if (inherits(y, "ST")) y <- slot(slot(y, "sp"), "proj4string") else if (inherits(y, "Raster")) y <- slot(y, "crs") else y <- slot(y, "proj4string") identicalCRS1(rebuild_CRS(x), rebuild_CRS(y)) } else { # x has to be list: stopifnot(is.list(x)) if (inherits(x[[1]], "Tracks")) { x <- unlist(lapply(x, function(j) { y <- slot(j, "tracks") if (!is.null(y)) lapply(y, function(l) if (!is.null(l)) slot(l, "sp"))})) } if (length(x) > 1) { if (inherits(x[[1]], "ST")) x[[1]] <- slot(slot(x[[1]], "sp"), "proj4string") else if (inherits(x[[1]], "Raster")) x[[1]] <- slot(x[[1]], "crs") else x[[1]] <- slot(x[[1]], "proj4string") p1 = rebuild_CRS(x[[1]]) !any(!sapply(x[-1], function(p2) { if (inherits(p2, "ST")) p2 <- slot(slot(p2, "sp"), "proj4string") else if (inherits(p2, "Raster")) p2 <- slot(p2, "crs") else p2 <- slot(p2, "proj4string") identicalCRS1(rebuild_CRS(p2), p1)})) } else TRUE } } identicalCRS1 = function(x, y) { args_x <- strsplit(x@projargs, " +")[[1]] args_y <- strsplit(y@projargs, " +")[[1]] setequal(args_x, args_y) } is.na.CRS = function(x) { is.na(x@projargs) && is.null(comment(slot(x, "proj4string"))) } sp/R/recenter.R0000644000175000017500000000343013660452030013160 0ustar nileshnileshif (!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 <- slot(obj, "proj4string") 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 <- slot(obj, "proj4string") 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/image.R0000644000175000017500000001564013232323172012440 0ustar nileshnilesh# 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 = !(.Platform$GUI[1] == "Rgui" && getIdentification() == "R Console") && 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) { 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)) } # 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/gridlines.R0000644000175000017500000000432613660452030013336 0ustar nileshnileshdegreeLabelsNS = 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 = slot(x, "proj4string") 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), slot(x, "proj4string")) 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/bubble.R0000644000175000017500000000356213171625774012630 0ustar nileshnilesh# 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/SpatialLines-methods.R0000644000175000017500000002560013760134142015407 0ustar nileshnileshLine <- 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, slot(SL, "proj4string")) } 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, rebuild_CRS(slot(from, "proj4string"))) } ) 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, rebuild_CRS(slot(from, "proj4string"))) } ) 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)) } 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(slot(slot(object, "proj4string"), "projargs"))) 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(slot(slot(object, "proj4string"), "projargs"))) 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.R0000644000175000017500000003622113751020150013174 0ustar nileshnileshmakegrid = 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, rebuild_CRS(slot(x, "proj4string"))) } 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) = rebuild_CRS(slot(x, "proj4string")) 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) = rebuild_CRS(slot(x, "proj4string")) 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=rebuild_CRS(slot(hex, "proj4string"))) 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/SpatialMultiPoints-methods.R0000644000175000017500000001064713171625774016645 0ustar nileshnilesh"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/SpatialPoints-methods.R0000644000175000017500000000734213660452030015612 0ustar nileshnilesh"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:", slot(slot(x, "proj4string"), "projargs"))), 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/spdists.R0000644000175000017500000000530313171625774013061 0ustar nileshnileshspDistsN1 <- 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/spOptions.R0000644000175000017500000000322513171625774013367 0ustar nileshnileshget_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/bpy.colors.R0000644000175000017500000000105214112150047013435 0ustar nileshnilesh"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.out = 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/asciigrid.R0000644000175000017500000000613713171625774013334 0ustar nileshnileshread.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/SpatialMultiPointsDataFrame-methods.R0000644000175000017500000001172413724165642020404 0ustar nileshnilesh"SpatialMultiPointsDataFrame" = function(coords, data, proj4string = CRS(as.character(NA)), match.ID, bbox = NULL) { if (is(coords, "SpatialMultiPoints") && !is.na(slot(proj4string, "projargs"))) warning("If the coords argument is a SpatialMultiPoints object, set its CRS first;\n the proj4string argument to this function is ignored.") 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/select.spatial.R0000644000175000017500000000110613171625774014300 0ustar nileshnilesh"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/compassRose.R0000644000175000017500000000131113171625774013661 0ustar nileshnileshcompassRose<-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/aggregate.R0000644000175000017500000000756213171625774013327 0ustar nileshnileshaggregate.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/SpatialPolygons-displayMethods.R0000644000175000017500000000703713171625774017515 0ustar nileshnilesh# 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/Class-SpatialGrid.R0000644000175000017500000000121413171625774014633 0ustar nileshnileshsetClass("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/Class-CRS.R0000644000175000017500000000047113660452030013045 0ustar nileshnilesh# Copyright (c) 2003-7 by Barry Rowlingson and Roger Bivand setClass("CRS", slots = c(projargs = "character"), # changed to NA_character_ RSB 2020-02-28 prototype = list(projargs = NA_character_), validity = function(object) { if (length(object@projargs) != 1) return("projargs must be of length 1") } ) sp/R/loadmeuse.R0000644000175000017500000000225213171625774013346 0ustar nileshnilesh# 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/disaggregate.R0000644000175000017500000000733013751020220013773 0ustar nileshnilesh # 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/Class-SpatialGridDataFrame.R0000644000175000017500000000127013171625774016402 0ustar nileshnileshsetClass("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/SpatialGridDataFrame-methods.R0000644000175000017500000004036713751020030016764 0ustar nileshnileshSpatialPixelsDataFrame = 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, rebuild_CRS(slot(from, "proj4string"))) } #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, rebuild_CRS(slot(from, "proj4string"))) } 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], rebuild_CRS(slot(x, "proj4string"))) 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) = rebuild_CRS(slot(grds[[1]], "proj4string")) 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/GridTopology-methods.R0000644000175000017500000001363113751020204015433 0ustar nileshnileshGridTopology = 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.R0000644000175000017500000001457514143756235016171 0ustar nileshnileshSpatialPolygons <- 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(all(sapply(slot(res, "polygons"), # 180201 change any to all after NULL comment found; https://github.com/r-spatial/sf/issues/636 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 { y = SpatialPolygons(x@polygons[i], proj4string=rebuild_CRS(slot(x, "proj4string"))) if (!is.null(comment(x))) comment(y) <- comment(x) y } # 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, rebuild_CRS(slot(SP, "proj4string"))) } 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")), rebuild_CRS(slot(from, "proj4string"))) 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/projected.R0000644000175000017500000001247414112150047013334 0ustar nileshnileshsetMethod("proj4string", signature(obj = "Spatial"), function(obj) { if (!is.null(comment(slot(obj, "proj4string")))) { if (get("rgdal_show_exportToProj4_warnings", envir=.spOptions)) { if (!get("thin_PROJ6_warnings", envir=.spOptions)) { warning("CRS object has comment, which is lost in output; in tests, see\nhttps://cran.r-project.org/web/packages/sp/vignettes/CRS_warnings.html") } else { if (get("PROJ6_warnings_count", envir=.spOptions) == 0L) { warning("CRS object has comment, which is lost in output\n repeated warnings suppressed") } assign("PROJ6_warnings_count", get("PROJ6_warnings_count", envir=.spOptions) + 1L, envir=.spOptions) } } } res <- as.character(obj@proj4string@projargs) res } ) setMethod("wkt", signature(obj = "Spatial"), function(obj) { comm <- comment(slot(obj, "proj4string")) if (is.null(comm)) { if (get("rgdal_show_exportToProj4_warnings", envir=.spOptions)) { if (!get("thin_PROJ6_warnings", envir=.spOptions)) { warning("CRS object has no comment") } else { if (get("PROJ6_warnings_count", envir=.spOptions) == 0L) { warning("CRS object has no comment\n repeated warnings suppressed") } assign("PROJ6_warnings_count", get("PROJ6_warnings_count", envir=.spOptions) + 1L, envir=.spOptions) } } } comm } ) 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 } is.projectedSpatial <- function(obj) { p4str <- slot(obj, "proj4string") is.projected(p4str) } setMethod("is.projected", signature(obj = "Spatial"), is.projectedSpatial) is.projectedCRS <- function(obj) { # bug spotted by Finn Lindgren 200817 wkt2 <- comment(obj) if (!is.null(wkt2)) { if (requireNamespace("rgdal", quietly = TRUE)) { if (packageVersion("rgdal") >= "1.5.17" && rgdal::new_proj_and_gdal()) { res <- rgdal::OSRIsProjected(obj) } else { res <- substring(wkt2, 1, 3) != "GEO" } } else { res <- substring(wkt2, 1, 3) != "GEO" } return(res) } p4str <- slot(obj, "projargs") if (is.na(p4str) || !nzchar(p4str)) { return(as.logical(NA)) } else { if (requireNamespace("rgdal", quietly = TRUE)) { if (packageVersion("rgdal") >= "1.5.17" && rgdal::new_proj_and_gdal()) { res <- rgdal::OSRIsProjected(obj) } else { res <- length(grep("longlat", p4str, fixed = TRUE)) == 0L } } else { res <- length(grep("longlat", p4str, fixed = TRUE)) == 0L } return(res) } } setMethod("is.projected", signature(obj = "CRS"), is.projectedCRS) sp/R/merge.R0000644000175000017500000000272313171625774012472 0ustar nileshnilesh# 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/SpatialPointsDataFrame-methods.R0000644000175000017500000001613313724165642017370 0ustar nileshnilesh"SpatialPointsDataFrame" = function(coords, data, coords.nrs = numeric(0), proj4string = CRS(as.character(NA)), match.ID, bbox = NULL) { if (is(coords, "SpatialPoints") && !is.na(slot(proj4string, "projargs"))) warning("If the coords argument is a SpatialPoints object, set its CRS first;\n the proj4string argument to this function is ignored.") 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/gridded.R0000644000175000017500000000527713171625774013004 0ustar nileshnileshsetMethod("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/Class-GridTopology.R0000644000175000017500000000061113171625774015052 0ustar nileshnileshsetClass("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/subset.R0000644000175000017500000000145513171625774012701 0ustar nileshnilesh# 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/spplot.R0000644000175000017500000006460314112150047012677 0ustar nileshnileshsetMethod("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_len(col.regions, 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_len(fill, 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.out = 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/Class-SpatialPolygonsDataFrame.R0000644000175000017500000000057513171625774017336 0ustar nileshnileshsetClass("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/flipSGDF.R0000644000175000017500000000124213171625774012764 0ustar nileshnileshflipHorizontal <- 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/Spatial-methods.R0000644000175000017500000002776413724165642014442 0ustar nileshnileshSpatial <- 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(slot(slot(x, "proj4string"), "projargs")) || 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 } ) setMethod("rebuild_CRS", signature(obj = "Spatial"), function(obj) { slot(obj, "proj4string") <- rebuild_CRS(slot(obj, "proj4string")) obj } ) # Don MacQueen provided head & tail: #head.Spatial <- function(x, n=6L, ...) { # ix <- sign(n)*seq(abs(n)) # x[ ix , , drop=FALSE] #} # revision from Finn Lindgren head.Spatial <- function (x, n = 6L, ...) { if (n > 0L) { n <- min(n, nrow(x)) ix <- seq_len(n) } else if (n < 0L) { n <- min(abs(n), nrow(x)) ix <- seq_len(nrow(x) - n) } else { ix <- seq_len(0) } 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/Class-SpatialMultiPointsDataFrame.R0000644000175000017500000000063713171625774020012 0ustar nileshnileshsetClass("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/surfaceArea.R0000644000175000017500000000223713171625774013614 0ustar nileshnileshsurfaceArea.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/Class-Spatial.R0000644000175000017500000000343413660452030014015 0ustar nileshnilesh# 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 (nrow(bb) > 0 && !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/Class-SpatialMultiPoints.R0000644000175000017500000000115613171625774016242 0ustar nileshnileshsetClass("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/Class-SpatialPointsDataFrame.R0000644000175000017500000000131513171625774016771 0ustar nileshnileshsetClass("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-SpatialPoints.R0000644000175000017500000000134013171625774015222 0ustar nileshnileshsetClass("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/Class-SpatialLinesDataFrame.R0000644000175000017500000000064513171625774016574 0ustar nileshnileshsetClass("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/AAA.R0000644000175000017500000000305414112150047011731 0ustar nileshnilesh#.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) assign("thin_PROJ6_warnings", FALSE, envir=.spOptions) assign("PROJ6_warnings_count", 0L, envir=.spOptions) #.sp_CRS_cache <- new.env(FALSE, globalenv()) #assign("CRS_CACHE", list(), envir=.sp_CRS_cache) .sp_CRS_cache <- new.env(hash=TRUE, globalenv()) .onLoad <- function(lib, pkg) { load_stuff() } load_stuff <- function() { rgdal_show_exportToProj4_warnings <- options("rgdal_show_exportToProj4_warnings") if (!is.null(rgdal_show_exportToProj4_warnings)) { if (!(rgdal_show_exportToProj4_warnings %in% c("all", "thin", "none"))) { # CURRENT DEFAULT: "all" rgdal_show_exportToProj4_warnings <- "all" } } else { # CURRENT DEFAULT: "all" rgdal_show_exportToProj4_warnings <- "all" } if (rgdal_show_exportToProj4_warnings == "all") { assign("rgdal_show_exportToProj4_warnings", TRUE, envir=.spOptions) } else if (rgdal_show_exportToProj4_warnings == "thin") { assign("rgdal_show_exportToProj4_warnings", TRUE, envir=.spOptions) assign("thin_PROJ6_warnings", TRUE, envir=.spOptions) } else { assign("rgdal_show_exportToProj4_warnings", FALSE, envir=.spOptions) } } .onUnload <- function(libpath) library.dynam.unload("sp", libpath) sp/R/dms.R0000644000175000017500000000555514143756153012160 0ustar nileshnileshsetClass("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/SpatialPolygonsDataFrame-methods.R0000644000175000017500000001261014143756235017722 0ustar nileshnileshSpatialPolygonsDataFrame <- 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(all(sapply(slot(res, "polygons"), # 180201 change any to all after NULL comment found function(x) !is.null(comment(x))), na.rm=TRUE)) else { if (!is.character(cSr) || is.na(cSr) || length(cSr) != 1) cSr <- as.character(all(sapply(slot(res, "polygons"), # 180201 change any to all after NULL comment found 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) && any(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 if (!is.null(comment(x))) comment(y) <- comment(x) 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/stack.R0000644000175000017500000000401313171625774012472 0ustar nileshnilesh"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/point.in.polygon.R0000644000175000017500000000621713776564110014616 0ustar nileshnileshpoint.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)) res <- rep.int(list(integer()), length(pls)) 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/inst/0000755000175000017500000000000014143756316012015 5ustar nileshnileshsp/inst/CITATION0000644000175000017500000000201313577144130013141 0ustar nileshnileshcitHeader("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 = "https://asdar-book.org/", textVersion = paste("Roger S. Bivand, Edzer Pebesma, Virgilio Gomez-Rubio, 2013.", "Applied spatial data analysis with R, Second edition. Springer, NY.", "https://asdar-book.org/") ) sp/inst/NEWS.Rd0000644000175000017500000001525114112152074013047 0ustar nileshnilesh\name{NEWS} \title{News for Package 'sp'} \section{Changes in version 1.4-6 (2020-08-27)}{ \itemize{ \item add CRS cache and update CRS print method; https://github.com/edzer/sp/pull/103 } } \section{Changes in version 1.4-2 (2020-05-20)}{ \itemize{ \item Adding a wkt() method and muting internal warnings; https://github.com/edzer/sp/pull/76 } } \section{Changes in version 1.4-1 (2020-02-29)}{ \itemize{ \item warn on NULL projargs in CRS(); https://github.com/edzer/sp/pull/74 } } \section{Changes in version 1.4-0 (2020-02-21)}{ \itemize{ \item prepare for new (>= 1.5.1) rgdal, which creates and listens to a comments() field of a CRS object carrying a WKT representation of a CRS rather than the proj4string; @rsb, https://github.com/edzer/sp/pull/67 and https://github.com/edzer/sp/pull/69 ; for more info see e.g. https://github.com/edzer/sp/issues/68 and https://github.com/r-spatial/discuss/issues/28 } } \section{Changes in version 1.3-2 (2019-11-07)}{ \itemize{ \item fix length > 1 in coercion to logical error; #54, #60 \item add \code{is.na} method for \code{CRS} objects } } \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{https://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/0000755000175000017500000000000014143756315012561 5ustar nileshnileshsp/inst/doc/over.pdf0000644000175000017500000105462714143756315014246 0ustar nileshnilesh%PDF-1.5 % 40 0 obj << /Length 906 >> 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 1804 /Filter /FlateDecode >> stream xڵXKs6Wpr:!Jf[^WQ9@{cėxHǜxE3eQ+1d|GA2AL5cX4sznq8Q!]u璮)<}OnRu'{e+ 2d!ꕄq׬F5*(v,`ޛ Rwkh'aVAxoD FMÕ~B|1nQ5aS %͏1 -k,3+TTq p啐'׽ZÉYy^:UX@%ݕ\S!bj bhB3glb I `̓n5Ք0?}<̱ϫt?z|N n ĈF:&ɞއ:I{wٔeN,j$qolvZxOO[8#-e!R_B?FN{Rrst'*(3(gãZQ{!ܵ/ڷJMl`Gicw]N{C?%<O:.SɈQQ>`? #p8ɜ.KbtX/cqi5D'{ltr~%Y_x6y~g'%tUU|sS,`UeOt`zHޝ_\@d/?:S)@D/(_kS]6m󦥢s5}@נ``%eH>o\4kZzqNSKד:^Rwd^ؼG hh=f=*(:n3j}-jշOm[9N`u>Mcs[Pie(P endstream endobj 69 0 obj << /Length 3315 /Filter /FlateDecode >> stream x}˒_[|i]8I`(ǓO?P0Ch4̪_՗?2-WUReq44+VoѧuZD&L4N.7_c+ݺHƒ3 h\e篈kCW7w!';7'_כ<3я^$y9<)ga'KF:nU8|``F9D2jO;[<2&8pOH>"k b:EY#B#e !y^GA"YEG[``Ve 017_T8 dk=j])uPDe4 /EIr5?1M׫EM+5AO50"hQ-kHYR8"B ]A֞_PT`y9L alχ YFQp8K_ Z>lyj )hσd,"&57K5&MԄEO-+G6`g-^5eN*$Ö,Kԝ9Cqr@?CȊ8e6%Zd S22hJ݌F0֩\A2@~:mE(BqkiUebYQ! b7aQ髼sCBiը!Bl@j@yfFsʞ4z.MXx[K]/( wk~i5/-$0IpXI{[ޯuYcuf8L䦉мԳgy /Ñ[E#F/3My K8|WkwiYF% )?-'B)Roj;CS~EpOYsB Rf{|3ICl-%Y>1 j8V#>en6 JZO +UWT:ݫE 9"xd)L ƧxBݒE!, (@IW-e\(Km`q{DS(Ws9m+gũ9L*Ly%IwYp%uG"l P;9G'cdȐH;u3Epzh^q| Dy폲†hx老-)I qwĽwc.؂޿t{R̵gnVu[6XJdN )"rY#oY ,J~Q<Bh6#-Ӊ Dx\pq\圗V Zu3#ᵂu,o>w jd+Ze}GwTs+cec?bI*RԐET>6a[CRM( lv 6׸hD+5ZNHRdq^NȢȃ&7op쒿?J#ol Q/Ѝ]7kց+pݚ+:$ƱD1Ds;SY&L3JJi.RMZM[+72NkmnҨ&QMK=(nO~<mjJBm9Md6$l4/3eLDo(iYh PgJ=4pgܹɎ;%6BѢ#Gf*.fǶ$!|٪b /UIG7$fRVA8zLQMM*hRc/O?yf;0 6wص^9љ>I3uVvv&Kk6u&i7.B5iJx#–Eswey/稞kD(i#̄{BݾxUir5TEVU"isZtj}]'DKfKR\tUC+ 5ڮ1yDvUr.)kݐ4k/Gw?ehk?*Nf .m\(ĸBOfppP. eG[ۗoevȬ._~Yѽ‘d?[FjX] # J4ೠ̀i?yǾRP&?E=hݛRewA s_l;:h4y M^ (c. 9rTRBq×:h?Jlx7A>ۍ7+ `JP /Ls B>_?8 endstream endobj 76 0 obj << /Length 1691 /Filter /FlateDecode >> stream xYo6_( 1+D k[1A'l$x#Eɲ{X P};$; iK5j&%JTD< vquL2cJ%H۠ VV;e_d#iu'AzVmrCbo O n @K Xod, zKW v$fJEOƂ#d{@DaFШޑ+XӁLQ A:>,-D(\Lʮ ?IqO I:@GLʸX:ڍws?mvB0(6qFz*z4\}uJnVƃxF `L[qq`6[t abSA-]?SbBs%JJw%n]\d"| 6N)h ۻS/@w+Oģ1`X~/]^k0PH,ؒf:pW9hhPbϭz\t KR,yc;eh4xD5R6(> stream xڍUKo0+|顇MԞچ[eRlMߙYJ xfJeDr+X%SL#1SheO$2ٔ4&G pqQM~Kj>p 2V+D錕&R"g׉lO-u1pLD t4DŽAC]w^8"EޓW8gjd Da9z^(, Jw:=ã8pWivrraq]L:w^0Sc9|wk# 5D{~spMfg9KT# L),* N܅b0G&vCnҍj\ Yh`$A}mϤrс>Kнwf[7ubֺQT`Xy5ie͉0ؼHEVKuōK2 Z0HؐyA xDyGQWe?n0(cU3AMHꡦ;4 C@jalq[Zzֈ(;<DKڝCOMpAė* $<-|4]< yM5[:P+/!ڟ7ܾ@v10` C]TEB|~ 8R<] gT 1-sz+c0cK34 ;!?* endstream endobj 73 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/over-005.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 85 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 86 0 R>> /ExtGState << /GS1 87 0 R /GS257 88 0 R /GS258 89 0 R >>/ColorSpace << /sRGB 90 0 R >>>> /Length 926 /Filter /FlateDecode >> stream xWn1WtǏk" $ؕ8`CQ)>jeWmGkĝxމ'1F8 m f?1Ώ.n wwY>)n'%ݤf+Z)U>6*_퐶ۑwwVѯ5.wR; 6j,VӤ ޞZK5]Oiu4.˂>e٪-Pz[OTQ)G`gdz|`{{Q%9*9ƌ&n ݄M9B/9XKj!D82~7GiE[FеoDA |󋠠CMo Jn5(͝G/3X׵ ;4+kӮ;  )1y>e:yX,O^47˪%wΈR+kK,E,K<}U *lVc_-^,v勯]αh}I~4F6bє[97^#`Vbi_^=v勯][+qPkEM#uxR^IJjܮ2mR > 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 95 0 obj << /Length 813 /Filter /FlateDecode >> stream xڵVKo@WX#G%Hqp*=q@}84zzgvfٙ$,JGFGgyHM"mN*ӂm4g-590y\ ~V\]ghEțIuRՔܤ3 R xq?z'3$ MWK٬Z TMrVDv#)[D$*E#r?da)&dZdZ7BRR*%'y +%ܰ8Dh6InQPtl -bBf^.ћ{V[z0.U&jX꤭pDp)L>NAIvܚvkۭk/5v억! jRܟй k^F>:ǾI_OH;mAX"VZMs2 ^"n=.\Zrp%҃h-KM3BF鯭sn 8bF y:0h BHV9ma1% Q%Œ?hL&J̖A Ca idod}+2qH/o4}1Y'țp=o\:k6W6a2tI@&3yYaI[6ٝ)_cķl8-$uWv endstream endobj 101 0 obj << /Length 1814 /Filter /FlateDecode >> stream xڵXY6~_a}ChEE>hmvr|d_ߙPdzyDNޝIJN.&2y)'DOS%21MeBk5IVNUr[ 'RL'R 5MfN;rϏO_U6ǡ*q.j3M3]%{6%g~޻RF*:TD)_5U4 n SHpAxvȯ\er: Y$-⿇oٮzK;6g픦t)ٟC_/)P-#ZeՓ#S.^+M!RH=nsGY_dw`Q>݃ TKę5\i9>B#X Fh/ M)?v`y6Uh!@0 wA}"? {2(,wpIKE\j%*Y%CELG(vK@e!"^%\2+l0+Is)rVAg]UlmtnGR*86Ef?O1!q/EC |`7M%#Jw}a.} E+guE14/"B}) /eM,õC3[h u(ny3^.ҧ <R RK?N*V=<3VݻRfRiMAMM2c[,lSNĿsiem# uzsDjRxvTa;\j>!J Y`k_HjbI4/mvZUrhj_{|&}pPB)I\ C?ppWo>bVЊ1]{{xH@qE˟{/iS7=0g~ӯ=1tyz|{ߨk s[fx=bvL8OcG*JaŇgǁM7̇RTǁ@ka މUo!r_xZvF5OAd{jKv&(*OWv/=z4.@ cA:|(;\cz- endstream endobj 105 0 obj << /Length 1065 /Filter /FlateDecode >> stream xڽW[F~_CfJZEUO>`Qm6_s.6TØù_>ƑwEW<]^#/szʘ0g4&"H?-_2?9 X-J@+;9a5~IX%Q -? y\jqōʇaa^UdtWANYٴLFzlaP@C q 4 \ϥxR6TZ%= 4(x% )kKQA#KOd(N}-6?O񯿓#LF0?M7HW U1(J=wi'IB[ZdYR S*3* 2!O5DDGHsC-u lhGcb!ÝQjCIJ[^o{u>Qk\veteJ#c&m/p(R{b/58 q2 aF)@j;1cߗ&d ,eaqIhH_dS1[n^`r= K8'ɚk"pKU` m:ҀXZ7wHX{)aP,"lvŵ9r$(=R{\ T 'ψ`=۞}Ki~׫΀,scm*hNslg(N(M"T0/ʏ.<[jJg ~('j8}%wEf\+z;׼=ϕ).]׺1{୒rn Bdߏm׬C$7,Ri͸X' A?IGqLM~3 PƢK")y(`,GkO4`ܺKϱ\N&e?)'AܕH:j (x \wPMu2~7)D!>O;i$=N]y*H@$ز nClpS)_syhl 4NGoWIO? endstream endobj 113 0 obj << /Length 1749 /Filter /FlateDecode >> stream xڭXY6~_a /IThl"(Anmkk{w83H[[< )1t&UVLجjPet>_6zfN=~v [uX~&/R*榡v#*qr4#ekndKUh+=la=r$qo"uo seQ WD-@((`dVIKvrMzUrWHX3݊?Q'hRW8nq$)WG(49M݂))X4WԴ~@} =?g8sȬI{}B8t"dִ{/8'5Xɟg,p- %)a33Ѥ 4ZgCv=t@A#%Q8YUahaن/] ZŬjQd2V[N`v쩝X< bX_7=mf+٢T7,.5~Bi+P^{徥c*iei3L7n!Kb 3x4r^rgqQUd^(P4"+M,Œh> Ypnpٱ{ixAiHQ[]{GACnh`–4Rn,Si='᪉{4;*m-{Ni6Yhb"Q1 =o|ݻhvӵW &h Pv m pz'Mܮ0=e$A ed#S:٩S`yPY-CZC- ~^0|C=8s]d>&\W6r#c _$g[*O.Fj_/s)Ȼ.֧Dm6p<,:BlS nN  󁊢l^AZ2L,%h&y߳YuC@rL*DS2Mr<ŮkE΃J[>ic) G0wf~1Uj=WnBVC֑ZoZO^g`s=ƗOg5&pojK=YֆYQ` l膓5 ؚ5R֟ToR/T?r,,O($.2S~b]t.:d~QNY4f^n1c` 2?ҥZr giG|8Y O<Ө:2o Dbfjw$W,GupgƖm?PJ&;ŷTw|zBH F1hjJMQFC=щEOJ^&D-/Kf)8j;ZdvQWT_7! >Qq2u'$!ErAn]3R7Yr끒8i_3@Nro0H* *ͦm9އwplXQا8?t!MohLD/z~XuúɰyN:'>m{Lߓ4vj`;#$#o#_>Fzpqx?,*p|066%d_F endstream endobj 119 0 obj << /Length 1214 /Filter /FlateDecode >> stream xڵWK6W萃 T\rE @6@`i[,`[z}gHeKY;v2_3oi'#Z1Է`N#- ͝pc΀Ih˔tO"gJ|l8y[jAA+¹fEM%N}e DJ,ͿFE2_Dh;(F #)'.m8e Q9Γ+  ,粋Ct.8Bkkɍau6%gZ0-GLי=PxvzvUd7cnoiʤFʷ*>`2m4f(;b ݆MhSSY&ek<{Ha]`^J E `,32k]Cp6(0] )urf1;5pT1q1<r?a܆"&ǿ\ȂT3= Wuu@0.j!C553vua̩䢉ypXMŸ{ YTʔG2F+6Ź6= S%~8MwpkZ6&rחxOYU6@<wi@3oXԱ!K>aas[0qP.t_xtuv"нt,[5XL>(|LA6̂Z~mi7ԗþ`#gO֊/J[FC`bs/١Z=8x]pU|>Kjg1,dq$sk:&Mc0b }W6]tО)Iͷ*%,rȽ!,'8`guWe>9:;ܹv80D5ކt?i?IX= J/?qċXVҺ3M͌.1HGs!2x:c6y16i1ʁIŗp-{.v(NmcX'%4S {}23:qAǥU#PxCSu4?/M| endstream endobj 125 0 obj << /Length 541 /Filter /FlateDecode >> stream xڭT0+|Hqs@Z]VHa[JmSv4I SEq"5/ oa+Âfٱfhdž>h3V*4tKSMp6ฌl,A4'}7@Qy*_6rq@8:!NYE zN~f6V endstream endobj 110 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/over-017.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 127 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 128 0 R>> /ExtGState << >>/ColorSpace << /sRGB 129 0 R >>>> /Length 671 /Filter /FlateDecode >> stream xVKo0WN=3VTRٕ8 NVg?ma畠ӨI'=D0V{k5[Ob~Lӻ}S1_wo6B}'´AP'NpOS U/T9"#7M|OlN 3I,}_no%ߒsC#A!򒱋P[2?WWԛx1^n` <Df K)NLc ٛyi+\ZRKNtc4Bhb;>8N<_`GN|q}hx\uach W.ZEVrJMCLŵRr搆Ԣ*/ 2 0%;pW8{k2UrIhht6aK\zdnf#y,*9e/?Ȗ8TLMfve @>߉LdH`On8Dž>[7xoXϸ l61g ZD MխUspU-pNV&oH;Y.zq!Odfꖮ{BY endstream endobj 131 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 135 0 obj << /Length 604 /Filter /FlateDecode >> stream xڽU[o0~ϯ&RxqbC $J&* 4+/v/e*MUlkjg˜ 3U,3!%OEJp%lyQ |$=~Ӳ"-ƞJ† V]' bP=UBO.H@xM=åɮkmCOi^BBH !T1tR1Alת|wȕ 7MWr+ \iN~ +I~ta.gP݆|X e\uܯ@/ i##%Z`KkBE_ ܴjz~WmCQ7-4םՏ>$ׄoR ~O2Ŭ̠Kx֡+j[g省).Oʆ9A4> > /XObject << /Im0 138 0 R /Mask0 139 0 R /Im1 140 0 R /Mask1 141 0 R >>/ExtGState << /GSais 142 0 R >>/ColorSpace << /sRGB 143 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 138 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace 143 0 R /BitsPerComponent 8 /Length 375 /Filter /FlateDecode /SMask 139 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 139 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 140 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace 143 0 R /BitsPerComponent 8 /Length 150 /Filter /FlateDecode /SMask 141 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 141 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 144 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 148 0 obj << /Length 840 /Filter /FlateDecode >> stream xڭVKo0 W=@zY.*Z,i8Kei;lRE~|2# ňn<:IԜo AKmV%BT^c,!2Ky%d5x~jz MOЯo/y:LPzwAUhjʨ[ܠ<`rs5ۚ6ycPVk'2@ 3!(dm^`{+|ꜗC']˘5j4!s :jC*JR*x^Q!d}NQ -zߠt23˙brbXjZQ#L M`$~tl%Rb0@eR-RJ죸tE+_\[m>|M.1$OǹרR(A(X! 7.`{H8$j$ |jM[@I (sJ"(V)%X|-{¦Kubٗvk?{Pa`5]/li0V~š`Fڭ}P& S%@G#J;LW_#Vi$ۊJVmQwv^T LO }lWƥN;/qFs;V&y{Ɲ3 .ãvV|)6Ko2w7VF'D{Rzb<|>M{aѐ-C,AHļam5,FD,[WX:pF=u_.{T dtI[rQ5~ ~"v(?fj endstream endobj 145 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/over-020.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 151 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 152 0 R>> /ExtGState << >>/ColorSpace << /sRGB 153 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 817 /Length 2245 /Filter /FlateDecode >> stream xZmoF_c﯅Q@{ Z^dʕ\JDEý0ܝݝgfvb9f$LISFit)ôGcl@YiBAm4,f ihaefE#Ð0̀>رiiXBɰ/83v UC mĖmbFi^w$Ü'8q)1Ǝ&bO0gm H-;Ē~TcĈEt\a*ʠтUb0Dɠ(e$VcHgY hBK7XH+ UM0K֐73`V҈P֎cUCS|i UH5=sҚFUP?@ j?.HjFE{Eo[eUei9`m>^c7k m7$-e s&ň}u*}jn>n5ED#klYcEBNկ*v~[ןkۯ3chjc~]_#qz>LyG*/1 "wx8u1elu/y~~aᑳo:X`[dge9:-ԍ6vڸiM6qLYج툫mU?\:ᨗjI\kU?݊]# `\UZ k@wƶ'en+jxBg:lg`C)(q'.kMH[0B rf z lmQ)]Z wD6lvd+%{׳zkxDSBۼ00;¼-Cp.hAyI`kx7Z"s8A 0>&HmI74?G@G|m͟"r{-ŸQ"x`ao`{=>1{3&I-doG4j9NǓ^C:iKK\:UG51 yqS>WE7눗ew+>KSUV|z}Uozn$7Ro#g_sRm73V6Y9.]`AdNd̒NU>*+zC(v<.D}E֝TnU1>뎆W`q1;1ޢ C g Tb'Kn~$4Hq8FqaJSJ=sg;GiBD͵E7{sw\+S\;eNfמ 쾱k1ߖȲT鰀I[Nuv(Nd@>'))uXKg]8;=7g+K ŧ⁄Q_Гx]XiFG_p"kFOn z4 (1ӜMYLnőc.6dXr%s[o;ʓsIҪ=CE=4H"בJsȋyzЫCC=L 7p_ȃ]#~Z^$gNۢ>H B# N<3>h:-m> stream xX݋6":Q$ٖ GJ&Ľ$q|sׇ^ }-i4֣H~xz=UF&Uȥq:-Gwjl"36mq;La];ڡoQ51*OP8$ӨOOwg{I6Z7 *Nb>[֥]C+S xmϯ A(IpE0}65e=;0i9qhx#G|Ѷ#OJHVϹ3"8.Z_ ElPxO L=*Tk 8zI@2L<\6S䀉seb6>u!߉A0l:)h- Tq2IDIT$g;ދS(cM )Ãl<D?C+!P\ w3xگ^8mVq2pA >&`bR岾(IsP^0^f顿aL=!M&;lr%=CdpsjEPs9#4{ZkKˊ@CfA@.wGD խEH^kQmĖwI!*z?Άl1`_ˌA1ݤOaP^vE`re_/72vϛ>d+KbwcuVAvdC;T @'G]TT?AuUB]ߒ:?YVrI0qo٫o"s endstream endobj 167 0 obj << /Length 1704 /Filter /FlateDecode >> stream xڽnFCi$bf{-ڢHT@K%fH9  p;f735{}diyfU\&-g:I"/gyV&f]ϥ6 /?,{TFbs G;~=5rvI/i)2%y"s)2Z3ʫG9!u4e2MӒщ;KBGW6&9?k]*pWu$'&cqͣX5|oe;HWc!p&$*@$ڬfMF82N׈6l<1ɔ84ufbm?)[~qXkdrzT N] 7MUUZ*Sxf+4׆;JH>$dY)7/f %$4 tYfBK&YZtL斲+Ӱ@eVB , XDdsc0D6L%'a͇ꬑX8'G 161)m5kQzAmz4o|RJ!hw; hq$:Yxr6Ê  f]z{~t){^@Q x{U ~q\|=RF=[3֫4QP.ZqC7 [̍}R&DUeU۴NCon9Pٻ[ R$z ~V8V4gϑ:^҇ Qk*W ըwUccpؓ廩' Cǒ..4f\Cm4TG[邑$ "sp͆ML'7u•=YMKR(R9;.@|B!+Nu[H!0 GjL^tmm>!tXPϏ:Þ@WٰmmzXlqQRWJĪtpA'يdm+,ˍuJ4P44|cLSk6xpƅ ռ3;Ǎh R5J %3͘"ԇA%b ˳bbxP)`*xNd<8[=8 se巊rq V?Y'ȏs3P| (|PBGOOLg9 3\A@Ԧ:jImP̷''駒BqZ*'vjs_np_qPGrǸ-JJ"|[t+aJN{uye;r/ν q?jm/9F7 ~Z'_k)_Eo#_v#Ðj<G-1{wH'yi > Ό;yW_3Z~8Ϟz#ܦBz҃LnD :דIJ8ϿV0Re!;/Y>o-X2ˋu7 endstream endobj 173 0 obj << /Length 607 /Filter /FlateDecode >> stream xUKo0 W调 Ԋ(!wCذK ;t=,Iߏ<` C@I#Z׉7VU6@!m-Q-[X~a-E/3}7M&WPZե)t) w#ӊ^V~IA7xl̔lg橩=2kҬXu-^:5Nһɕt` ϴE`6*0.Z=r}LOTZG鵯<#3|ufI[i '#lUzA%G<.Jd@ETYO\Wr~\ұMs sddXKEý9P(}ʗMKj Hc@{1_y0P=ϣ @Ua,ko:K~@1cѥYuܵ84+E' !>ly,A)5k gZ9 Qh%"mp۵oo/~{ 2`탎`M>!}Fczalmo΍ k`t@ݸٵ# +Hڔ BFg{SU9Bs.\N endstream endobj 164 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/over-025.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 175 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 176 0 R>> /ExtGState << >>/ColorSpace << /sRGB 177 0 R >>>> /Length 539 /Filter /FlateDecode >> stream xUMk[1W9t]}_BԆJOnC1qhB+=d5yٕF5-lIB0h-8%t gx,Ar\F5ǼQ_o6J|Pc0x |5x?`B0M&y\Y ʹs4iv\Wk1g?a~.q{}(DT 6;x Xoz}^L>!{5-m.VvŤ1lܩiG4:KfF Wyf^{̝F3:3gF6ک#.x*rb9<#ryq-<.'Y1l݋&aNZcIt]h\Th#k0Oqm6?kW 9\ϴ`E*jg?l LBQt,F~كK_ƕXF<d!h3Ey$r64垢ۊC]kQ'TsKme_QN]T endstream endobj 179 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 183 0 obj << /Length 917 /Filter /FlateDecode >> stream xWKo0 W60,J 趶00d/qq\ߏ/zkI泎&v;^G5(l "e,|T䥲Y q:19IN85F rQ4--Z:Fv7oAx>s¸'+9C G>ѹH獸;RR/0fgoa a|Ɓ76e݈υ$aPʡxt`S$Aump]*_anP-aUf*YcWiQNdR%.e|6n؈YwVuǂc4W7E:o öYU(,K\ ]WTE.)[s zԅBSM%ѣ |X1t"Iv2+`Go#ur+͇HYj.hXS ZL6 hKA*~3>&܂kdZo>|r?iQL[U9$N o2e}T£Z+f&tQOj(0q~S[%^6_Hh#$!P5ujCXUџu[AMm+g~zgnDl 95z}^>;oJoHSAEl/KLX>gL+yxS-o ,{Q y*RALhܽqv*s4hfV 1jBwB$^5ͼH<fup@]\@b pPKaE\抝hXdY%44,:Uıµ`Yb_s)> stream xڽWKo6Wd$f(ihѢ6esڊ4RIǥ"eyn""1GQ -uyR,yӌIF]t\RŻK<0*POsTu@O@;._@JV)DQ gK/_$T hȼoZoLybFG5V+6gkSߔ++i;&h7~z('fAD-n YIOɹaNtZ1[q@ݒ$T*QxwQDg֏Qp`!G]EtJTu?bef\|Di{CRYhK]\=1Cr$/X5.?^Lk8!r4l[nHj`{Y֊9nX0+)S AR/@0'; .|u"L<ONCJ&ycu&j6SKRŸ9w-fLcjҨz':߻ġ@Њ\(;{'?qSSy]{)O)I4 ˶m\^-K[XWf/;֛9y Ѧ'v6`{f_O.DpH@ [b>\zr :d3:J U LapOxplJ)Y!Ĵd-,eP(}[p+5^c>Aw}XiC(P,.V:MÛ;G ?u]nkd<؉84+8/zx'o\3i8a%Ew@0@$a> /XObject << /Im0 193 0 R /Mask0 194 0 R >>/ExtGState << /GS1 195 0 R /GSais 196 0 R >>/ColorSpace << /sRGB 197 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 194 0 obj << /Type /XObject /Subtype /Image /Width 8 /Height 11 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 32 /Filter /FlateDecode >> stream xc``e. endstream endobj 198 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 209 0 obj << /Length 2079 /Filter /FlateDecode >> stream xn7_ TF--RibAA kk(24EnRʦ3/Xbl*FĠabe!LmL ;'h>:]=A#Df;N@V`xoy+y$ " 8-E(} Jmt.+1I A 1Nr`eCge#9NnYņl N.crPj2?hRWDMv~Z,QwPuQ;sfd79\w9}Eu; :l5lȪ"g a}Huf+TQ*T.pM[zqic曈:g:}NCf5jYIѬukL0UivSwe^&^48 l[B(>U2tOijoj!MD$͚kNS/BB8YoF? l|J:a!҄%5!Jxk|'5xm+h7L6".z 7$0oyIW劉P1Ai 4fTHW|#VRc1oec{dY`G4[T NfۻK kU몫&a❂}M6% = 1lR# ?}QUfE*sng+-Quߜɓﱟ)^1e?!?<iSɿ"2P_ =@2П(gGŽHg7QrjMv?U:xFְؔ5R(8AIV> stream xڭVo8 ~_Ge6n.{p2Y~$E9vȦL""&ۅ|V𔑊1"EdZeQ.-56KiD$UVyt/_P%f21fX(9ᬶz{:9BR{؄wܸ'#R# j=xARC!דEZ[ͅ}JfEhE'6~l t2{8RiWL"$4Ɩd&ԤWjHw>9<,v ]2g=6t4]=)IVnRd]ۻeE> /ExtGState << >>/ColorSpace << /sRGB 226 0 R >>>> /Length 3765 /Filter /FlateDecode >> stream x\ˎ6߯(C|,I&3`b0`lW"žҽ/2JbfӫMO$ęeb >>L?LW7ӷ/S]oW.?4-/6r?_WyfXg-Y͋%fK{KYP{Kը=193V@4I4Ri$h1T鍸P-T z#](Ū}峵=U=UQ5=],nObC=7)>?._l~CR~EۙY:mz~M \-JeqF0?lY,Kgt}wVKƁ 6< Ʌя.\X2oNp|8 M"瞩ao i89Y{.8}prq eOF`ODcdm^wf֠+\J'&Qo6_M@Ϗ m#f~b:1=G矦 JøJ#ɕH#E34@4Q4\i HrѸ2g#jև)+j^E >Y}0kugEK[dpS&$,2%%Ő`D. upD}P ұԍiBPm"5=S@Ζ~q=Ӹ$z8eFK3y#d.tȹOb>kj~tQDrS0M]ua؞s.g-[OWhSg'+x&'|~O.rc&c뷌.>?חXo|<}û^4yu_EMqz>j4Jϋ4\i5\4s|QEJJ5!$W.kv.Kg#A6A>l?F ؀  eIڅ ؆} 1q*0ʐ7D.,,uGF`(l-#~`'FnM;%byqbLを\)39h\avO5}P?@}u@MYQqhmϞslHn79CrW3kq2ZjI88qcAi ޟ5?KSOcO]-K͜{=|_/hf,e ;&sp؝r\(^ڣX;TGj_ŬXibծŪݭ@U,u{|)xUQ,+7G4ǫ99$W GQr9E!EaBN&8vpsXKW+葭aȦbG_ +qS55 `ӨDQpm)O?rtv6{k ILEcq4_'r^ C`vLd?n@QzF{rX}:N1zr!/K!@R[ l,/խ 1\u'=g9qZOγu|kߟ\u!%߰cg苞mi%?BwͿ>LB+xV\)KE!E!e$W CQrSE!E@2)*t@ S z?㇑[sZ9L-`yvk yzpo!g3L=h%zτ_ZhhkY=qL}ƣtg-4z[9t%AFRu$+o:W̟?WȥKQ#gϖXNnW|2}rrpѮq;a [{t?Gc&u|I&B+xU\~VHrŠB+x_\)ģ;0rǞb+;]EYe=dap; AAl܃܃Fٺ ػy{e4`4>>ܕ([WJҘ'hz/2x$x${W6R`|n,Gd|z#{%5ub^zpO~~1rk{FHLkyJAz*qK.f y5c=Lb:01zf] q>cV-FqxH]KxaŊ,,_|u`t7&> Kx5fe~b1,Tc;u+ot.dگUZL ;uKnǀcVN^ ƗkFwxVPpN^ 1<`Lqsn2!;UaT~2UN[N5*2}<Fk ٭VZeŜPMV0T>'j%ѯU6?\q7rÄ7ftVa)ߩ]z*cBVfyVeL #{*cjlkHƬ*ߩZ1ʿS%;K{P#{*c[a\5$~+<ϹAիUfY1lժ _#z*c۪pڤS2fyJ1W2&(+GyDVeL`#+ L$c?k2&Ea8OE|Z1T(×LߏZ1xΈ0W2&T,);W2Ĭq˨VEy3¸ݯ!*p>9V|\ݯ!*p>9_U j 5U *GJ'0*fb9_VE'0㊍j O`7X~ j3FjUd~s>]L|s>Qqǜk1U-rZqGJ1{:ZqG0۟j+ ~ a翈50&p>9bTL| s>nըV|ܚQ21*Ֆ1U619XVߦگ!6ps>WF)FjUd |ZUokU>{ \?d{50ĀZ1B"F`>*sϟD@[۔Ms#DV;\i @Bƽ("h#1иxzN?:|:ZiDTQ4XHra^iDK$=na.ƹe3 آOHp-|n-ùKTµr|6a`BoIĹ endstream endobj 228 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 248 0 obj << /Length1 1988 /Length2 13083 /Length3 0 /Length 14303 /Filter /FlateDecode >> stream xڍT۲ wwoݝwNHpw'Cpw 'c߬UZU)IUE-̀RnL,|qE1V ; <%3</ &aSttȹX\||,,6!:$L=@E&Rde<hi D. sS5}EsS;9RX913{zz2ڻ29X 2VvD hr3Wk5cv +K|en~q7.%%-06N.7#N/$Zna3{]?0eqY{A\f?=N0+U 6{?l4/xG1[ /|?wq EvtwW;_? v~)0mw=vyeW2;}^:Ar{^N=៭zYf7k6X7OT?l]\ޯo6{/;ԇ=Ԋx2I F57dN4muuGVd{#Lďg$_SǢ Dp"{~~Z:( yU1<?R%i1N3 b,'.#,,z\=I{&[O/l]xxzDcTbr8  Q Cˡ}?Tp]Bs:1( *~a E45۷a!V NYFa´Cx QVY:+FMms޶PHGGgX#^jp9.H/+qڎk'V̒U{J\H*[0R"JiU16!3zl><0DoZ,mvBFV{ ȭ4#/G$+?c7ߐ%VR|r@ 8\C\&\ LuZG"{sR:i#xqDBJ8ԋ?ST6"z?`=;Pb|1:KZx%8&X{3Mq \ƒ_+5VN|NڷyXg'pI1#T \+zJk=ZYQC*=S(aʶJH26s3uy1K!5XU-ʾICFsnK/HcOC2Lŵw =d/*e}C+6"|`Bȣ%oK) ܧfDt>W^C%dr}d5t`( "}VQ.]ƞ՗΃⚱Wx y yƈ: a{&^:Rbbp4Jr }S;.6vRU }߸#.I<>XGrȢY;8fF(KdlES z\Sa֧sIxé_#񣻅o-Wkf ܣdmkP+ jc\~rv͟,O w]L2OqY`mU%z3rDBqG0ZDrP:(x.WR"0۾Ҽ5SQxbkB=R~Hx]}Q*N0̮HM!r#&]GŸ*ߚh?;|5,pcaj$qΫFM qYy=lUDLQ5;K·Njnxy IJ?CsJ2^YT&7Wŷ~?>KTP+gL ەMWپ#ρ_/s">M'wxwB=*&0jᲖ :qw?!"+n@f2ƌ]VK@i1rÆ&}tK/ҁd0"~W&pK{_iI0<洦ukg`f -MV#wt D hŘVd2=-wb-7I u(ǫ#_3%JzY]m ` 'I뎗MCB$54^ n^@B_\3_";T3 { ^9[WJ<]ЪIV'7ƾծK:nuQ֠K ǰB6˜ahfW4bE^o^[zTWUe0Fg^2idV+"Yʡ,<$|>]eM)/:\I*h\ީ/3#C#jPfl^Qq'Jik9weja [ˈJ:Чi]uQ5"i8ESf+2~|)};v*Y^-7dąvI+x6奚*X^FL\NG&:{>YIJao@!! ̍(%ky51!WÜ>u_@;(ue6"d lg5YC!όedŤF/UcqB]GoC44Yqo|UҥX'=a]xo GZQWt"ɐtH5pSB:v(opfǞLYϗO͋fWɂ^[hnZ]/්a0fZ .Nfojaۻ6ʞ_GKuOm'@8Qkp0d7?3V^m0e 1i7̗.uC,"ʤUmM ekWT:g[F6yɛ?~MDUIAK&lHx;[iF *-Q/^ji"3D>MIeKzŽ̀O-wsl4hc k ׌2dN?W Q|sbyVIQ:'+<ˢDp͔D/COCSM<5^t[Q4'`ҷZ5n |.; nW;dUo!7T"pHq_}9V>Aq&vf(d s\U%uasiz9t,ʇxɴFirx K17VGiom5Nm4fk$ iPrYk̘9 `EtVtK+DƭCS&X3LEcaƳ~;Ig"&j;ת`4E9F8841m'BL2јLی%<[5 *ܕt) BM(5;je *,|Q$^q9s x^_ѮsIkݣGr;[Qu~68h/'g;߲3iuިIC%VCx7LLL {rwg{:Ȁ*aqǗ\ & w8NL mooݩ:)Bg=Oe]>I;w,N9oZpSE'|(fC,WﳱO)O>m>vS~?TІm+w bw",VBXa;lsU77X|)!-9@[5Ս핰K)v'[BiP(g)4%r9ܲ]@|^??'tfgFg)L=u*Fd ~$،ġ~lu-i1vs̼KZQ^ؘN:r ϳ bg,Cnڠ/u#ŇG`h=SEDYݞE~H.w: Kqg,Hm׌Ѝ`~`S1ȈLU9İwVP_>s5F` QȚV;whGr\ Wt>~ܽ|rK_z{=Q֩~" G*A1{9IT-# G# %1YZHxj\-uD'zԣţ"drMDxRK$5p=2P5_2qWhvΊsT3uV0/iyyn)p0!J;@B5! zKiVߌ4'R=q#/اz}?&p,y|?f{VǐYX*ZS7*]M`!8Z{߭џ7Ee7N(@J>G1tNiQ`k~఼:h7|wŜgU| zA3F0TG1qVB,A4Sn#AYl%ƕ㰠S6Q=E`DWm;cDv*>Xr;O"}B6\ce }R"{>[ڈRZDz[ \ڜv!ş r k-9~O ))I+{gо/y ٝ C*..3W7l=%=Q[AMaq?"= ,nJXW㝥ɖ ҧ3~G5#I &l:"&}2c ̪< ;L e[g`:Op42J%% iXo}HBjo n IKr̷i9lhCnV)Iy W,g_UT~B#+(gۏc3>1\WX܋_eh!":"ʥMd(S >ӒZ!-F_Km #}:SbqJ0י'(^>%LTP>' `TpE5l>*8%4 )-n6qoҬ2^7t|,mY۷ʒ=,[wNMIDJ" ]mM4i@F% /հ:m&->ʾj΋< 1jny#F#rs6ո\ Lz Оby<#oKS # /t KS}(1f5n{m =P.~a)Z0G:z=訍ؗnɾۏ_LaEr]h"[AhFOx_-Eְ8%Ti nTCӰ?]H|'EDϥ:0 ImLB $[YsF0)g>Φ53-m^ GNHQU~z#m6!HZܠ68M Ky'sG!,x;UE/\Kyh )v 'F^uH MWs1F^",iwhqv߃n1 ʽZ'rUfDCxgՎQoFI6U5n'wZ4Ўfh,Jh ץpT%mV{2B}\TkꡛY7nhn6n2#FDh97/'{ɨ`M0el CU\W?|i9/a)U߽*ܴ{5ǫ g)4څnlGrf5 XY]`HᐵcOncm:_V/q֜c6qNgYFդmGrǮZ*wy=%S@m"ILޤCCU-Rl($4>h,Lwd-|6 ."SVˀ0,<7p]1ɪv'o敫Dד..i#O.TSCvspNfy e8M# &2߃eYcwǥ%Cil$\6w Zc[FyA^+7N몣mS¬80Η<|jl*D5?=S^qj(9SYXÃQ0ж#)!;Av\ ]l>HmF;C*eOmқLƧxvn˶}bVSςõ=&A/QIP ТĎAQQYj0BTS./@| /}-j9m,^M`IWg_Dܽ\s)tBHSwSJ2 |$Xǥ<"PfĮ9@&l 'rq٣+).E49Ug!Oc^4vy8?ȳGL wІkFqbz@CxLXJpQКKr/4j[KHp -vY^2<tkVۏeHA\lh=OR2[X?'5ӣPs&[tn}۟F&7&3Tڗ؍4$\^|B"`xH?$_{P`|g;p8 Im0UKi|> v]MrêSxCLbtfs6sԮqs$IzS$)D t%5`{L9 FBSo\Q6 3p%Я2VQÅ^ltxXeO\'D|wJ=**>]N^EgSܦS\-g A-G'sՏ<Jeȵ$ѝta5[$$#QA&Dbx0WsTʶ\HYr‡Exd,jrP"29Zh3L mps`bQ@ڦYY'ܧT8[Wi;ȁEODt(A ILYaڃ+uw}8Sf]jay\]/xjkY3z@awXSKf i8SҀ X@1ߚET.N9D7>َK™ð|{{ǖ܂fu7OVXGr wBhx'aZBzRsq _?3'x3Sv>Tp@@?.1LC*Jf핅^۳}uhV'[z&'XoAPPϭѾ`/(-&)nz(B~?ax}{°sjpޮW_[G'0ݯs2B{"~#Z)TBHqu/(_gAUzF K<9H?jd.֓# wCZS(L{x KCޑ{&p<&rܮk>~ 2:U!C䇬v[Qq=#=&׀š↿j:֫бə+KD=9I,I}6Qי(' wDs+oQחJ:_ꕇkHyv Sd`Ǘǹ_,Ull#,r]O{W7GZvpAz!c< Y¤g޳飐W¨#͝[ k{KՎI|񧶖l1:0:#e0 2>1WըP#~SВސG"};#?"Yă=էkĿzmlԀ]oo;#} ZylY6R{kanu(͠$iw V~f0 AJ"%*UZOac?ouV" k||cqeߍj O"OfXYQzwOVXűm#,m#ўg{Ya ZVPO"mAUl#y,T橝 -x%!SR8_IZxPp>Fuu2ϝ0\!ejC6Jk{X6S]/LUӈDS 61j|Y2u Bec!=-ð!|GsdNj8r1~ K eYXڟaW*.nگ`QypEr[X*']kŧ5D4%/(&Hus['!ŠA-#E~~|2ҺpᢘnVY|(B; ]'xHحtLhUB )YRn2g?@[fQ}5mt!.DfE&hf&d3gį6Kc!vGCq9+dv ɨ4\9H. 䋳)9[Ѻ6m}yQ k6 [ֿJ̾8%K$ ڠꙅM.#DASz{KuQ z|%*kVKWI Ʀ'1߅ A8"EXf};8mpXY^eO}xMNg[{reqQ(cٕ4k( MTț&BrԂaBHx2vw4bHϤ0hmRT7IXOlKg7KRa0_k J?4 |zip)|J!f:4ڜr}oF/kH p&r.ɨ-'I۝!wc*%N½BlAs;(n!^G8(wㄌqlp>m]HϹ9FLAݕlVL` c$QS.I~rfL)nMpq-ٺB JGcPF˾O/h<>SmnEqi3|ƽr{M =5O!Є`&%挄^]q/C1;Mͬ}Hm1uY3k+,OW;RЙo6}S[%+e/d82Al/Z7nF#E*xO'!X/ׄ=[}w]/rs:zs!<*E%cdOJs@BԤ}\-<GOE$zMF;b425X'L#DdB!tu9ݗR*}閽stuϛ^Y"sc?Xt=l2lPIc͋ ;us> 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 252 0 obj << /Length1 1623 /Length2 8796 /Length3 0 /Length 9858 /Filter /FlateDecode >> stream xڍT.Sܽ@(ݝ.E wZJ/^P[b@G9sZIoff3irظX]pN.(@N]qz/3&q 6yz8x<h*q7A@V?*ejqsC~;6r.`(w}q>ެ# @ml7aʭyU<0ف ($ܿp6?v }l?`<8o#L Ad4mďxLg(/??[SṆ6퓕uq8yx"! ࿳h U'Tj)`Ͽ`w. Gт,hPh?B;M[n?7QG W@6`?4 悺Cl]`oTPpknzdZ܏w/6<nDžv'ۣ1=_P7|78+n˿}9 IZ{`O \s whJ$1͸moqZIr!D{wք՞"Ygrs3釉2O9w BU oʯFmF'ܳDV?;2+sUak8k&M%P4ߋ=ogCX SX։D&4>hg6? ڏP`Qh][QH%!$Yĝfy 2n"I">"f !`^=Q  8E=caM y37 o?SK+&~1D" *Bh mf\gFko6+fS8RC)ve wG2o&ͿTX%^f pCޫzb|82ٝ wҿ!0cIb]Od)V8W-ځMu .h^Jn5zUe:QEM/qsO.pAvܪSi^NʜA(} 6V°AŎV\9XiN¡zw):7UvD{\zB7&RXڐK垬fX o:俽PIc;YWzNL?M=ܑrT)lATS ŵI4&ٛNZCyԄL *sՄ~W%c )Y> A~:MB*?)CȢ_fR5cn^I cI? |gIy%0Nk?eZ59n r@i@Z43]bstASl;vCLShn(}k1M+dn6MD}r !]q?K=jM,E5_QV,BhH;?SgIC}t0ܶ~3Z2JQi S{)Qߋubٔ~qulN8|%7rXY]~N!C)c!\D1UD o)D<3'MoBg>K4o[?cOmU2rv~}HPVvcygt:3uFF(3$Mmj]OqkCץvRUdLfPކq2Ŋd(`/N^Uֈ (Wrh 2RlL87F`?Djh~#_!`j?1`iSmn1ycUNgV;Ez]kl Ty& آ~]hY-7 l,nV17[wFw̝[cp6+xb-HNZ8J}si';ipyf5^ $@N ŊgH+ \Nj|1V%_/S4]Fra*cAhl,VlZiQkBȍ8E7f֏ղ7I[@T0#&`\"P7TaY{.i^_HZ`bq$UQ#zTkFxj9z΂9=`k+NH>5c_x+v%C|ׯ~~i6di/_?UNҫ~m@l>9?iv%#>E$?2Q*I?Q)*5gfSW**XBGCmBz#^v _p(T!ҽۯ͇w0FLL?]2"M FЈnj3eE5<n2B"{ /JGRt!^<$(o$ns̮jSyo&sS-롩M]/+]vAYtߤ&l^csĂVְWmɆTsh[eem!ylRZT; hGi)O=|6EzJn.#V*EuX`FT! 3261,%2o1 L @hR~u9*\Jpe#;Ldw,֮=:*g]l;A3mF_r}DUAѦ/cQΫ_/; ͪ$oX~q &b:/WOA-Uɸjr'_bX;n&*~K^(9$Ed tL[TgyY#)}M<,FM֣ `VI hn<ПxOKw)D#.W?mk\ֽ&Q#yN <r\5\,8+zߕ'RN㓥΋w(\S^dwrɎ>D,¸BO5n2,;T-B/E>j0]/ek|=+uXpy e~,.vH&i9{>5ClRb1*& t״+`9^±=sl]8Ɠ՘W2UMˌt(K|l0.k2PQߪe[+ #AޭY2aV[H> 5(~ Z*kQHw@ U%n0S=\qb+91;zhzXꙹZG3Eq~91G$)SD4{֜T W%xucc(dAyT?Ue~f2fmw!hY.'2:D#j"hN6,"R.=T[QkN .YԒswL ׎oiN˗'*x +HgFgAW>yه,"<1]~z윓ֹ(DxM&wP´HU8֍Eة\UaZal"G'AP,,SkHvk[֌1QضEd)㈾YD(92WLN:ba!1n9+*츹_Ed #I;y(GO̬C&ÛPFkթm?_ߣ|]>K8sn7|QgyV8 ?b%,_l$^ȵh`~ӧźt,6Mo:PTߏ3]dl  .m0d9c hu>%t;73)uN8Zb;7v?N,.h3!vYN x߽R[Z{ك\mU9V+P&," F3әGjlםa_ף|+#4̼aeBwR– f?Af%;JVFv|*csvyK.M[iIB}L$tYoF]#٦' E^ѧi Py*ꭾ]Z{rZ绒S/XoܐLKGwJ%|ajLڙvQEiyK|2LWZB@&a@ҫLY^euyIŴ$?߻lJl𠾓``zWU:Hr>/M6+\Goؼ^*>7:ޑ|'şNOfs΋øBt؇ɤb_ LYk.Sl;WӘ M{r0ѓ3j(%_7 IhZZT[y5&kiwIL ?\n0礔gˠ5)vwa_4gYro^TЯB::u09t%{W weg,c}-kJ5Oҩ$7QO9oS΄h sF`MgZRZ`7D/28Kpo׌u)QOvF3o[;˝ ;A&hG,?a.cyJ!yfP'1EU1R?WGQ0^SrQ|("&m'jq벒\0I^g!y,즏L;UN_u]3zC$5&8z~XQ9^؍μ_]? }SG? #A#) DZP MR̿SzQO-O/8;WSoe?֒U|h3iQ'SWʣBW%2m"':(ˊ['j({ 'Oz7eL5$5RlNlùZ%L7w~i&XunfVcάk=}CLGJ;R `:_%ՙK|ƅU4v9p޽m0a5"uzMxA\ŁZǔ\%'OQG;%̹򠰨AJ02cY:<-o/""[b|W0`ԩ5N>Qiihĉ #DǃtY/%+Bt8+Pήcgû0odG7& [8|P)FV%>zS|v.32@~=tж~a{,#e_GIh&L=$lڣ[?'$sM 3Ǹ}%mWO;vԪXwn7RiLvd]Gp[Ys;>܋8(7I\Qq$߫]LAnh0%#_?mzMX*d)nQ ~{PE$\4A%HlF!.A("ạq7ڲDã̇[suҌg8gcpD J:k2|!lR`QppH+HBR#汰&*3Ÿ5/@ "9d;"^?Cel='5)ٌJ̠̩dž?it}6ylR"qdS HS/~+|Mo[XT?C[VvP$'}E{!K'FbOlu;4kEdgzK\ȍm4.dS@iC82i/H?keСIӞkHI*?hWX2"DfnU׺`GJyy׺TOc~R6cץy  ;i2[Qu};/*6څ$Fm![a2O!yI%TS 1Œ'/#2瑽ud3-k?@}쾸ts#;/ʋ-u"<ӣӴܿ(JUP*ݐ{NV۵ ԩ${g5 |{k]>l7\p~+=>kuhvAn2%ϺA/k2m!}SӪi1}: Y@&L<\V-[bVqRÊgίg-}+jqE@DjH4>AY܅;i=dW_ٽHk2 ?-1M䬧;[j"ebjٻYHPIzͣ$ %`,/0Pn$!QpYW)gAsZ|t's>M?RC,&j{FXȿ!X(sQπ-3=x ѧ/:U!eSM[v^W) v*Ini6$V*PM~n]5 * {g'$} Pɷ#nht=UfD~k-cO9q5BT?[`6l!SMJvВIa! eyVN}kRro z9γYqYwԜpWԤGT:HG  BKֆ̬fL?XhhJ  ;r$#u wlxd"QCvk0PY5r?N@f 5S(|"Ke ;Jj[._w|I \"v"X"Y]MϚ<p"!Ǭ%bhev}[$_&v4k)/3G\oL1΢';.|66J'gZםp$싰箑;#>O+2žTbu3mu) kD9O3{̓O›G<{X"wthM>.u"eBҬr!Ʀ?5Mw;: S%.EM@~!3|D EᗈB18;A`2jw' 8dлxmNSf:e] 5mn|.8WdxshY#W8dz_@+S{."pJvL?ݐ'CK 2cS['h U`+vT|Ȝxn^gxK"/$_ z>0 endstream endobj 254 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 256 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 258 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 260 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 262 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 264 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 266 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 268 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 270 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 272 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> stream xmRkTSg-T)CFOh$fx"!+ ͽx`!->$c+` Q"Xjؠ P蚵f}gu! PB =TlyhF`B&pHH,$ ?Jt`ht2`a8,EXD(0b1KE21===0=MA&>B @ŋFr '2p …)RXaA@YLC44 0 A[%$*R,O Q1շD pvXr-WqbD5Ӂ ¨o\TEXH]*@ IlD paaT C8 ar!a$`p އ-TmB`%$j[Aa|Q1"ԯ03P`FEFOe`‹׳$f?}%/X[(rĩyn-3F.oS`Y+{ :ڦPϑ~%sPͺǝHddYIEv@n ܆zSL5uUAۍ_~jJENݖO:^ YƳ}"] Y'1jW-4?%[S{!s^glrKK"s=^wo{fPX.5WMwΩ@[֮r{t'0WFO^\5 ^dp7m&+e+ Z^$;s?Ԙᚷ5^z4u1/Q]>on̵ Y;ߌgD jΗԷ͜ͱv2ۄTh>ż|(w韷뎭}O&cvjA۶ᄁ8~m)lcC dr-*TjU#kfJ9kΛ3t6uec:@=fri= 4 7`<谪}n\aX]5^3b\U4xKYeւ02Jcg6_j&cw=CqA3.*9ZE(?ڔ/Q4UD Gd"|fyunU#&]>jƺkH_?`Fg~k~oSCw=#g_/d]DMǸ&Vl)ZgY;6sr3 yKf `vH} MKَp֤rӗ].6]I(ج8>{׺"^p&]_(s MYѐ߃Xm})mLzXc[~jqv/%1GVm /}. d.(L Tn{Zp endstream endobj 276 0 obj << /Length1 721 /Length2 1158 /Length3 0 /Length 1727 /Filter /FlateDecode >> stream xmR}8F33"gl40B03_eb3|xk}y3-C64E˲'ZIYYXm))6yRRv%,{:繟vO %xX`@ ?AXZrpXH 3% L`Ab 8XGc@[- D* 2!S BpUmp)(D N`' н/qERD 1V Át%b Km '4¢pL=xnO[3Mg/WE'U8)&&2_l/>7O+n"Ss{fP/+EaejgLzkѾّ>iȘJU쓓i6i:c"/$Dg0(Nw ߋ-4@G3ٟ zN3-=w`rv0B9k-Lg4U3:lt!8Mwx %.d:uU9e Jxu4/y>,uaؚ_8uh<}̖'}cQu--:O_yk [jIO8m#!ž|ڳĪ~9Ze|U-We\4-tv9FM8ZK۟?),{hf1{jap^@ɗK,SI|Hm^1NgQoTPuBxz?+ջfQRHedT_օ L/ojpRe߾ZD^Hw r: Y,hoJ$KjymMa|z ~*/8Sn<򋬯g=jX(gqSa:m7Rk?prkggtCU_](vkxY>z(sx]y8mfVo̽  endstream endobj 278 0 obj << /Length1 721 /Length2 4672 /Length3 0 /Length 5264 /Filter /FlateDecode >> stream xmrg4ju :ѣ D%.E13 3ѣN"D'щ5DF^7]Zz>쳟˥A!0HDT`n `P<V2`pb 2^ `@D!c ȹ*➋`+\7"=`tBTʹ @F`N6NH@ CqA- p'0h8oM8?Ю,Z-A t4x5â>_//u'!p$ A!dM m<?wt-w p f?wrCQ t1p 0YP_z9 $N醀#VB- ]O?ڏcN;z?<50 ⯽bP? \""X7Oa#i|žc4׻9$ #d |r o Y {igKX /(lok} (V{"B-XOΞuZjuӘ'OM{$ަ,}'OίmE3;1|KyzI!TB3`eda0$3;6/3?=KqrytnEGu2rHtn%MbԈpsڧ BJ ;`e`FX(8WD"Q/]*\ұaRƨoV@~CM…bԙe3'3'>]}TJT!{QyŦr؞{ } 2%.Evpz#J, Jc9u}-*;\pf4ѫ&wϯ,3o;!@ LGl** 7$WWpYQ5Ϛ5# o9-ͰEq?sHf =R=]q'b."_{88  8ixxs=e26R>-MԜy$l$Hr*ReK\w:(_``M:ǦBԲmhR@NP >ѝU%' 13atLjgt4O ")<u@VoYA38IG 4_?)o~[u.ᅬpLw$,ttQ[ \6Qb})Ŏ72K@w>T8~5,N乁c-Tlv#$I2<-fJLZ摳lru^Pd<=.m1MMf+km(=[3/71,(m}!\.·ڔe=D{ωM^ E2 !w/3+H6= M4A'Z,Dƞi*s\F. ONޜՍ 6 ۹,W!#%Xfo߷90 )!Us*@>i}ޟ|Gv-z C-d9Du1N,tA po%ǞMݩvIeʾ&Ĵ6flVk;;v^-YlM.#&l^D3 KYOhlu9ZM:IQtf\jwwŶLaG|-;+qm@٧ N4 8$ZTcg3-KVn*?CmY;S^cyס8'"R\R.E(/^,j&Ny[뙧}x0Q;>vdJKo7f>!ʏs5hr\TesnX͈S)lY,W%!%?b:I9;D>b60*/꘤p&8y\/+5D 8ǒܚsϩRXKIHdݢxN m& V}ih6{͎Q z|yń'<3reh;Xy3E ="A`.jbZ_+2f%vI^ف7Ҥz3q|Po_-g畈 eWGߚ&PJ/$/32pDqDwu&:`O#4) =lp7X\~\m+r-]hQ"eG>xTh "#Ud5i\*!' xAE@}oU4gnş5Y,tl:/IZo8io'"v){gdXߟ;ٺE+u7{</&Uiѝ*v|0l (kN1S#k>w?{Y9Ay|'?8*Yf dW(jP ]~:e!=0iټ౱]PEf-|ѝ6%~R)'ryhz`v,z5bphѵ1[$1ʪ{Jb~Կ s;_<9|9t*ʝX|Jy~>M۩^L(ݡ ֣KHڪzԴDjt³ޘy&m=t9+r[lS3΄QDgy+3f^x_hiޠdd357hm Oڻ;=F!}7;\+9n"jqK5T灁?"(l ,A]Dn,,fhaP)Feɻ3o52i@{;H8dg%lo VUÜ{#gZ#K 2f}{UZIݴzEW1M;7I^_w󱛍^1cŐ=!m endstream endobj 280 0 obj << /Length1 737 /Length2 966 /Length3 0 /Length 1535 /Filter /FlateDecode >> stream xmR PSWHD0´*"IJ(T6! ;T0$&O*". es%JŢl"D@& u!әΛyswz2#Iqb0]Aز0>d&ښK@!☷@k!XdLK"Pvy#  T *T,*KP2U! Ġ2A|y  +E2T Q1p ;@c:I! ARb\|eA|usCr#T6+r̒ ,ј5%Ä*&JPqX7_,l=(FC!Q2YP)IHO a$L&ĨNFKrTE2|I!% P2:00X&B$%)IB T)?)} #8&K+ȟV&lI}W=wW&5^\4Wf-KQmˮΩVe[+3w$J)=d@j)܀7?˦:lǚzIzs%e6%nRuFܻǖWE~Qq}ď9eh8št{$ꎿ}'\i~Vx]p(;Cx148nH -5U4pm1t:i%Ė.+w5nnm>m:]d_&5;R@Wt_lj^il~ >i[|V .Fْ\I0M;үȆns_l`WhA`,mk[ෙ V,<^uZ>8\秪^_r;9J"'|S/v6AJv{A/rlqq2MXFϓK6>CwyMB+597f]fiÆZޫ{V4jA-8w+Ny׃ߍo`z=J)%CF+M|_/+LgOU>&MXD㦯$eE3;qM3ٚQq>\Y?|dd>18_b} endstream endobj 282 0 obj << /Length1 725 /Length2 967 /Length3 0 /Length 1528 /Filter /FlateDecode >> stream xmR}TLyQ{?lhjԘhj0[s3stT,-EZۗ|4VێJ"16% mB[vo=g}=>qb %Djʢ39`bd2ζrt㰔@0OJ !Vpc2YVq$JAyJ)bJL|u-.M+a D"JCa (K@)9B0A$p !4! RX$_[,|((lXNhFh Gt+ @28 A!zD Ґ@p$*R h|L0(>GHd*U!%dR Eb$AMZx#!DnIO_0Tq"<@*A Q9!hXI~Jqh* h( āp&}Do$|b-Z%1W_+8CCqA&}Br&zKmU. o_3 e (].'ڡfǁEaʪ% vGm:oy׽sg=;4愷M+m˥=h6skɵmy/e>Z|HPlQ="&c]Y25;*Qf~`WYSeܡX^C79;R(&nHSfC+#wJ荷$qGۓMbZDyYVI~Wp.G}*<Ŷs =MSfYK3OCV>v\8wy䙣F({ :ߑli(.^׺7g!*is[gR mMYRz)Gؙ캙wߣ(#+ѵfIWDvuOЃcsNyE3^eo[_S|EQ3NN {k.pX^YOMg^?#=>(7u7EaS{CP>77౲WR'_vIͧIjkr(xIR5vk&)hٶ1bWw6y*dS۔uu߭)2R]IɈo.?ħz]PƆH kWVCweB`ʎi.0 v )ŻV)Uܸ=j6|CΏ endstream endobj 284 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=['sv}o|7lԘ[kxBYwS0`Qٮi"m!-M5\F:i0U4e7;yO!(37Px\lCys0l+htcA620Ae L[7Њn& U RZ,cŶPSan aiqD4',IF\Bbu /y2RXR xHXc®eg:'c|0xq?S΃qI&'g΃y9 C :sǡ;(E8o"AJ'Ođ+6KIט'; ztFzKp&q"pBCT/9!ɩ~B}Rq҉TFIܨύ|nTs|neEAxwIyRm4͓_Oyf;s|KۄwU羷{lC'i=>vGr_$Ԩ endstream endobj 285 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRx=7i'Էf[7̖s ~ts[(:0p l:5m_-tB}W{X8 jw]lj'OC=6}Ӿ|< D0,6;96ݕq4L MUWqS~Ӿ |Ҳ\Khv7RKs|*Z -1 b[d08A  i$C#.CZ\wF|TT<\`Gc)y ,<$g v1a粳[ RHדL1>g~8 䔷5 B{ $.  3qdAEBu7js"ܨF)EYQУ.?yRmTy'oOz>OZOyʄS&}/6>zչ{ZkZs}=?Fey endstream endobj 288 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdC۪TBb B8߯{ .@=/ۙڽs{K;K.k6/k+[M'ҷ>dyӔKe'$cS`vfSfK}fƁVGGf\bu<19w|擬CTAW $rG]IyMsh$aW7y̟u? sK-`θtJ!'c83?NaO<Dg!;IX 0z)rЃ@kpBQ]^Z7! / U <ɉ#W m/%]cX! gȀhID8QN~ACT/sQQRs 穅ύ>7: F+}n4eE=zG~<6OɈy2kLd>O&y2ϓQ>OfdV>OF<dR'<>O)yJS*}𗏿tx>z{O->tՍ]*3>cC~ endstream endobj 289 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xuAo0 R{HcIE H9l[5j 8] CfUmóٟۃŏ١.rn|vxb}[6ߺf|歫NNhYgy8å9q7۾q0_f_ дGι/63Dk 6"WT#!YT XF{޺cl_c9K_۾qk8rw麓 G ylIo2"dݾ}hrYWydͼ//V&ZKLxY juwԯx2$OAPyt4sk)$Q "7A?g@c(3jok9E u9/d86dq/@cNiЃ9eyDH{f@/Z`~G. И!`DoSc_ BZ }%m<;4x{[W<Q $R1R R2R:dA3NUAUI5'ZG-^GGGG$zE"ZGmΉ..h$q41q1//fm|T ֵiKN" endstream endobj 156 0 obj << /Type /ObjStm /N 100 /First 905 /Length 4234 /Filter /FlateDecode >> stream x[[s6~c2;&;tƱԩ$Ah]\J@Id:ffwvA ppp2Ipd Ot$ D a(E6F'Vr|yox%L+@X<q 4R}1LiK0}DB{;gh/Ot 2#TP"a tLDeP: z=؂"qv5uAf* 6$`TpDZ1a: L *%4Xt,:q"x&-8Y#}1!0Cc%u@Tp%6 :mhh@D 0` d!`(Ѽ%9ҬP*iK(0؁H@YYG94L1zdH$1ۃIцdHR!V0 nZA),1$˅'^ X֤qu>h +'HT#]) $F.CɆɾ $:9t@s6I&X'*w 9 Ȅ!E۟ɓccΒc >SCQYa@Kb^+G#El-^O'Lzo?a2)"|킴|\@mf|g!L|PN$gc ֋ئ7Z,BQ 4{i(t cχ2JFxTbaB5á,솨$*3O,^b/}mtO]<>3] 6§NK 75d~^%;,Γ'a/ɘ7ytU׳cqM%'l=Fedԑi*r3m$;3n629MneAkGf-+7l+ wy+r)Yd1MsE9q|ڻ*ռSy?ҬJy*W{Mhq;RI[eoDsӛA|)/~o='b|j3vKOPf""\goxV"%JQ1ϐI Q)6٬`ާ2gbڟ.VAFVy>%~`[̊KM7C{ao9x5_Ѱ7/r2?~ͮ{"x(ӽ-PT2^ikq9 sJԢD0L]N=4D~(i:c+bij/f'RV71Pe졄rsaN鰠) +R2L*N=Nԣr>S8iɌ@QDixf8OQBS6"D`aI=*(nuk2eVEt 6!B-ouKIYRT"ZhKi)WF<>nj~̥ljMM$l?]L&%vSfT:¹pY1U8PiaSM *4M9!L<"]m Zo=v`Bp@>}1 0.U0e$M81W:~7.&{LtEtnI꿦͒ZTRw>ZSTB ~yWkZqfs:]oC$´?{M DTY ^a)]' TG UЄBu/`R>Á۰ #82k=hF2j. RBD]?tB5Pl#,ZgYreIc$\<]sFw 0).(;9km)DJwϾĴY/wMgab>Sp8gT7Jv_օgdͿ?4; zH6qf"3820Klmj&C?-8c AMsqi7Gw]*q_c}Vj_`һZ$8mϨ L&-TSI!Hća XjtD U;DzOx#jrKS!-*y/kh4j.j\>G.VC4)CS$`=C-*& x##mWm/oQxLuI#Řz+L9`Xvohyyc)7DO.TKjTŽ8xa3܇V.wد#%F#W;D:Dؒe #vͲՈ#tDa =LxðYP҅ڀ>W#&>b5,qXY 0cpG&禚 ;B-^Q<5 ^MYZ0ЩXTBzY덨ld cvZ^)㴡Z(FWe[kmF9kbD 2z*0NyD56M:DVmI}VQcO[-q/*cdƑȺsKQ0g,ER,i}肙YVxIE̱2 { -0)C& aWz =Rkn `!n$kUQ*T ~hz2(RO9O-aY|̭L.qJ-ėOI|פ'ySzO!=Ct"He%v y]Jt8o5}tIm2Xy\@Ka/XCJMJ j ·jSe"8?aWRl؛]m3)̧.۩wg?|KХYwaT[U J{TШ4Ig%O7r.pxo8773.F̽| spdEuaًma.XAX.;ysCs4baŴBA~l c?wD[cr05WS< ͷ/&M %b ,ֵQŹ NNOOZ QyS# 1RB"ڠz~QABU? h= &ao/aofǗC>ݬ2BGtV\;7'*-2ݝs~gJ}ߪX87 9zYxKjZv4p\;GGT$28}'n1׃Z5GĨ5tvSQ*zEAUگk,X齞nU+g> /8jǒtf<䷧Q-5)'E)D_%iђLNt_Fl)l[U7O5K[!p? n5e&k  U"r}Z݈ي嬅_YfGQW{'#Q&+4jxߒu Go_ 8D)K8:+t_xrrz /t`wJ[ QsVЂGSxw!8:#z"{ o7ٹ! z*}]( Q[п W./׮^]k6sxxJb-[^p-,t=`mvQFQh$jMtwn{ _P INPfAC r$v'yN39Rl㺓Ӽ Y'klk ߝ==fӜE z| ֳqf_iâldj224M_ endstream endobj 292 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 294 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 295 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 296 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 297 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{Vq9;\ظ{32bƱ)`Pk IckgUPSH@"7#?d 9aFm-P!.@'1 c09SGTX3 qxryB4 AAN8pЏ}% Jxxm_p?0䗒䗊/ TB~RtА3~N>|T%9%cQ/G:%uF>%WV6G]$ ' $ML/?mwTkW XֵdpZRF ׃ endstream endobj 298 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5e$_FK6Ӈ~GnM|&/;M>u/tFo1C,RAj]IH}=nCbi$wiдK;!F ;oG+5~~VhVj;zk)7b]϶k+x; v/)&t,KK@F(.$ +.^ ] C@F 謨fҤ8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz*m endstream endobj 299 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkR@YwDoYia) SZM5_$$>kxq4|;o4vhwqB؝Bf#j{p7P_?{+4}+VYu}e}n.ˍggfjj{k:lF #QhJq  HQ/e.!Pp #]gQtVTv)#l-g!7'uӾ:[sI r.39uf *gQNxEqV11V啣Yq:54kDCZ+)]Ws8:а/9R\Qrz\8Ç]按Sp/ d8D(B!4׳030 =;fzÞJmw&^0C~/nS0GKW皠NdzG5cC)!=E^K<3Iò8ȿ q3NOg{ACt~Qn~ɸ\ %1.: *4hH`<4̶E hSu endstream endobj 300 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 301 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5NJJWG> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5MJJWG> endobj 293 0 obj << /Type /ObjStm /N 37 /First 306 /Length 1207 /Filter /FlateDecode >> stream xڝS8WӋVߚt%@A 7}0RИId;rl%JV@RBE 3HID " #4N4% M$ % (Uj0Nq`՚pEptM5 %AhH" BS3jQKSP wM5(E>`Xm.00  7NIsr@n%$%2LV7:!$t7dpx9/ G+W?̖,+1ce9($Wb6o WƼp>Nǣ+ęMyADDbwxꈦDvQ#Drwד@ĺDO6sD!F!.izt,$M"!nxfr4QE{;-NqhPk<!iyyu~8H _)^iwNOF_=$^YS^xSd1'~LFn@@_/fS>)6N3)^s_2 "Ët}nIᾪD&aݑp~{{`3Vy1dX(egɨy.<VS\ dz@DE>HB5g^nD_+~dH碊ձH)j0K$W8ZA[m:`[ZuVGE,QJ,n54ĢM&j+ձ;\gTsBBj18^%q4jU-2/ sia-m[l/:p+v*"߂mf׆F#wF]{Q1̓[7l{uewTϰztV~j UWUo߱*q79LO`}[! Ag}6;`jwʆ^w6#l/$N\y endstream endobj 318 0 obj << /Type /XRef /Index [0 319] /Size 319 /W [1 3 1] /Root 316 0 R /Info 317 0 R /ID [<05D467E9021C1DF22786D1488F1D9603> <05D467E9021C1DF22786D1488F1D9603>] /Length 836 /Filter /FlateDecode >> stream x%KlTe=gji - rir+`)S.J$! [7.LL(/&\7.]!&č1qgL{9gEf׌%VC}6r(1fH5 bT jXY3:g̬Zh`¬Ȳ1ʌiCG4Y^_+Хu3m g:l3trK*ۊvX4bM2V[VGgeWOr[߭9~í생*ݰ [!v\ p8n#5f^q6&ZӰam'NYZV`mw-a0gj n?5ܮ^O[❗<\pޟfw6phNDb/&ZS %vۙI8t#q8^N81(1͏ڠ:`lN:#@fJ endstream endobj startxref 283987 %%EOF sp/inst/doc/over.R0000644000175000017500000002416214143756315013664 0ustar nileshnilesh### 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/doc/intro_sp.Rnw0000644000175000017500000004775513171625774015134 0ustar nileshnilesh% 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/csdacm.Rnw0000644000175000017500000011655713724165642014523 0ustar nileshnilesh%% $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., <>= run <- require(rgdal, quietly=TRUE) @ \begin{footnotesize} <<>>= if (run) { 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} <<>>= if (run) { library(rgdal) x <- GDAL.open(fn) class(x) } if (run) { x.subs <- x[1:100, 1:100, 1] class(x.subs) } if (run) { 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) @ <<>>= if (run) { 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/csdacm.pdf0000644000175000017500000123375614143756310014522 0ustar nileshnilesh%PDF-1.5 % 63 0 obj << /Length 2480 /Filter /FlateDecode >> stream xYKsWySv[qr,eS){0 Q @+ӯRN%\HLc{*D*R/"%F{G$K(>чa~v/q{-y(;zz5q[CSA/&Ƃf:)7uQ^9;[h(k9H5* .ina Ql.Ȕɲ<K5?.saa Դ,fZXC)}&v)](-}VP,F + TQ5HԤ8B$Bg<^,R*~!-vc͖Wl2\eID5?  }Xjƀ_RZO@  h1D؞yH,KͧTs:H-q?۫f[sOtPAS4^ռ,nC!"Qr\U@3zq'9Z 4m`0]Ӝi0 !}&$*Ո1~@mRLv6g wDsr."XwA44A鸳PYUbI\ 5=$C&@hRl F1# AQS+^zI<ǫ)%L6"21}Ay߮d'Vsyt 4"E=r3ՠ0ўBűQ_=R 48]LNٗ|t,ChVViZĿ)D E-҅Fhn) ?TݻtBZ&4{?zY{~މ2Al܀'w읽j9= QIKă :tzӞZVēv !gf[+傑%?9IC=Gvg Ǯ6qxxpzhpجwqH{M˴-zى 2u t*DZb2 hzO~iYJ1Bht7q5wcIx[OTa^,3\OCMr,%&eMV hj>5h fH | 'E B.2&u:5t $|$w56/͎y>&d|5 Ŝǐ|L8uRYPV ,T鞸>~O0mB}NCVUl87>J,щi4up^^x<~Y2OuOaV؉G=d՚_z [:ڕGzk&j.L kE.PCzȁӺ0ppo\c)(?b#+ms%5F +Ut` DG#Q-+.ɥXp+qxUη^2̏V3ے7{D%;H$DC=Lix13>?|:U׋e&~;3={WAep}ڄw:?)Ѧ5j^-tĐS%RN8R9i߂Rbm)HE}tH"Sb[L'Zh&E^~P͆tjg0Pŗ\Wt àS9h>zxDΦHL&3F'ӶU9a¹oT50plM $!c ҇-I t  8f(tQx;y,P-pFH@:| ݳHX͡ 򳏉D( jzG_#IY endstream endobj 80 0 obj << /Length 2894 /Filter /FlateDecode >> stream xڽْ]_)/CJ,9)[Qɛ%aD,*P[I=}]Sy i4Fw#-G>_]?捩GR |tIDYT”"Wft=}TfY6~nf--'Sv_l0u-1HsشL|F֣ZE^ 5hKQeq}{2Lj!mq6cBk~ieO40$Y  d \8/A@W,W8.XSf2)!2 w#)K!d&rΙ ~?ˠUJ ?yjc<$Au}>Ep_w}4I0Bݐt7vJ=^ m'!@Yg$oI3{1jЙE'[ur #ciꔐ/HwH@*[+%v&t6>La/PTF^fN^mwФr9EΟC,F 8#B/cB؄ٶgv9r(ϲd[_!^m #\7+ RM,ꤋY 5A ɬZ\HV -ᣳbG_]N'!Z?ja#6ň( D!;SAc6HyU,VAXa$ (8Ma ^͕MNPez7@ގk:཰aw(0 0.ŮW]y ɇd +p2+pG{~΁nqB3=4|pXr]3%ĕ{m筃]3FR}x\5[ۄm (' ۀ%ըm:k\2f넢 29> 60iY _'ҥ[ x1k!?EQH7ۄXp-P8E9F'2 ?2Vc/j=~34Z^%j}yޫMʸ0jip6H DŽpZtї[xXAO*n&(A s0KD<ߢ, UQ&:yBx}ɆHCs6yErZk}HI _#!OI70 p }$í+Y>pMl|ʛy!X >k(:P?Z u=Q+^ΘƼO 8ykq/X*zh|dcsAbr2Yg3 qqRŐZYQa</G~e[?S3dxLrX(tUrh_t\.‚uW&$E1+ʵw.J]>4VޛvP*$nzrkl kɗl5 ,[lUyiCkgO+ɵE~5侩@x} R ^OHi eD=@o|$ |6JjyTjoЊu%&NF_\k(pok W _[&va}֓F  sa*YpPOO=FJz˄Q0b𮵾ƚȧKowl~I6Yz,J:tĩ*w^$L]NZ(w y Z܃@ (B>GBJ,n8 s3 L4D*?)Bᠫqu M2&C!6\?v ;6!TLwEԖ4sJ7/[XkՃ|~۝T8\V`xIBn n:m ኍ,."$[~*i_KNu9un7.:<<>W};j$!͉$.ڏyyD}XCa*eܦ:6*:J\|[\s=x|oSM=JW$p6B'2|{aG_QʗF<-THmo[p6o" $p>,yUY\-eh*-ODHM~7;BwsI~HtA g;P{Ukf1<& TW;Q #0=G:ry#{ߑtҁ=48xbUXR{4׈Ϩrbl> stream xڭY[o6~02g9Q$u) ֢@Rt}Plʖa)ua}禛M7yxx9Tr^= `4z1ƨ8JFUhz>0^x1uFOv0.Zj].gx~16>պ*q=_?ild{S%.]<ܕq^ MOnF$pYx>PN8F65lgf9gܳXB' 3U+kȊKôZ!e>;+IŰ[dCUn^|!4}_ ;﮺n֝Q3 XJ &Q?M"j"N(d!}LC3^^PyYkRRQe8+4z`";hc[ ޜgfSRTQ(6fƘv\kw@e=u\uC5/drRJGlU ex7lTST`4* ̈́`nȀ`Ń \@9tU{BL!(\ 0.d#C_QpӺ>c?K4'>s3MFa|sx_2#4 xy?59j+S^sވADtW+M4ǍCsm U5qےvY2>/[#NtnQbF_QPvzG>QSz3ơQXhuR0`rY$L)Zr,lm< 7+Ά. )&`4FvHNLMIOv{|4 nPn,pnED&BMTsTVӭBr9n k̉eL*QE~pwAW<\\lpJSx? s!& ^vuǁxIZDK̏ypl ND*-ʉKG ΐდݴpt2E; *]0 U4?~|ŏ=iM&`s-A&v.-J9M+M@Å>F'TE:yn*b/m"c_nQ TkN!jRMfsĀgV9~G+X3mX^*2sI]Wsㆠqutt?NZ5ǵc!VC8Y v*aoOu{ҩWxc!eVhjܼw9we9O)S0g( }7$ƚaD> stream xZI۸W(}*XTMۓTM[eZ:䶳o)rAMd5&/d^zR0DJLTŬra6FO3=}5:t=v<vs Әzn15_{QV /ktη0Ij+GLU}f67Ŵ/;7tafi ^/ޥoMYqIu+S:L0L"SU}A/Si`L fs_< āܿg`*FB=Xz]6 w\gV(hM#::)UQ2H%vMHΩ2w9o!\hjO0&NiD@JN,h$6͎A-w- 5LX-~ h DGm|fA^vxV'hB2xo虎,{e2C℣ S'rlٮ#x$ _+UIL4¾^'݊_ҁ,r~ǍowlPHa"_TDt*PJ[5ҳ&}XlD֎da:2@ ޥk7?}&.7vcES~Vi[j덪io{w<8VYl}C`׿/(( !e#50<=顇Hͮ{5>4x=\9`3{,L'Al~$\h8wcer唗஄DۀehLY$,Q6>z aJY/P\= _~^;*r4U+Ikui5~ybbyL4FY$L$,J':9~8٥LB9g?Ɵc{;̚0G!RKl&&^^OZ#y Qd4ƣacᢠ3)QVĮ4z75![\ D_ +Dq*lpgLRc@|0JHī, #;΂ЄM,U^}CE!(Wg;%>?F, ^j"NYi%Ye[a}VᔺhN_Z7QzH(lJ5: ~!^Wi/變_pIcwׂmHݗ !Hz{I,=^E/ǞH rGkpi=kn~ $LEw`Cl?oĿ:rGz,Ol}Oz3Llo(gLgCi@Ww=OsgPMg1Ht[TwT4\T—(m0HyTU[I F>68.$Fڞ E.kڤ*/'_~'Ǝt. ֢5_)cK3T2:t@yyT.ZphVYQ5 J᥿|%7$2hP8HcsR+cjeoKzo,Bf,\ic7BН܌j JvnHR{OeTLV&I^aZOwP=/ovU*ˇ&%r5{LL xq$jH\? go?V"zz#QF< !>b(Fl L]&1ѭNTNyˬ?T&4 ։uF8fhgCK |-y\ .S6E+PR{/a}3ka}-* q1ϯ  endstream endobj 106 0 obj << /Length 2656 /Filter /FlateDecode >> stream xڽnF=_[Z gHth[>}$JV#)1 2e"s9s7F$yWOΓIY&Wˉ03ĤYtr=:sTy#Z[x%J#;g&O'`hK@]ֺxJR6/d@._|ab_ l`[ m?<s-__,wVŤ jJ%anP' HƎtzې$Tv,G7o;~oee"jq&ET5iXvKtm\WO, ~`\Vc9B|dTd8QXw#8I-| J8*2tWme^uv3,2;4sc/*}$ġ١J뚯*YKLA9Td:(]\hDŽ(q4lҤ|G:#yvZgav~DZ}S 1Ra) D31(XUd@!0ϴPd rBfuz蝸@n= eoK]:a}Ks벶nymp^Qv-V|wɇH-+tKv'Ur'zAߑJ[ Ċj|coF&7PMW1K7=^]3 `84$=hJ&CxFRl#t@ɋ, x5wE|( #Nض0,CYgO !PZy3/.⍏$SaޤLh=tUђ"1F9.U9qYmxycP@!RpWY.Q )bxДlJ#s S{t%p `ց|~g;82/+^/$V.3gy1FD[u  eUc0?.P߲`67d.\u|1גZr%T|mbz 0y)`Q X%A (V9sD@bߋNtH1]:aS 9Bou{E# 8S9;Vw;8g P&aT&[kX3.sm%~!rj[s=_ kpk >-bGWEp?sI;͍ =ƻm&U=lbs;N?^y[~#*`Y!mxOv+#at~}oZ=̒ >^ŭ]Y/=ul&R}8"fWg8IgMeW.31⤋=Q|-{([9g?_ϫq6!?NrXyሿ%d~/\HO(8S7aw*xϕd]ٯ.X #"a׀j|I*.u= fH^IP&DRٙcM)r>5Fd(Fܦ*q~]J Vt=\&ڤIPSZ&4ilq1ᮍc|eE⒢(kC`k[ 5,׭.X+(} *~ ;> stream xڵYm6_[\bDzȥMC] ^RdX&J,{l"hEWO"œ/3R$Q둌c(M2dt1]Je ǡ(x5/Sg:8ʶgԞf]5w}S O7@f3~w/aR,( z3U* ;;gIe^*J{7Y*w 6%A6Y'3|DAqm>_M|8tfX^Y>ʭ^"ILD,ߢ&Fr2fq;䭥xyC= (R% $`Oh=^!T.;BA,l H/`5S +ٖΧ#wvHӡ|Bow0Dԉ1-lc\͜F8b0FRh(3tx- a5E R1(o{Q,e+huL,0$Tq$TVB'1f&*6^Xϐ}${EÑ)kDze06yd#Δ4k)4뚆1A'eH?OzJ3U' wwΦ gj+~jE/Cqfx֯GȽV>L{Y_!&xCSYBIkY}*c@)(cþ>ܭy_{r٠\Z`9ghaJ:-NIK&zқ.^m6;6 Κ)/s`_:{ü]"ha8Axw"|ײߐ RXI+hdVi0<<`cyNJ6挓˖'oڃ?esdNb#}n\{[j/:{x.O{"م6>޺koA#E3a>)g i6&2/ۿdbar{!@{LkN\S_h5كٱVu$4׹d<9NAm[\,Ŷ'?Q~F\Gݚ~vE/K+z>ٺJӿW<=َɥ^XKDwN#~mOپ>g=[ʰv1d OpY$r#no3yvh`V]a>`d@Ǚ9A/?/{!S9$;U ~`3q~G9̧v|]ˢ=sr5 t5:OE 8ymi{,$ n %˄n%^$ NL] vQ.T I0P:P5uMAf} 80>`Io Yy)fspb°SDKA05M=`|et+Zăy K=(KAMj\*#ޡ|9C&dXsscfԉM%9ZMXc(ED9Y(+"2UcSU0>!LCI7FW퉄=Ē5l:DF E5 lAfa%_ %^-y*(o sʢ X5+1XN7(%0X >ephh9h`HhJ抎CxDMPaqH@8Ȟ$563%8~hi5 瘢|T?Đjv.]EvySw*V6,2gMN4ƻYw5sm,wC^ܸ 4Tn-Ɵoۙݑ OL`F_aW>X L.vC\dF{7~lr5[uaj|> stream xr_ 0vqԙ8Nc5mNdMK  AFt=$HIS@,N2/|w;M2/uS.,DyeR]ZQ gCy𨶟Yld] Qߋ14/mNQ/76Έ’up(v3Sޢ(r#,`>93j2 DOyc~"/ڒT#̽E ))AmFɀ=*6 8Tm^&-[oX[ʏѩ( pdhiia%LŔw߽k4WRRϙW%konDxU@4O_ Ub̋u4}Yx4-v448zt/VkV \+|H9lNeoIQYʧڙ _.~r(Iz"ԇ^5Dw }A׶F` 9FU$`DE`aiߧw#|I2sˆ<]jAU'%KlaBeeh.ա;Z>)ZM}R_^-(GJũ $t6EMB.6%.筳ѽ1H.Yj:f +l{Խ=vޘhlv&ndvzƜ=%JCz,e$Zz>0Õ@ȍ 2ߜ*i!ݮP}߫/ yW) 80d!Yjn,(#eIe[Az&}:5y-#PtU(GL{ܡEr`$w} HT A554\Y].Z#vC z"Sڞ~4kS;.?bcA9, ?Ҹ|g,)Cu%9WB"M1kklJ^,LSUCȚK2Aɞ 3I2wAEH){͌*X^6$  m_^QgIu.d^$~F͒\r0w$ÌeSΘ,k3'zgMLlV28JRV/cSJzhod?rקn.yj=a˶z>6|.m=OD_s'F^l;\GF{3 g= ;.IJK9Ou!ӌM6S2^,Y*%sLo\5s{wjrEBpV g~k\ZV'|dX(i%r`q+-Zxce#Im;6eߧm Ǖ7:^$I GLf;X|Dk viI&ʸُ\I#}8ѷKc'ƿv4myyGAյf=#GHwbS/f* 7~Ce^ `開]V̡a lkP-B9IMC̦o;B*-N*BBNSJJ=.kK).nXSFi;ivukS!%=Qq:aA쥱fyW/  endstream endobj 122 0 obj << /Length 2227 /Filter /FlateDecode >> stream xZ[۶~ϯp2f%IѴM$b˻|YXnE%R{,"\839\Nɫ'ܿxˤDFiƓ$Zei>IL:\,&z:0 L`}\,΂8ә:Xsy(~_',au"3 .D~?7ke ?L2*&*8E3KrG*s&T'K#+{YN\n;Ez~+ӠBpWǥ;|]/i&!<}??CSjz]3pEHDG.#qr<4^xFͽ۝kPɄn*Q< XS'*.X,CV,ЎhROr"*3;Gf%#6NL9#E 'C0h2gCK"ea}U9 ׾=N"sY O!&R wDm4jf#ܭ3tYpӳ;I%Q%Bz@ O<RWJDK7-;>0Wq/Ohko?PJfɷBOm/q "jka*L RĞޡ%D> g5mz[в=%66z?czR,"K]&i8kqcGX=Lm+ĵ7=mLk7¢ ׏**:j@|`)I|y{V:02\q,@ca㽈!aQ9;bƚٶwLf2Cu Q|u 7V!4%P 偟l*5/HhY;3q<ps<xœ "-IܦbIHM10]6u/Mmaoh ;6#׼ļ[`aIpji7)n"p'n axcME7İ"IkWÒf" # GI˷Z ZG. /Xf>13\ݚu#AuoJ=Qw%ϡAU:(mh%S<qs)SNj ;OHOR@2Y%zk(,]"t{ls(`G}e(R&]Q(ս/ٰX gw8GV;coy1RcgW &2@ƹ>g|u _zqdO5NJøG]VwqBښI=H +e 픢 ib&M̩|Bċ5r;oGP-d6!-/) vp3w SO ܒ6J/pS k{/щ|\$@XԞo{ 7*'U[x!!FuWiYtHk'Mj& ,Bp%4xAzЖFk8Utg8:EfYogL;;׃vO~?Tl6~/k+{z01?& \Xr@j"6T'X~w N m1ɯ$S| qrY*u1՞}z6M 2L *m]"}$s>UQ$&9'd(Q6HɅ$*{_rҢ-} c#A4MlŒ-)y IyJKt> oa[Vk[D,ujok B1h5.|=SN6²22&C묔Qm׵L0o܉z$|(2m"S:'@?9\ƙFNJei{H>=;9w*=`A520Bi2H9fxQ% endstream endobj 130 0 obj << /Length 2960 /Filter /FlateDecode >> stream xZYs~_ *c`p┝kW;q "iM+ɉtlm6,}*~먜t6EIHϲ4W:Ngxg.Q{xJTZꢲHS': tk|:s7A2:ctТejZ-+˴v̜q2‡T04M匀݄cgNs܈NrgnLl X庻/]bv"Ͻ)A@"!Z8K\S[ݻs%A NMp!Dbכntxj{hf8 8c*[Ώ{)lC ^)]wk0_jI|Z:mt;bwzn`ovMg,MY+1%哕$Wa%#+<2_$޷sN`~t-oaV~vʉp02␱1~l%b?vTt_t3(ɔt:]/Z+dwK2-}<ŷ>i.*R+@WX gՌo~5{KHh "$U&7tXRmцa:eKFeTs]L^%ϸ|};SҎ + wwL@ܳ"?sxj{Z偦C@wz)9 ' O`/(p$`S)amϹ0]X/s-5|+*_ Ko#4Q耱c}ujh2eYDSvf$]tW?gaN_/ +3W! endstream endobj 137 0 obj << /Length 1676 /Filter /FlateDecode >> stream xX[o6~ϯ$c"RݰK6t]=t}Plvg$͆%JgCaQNzO[S Ks/TbMVgYq8CplG[cGWWgHu]x*˃ᘇl6kq W&a؉5#ʩFTl{n,Ħs!YA"N\/8"U(^ ڤlHFv(޴i>Ρ3ҿkA-5]{`Vov6ṯa)W U5*91w-'_PA!h` Bwi |2p2︯Y:NHK9* 2Z|X,]xLZ>I.dV7@߯Fbĝ3OX`V1㩒_dyj%M x R9jrP-GkI|5g=JRC$R$XT]d%nSuC)sdm´m=]uLw|;W:_:t knaڢ9W}POB,AC(!~-&oמNInlo$iٚ>8?Ntk}xP;MO{)Y>Ҿ;(9v,F!NפZpH&]cW,=κ y_o:C%ajL%-T0'YFvq~uwHqpPa$kLi٨i77N;;p_Tet/͕m> /ExtGState << >>/ColorSpace << /sRGB 141 0 R >>>> /Length 916 /Filter /FlateDecode >> stream xVnT1 ߯5qٶJ b5PթT#+R;:84ͭyñ߂AWwܳKsu,Xk=\}$i嫱ۆ~+JwbJw׌i[FpB abPPw8.&n;rs<H~{Q?c~1ټpv{{s1pe%.R*֕˹>$Hc]MTt@${5N4tVԖ qrM-8 .zGOz>vиE[5iK.:EĪe!=gzsПg2y=Jc*}9άc@n+!5FS=k8H4~Pj  NٵavM\!b.(GMI g$/;nY|u$~p1=Rֽ`9nϫ$Cs$*BX\$#ۡ/~v$պI8\mvӇ[,`LHZ%©P;:u S_wܺVkХGProEjkwqηXm9RZ=!ʧR-T:ْIP4! #-*S#gXZ-O #g~y:J (H4~#2,T2-!W})uC\,B%B-HƫJ2؂΢5&Q ]()z NiGnI "~BD*` KS;P?.|=S,ub~yb$_NOTt r7Gf E񌡞"{u1C,PC8o<ݪsGVNHbI&{hi 1? ̹% endstream endobj 143 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 147 0 obj << /Length 1792 /Filter /FlateDecode >> stream xXYoF~ DֆK8NR@ڸCVd%RwaѩrEh̷3l,(x|@'<0)elsDe5iȯO7qpVno={O{?8]K4X:i8S6w˺bqx5YXj {ָ!ӼiXo\{~eI&:T7 Lmɂi$I#B ecb#PͲAn W%g\@qJ'xA$ O\Lp0UT$'w|%x\,D+mgͽj ,گEzj[/X,\mT%1 rv~Qĩe^Sb $>CQYIM'L{^ =3;1#ff?kƹQ"CyTn_))Y hj3TĂ%-eS;0`j\LR3sv4Nj[D~/Dgۅ@GL]kk·zFb =gEōcKrp IU5 ~(P |zTQݵS&RsIGpA^;ˇFpFM)6;>mA #:3C@hqSw1r|q2M!eUh|Gگ#mpFRp  s*`[7m >a/Աc3pތaUsUf-aqDr>&qL0\ !oJDNyCOHTP!2n:z&~C}kMG #_v~&8a@m1#&M)EPDe\Dq20-4#44h\ms/SKB-o9gN%w?ZYB6H65r%x}P(8dSe2g1~!u@\8Peȑ:}9cӠz[Bg{.=tcQ-y`τܢ]C\ !CY>F>TS¾S٪^/H[uT"yҢAC3AhS>pV>4 Y8"eD 1oj *QӞ/'i dJ+w2O] ]37'D6CW$[~w8QƵE׃H5MH`xPm2pH;gCkZ:! Wg/{/[5 >R咬_\Bƅ:^& R;@_xު~`hQoJ$SQ= OPhX@enOD(ORMm"uFpLjd&t3Vf_10ŽQTwuq<K_V]ғ%w)Q3h.7OZ&Q,}q"UqPW#)Wl"gso۩53[N-9Z6~RrDl{p*O\ֵ۶ A]֙bj[%Y.RAads[z]QR^F,srŐ>Og>]K/oJ(pSV='~0xl2,CS]W_ endstream endobj 134 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/Fig-bitmap-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 149 0 R /BBox [0 0 432 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 150 0 R>> /ExtGState << >>/ColorSpace << /sRGB 151 0 R >>>> /Length 18424 /Filter /FlateDecode >> stream x͎r)zhOJUT- غG C[|~}I[{ٺꈌ _?Zg}3=^k<___OX?W__x}5|Ǹ>9٢&㴉$q[`7^icyPt%D&_Q} [X{>OO[|*Exu*B>m ̗fQfQfQ2ej=_ujz<-66h:|FFFF.;|Fml'5$6O=F1{̢z̢zeryηvz=fq߀a}| @L,1n{`ĵ#~ ޓ1naQwż;\ 3ΧâI;Sod<WgBFzwDwC5OwEmu̗wEmuY\ `,n8=ߺ(ǎΧQ`QF+Q`QFTBw;(8tz`*_1wsCi@1EszHt|5=,jz)̗âEMD3NOrzX=Lq>M/FxQ"4Z,jx1 hŢFTӣ|-NOrL%8=C'9Z,jX\z=њkx-aܡF+isgĘ;SIoL;5wFst䋹3{F+isgĘ;#.^`(sG7}?sTIŨbU5OiTYԨj*is>*UnOzrTYԨQJps1_*/՜n )s̢E1WҝcΧ9fQslQtcc5,jM%49ݘ/šӓcGUNOrYz=9 -9$b1_9r^X4,jY\}O~1/E Y XNOrY|Ok9ťӓr3w8[hmK` 9n5OCb9r;OC΢,FsrYԐ!7󭝞䐳8zrΧ!gq$ egȟvܐr/E Y8F!7b c]%!|r#ƐpcMr#hM%<ǃTcȍzs?Ӑ!G1+9Ӑ!7k9I9rSIo9ͱF吳!gQCIwi_ 9Ӑ!x5/E 9rSIo9IY X4,jY\}O~1/E 9r3w4ǯ1.kIts|r5,jȹcr5,jM%!|k'9fސs> 9r^ 8G吳8tzCn*۟Q}1OϢFNC`}5,jM%82賸!0_>}5\Iw1_>nL׺ҏcYNwLvuv1v1c]cxLWߓt|1N<-|̼˷vz;vq=/rIt-C`}5O 4(賨7FiYh/GE>};o$G,=:՝1uM/tź4(tp5O͢EM7ݘ/EM7/|nNOrM%6ӈ=m~sI4ӝ|9,jYs%|}sb|}5f1nSeYs%|}W72tr9$b1_N7n^X34,jb8NrYt6󭝞tb>ļ>Ǐ9$!8F}5\Iw9FEY7/GEY [|}NOrs>>}^Ox_NJ1+r#Ɛr/E Y8F!7b c]%!|r#Ɛ:CnŐq=qs4F!7b wH\G/,}KED7r /X/PL_p%]_p>E,Fn|   SIO`q=/0_E,/iџt-*}bD7r /X/X/}/X/X/L%=_`Y G_n|/n|   SIfTS NӰ(Ӑ|!+a4 2 2 2 5 KӰ(ӘiPLӰ(ӘJz|2 2 /5 KӰ(ӘUxiXiH4H+a4 2 2 2 H+a4 2 2g'Ӡ1/d%'Ӱ(Ӱ(p%]`4 2Yg3hᘩyy,yrQ(:ӄLprQF G24s'rrQ4M G1Ţ*8 G1ecӄL9- 9ӬS XoZsRWFIt~?9ɢȢb:E9f?9{Rb:Tf?9ȢȢh*A=;=I'('('r%]'rӓt"ux<>^׃Ìxk1j1i$:ݜO>fQ>fq[/>F1}{`ݜO>fq>}l*A:=I(((2{>|cc^*ws>ŵӓu xkxkNq m.`Qh`Qh`Qh`q[7O``BB߽q%XXXLK4(4(4p%]4p>ŵӓD1a;_/-<cm=҃:>͚PPPD!E (((Ԅ"""""f[/(B1QĢPĢPdD̝$PL((26PL(q%L E, E, m>'}!$b-H!C #'ւOX[E"ւDX %L+'/dg$"Dn7wv/(1HDL D,DF 2{$2DF q7$Nc}5)E%م..ҒRRRR~I)D)A#م..E)E)E)gB)Ri"R,Ν'PLJ2DbXXPLJq "R,R,Rgu|̷oR ]MBMBM"-! wHta:хЅ w] Ţ Ţ Ţ eI4Itq> Dsg )A@EAEAEAd=;=IH(H(H(Ht ._K ]BMBMBM (BE$P}/R~ )))))J..g)R, R, RfDPLH(H(H(HC.̗bQbQbQ2TMNFgfPP P"QQ(Vdjb5 #ɅD.B.(((g(Q,Q!͝'PLF(F(FC"PLF(FJMhI.'rt|?H \\IEE $)$q>i\! #'Nf%P X 8&8prF Bpb-ZkuɵA2YF dq[O8(81dĀ>'7ϫ{Ɉ'#pre"NF 893x߾KLpE$Px0eV" g8CmHp^$P΀#3&](p(p(p8pbQ"ago>qbEEElؔ8| ..C>di}6QD 5W MMf("ل{l2UGXBMBMlBMlBm.lbQlbQlbQl!'XOB1ŢŢ} dbbG|b&&Co)E&&^ #ba6 5 5TaE$P}/ D,̶^$PPPP['D, )bQbQbq[/lB1ĢĢg4!>ŢŢĢ؄bmW|q"? ?R?MAM1+bJAM1+bFߡjE5+$T$0{Qâââ^bEt8P|sg %?, ?, ?, ?, ?DRF>ukAR>-ZǭkAg ^> $L0}X ^$}1bLjAs"dXL2bLjsg>F 1c:; 폒E:L$LdgCTMLBMLBML2UtD$$RIMLBm0("AB*E*E*g$I,I,I,Ν}&PL&(&`TO2`g|nKE$v8[;MAM1+Z#̶%vJC^В0jjjŽВ0g;, ;, ;6D@ˆ F(&XXvXv (:y?lءga ; ;fv0;1+uFߡE$vPvJ F-;, ;, ;, ;;tyˆ F(&XXX;O젘aQaQ1, TCؓ:EM!-+DDR:mJꘕ:lPRWQ"::fu0{Qâ52;"'8ꠘaQaQaq/A1âcz{óқ|EuYقEEf8[`[ɳ!oP!6: BqwH,b-X,l"ߋd)q2EF q I(1X6HL{EʈA(+7?r" n(&&(*z(lBF|E}QDס0;(2+n(&&JDE@(((8f$0_EEŹD""|{c>0PP+!n(H&:(lBjEE(BmC"REM(BM(z("""SE|oHA"""EfWoFG `и}#Da''''H>&>:|ljEO|lȠw(;|2Ut''^'(|bQ|2k!D-'>8>|bQ|2{ $8{Rb4O~q$H3|("م؅UhBMBM2Ut؅.Vߋ>("zlbjkC'"]]]\E]QŢe걋],ξ!]$7E4_'Hc<%("хЅЅE.Ԅ.I@lE .Htq0Ѕ{GE$Px%ēߡ.I@|BBoS %XXX;Ot_p^QXC͠+`k kX ];XCMXc-XlVt v!X3+uk]aZ`ͬg[|knLkn1$۔XcQX3b`͈5Sx`۾}x O΃dig" fPHK֡&q3M:Ғu :&ߋd:H֡&J=a6:Hq6:ߡ:SFuOcQ3X:u,u\ L| }0{PBfPJDEx(x(x(x8x2!x aco׊5A5A>("+fߋY&RDB5A(jjjߵPVߋj6^$P[}/z\EzMCMCm(xcQxcQxcQxcq,x38l{mouȇG!xCD>Ғ||\a|mH:䣈$j"Y6%HK&&qH"ɇ{CM3vȇD>Vߋ$W#fPP[|/ XXXX& s|޷l؈+9["kAEւz$_Y|b%FJD`%g|DEDEւB$_M"kߵ*$+9{!*]+1BTd-ZP:hĠF *qL*:V?WmYIb&bf(RD5555G*DMDm"f11{$-U Q&b6^$1Q[ QHb6^$1Q[-~,,,,~X6yvl$Ĥd#jb#jb#jb#WHKbb6d#jb#jb#julDMl4+u؈&ߋd#1)"و؈{l4lDMlDmN6]'QQQQ[ YYYY& ޞ_h$OlB#iFԄFԄF'`b"HZ55TO}/%QM4bD#jB#jB#jE:! DmK&&&(((8Mn9<  MDM$-"M&@6^$ IK@ t&f6Q}/% MAa M^I HHH&ߋ$ju5/DMDMDMDm+dQdQdQdqd@kxS“4H! % Ofk`"" ~ Ofgxb6OHx&x&x6^$w%on7OxpsQ “$£}Gi=M>(ͽ} Q £Gie > £4$ߟqsQlDxV[ %c>JݭRp>J}>k}ւYՖY >:}qp,gi~gc{wgۃ>J}tppm(}up sY:d{ iqt,v}V>KY:}/qhvph6͉v*t`8`PZmt Jq Jm0Z0l7 j:`X11I݃ sARTL砢T(AFq|a@JqP 4Bi=AiB)** ART(A9A"IJqP} :0d{ q\a8HRL:}>3:PZlt0 s}lt04wz@+ RL(\q0 8?:0d{$L+J;[`B)&FL(vL7W 8P 6+b-+bm3l:XC8XuJn׽noj80 8,8up(疡S88v&8s 8fqtpу88l{Jqıǹ 80 8<Ŏcsqtp,v̩88j{Kq#hǑc.Å8\v.qulǑca-߸:r?)#tG/9r0W9$1#s}lgte:(@GJq=Б2!IG{sől{#$9ߟ9+^`uQA)W#@GJq\mt䠴$Y blf-'16 Cz=/= Г$Лe<1vF7xS@R@u@ G)@l{ f  УGi킞z(o_sQZmzS%6jlU\ؘs1W56&)c\elUIظK]b9=j< GMC2Uci`s\yު2s156&8c\Շ>ἌU flƆ2VW%6|X]aƆkl8/cuUbÇ>lbW=,bWiņ36|Xcy}*ŮaޣaGJ9'sMZg=U ~=ǣ2z;g?"JƿJ|{*e%fU? f["ÚVU+ၱ&<ȕqՄJx xex\50k~ Yjƒh%<ք2PS5M|nJ|Ĕx]@N4&~yW|pԔx]@O{Mɐ- o/O5p\Vg:8/f.k,p-qY጗k\2q5^x]x85| tYKٸfHfnnBh_ee:U(/d|^x(/d|^x(/d|^QG5^,QƧjMf(%#6G5G^Nz)./m/!sjR),RK5^,RK5^,RƧj'eI^*䥚!)u/6G¯9ވji~Oki~x@/?eTee~x@/?e|&Hd)O%J]79 5G\?I9t]sSKY=6gx*/e.kWqj{67W/_x)uć2^2RW G!kU!_59䣒CM䐯Qɡ&0߉_)[ْC55{dV\6ޚ=xk~"oeUe/oe|z&2A^魒AުK\VjrK%G^V!o59䥒#k MSx|Yru!wǯ[䯸lx6>2^2Te2>U2C.)_%䐟J9䯒CjrO%G^W!59䧒#kjr|;YO9On#55#ofė1#^sĈ794%C#HnrhKxC#]rɱ^j/ScCm?b>g>$#X:Oi>JGCPrɡ(94m#B1Ƨ ?M]{{.Pm\v#{;lΟޖM˒#%mC6ǸuyjroO93%G\9b>礟|躙a3Ucx#PsuQs|r_uQs|9bjn8/˽uso qo%G^qokm˒#qJ-})޿ݬ9нnm\v꧹Vߧ{[r޶9^qн-9to%明'9nn|쿟x4%ɡy(9t|&u_ozR2r|A\6_痰|KYhOe{:_'P$x1^ lJXG<_o?r$V:ᷣ_\_r÷;o+Vεqnk zj?!C{Z7m?{{]ǧiFqZ.?M?n[l0'3u㲤/.]J9//-4Ս^u5i>C-R`*j9Kµl%l_>SK˲H|q)Z|/bN[UJZJ <6ϼUeeLZʩNE~h6 c-!.X^ <'6-9-x7jCqhe6,39.cyu7U>-39.cyu7ctme1a.v˫.91ZH!^-!气p˫3.9ߛf9ݥxWJХqƵSoJX{u>%2/x*rt|㞣}2恋 /&m3wzH!|)AC%\\uةE\J.|"SpxpQAYx)‡ BH9K R™WD] Wii!L|yA6R]0(V ڄ?Mu Y]+s/D>WkL>5 4k< vh'?0]K0 vBqЍWZ;T^JDRɕD7 ^yI,?T^JRF7&^y/R+"j%ZɅG7,^yI|Je^D`*\Au%NT RyW+J%Vݐyç]Y317\]s\s")5EXWDj:ܼ֫k#eMAyօ5$/JCqŕ[W.r:e@y•P5wXxZ)$.UzI@JO$9\p#ԵN:AN+՗B@VrPWwaij(+)tP+-켓r^L*$3+CnܺrUo9T_?J$Yɕ,7]iwIqg]=eYF?޺J6WJKn.R༓ە]*I/e%Wo]]~ە]*I/e%o\~JLJ歋7wizҗJKY[W*=$*WD}$owsq>> Uf=o*x+NgizJR[7_+=cvzJR[7_)pɯP*Ѭg%tW w]|^yTrW wTY/n.R༓O+-JG .R༓z~>{+}+T"oJ޺Vy'eED^*7J%o\~vzf%tJ;齎mW'`D(\uuNz.nW'`D(ܼuqNT R]H$~Q+ѵwNz.k3"o7BqW nZfT^J޺JN~}J4YI2]uwxW'`$\ustJ,n.R༓ON+V"/J.޺JNw5DzfϷ5*G)TOXO~mWg]$]\\tNz~mWg]VR\L7]\p_ەYW*Id%W]|eMoY3krqsFVZ$]\]tsNݟr,+k~uͼν:\sr_Ӳ{?~96*JJ?ꗻs>Ŀ>TϯRI#+ܫ;i[5/7^=|sR=j%G◛s>=ʚ߲f#׼[M;,<8TYcJ9Vy'3SΚ'I5O˼旛s>￝]TYI{f2J;iX55eͫ_tsR=J%R/*=åJ*nνVzIU* J%W|y'VYX*xHOVk;U~[^3ϑV梻~oߔkT5傲E7^}=ʚ߲潬y͹Wgk\:TOZI{◛s>ÈJ*hK%W\{3ەU*ѼJ~:Vy'=g+,+%4:Vy'ޙeB=|}o~sD_'?J॒:GVzIgbO+UJrn&:t&R%x$&+mIgbO+,Y*^ǃ)K%ym':Ds1K*\!nݻuNsҮTyR*ɻ\unwқvʓRIޭzstޜ+,sP*vvstΜ}ta;֧Ռw뜵srZVݯ\msvIgNN+Jݻu;i9u<Tם9y'pȆօ'x|?stWSĶ+J47]'Vy'mW*> 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 156 0 obj << /Length 1826 /Filter /FlateDecode >> stream xYI6W=HRMLhC{G IΌ}J-/8ˁ-[(^4rI?pNLR''ع:oGߍXffR c_=R/6dByj?V Zj ~/"W%yQ_]h淼~b4X9skAS̊7̄@!0awrE2~Ϫ}P3״=]7@c 䶕ʽjD5<F3Oָ3e8۵TS ߘ7~ydNeH0E^E/C:q)%"FN" 9z|:%r2uRET8wd mXE2?px,ҫo*v9" UO1 |/%%Z&C 8}Ȭ8<)::,+kXiHNHӰцG:J[PI6@p/YS;FT޲`ݲdJqw@t n:-}#ޓFc=+p8f=]7=̋@g؏/z-(] O9 S²j*.J?ܕg\enp~LO*Y>(taKkTϹ\!l=l7KRrlq_rZ CA X!yzU]yF86HIDQriK-fY!-mjspxg&QIv|X?AVM1a>w) (:P`RS2Q/:!2*<ՇW 5:w]0t1uĸ~V 2%&y3XzX.@0Z3`q /Y+b9R &jX0UK[FebwcE twM&= 10yWtr69ihϛjliP `[Ю$0~Y &xB/y ' -Ԩ`G`CN QeS-5,,[.*"uԊ{]$=H@|@dGZ6iarM'35-{ZKN4jS7Xc7̺Jytڇz*gChB[k0sUk'`޶= 56GQ-Π DpX M4v)+W_Ouy*.7O0jo_3j@[v)*☗4w5-6T%;ǝղU]a ™6pv 8B>hVG?6? KRkkBx*Lޤ?kZqF_wnanFFk +sR +Lc~W> stream xZr}Ẉ][ rmW.ٕl"!kP@k}N$&A>}g@83LqfT&g3-(bB3+8f ϼL ]I a @ m@k ,L0f (th5ZhzLr 4ImDx *30&2áҡLIGFB5:VjHjk0t5(2$ýdj$(Th`#) x;1n00,`,L ߡw TAU]rC*̇Ѕ`ޙPaGtKnDlXyD]Rů>>?|X.FYYYQP(>fJ͓8O~.  /GBOV؋(1ŤEIضqm&4m#FMr4@ی>ϯQsY/_7مh!CҚ]܊UG TCR{J]Pj#Pc9-c#b]/`ഁQnHKӣfXBO{gG= k#ڍK#-,-Ƚ0#R& eL < WIf0z5Z:s0O&;EU#j1DrmW> W&`Eۺb/5,$@,N.e|?wz)C{l] 0wU@,RW,}׳Z|=W:\4->B3-*oZMkmsˎ/)a"+DtaXu]_b^ G'OK #2A3M46x> U2/~Ϋq~z -<<0a+CHpCniv:H&v}{&Q6.G5w%KzЃBљ]7>`gUV͞I"uHJ)TAd('lO D`v[D<$)ORXDE["U@!8ȾўNȨ}ǒ7ȳG'm5^8 Uz۶y$yuQ }!(mVA.SDڈs,H >zOW(1'L 24c; t`BOwsHW~i\6aXdT.`P=F_N  >T$d3H}?`R ާqG_L1`Ά7[݉h&& &Tèܞwv'a!7J|*fM`K7Ҧ&m^4$:.o" 7MDkNaj4B2%cڛHo͝^q:~W":RQH |e}Y)%jEjwofDGeUoz{=<]<=D~Bd>wyyr+Cy`}Wfu endstream endobj 161 0 obj << /Length 1892 /Filter /FlateDecode >> stream x]o6蓌֬H3]tmt@m](-rڴw_(n d''wt8{;X\I&e*fĩ26wΦ8>f:3 s|`X4<5"`]?:NIx$)2F6?S:q@DxŇJP QUy ) XaV̴e%h٧Ԥǩ@XvI*t^f'< 60vyT&[QS- zFBbu @of.7oA5,(v,P3W$?[GZV(fVïz+<D5~EԒ_;LTZY4IUwT%dC ðP"8B<筅(q(kcb .I/ ?lӁ9dݻiZh/Ry+ȽeFĭK VdּC=4ڃz㦶"x;J<@S /د5:ʕ=nl4f%O!l>{XpC, ',N1|#hY4|! y2r|N xKQy\aKN.h#ZJdd`"Cep]+ц6 B@-Zz0z/l=ҩTj&pvϔsN^`V~A/ 3ȇc%d&L;kZq8d#\%&ʙXY\hb ՙU]a>MG?aU)ޔЂ YN=|O^D32y'!nre+ VetWEP1pDViQR!'PqnG")s<U -Z9xHW#bj1Yr`( TPзOm=`U# :- OT]s>Xk*}Q:%< A `T3%p?39E,/5fqkZ C謇cKNuuuQ`Ad库ZŚ* AM3M`8H߁&FP+4 amsvaPPSG08om~yHUh w\nꕴ+E { '6丠'i |jӱs6qRVjaܘy5s4VEdĕ5UGwD0(Og٥T6H}E}w>ɨ÷o?: Q5noY^LL}ڥ}CxT9*apQ92ZE'0{7Wir`5 e%ys_F5tC%sQ=*0W|\նT嘾' XAz{L<]:߸p2YwRnֽ,9M_FAOBvUNTpT@C_F}??f$RpWw^+ endstream endobj 166 0 obj << /Length 1477 /Filter /FlateDecode >> stream xnF_@&)&6\1ڨ胓Jl ҈ޝM;vۇ{fgWnN\9^ġ+ziO(A Б 'KǾKee}a庝OPuKdnC/ũn^ O=@8VrĹaǎxY}m.חLb'df2񼀄x۷RdH` k`.$Hbe&{Էe`4lf, tIرZ^XA"%Oµ9c f t<_5`Xr^.u27$ca`: Ǧ#rE jqb`ԋV p:J83Z~i7$Ǻj ΚNyU6\¤s}ٓ$ >mrw$]'tu .E;|@M9Rg0}T&KT𚚸_ddͬW&@:gmI;[c-e$KE> Sa &xUSUOf!;k:6O-"dV-߹1f&UKݧg,PO/&*#픕a֪'Öyiq+m)x'ő>9 ;G1)J7CeY-ڝbϐkz7#u@T$ A`mch 9HL )x޺6 ˄~"L(VcV.zLIr!VlHxZ9 C ,Y@moYu|5 |>7+4ꇷ-{}pKv2S Acx>U21|2,c^9ai~BgP&E~iؕZ'jM0Ch4FwP1JHB+ '}GŪhWc~Cdey`[ۣGEI&k.&*ZȨ ݇ 8(ҿj1XD9$@WF-|5\!ݖ.]k2`Hed/& u 2VU\ .Nz[E}$Hd8k{*g ω=JNx5b1*bi,2, gN|?i\ i[JAK {Lj>uloVoʡqDŽ9ZWHw~!RŠM00YKEwu%Z荠Y,vK;~o'#E9eWo OGMAcc,tI,n+-h[#9U<۬LBkk^:> stream xXnF}Wz])A6RN[@ D9$[i@q̐ܕ(EN yr3=tnH~>tHP'nw25A@nA* <\PSњRV? {A \jyWzB95ahrmm`3n.[W3!4d>Fڃ%$ֈ=g4)gƚ^ 3q:%`3k1]QO5G;6{%{\soVFgX .CyyٚZ0*n,$TKm'Hv2QY dr&7,1s`ni#tmv!jF=C56H:5Ggs;y ۹Ǜ_ % _|sWnSf#O$jvɻ^mN6hUnCpΡ{w^5i9]MmWwUȌQS׆UNI:T "otOs']dƆK k{U=ϱ , KwwsW.K4#VY_ &)HOT gWHgXHE)5_`*]%#$&^ѓ ad#5ŠՏUԉscEY%w<(,@s:T( +LOu͹x(KRPļZW% /=i<ދ > stream xڵiojDOBM-ֻݍ HdYJRgwpHQvR`?H7>ֳp,߿\}2g*PϮnf,M2dv >FEFi8s]Z*Nc>u9/Z \.'*T%(d>"J)KߩB' .a~BB.Rf&~8Z],B#dl-71/'T&oc&bsRHa"Ly,<"}TCRJQ&^bV"R4"KFNUaRMVM]G4R8jתe"/Q V|+(7xW ޕkx $I^+[k_~p5utnߓD-rږ^^p5jU$b {p 4p{1lYϸW݊ q'+/-N+YH0߆}M\jv:DehzZ[dz'r DEfoݓT"u=_Z n#WG@󐽄EIUr}\O+ufq4_I|C4^PV1{=yBVV h̓hd*2͗]a繅|ژC+PZ?9 Ub*.Tn1y(BKaRK7ٵz-E #@VJ+I~Dvf Bfd ӭ$ e/h"f^QawIζ<؍ȑqE8Sf$<^tosc+!C=BǪA؝00Z%3DZ#b)#&zp7_zפӲWd1aťgSn7'xpOra'Yz#^J ȉSHʖi fñiOW^6^ )4O[XL##zÛe$%g = O.θSAoi}LI.\zqTs!{${Yu#I"q{)O%z7bÆ~`D>'V^k)1{%~w/zM;q_8GڗӵoŢZ/z)9O{\nۏ%ĝGj5tھA[΍ *?Mg#e^<٪R܍(v|j6@YaIjcbjJZz>P X1aόbr'OePHka'uXG:1mZ8j6Jgq rEkR沶@)\Vm4$L64}.\L ̎fO]nҘ;NScܬ]v#+רu~+@F򚧱KXxOUi7,m=!JGԬcD7\tunb;VSvbP8{!c82%A@{~aSNW]axQ ^t&TtwtߴSRVi)?MK7)0>w+S$^ҙ Q(B\ eCWVqǀKE; p!k[yASGɍk.<0 Jf H%oQOKUq:2|3E EFŪt! I]Rr7W'B8; d倃vҬ*t]™{]=u> stream xYo6=B(V@"Vԭb֡M!0,om۫-]4)[I;idRwJ,8U"]*PlIUY)}J[,4tZȔ c^sxcבaaPF)33PRա1,Wi 4حW;,o nۨpO70R#ca 'YȿȖجט':W ORk)]VW{|.l> /ExtGState << >>/ColorSpace << /sRGB 186 0 R >>>> /Length 5485 /Filter /FlateDecode >> stream xŝMؑE+C(J^1ct0Ǣab)Ž/%лH;,*Kqݸi?x0v4:??~Xnl??_"|:awc؂ylӴ4Ǘw[OFiyO׈2$< )}y<|Y7q kޤ*ywRR2rIXEFjj*T_wBx\%Q;0O}DGFr~.Lr2jpCuF$l,'!";>I1ˈ̛Db=gn$:= ѧdw{rӾ" }Ρ{U.".aB:.^\}L" IZ4rAFd)CHMoԠXܟI\pQL"y[2B_%Ҩ q;Iy ܓ|n ܫ"wQIDqN";lƽjxݹEI:lҸ|>:"Xf"$+,B^,`4J%X{" ,#2yڪ#OR2Q4$K]9% .v?۟_~q./QدiY^_3[?]4ʷ{Թxh}n #~_aMi8w~/w~zoºiX#(CL8%zqr' [aK=u7.aͥr!rsOluIB:o,2'Z/-*up6T(9;%#6Npvّul(WrviI1d}}!lA~8b+1pwQ9YB"Q_w l^ }ΆJ&gpvgG 9Rݳv,lXw}' ;>-]u-Z+s=mɹ7Ά$gҒbld'-uHvjҷcзz Y-I^#ACyo.ApxM^; 8;sR|w,19;YmBK[&~M;aTvPO[V~o#jU❇:y8yJv&7u,?44zW^k0$i,}ȶqwsmbB~8[h%vlFrp$95d)G) fΆ%$DlBr6$}Cc~Y"SJ@ˤ_f@DNWvqITn$G6~YȮ_6vkCJUqEJ#;Ch GΆ4$gC 8;+Ά&g0wV gCIߐoP74+;Y@Pd}g@) H_%6^Yc)meoOFW!sR>T5 Ύ4g`g vm;+KxP5$QCВ-Ii^@) @jߤZ&~:m*:P-Xm]B<oy=ShIH}<YY5Fߊ67V ;,fF}9Fз\dз\iw,!;~pVaAߑo-%Zdw,!;KF//Ch KF:gR}CaV::^ZGT|hlPަDczt>`H#ӓE1$ Oc 8aH !˽94p99H? a= $@DFBY}jaf@Dp7"$D{R mҭp~1}m}ۑ:"b, D$$#nFp ,$"E{N"a]IHuu.W[ l4OF/$>Pܓp"$:eH}.Ccrڋ;$tN"$6 }bBளT: y/Wz N"a2B/ '9OIDqd: ?̙ayr!9XU:8i:|`U]Ba"F p`ag9CKM p'{8bS5{$!060rÜLr7B1%,DF3#jU8Yk$;5`v };5`v[DɛOKBvxQ"h!v!Va earԩȠd}GvlHQrvJ$hlGpvzg6 ZJS}.vJ ~ֈ;BU94"/xlxKra[ɹj4ᬳTm- A1 =Y1`T vN5 .Y8+}:6D eIg@nD K%QQpvaȹߪ5Ά#gRr6$%9QF_7F{Y$}HILׅ(8;URi%~Lo 3F(N4n <4xCq#pN8 +26 Q0TPjȮ_6v5^" YȮ5v:K1yT)Z퓳>e9 j@5%QaVUS9!>ldg< I^%g0p!$jJ5(9a(8;CnlEr.}>(Dw }07,϶Ee߯~諐ƹ:6F }gcm腜^xΐ qGIHumF7q%R>}A AK"Sn;(BN7<#,SoXkҗ!sQl{ᣆl,og҈kC\eA3*PlAr!$N ܱ68*i)ڴuZ&ѷt]_>{gaވQĨR7>ad CrU9a6 p8:fs+pK$ڶ]H_4%4k8 ƹ߃6*D7Q-!Α`PH2LS\ku QBvzQt`Cs_'ۆ@)hGamQ0pv}#hAx̔ uJFao8]7VsL#}Cܑ!!I(YHB퓾#!A;;v F/oHH7T'֚IYdw$$Utw$$v oIP%}07#IHetloF²W!ssՍ/]8;*MFr6'}C~R:uzOZkkݣNg:푯% pO:MoīE#t~04&y$XiNjI@>MO$'+$ I$bNr[\n5XT AZk VɻG!9uvզ`6UGt@q%$B_{`$G<̩2:2 A; Pj1hvP6m(N"9+ŋJО$ oUn F]APUf=~.`eVsT[en3m@:*AnA?ʀ6ʵ p\k蒂Q.&\^2r/ 2VJay2{g #Aer(w{g7ⱘ5訹D YNU1P4aC6iΪ0 ǠHkD5%b t NAWW-*Q)JX#1#ev -2=QqptVu[5!:9#SU5d&ꈠ]݂ab 19209=GGna]C!@u[ J9٩ ̍s`H+}oue[u\5&űƠh-pL"3#悮#GM"t]t Usi0wr!ܐv`*ɼ GF`nFU`nT=[wwveh`nhI0O"OIDp`̝ zuʁI%2:s>&9ަ7=x\/qz( َy}piIL>HĬ:|qĜoc3G6$߂q;/Ɏ"4Qo:R08IHƗA*)33Ġyt0 fɉABbVio&6Uqǎߎy9Ʒ|x od?5E_""tvd8׿UzSº$f.^o_1+Wܼ"~}z}E~TuOo﷯8^켾"~c&׫`\ ?te;]/1"xy)';|<7R9x ö_]ir`e썗ʛ_ 5 endstream endobj 188 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 193 0 obj << /Length 2492 /Filter /FlateDecode >> stream xڝYm_jB-wmڗc<`THwצܥxv3 v^?L5*ff2,L<˳"lveERv=7 Ep{hև#4w=M0Ax8a>_Qy}bͳ"Lp7 RZ-֧aqI\f UU)oůhQ*YVEdPS̎4Kx7E',%MsOu8^81[a"ߣVMmϢ؍{ `Ŏ$^tL&kuj%ژ_l$ʁZh,ѢJgyRzlLXebt4KnVm3 ۞U10pA `G&ݬZ͹xnHx_/5wn"du(ʿ^{/PoYpʼ~QS hN(Gu7QZomh3XǏع8PU`̲ZO@{ 0c'$IՃ l.E7T;WD\v+׹HJox`5Ri޶1:0pDw5{\pUz Q!`0=843}.֤z G qN.[@>!cHF\+𡟯"K-`"G२/cwe#vl ~0/C0+V޹83DD+ ۈ`!v\{u+~vWNt~McDT &#ob~$uaՄjކ^H/^0W]s_N{%G[==MyVea,!x^R?[\ͼӇ"~rtY<>>e"ߛ o:4Av>+◑ U?QK,KxΩ38ӈEl┇0yDXD=T*rϸeQ'! 祢0DZ~~?l-'G FNE )z+G Ua`EhMee YrJa)>a1SURal8ez JSL6܄b 3 pHb00YYM< aAsc@Ɨ6kJjR="hj[bKKFeTb?Z9RIq_wܷ"sZ9+iل,ә{nWJ_Zi SskT@n唞N S-gc:Q53j%rM$&,V!o'4 @rZp RI|/QwA䡬}+A9?Zւ1б?ҍJ? ^d;I:1k'5.,HƩ 3F Bt>)I!k@p%p1NN(EFMY\홖k$,i5mrЭ0u\Ze5NY%5'\I$=ӟ93Ԗߴ!'D TBvmc%:9futb<.";s[ҝXVW1$oߍ}|*`PPQ " 󀥿" k a{/ %gWNڦ8,"i܁&;y_7SVhQ[^ɢ[ga/2=mqCkxdǢ7Mq iN;t*oo3"?Kd(mOJxsUÅZސ >](lkhQ2 ';c~.r #YXh~wCƐ@Dn)S *À:"{ cn4#piVK.]y⾥^\R[ SRjFNBru53Osl'-ѷ iL+"/8Js#Eނg7 㻞r4EpESxp,0l3h4Sii[lc)q.W&3~-|Me ľ0 |wb endstream endobj 197 0 obj << /Length 2098 /Filter /FlateDecode >> stream xڵY[F~ϯĶk30@V6M*Jv>QbvlU{m`8M69߹98]ςً'|y?KpvZIg&N|rl+mBoŏqo \*`(^ I|}P&̼-D:W;SDZwCr/\pˇkW#H$G Z‡"D8:pT ȏ"+߄@-,ס7'/A9*u!}ޢ|3;pC'^89x4ȎlVv^ض \r{~=E7|li )Qn=)\ˮDI $^͗2KJ] ȹ1VȢܳhzš%h"憐,r%, B'aE=/ 4bt *MelM85fe5鄉]T!R^}T#J]q (2r " ]GDob [dnDz|SMdjo*e*MUs.upr+E(ײ\K"?$W ,KX] y%m|h}.l>!exCnV&hͪdfe#U\/y{/ *y^ MZH5VCӯ+oH^O^sR/:s1־ FZ,(-TP8( Į%>'e_`עwZo5QV9Ng.I 'tW6:UK/ &xNy}؅QРiH7 Ǵu6Ā2|>s2?W-S\`E).EFgjA>?SH{qj[2* 耙4[n !3,Uq @"f:Ze#qL{9 Ctu^y|/KlG卫-R LT=>\'q$S,P$:0|_JiƆݖV,2cq(d[B7Ǜby f8B$7؍]ȦɭBMŸ<]iּJ*uI |Xry"%Z{Hp^|'q`cӼ6"Hs  Mڝ{m}+}dۗc6pP]Iʾ0쁃&% +>`h' ]%7zruOwk%8Ě=N#vt*Ɂ;83:JxT6H̗Nk^wI 岄듄1X N1B7OqӟP hir MLeg9Tm:H & i(d^bS% Q} %L 2m40{7x]j&0>$ B+0R9 LOAUJƥO|kkCszN~O{rcOLWKم]Ur~fhdX6cr4iS~5_'Hu&B|6m&Mx‰ǰ֑v-ʏT6T`u VH#Пol_ K I٨Ә[p[x%0\jbK B@{}m[p2ɊxK b#>q0Q=(SJ`;맺?2&pUL̄Ěo/+'%N~ݕbg1m{;Q8p yl8.5)hPS"jB}'mٗ¥eH,ՉfhWIY4aӷo YPMSX݂[#1dS0\bNw=:x t@u|0l7O#ZPЕ4g[q6 c4$0l8?( endstream endobj 203 0 obj << /Length 2955 /Filter /FlateDecode >> stream xڽr]_r偪0ڤ"_Z{-#)I~HE\Vv dx4ţӣX~^=yQYF#eL(MHdt9xb38V=<;xx>ILD܁?W0e?ye6޶ '<6j=yQNQ)\01XU.hF+p.*_!ӝl7-K^8R0aD{ Х* K֥EdO"!:p;v%S65Ͷ"0@kEÕlh+3ݳ:: 䬯JË@ JѐSxsϛkFPoa$ v^e^8̃3IJG_khpe֖·"헁o_~D49 uy o 6 +n(?aF+bD QNv _h}LX;)WXs10JP6ƎJ~NDL)ƯЗ|ܒ!gW3q~JTT$ZpH&&5,wҺ8=_ 0x[!7̳^MJ7`ErR .g 븹ߢ/-=؞o *$T59X,]$3obf=FtlK,f͊#"3)]bO!-$&l@l+ WﺦNnevevHf^|Bzq&Ybt4Ӑ7()ݴϰ 9xL _܈ u&# =`5S8ahQqy0,Bx΂'Hs;eyq/wXSΓFK(2ܒNXgc|ᒞW@ɛk Ag>Zh`o B$O]b! Јp_*9l|[1x9G UFSX .u2[J+WΤ p^抻ڮ.Bp`"`c”#ܓ ;uxG<8?*OAM٠9Q3&JD!R<lnDCe Ф@7>Q|{1\"DA"AM PO+[ǫ'/~Dql\nF+/ *Rr+]X>{>Ic|41n^bE:b&0=N}^H6`c)<Pmn.1r:/./Tއޮ o3KR| t;gd3q{keϴanjfJ!KJZRIk jvunU6.HlTҸjCwg_9cdU[WT\q' +$t/f$ю^mr%C48BKw]~i^CdHnB ! FTIvjzT"OB!/v*ǝ^Wd%jq͎+זiJ_pప9;\Ж^˰1jxP Ӥ("jI t:762pM?VQ^sLI> I%_8겉k7p薢8/ k)]!y vWΑWK=.X8% N iɖ+J=mbYzF}x7ǂ7H{^e[W,/H➕(XCʍ]\K)Ⲥ o+\CPAqfMy*QLVyY]NE63kA@.eH(*Ox4!'&*MMQFVBP”˧u68(P58ɀ,gr"чi(1ߔf :jꕫ*No,[Ru!FJ􀊤!("2&8O"~A8sC`YsR堭(/loH+tϤ_\H>kN|^G]a& qֵX[L f}w||[)$PS/McGɯ'R)h5G)"fR+5HFh6vZA`X/fEBE k$5"ʹkmk~OVihY\Vl(֑Q[K$B л +vsi}Jws) |Eq%yqFUX4PMG?ƣ-GG,9~[.­d6 ˃> 5)t+i#k残# :bck^)@Qt--g!լ9yPrUR6mB,k*KvNy MUwtmI(R)IW<5.LCFwz! ˟pc)%cilyע AH[먣c_`<I?U09lϫG-mB5P #%) endstream endobj 212 0 obj << /Length 252 /Filter /FlateDecode >> stream xuPN0 +|t$y]W<$+hT+]TI[(NJǞ1AW:PN;H/pKm,-<P>sx8|Z%Coq]6wnG|pI/w#YJCU>TRf`aEN ׃*yf=áv,|<KHav38N0MqxjNMںb՟T}maY endstream endobj 238 0 obj << /Length1 1961 /Length2 12827 /Length3 0 /Length 14034 /Filter /FlateDecode >> stream xڍP\].}pww6 0xp [pw Cpս5U3i[^k59HM $`cdac@ځ#Rk]H:\_eRfvJ7;;'GW ?)3w@rAttr[Y.?: =ow= 4s(Z_W4`vuu`e`1waqtgx] ;a=f,Mk?r GKW3gU`\^=,@΀'?Ɗ0 ?+og3 `ہ*2,L3 \_vfgnW "_a^,`!horpuA+?)3Zv/v_` vH^_Wo<֬r[ `J n ??`+dv@U n3`{>y2zm/ G;/*?p0p9l>wU3i+`'2O6ݿAXʎ] nrC6n6sE5NHo5lkӺ8oS?C+hgufc `e"]d U+^G׌ف@.3;ҽpymȿU׹% 7 u_7u-@0J`~pXxAVU`U8'U?7FVhZUV?kF+3 <'fΏ2~GE>?9fW*59\I0G&h|$R|Jcքy#? ,&̼&xR,؉EՕtPВ5RZ&VS|"=Qh$BX0~&::ddE׸DL<-U,myBA+8=*"ecJՔ߳xv18K7, bD+'- 6z)^IZ{^  2햓vX";G {_C-?*l[q<5E2ѝPcT'n8Q OnYf75K ~fYGKɬ&)'qF)6=SAO@?rՊw8h2>ȜS7>$PU5֠l8Ðti>SlCF;[Y*d "Pb%F[o;tCvG-.>QsqdZPqC'Jf=d[#-UrGxX`AQ¹mJX%ҥL_*͈ ROѵyo|q26?}ykc|BU^t\H8}3>QRh Ss Y sռƬhx5mFvR =y=4r%*J}n'\?t4ԝ2} 6H,]VaDD鯅7.d{3"i1STy7ɾC_px ~8(;RNSBEL^IJ2%dÌ[ ㇾgZ6$A} $c٠\=c?p̏~ 7w#KK[Ӊ:u密nNO$XIaGi"Tu2;euEi2R@w2:X-W,}i9u<|' ,_.gu6ݢj"‰"ZF9:O ^m:ݻE๥F0M,&-^(.}&m-"6i0=>fi;K?}4ڟa"yycs񓬷۹ .QRˠLwBՈKիiƄ}> 3Z֟-sPjIa[j.IlgD{X~qD O:hu2~ 2H1ɹq-zJCG h(Ij`H' {iWo۾gLڬj B"HHJb[2BEs{m75Τ7Rܹq6J>?e?_SG:*/>} <$CNds[zRixinwO_V=aiEH c # Vvf!'էq͋Br c[n+@/iWSX ֛>ҕ7rh!Mپ_AP?=x!xnU^DmwtAw<HOji:nnȨJkЩmѣ%RЪv<=m{-![ xd!jf`lP=Ɯud02zʘTf_s ><ƤG0FM7Ojg,IlpY/2q]䌁㜸Il.뻟&Z;?f/Pj~)4av`p:<6&64GolJz呋W.1@Ƥ]!a ހA[K /q#f7gȇ+F"A J=MxFr4?Nl @~ؠLx(-9J "a <&d to#Jf@CRŸG "t#W}fp')-;5kȦ;_姝`4,>վ ݢ:K SV:QHB]%%\Y {(l8s&N:Y}/R䅝݄3}.P?': 68)C3]@43 8QJߩjo~{ne.%nkUjMzTo|Ȳ*y" SG"$ M`ډ +5f%P@%5wɬ΢{=9 69]axAR}V;Ys=ƜLr+ %W̟%T⁘,<6=>|2RNhf%t| nW|Fcqֶ$]t0zq:wDQd-Km8'M^p 2lMfÌ\f"󹯋!"̅8&,2xWi@ vA,afFLjgd uVD#aĤԾA޲;s~RjKrG4+vXN'.Si"aj7\Q} 9[5,pu;^ |k6_ѭ[HS 멝75D:n2a~8'Qe(Jx#IdG}-vR.p 33~b 1Ҕ0Ԇ#g^06BC#`NGE'/tݨ7#_czwtH\x{:RЭvA'F(Cee=b $JwlD%QՈE dy0 FUugZݚڼXU5C*шu oCmjJ-v—T A*#-N ݦI>ajU9E76 TỎ@hhTu2{Rdf'5Y[kGXE@P<˘{zpx^_kC5À3gC!|gaO"9}4J3?'z7Feȓ`TP/C$@iE ߟym6K19)Ĕ&nIq+Bxy׵GVשb-?SB_VPI/\9*3Y> ^ZF7r! d#e5޼ۍx[LaҘ3GbܦdMܪ7j"-4GuȻ|OoBu(͚*/r(p&Ax/ K3 h P%_j^3V L{ az\&Q2k;ԩR :ݠK۵v vA&IkvOl>DU>3x)mGdxfK^@rdnHol[g!V`5cyKq~+l+ja.Tظ~@Ql;s쾎f}Axyp9bL:7/Aӛ[ch0<RE7=/0Sa\E%Tg߇dARC)U'6ȌITUo`,%-~LKtcLfs vJ%E6Ÿˋ{=&YWG@^غ5m:9Y$!#:b**˲/ANAWMAD԰rs^/%$͡\iUVr{ |[夙?!4@?~eD5l$ IFvJ#u 07Tچnf'H$& 9s QK/vqQXN}CI&duMc6O`vU "|깼o.%>฀ygAc]@.*;E1 (P"6؎B&zDrN.4;p/CR' 1ځ4+X w lVJ )Ü;LYdi;$uVhZ0쯈cO?DrRg3yKz\B_^Oa3[*l<:-]u~!E/3X]~Hhcg)4*ؚݛEԚc*ø{K`sm~8Պt2:k5r7Y^1X㷭4kLSjOhôޕt0 /*H~PI GWl}Ny8Uv 7_Z3}ޞE  ώޣĵ@g56La2H}㊢(Zɜ?)GN$z3t? Rx</$Axӿ0gWc,UCIl gx6?Wg~,аxZ# ,2kٚi16zg{aPvbJVE=Mw $| Ḷ? q5c0Ӈ#䮦n*k[w`[q +Fy;#wZk8\^EQԝ#a0QF갰f=*4P=~bfySyo06cF䄨9=^w}?QgN_%%\)gAV^%'Ia3}'պf{"f&[h}TP p[l7vTMS<)M5X`)AEBɰ _mg_b?"! ͎!Ȼ$K'KML&>s1wRɬqNK?7(X!Ȩ' **툦ʱ[4=m G7{m@{v4laY8m>H\w; 0_Ce,4a檲Qc; MA(aaTh <\^*Py )pCo9ڻb4ܮprkdܪ ʔj4tUlwe K\٦icI!>3z~T۩xZIs϶͒U1i335Ǚ/À Gn tj8.s}܎gn4%㆗} @f H'|ݓ o+bk.M؉v]G˄˒_SvԷK zFAW3ӱyǕ#O?)5a~xO>Ygc =zmݡm_blX!Y Ӝr[i ;Ћ}syrSlCx4Vʐ"Od֩?)VrmZ/\:EbPZq/Zߕ%*7sxWND"{$_2EÙ,~4M-@`q_>F/T$UAцyI,ӗeqd6Z*:4fMx5bՅ3Qx3SKEt2WJ}@&9$uՑRVEGHmlj$pXm!B|~ieRL+V>YbLo'm IbCN:bo ƕ Cv:":hյzm0Dˣ.++zj ,#\oa8 WgA8[Nl+YePkgY:!Cu[.zv4'َS; 5*'/;Un=pG#ڥ^*'SVK,UA]R4â<^*trxQ3^>c09 ZeaA!L۝pƭޜ*xryh#(rShDATﭫΌqaz[BXU+HK'mF3:au2JT))'[@E@ ߔyw!iԛO(E1v'?;9C.;%R5^+V5sxE!FX WcQ+ٍըp@橉 &B_<ĤR94@yi6 JK[$&k3VӍ׾E ag_meز$ 2hZ򢩑p>ູU|#h3Ѿ$~o9ZƲ'bK1s#CCxC?[.P<1Iùm X2 _rBJ*%\$G&_iyy=88ZWfNe AiQX?t O1jbN\sЈ #/Kp͛ !E-Zr0sxe=Ᏽ&;Yzs^k5݊o05R3.G!TU _^Lk*DQN,Sg,[F $>f73I1i )KqvsKSaJOun[E!hZn?c3 M+2 rwlC*1֘=LayQLC=Ŋ*@,xp~(8gfA3B2WM{x~ȗ_ɬ`*nK^M=cȂE(wH-,O/ԵV72^ԆyH!óCX8RuJ%~oh“-ЌvȤn~QiKLہ\ oCe  8ow C&R /gzALOt U8/ȱ `0ubL0F8dt~ >7ok^S5:9aW«>Kb}3#p4w|yzd+.ʑm\(2q\Y%ıXwӠ!mp1W.JLVͷVi[Eg3^2jۈHѪVƛZY`HJ܆Ͼ쏍%13rTΤbS"2`1׺dM0orbh~ya&ai3g6sHȠ9GAP%sxOwߎ׽D49bb{v^+]ll[o^]gk/'>gR nSFs6#0`gA&&]RDjÙF[SDB.ؽJ׾.sۄ0(*FgʝJrT(ەC.ӧҋ)HL!.QȫJ|G|!۪8 FA$Ohˇ_ҡj lEHOn>|n!Zg/x*dE;{߀|0S7ieugmzo";u꣭%0, lfزs;5;cB WQ]DuK.vtCTԑDddugr(2' 27HA1R1 ai]Om9i?%Hq6C#,0~.c#1M4ȱ)`` sپƳ7d.Vdmi-eT&0g_gzzhb>$8Ė~)B7f;/lpo2P?ݲΜ4W9dO27>%-P ͇ɤ7kí6o΄x{4(;$1fXґIQH5fL̓,~ݨ ٓ Pb]x4Z#S6zygjO]Rs>qøB<12`}37Qk(q2 $v2O"dhD1JάqPoKaEbwP @ Sb?6Hsmn,%Q-aƳH6N %Oe)$3tFoKE%kQ^M]NP TZ5m[j3$5So:ϣvu߅ޖ|@]~0aid V[֗6o Vf4;rzNpC1I=2D|l{ÏjqMM[v.ԫYeUqTɂXLw8H?ІaAG7t~ܻ`IȻsc.M֝qף]p_l2C= Ӌ\t2G2EoQ %wf^Ia+2"NhMx,r4ZZj0)6_6!*-[M];G@IfJ2S_Q;YBQԊq"H׎ ]/ qCLպB$;eZ[ύEq ?l{adrIhu*&+v D;%U|7tNM:6C̔l!xFa'Uco`>W1^etSK*O{#EeiNwVXY&s~\)%z}B(=6(JS?1v7f1['uD#C7 Wb9$|{;Z6R3fp2=+CcAq!MU)#gK2G:άѝa ycfx}{d}C)z80ӾA~а:=$g2=XLNur);~<3_m }V?Ryi,& \+fd`ɒI(+5ޖ4pw8@9(2}W\"IrUAĬQ I,yf%)KMQr0dt>!_Z;mVo˳7 JpJWak̺b2;0Dh3HJ|Jģz5n뮟Kr<l &~4^,rwi(f%# a.a Po~lJ 'D"˒&2 N9Qo)z5H!DdG$WY*}ne | xJE֣~)}!({*LSa5S&UPkOl <'n Po}-a,K&m̕S `&b n*vvI{_N%\7.U$ hd>ͦh WlC~OOlX:–#S(6pW DmA~r1y"S~R͵ikse(, QxMx%|:y~;U㕋-\ *u+$eecm3q$p^Իzk}=[[85'v$y2EXvHiK)Lp.DLR X}zg&fOFXrXgDف *dpxo4|Ι ><{4ǚWae(dU=@JDQTйPHpO)ccspe1&#N^Bk=AO'?wW@GͫD1# Vd[ endstream endobj 240 0 obj << /Length1 1381 /Length2 1250 /Length3 0 /Length 2130 /Filter /FlateDecode >> 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 242 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 244 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 250 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 252 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 256 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 260 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 262 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 264 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 266 0 obj << /Length1 2492 /Length2 11245 /Length3 0 /Length 12673 /Filter /FlateDecode >> stream xڍTZ6 !9HK 5C ) %(twH(!]x}/Z<; =, urgd T@ 7;ȅNO qw#FANBHA04fu(z88|BB@ C@ N`7tz)+,$K@n ve9B0غ; qpxyyء6̬/-@v[~ P9m q[v0p`Z 5g pxqdi ut9@l0@MV۝rmrpA fs@VBOyngw7v79~uYJ vrwCO ݇wz9!NVֿpqx1e6`w/.->࿔Ű kX5 zTsr 1:L  0f7xYA|:_)i I=+W') ظ<>AA@ >z*8YCs5zsL3࿱TG }p?_.;m7!YL?j#z_ [m{eUVUp@6Bd!`+u_X9@P7; /l,alRakߌ2NP|Ё1q 8؝058$~FzDG$!ʏO>"X>,#xD|O8ZGˮ` E0_r ! G{Gch Þ?*`-E`PTKqR# Oz؆=~tqx#eH][g[0ceuOv8>BNXyaNCH V9tx8laSd q-,&Ϝ=f{`tYw[WG &ew4؉xaMz\peX$_ sYz:{ [/A-گ$ȽضƹxOm<>.YݎU^ho#D؎dm?Mكk[МʆYs 3 =9jc1Š pc> (F^bf۩a2ufz VxZ&>Ϝ}ьn>2%I f kaLnIO)X_[׋Qjǥ~TٮN.AWI[*`StMsYg=Rwգqj}k%r []^d.ĸQ.V }^ I=~ƫo$OorIk YȅݳcAnAOnE jncJ c8{B^J;%ժ{=A8[P*-Eܝ*Xx{¾ե0=yv$ᕖzR-:wn6;@*? hLfrZWʾ_| gr'w0#/a6"NmHA0j@+ )ۺo3 %kv(]Otbk>)`9=p?{#Tzߌqk PF46݂SJ@wqCR jvCQWUQE5! z[9'1m G9s r!F7|.rd7.u2q1sT?. J.FuϫB Wo|!?D2l}2Z\JBPh۟?U ^{Ob@_Y*ibf?tYJ X141d>8b=D6b2,Щ) A3_2i:h&fFhMxˌuC mI4WFRw:5ob% ~jQIXyGм+o)$,qym|X+,W~E|߇'IRˇa ni5>0U /IBv @xmpx(%Ɣ5D,[he0{ 02m.I30Bxc>%E.ZP7D:H^/"xKw6UmRryE%_HM <7_Sr2f~_ y:ykfW>N?3z;X&ʇù˷y1?h数##ѿ>-D&:0x5:eN"2A]Bf)ўLIpF3UJwC_&B#秶XL9 FĊ4ܜl_aDP[Iˌzģ.|r{29+O@M95.sDyDžT'HE)R6DGqE4~Bn-')Iܬޕ2R:kj4ɼu~%8sUw,/LF۫תB~Y_rK7eZ&wiMLOB&^#\ّj#2oj]/B RFXFn6*!|#SF|=+8]\lq @t%R,C!C)UZKZcn`U Z# 1LFղ~ SxBaF^qE>ڄ:_Q$+Oh;$9c'|>hTͽTYJWeaֲ[DzZ5yIp#;)PMvX5e݋7hWpCqP#V]ӃZɖgv?Jr4U.Į\ hʆSr 2=uUv"m3mabK|UV8M=5! T~eb.R| oPs8ҫǷ1zz }۴5ػrǧ,LV$L6Q #/ѱ f UIJn<KҼp^|Gyyj Yv{5D{?_t"|_py}?54C_Eʳ't%gWȶw@./ BaqzG*~PLA4Y8.įלިw-cfWﰐ|5/7i]:MQ U]4R_(UhIH k[_x1ߥ0q/Mq7M^.G}k,}2%qcXLyNfRDždM\8"Y$jqkBUuYܽ6:IihKxۃ#\*m*E B|`0\k+<^;FtdDҖ/1)Bv^4(9CL]5[U6qL rK1.VufN]kitСڰlq5ny'VSU'}yzY[ [?!M~E2INO/E)G&TzSn}B؁b [aDE7?/]=]8zJ pυE;cQkWeY%qQs}AyR&[G˩XI!5_5r3j1-%r϶y^H/%N\FQovPgT.]u>WFy!/*qXIsO 0(SC\9.+}YJj :x^ H/ό Ee 6~{vTZtNTWc,:b x)"]ńUAv;znr~N$'S,>DcTd: =e'Q5a=V.hCiUe5=$YGRȷoEQõ%3jt'DH#gqm' J12L| XfAY,C7}PCy܃L@) 56nO/ K/ wE6_lG|^G<<̈́- ,Lq8zY 0EͨŶaPQeN`Mnj ˢs!_|P#0Ɇ΃QUS/W^D<}.">a}>q׏F3_vo'yȚ'7Mh n#J`X-)è|ROe◮h^'뫯~@l0\戱ގ՚T" >zdع rXFE͢XA]pcQtxwᄃ^ l8S߱!}OXJ 1`6'}ͷЉʡ>GVzNaY~ q(t# zr)l-|2?NDH5Ѯtaf)+:ی낤TL0^Dܘl7=o ?iwy2t@#3{@Pu'6ܪ#`WFPn)BjDanK[Ԕesq2*jB! cZ5L'O[.9nnE)_TTW!Ӷ:Zi{`fBRVKqYW<ݷ&S&+̋m|sY1A-KNsDg7Nj>Hwㆭ45~OkQ㿦F ['=CB͜&Nęzz R31Gկڷ-* _OC| Ѷ*{2fVv3>=prqC-_۾UZ0^ ;Rjl]gc3|9!ߧ2$1*`S9̇] :> owQ?W5"ig{'^bS9,h=t=O7Sϋ,wa.x}y/߳"4BPpeTx׺1VCnʂ؄[ەIt  Gp KS1I,#]U5X.(@IㆁS܌o=p >g-,⊃e}Ll+?ݯ'AdfKǓR<}Cn c7$bpOŊ] R(MϨϛ3rN~j+?XռJ,$HxV[R \]gDκ@h |6)-|V%j{U]56cuOp@p#o"CmYB en玷B9-{<¬{|dpRՓVFwvPꯗ{t5ѹQBSlg"w^fI"\\"~aGt֣$^,?yKϢd! /mܥb^kd^ $15RE%+/$tOErYPDh^؎mJWɑ &J=!.MDFyXKBe[bcd$jz7셠Eun['Hޫ:W2`ǭ̓ۆZiYZ₎29ͳȂe]d*"_ >]a9g nH?+>cG,0r 8錊YoD-\⅀u&{*Я1}2%p]PFVT #}'  FN3R;iaà}͗iRJ`JZvp..6q \\2ݐ.E8>ےW<98y)[3? c;£5˲ ñj茷Jn.K JP٥s󯽌i? !G|A [ CN^`AK`̦o>-N*^>_X7Ƒ=gآi}Pូ1h᳣& kf_spBo!& H>,?Wؿ~+չn3D@*lb;2]H~UQth [  / H:rh9W%kuOaN&l)$RZ|JP6M’4;4uBn4.}71\꺿[U %CFCR"+z9)+ђEp=;-!r5UuKUi,Ť*azs`2ui5 $&W zfHa^vF}JF˵W%y{X(ׄ^j\cn⌆}^__%b\-cmg茧:2nI:o+yxkaQ}9݉ D'D <R 9P,]ȞmqA%/P7YB$tqz8~7%7lBkF3=ö۾3iA%c.NiŤŧ |3).V^/lgTQY⫞d/5p4e䓦]6Vi@Fc94EڏV0md[Dmoo2LKeq3{efxQXLQM~~}FԪI G dG3˛oՌ;I$H>}w)zm6y-*CJmS6 +ϸK#\%01Q2 8 tދVda~vpBwmV찰{Q"d\Muu1yк/H !Yh;RRMg?ӖuenEI#KĹ ؏Fڕ)T+运>}P94+d:/hzRI)+YȂyN>*0I (MhYF/.6rMCS囗z%|?v)SF~(tj ][914z>A|pWyKspp@/ՙ-@Ȑ$L-B7_Ro"?h{=ZEmbtp@XIMC=X*xTeN$r 9|^/ӿ4CҴHp4-*qn= [ 'ʱwLm >!ï[}ں)ߠ9JӋpl*k~%C92 ]_+PJ'?pyDENECWÇ[&D/] La4+Bs/yχF\+˵Ʌ)~%8(Mj{o[0jȪ> _jN(¿]PWP|kwdh[ky6A #M=f~BSfAMd"m}(͞5FsRN".[\ 8XdԟOc-|.ĒQ?iԧl?o1SWŠXuԳW64(CKWb2re}FxbCS "]poLb]$iK oWEE^fB-(dD?Q8s49AyM8YUUsrn!F(T5?Z0JVwv 6/!594%Eb\ >rbôD\I٢s~~RO CTp6x .WߣG?+FVei */~cZ~5I[zUv@P;\bJ6 =Qvi`ӻ"Ջ '{[YkoL'Jhie~b@lpw8|#:bPiΒykg,j0߽̓8f H}& L`K6=%^M9e;3G1.vH$)7g~tNSf_) i,'=I?ux$y_,TQ4s1#v01SFwɥ➛c/iυ\#Q($=n;ܺ|%YS*m0E HI&Ey db| Aiaf!ARmyxR4^*{~eoxj*û ( sK_ڡofiLX; FfOm*sb  X(YrV'X]ZU539Z,/hưա0ByÙ$R^Sʭ^{Rf.H'`[(l&)N9X3#lž⭧۔n1˙q~W5JѴY ԁ{EJ'Wg;/%CidQ!LXY+XX `edTP :r첑 gWzX+>3g!1lTGVi՟IDZY RJ+*舘7q*OAOΠ0&䥝KNq5QzK"zQ:ofPdQOeHѷ7dxVa)jt A([ʾR('ӒX$?3fGu0by-zQN<<& e28K-^)Yh^y2֔29mԭ(b.'UFzUAA.Rby*6t7,\m_-x Oė ?Ya_9;{&Sjȓa:9+ 9ջ> 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 270 0 obj << /Length1 721 /Length2 10244 /Length3 0 /Length 10811 /Filter /FlateDecode >> stream xmxeP-d$nn{9n-kWzWu?= rq4U988lh. 70"c聬Z g' uvڹ t-N`.xxxHx-nv n&`Wȃ  G# A\A  +?  l\NUYmIjYivmi* rqWwZ,k7o ` rXl4vwO/!׿L5dXl,@&i @P' PN`G/", ǿC`W9ZWj ǿ\TA`w׃DG6ِ]I_QFGOZbClZnpo2&U-\^#ǿ,z89@n.'? @еrwqAo/$ dOo(-@d0aY]>3Y휐]j{bPN[nVlHa2Y J[aPQ>AJ ,-se9DOveq?/^CM _1@[,8Svᅧpgfv;z-!=~*?ڪ Qa9*t`x|lمpG;Gjw1f;X"l=JBe\8ߓp+z _Zݟ8ifQ6ۚJ{lhuS5X T4jH65$eБ͐Q}{i0͗?h0i<&xO _" wb*[̀vٟr{1h=x/fgѪob.w0Xdm1[hֱu;ݝV {ׁz5g~AnΒ'S0ӈC 6 V:jEEsdHǢgOY;~˧6d@3Ki-W@'SEYI0 e?"zdb|r?V!۟f5A1Ξ(QЪ .7)ګSZßHaܿz}/CtO/IMAfL;Ptd11ZY^PԇA3n!)&a* xi(.4ZMffo>/P rqh^٨ثqI`!aι6 )} :nztp)& ðvn̹_m,CNo;ET%|%h/i_wlVym1r9E2/s.cNLn$ H-5lgjÅj\RJSd $dR}S1noys9Pzv r_H?Bcr0QҨBs_ ]`Be&2,G-vs/ON! sR/ { L!Uhw٨+Y;2`JOXM.tsR{v}vm]5Ӆe⠄,}"R! 5Z?vR7|ZS{ػ%$Mת M4L|ehu+f}peeWg'Fz94[\tciJ/(sD!g@Cau+d0UXcWv'nR>خ,yeHtiS?aɩ.Hq)KRćXؿ8dig5$݉.#n|RO+fU~:xq=0mv`WRkc/͹6D2үG2]?%e2g^-f]AͫX/oqҔßhӼl/q/$n ̐X{Y^Zdw#ChfbS߼SNejMG/ QI}hR Ix̰Rô#&#QČ赥o$Y.k n<@ِ!̩xg'ks#Uq[=׀%:읷WRڮ8c^~>@~3˞NTInHIfH8xC>fr`I?IްvoNaN&fZLH/AZJ6y/B wƯtۭNJqpF}] MMyF[5N$;OsZY[HsaLm]h7!{3v۲$Ij ,ⲌR/_3t.Q |0٬wA9,?*j+1ujBH;W?+~ 9o_Hlu=qPl`D&,3J"^I~OPQD* c] uI7g`=Bܝ: )r@I;:Zv4["|c&Cbc{MLhE=M:OawgZ j8|%Ǚ\iC 6<93u~h*w}[O.m[ZyʰF]JnE-*뜲ה#1DJVdڌ,.dgkV%F!Wؑ+ta Gg60%uu$T5IVCoo1vU(>}eҷf⾟$"<۝&u=a, W 2%D8XLE޾f.˄ ZRDėQ}SuWV=[<ʼnz*]f&g9 }櫾DiYьݤ(:7<cJOFe'-.p,'ۂ6ʤVEVof:eww@9UnbqB[ӚkZ [h+  .X!bM:4Du6iv _> Z=G49R>Z1/.+%y(vұ舂?/fz(m^YI%+XQ9:]阽L7g|N@b %%,@7^&/L4%O*:WxX}fNɋC ѴyqI~esdd!iRNa8\D}kdD898uMiE-m-%+,fnIct2#rJ5~x[3MpFAZR~N+dA!yG&q w&[?~C9vUJxkDzʍk2i0;gƂ5 ) IK_"{ .DKQ1CyPlz5l^ 5[38v>'||1*:zdȈ5e ~/н '^a.{(!ܵ}W5;k39aVxOݷ(`[ό#B,q&} KQC Wh߳e&g'nۧ-W>'u`2,\82Җ%v7a:^M4ơK=HʚwkUCh?Q^(,wq8/> ٢((EV^=r[s ˩1 춎cU,M!<""TPm`FPU(DAQ&*,ʄ=nQz{/QG"Ęα$/bEҶCG.Jc{[@ԣ/[gVmerCzR=O5S*r-W Ty(H9{"VWv5BX P:mnAw}b nefHqF?idj*]=M%DD4M)Ko٠~|9(|[>vp>j .tջE\JmY{4jZx!͈a:jMY4-҉{x-g3ύDZ\aFCB7{- sR+`M; tB۰{KSVj$T77h.`ʯ#xz${;2=H ƓruP+t!}n!ʣ~Y_W=iģtsFM攡 ݇դa'^.(,8ˮJiOwD6J~M*^^u1m4Z5y&3;QPM?kC6 uS"hcx5PewoF:YՏxQwnd,#uXYĎ^J;LE@ɊrA wA7L?e-k#8y94/&kF(|i}lJ,lBIH﬍abZɌJ0ILR IN8Fy^b}?};*29B^NIAp?6hRO9"( 4u:4jC8ȅ4.DSǞII~[\c_茔vi&`%]ݐ&YAgJ:/VI uaٴT&ݽa pavor17 soq1Սl~;cWRɰȴRȓ$EAZ^0As[OdC;Q-GG/O@)ҋ o 1U:[Bҳ6}ס1_ &\O^Uɨ 5MȻl;b3dDʎ٣; &%ͤu  ] T bB?X=i%}d}?]ם{#4*IPMF@OwIÈ3+=@o4I97@n{66M H'Y>f:7o -ցUoHbU5z3qm#a>PKc*SVQ!*T )XM5<-DDr\b'T{IDU c ֢6X?shHGyXt*TY&,܃TmKA!BU_#g׻}+SW'#}\(w.6}g84זǂ߱[Z⛞Ak]4ȉX!͒\L=l"vً&&jO KE]%_iw +'O4#E"Zb+^PYmz2ɪ;M[ ѦN6HSPn}^Eرv 3uƒ"N"QMJVRiC5w4k|qqkj-g#T8m wr#xImg0$p("!]:hݰpR\1Z'0guZ#*gԼ =.=zZ-9/r&YueJiPp!B 6 L$CnWՔhnL^YvgUW8x^Rl >'e)F'..ePF8 Ӛ2f E!fL䢴ڸAԜsMigFn4 uF}D6˕=|PegM)TBob+2hTJd[Fٯnqe1q笵< U;}rcu0?`~_6p;Y S[>pEYCXڸ~wϾ.m"B>]MA+/iIfSJ7ӊX>#Mm*f&ⅆ2-8&V EIůY\%N ;mНQ] [1A r0gE:!x IUjDce #Z!f!gFj)ݭ8D65 ʖǾH~WŊo~o46O6.YakQ64hc|<@HpWGFGBqo hi07}iU7l_o9o)ifHxvЄ؈y*>AKcF&!hKNz0F?dϺƗyJ?)e5Aarꡎ.+qyb@(/%:K%~N+(fAu|xUSݶOog4 Bä&7,ӭiiaռ/3(`TI>wuCm.U)5Kwrɷ.Gr8AjvN~";|'MTK ̉Hhx6Y 2 s*TiEG4G`)W@kF>WZltY݊{3^7J(kq>.Nb3+*O~H:)2)`%V~%yQNƋ5i͈f-HIyU:|2SNW4pa%8 }=%`uΊD@NBŏ‘njMo\aX"X4ş Ax:e|pijNxMa8^m+OxK.KP}.DSkS>4Nk[E63HbM7}]Prݤ:Gv)b viP7FUټȗ·-$Gڹk({ QWbΕ1&Nci*3ゥ{fw-}vgRdVEՆ6iid'#Z,6.*?w~6د-鸪0w>=~D$~j C~_R?'ceu-/*~*LK-&! L!.,4uoW׶wt,Q'(On;1>CV Nu?Lc|wxf_ثl|u5\ ٠=Ro( ,MWņ랏ÉkfrHG8boA3@>3įew(,X 6.E>M?fD; W*Mw_7`le-ג nXqAm=EnGrǍn?r=H#IHWrJIqG#k* 4N.:ԟ0? (t]"?9? &_ٽhF_?b4}XGFg2KA._kDQ=HrnmuÏ0}'" ƸW ͇~JmIZ'ǤNs3BҋA=pOv;wUoDwlS'`]%GAe%C+|0?t">UNr橣l˲k'ʗv/H$pR6*n=%~y$FvsPmՇ)#v.Yh3Tbx7ՄڸlgB^ O{𤋻$4pA0+dH$^=3=U;2NaoRu\aPclJq&ʹ_a'ӮFAX@^#f,{]@I(JÊڌ҇EBͽ|0s"pg>严$"X@OQ048;{WhSSXo<&-d\޿KH1ЅԔ'DPLN)RSX 7 |,r.Ey64ZKK (d@jsz~ҸP nm;kq845ƈGcvL$ȁ9lەLh,oۉ*u=CdŠkl P0Kn7kGtOi.ޝkKcL->ƌi"[>P|8l1>(4J?2T K57K3zk\g=]X@BХ3cRCSF!g7*}5a skQn\0 endstream endobj 272 0 obj << /Length1 721 /Length2 10037 /Length3 0 /Length 10623 /Filter /FlateDecode >> stream xmxePܲ-`]tpww n{έ[j^צuhz:9Y98J6n::)g`/m t # BrptY@ m;3K vspY\\ٜ]E6i `TT>)䔵r@{@d ڻV' {Kп4# + PєUQHkJ-C\M73odUgGl(K`٣˷OVÖ)WᯇK_`r;B%K=@lfd7ry-UAV[\wQZ\Z:yϕBvUe]Ee.?e{ K5@K3gU@ޞ687W28<lZDF˒tfrsq8yyyG3gO"@  /-a~2E33SZ Ћ=ؠ6&{$7$hӁ"[gnh1TF $4~5Ojp` ekHr*OVISgiYG? SnkrZS .!+dۘaeӢ ҳ(72e 񔴋f*B#o Rk,dʂ4DYij/2ςxH7+UވB]Oa_Uj7Nl"(~łkіǓ 1%~#Oz܏";3p4 G[XhK3 PI`V&L^+Tƕ^?@V*LdҬ(쑰ѳO8"zTN9k ^lRø7Lsߺv?&7Pgn#Y/&Qטȣڟ5vUx O7=K>6Va9`콳Iey[DT5XN͂pK* -L,Ƚ,9)h;ᔀA] 홛 fZBڡ7lJ^x<$69Ѷ;s6̷p̭ϧtAE%ka2΁ˉݝQw!lonmwC[㢻`D$ƟQ~Ho`)ssD'6ӬƕT#Vqg'|2ָ~[NGKfoѩ9fǒt7eW޲[Wy&k1XiϬr> 33a" zZl*rG!Sdz^{har:8o7"TzQ;LNN3K獪HVVwށ+pl[i*$7B"sQQc~Yߋ?*Csތv_ļNHd_4`-Hd\yٳw8\MߊcUEQ'EP-"()XSX>3g}0q 0 `k~pί)f籚kBZ.MTZR+玠If G>{魚X ӕ]iigN릤vV{EܦBjTT=#:].~vg5В5'8l=VTȭt8t}TT5+,̕? *[!ܠE4TAW\qE M3S6Y ?j@W*Y~;D1X=7fڊ%zrrYD~I=ӭ-Q+kc6T}29REQtC0/ඬh{Ӟ:` 4]!N= DqXl ,p1Dh`s4Ϭhˇ ',.-?A.exRTUEw=i0 ԅ!_tܫZQKN L|}{N~}$t!1`Eԩ["nD]{}YJ5WXD;6/5j0a2ˆ6KOg>XoH]Z]K"ՙ"ozwY`?[%-sd6wk[{h ˷ ȻRN3B&T#`u6n}-! w)yc{09 a|91Sz uUځ5u65Y/lRv*8l].P:dpC4:7\B-gXgЊRgtD̬!HZBħ?;Hy,>2|itCNRR ն,>y$GOoYʕɫ犤~(ߌΧhI}pJ6AUEóKʂ؅B?R-h7}"Ȧ5%=.lNAgjޏ*4A6{*IV$MISgxZ@ _懆<21CWFE 8<y$ɡen 3k0{([4 np1ekaÞ_mV%ebrVXඇgG\;|-)nNC} eELO)J |<)Йb4^2SUXв8_.9wGIxvS!:&R 3w-OVёh=)wB\Šx(M:HX Iw'KnmTU4X9~RjG FR{v[%x5z7Nk&bYҧT?gq3!c F'u]@^"j'ϞÀfmQ_FKb8mʅ[L"?kh˄_o:E)i =k17#aw\j㵫\Sl,(w,UcPⴗU54WF|B61VȆnLm>Q,5[~(}- 2if8 fK ǒO9v3 YWXUX+6arzsRA*g& ;IW#wqD|ݝ jaspi ҋ%m5;s\ o,QqA=91ßޔ+7*L2zSR/sG.oU!2ve&RF(9N;K  U@-jE#, WUh@AD.]\Az|S*/g?k|>˞ۭrqqx7G^jBba~ux3ߣ07?,ۉ<&p7MYF-1HLN\Sq ]1җ6ȁ>jepXYϚpp.P_H5;.-iDAJ/׺3fm'۲YY`@nN҈y}p0{aT>l;&*9DA Y@l y::[h+i]+[]Q y[Ǐ)USiq95>$3EyZV]u򄟖+ jO)hEoތǦ}QYfSCH78ZBۣ\ =R(@5ktێ8P#rfά{"q".A[6T򼖰%PH;;Ed5rpD3VNT)S f)3| X\zS;kE,s8* "y=灁S@[3Vv,!1r^mѩCvN M7Y4m!R)1I{ :~Vl2G>/^bS5U#/$rLl8 S֡s*Ở g?e _}8׎yV~^eUY^%xTI;X?B}d8 &ZN6R \0^6t=1gaf] sXvy7;ˉZDba5HN5_&vfxيg{xY.}'[.nי6"7Ɩ&c8JQi bOhS/f+RҊ링J[IƧ- eX{ ).2/}#nXuPGvF @+gzpx&du[>e: 9[fuUm)T5k퓑ʿ2ܳ1sZձÌcpQ:Plf(MK#[yxVN'(aC%.W;=kw:Mk XO-6as&4<+|ן$S)Tԩ X9/`S.[SU%R8=}q:i>v&,1NUlk͚8Ǔ|8ETNп 0#&MyVߟ2)QEs7_yQYla{`MD ֫Q'AUA34 {aҊzQO uʹ#dj乼5UwZZ|θfP22hEJЫk.xeF`8+:aCom-ZCp$B$׌l1Ç$4|Y6z^4I@kc[ c\nc{@pcqBKֶ~H ^(/BHͬBx>tim7RՅMCR1 JG@N'l{4K#& 4plСO%=I'a2=ts <[qH(L. ^CQV^9449n08HB @3*qo q"ܬ/o` A k$̎;pȉɐ]δPόW6z}=.Y7N%kI)>~1Pp!`҂ YE7mirO׆OƾI>j?pvx _|(+j& E<tr4wT  x[hhƿ492bϮBo)[u`+F#3]C"AKPJ-gU)qlL.1BK%E5uAUesC*֧~MQ1ՍGNi3"؈bnYT~xtw1 ^I[۹_&B_ [9V02b{3CyQv}grYҗ`HU ;;h &rAܵwZ6ǐx8 ,%dr 2 5Y!ZtTy]>:۔ty( sZB^X4'/dd@QyHg%a-&sT/ÊYaG- O*z,O댳E]U190M19#5?'&xmjf;UDL?%NE}#CNTkt8U^Z66/herTױu83*ʍoJ3p"E1G|;cT-قG:f,H~EH^&Ue[0k_8Ytd{a) :Zۣ*h?J1"njxۨsPoW5Y4}eaB#u8ŗ0'KQ3 }躗bv!4[0־betr Z&_`1c׌;o!] a z!] ϜN:Mcٞ',aVvԨy8uْ |diْl[SOo јU.Qui%.t؞)v*͎/,:|+G@+W _Qgx8$wDiޤ1> &ϣ)33.q\UEr{ert :X8(O\U ~/BfQ/U ̨QmғA^U Y8Kۺ?)g+,^(\+2?n),ǗO#ϛbu֕dx&9["ĦL{+~Q5U^t{[3D  Sj`Q$T&|EU&ǣddP;8_MyT~N}>%s~߂*]cz~orAބi*s4yYL:lKٱv )悷gم1Yl祉nzi2 өaPkp!{1'$ܾLhXhM=@jш$;c3ڬP$ M%~cL!D$G }ax#W7^l~+q{HS/jPuS9 Ӕ38?S}8.q$96*Oo\^9a ت L I{[hORt*$lGk"n" CbKHdD>xW sE!W=A~I?DYl7K·#7.ء2 u?19LI*0S(5 @XClB]ciHreyж%|\S 5 Y3o>\Y%ID^%p_IV,5ȺOL|J6< uR%MCn׮}V+N Acg^ѱKwEIADϹ9xZJY^ (ɝ@;5Dj9jt׳^v}ljiV4cMo+|]// ur./jB(pe0y6'سL;0iG وzk2{m k(1'-ZYpΓX"#Z%i? ˹{(cOdtQ9xW>%$ebo]ZsJKwwl5B0:)* rȇ+˔ufQBN?:f"U',҈ TEtK| {A7 >E|>eCJ,KBDwTc49SOj_ .l88|p=`]_$E;MH}.aZ "ư`nWDVD5IOtVnG*I sENjB ӐM?碗th\$#jELXCu k FM =7H~O0fF3lT3/4FA!f壖x樀_UܪOِŅR]֋J<Ȓ %j< qQ)7R#n-J79w{K |Qeлdi1`9ORMh¦Р-sDޞM.vXbYΆLzЪ (Fðb%Z*79G;Yїw.7>+vVl34HɅ򚮁v{fH NT#=ϻ袨ZNJCgOy9(|zlK`weLVs@ p{^k3m;L3[Ü-ʐpSԌ_ro}|վ4gWp,e6Njv1u)³i%}sgEisrfJ40U:(N|>!~Bi󇋘eCa X^wD(=6~Ŗ]R2a4؃%t?o}-fh pSX1tiH鏽Wnp؁h+w;KaΕآLWJ_p-mܿsU6㒁;kUd*W;?f덂\jD{e9´irv:~O3ˍe):FU7}jG:,7`hB Kl4Qps^E".2M,IVf:hczR66h9'Q@ͯibEh(8I\qQ`j'&#Uut(z 1!dCLsuy> stream xmveTL-4.ݡi-@Hpw 5hCpyo]ﭷϑ}Vk(:*9(]!ЖRpqI-P;Ph\.NT:4 s0Z3S9Zڀ=#lmt`sc; [# a&`W!@WKG#B܀L[+  ? @Wl]NUYI9u544bPQ;qwZ:k;#GFVuwĆ [ 0_)Blmz#&iTeیoao=+&'#3M̓T-S/[b`cf9gr:W$4;%a.+#1BtOOXGzNxkYN??R%ݎ\'hycBM2|Tv'jxc/n0$}Q\h#_9/M1p gB4adO]qu?$ޝY3m%b\.W}IXU952V?&j\O$T3fkFU_>֮4m 󢳝nzIy<+Pؑү3#%Q@|0@U>ծdzĪbM#D1[h\od6R%nN6uǽ+sʣ+2Sk6A+CQ0cG@@'9\Q]E"puS3/Gj"t{~{)},A?JS Oh#Gˤp|&0D"|$6hRR#6?ɟUt~OHP uE@ڑy&葉LKk{g<򺕫y7,H)C.|"{khmiO2!Z7"2*ݜl ;O.8Zk`mv0L!梶qgO b y"[S\zraiP 5pqF @(A:u/zSh5g>Nr;'J|qjޡc=YU3awP{Kl?>BgEjH߂ % dDug`52z6jxB5 uϚ=k;((;ߋiױHk&`Hon`}=WzgD2m3ds|fی0pk2W}KmYŌ{1aE1'yh6dbPt(zZ@ѨU|0>IC~Ɔ]zČϯy'J'x~hb Y\ґADlHc';r ߹+1 c79~.=%N8Dz! ^ӰӐ6]KtC2 ز.Nkhn"1szX?8ID] r4vBz{ɊqzjZO4'PUQU( EĝSP0)Z*FkRV,S!ثx6̌JgLx(?NQ$ YӞ&'VJht7с$ t2M8 s`DD32Fs[%̟K]BPɇOCC3*N37iw_T'0В(N;:]l hHjHYݟ俇@WE|z~Ķ38mq/2&$FE/Τ][j&T}vO?&RgwJN1Rl';S-E}pwTwEwp{+ϰ Sc$g)%a(قbcOGU~'-i, Cʤ]3/ *2X +  yZv43iO,HWMBvTwz ; H* 7&KM'R{_N\d4y;›7_0XJ#kĎy,%KFEQw*O1"Kj2(M6AG7 0.ljcmu]e9x+y.M$Ua lGϊJ^r'|ϼv)sߝ: <=MlRd~cvΫ2yz% "s5zWL:;fPdY4twTќ b$y(0QB7+I7315$7.b3*:51}ꕚ~8 qt繀YCYEGlO3P-#SQi~`&I'vCKB \^Vh`&T+ȟf#VU Թ};9 $7Cpf.6CMY΍:RYYs馤F>@tEr'ShC+Qc:=gEN_6:xr@lUE|M*d3Y6c{xij_%`^QTaI`m}CVfD*ֻE.١|J){"^h<`SR[ɔe) j=.;*8_zsh<|ŭ#'۠gljC|F]YdX6| +CG P1AѺCf]L̏MSB*4}Չz^ăG~S~ Tт&=R5apN= &>dϳ b{E؋N_E{yG#ߛ :/P~}Xoc%@w騕k, NNgO]cpr h|0F_FBFaMLO 5'X~Dx8g[ٗ5=ԄO.5봿TVv*Tjk@=NR;k%>3)~0izXDzYOa8xLu"Rou|5% 1xHvTj`|܅<,PсO-zIj"$v(?E}"ʮ>Q;˫0o'v]S fNE׾ķx*3Uſc{#T$D)Oj)ft2G%0t?(𫇑-}X+V6xm%&O&z)MBFE=H;D~5-n{lIqNO&"<"4h;٘2_4)Z]P~y41[|@C YtIkjc&*>1F c&COrj7buO=6^dK6cmpf2 LUx iC_%DD=&W"1GHO겨yJ@rF &[#Zm_2ta#u! QvrZxJv1ZM^հGЪVvAl'.ls_E{-C+ TǓYm[RVYWA%yr%Wf|ue,\Ő$>H AQn1Br௕n=c㖏8zL32@;j%#7Mg=Sȿ'h3}$VZdh^r3\^+ylkxk[eڹ *IM/L*_0"juVy .Bee!PUMWg!p6Z4ZMA,}:RUpؿh&`$o9gL?ŧtdTefok5%7#da !kXdsxp佾ܔDrjd֣ОfN`yV %3k-[&wxH ټ˨-?f-/u|ɻX.Sepj).!A8'fG]IPC\MK@u<׎cER1m xƜ[8Iui⒭-CWG2ҩk;aNR/EbA,%]jFmg(Ӕ{5rO(JwC1;egV Epw=6vsc@Ck1V~Z3 fk9l]36+LFh XA )UTbGD/ 5ge,>"s}Rz$]s€W$EGmaqljXjt*i5t [sT{n9vԭkrO\{:&Mpl$.4VM]cxZDbfJe%\O}~ﴫ*V;ұ3&]L}l Fu$WſW?ki ͔vGJgӺbjxEGds2üJcx0x@}\ŏ#@o`k_5J׮ky[Oٽ Z͡|@ä|lU0_|l)^  L}C1~S',AԪ]NT҅M*ҩ%h貍M7 0 @l5 ,#J oqd,PYMQd#B' W2}#g2H=k f=MLSf[R)d0^F 7D/Mda]!I,ݘ FҧP~\\ PL"??ui`(h `hSȐˆT1 4 Ҝ~~o׉ K*gR?ăURg+>OP՗|R;(;HN9+Rxsb4ǴUstm= -^5"#ײp .tx"]A;Q3oqwE@iOa.RBa7*#C؅ciZ~}/Je!xnA[c zGm4iI !"% Y~>?$\7ugIϦb):*1~SnNrn4"Ǧ0zL6CsOb(mpbjau -SlV[h֖եhwH 'Zm]\0)uN?JLƂ9gS.-LgOhGf #=\?RMqg k?5[{}mj xp!ӥx V8r-.ݑ%W~)JҫDfyDg-e_ x<7df)I4dy@pkFER@FG=Db#D2پteD?/D4\ڷRARIB&LGM ;sktPa^ n3~&GK"^[l:?=Y~QjSiϋ'%BdcuB2-N:6QasWA $7$7zv7k{(jxb0<`$~۩<#lևJRc'=M76YaluO/*֬E.b oӉZc,ifúJ4"! +.5^)Ts'[8[$R\Gsެ"[͉>\,BjEC8MfsoabpOmȜYu逽yU endstream endobj 276 0 obj << /Length1 721 /Length2 5420 /Length3 0 /Length 6002 /Filter /FlateDecode >> stream xmUPmצQDR];%Υvaaم$T:A. i ogsssgfeTD!]u@ /(@GyXYPKW8 )o @m:P' Xr('/4n#,mp4@@í.nh7I޻&(j(@NSHEC P"hK@ H(B'k&?P0PWЕQ(,65vjvk:n*]VP[8/T0@oҝ ;};96P аtPNnP4@eE#`%#PqAi{E тY DY7}/P;?nDxȻ16Җq Hk i qm/e {{6-]pO ?_Od_,ӛ\#D|G E1n?zB f&Qb)uKGr[qM1ZMH]v64tizҍZI|]RUd%\d 39֯bR;C>~k+-gEJH\cY-!td.$oJ|y+mw}Vj]^IZё {ҷF_M:m vab% Gt<-Aj-'˩5;kQa/_gU(6ō6\L7LAr K\Llb*a1$^>|:v8$POtKhE~r+gy$KO+]?1>Ey>/萱mtzձ6$ZSzօx<=TDM7eSr 4X~ γG <+P" v(WEv<ZzucY,[@fpwU'nx- ݛpƲ1ItZe4$Z Cd"z1ͥ>O @5ťJ=fFTv>S[Ś yw|bJLC,βɢn<( "F$;pEǀc@kI&u?[CVhVߧ54J9h0a=[ȡ0{M$Pvs|5u)[$Ni]yZILې wiU'g'Z4B{oB qˆY n p*}1x+&<Ly(aaJ>@WX D^BbKM !L0HmdкF0G"k>ŝl oxƥ<] \B>v 7HKgzw>bI%&.HZ/.3.HL`:l.eqakˌ h`E `-o-`z`dRFh1N\^}vc9&i̦Uْ/˹n;p,iU+"7e;Bhaqc5>kmJOt _KhK3E,gƁV;1(60 sDlKd5=U:GͶp<OCGM0{3_*:+W2aw?RI5pN6~šu4JWdNAKEy0G|nRfqolS+/+tў’f!i0^oB; C gާᆲu뢦ez5ndӒA#iqnPY1kAZG ͌,x'pQaR *.B%vq7]@D7#&1/x+z\=[,io֊jywIpAbN뗉pN+FqQ}y4!k 6 SPyi2$Ss'`tHU3C [?~HⒺpVV.}poqƄS5"АȬ+$hfF=rTD:m4y;oӦ|\8Gd0Ha~0NVBn\?}sx'զ?Q̷ U6 u^ b X;(_9%|e4`)FA$12osER6YY L #ĵ|VҸKס {I00LRԹ@֠@-zԩ//ʠ/8ZMW~p8S-j]z՝WRε91jq滾r+J?h1?sW;o~}(>_%ڒ$BybA#|㥯_LS|!x6p/xT\V'{X}82tK9e#Id`%Eg 9e1e 0IzFQm   #_{W $LoVcV^ᇫk &Ga#y{# )%<>c/bTz.5][WHzA (O'=rY>쒴[۔,B!I"ƅR_%uoML^ 0A! @Vj a YoŮm~Êb4-"F"ڴ)n d}wbIdRƆ.Hy=ąg-AsL2Ft= gʘZ XpYŔ(oѬ5l̤ 'pW&w?0:ƧGh3,mI*}b{r^<Bʛ%gc<9p:v YotVC<{8H{۽wD 3v#* R:~W4IP DYLj o1y:r7~b_L 6ERW?+ɹ<9܎HRTR ow\yJ=:et@OLPp',tq XsX;gX˵@B j"rNsh}m2 ϧh_Nb0\F^};{/Y!L,y^yDVqquR70f ,*W\ˏ<"F3y2\uxGl龿] @2Sόn0Rι=y`j}I#6#$(&P/&bN9[KzOO˓R(B7xZ^u2 | DD}n#?*[gLAgr.md˔Rs𾉃{`BL;꾇p*P␰d2h3'uJѭA;_@ vB0~1 fhx0vթw׀z^Bu~M2+UByKW=QW>=bt-~_E]L5씢K$j\UQRZuYIBy 4 b1,,k.R C}%}O:ԷTWe&8dP;W_!->?MЏa,\q^Lb>N[ WH} i17\Ra96#x#CKˇ "e%\Ҵ`m533]o8 nG˰Ѧ%[>Tƭ"_xFPg/o <'5Y HkGI d,}&)R2nYI{:m">t$j? X=c/mϓnxC"jrT&۶uGoYe_4/P -se^)*\@qr40F&w>3ȍXadNUl>ZA&[9.Xu:ϡ>~i܍gpK,aoǺxu u_:M>ʢ899.74}&sCHhǢfY7q>4{&9>[ OR 5n\% m}i<ӀWQu%4LsDc+$sԧlө4QM.8sZ=OsZ8SBq=f^f4L?Xki腒0|xc8(:gH$;lTk9d]S^ʋEkEX">›yN)VQ3aEm)uktqqF#1:v dho^EoyT [(;cA&\`$vifN!,jUa.7 !7n\98g.^8R>1~C>ѓ޽tp>E?ޱDo)v7>ĉaH?~eF"+%r@Y8Ep2 <:M0g:hh'vXz}rxw8f endstream endobj 278 0 obj << /Length1 737 /Length2 13565 /Length3 0 /Length 14109 /Filter /FlateDecode >> stream xmctf.vvwlضmumygSuU՜UWkEA"noda`adPWQeff03QP8\,D\?@S  `eff;x:Y[Mh mL-m-6n&^777A7gWF'W~T@`fi((jIK%@; @ kis6Q&və ع\I '*$ aRٙd% sq7_\+W2_$F8 hni/ޤM]OBC)oWy#[ Z7:Ž#*#[Kߠ!b)BvYhh.NIhjj%OMl<=5T;6ٙ؛ZڙT\͊F&[:\,=:̌=#?/aa{oN'35qurڹ? .ٛ Jm -%V8SI7PntyZrN/p:ob[ꮙ(p41MRLVafM)>\ BD:%}m5Pv=3FڱU%ڰe+~eNF -C GW2cRpe, pMk`QPp̿M(U"@!t5Q͕}tT&M{Z^Pm'f{Ȣ@[5g V;e+.&-j4_h-nfIIgy x%8"4 ~C!Tt5Zq֊\a/'J{cqPo x⣁Wh{ꔘd]PF5,gJ܊ml}y!Cu椆TXzxtя`w#9XB5;d!}`wC:KWo4ɮL&'M/Mȷ?*=+p#l[ qlkMB"??F fٕ>zwgVTRs*wݰ9=Ni/NNmz?$f/ܛ -]*|0KaUIVkQm,.%=(]dDʵbƩ ٲ^+5OB8,(A*W\u1R;KP_@e!4 7b֋x^3Hֆj99K{%cSz5\a*T-ƱTפ=iIPM ai!Mj5Mq)ʌ3#]D",p:y8>~P5e򉥽-9eG~N/")įPl:qs2,Uy1YE碽MHL#gɒj]Ś4ƈ؉߱&zKS|Z#!]>K1"`!36ʃ^zvy{~>wTŠ-+У>U6G0^YaDmeʪq& 'zCcʹ^W$2Щ`W6օhPF0S>$|54E1gY[Q+% G6 /JD;JGġ0{n~ &ձ1ݤ1P#|"NP'rq)}fkqՃ"i *+NV^v&"S|,VۋK#f$!,D_lzARY<-O>蝷̠~.W@sϢqaD\P\7̑qHL~xD1g䲍cSkKz.y᯾-_(vy͖NL<17AaI9Sp5k*2^t.2zO@)&#% SLf1kxxgG1|#odۆt7{l#h(Bq>K6<y} Y_à-;icr]ԯu >lC >=:4iRT#Ϫ˫F#[H#8sJ͸$# j< .חѥd7KjgI @0V[*IBeO|*ؠ@%v؂9쪔hb l<6WP 6/DPb pfa|rwjpXEɷ{9H=t48 EqFu n TxVI3 ;)RP@yŸCMյ^j<~YYf.Pn荄9TϳNN@tV<vTb}KA2oe H.iz/+'z'*Eyu6S]79ikw4_=Qr{62%LI:Yōf%y 3j b Z;8L#݅$pfshv EܬUuף?GOrZ}M*$G=dԪURµىvv/*7HVdۘPsBG?釜}?vZly-:e<5{/$&!f&-t&\eWwM>j׎|aFAU!^(fbUS(~WRFl|^n,&y[7OaS UbS!e;>pz>{0B-iAl}~-@Q3RIn|l?'>>Xe}/eĽo5bX@JdxҚލvm%iUТ"z )[e7UH .̮?g1azʶ?\.f3W>ZY=S6z-ob:pĒbUTP b۝wJ&>Kݑ:Ͼdk+ߓZ{t^7s/2oT-\d_G {k +[߈l|}F zaNM+rIqp &MMN Ő&J FJ?ҏLяk#2.L aNm!ZNГȑ)&s%iH}c;M1rljzZzY] =%hT{WdZˆ'V8=80jS)Xҡ9A3KiN<"IU2.|$U[ A"ߣ}eH_Z&x^&AϠ,)?s^V4B쇨`ON{svoH_1L he}m u ~~N($G^gX9Ks/S 56/?-(miMGDπ!/{3&# y]>AN[8P@@q65;"6D2`9uvE<+>_A~wk9GM]z̹<1b "fqeDWm#92 7W+Z%d B `Xgzg9*Ƀ@|z4R jg?`@F}K>-[c¥a<ANAz#׼*`'i^JY׿&^WBn<ފ1FkrK”"%NƂOfd-<L9;{)gg0jFd'&۝"+ZUN8ju]"Eڷ,@ ~,<ى_8H9K ># W޸3veM_Vn:RH߿!| rI`:_~%;O򜳥:t7coq@onHzNfҘOK24ڎQG(TLs n2v_EO*F_z>dׂ !D G%iBĕ%0) ڐN s#T`1*~6͕j7BmW\A+<92r_Zr"2(coE} ¸!tpUuB5T,rՑ5ُ漽|Yxo1Me4ȗ^к*P-}rR|rn%@\)`fmHsF2t؄LmQe"ӈȵXs}_1m ӳF6MqNJL=ohJï!wu;T@԰J a|4pJVXq|(hf?Xߪԯdg }e!~mVGB:}52&>|mkبX-u XN[Z/7Eu{EiN;/ voZJ?$#ڶf3{|  29v_eN]o7[~B94Nz^5?k٘jYƓ[#3{JXϦ{QH*vkЬp BMk^^aDߢ."?gS#s9 == od"]kw@_]s'GZw/|",hÃS;wo}E0Tߋ-bF5NkD[Ӏ8.O\Zm7K|l~3ǢdAքE0.8+{2IeF[>m)@]x4[C߲AÐ/g(yAG 7^ {؏PVQrڎW@ YpFZEՓM՟b| >-VC,k%;jV)y}1AUEoLP:˸ 65~˺Gme^"$8Tb殓f*m"ry&xkqn$s&s%}+v]sҬi9l]pSqql y穿I$1|}8#y Bv,X((ХKxh=wT;":4-8fQ]r0 %fьJ?w96w`dUR6U *~Ag!SV.d#އ`&tkC"p })qڪ`d6`8k&;x%4̧͋`2kaX74@};>D$GpcʅE\-YVo5QA7two9RRA[`:3 -cp֦ۣiu\%_]pvx Fٗ%! DدBЌcRjˬ8k\wbN5M=aq P?tߣ&v&g73$-{X5ӟX _E b$ 'Ua(cXA @Ѩ{"#Ke>OY7+ܿ |ez<+_׿yaPiY }(cee~1G;^i/4Ǘ%UaB H~G膈ȴ y<!L0D: @"ע7㜤)$S7qh4JOjr1a_ 輸[,+JRW7g\<8I$Tνz/4x P F/#Yd >+?F8!$AX3!|>G?EsPP]߮+vR˿pqr̟Ɂ1u3)(ED;ZyB;aY;.Jϥfpt-tӾ9(uNK+n鄟)S{U ! t8 SmL߲u #\g ydRZ#/,>rz( S|}^FyY^0*LnEv}$%- R-h&{.ơ )SԧOa0'LA5`QTKa+]5|^ ya o( 'S'Fi&~Ao@V8 ]wm!7jF𳸈hc|WudvO #UUiQfeD'`0O|Nk*Yn63%P⃤+!ǕY5I>OoZNb`n@,Ix1h )#K&zId=C <~p(l]4eW͕&UDqa^#``.ZTB.RȑJ(WLL ,7 Qf_4hZ$Q/"թkdVfm_lIS}9( FEr[@PX*J@Ŗ6VU{r5bņ5d.!O!-x:&%wՒ`qrGy #jYt7sɵڳYND#-;А`=ugy]ylfV|0Z|pZ9J;:o2rfsvc0I," vҚS*RĖ!\a!B]8&%cWNBu JkcԹ]=HωYѹ5pU™`5rJ63mġO@Ȩ,7ag u'&LnݶFb |̉n3]j06\-^aQ_В3ڕcRO [>Lܵ V'kۃ7Gs#w6漽0XCwR6U;*N/קMUldDC= Ěu0Ú⩥`^AF?ze|L]D4bA 2CS-#Jb2J?L[gp t{jOLTT!v2LeIOfx>Ԧ#86?k5gނcm¡ҘH_V>ם]K5^ïim5qwSoѭ?:yȼ>՞z3,Ωmj[k : _I}4#i*3/.8~&ftmb$`$? 8gQ2,V{P0GCaw7Bq%2 [&Dzwb=}nU{׷i ǡʆz`>ȓ~eeCֱ#Wu>F7PњRGK6ܯwY>;T '[3_ %!"x*kdaaS7un l%='`nI;`w0*:;efyAy 6 i|}>PQtv`yH:HL_Wguy:opqs>L*q eB&A;VM>"[XSz ܏3(n5ZǸUv#nE)^n=mCGt9s9QQϙ`՜3}"OhK*"wutN5}@B`2 ͸ڳkOq_P lz P憕b!JbA/W1s M/'\-/A.'}iH>sNZBLd>?ծ$C0g$*794hB:ww[g+#w]\5 L_KxźP% & y09CAM+*GuUF]Uk򕝭`hG6CJh$Y&Go/@eg.dD|p)fɸkܝo =ې{bL|,x=R威P8^ !'2Bv2ӬsUΑ-Sgtۙ 35Uւu<FNҭ) $ ^2W;)}>B'OfA~& Hձ tm[}C5kIIm5R[ zA ל]3nǿ-$n6jBvP@sm2`uv_ 5CC)2}Ssޙ \:t {hYf1@CwqupJY(@a_C_,wAPg;-n&{BRo ZAf$s@L>h҆Yk}f|E#9&msq\[OL͏'Qq.XYV2DtuQyxVqwCyp+JL&< I~YNXi-H~FqUwA1cUs#,;пҼcl!'1#Y>Z5O((Vh'5e푯Mk'ۊ2'GHiYf)ˎVWߥtbqL@x;He"nU0%3&ÓaO7N;Xcyk|^?ݪHVؓUnBwj>w13QL Gpk?6Ǵ:}a&@bAE5cbڅ#|m1Z/di>p57)ݫs'Y\#n(= d׫LGW"RnlAB&:^o£1J(5 $v$Lt2l%q 8ϮlVdCGdBY~*J#N&Mę{z+qQ TnsNibfnoÁlF*5]U Rz/O6 q %rK)mNˑ۰ 1KI6e!" o,CO 5v aT٦:8 9L4{7n_D zS=qG~45[Dcn8.Rt\xeI5`adοퟆ;RI]0r~SawN|S®ޛag4ԏ6Ar$xǙ!:y^Oy]]$]jJ ^& OISPI(j>z /5/"f7ÉAdR+f ~hYX+’<6r/>ؐSVin/ n=ʥM+8+E\6;^K=; j+uo޾bpD endstream endobj 280 0 obj << /Length1 725 /Length2 975 /Length3 0 /Length 1535 /Filter /FlateDecode >> stream xmR{4Tk_Hn|Ba̘1IiBB(f|8̜G{+Z-HIW$-%܃hݵ{}HAR,d3LXY,br-,(- !`,`;mxlFFRb5 RP,ǥx<* əܕI5@("P)e<_/`  b)*ިbq D$@c:)9,I p{. DPD$X$EhJ$DLm6 bbڶCyhGV[.dXrqYH``QHJ#EX$ekB"@A09t"7`-Z'eر9wl=o^9A@6e4>&D 8'GVn)QP2pwU |bOjR`Xc|oإOY1K u]nd:lVOuk,$=i}ǭs-[/vc5kjy o7AW5DvT[շln鱠Go}ߵ%{Иwĭ|н9;fzjUOn{K CgǹµNnќ5u1FI9mV]/qrKo8A鵽M~>E~;T9413LGc]ypx;aKWhV[{"<}U%D]ꟍ[=M4ѸE;;)rv>O\˚yb7ܞtj tv]TZ TUgNq@T3FKLUHx zn"uQefJ7L$|*cd4SE&n^]܉6{$OtEuƁiG{vK5'=]H9wzVkoY74y/sR+z@yO;]GVUN=lImsZU+&S џ6eu뭴 W'<|sF+CT,LvjAY] y ݓ[x'Nap E1lqj~1xp>^xq_hsZ@o2cJlh%>m}Ŝdb;ݖ'K"+XpY٪WfoYYXo2PdRpc0zG eLr2\s!`Ú^N]Qo2^XB+|hZb&urIt̢"CgE|ns\}O76ԮfF޶9Wv ͎ endstream endobj 282 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=['sv}o|7lԘ[kxBYwS0`Qٮi"m!-M5\F:i0U4e7;yO!(37Px\lCys0l+htcA620Ae L[7Њn& U RZ,cŶPSan aiqD4',IF\Bbu /y2RXR xHXc®eg:'c|0xq?S΃qI&'g΃y9 C :sǡ;(E8o"AJ'Ođ+6KIט'; ztFzKp&q"pBCT/9!ɩ~B}Rq҉TFIܨύ|nTs|neEAxwIyRm4͓_Oyf;s|KۄwU羷{lC'i=>vGr_$Ԩ endstream endobj 283 0 obj << /Length 683 /Filter /FlateDecode >> stream xmOo0C@@8l[jWHL7$Q!LUzSnffonh/}f}emy9f|vrvx}[(mmMyTnrlnwwVqTrvԧnfx Wŷ?yQJ ySN2k1ꯑJ.g%мFw66XͿS>r}|oݥNrl6rGىǼ?;'4>+JV}}Ⴕ.Mۻ:ɚx\_h`:Pp/ *,}!$B -fu[ǘ6LQe }ĭAk2$mAGs AI:םJ "ʔ43:KaCg" s rJ_i:6dPtk69u̩3ȣ" P݀^R/z0cP_Y̰*z~ʟ''Mq_ uWG5do9JOpH+8QhfgBfg"fg$fg,e@yɟ1S3SS0S+UjfjCfj#fj&.]1SkԦf44U44 Kx׆_|0n:8pw{]Ap^N3^?'y endstream endobj 284 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 285 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRx=7i'Էf[7̖s ~ts[(:0p l:5m_-tB}W{X8 jw]lj'OC=6}Ӿ|< D0,6;96ݕq4L MUWqS~Ӿ |Ҳ\Khv7RKs|*Z -1 b[d08A  i$C#.CZ\wF|TT<\`Gc)y ,<$g v1a粳[ RHדL1>g~8 䔷5 B{ $.  3qdAEBu7js"ܨF)EYQУ.?yRmTy'oOz>OZOyʄS&}/6>zչ{ZkZs}=?Fey endstream endobj 158 0 obj << /Type /ObjStm /N 100 /First 897 /Length 4153 /Filter /FlateDecode >> stream x[SH_ImE}}5U\I *_Ӳ,ȱ1=ڭ;ea\%atC",OD)- D)&?]bO!uS}s&?U<\"LT0piّ X#wĎ \/ 8 1wFB"%L :6TpAX3i>1 fpW8+ `mP>O=x8v/`V h)Ea!` A'yDy:RFv i1# jT # u;T*q o9 ޑ x MHHqI- UQYAR (Lӑ`p̐,SZ!-؜DJ6A ]򍶤%(^,5ةzZpW8Ѝ$dAЙ8c=9:a5,~x/6L/V-N v$>&ɯ& ӬC8}pWvn O; $Na.ndwy`2tEtHh${rad#!bדp+Ț 怟 . ͦ ۴=0Ǘg %D۰ 6 5e9eaKaӛ ]/_;lw8#ZaG] @fbz!tAK-D)FRH>6 vHR {3& _n(O+HMn-AiUM?xFs/sLuogb8&yABI^r^뽋b҇;gɛQx_tot@|wu*RkCP5{Aa'tqNgGy[>)Y ^1*Dt͎$/mf3|vY vb~{AZ(DP $Xt8s& x\Q-gYw:Yu;^h8`7h`J"X-Ř-`oY5x?eC?Nn8ȿnnްc/ַ ) ݐb귛g3Z | X-oàv00Z8$r:XBd<)e^=m R(y|n5Tc`%MIéuV[M3ȖMɬgJ!,`_*׷XRV | #9%0X +S8$pѧv8fy*ϲmijbS:%Tʽ]S{MbH7?Z6眞QVns֢phVdt,/kVN j(|O5ֶm k!rXeyĵK &i`c7*y>.#u:ŢܦQ8 -)Ճ7| ߡP>O46X V[:mf{i p;0 G梆J˩Ʌ֓Xi=j6ZI[Fy6ikA:Dj y(g`lfBQA,<[2B{A@hHp}j <*v1 R,1<@Sȁ.DOWkтX:IVV[{gBiYG:H=pĬE+7!6Y'qDoXRuHן϶'Il=Tle0XH+uΏ.V4be q$@ F (n\)5ؖ4 lM[-%.(PN#S`ǂUbZAQN(KaRD*J9є+ e TRܥܗZ8Éƀ\_r!*Z`>7}&hK5HVAJP5[b*8X:)#h eq|?<}jN2eO*u-7iR[}6\d`ON`WsJ#IvH B*q b6Y,4TUIU.S]iXZ${uze=?j=X۟\"/qNN'Y=s*/~ * nVt.rXr/ _nx Gnj;8ё`>2y-)`5-=Fu^xwpm.xǓ_tww<'îI *X>_co ;egeuYwX匦[v[|p:bwxXž>{`6dAc>*=6bc6. ܏M=dS*b=,C|DwquDw|q";``[~Hf>%h@^6g>-3JAQ9 ~ވϡ7DJ3uһ"U쒧Edx}dq@??hԱD'ըc{/bӪbT)m ~ ~j*goV$k ӄQ-o?0% UJ P?%w"ŽluePMCM6b7K/^5vjb }XRӬ~Pb;hYc:*L-mL|4G b6 ;WG;圷"zpX%vu>k"(?=dVrUm52Iul">|4e~-QΫ s=FtEǘxOv4sf15݌*SCP{_ O7GG{W~KG-8zK|c^EYh#Vţ@W8$;[]YN$SX#Wh3rs(6}G8)U?Z6DQ:=9DƆ?-"[1)j$aS:&o|8:E<+'gYGC7'AThP;F~ _+17/m ;h> stream xmUMo0WxvH UdC۪TBb B8߯{ .@=/ۙڽs{K;K.k6/k+[M'ҷ>dyӔKe'$cS`vfSfK}fƁVGGf\bu<19w|擬CTAW $rG]IyMsh$aW7y̟u? sK-`θtJ!'c83?NaO<Dg!;IX 0z)rЃ@kpBQ]^Z7! / U <ɉ#W m/%]cX! gȀhID8QN~ACT/sQQRs 穅ύ>7: F+}n4eE=zG~<6OɈy2kLd>O&y2ϓQ>OfdV>OF<dR'<>O)yJS*}𗏿tx>z{O->tՍ]*3>cC~ endstream endobj 290 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xuAo0 R{HcIE H9l[5j 8] CfUmóٟۃŏ١.rn|vxb}[6ߺf|歫NNhYgy8å9q7۾q0_f_ дGι/63Dk 6"WT#!YT XF{޺cl_c9K_۾qk8rw麓 G ylIo2"dݾ}hrYWydͼ//V&ZKLxY juwԯx2$OAPyt4sk)$Q "7A?g@c(3jok9E u9/d86dq/@cNiЃ9eyDH{f@/Z`~G. И!`DoSc_ BZ }%m<;4x{[W<Q $R1R R2R:dA3NUAUI5'ZG-^GGGG$zE"ZGmΉ..h$q41q1//fm|T ֵiKN" endstream endobj 292 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=ٝP7{=,yfܢ_ybsn yS6`z¦}TEA] $rwyś~0uoMd?tNC0}*f6` `bێh[W0ƂtmeӶ4ݶ0[*0M\B+vX*+T*Xb-L s[ #*X,caq\``2Iш P]QA2E;XXJKC k88pLB$qƩ/088?rxy!B=X y82VAנp"Zqx8t9MD/W)u8|}ۆ~)30|SRHCOt$"NN_h 1'>4$OOB:]*N:qJ(sB5Qύ}nTsύ(Q<6O͓yk'<ϓ|t'=y '|yҩϓ|t <)>Ozg~x^uEtϭ{ՍȧU" t endstream endobj 293 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H$G?gxLT$|+$=wwY[~SjKז3tzxuSΕYߓyO>Ǿa =*Tenou<19'}0aQ߾n" 0Uu9\F<#G?ٷrɦv!>wf6``bۖ ~mMy%} n,HYV?mKmw,9_eQTZۏR_VRn-`2TBXXQ`  IF\Bbu .y2RXR xHXc®eg:'c|0Nxq)S΃qI&'g΃Ly C :3ǡ;E8o"A 'Ođ+6KIט'; ztFzKp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEAxwIyRm4͓_OyJg;s|Kۄ箳O{pC'nM>'r =?^ endstream endobj 294 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 295 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 296 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 297 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{Vq9;\ظ{32bƱ)`Pk IckgUPSH@"7#?d 9aFm-P!.@'1 c09SGTX3 qxryB4 AAN8pЏ}% Jxxm_p?0䗒䗊/ TB~RtА3~N>|T%9%cQ/G:%uF>%WV6G]$ ' $ML/?mwTkW XֵdpZRF ׃ endstream endobj 298 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{Vq5;\ظ{32bƱ)`Pk IckgUPSH@"7#?d 9aFm-P!.@'1 c09SGTX3 qxryB4 AAN8pЏ}% Jxxm_p?0䗒䗊/ TB~RtА3~N>|T%9%cQ/G:%uF>%WV6G]$ ' $ML/?mwTkW XֵdpZRF# endstream endobj 299 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5e$_FK6Ӈ~GnM|&/;M>u/tFo1C,RAj]IH}=nCbi$wiдK;!F ;oG+5~~VhVj;zk)7b]϶k+x; v/)&t,KK@F(.$ +.^ ] C@F 謨fҤ8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz*m endstream endobj 300 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkR@YwDoYia) SZM5_$$>kxq4|;o4vhwqB؝Bf#j{p7P_?{+4}+VYu}e}n.ˍggfjj{k:lF #QhJq  HQ/e.!Pp #]gQtVTv)#l-g!7'uӾ:[sI r.39uf *gQNxEqV11V啣Yq:54kDCZ+)]Ws8:а/9R\Qrz\8Ç]按Sp/ d8D(B!4׳030 =;fzÞJmw&^0C~/nS0GKW皠NdzG5cC)!=E^K<3Iò8ȿ q3NOg{ACt~Qn~ɸ\ %1.: *4hH`<4̶E hSu endstream endobj 301 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 302 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkR@YwDoYia) SZM5_$$>kxq4|;o4vhwqB؝Bf#j{p7P_?{+4}+VYu}e}n.ˍggfjj{k:lF #QhJq  HQ/e.!Pp #]gQtVTv)#l-g!7'uӾ:[sI r.39uf *gQNxEqV11V啣Yq:54kDCZ+)]Ws8:а/9R\Qrz\8Ç]按Sp/ d8D(B!4׳030 =;fzÞJmw&^0C~/nS0GKW皠NdzG5cC)!=E^K<3Iò8ȿ q3NOg{ACt~Qn~ɸ\ %1.: *4hH`<4̶E hS!| endstream endobj 303 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5NHWGIxj;4RcN}aFHo=Λъw_ڎþ}ZʍXƳmڊ3355KJ 6KR#( K4 8 2a(8(:+Y3B`ȓ:ρi_N9S:QJ3f('KszTMЬCf5{Mˮh쫹fh䜋Aq)~H =.WC.s)\2?"N!H~uYUÞ3|ЏaO%6;^/!w@)#%+sMP'y_YO#ԌYO1ߡꐞ"@/qJ|%}ǙŤaYP}߆8'̧O罠!M\o:?(7d\濆טIQ \4$0^f[Ȣy4l endstream endobj 304 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5MHWGIxj;4RcN}aFHo=Λъw_ڎþ}ZʍXƳmڊ3355KJ 6KR#( K4 8 2a(8(:+Y3B`ȓ:ρi_N9S:QJ3f('KszTMЬCf5{Mˮh쫹fh䜋Aq)~H =.WC.s)\2?"N!H~uYUÞ3|ЏaO%6;^/!w@)#%+sMP'y_YO#ԌYO1ߡꐞ"@/qJ|%}ǙŤaYP}߆8'̧O罠!M\o:?(7d\濆טIQ \4$0^f[Ȣy4~ endstream endobj 320 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20211113164200+01'00') /ModDate (D:20211113164200+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) kpathsea version 6.3.3) >> endobj 289 0 obj << /Type /ObjStm /N 45 /First 371 /Length 1499 /Filter /FlateDecode >> stream xڝmS8S%ӋV%t&p %恇.b&qzo+1 jVD -ӊhFD`(&h#4QH|Ϝ-1F$ HFgѤ"IYR0!m,Fr¤ѢDH4©A $( &&0r 3ePO`Dt("Ba$l) Q@}ݹ@G82&#cTQn^xQFǭ[焴OyjW}4Fhfļ!ig<9;Ge"}γ*8p#e1[ A}6UuM]v-ӧ-pgpU*yP:OLw]Og|6 0Eu&+LEM&؞׹w. 8HDW<@ Ķ:] 4&ߞh:<9#$$BO#h iH6JfMh{~wܽvD,@(6ܞ{we_6ꚋʠ\b=Š߱@q(~ȯ xz=8'!4PGbW*{"·7Gt/@ sGͅooc>=U4 ,& fc @uD`܏nvF71իc.|-pru4Lr<0K2Iv// dnwwa=b,[nB$lE}Naq0<G v.2/좸n9$u1d+xE~9>gqo2˲k =r4hӹ c)`ւc'|wWv 6l*^kZl%K5/WwM'ij:d@*q +lis2l `FPVU UI7Kyeek(h/EF_gO Β8-}R,Y (?{w)FV>&!N$Ote2>&˃Q>-n_=o\V>qHVnҧ4nh93]7yqV7d{Zn$DT,{&i&Em:;5ЈŰH[T|" u2k*q@s߂-^ 355&X\bD@)bQ22P|h/5LSHF^xi6Ô53BȊŎ} 3{^ +ԇjLFhTQՄ:B$} h <1CBDB5FCBA6FC2F3BB94534F88F78B77>] /Length 833 /Filter /FlateDecode >> stream x%IlUe=ܖ{B)UjE:0hRPtqeKcb^MtYctAbBb"6H/y{9Okf_fۏ#FڙrH9Y' 0l+!fOP̞ =MpYZ̶p 뙵2kp<άf7&hc]E}!TgCסza tY^6+l IV P=V= *kb!&+U`kւ3B]nm7t0g5+1ϵgaϭoIq?G`mY?9SpmfǸ4w;R T5Lf0^Vs[h%8gw{^Xt{xu\+nVCv+v#wWhp[9Qv{iVq %5BmrZ:N;vGeRЍshsojjϴ@CMrRmHW5qngUN;E]0~]? 0 #@b xAbкt-ZеP(\а@ G'_vSi}u)pwUg55,=ۿNy6ҌgQYӞPx~yZAto)3.x8tыJX|4j]iZ%/nIi:qo*\◷J Testing packages using CRS objects

Introduction

As has been explained in https://CRAN.R-project.org/package=rgdal/vignettes/CRS_projections_transformations.html, coordinate reference systems are represented differently when PROJ < 6 and PROJ >= 6.

To alert interactive users to the possibility that their workflows might be degraded unless they take the representational changes into account, the sp proj4string() method issues warnings if a "CRS" object does not have an accompanying WKT2 2019 representation (stored in a comment attached to the "CRS" object). This is because proj4string() only returns the PROJ 4 representation, not the accompanying WKT2 2019 representation if any, so may constitute a loss of information. See also https://stat.ethz.ch/pipermail/r-sig-geo/2020-May/028125.html for further discussion.

In general, it is good practice to replace all use in packages of proj4string() with slot(, "proj4string") and its assignment form by the assignment form of slot(); when sp::proj4string() is not called, many of the warnings are suppressed anyway.

On attaching rgdal:

library(rgdal)
## Loading required package: sp
## Please note that rgdal will be retired by the end of 2023,
## plan transition to sf/stars/terra functions using GDAL and PROJ
## at your earliest convenience.
## 
## rgdal: version: 1.5-27, (SVN revision 1148)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.3.2, released 2021/09/01
## Path to GDAL shared files: /usr/share/gdal
## GDAL binary built with GEOS: TRUE 
## Loaded PROJ runtime: Rel. 7.2.1, January 1st, 2021, [PJ_VERSION: 721]
## Path to PROJ shared files: /home/edzer/.local/share/proj:/usr/share/proj
## PROJ CDN enabled: FALSE
## Linking to sp version:1.4-6
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading sp or rgdal.

a package startup message is displayed if PROJ >= 6 and GDAL >= 3, including the important information that:

To mute warnings of possible GDAL/OSR exportToProj4() degradation, use options(“rgdal_show_exportToProj4_warnings”=“none”) before loading rgdal.

In sp 1.4 and rgdal 1.5, the default option value is "all", in sp >= 1.5 and rgdal >= 1.6, the default will be flipped to "none".

Testing

Both CRAN checks and use of checks by end users may trigger spurious errors, if the versions of PROJ and GDAL differ from those on the development platform. Since the WKT2 2019 representation is only generated on systems with PROJ >= 6 (and GDAL >= 3), warnings should not be expected when the same code is run on platforms with older versions of PROJ and GDAL. There are many such platforms, including RHEL and CentOS systems, as well as Ubuntu 18 and others. Think of a large lab with a cluster runnning such a system version, and that those installing software may wish to run R CMD check or just your test suite to confirm that things are as they should be. They will be dismayed to find that tests fail, but will not be able to find out whether this matters for them.

Consequently, it is best either not to check warnings that perform differently when run under different versions of upstream external software (PROJ and GDAL), or to condition on the software versions with different expectations depending on the version.

To mute warnings in all settings, add the option above early in any relevant test file.

Fine-grained control may be obtained using rgdal::rgdal_extSoftVersion():

rgdal::rgdal_extSoftVersion()
##           GDAL GDAL_with_GEOS           PROJ             sp           EPSG 
##        "3.3.2"         "TRUE"        "7.2.1"        "1.4-6"      "v10.008"

and its shorter version, testing only PROJ >= 6 (and GDAL >= 3):

rgdal::new_proj_and_gdal()
## [1] TRUE

Using this test, a warning might be expected if recent PROJ and GDAL are used, and before the warning default is flipped in sp > 1.4 and rgdal > 1.5.

In sf, use sf::sf_extSoftVersion() to determine versions if necessary.

sp/inst/doc/over.Rnw0000644000175000017500000005054413171625774014240 0ustar nileshnilesh% 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/CRS_warnings.Rmd0000644000175000017500000000700314112150047015546 0ustar nileshnilesh--- title: "Testing packages using CRS objects" author: "Roger Bivand" output: html_document: toc: true toc_float: collapsed: false smooth_scroll: false toc_depth: 2 vignette: > %\VignetteIndexEntry{Testing packages using CRS objects} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ## Introduction As has been explained in https://CRAN.R-project.org/package=rgdal/vignettes/CRS_projections_transformations.html, coordinate reference systems are represented differently when PROJ < 6 and PROJ >= 6. To alert interactive users to the possibility that their workflows might be degraded unless they take the representational changes into account, the **sp** `proj4string()` method issues warnings if a `"CRS"` object does not have an accompanying `WKT2 2019` representation (stored in a `comment` attached to the `"CRS"` object). This is because `proj4string()` only returns the PROJ 4 representation, not the accompanying `WKT2 2019` representation if any, so may constitute a loss of information. See also https://stat.ethz.ch/pipermail/r-sig-geo/2020-May/028125.html for further discussion. In general, it is good practice to replace all use in packages of `proj4string()` with `slot(, "proj4string")` and its assignment form by the assignment form of `slot()`; when `sp::proj4string()` is not called, many of the warnings are suppressed anyway. On attaching **rgdal**: ```{r, echo=FALSE} run <- FALSE if (requireNamespace("rgdal", quietly=TRUE)) run <- TRUE ``` ```{r, eval=run} library(rgdal) ``` a package startup message is displayed if PROJ >= 6 and GDAL >= 3, including the important information that: > To mute warnings of possible GDAL/OSR exportToProj4() degradation, use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal. In **sp** 1.4 and **rgdal** 1.5, the default option value is `"all"`, in **sp** >= 1.5 and **rgdal** >= 1.6, the default will be flipped to `"none"`. ## Testing Both CRAN checks and use of checks by end users may trigger spurious errors, if the versions of PROJ and GDAL differ from those on the development platform. Since the `WKT2 2019` representation is only generated on systems with PROJ >= 6 (and GDAL >= 3), warnings should not be expected when the same code is run on platforms with older versions of PROJ and GDAL. There are many such platforms, including RHEL and CentOS systems, as well as Ubuntu 18 and others. Think of a large lab with a cluster runnning such a system version, and that those installing software may wish to run `R CMD check` or just your test suite to confirm that things are as they should be. They will be dismayed to find that tests fail, but will not be able to find out whether this matters for them. Consequently, it is best either not to check warnings that perform differently when run under different versions of upstream external software (PROJ and GDAL), or to condition on the software versions with different expectations depending on the version. To mute warnings in all settings, add the option above early in any relevant test file. Fine-grained control may be obtained using `rgdal::rgdal_extSoftVersion()`: ```{r, eval=run} rgdal::rgdal_extSoftVersion() ``` and its shorter version, testing only PROJ >= 6 (and GDAL >= 3): ```{r, eval=run} rgdal::new_proj_and_gdal() ``` Using this test, a warning might be expected if recent PROJ and GDAL are used, and before the warning default is flipped in **sp** > 1.4 and **rgdal** > 1.5. In **sf**, use `sf::sf_extSoftVersion()` to determine versions if necessary. sp/inst/doc/intro_sp.pdf0000644000175000017500000076000714143756312015120 0ustar nileshnilesh%PDF-1.5 % 110 0 obj << /Length 1623 /Filter /FlateDecode >> stream xYvF +fIDy?E&Icwdشƒ\n0CQ}-$ 3!Ls+\Ik9 2'-Q3x2f4B81^U^b4V`qZvN1 3i+L J~% hXIeHVoѮo\ GuU^r0deּ)G8Ǒt5fR" D&U2IxG! 28fx$hyB,u>wC*RI6{8NRh I姑=l)aO ʹ칗GA Q%B]z$>ac.h1GڒlTh%@c, ȣSU.X ͋$5:#$w|go9pF0~Xi'$1 X]k5B;kY zh"f>MjY],5K 61n_rte0ao :SB\#'{nk@v6 ¸g?6SJ0^dKvӏרF NzM&-=X9GO1=M0xA}I)_Z9(9J:6։B## j*o]t*Vb<.r^R yÑם%;mvEO^lxWǰR :+*E2dג18Ȱ9&#.zk2 EuwW TOLa7!f, | VK$l0hQ]< H? [^nÓ'DrDPHL2'~쮩Uv􋎙8% W={R?j jn޺ef0c{O5/ooAQtJw 0jnTN>\sڗ}Ȱ!X~!Ljͽ L:ǃtv`gp% TvCKgs/wm,:r`t^/Ssͯi*]Pc,}lgWldccmK:9V&=UqT"rJnNOK-u6-NaVCt!/U1);EQ - iWn'|t))u7ռlxoF9jD<&#u ~ĝU͓D18al$Hz+(4n`DY0Nf ㅸrHMHGs]pu0?padG|%G endstream endobj 130 0 obj << /Length 2858 /Filter /FlateDecode >> stream xڥYIsWV TR5{\hTId!@ʯhP<$_oo"pw?po>YT2KakUQ*i>jmiN?L<ZW >$q?`T#T1-6E]ӡSe JGk1u^4֩TgUb—VbRen hUfRPWBueOڥ=7Sa1(rg{q^ܚ{tGڄَBD>Ac6Z|Rǡ6EQEf.: ntR,;{Z&ehUq_o%M.z"*< Q\, ; (0:eU8?زHB(8 ;]X/ F0/.&S }٫TQuH1TwSއ;y`kkgN7 f捷W 3]ԃTY&CjiS>pY$[ϒdsa1%l )SBFog..q+8І &ΓL^g4pf"ͨ3\e 7 .gqLWMMFA ,U9X- jNo #G:IO(_jcBAFE@VuI+lXVߢ)W1 ]\2ů\igvI>:S45B5Kf a0o®Ժ*Dd !nQ z1wI !< T_Z]{'h͟-&Ͽhx =krS?MRAږ(-A\6kC %PcmW6t0>ۍ ͸oNC xw$@ J#vJ!LlsD% e}h5ԉտ {FIU湆z-mZn<Ӈ=$>^}HA*߯n.­@(r[*YRľ}jòg_+V4f8JAcjt@, B\BOz('s$Ok%u :;0%։~q cHo@D΃c͟I-z*Jϫ!'Rp*Cs"xKO ?^F;pnȝ:O\k> stream xZKs6Wprf" >NL;MHDd'2ȑ@>-Y ׫ťʃ\N@EH$HTd u8p?QEf<G: H'03^kp}ځhHJ\vI%-@oH xL0Y ` /, FD&ev!A##JYPZ;C\\\fE(g4%5jX_7fJޮh-Wշk,9bׇt c`ȍyFQU[k>^Z_xTrv<ùJYT>utB/ڕhe%ZͺizWgOQ'G99ɹ{:nHêG>q!yj !*21]< kp pFyz!^RYG($=~IHtnV|Q?[Yk_п,3{=&qt>}I s?۱\oXHj$id~L1%đ|ٷi#\zF&QiGg cdk-׬*R#1Y§y+ǹ11K^'V9xO'ĉ2;I6TGNSuXFGE$r6+a\#i%Y[wPi>h"* hqCpHTU?wxQP Ԉ5.FQ;أr#t f09ˈ&/1O߬IɐƱY)afqierv|nwR.crVkwRť{9]e4m2m/ ZI=ZSEic* ָ3jjw$#cbfji! '5{v 7KP=z c\'ubbzLF4Lo+pȄ8^iEb(b "qΚ6Lsۚ_wVi|/O1{Wnxx{?ڜsni*&it$|LaCWmEJ6qw@Rg`2|C|-n[9wXq;fCҙ:CXIɌ+j:1ƽ=kp:n[yTuCn]XNN0a<ƨ!mVrxC ;-<Cf˪0 &Ar( ! "f7 0.br>fzWGڟF,'E&Z0k /b4TM(rњ)X98c_ލBOHAFۖGlQ8,>JN0n #QRxir*՜qXSd0Z;=qrKʞ[šqq&_7HUOf^!#"2KeM]OAj"+"R!Uh`Y'GOC'jY u@< 6)E\{ K_5\iݴ>(-69$Q亞WW0g_ endstream endobj 146 0 obj << /Length 2384 /Filter /FlateDecode >> stream xZK6ϯ0d#cH 6NEd!Amݞؖײgejg ʝMVl󛌿{&ZXSn9}lrmv6Wt gpyf^M}§wϻ{_M7CE7mq +NΌj6YM?b>y\de 0ݚ4}jJm _01 A6p+w@t5 k)WZ\5$PKT"7|{k@S&W2;5p/wuُO\]H!wNw!CƞXL=T ԩKd LQVBCϳQz=}0tvc'|$7gxV7'(+6T*TE4Ja(B僌aN&zhI6$yD~f~ ],(y/[e}`Z ['l2iFy7gԠ A T)/P𞵎qzaʤ}kE;g 'wTAE&1̹!75Job-#Ns{"^.u_f~ptua)ȓC/X7Ȯthr17! e)71ߟɻݺ[烏3ΝZL@Q›I*+WNLuj% */;A.*-|}x^["V dCA>FUe7cD^[y[U_㭺먲W}/3Qo~\hByA*[J@b(C!Q )f ]#gvܦPl-<ۏ5d`61Uu)!Q Mi ᮏGpPDr]B1,2s6O?J (J!o1³09 y)pO4~zD_9`?R!-sC! 0\!;u;+ endstream endobj 154 0 obj << /Length 972 /Filter /FlateDecode >> stream xVKo@WX /H(h$ I+33;؉ݖ׍ƛoݝfedv"j6yvEh%R(uEytMU\M21{%&Κ(QJMaZA{ b8mb ]- 4I`Fu`8>Rc0v&;T`=9`cic#lq{|L6~SxȎ0\sߔ6n'V1(i=;UE'r|f+Nct_]gQeҒR`h&^@CwEUn|r,^h<>!X+3P@8^gM*9kh%o>bh?YM@WV݄1v7M~?N\8I`?>̓hR'D*8g5_k!ל+5㼓7!#6P´fgv~U}"YP,r Lr@䠺], tM{lWV=!V82YmWD j.BW,0x`Q|ItND}qkA(in)ܜ}_c8.c aKTiC ׼F M*)E(`#;Z]{,.P 0V^*ke:à%#h}Wp? sIH;~l6Y xMKYNre:18POaum#g;i5*Ҧ eoΫ!@{`$fxW5ߒHX`h,*bL}̞}5e !'A gg݄g.:]Vtc~/*~S CS> stream xڅN0<Bf'܌d ƕUd}{讉1d:efS p2*m)P;PE 6yOvn-XnCrOorEd:pYe^\XSʥpPUYOTkyَJÚ?շYU#ha& b&b<*b  #"qxKGӭ{35㎧ʲQAf9v6=CWa:!*i)nj =Aa 7':.{ endstream endobj 151 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/intro_sp-005.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 161 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << >> /ExtGState << >>/ColorSpace << /sRGB 162 0 R >>>> /Length 326 /Filter /FlateDecode >> stream xMNC1 Msh@{ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 813 /Length 2286 /Filter /FlateDecode >> stream xZn8}W0YH'HO3F n:n[I<؆-O~OɊ7%{7@DQ"YN,Z(Q HB;A6VP@a5N lPBGKC$|xA^DE&)$a lBkhPbdRR$(F\D LrdEq0 2ktuoNv:!Tܲ]|ge[>=HC/SZ;ꊓ}ꗅ^(̢- (bETJW*]wX;kQd~>-TٯJ&W+mH@z%$e%''G=/ e2mJe\|+ : "-( -’0{:k/,"6?i#ra&{b|XɦP`Ԙu/&$д:8"Ʉ(U1JN08강"!Bx3G!TLdVP`%A$]C1X~"F+Pdvc`ʘ V)JQӂ70e~7fF:o0O!ٔ߆3BxEP1:-J:sA烘a 鄍]a*)/ݾ󡣑[aȅH'Y($6:`+`@ETStdn, <%>b4765eS\ i}ٸHJ|Mh8UO7*+$zPI}LUņbOq2_E9V ^.3-b=teEϔ3cmq|ٽ~x\@\eNˍb7uw FaeÞCJ\a^A?dv# !`eg?AɎ+շ]j\n;c&1v)ݲ1!ņvtEiCU->V d+++y٧'XކͶYW[$lB gIoF_WS^@[I~5&KP؁wv^ҪϿ,ήkJNsCH"ӴʼfӐv>}`S9aja ffN./7g"~&EF#SÍ}Cݠ7yqT*՟)Rcd>оd_'G endstream endobj 163 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 167 0 obj << /Length 893 /Filter /FlateDecode >> stream xWKo0 W=9جav ثv5'Nk\4)׏X"N;vdIGG8=ߏN RGy$,YΤʢq]7#/aFinWGWQ"9+@G"+3yQIsxeUV KX|(.8`PP&"GeoQ&E#55<n0ھOΞ h^]!N)DM6м. L,(ͲT3)\PZlCG[.UVR6_Ԁ$@쨡4| f=.43(1Gi{J6ODc(pd+Ruc`{^=C0niͮtE{sr\ڃ8/Sbj2|P)Apm7GlȥnO5jji6-ܖzKL1uFOR_K u#u^g"@=U,=7>=nw.T/sC#AT$ we7x9K~Q0U+hJ̟?9t9=,/p"KOߏv6gC``e|k@2i8Bp|2iz$B =gjsC$Jh!E+#A;wU2Vt'†m OʦrsH7;[y3֧r ]aS:̛~t~W=!x\yכyX4En'YϺ$IwG-CP .Cу%\(P^s羏$ɤLAs-ZI{vҮedk]#YP+Paޑ4>  endstream endobj 172 0 obj << /Length 858 /Filter /FlateDecode >> stream xڵWMO0+"۱ RZ ڪ{DUvP88;e(3of&[E]|ܪvۊc\Jft[he/R*^73^2kU*%?xSGO5GQ>|$GS>mc\P>]E6ާ_S5Nn67>kή 7֮-ׯ;9vkYjmϖﯻ֮ک3x}.n%dWf}0'P \B.vŕ*ZߧV8APjdb [S@   ,DZrK::K;Xjh,C=I"j7D`54/k#1ө47T3,dXfg;E0d֊m#Z"&+oKPkP5kgO'{ Alǻ;.%ʗ'khݴ߹$;-]DfRIOWPjW~*wK*;O|H^RaO!&(|4 z6yCc&HT#Ӡ0ȍ OrəP @nOݻiH=5#oPHc n,ЏCD x*r׸ 䪦8ߡeN]LB  7gDGژ:<ý JHs%lU_{.l@?tAw4xG) $ A  eڥ;a;&*FVC|\ endstream endobj 176 0 obj << /Length 1319 /Filter /FlateDecode >> stream xڵXK6ҋ ĬH"R4)ZP9(-gzRfh O^Re"U-V 3j/t-{Ib:-6@{Tճ#qfyp$XS,b%0 8 (zIBNyW⋸pi}=j2V5P]UaGUԪFOw())BjGq QsL,85۰8%&t ܖv5<9sTO}fFޚh9e`P@SHa2l]nH{' 5VFuR$h˃pAL iBU VD|Kt$9] Rɦ$#ΉE J#\!WА%;N7륯{1<$oixtftLiIέiU=o̸19ygc|\#yJm"ΩP{+b53X6hw0ݢh=!Bi}w4JI2\O^F)vd}'ٷƷHr}BlBjd =sp| FÒEOT38@iofs&i~TpKieӕOl1˹:T$bVDB){ h3A|vP5˜;ŚY!vؖSTFNUj\q&0jV" Oo뇎h)JktZDMd#GجJ}&'jh ?JbYkWHD5O.lOp}ĕ<^A4/(m-b$R$%x4ΦZYͪ_o~2xj(e #n+c(f\"n _WSش{g5VsHxNS!cCED[=B% 1W3S[("I`1FM֚_EfKa|워?ya~z(6K{K*S2ICꉠLI[L'2MkmWDr>0&热-pM.ĝ۰a@mbOxfCs1Gv}0e7sRY{J_TY3*0< I.x dg $#G, dG/Jwe͈Z:T⡙{ņ\6!v6u7qGY | F7,l0fZ:iv$ endstream endobj 180 0 obj << /Length 1182 /Filter /FlateDecode >> stream xXKo6W9n5C%;&Vj+f#iCoȦ.~nuB,,j`BVpjq}Yd %<- :ߨ ^;;Q?#{H'?6$)#w_ZIdž@*a=ϯds 'B>aڧ~vQ,p(S.tBOm盄mBk 2T" Beeu&:k]WPK+UxtW5^܄U'JV ?ULA aڎNT/HGTܟl}n#O)Jz0QoVr{>dS}jW=..o;ؐFhƕ^g-n҆/Z&Z K{\'o=F+oKZ랎`n]:qݧiNro=G.=ɐh?hӶ5)d#:nuR66 endstream endobj 187 0 obj << /Length 1731 /Filter /FlateDecode >> stream xnF|kʙ"H6mH !A E;EA_7YHd÷dPUMq(sQNABl0] ߍP0gJl~Vm귙~[oч gB)9+)JYtPV(Dͺgר-Pz>c \b.%jx:!C}y``=zdFP8lЇ gB9*X X-knYqq WX mA>7?3֪Y5kx*fpT"&wʣ$- 8M vS=*1b#r?XXMe͛#_~#[~O#e|n-Z&gH}D<$7^>rYHйR%L:AKU/ Ah$_|w ^1ǃGbE:g"ol1ꊘsL4Z.A#8MpllQp o3h*5 y3 8tXUYdӮ0FݘMEhxTtNjo750g<Tˣ)SsIM4::"Cք܌˗y^6fp Re(@eL<zaJV*9ʾ6ܠzTLtiZ$D;Pa7'{;G0i캽+ejJ>絶CC|FZAH͖!"qn$v su*HA8S݁/.kt! ;J#>qhjAqL̮ a: 𿑺-;h<ګ | 3>G 7'C}"M;{WHz@Mk{g}YBb%c i$;[3P&+APfFY>ՕcE!4ۦ6B-)\C&!4X|6s?Ñ*[AF Bnmf~e{җ\+>HD6(RDb{Te\Sl,x`Lȴ8琓rsڐ*xnra"ɛ]TgOϑS;Nk$Ɯ$צw biII 'c)l%pI@YB0S &˙V`N6aҶYMm@钁{,!k^<0|k +Jvoi&fѦtnمW]K%ZѬZEFi `0X,rv]Æ^PbÏxnL4_Wh0Vc0v7^X65q> stream xڅRMO0 WJk'MrDcN z&PGƶ tix~#` 3qF#TU V-,6Gƍ2 kphl$L\vO_r ^6x5Լ6@T[S,-hyG6͑˼P2yF%SKn[xZ\kEDCާH{aO0T:8pW(JCݔ:>0GWM W endstream endobj 184 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/intro_sp-014.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 194 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 195 0 R/F3 196 0 R>> /ExtGState << >>/ColorSpace << /sRGB 197 0 R >>>> /Length 2193 /Filter /FlateDecode >> stream xYIdx14I:m}* 9`_/6=jt2cbLOG:>??o1_n}xLN1*1~<܏~w<|ᩳ#- S?|odC1#+2$H>C;9D|zU‰J!SM%|{cbR۪m*=|mD|#U#CT1p#rEp3c )BzHqFUQ5Qcѭ*ӤXm*Ҏaj:Z >PRǩd2fO=aR۪mM[աVJ6G-nͅϒ,G`S'/=aڜ`_288'Ī# h2JTG#-VK-~|LI?s>ݒT5z_4N3o(r $I8Fp1*V3B1j8qXݪj>Mj nՇlZd Z0dqFUQ5Fa2vpJXZxb-F <3d`#Eː3Z3BZ\_.jV ٧I-BeΡ1Fg;@-g(a4 ާs94FjPqHwO-K)YI=knrZNѥmy ظٞ-rK[ܜaZr}a Z<&!t]5XNX0"MxɱhS6<~M,mijo}eQB ̰iq:͡qnj͏"o-U[9(cҘW۱_qИ?5SYtuҼt hq',Xڥm*\6Mmmb9o:[$sQ@ugxPx#i:U.md&6mv*ŭ۰ZpKb|֣s[;Su^Dԣ϶mChL,jo 62[W.> n(ܝꔌ(\e:.my+v,mgY=}R7kR=?9~/W}T]goJP5id]7l_lqǝشNNVlle=:\t1tKRk./t)qX`mt]6llGòTk9˙.Pk./tֱ\m+afI/iVhef )2C6y߰}Ocj;K[}M endstream endobj 199 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 202 0 obj << /Length 854 /Filter /FlateDecode >> stream xWMo0 W*:`+b;l[C8i8bwKG-jݥ;>")Ez OzW''r':sOHKT036R-/d ҌX~9-v 2QPkV7 6W F7/UcPlЈWÂwt"C/eˆJoyrC( Kkؽ:6p}9Ip5OV=g74 .w>"wccA~؝4{p1mEmφwJ+)H NjҾ,玨KRl9G?k",D.WjdL3Rgb( ȕӐqbO/Unwz$(^e0Vq;Mʢ-Ʀ6i:Yv{QI?#FM@a퉈 L!l~JNhcsm;oK:K!t=TwSYorSO?3*CL<|? wGV~_-vvg>q4Yrr{;p> stream xXKo6W֊DI @E])AG[Fdo;ҔB{ (3ÏPh>FgO^rTh: )L#fa,Ѵ]ߎ'i,Xj~C] 34H$ږI&W/h,bb^t1 'BEڇ,fc ;T,77ZXq>gY1j@ϩ~׎{D&KYY.DdGcO.Cԃ%(b'g姣b7eF ;'n(#a]nìgP)+ؾ]mtlYgŊnڑڰ-u<=+c08$toEM'(HugC_ܹ5lrMgxhPQmS{ lr`"L`έ׮[bpjS'g="XqQ{xuX4_;%SϘ9B V_ =Dw쉗;HmD3l[;K0> stream xXYoF~ϯDњKrmq")zOiE Rcw!vbFcfcgN&${g煙M>-&ZbgNMfXG00.`T0xma\8xei:ZH~Ggt^X pY,әs3z)TW2zӓk%2` bڿD*L&1lZtÒ߇ΜW*o(.{)U&fkB`m͒{&3SQ/n`b"zH 'm8M~t˺Bsm4S9 z8Ғ50R$I7-Fs^@nW p=.Dk&53Ҙw#aP xdƹhAּRS0/yfކ#wzɽw+Vm_F&5{IdPh:n@GN+v;'t8'?$\@RE:XYQ`SNflމfgxg%ȆUCBJ!X]a "Dr,ғ{| Osjs `z( 2%>r o>,i '%Y+d)qJyb{N YFq1n/Pک<)CzRlU6LW2^KTCט^ @_#l.-쵐rA֩Zʤ+a| k(DNZk׵vJܷ@D ccna>=3b0#w쏠Gў 0~lOL¾?31?x__""Hdea6fP72slSeN6Rl6 V^倏\U%gYKDn0`;!kj %eW`bT i/rl*p)9}pkQF(vI~$ Z{#6*i:# -חnJ _:hB]D+֎:b"= G30Pƶ%Jں޿Hv%1#e9We"4zʶ$BkBGJU PeW endstream endobj 215 0 obj << /Length 2117 /Filter /FlateDecode >> stream xڽYYo6~ϯXIHh("[yW{tC|4FH39z^H ]jU]fZUլKel>\$3-l6i˳w_T&"R-p= :x׀Un4Oa 7Y3J;>rZÙ)N(W+Vyxt->sBUIYlܱ /3S㉗ \kUb<æ-6˓ENTJpSlہi-PS*je3V$_5sW;Vyn܎G(z9>Jrvq"ov"\\:q߲ITUCvE7u0-;} ڳ: 'K&n89ݰY ][zg{T$ZRpȦS*ʵoI4VqH[Dy\E2:-Waq d*-p0,%X|rNcI0e[ў^M;9LR wY]`XøAw W50\t;m!FxJ ͕c΄\W*gBO 20;:`I dLJ+֞?G 4] <!;}ŧTMh4WVcıJYDGO?.-ω W',#mTJ̆Y|g*eWI_HQt.*R 4[H>=ZO:Ĕ$u,F|<)}3<}#5c qQ[&!6ҟȖs u*ki8@1F]-MCםTAQH+e=a{'#yp'lsn1[b>P8h WFGj(1 >d "y F50q|P{_|oTg$C!UE\˂[hfxX s6;8 JE{/0V<^r&jdRVceH/G (>qJ'UI >⓪˥s~mx9rU"S';+h `ΰڹ r4TK^3 L%)eZ%ϼ刅oߌAH-;[>-yXR!@NZI_`b۰qWQra3$u4Sݸ.3Θ}YVt+em]9#aK_~\VنxYoJU߼wΘ;ފ{8ݝ9xӷT`Jw?QKQַbD;rr<zd@|5O*D? :̯S>'2¸x,݄"C]1?|/v"jꯦz~,so2X-_Y aLtO>5%kqUQ38mT9tVBq%^O1w%*B~"UXg!YBg'oȿLdMxj36EK H LIAqm0m 6C/ (VeBL^T endstream endobj 219 0 obj << /Length 1093 /Filter /FlateDecode >> stream xɎ6>_!$+"%hY"{4"/=X$3_t)+ ż>,S*Z6 I& f4ه,R8#0#u@1>.rEF=neuϫG-:`{P2?<&I̙3tkP_d̓9V=n[޳$b-JZ^$&(T l}cČh1W&:9 G>6 -ӴZ&SDMIeI}y u/##L#S^ ÒU[?8- GMx4ij/X&Qcj` >ZZҔ_Q(s1ND:cQJ3oz 1cy˦מBj4A&@}h>EMH?O6fM7f!\:Y0;NrsIGNIQ?$ぐd@OOl=a'BwG&B'A{S8K9×H%F%ET3b +0nri]2_V\p@R"ނ=wU4#.f* Wtׁ̄XM /=э?õc&>wn'.mE@m& җu;lR6dkδk 5bPQr]Ry VDpi64AܗFqC,|{ŊtzE?Qe@gH6 +-h-SU;eMj/{57SM\:%Y^QY^.| CEV}@F]UN(P1$tQ LV>_)h^> stream xڵVn0 }WyrXRa0$o]rZ$uCn8lytHKE}?LQs$da.u|OHȪ\l'mVVo,JaWAy>ߣ @b߿~^egLρTZ 4!$Xe*\D+^t(4y4v:s0X 8@f:QCM!TQLD 8elp/@0JB S^aGe k @rfϓ> /ExtGState << >>/ColorSpace << /sRGB 227 0 R >>>> /Length 174 /Filter /FlateDecode >> stream xMjA {=0=0׭乏zp[aƊtZ[{yr.6 endstream endobj 228 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 231 0 obj << /Length 1905 /Filter /FlateDecode >> stream xڵrGPIBα)RHB<ٕM쥕1$~wg`˃@Oz7Dd ?=a~8-'Sk-<ǹisXOpW_1PQ/g9~8 RF&BT'&:_e *JL YE -]",$ g"o^<,~_ڨ$'Er5W3漼qQe*H%oljZ2f 1qⵚR600R0 3b/YdFG]d} ̊Zxlsm# yYSS-xbD3=̌p#xtOAM=_:ȳfC!y=-JbXG|3qKMs@%K0+oeY;i+ώZH Ԭۅ kHH'2R uh~tJ(fwׅD[er}D ]bV3Fa3&R~(x"(hG:Pi1mŵ%#Qk cBJ!FoeK8$OC4褝M%#!V"u(OZösX kjeŪ>\ 1ky?!5SxҵwU: 'mط215g03}iђb C!~*nqf{(Pb 0+sp;Fls@NaҸ8+HdJTciS&\\uY'ΊG\AOSfGDwt#J΅55YEjSP@JNՅ .L%rIKuݱQNy+*T.B!SkwkMҳAw bW5Mɪ$:VG~][W3_Z35c6>C ;822ʴuZ8, 3šMۥ:AقF #wu2IU-NȨQEr*u$Ր帕[r.+]V4hel|xNjt>0Pb$U|IC@8JM:h}3l[H;iS<>l©Pı5`hlۆf֭fl &D *DLgqR輑V[<"e:T޺\hahѧ^0K/;`ߢZͼZJ{LPjq[C:bK8iYhN4Q6SIn3|QwsxwyMVi"sZ5*6MM2;1嫫pywKF\;p6i(yf*>$}7 ޏd}ۅ-a)R9%m4(_;FoU{d{_w$<>ZaOwwjDss)~Vz(d3p.v0?E endstream endobj 238 0 obj << /Length 911 /Filter /FlateDecode >> stream xڵWKo0 W%jE[t!Н:,mvH,Nߏ")Gv6@[$>~$%EF$_ƽUnBVh1"ydLhFYyTItI H*hKhOnyڿe*yE۽$R]n ǸgJ"= м@GEINygb_CiҒxoz 8놟•KucްiXHE=dweI%Y֐px9_.[4G3 5xѩ"QxYm=XBY-vֱ#EeEn;%xn,i+-1z-af&B[a |C@\h9tcg<. 5Fi'ז;Lawsu:}Tsm|/:'dx)_tԛ3#V}#oDccK;bG\b#f@Ϲ_8ݓ %uk2Q$!RKҬyJ @=OOag1toV Pfrlia[ endstream endobj 234 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpL7Pd9i/Rbuild3893c1f225f38/sp/vignettes/intro_sp-023.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 240 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << >> /ExtGState << >>/ColorSpace << /sRGB 241 0 R >>>> /Length 224 /Filter /FlateDecode >> stream xmPAN1 c;:J 8 NHe|D˶-83[3mqF*,8Fh+q@"8zOy~YOw>HHTKpP`Q8H9);r%qghU:&hKӺ_-Kyr[-kuT{)zPz^*01_[,OWG[c endstream endobj 242 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 245 0 obj << /Length 1188 /Filter /FlateDecode >> stream xڍWYo6~УYڦۦ?Aeō%I}碎$H!9A:j/V?WsHMwVeiIM.c>QFc%J"n``\1Y?~Z4<8W6M 4V*ilI9!\|h[Sd3.96;֡Z=/Q/mPD]faQEH@Y {Y#/`Բoa;{ D\Qwmߠoy:&OPY2D'g@ Z"I[5砼f@S>jkxQФ^֒ 햃<-9/F'1 㤠h HXk~HMZuװL0C[mLUߝMED/DߗHJCJ3i?(pVI |XMR+j T '.-Qs:x IT٠u%j['E/Q|?>azWE9Gyl)MWһ.o_aye`r 0JG%n'9)؍ҽ61ruTNUX~JHr*(4}OD{[j(- ºSK{w=sF ^0hkQAY_M\wG";y}ꪣ<)riи~@ߞeUlqHU-AE?N 'OCeyM[SklСMmEL =gښM]huD i:c> /ExtGState << >>/ColorSpace << /sRGB 250 0 R >>>> /Length 773 /Filter /FlateDecode >> stream xVKo1WHHR(A׏]ӖqXG7/76k|8x!%JxǕEJ?7 }`@U ,-W[&Ƹnӿ.7=1R(`P(@  Sݳ 99Ahu!E΋ગ67(Đjݑ)/ch[C ? rA k| YtC+͔*Zhi&:㚋Z\n?5Ύ VA"y#-I`[NwG%% {tRS 螽cBJ3RĄ:'v[dx}ֵVΏ,-<25L\k/N^el+ >Jm4f48dRF3ŀ@c Z[(` RZU S@k udPj d@vA5ACSSJ:9X8 > 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 270 0 obj << /Length1 2025 /Length2 13498 /Length3 0 /Length 14732 /Filter /FlateDecode >> stream xڍP۶-[]ww .ݝwwG>wgUUWuckdD tB&vF@q;[g:&zFn0#L1Ζ_"@Cw󻝬-@`bffd032r#7@ K:{8Z;G1/w  klyhlh P3:{WJ^sgg{n777zC'z;G3~*Z9@ tt~fFGP1p[lgf -N.&@G{r @hDOxdawvwښ64v{7t564z7rC"9;Z;;;YX;{lMDllNpp݃s051MŞA()w: ëxR%~geog0}'0y9Ύ.@+11L,F@3 [?@ӿ;Zg ϓxZ{1|T$UEifNXE cfc01x0 )_v}oTrP;\yrQoC wKM6к8/oSuK+lgmuΆk dkfO--܁& r;fma Ts}}/K|ߛN)fklg{pG^Lhtk v.wr>S;G`- ? $w??O`P J{׻ `0 ߝb0| |o߇=sqûٿ +_k -+|/|L?9۾\v~/=i{_31pSotws,x3h7N$\{^ ھϥtQ:~Ed9F?aQݑgongP'bi|X ֙~z0;ubbkaߠN{ 'Ia{Fgq}\ )MY1/W38ZxB@NAX DV,a_I2Tg_9NԄTA\hR %qVKŷK`7+qegbʙ;M^Ҁfـ˽pb9 C;8Ptp3 >FfiZg)\z%jMIL*UQ ֨Z6!MXHeVJk(t~˅S]\WOZ-)y+6s[6*:z⿐JtX"y} {AqiM4|79#SLCK8\<9$C!8ORb;Z5j?}qe,?OF'SPN",͟GJO. {Zb*wa>;rRQ] L"TǺhEۜFM5܆?3mk=*P2=@0H@,GgCA\77]&͢qܫzpGo%6dyF:S&bD _ҘkVVI~ bv@8k i+XZ Ǎ|fLV5'zP1!zVQwoBLt/$0˅;.Sѕl?SI!֏ ;%R%K.e>6ܠ~c $aRo1b d.s V!3OWR:5PY=_Ssp#9`tEI"*sY_ XR{3\8QwK|`h:kp3й[ru"ܗ8ɏB9Cj*s.{LezxW(Sb6FݰA@L[=Uיmΐ9L= ΀=XJj8K⍖Ne.PE`ŷ6/L̀ڐ85T/ uqha읤 }܆S M'O)ݦ^L)|d:sުʭa'QԥX ;WHgK H <l*yw2G|LkN]+m>F%NnRMSP\tˍ6wIu ,w7B+oN[!I6/MlҐ;C#Ꙏuk3꼌ڀ8ZF\l;&n,I.T/բ$P!Ha8RQ^]A-u85IZꀎ1܅Juzv~ $jGo";ziOuFoV5^70(l{fFK_SzcTn$W =e>"N" N+ϦryQ>-o  V|};IIf ܛ2E3s HÉYGѦ -VjS 6vwz2\։n]ɒ$6u I /8J2Q?:d ["Z/ E!ؿt76h}M*Ԁsgc #nJxܒ!\:a;7jvicc%A\)Ȃ145tU;]s@CkL a%.,0E ae_k3N^AhpF&\}bdܦ2KC8 Q"7ͣgQ<ݰ3 Qu(9_NY)it/>!g)P:߀UcOp*B~rKP<}f^Ny>0s _yٶorE A18'ZU,mQNxp 7:g&+)HS ԓw8uO` q!ڱ$ȩ@ȭ99WQPTO!  ,7kfW 4bv1ZS9CI\Myr~C g]Rkg eA1<~੗ QMz# IO'om#V^ç8ŘfkɎX*lK|Uw;&s[z;vU7C11<}v @ceeQ$BE6(3^|JH.c=^>Kߤ/CVWTpF 6 DeGn8KqyuX+c,șl'~l <5 nRRDqH'uubIb=ͅ]JPX AP#VNkq(G9bəFҜ'1 GTw"tX ~ővFq.7KY w |"Rue)Uϯ i<9d, !Vda~Q;[%aXP`BѬ*^J3ТK^1H2~oPc`%Q03cOY bB%b1u‹ST!M4̷V0/~N<31>5Bv?b侮s s["3:S<]3yG-%Ȟ%ث"oh]-XS2p+E6\na 'B9^9% DZy;Yn2v%cF?y4'ʹ$tKC1Hv<(:X`HZq'ۙ\ :}z+} $`MrR$+rwO7D wȟ`b>pTd/)T_&!D d5)il*v^Ry$Z,Nu?Ta lgngbjC'x".VGJ%h#] qdACǯ絕CgP7`U7~G\e~ڭf3Vc<"l3,7I:J008>e-H@8"VG و)0*HD}WG83C2NL'-Gc`N[,%A*S(0׫00cX*3<723SyH[1VCE51K Օ&"Q (jrC`-'ϚA}ϼɖ~7;,M-;7%ޗ_Ʊ18IT,:^1#EzznOA;w$pWXqDbr}S/jrKEX<51z:Zoh蹒y`=-\àݜUQN$TsUOiTBFfxw=ZA(cfdEًb ck-[ ) cÎ(?#K(tgڞQݺ\*!'h>_ҭg'R λ6?ZM3!OL+y&a23z 28i.NBE ..YΛ)Ȑw~c5"S-^ɉbh"z'Zezh4MvdcV:K]Tc9ѽq ]ᄎX.q=KŅeњ&Ya jm7gucTb8 ЬXDorO %"Ht.qx31n>Y(I"%vo?Z }9d2SD`+MlSe_a3lN׎́Iͽ}$Uˍx'Fd/5-QS6hٗ)1 5oXb \36I>MCDI жO\Beںº;VMU|>M7m'U6"m k lNQ0l2zD}KJ0;?p@GJjtPtU3@NRn+ԧFKEVA=ιFCѾߘl]k>evB<1 Y5pz UT7w5@]#F$L$O357eCRs@ߪ SH@{S?^52( c.R#2WR4HF*zA=Y4{$'>OGwIT0 lfcca7CKHщi)O>Ft 򜱘OTಛ!a˨"*B7xq˪9Oe kL煦- :# VS5qRF1`hT{d5s@%69st6PTn$QRQ^7> oWuDN5iwѓn)at2j٪db풢*s$z\nmҁReMӘYX6*/Ruro>Wuv'd:~{Km8a"WBZ6#636o=rWdK|/oE!=.st0G#!lE/fABE(?:<2b? da_^{6Mcf-`,Iac'r(1k2PԮ!QPPµ\pν.Xx-=YfpW[O2 ٯ=ߔX^,Lp!xJFf[[s)h6%`]"Aڗ VjW̴HG'g% "u jzd*,VJ_7b@ ;d(Ǧ'Y. S<8l:L!jzcN}[,Uܒ{ BN(W=q(1gCѸʘێؓSY>'h ^HҜԠ5qύ}Kh ! g@siuܮh QYٙaprD}^զ_1SHJj\Fx7NQsCueSހ)Et`o$d"%߫TZwObO<#Fu|+v(?p_0 8UF|\`[Ü2aO4BnbZو~>h@}ھt?<~le W2sȫj.8K4oVt>Q<X Mj.Em%᝘;)cԠ. $}{Jb(Uuz VƏ?$^ 3}$=".nވ7 C[ABR24p9,Ձ0IqEbΒǝޖw*+֌ M6Fl֓zb6 ;3{&2fL~)X":0qK%rdmU<ܷ5O*fK.1*4"z =6M:HK6b:}+?B"w{L$xU?s}/((;:} kaRY'Hbg BQY* 6xj6ɺ:;b,/mZ2M)3ASƓ V LV6ˑiA= V/Ыf(9X ,ƻK+_NZ@\ >KQ&ͮξU\)ojd?OK%(2IDa{z.U]wBxɘ /ֵ/ՎgHO7ɵF|ϫ~s| b2~]lqO1_޼UԲa2Fj1q}Tj)VaJfqzsG"’yPf+De&A^hiiR>4pcgՑP\ adT`s9dFبu+Cvi&X Gr*Ge>wQgV=+tj&dpCj*s1LoTK8">RIĩC=ٰgڋ#8*Eˑ_uٕtG?6@Mk~w>Y)AÑw>}%}={GֵIwD4fc&7>%ӟ aWPE7Yвy%t -$@wv2y#{WJ2uyY7',Hf]Udl*V^d_&MtlF: q£јni|}9  aɲ+5d}s{$b;+1vK6hv\۟ON['t>N:|kv,JLjzƶczk|;#l_D[v6ڦ+F6Ɩ0D\}) :{st.o',9*H-}<߱E.9&*7׸xUUYXAY;6JТXT0]Q`%1C h,EQU5j S^+ {Pb\P`1U [kO[E/Y'U4ihaY%')a{{5^CN={n]gx/aMuu6(S#"C5/A, OLҫoaޥTAi@=qnsZS,dqrf =#O'ܘY8Y,&W.%f jR/0`n- 4Iل(\D!܃OϋCwK['n/Ifj"lr6U2&X?1Gcy}8dkk\A׮c]K:6+Y@y1u~7x`1ϞЭ6}h={7J<[2WlOS"su-E; zmv0/d{^7%@[%csm2-tEv0{͝%/b=` t UR^CsWzbJjq5F+\O> y!ꗒP8እPX XpѫřކObw2KvDBoL4kқv?0 xR|s90mcf^-R\};vM|;N&`.)BÙk8[ϛNDnmD HyM4MmYYp =[d(+nCf ڹlRnUd?]tGGbA&2o}I¾:W/nߢftN1[OܦnޭFi.PS\MM>߃^AA|,A}+Kw$v e]\mG qr3]?B [6R,\d68"N ;F(*rH8~h_KK| $[gч>*LPKץ(˭pr/L ?zwW(;&zLp2&I[b;TP)יLZ-bn|vuBKZ4g.B-awMQɸurʽ䤍X|$JP?x ^~V*}RT/Tj  ┠̵c ѡ գ ϡgp#:@:`ySyŦ 0d?C򰖓eyN"4E1$Nnt hߎ/W)l]X"jTr3:&e<$jc,#x.d=YXP x-0K./85;u|*—~J]uZRHTJWo"&hĝ-@aL *}1]PliU[TpQңI(<Utp'pwK:IQ:OU=UUk bD:#ŨOTuܮGfR {|ƲtCswmOk_l`"ֈEäuT> kV X'"ԼCD!KY>a1HIInNe/\VW]o$\\!mוgr?,?zл`9 ȣx/ >..6|Ed1l{:!GG%*W:'/㭻a&8s=8XQ ȄK O[ YowE2}+jU/%P RdaY-I?X*Cu+! O޲G\|84"79S?P-giWMz=d՚#4nvhG4>7+˩bsMj*sI8}g*xWDDe_)NGR-!g{2)~-Ἆ}}Ipj;fsg Qg;#\yW^ iD3iAPLBtJwDb &N閯gNJ]PKGur1r=4.zb_|So|Lx6@+e/R6IݰwBwtJ4Rtbf=uOܢi/:x~<>fCsqO;T@#uYL=Y~gK o> fSn{SkKEʅX^Br?EV.,ڃyPcݧk[aw&i7j2B̓XwYNp t0;f4z'"s x8X T ҿJ}td f ějy2Đ*fq)ql9Y07"YsfMW--qN+M]3Ftm!WV \H6[,,eT}l*{J :> ZG$?TJMRYY501ɯA#ao"NtG\*ZTQ OKCw mR @Li_R.Z3 Fo/Lyu xLhHwk gdZxG.1kQhGZ/=SKĘw:O@j {srygl9bN6PhUiΠ0Έ4*ݜp# =X+pUQl%#D%? j+385oF_l֛\-ShwVV'zkH#.gASlXĀ_iPۗZ?8\{ع䴁+tku.f"e6,QX/ե1UZo=ߗԹ&{}`9vq3WUѨf?Y'sF<@l~Úظ6oKm7U~XEeSCBV4z|oM]7۩d #]/Ie$^Lji ^''C߈© ip_SnDᇄd#MBN= nt[H:{sEhi~7(ZT9d~y3Qu&'H> 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 274 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 276 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 278 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 280 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[r7}W1--WtlmKYrDI)‹40$gDR!)oM\AgH'`:f nȤsL{`*% 2%3N㮙wP-s= JYhHAGa /Gtˈ$װoK[V'Yxp0x. (i[?XB~h/*^žx*%lsm)ۂX-m[ٶ9-C[[f m[~0UPunZ˝)S>Lw?rT?G2=b.FőQX}!w:ciu^1`j6. i Pšv "n+ܸ}^h\vjtܝ"OKg3=|05{:^zr6M%^9^SHGmQv )0;)Y9TNn3U* Pת||X ^ӣ#Gk}cu1FxpyY d`f0M~gմ1_dO%fӒrX~_no\q  zp00d06gc{`p]4^FWf؝MyuUʏ%}nl(b-Y cSVDPf}7oo0w?SlMVѤ ҆foT**voTu"  "**q_Tl3Ep~wx{bWPzoT5AcdA~%h Da]ʢF_?݊b]?1i Je@+kf&kGzWz5-`^brz A|AYV2RX#lL7~_wX[}Pߨ6߁~b*;k'9ѬF9K./?{[3߬uD( ˀ{[mN&d&]'xWПR"VemX:UZ.$a$YShG\xjU}71wƧOVY^GbaY*IB2EH1Be0u-!9dw|2DG #O,'n֛FBe-֠!esmtl2dUNW Gn-ods-Z֜4 iTrR7RDjp&.hj\mtR\{Qoy?Xɮ\jg#Mr`\ٛ Z%)p dP[p@(ש}ۋft ?rM/xQP 9цΤ4-).`OhrTEw-y#\)+s9Wn+p$pJrIuOW[aLHli =GX7FI"ye)CR7[MZYE֚yBy{,GV@M`INC.t8/tuݖ5}ˀmS ފR6 [k@hK--%tcҗz.B:O F/Cr3S9g>v'|ʧ_*>G| ]wϾO7`;`|,NhjDWt] :{ ds{D|= rњ̍c ?I W 9d O>8rJqbQ AկxAO׈nww5xDzy?Mjy9L?fu?S?eoj{'߾YXC,el7:0vi'5\A$Okp ۣ/~:s<%&n݀MD7=NЄBm @찓7d[ol,x5pg˜, endstream endobj 282 0 obj << /Length1 1373 /Length2 6090 /Length3 0 /Length 7029 /Filter /FlateDecode >> 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 285 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 291 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 293 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 295 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`)> stream xmxeP-d$nn{9n-kWzWu?= rq4U988lh. 70"c聬Z g' uvڹ t-N`.xxxHx-nv n&`Wȃ  G# A\A  +?  l\NUYmIjYivmi* rqWwZ,k7o ` rXl4vwO/!׿L5dXl,@&i @P' PN`G/", ǿC`W9ZWj ǿ\TA`w׃DG6ِ]I_QFGOZbClZnpo2&U-\^#ǿ,z89@n.'? @еrwqAo/$ dOo(-@d0aY]>3Y휐]j{bPN[nVlHa2Y J[aPQ>AJ ,-se9DOveq?/^CM _1@[,8Svᅧpgfv;z-!=~*?ڪ Qa9*t`x|lمpG;Gjw1f;X"l=JBe\8ߓp+z _Zݟ8ifQ6ۚJ{lhuS5X T4jH65$eБ͐Q}{i0͗?h0i<&xO _" wb*[̀vٟr{1h=x/fgѪob.w0Xdm1[hֱu;ݝV {ׁz5g~AnΒ'S0ӈC 6 V:jEEsdHǢgOY;~˧6d@3Ki-W@'SEYI0 e?"zdb|r?V!۟f5A1Ξ(QЪ .7)ګSZßHaܿz}/CtO/IMAfL;Ptd11ZY^PԇA3n!)&a* xi(.4ZMffo>/P rqh^٨ثqI`!aι6 )} :nztp)& ðvn̹_m,CNo;ET%|%h/i_wlVym1r9E2/s.cNLn$ H-5lgjÅj\RJSd $dR}S1noys9Pzv r_H?Bcr0QҨBs_ ]`Be&2,G-vs/ON! sR/ { L!Uhw٨+Y;2`JOXM.tsR{v}vm]5Ӆe⠄,}"R! 5Z?vR7|ZS{ػ%$Mת M4L|ehu+f}peeWg'Fz94[\tciJ/(sD!g@Cau+d0UXcWv'nR>خ,yeHtiS?aɩ.Hq)KRćXؿ8dig5$݉.#n|RO+fU~:xq=0mv`WRkc/͹6D2үG2]?%e2g^-f]AͫX/oqҔßhӼl/q/$n ̐X{Y^Zdw#ChfbS߼SNejMG/ QI}hR Ix̰Rô#&#QČ赥o$Y.k n<@ِ!̩xg'ks#Uq[=׀%:읷WRڮ8c^~>@~3˞NTInHIfH8xC>fr`I?IްvoNaN&fZLH/AZJ6y/B wƯtۭNJqpF}] MMyF[5N$;OsZY[HsaLm]h7!{3v۲$Ij ,ⲌR/_3t.Q |0٬wA9,?*j+1ujBH;W?+~ 9o_Hlu=qPl`D&,3J"^I~OPQD* c] uI7g`=Bܝ: )r@I;:Zv4["|c&Cbc{MLhE=M:OawgZ j8|%Ǚ\iC 6<93u~h*w}[O.m[ZyʰF]JnE-*뜲ה#1DJVdڌ,.dgkV%F!Wؑ+ta Gg60%uu$T5IVCoo1vU(>}eҷf⾟$"<۝&u=a, W 2%D8XLE޾f.˄ ZRDėQ}SuWV=[<ʼnz*]f&g9 }櫾DiYьݤ(:7<cJOFe'-.p,'ۂ6ʤVEVof:eww@9UnbqB[ӚkZ [h+  .X!bM:4Du6iv _> Z=G49R>Z1/.+%y(vұ舂?/fz(m^YI%+XQ9:]阽L7g|N@b %%,@7^&/L4%O*:WxX}fNɋC ѴyqI~esdd!iRNa8\D}kdD898uMiE-m-%+,fnIct2#rJ5~x[3MpFAZR~N+dA!yG&q w&[?~C9vUJxkDzʍk2i0;gƂ5 ) IK_"{ .DKQ1CyPlz5l^ 5[38v>'||1*:zdȈ5e ~/н '^a.{(!ܵ}W5;k39aVxOݷ(`[ό#B,q&} KQC Wh߳e&g'nۧ-W>'u`2,\82Җ%v7a:^M4ơK=HʚwkUCh?Q^(,wq8/> ٢((EV^=r[s ˩1 춎cU,M!<""TPm`FPU(DAQ&*,ʄ=nQz{/QG"Ęα$/bEҶCG.Jc{[@ԣ/[gVmerCzR=O5S*r-W Ty(H9{"VWv5BX P:mnAw}b nefHqF?idj*]=M%DD4M)Ko٠~|9(|[>vp>j .tջE\JmY{4jZx!͈a:jMY4-҉{x-g3ύDZ\aFCB7{- sR+`M; tB۰{KSVj$T77h.`ʯ#xz${;2=H ƓruP+t!}n!ʣ~Y_W=iģtsFM攡 ݇դa'^.(,8ˮJiOwD6J~M*^^u1m4Z5y&3;QPM?kC6 uS"hcx5PewoF:YՏxQwnd,#uXYĎ^J;LE@ɊrA wA7L?e-k#8y94/&kF(|i}lJ,lBIH﬍abZɌJ0ILR IN8Fy^b}?};*29B^NIAp?6hRO9"( 4u:4jC8ȅ4.DSǞII~[\c_茔vi&`%]ݐ&YAgJ:/VI uaٴT&ݽa pavor17 soq1Սl~;cWRɰȴRȓ$EAZ^0As[OdC;Q-GG/O@)ҋ o 1U:[Bҳ6}ס1_ &\O^Uɨ 5MȻl;b3dDʎ٣; &%ͤu  ] T bB?X=i%}d}?]ם{#4*IPMF@OwIÈ3+=@o4I97@n{66M H'Y>f:7o -ցUoHbU5z3qm#a>PKc*SVQ!*T )XM5<-DDr\b'T{IDU c ֢6X?shHGyXt*TY&,܃TmKA!BU_#g׻}+SW'#}\(w.6}g84זǂ߱[Z⛞Ak]4ȉX!͒\L=l"vً&&jO KE]%_iw +'O4#E"Zb+^PYmz2ɪ;M[ ѦN6HSPn}^Eرv 3uƒ"N"QMJVRiC5w4k|qqkj-g#T8m wr#xImg0$p("!]:hݰpR\1Z'0guZ#*gԼ =.=zZ-9/r&YueJiPp!B 6 L$CnWՔhnL^YvgUW8x^Rl >'e)F'..ePF8 Ӛ2f E!fL䢴ڸAԜsMigFn4 uF}D6˕=|PegM)TBob+2hTJd[Fٯnqe1q笵< U;}rcu0?`~_6p;Y S[>pEYCXڸ~wϾ.m"B>]MA+/iIfSJ7ӊX>#Mm*f&ⅆ2-8&V EIůY\%N ;mНQ] [1A r0gE:!x IUjDce #Z!f!gFj)ݭ8D65 ʖǾH~WŊo~o46O6.YakQ64hc|<@HpWGFGBqo hi07}iU7l_o9o)ifHxvЄ؈y*>AKcF&!hKNz0F?dϺƗyJ?)e5Aarꡎ.+qyb@(/%:K%~N+(fAu|xUSݶOog4 Bä&7,ӭiiaռ/3(`TI>wuCm.U)5Kwrɷ.Gr8AjvN~";|'MTK ̉Hhx6Y 2 s*TiEG4G`)W@kF>WZltY݊{3^7J(kq>.Nb3+*O~H:)2)`%V~%yQNƋ5i͈f-HIyU:|2SNW4pa%8 }=%`uΊD@NBŏ‘njMo\aX"X4ş Ax:e|pijNxMa8^m+OxK.KP}.DSkS>4Nk[E63HbM7}]Prݤ:Gv)b viP7FUټȗ·-$Gڹk({ QWbΕ1&Nci*3ゥ{fw-}vgRdVEՆ6iid'#Z,6.*?w~6د-鸪0w>=~D$~j C~_R?'ceu-/*~*LK-&! L!.,4uoW׶wt,Q'(On;1>CV Nu?Lc|wxf_ثl|u5\ ٠=Ro( ,MWņ랏ÉkfrHG8boA3@>3įew(,X 6.E>M?fD; W*Mw_7`le-ג nXqAm=EnGrǍn?r=H#IHWrJIqG#k* 4N.:ԟ0? (t]"?9? &_ٽhF_?b4}XGFg2KA._kDQ=HrnmuÏ0}'" ƸW ͇~JmIZ'ǤNs3BҋA=pOv;wUoDwlS'`]%GAe%C+|0?t">UNr橣l˲k'ʗv/H$pR6*n=%~y$FvsPmՇ)#v.Yh3Tbx7ՄڸlgB^ O{𤋻$4pA0+dH$^=3=U;2NaoRu\aPclJq&ʹ_a'ӮFAX@^#f,{]@I(JÊڌ҇EBͽ|0s"pg>严$"X@OQ048;{WhSSXo<&-d\޿KH1ЅԔ'DPLN)RSX 7 |,r.Ey64ZKK (d@jsz~ҸP nm;kq845ƈGcvL$ȁ9lەLh,oۉ*u=CdŠkl P0Kn7kGtOi.ޝkKcL->ƌi"[>P|8l1>(4J?2T K57K3zk\g=]X@BХ3cRCSF!g7*}5a skQn\0 endstream endobj 299 0 obj << /Length1 721 /Length2 10319 /Length3 0 /Length 10905 /Filter /FlateDecode >> stream xmxeP\ݶ-Nc%Chqw Ip  8ww'@p^w9nիgʘkTڛJ ddhippp8ظQ](ZN.' @dk0X1S:XX W !.wH @ nQU :]- +2 d8AG+/1W'0@EV[RNMU +ͮ- p(+w E\ڎo`^P89 +h rDanm|.[;_~26` A TM'P`?:H:U% hD5y_=ިwd7TVei:Z9YmZZZZO[o\ qz/JJ˗r V@G???FV( NVa6GN3OO0/pB/Nt_a~Y흓hyO[nm~iHQE,<єT?i?E^T.!+!L<9'Պ.%q}XIK&8oh*i Keȼ-K:b3`H߼ smW )8Bp=xJQ,b0-wPS։1:9[ux id;ĎiƛY  |NpȎ"ىu5{Mƙ!0TĘMI [|5D9laQ@$sC8iP+h:-=mc7Eתhfi]u.[nsbZ[ .)+l۔aeӪ ҽ(7l2i r=oඍ-sSsM dKCerXij.cm 3BxB$nHG7+=g߈;,O\` _4j6Nf]-(5]mhcX Pa'KGrihড~7Pi9TSr |qDfuyhDqɇy5&ؠg6M5߾E0O:òMnſx|+UC 0dYB۶J$ L͢oj6 Z,'!:8.Dut>#DDT4tHJ.ef9 4_:j-!I6]~vo1^k"孼ev50MtalӞHDmi6l ɃnHL=O"< )c jbLf}NH-^E`-Ie\8;]MwꍌR@iҗ ;OCap_ `QQ)2g~0s"0`uhzpʫ.b籙mD\.QE])Pdjc BWzh%+6tf rٓ'E$ܦT?%YhagnsÐRȒ\٨N_'D߹``b=Du+ʯ(9I6K'Jx[ G>K] j )/(u͎ (w׽9+8Ftp0&} Vxxi4 +>wxwҸȡt;vvϨeգ%>DYr:uJz_eun$f%ɉY02ycrq)}Z#T8ПDxbY&3^)PgrYg%ԙ(:mYp< 䏹t]7 O3^((76 \cZPz.p{7~БQo bw6˷?N#Ǡ jr׊|>+H%YŞc[xEQ[쐡ߵNYa23ib\AΝV A~>Z8eHF\UIezLX`ۂuxyko)JҲ+V幡%~m1 Y5V3lxwUK0BD"~9߮.˰à]jV=0Ӗ/ѓW͸}vO?l3ߊ#9nE5 /u)Q3#o@UZu{B ܚh]Rjpa?_5؁~G0(X>+{,G87BkxŹ DVO8Ǔ}/]W`VG|Q6, =0kmНM4xۻH#S8+^q[¯̏eK_t{GfLu&Yy`5TSmbǓH|niHoV0VAB rNTli{yWW↾jľd@ / V1JpVa67n&"_ KiLb}r@)7j#bNfq[qf&q~FF_KP?K&nlQ>G`'J3@1;T[˷AŒ<|%g? |,CBAvq'RDYZPPtI`9%w4x+ЁػA,OGdS_m#K(b]lU9*t8 xt F8tIBvpr%CR,C]4nVu3N*UfMҋ4HhYKU#owv&%ZOP3*)Z~1Dw4IŚ[W:`U ~<q ̣E:#C__MADT'Եa#IFSZ0Q1ĶZ¡?7B 5uHg_;;7GV!%HId1U6if#Q=SOmgXD6aOrC}*3;g WdvctL :ޯ[7=c If۾D:!.;38i䔸^1U2Ϯ[d( G/-A;"DuF!|hD,!>DJTA <k58h,%$duY.\</dC!T7 }KdG^%%!fM2 'pIDy(N\I;]ajIǫ\uyS&Grf@MtFq;sEv,;Nb65r.޽Y\VjO ;%檯9DS>cқseéDM7S"?~PvQ$cq\|n$eipRcڡؔ !Okk=b}Sl̶ vLDfop 1ໜT{8YWO.w*IEAF,@6KW}} M`?WnW9aNr_D;= yYM@OFqFu]C\ itO"Ƣf"OT7׳z~5-P>`W@h;.-ix~Zin]#FL9ڬP`nAҨy}ߑoufw>DEu( dA_,5Yu59w2wG_LO&6R\|[[7cR)9:WvZRbؖJ=Bjy Z:~DUQgxj {p -q_A W<~(&/@25iuߎ:P%qeʨ}" Gq"^rt5o3,asKYXN˸;E4`5qrF3)Q d2 Z\z81h]dqneUB>;煁OTϼ[=Qz*!1|^kաGvN ]?]UK;CKRUC>kv8 31nOpE<GX^HV?q%&m!٫ѕN>A g_ 8׎yVd~]f^Fx؝h}XnwZe]t>upc_^fAZ8*1_ş"Q.fъ~ 6{M_[˲(2tP8ǚbO^Zd_KD ꡐ~3bAgMw>Pp)c:9]fu(Qm.Ph镕ʻ2س3wYsL TctU2Tba,cM<'mxYp!Q64,dbmUs셁Ό/% i[-Z{(D3Nvxi/)~푮wn!OQa~&ha>]=0[ePo hX,3k7ciD L17rw N ۥKA+qPX s}+vGE TG:ɕ$$O<Qnuw"[cBrbIt;:$z|"lrF2]A|[&MoLTDNu?NDSJ(yAB]艬yH좋4kDI5@k}BrGsCo/qF8u"\A;_y^kg)?+i'4#E='fr4WE  Zi'483bϬBo[]`Gփ3¢Anj0Kp -gui lO0\hIqK?DGAB#jM"1qU G._EQfQE~]r'niVRsEfŸBl)q`dtwlς'sX.V`./wlw$3z(eBklaX 8X J[L0u j6C0겧6A3PsdJ1`!PfJJ.i4Gp _@YIN"ޑ)ʤ#a-pT*,ÊXaG O+OkMb/* {K 6WpL5I,^8^ЂK婖kqcpU~?@JE@ {FδIT3xxIZ dH0OLf] 'r-XM^7 bTfOCl/DM4yb><@W/y.askǃ4!5ż&? Yus4$6_,oO>`yffMXF˝-G-i ϴ6}!Z|єXLE_bKꆫn$ɢGapF 9X 2}LMn)?!5^ "O&JR6zEO*>9\u[$k,s,S%G7H٠/rbOȥZ`b/hR bɌ*3g.\9x9㵴_SrQ7;Հ93ٽ<Aqq<4x}yތ˼t8;eVV!>ugL郬ji:#맼=1x)zO v%BXwzYߪxtR`K,j;9Z ۯRl}=#qQ{[P~wx(׈0Ng>wfDeL+cP#a ץ> > ޥ w[&EݒR7 (&ddZ57ϡG.鹣Qǒ;ɣ$LBHAස> ni cObA:C;Xܾ%% 6VB7cRI59P1JQ*0S0%HDK,b\S$,q/,{p)X郖cw~g%+{ܣdі>٨߲#CRAbaKM'r W.?}R7|nR+ehȭtoTН 8ve; e/IR) LG2'.gjNS ʩM\-Nة!yWuҬ5\?O3?M1&ބ `}Z퓯kpr}}р8ݖ@.+eDȣu9Q]şۀ388/\&[;G.h˄g}V5S_*8i:Y<+]?+QM\ ;yJư(Y(.~iJm!ַ@X_G93_]e5vR ~ppy9$ Q PL$J[MEuѭ蛦@u鞇ޛh&$XW"߫$'իqHc^!eMj&uj1QbY)GarT'⫼X@e>LKAm(lШō芍ؾvBU ޒ`9#i]ah.f!S`x SS9]0n)ڹVEj5qFr]"ZS8H ~'R3>;6l= (/R e՝m̐$+ZA$ft XO{8wMI= ܐxM)&X_IN~b&GhO׾T/>y(|zl@4`LN_3eHĕ卶 ͭecL)l/= X=#4wKxw}fg3][us{E7\X9|LW Z-rAۻHiU:N|0렀|DIwڼBmpXRQʼ zMd@uzgl b[oP;~ZVwbYPS" &/W'z[$Dߋ}W>guH>ghCr飯wi!IιB %D_`(_ ۊZbEM5A&;S:UT;W7l{hrY.Zd" ѵbQ)p3[zX]}ʆĨ0]=nE`oIxn粲1^Q ʕ%.=S)YZAP5冚 ߽C c?b܈I蠚@z;)}x޶q]2L}eFjޡhȵ+ւks1 +hqdq?GS&~>ی R(6o[d՚eVy!d{GcJPZ>l9MW&3q7>y*I pLl6_RUI`CÞr'}ufFt̄ߒag/."zTG@k*W#qFdsDF]|rԏB¸,|~R?/KǑu-h%NuaLiX7T endstream endobj 301 0 obj << /Length1 721 /Length2 4672 /Length3 0 /Length 5264 /Filter /FlateDecode >> stream xmrg4ju :ѣ D%.E13 3ѣN"D'щ5DF^7]Zz>쳟˥A!0HDT`n `P<V2`pb 2^ `@D!c ȹ*➋`+\7"=`tBTʹ @F`N6NH@ CqA- p'0h8oM8?Ю,Z-A t4x5â>_//u'!p$ A!dM m<?wt-w p f?wrCQ t1p 0YP_z9 $N醀#VB- ]O?ڏcN;z?<50 ⯽bP? \""X7Oa#i|žc4׻9$ #d |r o Y {igKX /(lok} (V{"B-XOΞuZjuӘ'OM{$ަ,}'OίmE3;1|KyzI!TB3`eda0$3;6/3?=KqrytnEGu2rHtn%MbԈpsڧ BJ ;`e`FX(8WD"Q/]*\ұaRƨoV@~CM…bԙe3'3'>]}TJT!{QyŦr؞{ } 2%.Evpz#J, Jc9u}-*;\pf4ѫ&wϯ,3o;!@ LGl** 7$WWpYQ5Ϛ5# o9-ͰEq?sHf =R=]q'b."_{88  8ixxs=e26R>-MԜy$l$Hr*ReK\w:(_``M:ǦBԲmhR@NP >ѝU%' 13atLjgt4O ")<u@VoYA38IG 4_?)o~[u.ᅬpLw$,ttQ[ \6Qb})Ŏ72K@w>T8~5,N乁c-Tlv#$I2<-fJLZ摳lru^Pd<=.m1MMf+km(=[3/71,(m}!\.·ڔe=D{ωM^ E2 !w/3+H6= M4A'Z,Dƞi*s\F. ONޜՍ 6 ۹,W!#%Xfo߷90 )!Us*@>i}ޟ|Gv-z C-d9Du1N,tA po%ǞMݩvIeʾ&Ĵ6flVk;;v^-YlM.#&l^D3 KYOhlu9ZM:IQtf\jwwŶLaG|-;+qm@٧ N4 8$ZTcg3-KVn*?CmY;S^cyס8'"R\R.E(/^,j&Ny[뙧}x0Q;>vdJKo7f>!ʏs5hr\TesnX͈S)lY,W%!%?b:I9;D>b60*/꘤p&8y\/+5D 8ǒܚsϩRXKIHdݢxN m& V}ih6{͎Q z|yń'<3reh;Xy3E ="A`.jbZ_+2f%vI^ف7Ҥz3q|Po_-g畈 eWGߚ&PJ/$/32pDqDwu&:`O#4) =lp7X\~\m+r-]hQ"eG>xTh "#Ud5i\*!' xAE@}oU4gnş5Y,tl:/IZo8io'"v){gdXߟ;ٺE+u7{</&Uiѝ*v|0l (kN1S#k>w?{Y9Ay|'?8*Yf dW(jP ]~:e!=0iټ౱]PEf-|ѝ6%~R)'ryhz`v,z5bphѵ1[$1ʪ{Jb~Կ s;_<9|9t*ʝX|Jy~>M۩^L(ݡ ֣KHڪzԴDjt³ޘy&m=t9+r[lS3΄QDgy+3f^x_hiޠdd357hm Oڻ;=F!}7;\+9n"jqK5T灁?"(l ,A]Dn,,fhaP)Feɻ3o52i@{;H8dg%lo VUÜ{#gZ#K 2f}{UZIݴzEW1M;7I^_w󱛍^1cŐ=!m endstream endobj 303 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=['sv}o|7lԘ[kxBYwS0`Qٮi"m!-M5\F:i0U4e7;yO!(37Px\lCys0l+htcA620Ae L[7Њn& U RZ,cŶPSan aiqD4',IF\Bbu /y2RXR xHXc®eg:'c|0xq?S΃qI&'g΃y9 C :sǡ;(E8o"AJ'Ođ+6KIט'; ztFzKp&q"pBCT/9!ɩ~B}Rq҉TFIܨύ|nTs|neEAxwIyRm4͓_Oyf;s|KۄwU羷{lC'i=>vGr_$Ԩ endstream endobj 304 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 305 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvH UdCmU^!1HDI8߯-@=ۙڽ١=?w]pwdV^ڑݧl#oxdGa0NiqF?Sր'YNR}{f{x2A! u xk={Exo"}Rɑ#x۠_J B C쩁b8!=%p&r"D9 Qg̑Tu+gGNN8O-(7ZRntH ʍ(7:hEњr1+w(O:͓.ndm'#Ʉ'> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRx=7i'Էf[7̖s ~ts[(:0p l:5m_-tB}W{X8 jw]lj'OC=6}Ӿ|< D0,6;96ݕq4L MUWqS~Ӿ |Ҳ\Khv7RKs|*Z -1 b[d08A  i$C#.CZ\wF|TT<\`Gc)y ,<$g v1a粳[ RHדL1>g~8 䔷5 B{ $.  3qdAEBu7js"ܨF)EYQУ.?yRmTy'oOz>OZOyʄS&}/6>zչ{ZkZs}=?Fey endstream endobj 309 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdC۪TBb B8߯{ .@=/ۙڽs{K;K.k6/k+[M'ҷ>dyӔKe'$cS`vfSfK}fƁVGGf\bu<19w|擬CTAW $rG]IyMsh$aW7y̟u? sK-`θtJ!'c83?NaO<Dg!;IX 0z)rЃ@kpBQ]^Z7! / U <ɉ#W m/%]cX! gȀhID8QN~ACT/sQQRs 穅ύ>7: F+}n4eE=zG~<6OɈy2kLd>O&y2ϓQ>OfdV>OF<dR'<>O)yJS*}𗏿tx>z{O->tՍ]*3>cC~ endstream endobj 310 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xuAo0 R{HcIE H9l[5j 8] CfUmóٟۃŏ١.rn|vxb}[6ߺf|歫NNhYgy8å9q7۾q0_f_ дGι/63Dk 6"WT#!YT XF{޺cl_c9K_۾qk8rw麓 G ylIo2"dݾ}hrYWydͼ//V&ZKLxY juwԯx2$OAPyt4sk)$Q "7A?g@c(3jok9E u9/d86dq/@cNiЃ9eyDH{f@/Z`~G. И!`DoSc_ BZ }%m<;4x{[W<Q $R1R R2R:dA3NUAUI5'ZG-^GGGG$zE"ZGmΉ..h$q41q1//fm|T ֵiKN" endstream endobj 312 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 313 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 314 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 315 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{Vq9;\ظ{32bƱ)`Pk IckgUPSH@"7#?d 9aFm-P!.@'1 c09SGTX3 qxryB4 AAN8pЏ}% Jxxm_p?0䗒䗊/ TB~RtА3~N>|T%9%cQ/G:%uF>%WV6G]$ ' $ML/?mwTkW XֵdpZRF ׃ endstream endobj 316 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5e$_FK6Ӈ~GnM|&/;M>u/tFo1C,RAj]IH}=nCbi$wiдK;!F ;oG+5~~VhVj;zk)7b]϶k+x; v/)&t,KK@F(.$ +.^ ] C@F 謨fҤ8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz*m endstream endobj 317 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkR@YwDoYia) SZM5_$$>kxq4|;o4vhwqB؝Bf#j{p7P_?{+4}+VYu}e}n.ˍggfjj{k:lF #QhJq  HQ/e.!Pp #]gQtVTv)#l-g!7'uӾ:[sI r.39uf *gQNxEqV11V啣Yq:54kDCZ+)]Ws8:а/9R\Qrz\8Ç]按Sp/ d8D(B!4׳030 =;fzÞJmw&^0C~/nS0GKW皠NdzG5cC)!=E^K<3Iò8ȿ q3NOg{ACt~Qn~ɸ\ %1.: *4hH`<4̶E hSu endstream endobj 318 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 335 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20211113164202+01'00') /ModDate (D:20211113164202+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) kpathsea version 6.3.3) >> endobj 284 0 obj << /Type /ObjStm /N 68 /First 584 /Length 2490 /Filter /FlateDecode >> stream xZrF}Ẉ)`Tt,ɒX$(l(R!@ .E9[[2fO==[A"­&<2xZ,'<81'/0$^4a6Vx3i`@hW0g`1l3R9 ^a@i "Dh"%8a EdɘH(d&H ,AHMd̜wATd9Q\BYD y$R8(pwgmo4S1%:\ґ5hp5 D *z) C( =ě p-1 g !4R0b X2 oƖ4‘l$dH BC`5Hh6=?{i>^d|1*'޾pG4Dwv_[ŕˠ AEFt;qCs7yQ܏E2۳4%ш%1^WcL' |k`?0/<+ˣcp"3lKCzBӏ zEzCt<xH-Eg9Mii;sJIxHf7Ӝf?O:tFg4>to4O|:тd.g7Bo[Ю6hwhE%EEck1>9mzѾ1О$gYMoSH4+EɾKN2XI.dR1[>ܤ<̞,Y|ުT=N9k9/RJgXͳ/4&}'}g6I%˥Ko+Sv1)wB̚-&he"{~mob:?\ALڮ)Ems+mwg]X+gLdѳnkvk%ņͶ^˛y>AbĽug'nKžFmͲTyqulۋGQFOgO"lWnb)(hu)hEZ0$G?&6o?>޻ٕE [Y lyrq|tr]ƢUs[yca',Ӵc@|3o;f4'Hbc*vѦ2O -o 1vVvԳ {韷l-LA~191(x(aJtO]85fHY{A޻wr-T+>4VW2#zo@h wFn_R? ZzEٟKhIcG7_ tWw-6j5O?,=|z vY6O[/ޔp) www)_=r=bQ3ww[nYʻvol鲘lW5B *ރmf8nWS"nzCY=PÑ?a>R1h ܺz;aTD!5[ޱmzWt˗ ,i;0!U5 1a{pɃj6_RWMTzJ5PaX5fdhfl|{9lvЌ9o)䚬0.= 2kuî:Eڼ5 ozpd L 06+]IXXQk灅 kh,!k,aAV_aa_kS[Y) a#܍W{Y,J\T^l^fVU NWWwdP#RU4=V3B΢9wD&~p?@ endstream endobj 336 0 obj << /Type /XRef /Index [0 337] /Size 337 /W [1 3 1] /Root 334 0 R /Info 335 0 R /ID [<652B39C960965B3F4ABBBC765A58EAD6> <652B39C960965B3F4ABBBC765A58EAD6>] /Length 855 /Filter /FlateDecode >> stream x%kWW7$FcZ1ژ&iLyJLFcژb; PDlGBRJu*EZ#=cu=}=ff3Z 5t: D[*bUJ^;j(xkP0׆*s)eěJYP)? V}B55Q.ZVS.xxK2)r x( x+)*6xi!v#xJY^5BRS5[ѹ@@7`=6M`3[U(` \ A  #`;>Cnŷ.ިY6ҙsg`Uw赽BۺUD>rE(qA(s~WBnk婓5&SY6MNB[6ѥKCq?PRf{?kg̳*ݳR({vTgJ /-H{q_Hz~,:^/.K5t 7&|p߄'Yo)Kx֬I뀂A:P]tm}.ѽ14h5 endstream endobj startxref 252848 %%EOF sp/inst/doc/csdacm.R0000644000175000017500000006705314143756311014145 0ustar nileshnilesh### 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:1046-1047 ################################################### run <- require(rgdal, quietly=TRUE) ################################################### ### code chunk number 80: csdacm.Rnw:1051-1054 ################################################### if (run) { fn <- system.file("pictures/erdas_spnad83.tif", package = "rgdal")[1] } ################################################### ### code chunk number 81: csdacm.Rnw:1056-1059 (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 82: csdacm.Rnw:1070-1082 ################################################### if (run) { library(rgdal) x <- GDAL.open(fn) class(x) } if (run) { x.subs <- x[1:100, 1:100, 1] class(x.subs) } if (run) { gridparameters(x.subs) } ################################################### ### code chunk number 83: csdacm.Rnw:1100-1101 ################################################### options("width"=50) ################################################### ### code chunk number 84: csdacm.Rnw:1103-1110 ################################################### if (run) { setClass("SpatialGDAL", representation("Spatial", grid = "GridTopology", grod = "GDALReadOnlyDataset", # NOT TOO WIDE name = "character")) setClass("SpatialGDALWrite", "SpatialGDAL") } ################################################### ### code chunk number 85: csdacm.Rnw:1112-1113 ################################################### options("width"=70) ################################################### ### code chunk number 86: csdacm.Rnw:1124-1140 (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 87: csdacm.Rnw:1147-1154 (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 88: csdacm.Rnw:1180-1181 ################################################### options("width"=owidth) sp/inst/doc/intro_sp.R0000644000175000017500000001557614143756313014555 0ustar nileshnilesh### 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/external/0000755000175000017500000000000013171625774013642 5ustar nileshnileshsp/inst/external/test.ag0000644000175000017500000021711013171625774015134 0ustar nileshnileshNCOLS 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.ag0000644000175000017500000000020213171625774015436 0ustar nileshnileshNCOLS 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.csv0000644000175000017500000003711213171625774016716 0ustar nileshnilesh"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/0000755000175000017500000000000014112150047013421 5ustar nileshnileshsp/inst/include/sp_xports.c0000644000175000017500000004677413305456622015663 0ustar nileshnilesh#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, cls; 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; } } } // rchk MAKE_CLASS allocates RSB 180602 PROTECT(cls = MAKE_CLASS("Polygon")); pc++; PROTECT(SPans = NEW_OBJECT(cls)); 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/inst/include/sp.h0000644000175000017500000000572614143756272014246 0ustar nileshnilesh#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.4-6" #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/data/0000755000175000017500000000000013721473670011751 5ustar nileshnileshsp/data/Rlogo.rda0000644000175000017500000003464014004036330013511 0ustar nileshnilesh7zXZi"6!Xm49a])TW"nRʟ#ߨaTYd{: Ldl ֶx2HLui҅pJP>/Cim)U)0n1Ƃ[.H;te)CWs~^kb R0@b'ow;[7'lo6aO:Ph {j[>E.a[~C[/.֡^2tE2lI09k )/J,CΓ Zâv(uI5ﶻak̚p,N`UilDY$e-Stù~'`Sqwҧ/qEX6jp՜ X,<}3dӫHRgjJ0^V$3^ׯ}^lAi+#d A/xX^# p@QY+fؿ7_ǯleulҡT܈8 0]->k};DA/1X i0DwBSyIÝCƼfx:#8 ؞xZ@-%Wex^6(vLuix3C 7YQj3 f+݅bŔƹS ٷ|q7Έ9g[[Ol&1J,YqSbyB" @ӭM4\sSm| 1}MD$GM{Lε})r9;^G3m}̴0QoDRcݍ{ ,S6F+Mv?p Oh,9ݟb7Ӭq"a<cZr(_@Z&@<$h7b%,_9;NL,xt_+$kb!?[sF z{8ip%['_2[{=x'iczCI#$Y&h1^GDJvX͖aAԎNa˩Nx$1jpivcJ­ ؟*IWO }Qnзai <5/HxFMdܨyok$K54 #zۛjy-u c{ w==ĮYX_ή϶O*aQKI{K9ny-̾z 浱&?NxפNRpcF Enw v'K" hPڎ ], &m)t׋.4E?&߰{yиΗ>T&yMKNư {#s l%mfg?x 8)6&[{$Qj4ŭHynI(7Lˠ vljθ+=bC 71A}bz;;(8lo:+Cr;Yjc ɦ$r^6p`VH.UM 1˨3.;h*g#j$a1cü;#-hKҒӿۭ2 Wqo$6rsơXElK sv\3zMxI֥w2ɏK[<;̽Y8tJJ"(RZ Uκ(s ,Ę%Б32japa|J7U{x])A*y /)8.AryN.?PqA XNEDQ7#xꇈl G̻sF1bк6؂Ԩ hR:-@$_ꕖQ/_ɣY?=fv˖G}d,Pډ H9"LKH^+Ncc,!xT0Ĝ OGdΚ(L4q>U8^;Q1QEޢ;mweq5jO(Ef֓\㗰FO2}38y$3Ga߬P^-p!{@щ/yyvվ%6g߀va&Iqp-`n|?n1"R*W:k6?x#5[3#Y_wI&VAĻRۨpT3-1Ltc i<\,qY SkhFs0şb@wB gsm[ǭo\ k !iA@|RLæjs?m=DeؓrGQsJ1^?H 4D%ٽE(@ <;?0Hç}N"ͺ(Z_D\pW+B"}$%2Ɂ@ܩn$ IRwRu+?x6&M{b&b$Τ$a,wQ,lPB@fsЅ|/Kܚi.- Wr+PTfG,̾[0y{k?9eBh*ďVg А4AG;uv OEb_5#|9kp5R[B.> h8 4 D+&s2-jtTY/5h-`W1Z(ƋV\VL qgh/ xV0_ë_\R @ d `,7MhObGTOYS˴=WAUxmT5:I]cW@-SMZVnC~>a6ns= {Ĵ>W}``gWG{ğI99N pS螨],m(q-m6m_֍ho~Ux6?wwZ_(\Vi7]&eJsv.^XE2-ZD@7[7r󾛰)tXn- -E/Е{rK* M+r[ņ.v έ:Zad)$@J`0 b*^Hբ>ҽ>)IP:x5sNhyPG/ MY [ |`2혰,?>?⍮25MDOZW8Wgux%4sAOn\}N'rxgj/-HD祤*pM'ƴm66nw3reS0}zBWPa myuw.\XC0Ksg?3Bg c 8;4vn:7)(–c+< 15K2/1DH OTj_ۚEgRLFJ4Bʜ1ĭp{Q7M iZ2S 5,i(Ň ^!dOv_Ls@ިTe WΓv-¹/ e6 yN>Eq(7&P.) i<T&ˬyTDIγjDnׇ~vdKsxd"N âʃ нly:NۛKu6ty"W;߲m]ʓXc`<$K`ƀ(Hm`p%,Ѳ,i6)1(JϪӾކYw.H3$ڻxS_ndhْ6$['_ ֢p~*t-q]A2AakwJ5h!$S4K=f"G-3cDRpx6Y]odv ce|Az!^wؘDmҤg׃{YRn-LgqH%R I )]R1ݱ__q#W&l~8Q ` U`7Xʂ %&W:WRhSyW-^zAzF.ݯu~D׼̓6aF'6SB#ɛ򑧄 f$<.. ԠgrpIh! &-]MkZ|)e+ғ ոBJ̏ J&;]l"T~_=spO1~,Wb>kkؑI] PKuG):Dv]s`:3KxXT_,R`.} z(S=OF,ı*Mq z6ZWl.(:Q){T{2pPЪZGI001'{?"0klOJAZ岗O rcӈ/HXEV'w-5qͤZHc!4\McQ LvLz껓dvM 6ԣI]jYb01;-h"J,!lz$3dBY(_]L']ё$ mE?|i]FXo yw p|PZQo'}i\Awq`:G?T{-h(H0s eIsT{ݭ,Ctin#2;%22^Oҹ: *3rReJ-WsUO0xlZ ֞ö\?|I;$SEG y|Wxq=3Um\F @θ٘# _ʷ"A{?MKT -rr(+) _HϹvwbZQS+DPy@'_kKE): ܃E}#J3|ZCA4VvQ¬(]m0ј0NъK#ʺI߅iѸqG۴|;(3}ɒHdI֭+5Ua޽G /rڴ3DL7"3\]~yJ wj"`=|_)iVn0:: w;ՠ|f[yvA9{^AYvÒ?Pbntf젿eH )'E:˜eЈj{7`[[eKS5RQPB]l7z>q(^CP+-!{cGFSpWEe5MS|p#Ծ* N H J>+"quDZ%KG/"T)+Rʲ֓s@23[Iy&2R Zջ㑣h_RZʿ*yqXcZ! 6m+Ain58!2XC9_dn*xtt&u4#Aq~-I2gQ/F%i&º+yHmessI ,ZܑY:dUVqkIf8mBr^l ~z53Θ{m"F #m++s50GJ8$Uw&E1qGu4}ۄs?xljs~ح0h*A,096|#:3|g3z0;m3CgQ@1۵eZ:gg]ͬWy.axgVY!bn?Ii킡]j̒fT[WO~SIJʫ%gM,BR*N׈|qw}YU֚ip='~I2#׀V00, ֹ՟3Z~m8({x"Ĥ;#"K`/12䠼R9ɱ[E?>D U !>jHs}L! kU 9bby."JrMwk00v0K3P^Q1КSaSzrep lP=\C*Ĝ}h܅aS퓓#d^:u7ΦjBBLĞ_2 ,_Tk|R)dwY?vJ&(V]p"a3B", \wt}s?g7jE}ώWV4(|nGAQdD8;71LJu{1\?`#7N)d\ z+3+4O|dIvۄN4Ea2c.# _Qi?bMQ"XXKipݓݷ1C}^ՙX||Fj0Kpy`'$ s"Y z X.Jrbsq_`;;?xh-پ<U 4lDC!R#j>uu1!*6oFHDkuU3)j-sTEٵ9܄]ɽ7^37R+)̯qO2.ժ/7tyʼn1Y2$bNYbinD x0be}]Se:%;b%rFԼ5<@- +{,z!C}9o:_Blbj|\ ;}ʃo?w_9浘L zvvDK+U:16.GepBmT!1Y _8kXatQq Fĩw|P^k{y +HΆ^v=Z"5B ǐiqtR l~ ,ъ;ӯ'^~VfV5jfc{44m$ʹp2ehN\jÿlҔ]!ֵ; $ UeQ"=?;,TGB6Б}:[{T\x"hTQe˗("U7GO~QAIi7%"^㴃Il; {y_?B/1F3vC2qp3s~ۀ;HzP*FO2l`RG +e[8в`қ n()cC?j͡bL4Q.Re7,!jg-ǥXni7^){8mOh.j凇s@{XYŮ lNhZLl?_ [2y3 @Rq?ɈR`R@zh m,nɂæ 8֥ xws\j<˽ ~5)8Cs_\y#]ĖoGTz Oh 2bA@Ư1^?]P9d*M,@m炼%Y)uH[רrfbj[?QH86hZ&ig8,T=UdEvgݖh;}jlvkHl!Ո{V obHh-xw?MEņ"_A! TMX|e!SgoN yT'J".u6ʶN[bΑK S_M/^L8~RX#qQ%t=ɝ"X4(sk]X%ó 3mn,gN׆ Q8! H%;\=G inu](KQLS!@4ٮ]>PUzTYN7hpՄq4c!_,:Aj@;TsI0!d33ܘ_-RhZǿeg* +gEo+A IviŠsX-2#J05MNbo3dNT/,2"\i(?(PeI琷D&F 3G[Xhs40=,Z|Dr@//>s_~Za! WȏJx_fa 5ݒuS KeQ0zf%'hm#Ij]h=|8 im;܆iY\(Ey ԣ௮G'R3UP5WzCM}kNe B/|Ys S>9uph ]) n ʾ,Qaa3ɕ@nMWp%zƱm3)rPSi$TM"@oUn0fX +?&WJ&'U,rдk"]V<=4a/aE"M<ECcnpva }%>(䡝jv5^6snGޒF/Plބ`Z8 yt:h o Ʊl]|5@!̨"a wHqʭ+"x^ڴ-tph øqmX;ݩ2gd~ ˆiT3Q1*$9+ή۰0[mvT 8Mgeذ֐PL2]~ ؑ~ŽʮL{60DQX ٖ) TXJ(b:+SYt/o|(H-@IlwCUsGfqbdNBCuv5T%.׹՘ I?1ŏnbv =dM*i`Ӓ:B i7*ٝɫ6K|߿i*0-j09յ:vJ^e7ªFęY{»0 w>NL2s ]IDzا_쀕)/i\8b;EB2[Q!:|ks &-L3z[j%Ш91 ƴH&/YWt l;R0MЋI >AgD9~RRuݵke(Z95o"R6=o7]lqYs~gbsZT!1H=_ g-[H5C) ~ Q;| Wc]+R~N]- X[&_-a=ͅx&5$}^s:"6ۛ@k SIJf?JIǧ@,ˀ0rH=݆O"-[q>-q;v{ k:Jep\潹^$ BwpvQ +6ڈ"_@a!E$4#c?!2#!Rkƾ<$$t* &UD]/~Ѥw 6X6_+B;5~a[)^0xA<%]:}fty`.Yh"YsK}ۣh*"kݬ\_%5ZpkƼ{zc[|o{NB`|\fH H^}Du|xg]-*a%-I_jjՒ^UEc"pQ']$3N'GId==OFTJqU/BiְؤgIy2 ٭1R9B >ԅ*L:Zg2c iHYAL +zbPp:Kڈm,Zu6"jnLu²_i1m7*~P.i$c,K6TE"!(gTRύ݆}VQGXmU4' &rnjƸXbjN.P^#T jz**ڵG'pWS\z3xmw'`ƭZ7ȰhuE!:%DNSҞn +gõ7^EJ "^Y R?rAk|jD~Yf D1{d!>OxAY7TJ-U;m/mQXdamfd}xG$ ɀꏮLW\1w:LBbGayˤ[kC~dJ?ݹH 2f9[n`@NHXv[X.}^{ BP < ͳ{/}b9A[ v;p:o^(8Hj#|uHD0b;ƈݵԎG^aE, 2Go:9ߋc٪C1&WkV۴9FiGm A&,=U!ȁ&w{!<} ( Ԯo-ptO"`_F}-ׄU0F, ˾z*!P<0٢'0Žm%f Q%8"nE)C`,< .+B'(n!AF\ֺ &=m=q@ܕI.<u%ޘhn0,%_eW ۅl8VvMw(3?TѬ\H>yK;g_P}HY,*#JR&~͠(bؐ 1s2B;VUv"<3u113Rhh=- E~ڊbogH)UwQeuY *EvE/*?>[@\瑒"v8y!su]I&Z@`VLRJb_c}&\N"`~[dK/j˯{b2Ώ=Ad8C̣^j z[r :^Xa/Upjbk}! )~ D1)hHO< ~:hsddV'-gBUx zsi伍p <jd0v!5rӿ QcX_&b%eL_o. .rc|5$/̴Zj9={.f p`֓r3?8;Չnwgqy4::rvR,FczQ3paJvu+O}+ebd3aU{DUc|:/} v'Vļ޾B啁/23O 4)2iݎG` ~A]Gb695V:~ZSx5˾*pWVvʵH M0qskheMlOGZST'e#tEYFUH-Hڬe4 LB~Wa&*:Nj&-zYP1:לzum9>ˌ{ڥ^9bCW*O;0==Xͳ[fКLiz"{tz+g">̵nVyh!,"y]o@):궎iqN7`3,I~H>XjS Z69'ylMj(vBG\8N*;>hXn}xX>mq.qt{%,cǻdy76I?T"zDMQ&+%g["Ah֗iA-L^אOU4jheLqnZomMb;2$sm z '2 &̙;v dϞ#@ԅ$zȐ=Y!u)1( I9 0ovɦFBhq41c U@žeG, }%kȾS(|T-ҕAdwm>YzTyH\ܓ`?=:5qUb#037O|ʳ24s^T^`yӾħVS̤T12ސU,ۈ#զK&~Q!wERa3[N+62SZvxg&(dLtn7?oIS7j.v0mf(G7\pܩUHpo4ռo#\`u+yʶWIJ`ZiSRdWE2D%GM|%5}a 0 YZsp/data/meuse.grid_ll.rda0000644000175000017500000011416414004036330015160 0ustar nileshnilesh7zXZi"6!Xي5])TW"nRʟ#ߨaTYd{}0:Q1WɌ.I#JA~9SRnZCW75Fcⅼ/k}ߠ! e \k{o4'ϩ  Hm-R5T E>{GaeYaȀSovuF4A._5|Cy PE{ }[$RP37E1,4 dYҴ mw~Vv)j穊k)!$ /;lf4A#%Eđr5;Nϖg:R)q$EXȰmWd*Uuox@cnLKȏL2lTf﵏ot=Hͅ{NΕ} ꐖ%?LeoZɮHml) 9^m!jƃaO=jkVSœ>mpwB< ,|q=sAǞp`_P"k/BiIf-9{x\nc^H{qk-gEYpNun*X|$;C 愁U|$_J˺9[:k+ŁA \tq'K%{hc犦eSKc荻91ӌg#A!RB<.0d2hD~4>uw1Y^K>yEKG0MD? Xhfiu2Ϯxj:E~0n-oÆe\o]=2qI<)nd Wvs*O+WnMDew:h+X_l.sst_/JGkDg?/XYO[^-FlU1e/pr\%i-MtѧgO,h˙nbѽ|ZhA?Y{ 0{ՠA"_bK!AxГ$+ i[jnӳih6L%4$0n%¨'IH6E`<nXR=2#ҿZodG5bTt"WhWs_qw&QB/K#pe{,h( -ӖG?s%@',Y5-pZsIo@妊 X^ x j A"#dP S$:ow +ylS{T0ΰh(]R 7!%:kP½EIf]ɺn->ZK^@ƃ7-qtL:u|wوcֈ=uHDKz㜔'z4'oyRN*O(a\BZ\(wGw+jj7VЊjypųlWXmDfƚh ӱpwVs%#4UL OחQߋE`9&4g, 4v<@bN̴|dжd["!eg^N ʹH3?8 & ۂ?\ lt̰D}պix5o{SicWsU#9xߠpiD3]F׮ư٢;p"&=t|ż,ώ>7i֢yb^\k Va'J,[„rDE. cBr^ٜa,ZN1rzV%ro8s~daU<3X}jg0gF@9आ c'z< Js/ܗ~x R XZMhy q&Q ]5 mVXr #͖Icz؅292(UQ,:e7M}I:&X˾'mЉs4vMz#=2,ʒ5SNh#|%mqP"I(h͏WAB.vLD2ʹZVSʵHcC.)-Ft?-P_{RDEɨ+O=N6^9ڈ^(F(u3›sR/P[.tZ1 U2i[m_MY[U7볭N\b3R1Xҵ$>&394>6@BT4'ʜCz72[6:f,Mo 8ZK$Us)}1O !pE8IڱJS;I$`;MvoOK =J80E5Ŀ;øe:ƿ,L xx_-._ v j9NN)A3y5<^U~%z놚ҕ0 ?U-̇*a oך/k!*rV9*,e Ő^__۵|'R֋ܜ/ b$O6 Ͱgheh.Kz$&\ȱ-ZjgG;R~kCNXIizp۝PKWmT2kE~f$k8m륫llLo6{;ܩL:\LK\ ^XXRٜ`ܶj[tKLDN&[M$)i~?6*=c'YvNF*dYk$Y%ƧFh-a$ IB(bmZVH`^,#.j6cxgzw&*95_pܻC`"^~Vw:s DA'c1]uiG\@$jOvVW:a*08K;]+;(+t<` FmȊ򛆛ctxޑWQo)1f߬c<6yj/ |۵=R.EJ|:- >"V|o=|2DdyY1jD6Ԅb$rKO-o=Pഷ=gA˻^N9 rxG~|8>.\0F|ϼ 2ou}DZ)FqU)~(7LS\nۥ" C2c4L q~ g w셜!Б]5Su}ɲ3OJn.=z+Q }q#vf, fw_fZuIm嫵&|IQ8A>-\6!j%n* mqfگ m[Y_e¡.ɸń!6*jr ~ܹB4j?`iEG8IΪW ¸ˢlhOn̊ۦkS1(b-aԺNgReZ|˨}d+d$!Tҷ@t\ݎ勵hw+`upN{jU~f{T ٛ#t$@bl u ;BS 4>E#NMBRf ʴa_BQ`@Ϯ^٢.O!c3;r S=7E 34: %ʛ2pYY:)`MUvj= Udž# 'vKC֋a$}"h%c.ttR] EܡCH 4;tݒAn så"w*: ߰+L.wc=9hmm XpJo@37myz,/ q rtź U3uFOB!ooXbG6p7)4s}sYP73ɜxWUAa}$׹A>mnGeQE}+ٽIfoYnp3G5AAlcHvSYY9*Gہ@ UdV*̉hƟ^Tasr$'`!Q%,^@aPZZ6eYE!#j[C -][uۂt߀'DncRmm-@:C|:F|Q}C4R =`LE>0 t`2s{ hm>證 |: g NdI2KUlz%@$TQc@qGS"PHЈrBCEr=ds_z4C|ZsYC:\*N v?E /{@%w!]"{F;yk)#㖎i})Ҍ`Fk\m=RC +hڠQ!35*}ӭwί :i`BH/jQ,HXAd1'62|[-+ iAteCZ,\`rZWʩ*\XH$C:H&n pnLwWN5}DSL؄qJg`Ey!_""SEIhG!~VT{Bn>|juj~.>եtt8!-,GyJ9  "[v/ۍӬd!څ#NmvDzn'U<4*Ng'fw=9Ze7?8̆iȔp6+1?r"Lk(vъKʨ,o-L<7d!aG^ؗ@oκ;%+|k۟MGy$KT E=^ VL2~@LI o^K"c{1jCB C0E:/1c=tIf[/IOZ5f ?yn*E"o3pһ].2Hm]6cyPև6Tϫz6+/LZ[E $qv= "^sTBF}1F˟L[(+ S V9‡DpFNU٤?%HI BJE]mwi`9ŨQ)?wJV^;t9K `b`}!Qi-+!2nBW>O`,t?_ U"Y9ϻh)_>, R崭oZVxMޮnS{<\hBatgEaݻ!YbT!`_,OsWat,zr sp'.Rw_ckm> :: e7B4 DW&U5CZ/%y֘ u'`K$]*hߞ⟯큨v/딄*n/>n3 VnǫC[Q~n"n^Rmc= V2j szj '6Czj+)"ddςAv "8` 9   l:6g;/> Bg |HE^r>χ 1 G.7KKSޮ[-K?`fQ;5&u(\ܥ?./i>W+'koσxG1j0-G@KKF(,^EDO,eՒ '"( Um]Pbm u+)Sb-UbrB6wk)Obȣ%=P sw3b` 2,dv'_S g FDŽN/Jز5rܖ~Q(UU*-5(ݣig-hʚo,ɼ@)@5 M B~8y%D[7vW-z^ѩ&T(T<=B VKfaLnl޸ǫ*l2|Ok|Ҽ |}sz`(P [/+A&S'R w8ÍjB;e9CK#Ny r')MX-aHNX ?`Kş'SRc"v$emá2UA_B%oHiz%PMwoGz|?n<$Eo A"J98K#8NہtԳ"OE*nn/WEՉiu7hj:?/ϮsH_n$-:nxM#MO6v&v&-UTg}4CA ^ &2"'S )`tzu6Lq12#0s-i~ %kO}q Eٺk_t'ԛr4 5y11"nwj*ƨ. bܩ҈ÇAo_x8HE>ˬa~c) .&[Գ&Mڙ`#M(k&".Ȅ'SF1+G_/`7{9Σ$!Wq?椣'QS(1sfnݤn~u=5'/l_:nrK3󜢿-EE|w-e#7 _3dF5PG ؊7-†%׆N]x']JuWq)" -3xiDQvw 2V2YL%T% Nـ&N= J< 9u҅c`GT HM%6ɢHyi ?f51$lxiC$!n{{); #W(cUZŽKVQ[9Y;Yz<;*`&zjJjuԌ\pGQL u5jBO)pS Mre=*/CNQ)WN`JhH%*"Cj~i7,_E^,~]wV=L&}VӨIU%ҥZTS Ĝ>UFTŏ/NBX76ގ\VS8DC- ݮmrS=1 W@\hzA%E5r .YLG ,jP@ s\<.p?Ⲽ?1iBvAZΨp5 ޾j4߻M1 s;5 쀽(ΠbŪWE[YK33jMzþ@y$,iQcS|+hvGaJE)S=`8|DtMKBAOq9InI=g:\QjceI.Oti-T\`QȐ [oa3-ʕ-CwFn$R2OՂ2spxÓIǙ/ȒQЯ/=9{P9}!uc|4Bk==)վ>)VC]Ąϳf7Gʚ1ʵeWx|r]wA9ť]̫8%[X/F( Kl {ﲯ",e$,h[ b)okjer|3D` Eg9&K!Z1Îh09_Ӛ )8́){msШ-hQ"},1ݬB%ke('R۷K =f,tgAD努FMB^\knA 'mV[قJwe¡sHuIEv,"QukIAkhQgvӌ % qEY4VDLH -S8tFR㠳A4OQ4.ZOMo.+}p[#J00C @UJ=W Dvr$,ą+Ƨ-i5#hB3NU@̒Y_tKJӖF`_h}sr5Peݘ3\L YZ(HY,ۜhB}b|0-upNeo'Nj` =sQOj0s)Kp v-%+[JX|Ul7t3vw[* t;;*7.jXzРSNz/mؐǷ<0:6މL޲aK>c!OTs2< "^ [Txj=XZC`'q™ q߃UdNH QYKBU+`Ѐˣ]I+i|E9)"I6X3]z"i xJV-&Am0N{:XMR  ar7@UT`GT(L]iMDS:ZއFHBd]Kg~|Kܡ!nC^#ח{ g3bDzcrZix@ v#%+Jp}ϤK w&)=P5ay$xfVϹC',\_*W.Ap"iw7fD֜4!)W(bȖC<]:mu\r-r/=N?']B`yъVVD30CG gmi_F`]\9rO-I*kѨv/ԊOJ7D]T-y(B  qA2g[IFe7њ%JLT5ys. K 4ew"Pe\`߃S) mv":OUDg}zgU]ǦspރYM=k3}ݷ Tݜ$yQ!H% .Og)ˏ?&',B$@Wm%&#adC4ـ 6 \<1Z ~.sQ )gz" ZOg{EmMr |}>{bW)WqjmVYD[sºx}$]U6} U4M5?a{ $SK!C7ǏU}q`Ԗg `s7r{,AhDq̅* ZbsOM<k>#\ ח&Q :*,Kvlc󾰮~{ l4j@iҕx}UuYZ)(zivхΧPAvLrw*盥SrFl6?2^x:B)vl4U^0{G1X Uq~D.[+&$,2t]Qg!+Љ ECA  b5  {#Ԯ?>ʬ`}[[>,Q" ~vi|"2D ]`wt@j'͝ gfJ)'-aWpȷ]Eq/_B"=,E4j9N/qy_| m\>չFuz(X΃-l ytıP63WuOX&I d@_Ԑ=1w59ЉkWhd1 [sTr$1U^U|$͆ 덺C,OS!\_?5ԭyV{~ O:n1Xe3:y,'I=j>w紣ܮ[5R49:z!4]˔l+E>>3Cx&WlZ@#60 :x?;?31Գ.I'- r*-.3m-k qWWw$LV 7f2O􌍇3qѭyEKsdi{g/LhHE![Sz`46aSœˈYWB.(x,4 ق|RΣS# ǹo̖wcTnn߅I:.ŠPQ [69vĈU8u9хQb &J'lx>Y90҃RVn>5@Wc͐v @&Ә$crmloW{0JL8k5c316kJgfٙ'wc&8 \ίAelv #-C+ncbv,%e$'DHwO£g[= G:E?{qZJDm(a4umCy-1wi(ìtjJ@?gT7 mvW5bȱɅ<d3J0|C>A f*Ѐ27ZMPڦh3R4K-cf*~;4ߠ &h;ƝN*E L\jeBz V2BʍSs .BEVy_>N@\Dkݦ+"嫈W,8)_l=A f*?Y82QNy,6M\ge/K (V9|0e(xl-##i#t޶4zRWU?"<%&iJ,Yg>'[9dϤ_p8f !D&B5 &xr CT%t] w$A-mJ|h okG;1h*w+2CͦNߘCۊc5]^^mbMxG ~։U_nrܚPAJo=[6n]j<6r<3!{SV͍Q $\e B1Dz49QwԮ8' Е#Z\jJl`=/z/-)j[/ l47eu!vs-9B/1->|gOݪ=/">2@~GaŐZGqjWt'#œ۵5%m4cl}tw /٤oe=la6w8g/7V`U-;ONDY ZDiȎ?\g~IvHZ4J]T` L&Y#mlRPѮWg#CSq{`'愋xCHliWK񾘍{]_TcLAEDE\6`iȕB8>'hȿH D$v6Xٚ24ޝs:_q/TXZSunKGRڊ?.:#zm#[R7M^RT~B}m "!?(!h1ۊMk+v-=^H{/cɿx׊4PR{KE*9Z!/]+Pr S+ PA!^<[x.֢սiHl@;2]t ϑ$Y|Y2t~vWTN$mKu;Fz'^d̮CӻLT6ʻ\ѻuGFm&&c3%@4lH ΍BNX8zB<>Y&E;.^$֧[cA@P>y`5C^t-K9`UyCO.\`^yl= l٥"9.$\8́Frv\cQ۪Fbwq؆)SJ+U dbZ0u *ʖs7 Jx NKf~H..߮=X̦{yнEm_Z~#,tف piN,@m}зpoݔ_t1ұv.oMM@S>Reժ_n|rn3ϼՋN9ÏIAd]D{r-5Vy&VqW{9NMɢWaTs;gݍ;@@䐛,5Q>D芒HQC{-R>avsTٹifgGVzz1Q#hI4p{ EؖU>t8[J7ynRDy"љ[D΂s/DQY\xV7飹IAOziHTGw{Z7&xsMc24GEudTKSSNj4

|K=Vo'D;Vنt9VOE Les {}[̣PY^|}:D~@O}oc%:BCRa7NP2 3`_:{vm7VGYfo)04޼Km$ >_g3)lS(۴BMnU jpazvZcO(|Aj硋0HZɂUeܭ|clncsA{%"d9qRمK>Ov-cWɊT4D/:[P\e'ah'lbzt eP&*eIyV}S./:f RN֮=lW{3+vX{#zyzJE+H ,X5WiQ吺ս"GqV΢ˌa0Z7qxT!au"Z[[0rL#!Fnr(Eh nv]Kز G* a\|ZH@ ^^)cc"{`AIJ;O2?b.OԌ}PN[qlXRLHLFF}#]2:n` ,~wʝz6Xsl\;㚤` $(=/AX'IÜƸ {Hޚ4k@`0H`\[G#, ie'DNk&AȊq{!$颍24 ĩLᝄ(nl%6b"_/2)٬8ۈ '.fP+`qB&V@k:]m31ϣdޓ2g$O nkOY;)mj,^:TˬO"dU|![R8G@"ccNݦꙩ1f:ڻWna[Pb6h0ƯA1 Jyϡ8 I3gR>Ł-TZ,p!~T%"H̩eo<$;3Prᒏ )Eb>/-j2iub4 g{ǁ,cN(D>)T`Nt{6?DCh9=%9i(v9ddn* E6_Cz<\h39 :qCۏã^H$;PTa|5h-)Lq%,Y tH` Y&&=o/#P sPbLd]^EP0ѩKz&U6P _rk9[ )P8QJ:)lޤCg&3o0l?e@qcLw!ڨK>_ptO/B\ y6G叕cr.)ޜ1Ә)(VnB7gK-̪ūz׈w '*><׀߰;ɯvFMi/~!;.3_^q A}B a`F^p['؝b4|4(ʚ;ʨP0K1TKKiYuX8f9M-K׈+LCe V0 nj~+:;7uH>Y*`vʥP ˦y2Y9U`}QC&Bǡôؑ[\hi ە`EohUw%kŃGs/׋w g\u`ź_ \:0P!E`ZdqKI`N*IqoZһܘ<`? Ǜ-tVt<m? p/:_1g=a-(ۂOۡzR$DgYy"ؖlOy"+S Zjө_s5@gߴem66"~YXS M E0vwIF G:9 `FI5پifLzpU pj5>NsF3ИtYU`7RU"LF"[ +fkS3Bv^.&Ľ8z|z+2r.%ь|S+MSvD>Q|$ &> Жى!WoG`ؾY]ŶSY}ErPq5CU-ȋe[R᏿O ޑD,TW=wgЕ/IQHԡ|s ?2ϳ̍=EuiI `ؐ{=[P\`*ZNJȴXp;9^|ZmUf{IÞ>3y-?FOꑠ~2JGFx꩛•%,$a 8bݔA`AS.$WeV+[fE䥪l^c( 䡞NtŤHW/ҊAO(W?qSoo΄i6 ӇZ5+:ڟt&R$^5Cxxxp@QB&s/|Aw7QHgG,PKnX!iySѢ0jg ?UR. Cu5#ʁE?ftO/U6iwق[3@.bq|vBbwM]rݛ3{M:,L?9+h4՜ݎgԙyGqʿlM7aPx9``YhyH CX!&u #`>Q\WL:D*Qo-4甔K-{Huc}.a3DYb{  UE sL_\Wb} F4- У=:h?K4X|e<@GmZ1 LzѾ4?Dږij" ڤK@GX&.Z+Xͅ" @W0:.~mnǬ[:xܝf]RA1e39z o`;hh1^)ޯѡ͗܋(O1O׿mApE<5rU(l\(S #&2 $nbnyAنYd.q[~H]h'Z+)u8j>@||q>Y\9yO }J7)n\' Et#eI " } }frD6x@6GM֓H$3UhzJp wBFX6 <^!pj;#{ 727Ɛ/&S`h1䡪̟2y]FW Lg2xb+~`)RFVUu a= *^L7 Wظu$m&5==,!^Z%{q@=Ob ;C:7fùj~vnY'҂MxOH7 [ bВN:ydsu9/W; tYN2!I#G1ID$Lpp;ڑ5~8>}˛ *L_fg\*-k2?}s;8S4XuIngr %uzT$_4~~Fʹ&L3_ 7m`➒! r:=8v&O%D6SW'khU^ Ľ" HkIb 3$Lq.`2Nim5D mǛ4 2uҁ GE2xF1`=mv?d"\c2 |˝lُkЙ&.f^ 4o4m]uC`1?xq1OUO/;g߅ *׸ZءE_ct,,o%@|'4"gxj~GYđ2I-!R2],* A\e4؅ @RIi2 klKPʊSi ,0I`rCC0N]atb E%yEa~~Kyc@m^O0.$vǭLqHwtr3(`I MㅛAo~~N0PxBdJ=Gk/T Ԉb8*'mťz: KC^YI9׶jjސSFf:q[[o _$C\eʭhqڂ@I2 ,9nHz>I7&5G@Rw.aBmܕN E.#O%FnjN;?~uG| [M[=(J'4nLI>kcAe">4Э ra$& t 7 g㩮HemSNH5p"8B)?6>աxnV_զ}&G@#\W[-K>"8-R-rΨZrW01~XX$z eD>”O! +fV`ޢb|<:SG涊R >o= R\2Qu!uĊ>dr+VLǤ'?yӡEmim:QEB[8xv#vSa$Ĩ}| J0& 8K$"AMYÅGE?+AjB3uſjaŸh6Hi`smm|dlЍqwI֗)zLht\)ַLf]$ XZ رxpc\:Ёg%^TU>_,PȠf̠i.r͠gum3Iz0 V ς?峳~,,A~ @!x-UӹR<4ayCg!x&AܦeH-W3_a|yJ \&`tEFvG+a? b0..ԴQomX =WR*!":PV2'r_R E 8+!Ox6ﯞIq jch쏆_c`#bðj?4$Z%"=-A M+Xj{3#~!ϡ>F[aH8UJ! CGCyVW$QBk3MS  `Ӳ6,xlD᎟ j+wŜLVc!Yj-Zm92`? ?s@xxfHHV8; W {JZnP>dJ^Ihb=.cҎ>euaT=\Mlza6"9uȀ?Ojo!NSV ^"gRcٓl1)G#_ jӜ]OYEt+9F7Ei fGgN/Eh* CAϷdLOpdDvx/+QLP+s%|~`[QQZY!F0urGxKn숚7 Pj*/O[7My!o哈jpY?(a< [ȁ+-2{y ~LnCD"ʻ/qY5]ފؑBz<ɇ2Ԇ⣌8LJ\Lit^k4p"{P=U>3 'y-g047[Cjw2>9}υGDR:Bwl`QƝiӡnUy#s࢓V(4w[2WWr弄e_eY6!ߍH.ϝ ); ^u(_lGTT&.+\pLVUJ o'sVk'wb:rM`Kx_;^ ʮr"kY) _E!7_o^[a˻̵k$!)qeG9G\lPӖNq,!B'oIafv6Z]mj٧]Iܯi"뒨u`K#C]ȨzE"5|rL΋Z D.d+>yNe~#3"a [u0HG!O`\*‰T̝KE:ڍ[ICYohW-*ϯ5(vaNu%X4_UW7 ;d{ kw(a] Tc6a_1?g r&1qXxzB@v,=:c=3 qKTev;#<K2Ӡ8OntQTG`1 ,&D~&b4(Ll㞤u21I8yE*Z) @LI@ڧȞ>v]i5o/z;W 3 rz^X\/DHJXWڔskU{b.߁KHYL 7HOct BWQڃ2UKܵq\bz>QCW,r>`vFSߧL@9~8߹HsuA 9jC7Q@}1(.L-F`eh#ٷ{jDٹx>e=V|mf6{4u KGd>Pb =wf՗# l4ltqW%~s cTe?$/̩̀h@ʤF8Rtp2eiK ΂DP#p}IF>NrT}outl2Q򦣫FM;66LMX4W;vcGkW *|vFɡ.@#^-*ߛ:>S1Cet 8 o/L@klᆴ3{]cah\'qՏ}>t:ϧ2=d'Yو,!D`Cb *Tdx*0$$ *=9ܥ2EM*92ܝnfO6iEۑElͿ$}B(`l%-Q-UV}\=Lu&VW7yiU[h`ރLbݞZq8Q, n{NL4bj>i Hhު ʪ+ e|ҁvbr dxs \I+n3v3zy7^^ qDSSz J7_K,?5>!"*<X]JZt6ެ.CZNZ!\`ƚw Cםo!ҋפ˻R6/D󁑧4&eX_jW%dd${oi-sP_kN UŠ8W\Iۗ' G"_MhԎ|+)VbggNNV+_tBĄj)=zlqϨc :ꦶa8_? ɪbjGbw n(jA4"AH!g(Fi}i'xkz-s0ͤk<)$b._yc XܲqHj0_7_ |M#M X˜d~l#AƹZdxM x!拎u ?ӝR^&i nP Į $VZ}?UJьp[OԴUMͫsTbz̈j2rf;Ί6wXyw&dߧp7Bd䲺wՙ~f ;ɸKҎЊͶ *R/_Pc^Aok= @xv8>ZWU:Ee1KU5p??/D ;tX֯zLL~pn}{٧ؽ1}p*:iX@Hn 11}WF~f\Uo [w9d2g}JšnXzS8S.G<؇Ņ(?yJuy*|b,}K=XZ-wq~ XuO+/E ~{!({5=16YTS@ˣɂaPL:{drǜ-Wrꢼdzh$䩖zW'd #$| kM"N t*ɉ'uo_/>Rϟd}>07vKtٳzjG=PRP8Izvu L8dޭ Cβ`tD7&0jLX¹Y.iIaY ^ؿ"MhK$d%Ȕ4 T*j9̀~P ݅ӈ+1؜|n.pޒ Bׂ`? 9kP+{#Kr\'0pCXbS| xA%Q%T&(މFmLwiMIXůLчBB8j[dƣy0j;tcml{#NU( |=PO}I "bDLǏ&2C!t$]Y$?]b)Wk[0G]zr- L=窧Cg[HWc/'"K+mʏ"7Rv,#u632HM#Hɜ;ڹID,"\wyr<(sת;H̻=</N (̀R1@#Wc**ԝ-DGsy pm Z f{iASMKFCec=IC=CgĜ<;u/[ݸ Aiiwv.n؋ɒ-Ԉ{~pӀL\$٫d'Cu>c} >, 9',\)n+L{wX#bW杨1 vZVw)Tm`CiPmb`E#/#z+_ F$3._ƵF״B@;.b4AwO6hȅ4 TTXa/[ I+Ot34x``gCTKY%1D 1$C';PI!Ӯmk\43u>3~8pZ'Ṡ\h,pu2ް#ꪋr^*fZQ:\"p;uK"Fl+4VyV-==ǬplFQ.qb6.[5گ$uKퟞ9c|Rd gĪC% |6ҚuRPP]#7ˁWAeB4д" S!z785$K񰝘KR4 uw[9G'+ pXj{m40oaߩOTtG ;H@!nC[3{QT!KU*M؁nS(jYTړ-G3k=qW)y_E(EbV{ݕe7}V;$"֡_,#r@{yPN%JietGgקg/ʼny7Y=3))?ɍW [*(wUa-p+dc4B},:oǶFr}X!wj\F,M`KJ*2V ħn u`^=4.n6fXrB [ow=L0⟼,lݵn 0g.2߫̚~J:5 ʓɃoUζ>]]ĭyRl^9,~0kFB xs|eTr_nuց˝4!F9cxϫɍT'=)e61|v4&_\^O'Ww &"o.6c5""0FCx]kOEH2) r[2r(1&VGiUMceӜm;qNij'BVf0s5 5+V{i D e}XQ~&.ѷoyĘbv(E n3(D[ O/E%RVf=T2R&tȆ(Gi98UBxHy!緟9s4=(ElKw< Nq]€8XڄEU@ؗLW%\.~'UCmĽh`d9)3DeCClձ,Lnz>AfmHnZIWF1XQ_!\\:(璲7^RPT|4g fڠ "jf+Df1;/aj|97o'#*4OAdXjSDij¢Mz㠿"jSvF:xݜb6HЇ̖STw 0YƔ|kXݺP'1$E@x@5f C)5`W2 0͓t.a$ K[|Q3G| *бcP`f v>G頀[Zr<ъ![OUѢmuU7le @&(jygt;#n~`ΦŤCm-Jn=O dV`*]s5$_ Wл 1 i]5XP}f['Fzծ{k(Ws}œgׇء.N ?=C«д :0-c# -+QWwc TsdU,jjEHc\qo %1"20%וe}&yKr[%Zm"dL/ l6GSf膾RF\v^G .,v*pnA˻Gu>M4 <ZD"LT _1@Y#KPt})CR.ՆW\m')hJt8wlz'!`>Pbd!N !7_>siՑ+M- *Ji/h ՂoB1.SLajzhu`o4q?N(,h-Ef=>v bd4\*ـx'mlI >L ;qdS;R7{R8)޿ZJF"t._?Ž Ca ?^7Zһy6EіHKS.ͮd:ƩnHK}V1}ɉ_v C YNaEu3: A{k#mF`ԼxEF/_2\)yhSQqj絶ss!"~~0^sI ?Ļb_YIM @uSLjr"re(& vѿ2j$ƞm7,fÖ nP?$H50Δn!`ñbn}6^iyZp#pzh+qxl!_GTrh5`!]]hhTrO7*.)Q&?9n,(gj9ad&&Qu|h.2AƩf`f<8Z^6M&ךl5@4]y۽U{ZKPsUtӅw`W;,W:f ,W- qPR=G}0F<9@AWEi]0M;R{!Ʊ#YSr4 bF)FqSwrBs'N*ourTfeN9|Ű~Ϊx_x ۓMP៓<b!Eq]GnI]@YN >J9-Z5?@2v6/yTp왉$+1ލFUZHJN̆$vXPV 6D`rQ" *:iIHڐE\߃L=cASm4Lm0"_ͪɜ4ne|΁D0F;\hTul-U^?36V?}N+;1. 3Ȝ1Kii3Ǘbt^M㌥Uxdw3 AWVu;h1y0h?M^ǩ짂ҧGM28(L)'*[\ݼUkX^G )`i4O]`!,˥Itj)sֽEHSx>J}l_ 0CM|waz a5Os10' ArLCG[pDȡ԰Ǩ|@̃5ҪvkgNO ]Ge,DN:bVO)rGC˫.9@`VOgҥH Khh6`q;#ECCk)̻YK?[򧼞;5]1$0IhΔY CoiouyuO`?w XTuiEM㪸hf-{EVJvǭ](aEn>spPܺ -p47`۫k^κ~q MH x3g_A4&Vv'w{*bŇڍ4IH _׍Ռ6uT/<][y`˚R`osFzECud~-7=٣ҹ._p X]۲3+^9.J` ^hp[3zE8N=6#̒Т}9r t>(˹7w8ag20mz` lZHVwS2p:LZw@,.3Xy!V* ţ/(ZIru9}[߫SJX #xHE 3Iu>6 IvW&@D#2<C]1%&;~|7i0`S9 tORUGa1)ȤǣVK] Q\ćf `u SQ-R>ԡj@\ gGa*Xk]GƆBܾ|!,sv4m$ "6ɉB|/oc^bD J8Y(y!,9 N/3&#aNtƖU, +1h%[egxx1 ڶbU-tjVUѮruW BތR#Ͱ ɷa>0 YZsp/data/meuse.grid.rda0000644000175000017500000002365414004036330014474 0ustar nileshnilesh7zXZi"6!X'p])TW"nRʟ#ߨaTYd{ %o:>Tuj(Qp!mݧ {Tdi??Df(: |9RZzK%01\6j黲hlF!ğ,f&ORǜ\R]5tSg݇roq¹)7@o[vb ,>W)$a5$ZYiePaPf슱VaGMͻj|&tB/>ViϩwUo[dDmk""k}):=w{QH%!\S9~oWy ıowoYĶ'jNؽP_ "~jnWĎGsd|/p|4T^0+/?.B= (@I?|M9tʷ@(U<<`&ƪFy6>ٵVex-D@5^? OP9>W}()+zIiuq/Nlk>E/pUğv|7|˖h5\24vy9jۀ0F݊,flGux)tU#{ʫ]]KsrV9\v϶ޟ#e˞."(TQsAxMuYRC{ԏ&I)QHR0Drk!_O w"x"J kPz9O}Jdbz"K" ė8/&l>'OvЖ; а~E QB?|m2CՓb{N6$47$+>V>^ s#mc}_bj\8G8ϖ/R".UAb_oLPD>249ntJٜ<̑fj6s2^U\"<*zHl|~3M#褑IhJٛ섴ic;_mxܐܙobꛜH:dU פ)7Ց=^Z:!ԑ[΢~LS#95j9}=[I*:k̎zۄs)wi+>Hk|ҘyS@RY~HvInT5A"$_7@VTYM2_=BB66@|A9~\ܙ@r I {  ?u>}#0ϋ٥>Hswx'>4Ve" pFٹ!y+X} ߾K]ہ : Xm7#\R^/{8` Ֆ0PT=)MVCSfsO֭)kkduπ_QUEG PJLzV4<4Ch>֝ 2;E[XU4j$c [8g W׵{@=ɱ6DJ]<̅}5PUAg?ҕ4|o "wewsn"έ.}u)y SՉt;"LGk錠 LBԾxX+&7vr%?~(]`I-zrVNq\x"IUs ,g:Z_y$ZZpȰNWM@\ i+s犓w,uT'OӸzحy_R% Rc.(4r깠 ?nFt~ aD ou)\D#7'Mkݼ$-8&f=XAWRFҵ#']ѡG> aXǪQ=miu;.X>by]3C1ҟ WZ~GfkuVe'`BnHNrr3ΐw\etCMmD@מvV̢U\{I-\po5=؜Y!lt9}&mtz[Jlj3-1l7,>@zѩ7A[C! ȊGA(J:>dE~K&%lF.4D'߶TXNY?0-}R5)!Sa5}u5%ZK;g_`q F7KD=AEKt#ە/wN Mj}S(IŰ omi͆!#TBXXͮ3F)oEMҁןpJ"syǤ-CB( gB7 >;̾-zN̔s%a&d|\ZR,-."OBBIk.+?m˜*q/Jod)wg1tof{w,e* pQw vmh =lLDjiUowKtZijZ arSL&C֥|#vRUj!Q}~iߗ1#oILIiLz1XiӅ]!ִpS*KT,.'}K"cc bCey,e MۺLg51li_="٣Shek`a|UvBNlZgܸ' HQDp)wY(kmsJ\Utg/ ]6eoRW-Dv_` /TL3{LНePi89lt /Ebޫݷ|Ք !I5KAH(i, J̫^}XhuSe{U8XoR4Dl&L}ca\q&8PB&RQ̱'&4^_& B$F7"C /̗?~NY8+tbԥQ@^uhx D5RG \PC5=>6کFn.աqM6ֶOv+$-E0ЌJh>B ˘vF­NR<('׋:z521*RI\9a+gNXUb%,~S$9RX® :iϘHh:{5Av""_ޏ8$jWk F/>J lj䔪R@V~>KV*&C\?8XJHR o6]?`}Y=J=>O| D0W;PC Nyxz.JGH |_r{WcayGJpop#AMQ qa2F ]&S*wWG[E'ސM6iV{><\kB6L72x a@XoW'T ༈b{1!h.u և= ުjnj%x iեI;5&AtBSwIcl0\OjFmvp-J2]Sh2 +$5Ӆ%Lt4陻u#fB?Lf'l* xY8 ;qTYԺLh. ['0fGp- Xq&@Z^/M/sY5 ǩLJwP̆}O|$*zD]g[Xdh[l6nhW:@I;<ԅy K`6[]=~ [*7T%sbd~kcy=Vb@61q_񶺢Lp+u?j:m1o:J:`X=|$n[pޚ.G3Fhln+[ O>/x+O1H.'yn.IUgWg>G8ΘrQN M#E@R.~U"Z.W$Oq*$)[!SKԫoc_|yuqK&a%_xi hW97z %]L~u aq( ↾Z9v16ܥm_*%D0UQF؇G LU.- M~tOe%굏l,wq sЋ,-Bs=١"e|5"sU~L9 }̓u7]Tޡw[\fNȂ{ b!h2D0ɿ|\S]ɸ;+N1/qZIA Ĝ}x$2;k[;;c (c{w';GR UH)!Ti=eFzӰ0Ilq/ƈW=Z*J9 yGg:2+xnerӉ}%JyDaV[a.qj&-W// n{9ܤ `K?Ph'n; H\Z+@7Z 2YJrjT]ܚ0 赩א3sqA[{}ݠ3_Z+E%OIG/+nzۣ,$A'J VF~mC|OWd͉Iy f}M\=|^~ .{Ga4| rh1Bm^g]hk%@g[4 %O5zlc+!K%rj27ބ%#ɴQк29HeP[ІqFۭsftE+g|Uْ,GFt11 Sb>ͧ[1لΈ0 r܇Eeɂ ʷ5|ɦg ]ێ*}͔2>O#Fw<<ùx>lq sy(=+ uYR3˩뼘bzo(nͪq[ͨ^hB;jENY,/V-*~-P*цDKH\?[zG.];L~P1`;0>Į/'Fs2Ԣ9 X:L'F~`Vc |zCn5VJ]৳& (.Ř#_RVmi?pO Uqp)@S(?<5ħBJܲ# $yEfPpQI դ/&:/qQO$cؚm^ى:i rٓpPO D'Ka zwUk+ -}^q?ԕQ%XeYޔ~&dv&2ͪ*Va:Iac{TCڢ̪vEZ zOE TYdW[Q߱3d$Pu R~"I?G-Yf\֙?{9= \#A.ڷ0.(Fqf6 ^K-QosHc/ˆxsd̛{W}mA kŹXFgDUO,>%=.ޤN Fe%/QjH)_z ŏ"杗eL%ZC㥛X2d+s_p>!^@!2"pkǂHqȬ%؃\U%@sd()U wBIFy+'RGMd@aeR8vQ^{[}۸ d]oh\N#œRщ__,-_sɴ$$LA*zhȒ2՟Pl ʌ[B TIaALSUv@p /p `+Y -ҺWSU&"gNgk綁=Ui݂TO}s{%dЖJaN-$z9)XPzm|>H:8u z@YGKH`,Tf(^+ S Zt|B ޭ pYf[@gw)QpՅ9a0U.> ? aq ;f|jΞ^w_Ь99Sbccz̘2+,ͤ2E>u@h(ud@±z)ygBSw@@G:g?[x\iƣN%v@)֭qGUdtuv8}aV) ] b[/ %D?y9Q?rBЏu9f]EcW$1:U*TNWx!:`?zO_*/#1o{޴+!6A.E^XđQ&ZK7>AcTrLkk"4utDf$dĂ|>1O@:(I7`zqhӀna]uz1SJ7DP0 鼣BJtPK@[9(јm{cKvVlź}M 5⓹z?U$I]uH&je: \}1W(O鹽oȖy1dKϲsqysں/d@Y#kw.onnlIr¥$6Y>]tCq}m_BCu)ɣ5Y!I#1ȌoZߛ \xAr$gy;' X?= <ʗoIyp\"G1􈍳y0Z/AQ5q5{y1x5RCBvGvLc)AIVMAlL^*Ko+f2yJݏ&/EPW2f cq64+GһAr|zu=X69-gGs>S[x*o4xV߁qJlձoqT StC35Z!(5?!Iv[/}Cc\N%Ho2 ոh`IBg7#Ew ɇ.0w;[zMV2C @5B%T*-9*-D3F*|u=HUJ..;x' uy00u탁wz{/Pr='DsӆoߕYBԬVNd`}=s'1ŠW$7Ep>>hwVl-R\w5 ʾ3i`m7ؠ1ViAFFPBo ]}U"| :7}^((,ƣYi)읩s3nn ߱0 w<tXmo+ąz'"Jgrkb$FH犞nQn8#gs tSȓ#pQO@%N^S S kQGTE t)Na8~ZHolIJ>\'G AAd.]/@SAXO9 o"1J=>JZ?tvDai>ɓ3ѠWřLgʫtpM3[kSa)a dX\U@?aˠ 0c;[X1e ,Td bD/htՇ7@:[:?o=)wz%|fW? U+G|OH+V'G  ,R5_y&+Oid[,Ȍ?^"wD ))}*yH ֛٣ Z(VٯC $Ρ)ht?~KjЧj@ w]ue{U&vySQ{2)]&\eV 1 ̫E\OΩ H>0 YZsp/data/meuse.area.rda0000644000175000017500000000171014004036330014444 0ustar nileshnileshBZh91AY&SYESjQ ^{#`@@@w{ ɠGih 4 P4U4?Rzii6j*TUP& @  d=UUL i4a FhdiɁ`b0F 0   C0"TQ @ d O)hhW:AcDtQ 莊PHHATtQQ*+B hP$"04B$`D"V!XB$"7ZL4'ʬŏ4R*\,0lc. XJT\.-VBiĭhƬ5aBZƭ1*ZnUJqu\ƫJdHҙV4Vաu2.c[ieBhaK.4ƫV`)%0 hZ4Y l6h%vr^c]xׂ*b B=?moYYBחT&ϫB5l 5“ikl PЄebJJ%1Mx `؅~8rۇCBb0`"A#{B zK>~\f!5ZU; ݧmpy=+ƃOv] |jB,!-$!!"!d-T-!XV%LkҪHHI RHDBB, e [ $ *$ $([!)l!m [H@% [H@B-BJEAE ,+.T/h>oFˋ޺4Ga2)3L>oWMzT i?S 0?suR!#"2++)))\p??KQ %L59I8g$!$XB! \@ \*L.p Ԣsp/data/meuse.rda0000644000175000017500000001265714004036330013551 0ustar nileshnilesh[ tTU-D@RJԔe"9*bF H d$b-(-|q6~5AQQFgdP*3ܽK=oZ?ks9s}^ѯsZJ5` ZaPO%}utV,%>hP9Ĉ %6_']b$.$&K]b%kI %V#ZĻC$ִc }D#O8ȧ)u'H F= KO5]u_S%[ 땤'Y7u"^Rd ?/P}c=#~-󰞆iY7 YoqY'.U{@úc{.A?{!2_. ~A{nO֝ WI܌m~ c=)}T= KX*zC}+2]NF[ՏzGgQq*5ԳJ Ї1!y? Q ؇KطŨ?#ȣ<\_^$># ?ۑ^Pdg8-y\n H)?tp,槀I^H z9_`w d=>C$Y0 #I%WC=u)xgw{uEݺ5va?^%+g$suG]w@w? Pb[ٯˇ;w!8{59VVȫU N˹~Q Crmo~m {G3o3JlzDc_,[E~^ěk{aJ>>8џ^ƃ o;5mS|4Ď跎btAqE2}M>K<ӍyKطD_66D1r (!R/Cׁ:DϚ fnFM4V'?Q_.|EeW<Ͼg)LnK!>y`G` ^DA_?2^t3ɻ;Rnd1>/әzoGY?/?$gxz-n>"LvbN=ksǸbo9oڵ_ j>\gnry-O^yZ&KqXCJKL̗Kyu+vcHۧ.zcb x.xy>A@ 5{2ySeJ(L>] 1v#s2a7癑'q* ag݊b<ҖKL0̳Eey*s!r AD'm8`>d@}6<~3!O<<#o{/'>rv2'r^zI\\K?,Ub6yv:q_*6L8C[$DS8X_8? Y KXϓ8*_(z:ss(#_8a7򑈿OX\1/Y$C?'VMޒyỳ|F= 9,Ⱦgb_f"97SN<:q Bbn!.^8J|~g<urA$D֣;~Fxd_ >%fC9) >ξb4B(k-|/W3 } < }k'IyF1N ̀W1+1vd_'BoJ }5C4 "?^q,E>dCm=73#E73mMyʑn>"=U^DՙIDtsNJpzwo& {|"|j וtM Ϸ0V8Ëa!MEnkDž5]V|poYcPPp.^|K#G=m1=t;"T5:]S8j9!/o7R-{)"7o?  {y; >~}k^N$3= 7*NITԋރ>a";+ҿIDe~aI?5|'KD}RX\2/8_?JΏwmu~mFDNaJ2|Q_q Ү/6KN]`ܨ-'Sÿv%zueڟ|3ZRצVgmdPЯ'-[PmvE^LwZ鼪k8M ԝ-u?Im_~mĢGu)31Wδ~ڡu_G;ƪ{ж>>Dۚޡst?5wO ~RtJ틞gRP?g=ڪs-;Jźq}k{W>x؉%:VaoO.M8}<`}ٚ5GtuR틼X')yU{V;vsvŢӛп]jԡ.? ܓޤv=z-꯽^ižkmUjы][{#5] x]zoX}ܚm?Y0v{7?m8UMU[23jei%TGd߽Ӽ݇6+-,m>1k.m|GS!m : X"%4: }s@~/M`L7x)G!>V Ds+BqԂ6p|^zŨizn]9oKYfVo^uY_ֻ|^Ǵ.s?(w@?)nÝj|;_7w4dEkkɿo*2!k:>SfWϊWI'̇++E>k;+k0Wb_**j Zű&<7ӭ_U17*Uθ*}{W$!"'q]s`<}Ão䟿J/wX̧J䓽9Ld> T ?|#O].x??돭8}"3~!>>Y.ĜO{b^By=g V?ϭ-_3ωw>'}//4=dhzdR/.MdSXd"}~\/yy'1g}C>vEg$N\.}_hf cدKߌ>f~u,>c&0c~CMȾy'1䅘s;[!nL,~d19:yyYder<){LYGK3K?aRe\nvr=:9ic2}'>OFϝЪb.Ko7sA"U85rKjQ#ūQ)p*p*p*p*p*p)p)p)R]ʳ[yv+n٭6-q_{}]a{ {!b_Cި9 #ߨw9vQpbP_Zw[u7 μoG?N_a Mc;S?cz.`o]^{ Ey{NYU;y/#p˙Gwf6qOԆxu:Z; VT`/hAOT.sI-na2s5 \UYy]Ƈ4޳N>:760b?yβN BkX7d" ]`. i@]Ԉ? ؋.!?l,'y эme~3Tߡ!Iޑ~p$'qC|]9u~Sgewl=S[ck/F|yl}:˶m醙TQkL}^mR1B}@ߟD W uMλWaOɦ1dJ@]W_=EZ.\ꋘ dhy>'!|:ynBwH"ϔ}T+y2}/s!<+ tԱ/}[PD?/9\*Y(j9qžz- =2&7*˖, p[Jx̣ss_,/4=i{_ sp/NAMESPACE0000644000175000017500000002140113660452030012242 0ustar nileshnileshuseDynLib(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<-", wkt, recenter, show, spChFIDs, "spChFIDs<-", split, sppanel, spplot, spsample, summary, surfaceArea, spTransform, rebuild_CRS ) 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(is.na, CRS) 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)