sp/0000755000175100001440000000000012321321642010706 5ustar hornikuserssp/inst/0000755000175100001440000000000012321302443011661 5ustar hornikuserssp/inst/CITATION0000644000175100001440000000201712164227555013035 0ustar hornikuserscitHeader("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 = "http://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), http://cran.r-project.org/doc/Rnews/.") ) citEntry(entry="book", author = "Roger S. Bivand, Edzer Pebesma and Virgilio Gomez-Rubio", title = "Applied spatial data analysis with {R}, Second edition", year = "2013", publisher = "Springer, NY", url = "http://www.asdar-book.org/", textVersion = paste("Roger S. Bivand, Edzer Pebesma, Virgilio Gomez-Rubio, 2013.", "Applied spatial data analysis with R, Second edition. Springer, NY.", "http://www.asdar-book.org/") ) sp/inst/ChangeLog0000644000175100001440000026551712317223156013463 0ustar hornikusers2014-04-02 12:15 edzer * DESCRIPTION, R/Spatial-methods.R: pass on ... to print() calls 2014-03-24 15:27 edzer * R/SpatialLinesDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R: print methods: pass on digits argument to print.data.frame 2014-03-01 15:49 rsbivand * R/CRS-methods.R: tightening CRS NA 2014-03-01 15:07 edzer * R/CRS-methods.R: simplified CRS(), now accepting CRS(as.logical(NA)), reported by Robert Hijmans 2014-02-22 15:56 edzer * R/spsample.R: quick hack to regular sampling bug reported by Robert, not finished. 2014-02-16 17:45 edzer * R/spsample.R: take right cellsize for correcting min.coords 2014-01-27 20:01 edzer * NAMESPACE, R/image.R, man/image.Rd: add imageScale (from image.scale, r-bloggers) 2014-01-27 16:46 edzer * R/spsample.R, man/spsample.Rd: repair makegrid when cellsize is given, modify docs 2014-01-25 19:23 edzer * R/rbind.R, R/zerodist.R, man/as.SpatialPolygons.GridTopology.Rd, src/zerodist.c, tests/Examples/sp-Ex.Rout.save, tests/zerodist.Rout.save: move example to \dontrun{}, took too long; optimize zerodist(..., match.ID=TRUE) further; remove warning in rbind 2014-01-25 17:40 edzer * DESCRIPTION, NAMESPACE, R/rbind.R, R/zerodist.R, man/zerodist.Rd, src/init.c, src/sp.h, src/zerodist.c: zerodist(..., unique.ID=TRUE) is now efficient and will no longer create all identical pairs. 2014-01-09 16:51 edzer * R/disaggregate.R, R/rbind.R: added makeUniqueIDs to rbind.SpatialPolygonsDataFrame disaggregate.R: patch from Robert Hijmans 2014-01-05 23:08 edzer * R/Class-SpatialPoints.R, R/Class-SpatialPointsDataFrame.R, R/SpatialPoints-methods.R, R/SpatialPointsDataFrame-methods.R: remove useless, outdated and wrong comments 2014-01-05 22:59 edzer * R/SpatialGrid-methods.R: remove historic, useless and wrong comments 2013-12-25 11:55 edzer * R/merge.R: improvement/bug fix of merge, email Robert Hijmans 24/12/13 2013-12-17 17:49 edzer * DESCRIPTION, R/SpatialGrid-methods.R, man/GridTopology-class.Rd, man/coordinates.Rd: version update add coerce methods from SpatialGrid/SpatialPixels to GridTopology 2013-10-23 11:04 edzer * inst/ChangeLog: update for release 2013-10-22 07:12 edzer * R/SpatialLines-methods.R, R/SpatialLinesDataFrame-methods.R, R/SpatialPoints-methods.R, R/SpatialPointsDataFrame-methods.R: change defaults digit=6 into digits=getOption("digits") 2013-10-15 16:35 edzer * DESCRIPTION, R/CRS-methods.R, R/rbind.R, man/CRS-class.Rd: merge checkCRSequal into identicalCRS, this now deals with object lists 2013-10-02 15:53 edzer * inst/include/sp.h, src/sp.h: synchronized inst/include/sp.h with src/sp.h removed non-existing function declaration 2013-10-01 16:04 edzer * R/spplot.R: added check draw=TRUE before creating axes labels 2013-09-30 21:38 edzer * NAMESPACE, man/panel.Rd: now exporting bbexpand (needed by spacetime) 2013-09-28 10:30 edzer * DESCRIPTION, NAMESPACE, man/panel.Rd: exporting longlat.scales (for spacetime). 2013-09-27 12:22 edzer * src/gcdist.c: indent 2013-09-26 12:51 edzer * src/pip.c, src/pip2.c, src/zerodist.c: changed Rdefines.h into Rinternals.h 2013-09-18 07:40 edzer * R/SpatialPointsDataFrame-methods.R: removed constraint that attr(data, "row.names") has to be of mode character before matching IDs in SpatialPointsDataFrame() 2013-09-11 09:12 edzer * R/SpatialLines-methods.R, man/SpatialPoints-class.Rd, tests/Examples/sp-Ex.Rout.save: added coerce from SpatialPoints to Line, Lines and SpatialLines 2013-09-05 07:50 edzer * DESCRIPTION: updated version; removed Maintainer and Author fields. 2013-09-04 13:33 edzer * DESCRIPTION, R/Class-CRS.R, R/Class-GridTopology.R, R/Class-Spatial.R, R/Class-SpatialGrid.R, R/Class-SpatialGridDataFrame.R, R/Class-SpatialLines.R, R/Class-SpatialLinesDataFrame.R, R/Class-SpatialPoints.R, R/Class-SpatialPointsDataFrame.R, R/Class-SpatialPolygons.R, R/Class-SpatialPolygonsDataFrame.R, R/dms.R: version bump, R dependency downgrade; reverted to pre-3.0.0 representation() instead of slots = definitions in setClass() 2013-09-04 10:30 edzer * DESCRIPTION: dependency on R 3.0.0 2013-09-02 10:35 edzer * R/SpatialPointsDataFrame-methods.R, oChangeLog, svn2cl.xsl, tests/fail1.Rout.save: reworked the SpatialPointsDataFrame construction checks. 2013-09-02 09:49 rsbivand * ChangeLog, inst/ChangeLog: tidy 2013-09-02 09:47 rsbivand * tests/fail1.Rout.save: test output fail 2013-09-02 09:13 rsbivand * .Rbuildignore, man/merge.Rd: .Rbuildignore, merge line length 2013-09-02 08:27 edzer * demo/depend.R: tidy 2013-09-01 14:06 edzer * R/SpatialPointsDataFrame-methods.R: added one more check before ID's are matched (row.names need be character) 2013-09-01 10:12 rsbivand * DESCRIPTION: revert to Author/Maintainer in DESC; change rgeos suggested version 2013-08-30 16:54 edzer * DESCRIPTION, NAMESPACE, R/over.R, man/over.Rd, tests/Examples/sp-Ex.Rout.save: export overDF_for_rgeos, for rgeos; define this function in over.R 2013-08-29 21:33 edzer * DESCRIPTION: removed lattice from Suggests: field, to address CRAN note. 2013-08-13 19:04 edzer * man/Spatial-class.Rd: tidy \alias in doc 2013-08-13 18:50 edzer * R/Spatial-methods.R, R/SpatialPointsDataFrame-methods.R, man/Spatial-class.Rd, tests/sp1.Rout.save: [<- method for Spatial*DataFrame objects suggestions from Sebastian Meyer: - SpatialPoints inherit row.names from SpatialPointsDataFrame - selection using [ of SpatialPointsDataFrame using row names (character) 2013-07-22 08:13 edzer * src/zerodist.c: zerodist() for longlat data was computed falsely; see https://stat.ethz.ch/pipermail/r-sig-geo/2013-July/018930.html 2013-07-18 15:00 edzer * R/GridTopology-methods.R, R/SpatialGridDataFrame-methods.R, R/SpatialLines-methods.R, R/SpatialPoints-methods.R, R/SpatialPolygons-displayMethods.R, R/rbind.R, R/spplot.R, inst/ChangeLog: tidy (un-quote first argument of do.call) 2013-07-18 10:29 rsbivand * man/SpatialPolygons-class.Rd, man/SpatialPolygons.Rd: comment documentation for SpatialPolygons 2013-07-09 15:28 edzer * R/sp_spat1.R: changed setClass to setOldClass, for registring S3 classes. 2013-07-09 15:00 edzer * R/Class-CRS.R, R/Class-GridTopology.R, R/Class-Spatial.R, R/Class-SpatialGrid.R, R/Class-SpatialGridDataFrame.R, R/Class-SpatialLines.R, R/Class-SpatialLinesDataFrame.R, R/Class-SpatialPoints.R, R/Class-SpatialPointsDataFrame.R, R/Class-SpatialPolygons.R, R/Class-SpatialPolygonsDataFrame.R, R/dms.R, tests/Examples/sp-Ex.Rout.save: replaced "representation" by "slots" and "contains", as the documention of setClass suggests is needed by R 3.0.0 2013-07-09 08:52 edzer * man/disaggregate.Rd, man/merge.Rd: tidy docs 2013-07-05 10:23 edzer * vignettes/csdacm.Rnw: mention that csdacm was updated after retirement from asdar. 2013-07-05 10:21 edzer * NAMESPACE: exportMethods(merge); this needs raster > 2.1-41 for raster to pass check. 2013-07-03 17:36 edzer * DESCRIPTION, NAMESPACE, R/Spatial-methods.R, R/merge.R, man/merge.Rd: added merge method for Spatial objects added an error when an attribute is added or replaced with the same name as one of the coordinates. 2013-07-01 07:27 edzer * inst/CITATION: name fix 2013-07-01 07:18 edzer * inst/CITATION: mention second edition of ASDAR 2013-06-30 13:30 edzer * inst/ChangeLog, inst/doc, vignettes, vignettes/csdacm.Rnw, vignettes/intro_sp.Rnw, vignettes/over.Rnw: moved vignettes to vignette directory 2013-06-30 12:43 edzer * R/disaggregate.R, inst/doc/csdacm.Rnw, man/disaggregate.Rd, tests/Examples/sp-Ex.Rout.save: corrected disaggregate; added disaggregate examples updated csdacm vignette to use over() instead of deprecated overlay() 2013-06-28 09:04 edzer * man/Spatial-class.Rd, man/disaggregate.Rd: added documentation for disaggregate and aliases for spatstat S4 classes 2013-06-28 05:46 edzer * NAMESPACE: export method disaggregate 2013-06-27 20:51 edzer * NAMESPACE: exporting spatstat Classes ppp, im, psp, owin 2013-06-27 20:45 edzer * R/sp_spat1.R: removed class tess (which is used, nor exported) 2013-06-27 06:54 edzer * R/spdists.R, R/zerodist.R, man/zerodist.Rd, src/init.c, src/sp.h, src/zerodist.c: zerodist and zerodist2 now handle longlat data, using sp_gcdist tidied spdists.R 2013-06-25 19:08 edzer * R/SpatialLines-methods.R, R/spdists.R, man/SpatialGridDataFrame-class.Rd, man/SpatialPoints-class.Rd, man/SpatialPointsDataFrame-class.Rd, man/spDistsN1.Rd, src/gcdist.c, src/sp.h, tests/Examples/sp-Ex.Rout.save: tidy; added $ method for SpatialPoints, such that meuse$x is found even if x is a coordinate. added methods to convert from spatstat (im, ppp) to Spatial objects 2013-06-25 17:13 rsbivand * inst/doc/csdacm.Rnw, inst/doc/csdacm.pdf: adding footnote 2013-06-25 14:09 rsbivand * DESCRIPTION: add vignette; fix line length issues 2013-06-25 14:03 rsbivand * DESCRIPTION, inst/doc/csdacm.Rnw, inst/doc/csdacm.pdf, inst/doc/intro_sp.pdf, inst/doc/over.pdf, inst/external/seamap105_mod.csv, man/CRS-class.Rd, man/SpatialPolygons-class.Rd, man/SpatialPolygonsDataFrame-class.Rd, man/as.SpatialPolygons.GridTopology.Rd, man/gridlines.Rd, man/nowrapSpatialLines.Rd, man/polygons.Rd, man/recenter-methods.Rd, man/spplot.Rd, tests/Examples/sp-Ex.Rout.save: add vignette; fix line length issues 2013-06-24 21:09 edzer * R/SpatialPoints-methods.R, R/disaggregate.R, R/sp_spat1.R, R/unfold.R: added disaggregate functions (not yet exported); added $ method for SpatialPoints that also catches coordinates, as meuse$x sp_spat1 has the conversion from spatstat classes ppp and im to Spatial objects 2013-06-21 14:11 rsbivand * R/CRS-methods.R, man/CRS-class.Rd, man/is.projected.Rd, tests/fail1.R, tests/fail1.Rout.save: checks on latlon and lonlat 2013-05-23 19:29 edzer * R/Spatial-methods.R, man/spTransform.Rd: added spTransform(ANY) methods that will stop and point to rgdal. 2013-05-07 09:12 rsbivand * R/SpatialPoints-methods.R: guard against non-finite coordinates 2013-05-07 07:54 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: guard against non-finite polygon coordinates 2013-04-26 08:54 edzer * DESCRIPTION, R/SpatialGridDataFrame-methods.R, R/unfold.R: scaffold for unfold - nothing exported; improved coercion function for SpatialPixelsDataFrame to SpatialGridDataFrame, thanks to Jon Skoien. 2013-04-24 07:05 rsbivand * ChangeLog, inst/ChangeLog: closeAllConnections in readRAST6 replaced by counted closure 2013-04-22 19:48 edzer * DESCRIPTION: version update 2013-04-22 14:49 edzer * demo/depend.R: tidy 2013-04-22 14:24 edzer * demo/depend.R: better depend script 2013-04-22 09:34 edzer * demo/depend.R, man/spTransform.Rd, tests/Examples/sp-Ex.Rout.save, tests/fail1.Rout.save: added spTransform doc, updated checks, depend now uses two cores. 2013-04-19 15:52 edzer * DESCRIPTION: increased the rgdal version dependency 2013-04-19 13:16 edzer * NAMESPACE, R/Spatial-methods.R: defines generic, and exports method spTransform. 2013-04-12 22:11 mdsumner * R/gridlines.R: stringsAsFactors = FALSE for gridat labels, otherwise the factors returned are unusable without conversion to character 2013-03-30 13:36 edzer * DESCRIPTION: version bump 2013-03-30 13:33 edzer * R/spplot.R: lwd and lty now work on spplot()'ing SpatialPolygonsDataFrame objects; email today on r-sig-geo. 2013-03-29 10:00 rsbivand * ChangeLog, inst/ChangeLog: tidy 2013-03-29 09:57 rsbivand * inst/include/sp_xports.c: removing clang warnings 2013-03-29 09:56 rsbivand * DESCRIPTION, src/Rcentroid.c, src/pip.c, src/pip2.c, src/sp_xports.c, src/zerodist.c: removing clang warnings 2013-03-13 12:34 edzer * DESCRIPTION, R/Class-SpatialLines.R, R/Class-SpatialPolygons.R, R/SpatialPolygons-methods.R, R/overlay.R, man/Lines-class.Rd, man/SpatialLines.Rd, man/SpatialPolygonsDataFrame-class.Rd, man/overlay-methods.Rd, man/overlay.Rd, man/sp-deprecated.Rd, tests/Examples/sp-Ex.Rout.save: cleaned up deprecated functions, moved docs to sp-deprecated.Rd added package = "sp" to all .Deprecated calls version bump 2013-03-11 15:27 edzer * R/loadmeuse.R, demo/00Index, demo/meuse.R, man/loadmeuse.Rd: moved the functionality from loadMeuse() to demo("meuse") 2013-03-11 11:21 edzer * inst/ChangeLog: added ChangeLog 2013-03-11 11:21 edzer * R/loadmeuse.R, man/loadmeuse.Rd: loadMeuse() now avoids data() without setting envir to local environment(), and uses assign to assign to .GlobalEnv 2013-03-11 10:42 edzer * ChangeLog: submitted 1.0-6 to CRAN; then updated ChangeLog (after sp submission!) 2013-03-02 11:27 edzer * man/SpatialPixels-class.Rd, tests/Examples/sp-Ex.Rout.save: corrected documentation about drop=FALSE default argument in [ 2013-02-22 16:33 edzer * inst/doc/over.Rnw: synchronized with code in sp and rgeos 2013-02-22 14:08 edzer * R/over.R: make sure aggregate returns NA for empty sets, and not e.g. -Inf and a warning when fn is max 2013-02-22 11:03 edzer * R/over.R, man/over.Rd, tests/Examples/sp-Ex.Rout.save: added some missing over() methods. 2013-02-09 22:31 edzer * R/spplot.R: typo. 2013-02-09 17:30 edzer * R/spplot.R: added more flexibility in keeping auto.key options. 2013-02-06 11:14 edzer * R/spplot.R: addressed the problem raised by David Rossiter in https://stat.ethz.ch/pipermail/r-sig-geo/2013-February/017351.html 2013-02-04 14:51 edzer * DESCRIPTION: updated date 2013-02-04 14:51 edzer * man/spsample.Rd: updated docs; 2013-01-30 16:59 edzer * NAMESPACE, man/mapasp.Rd, man/spsample.Rd: export (and document) degreeAxisLabelsNS|EW 2013-01-22 20:10 edzer * demo/gallery.R: use coordinates() for deprecated function 2013-01-22 18:33 edzer * tests/Examples/sp-Ex.Rout.save: test outputs now reflect the full CRS of meuse[.grid] 2013-01-22 18:10 edzer * DESCRIPTION, R/spplot.R, man/spplot.Rd: update to spplot, suggested in https://stat.ethz.ch/pipermail/r-sig-geo/2013-January/017243.html ; try: library(sp) loadMeuse() spplot(meuse[c("lead", "zinc")], edge.col=1, colorkey=T, cuts=c(10,100,200,500,1000,2000)) 2013-01-19 12:22 edzer * R/spplot.R: longlat scales for spplot.points were ignored, reported by Oscar Perpiñán Lamigueiro 2013-01-12 13:14 edzer * R/loadmeuse.R: changed crs to full CRS, as libproj would fill it in 2013-01-11 11:34 edzer * NAMESPACE, R/CRS-methods.R, R/over.R, man/CRS-class.Rd, tests/Examples/sp-Ex.Rout.save: added identicalCRS() function, and used it in all over() methods. 2012-12-28 15:09 edzer * DESCRIPTION, R/overlay.R, man/as.SpatialPolygons.GridTopology.Rd, man/overlay-methods.Rd, man/overlay.Rd, tests/Examples/sp-Ex.Rout.save: .Deprecated() overlay; removed them from examples 2012-12-27 19:51 edzer * NAMESPACE, R/CRS-methods.R, R/Class-SpatialPolygons.R, R/SpatialPolygons-methods.R, R/SpatialPolygonsDataFrame-methods.R, R/chfids.R, R/point.in.polygon.R, R/zerodist.R: changed .Call("foo",x,package="sp") into .Call(foo,x); NAMESPACE to export symbols accordingly. 2012-12-21 19:48 edzer * DESCRIPTION, R/image.R, man/image.Rd, tests/fail1.Rout.save: image() with factor attr now works; updated docs; version bump after CRAN release; tests output update. 2012-12-21 13:42 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-12-21 13:42 rsbivand * ChangeLog, R/image.R, inst/ChangeLog, man/image.Rd: tidy 2012-12-21 13:27 edzer * R/image.R: factor data are now converted to numeric by image.SpatialGridDataFrame 2012-12-20 23:27 edzer * man/SpatialGridDataFrame-class.Rd, tests/Examples/sp-Ex.Rout.save: more tests 2012-12-20 23:15 edzer * tests/Examples/sp-Ex.Rout.save: updated test 2012-12-20 21:49 edzer * NAMESPACE, R/SpatialGridDataFrame-methods.R, man/SpatialGridDataFrame-class.Rd: added as.array and as(x, "array") methods for SpatialGridDataFrame. 2012-12-18 13:57 edzer * DESCRIPTION: version bump. 2012-12-18 08:48 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-12-18 08:47 rsbivand * DESCRIPTION, inst/include/sp_xports.c, src/sp_xports.c: catch empty comment string 2012-12-10 17:49 edzer * data/meuse.grid.rda, data/meuse.grid_ll.rda, tests/Examples/sp-Ex.Rout.save, tests/grid.Rout.save: changed meuse.grid$soil and meuse.grid_ll$soil into a factor; updated test outputs. 2012-12-05 08:08 rsbivand * src/gcdist.c: update link to Javascript GC distance code 2012-11-24 18:46 edzer * R/spplot.R: tidy 2012-11-24 15:45 edzer * man/char2dms.Rd: typo 2012-11-19 15:49 edzer * DESCRIPTION, NAMESPACE: added Barry and Virgilio as ctb 2012-11-15 16:59 edzer * NAMESPACE, R/SpatialPointsDataFrame-methods.R, R/spplot.R, man/SpatialPolygons-class.Rd, man/SpatialPolygonsDataFrame-class.Rd, tests/Examples/sp-Ex.Rout.save: removed some sample.Polygon(s) from examples; tidied NAMESPACE 2012-11-13 15:59 edzer * DESCRIPTION, NAMESPACE, R/CRS-methods.R, man/image.Rd, tests/Examples, tests/Examples/sp-Ex.Rout.save: moved Depends: to Imports: ; updated to new rgdal CRS interface; added examples output, and changed some (removed system.time(), to get consistent outputs) 2012-10-31 17:58 edzer * DESCRIPTION, R/CRS-methods.R, inst/ChangeLog: version increase; rgdal dependency on 0.7-21 (svn); now calls R wrapper for checkCRSArgs in rgdal. 2012-10-31 15:13 edzer * NAMESPACE, inst/ChangeLog, tests/fail1.Rout.save: NAMESPACE: tidy; ChangeLog: update; fail1 test: sync with R 2.15.2 2012-10-28 13:25 rsbivand * R/SpatialPolygons-methods.R: tess/Polygons crash prevention 2012-10-21 20:25 edzer * inst/doc/over.Rnw: added reference to spatio-temporal overlay/aggregation vignette. 2012-10-19 19:41 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: adding comment about ringDir 2012-10-12 21:05 edzer * man/bpy.colors.Rd: removed dead link 2012-10-10 16:27 edzer * ChangeLog, DESCRIPTION: version update 2012-10-09 21:00 edzer * R/spsample.R: forgot ,,drop=FALSE in sample.Spatial, which broke surveillance. 2012-10-07 15:30 edzer * R/SpatialGridDataFrame-methods.R, R/SpatialLines-methods.R: SpatialLines: cosmetics; SpatialGridDataFrame: data.frame() no longer converts character into factor. 2012-10-06 16:05 edzer * R/spplot.R: repaired sp.polygons, after report on r-sig-geo 2012-10-05 15:00 edzer * R/SpatialGridDataFrame-methods.R, R/SpatialLinesDataFrame-methods.R, R/SpatialPolygonsDataFrame-methods.R: buglet in [.SpatialPixelsDataFrame, is.na(i) was called before over() 2012-10-03 14:31 edzer * DESCRIPTION, R/CRS-methods.R, R/over.R, man/over.Rd: reverted back rgdal calling issue; DESCRIPTION: took out rgdal version requirement over: no changes, but (hopefully) more clear documentation. 2012-09-30 18:59 edzer * DESCRIPTION, R/CRS-methods.R: version update; use R function call to rgdal instead of .Call'ing a rgdal routine, for checking CRS (depends on rgdal >= 0.7-20). 2012-09-29 12:11 edzer * R/image.R: image for constant valued SpatialPixelsDataFrame would plot full bbox 2012-09-28 22:09 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-09-28 18:53 edzer * TODO: cleanup 2012-09-28 18:52 edzer * scripts: cleanup 2012-09-28 18:34 edzer * DESCRIPTION: version number change. 2012-09-28 12:08 edzer * man/panel.Rd: updated docs of sp.grid 2012-09-28 11:18 edzer * NAMESPACE, R/spplot.R: further support for grid.path, and grid.rect & colors in sp.grid; see r-sig-geo post. 2012-09-28 10:27 edzer * R/spplot.R: support polygons with holes as plotting object, and have another feature shine through; modified sp.grid such that it does something useful with colors. 2012-09-28 09:28 edzer * R/SpatialPolygons-methods.R, R/spplot.R: corrected bug in coordinates method for SpatialPolygons; support for polygons with holes in spplot, when in sp.layout argument 2012-09-27 20:12 edzer * inst/doc/intro_sp.Rnw: added length() generic. 2012-09-27 20:11 edzer * R/spsample.R: moved all overlay() into over(); deselect points outside bbox when global longlat coverage caused an error. 2012-08-29 14:31 edzer * R/loadmeuse.R, man/loadmeuse.Rd: added (optional) loading of the meuse river data, as SpatialPolygons object 2012-08-10 20:10 rsbivand * NAMESPACE: added usePolypath option 2012-08-10 20:04 rsbivand * DESCRIPTION, R/AAA.R, R/SpatialPolygons-displayMethods.R, R/spOptions.R, man/SpatialPolygons-class.Rd: added usePolypath option 2012-06-30 11:22 edzer * R/subset.R: bug fix, suggested by Sebastian Meyer, 6/26/2012 2012-06-23 15:56 edzer * man/00sp.Rd: updated \url{}s 2012-06-23 14:02 edzer * R/loadmeuse.R: added CRS to meuse and meuse.grid when loaded with loadMeuse() 2012-06-18 20:59 edzer * man/spChFIDs-methods.Rd: added spChFID<- docs 2012-06-18 19:50 edzer * NAMESPACE, R/Spatial-methods.R, R/SpatialPolygons-methods.R, R/SpatialPolygonsDataFrame-methods.R: added spChFIDs<- method; (row.names<- already did this, too) coordinates() methods for SpatialPolygons[DF] get IDs as row.names 2012-05-10 07:25 edzer * DESCRIPTION: version update 2012-04-27 13:25 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-04-27 13:25 rsbivand * man/SpatialPolygons-class.Rd: polypath default TRUE 2012-04-27 12:59 rsbivand * R/SpatialPolygons-displayMethods.R: polypath default TRUE 2012-04-20 18:03 edzer * NAMESPACE, man/panel.Rd: export, and document sp.panel.layout(), as might be required by ade4 2012-04-16 13:12 rsbivand * DESCRIPTION: adding top-level comment to SpatialPolygons for all member Polygons commented with OGC SFS kludge 2012-04-16 13:09 rsbivand * R/SpatialPolygons-methods.R, R/SpatialPolygonsDataFrame-methods.R: adding top-level comment to SpatialPolygons for all member Polygons commented with OGC SFS kludge 2012-04-16 08:48 edzer * man/over.Rd: added comment about left outer join. 2012-04-09 18:16 rsbivand * ChangeLog, inst/ChangeLog: update hole in Polygons documentation 2012-04-09 18:15 rsbivand * man/Polygons-class.Rd: update hole in Polygons documentation 2012-04-04 18:03 edzer * DESCRIPTION: DESCRIPTION depends on R >= 2.14.0 2012-04-03 20:11 edzer * DESCRIPTION, R/spplot.R: updated DESCRIPTION (removed author/maintainer fields); addressed spplot issue today on r-sig-geo 2012-04-03 13:29 edzer * R/gridlines.R, tests/grid.Rout.save, tests/pass1.Rout.save, tests/sp1.Rout.save, tests/zerodist.Rout.save: aligned test output with R 2.15.0 2012-03-30 07:39 rsbivand * R/projected.R: fix condition in replace CRS method 2012-03-28 10:28 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-03-28 10:26 rsbivand * NAMESPACE, R/AAA.R, R/projected.R, R/spOptions.R, man/is.projected.Rd: option warn replace CRS 2012-03-27 12:13 edzer * DESCRIPTION, demo/depend.R: version increase; --as-cran added to dependency script 2012-03-27 11:16 edzer * demo/depend.R: parallel package checking. 2012-03-26 20:54 edzer * R/spplot.R: resolved cex issue. 2012-03-26 11:55 edzer * DESCRIPTION, R/spplot.R, inst/ChangeLog, inst/doc/intro_sp.Rnw, inst/doc/sp.Rnw: renamed sp vignette (for right order on CRAN page); version increase; added cex.key argument for spplot.points method. 2012-03-22 21:53 edzer * inst/doc/over.Rnw: improvements, sent by John Baumgartner. 2012-03-16 14:01 edzer * R/SpatialGrid-methods.R: allow character proj4string in SpatialGrid() 2012-03-09 22:55 edzer * DESCRIPTION, NAMESPACE, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/SpatialPoints-methods.R, R/SpatialPointsDataFrame-methods.R, R/subset.R, man/Spatial-class.Rd, tests/zerodist.Rout.save: removed existing subset method, and replaced them with a single S3 subset that works for all Spatial objects that have a [ method (using the syntax, and the example of subset.data.frame). 2012-03-05 13:39 edzer * DESCRIPTION: version / date update 2012-03-05 08:36 edzer * DESCRIPTION, R/spplot.R: spplot for SpatialPointsDataFrames used data value order, rather than data record order, as noted in: https://stat.ethz.ch/pipermail/r-sig-geo/2012-March/014399.html this has now been changed. 2012-03-01 18:56 edzer * man/SpatialPolygons-class.Rd, man/SpatialPolygonsDataFrame-class.Rd: added vignette examples from scratch to SpatialPolygons man pages 2012-03-01 06:49 edzer * R/over.R, inst/ChangeLog: speed issue with %over%, reported on r-sig-geo 2012-02-15 11:31 edzer * DESCRIPTION, R/SpatialGridDataFrame-methods.R, R/SpatialLinesDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R, R/SpatialPolygonsDataFrame-methods.R: added checkNames, that checks names<- gets syntactically valid names set. 2012-02-13 22:09 edzer * DESCRIPTION, R/SpatialGrid-methods.R, man/SpatialGrid-class.Rd: date; added coordnames method for SpatialGrid objects 2012-02-06 16:51 edzer * demo/00Index, demo/depend.R: added script that runs R CMD check on packages depeding on sp 2012-02-01 23:00 edzer * DESCRIPTION, NAMESPACE, R/SpatialGrid-methods.R, man/gridindex2nb.Rd: version bump; tidied gridIndex2nb function + docs, exported it in NAMESPACE 2012-02-01 12:00 edzer * R/overlay.R, inst/ChangeLog: overlay() for SpatialGridDataFrame,SpatialPolygons again falls back on SpatialPoints,SpatialPolygons 2012-01-31 21:48 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-01-31 21:46 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-01-31 19:09 edzer * R/gridded.R: removed unneeded testing code / cleanup. 2012-01-27 16:14 edzer * R/SpatialGrid-methods.R: cleaned up construction of SpatialGrid (bbox) 2012-01-25 08:20 edzer * R/Class-SpatialGrid.R: added more checks to SpatialPixels validity function. 2012-01-23 18:25 edzer * R/overlay.R, man/overlay-methods.Rd: added overlay methods for SpatialGrid* 2012-01-23 15:51 edzer * R/Class-SpatialGrid.R, R/Class-SpatialGridDataFrame.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/over.R, man/SpatialGrid-class.Rd, man/SpatialGridDataFrame-class.Rd, man/over.Rd, tests/grid.Rout.save: SpatialGrid no longer subclasses SpatialPixels (by setIs); only explicit coercion brings one into the other. 2012-01-22 20:44 rsbivand * R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R: timings 2011-12-23 10:17 edzer * man/00sp.Rd: removed references to Cell (Pixels) or Gridded (Grid) 2011-12-22 14:49 edzer * R/SpatialGridDataFrame-methods.R: allow selection of single cell in SpatialGridDataFrame object. 2011-12-21 17:48 edzer * tests/fail1.R, tests/fail1.Rout.save: some more tests for image() 2011-12-21 17:03 edzer * R/image.R, tests/fail1.R, tests/fail1.Rout.save: zlim did not work with useRasterImage = TRUE; added image() tests to fail1.R (better late than never!) 2011-12-21 15:43 edzer * DESCRIPTION: version increase. 2011-12-20 17:02 edzer * DESCRIPTION, R/image.R: version bump; corrected error in image(x,2), which broke other CRAN packages 2011-12-19 21:50 edzer * R/image.R, man/image.Rd: breaks in image() did not work if useRasterImage was TRUE; fixed. 2011-12-19 09:08 rsbivand * data/Rlogo.R, data/Rlogo.rda, data/meuse.R, data/meuse.grid.R, data/meuse.grid.rda, data/meuse.rda, data/meuse.riv.R, data/meuse.riv.rda: convert data R to rda 2011-12-19 07:20 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-12-19 07:14 rsbivand * DESCRIPTION: tidy 2011-12-18 19:05 edzer * R/image.R, inst/ChangeLog, makefile, man/image.Rd, tests/fail1.Rout.save: added zlim argument to image and documentation; 2011-12-17 15:19 rsbivand * DESCRIPTION, NAMESPACE, R/AAA.R, R/Class-Spatial.R, R/projected.R, R/spOptions.R, man/Spatial-class.Rd, man/is.projected.Rd: adding tolerance and warning options to ll sanity check 2011-11-23 20:32 edzer * DESCRIPTION, NAMESPACE: added graphics to Depends: ; cleaned NAMESPACE file 2011-11-23 08:28 edzer * ChangeLog, DESCRIPTION: added Import: graphics to DESCRIPTION 2011-11-14 12:43 edzer * inst/doc/over.Rnw: added abstract. 2011-10-25 16:37 edzer * R/SpatialGrid-methods.R: as.SpatialPolygons.SpatialGrid now keeps proj4string 2011-10-21 14:47 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-10-19 19:21 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: add space character for safety in comment 2011-10-19 18:47 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-10-19 18:46 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: fix comment string length 2011-10-19 18:01 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-10-19 18:00 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: add \0 to comment string 2011-10-18 19:30 edzer * DESCRIPTION, man/over.Rd: extended over examples, after email on r-sig-geo; version update 2011-10-17 13:19 edzer * DESCRIPTION, R/over.R, R/overlay.R: version update; functions are now applied column-wise to data.frame attribute tables in overlay() and over() 2011-10-07 16:25 edzer * tests/spplot.Rout.save: updated test, now without warning 2011-10-07 16:24 edzer * R/spplot.R: added row.names to xy, to avoid warning from addNAemptyRowsCols. 2011-10-07 12:04 barryrowlingson * man/00sp.Rd, man/Spatial-class.Rd: Corrected spelling of Rowlingson 2011-09-30 07:29 edzer * R/point.in.polygon.R: removed gc() call, and the need for a temporary object, because it resulted in a large performance overhead. 2011-09-24 15:50 edzer * R/image.R: meuse.grid -> x in image.SpatialPixels 2011-09-24 15:44 edzer * R/SpatialGridDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R: SpatialPointsDataFrame.R: no changes SpatialGridDataFrame: constructor function passes only geometry as arg x 2011-09-19 08:51 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-09-19 08:47 rsbivand * NAMESPACE, R/image.R, man/image.Rd: adding image.SpatialPixels 2011-09-19 08:27 rsbivand * R/image.R: change to suppressWarnings() in image() 2011-09-18 18:02 edzer * NAMESPACE, R/projected.R: cosmetic / cleaned up files. 2011-09-18 17:48 edzer * DESCRIPTION, R/AAA.R, R/Class-SpatialGrid.R, R/Spatial-methods.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/gridded.R, R/projected.R, man/gridded-methods.Rd, tests/fail1.R, tests/fail1.Rout.save, tests/grid.R, tests/grid.Rout.save: version update; proj4string, proj4string<-, gridded, gridded<-, is.projected<- are now all S4 methods; SpatialGrid no longer inherits SpatialPixels directly but Spatial; it is made SpatialPixels by a call to setIs(), which sets the right coercion function (the previous setAs() failed to do this, see https://stat.ethz.ch/pipermail/r-devel/2011-September/062037.html .onLoad outcommented (warnings on CRAN); updated and checked test results; updated manuals. 2011-09-17 19:24 rsbivand * R/image.R: supress warning when plotting window in image 2011-09-14 10:22 rsbivand * ChangeLog, inst/ChangeLog: Changelog update 2011-09-14 10:20 edzer * src/pip.c: replaced Calloc/Free with call to R_alloc. 2011-09-14 09:26 edzer * DESCRIPTION, src/pip.c, src/zerodist.c: version update; PROTECT/UNPROTECT in pip.c. 2011-09-14 05:51 edzer * DESCRIPTION, NAMESPACE, R/Spatial-methods.R, R/gridded.R, R/projected.R: changed proj4string, is.projected and gridded back from S4 to S3. 2011-09-13 14:30 edzer * DESCRIPTION, NAMESPACE: removed authors@R field; export subset.SpatialPixels[DataFrame] in NAMESPACE 2011-09-12 13:06 edzer * DESCRIPTION, R/SpatialPointsDataFrame-methods.R: version update; row.names.SpatialPointsDataFrame now returns @data row.names if coordinates do not have row.names specified. 2011-09-11 17:04 edzer * DESCRIPTION, NAMESPACE, R/AAA.R, R/Class-SpatialGridDataFrame.R, R/Spatial-methods.R, R/SpatialGridDataFrame-methods.R, R/gridded.R, R/projected.R: removed .onLoad("methods") in AAA.R; moved proj4string<- (again!) to S4; tried to have fullgrid and fullgrid<- as S4, but failed; added contains="SpatialPointsDataFrame" to SpatialPixelsDataFrame so that the setIs() could be removed (read ?setIs for reasons why); 2011-08-25 11:06 edzer * DESCRIPTION, man/gridlines.Rd: updated Authors@R field in DESCRIPTION; gridlines edits 2011-08-05 08:45 rsbivand * man/Polygon-class.Rd, man/Polygons-class.Rd: clarifying polygon areas 2011-07-25 16:45 edzer * R/SpatialLinesDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R, R/SpatialPolygonsDataFrame-methods.R: match.ID = "name" in constructor functions did not work properly (anymore?). 2011-07-10 13:58 edzer * DESCRIPTION, R/GridTopology-methods.R: updated package date; improved points2grid to handle differences in unique coordinates, VERY close to zero (e.g., along one column, the x coordinates differ very little). 2011-07-09 21:53 edzer * NAMESPACE, R/Spatial-methods.R, R/SpatialGrid-methods.R, R/projected.R: 1. moved proj4string<- from S4 to S3; added an 2. as("SpatialGrid", "SpatialPoints") method. (for some reason, 2 needed 1) 2011-07-08 08:59 rsbivand * inst/ChangeLog: adding side to gridat 2011-07-08 08:59 rsbivand * ChangeLog: adding side to gridat 2011-07-08 08:58 rsbivand * DESCRIPTION, R/gridlines.R, man/gridlines.Rd: adding side to gridat 2011-07-06 13:41 edzer * R/SpatialGrid-methods.R, man/gridlines.Rd: added two (non-exported) functions to figure out neighbourhoods from grid indexes; gridlines now refers to llgridlines in rgdal. 2011-07-05 14:33 edzer * man/gridlines.Rd: added projected LL lines to example section. 2011-07-04 19:11 edzer * R/AAA.R: remove some unnecessary things from AAA.R 2011-06-29 08:25 edzer * R/SpatialGrid-methods.R: reverted previous commit, which did not make sense. 2011-06-29 08:10 edzer * R/SpatialGrid-methods.R: added a _ separator to create IDs from SpatialPixel grid.index values 2011-06-21 19:33 edzer * DESCRIPTION, R/over.R: version bump; no changes to over.R 2011-06-14 20:55 edzer * R/spplot.R: layout (no changes) 2011-06-12 20:22 edzer * man/over.Rd: added some examples to `over' documentation 2011-06-12 20:08 edzer * DESCRIPTION, man/over.Rd, man/overlay.Rd, tests/spplot.Rout.save: updated the rgeos version in Suggest: field; improved over docs; added to overlay that there is now a better (?) overlay in over. 2011-06-10 22:21 rsbivand * ChangeLog, inst/ChangeLog: SPDF sizes sanity check 2011-06-10 22:20 rsbivand * R/SpatialPolygonsDataFrame-methods.R: SPDF sizes sanity check 2011-06-10 22:05 rsbivand * ChangeLog, inst/ChangeLog: sp comment buffer overflow fix 2011-06-10 22:03 rsbivand * DESCRIPTION, inst/include/sp.h, inst/include/sp_xports.c, src/init.c, src/sp.h, src/sp_xports.c: sp comment buffer overflow fix 2011-05-31 12:13 edzer * R/over.R: is.nan -> is.na (causes check error in R c56002) 2011-05-30 20:31 edzer * NAMESPACE, inst/doc/over.Rnw, man/geometry-methods.Rd: removed kmeans from namespace; allow returnList=TRUE option to all over() methods. 2011-05-30 13:06 edzer * R/over.R: added comment 2011-05-30 06:58 edzer * R/over.R, inst/doc/over.Rnw: now allow returnList for all over() methods 2011-05-26 19:09 edzer * inst/doc/over.Rnw: some improvements. 2011-05-25 12:39 edzer * DESCRIPTION, R/SpatialGrid-methods.R, man/point.in.polygon.Rd: added Author@R in DESCRIPTION; removed gstat reference to InPoly() 2011-05-24 10:08 edzer * R/GridTopology-methods.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/gridded.R, man/SpatialGrid.Rd, man/SpatialGridDataFrame.Rd, tests/grid.Rout.save, tests/spplot.Rout.save: see my message at http://lists.r-forge.r-project.org/pipermail/rspatial-devel/2011-May/000001.html restructuring of the behaviour of SpatialPixels and SpatialPixelsDataFrame, and how selection on them works. 2011-05-23 13:48 edzer * man/spplot.Rd: added docs on first item in sp.layout list. 2011-05-11 20:33 edzer * tests/over.Rout.save: added over.R tests results 2011-05-11 20:17 edzer * DESCRIPTION: rgeos version dependence; URL to r-forge. 2011-05-11 12:52 edzer * inst/doc/over.Rnw: completed table 2011-05-11 12:49 edzer * inst/doc/over.Rnw: added example of line overlay over pixels. 2011-05-09 19:59 edzer * DESCRIPTION, R/over.R, inst/doc/over.Rnw: version bump; added rgeos examples to over vignette; added rgeos to suggests field in DESCRIPTION 2011-05-09 13:02 edzer * DESCRIPTION: version bump 2011-05-09 13:02 edzer * R/spsample.R: Ben Graeler's bug fix for clustered sampling 2011-04-13 02:44 edzer * NAMESPACE: removed as.SGDF.SPixDF 2011-04-13 00:40 edzer * DESCRIPTION: date update 2011-04-04 21:03 edzer * NAMESPACE, R/SpatialGridDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R: row.names(x)<- now also changes @data row.names, for SpatialPointsDataFrame (spTransform would complain, otherwise) 2011-03-14 16:23 edzer * DESCRIPTION, R/GridTopology-methods.R, man/gridded-methods.Rd, tests/fail1.Rout.save: version bump; print err2 with 6 signif, man page correction 2011-03-14 08:49 rsbivand * ChangeLog, inst/ChangeLog: TRUE to value in usage in gridded-methods.Rd 2011-03-14 08:48 rsbivand * man/gridded-methods.Rd: TRUE to value in usage in gridded-methods.Rd 2011-03-13 20:10 rsbivand * INDEX: remove INDEX 2011-03-13 20:03 rsbivand * ChangeLog, inst/ChangeLog: hypot for pythag in C code 2011-03-13 20:01 rsbivand * src/gcdist.c: hypot for pythag in C code 2011-03-08 13:40 rsbivand * R/spsample.R, man/spsample.Rd: sample.Polygons index fix - hole heuristic removed - holes must be correctly defined if need be 2011-03-07 20:52 rsbivand * R/spsample.R: sample.Polygons index fix 2011-02-28 20:21 rsbivand * R/SpatialPoints-methods.R: SpatialPoints [ bounding box bug (since 993) 2011-02-28 10:21 edzer * NAMESPACE, R/over.R, inst/doc/over.Rnw: improved aggregate examples in "over" vignette. 2011-02-23 18:41 edzer * DESCRIPTION: version number increase 2011-02-23 18:24 rsbivand * R/CRS-methods.R, man/CRS-class.Rd: adding checks in CRS() and details in help page 2011-02-23 07:08 edzer * man/CRS-class.Rd: updated URL of proj 2011-02-22 20:35 edzer * DESCRIPTION, NAMESPACE, R/GridTopology-methods.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/SpatialPolygons-methods.R, man/SpatialGrid.Rd, man/SpatialGridDataFrame.Rd, man/SpatialPolygons-class.Rd, tests/fail1.R, tests/fail1.Rout.save, tests/grid.Rout.save, tests/spplot.Rout.save: version update; added patch coerce from SpatialPolygons to SpatialPolygonsDataFrame (with dummy data.frame, to allow export to shapefile), removed fuzz.tol argument and code that guessed grid layouts, modified tests accordingly. 2011-02-22 17:55 edzer * man/GridTopology-class.Rd, man/SpatialGrid-class.Rd, man/SpatialPixels-class.Rd, man/SpatialPixelsDataFrame-class.Rd, man/SpatialPoints-class.Rd: removed the ~~~ from doc files 2011-02-22 16:37 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-02-22 16:24 rsbivand * oChangeLog, svn2cl.xsl: tidy 2011-02-22 16:18 rsbivand * .: tidy 2011-02-15 16:24 edzer * improved readability remove.duplicates. 2011-02-12 12:58 edzer * version bump 2011-02-11 20:14 edzer * changed "overlay" into "over" for selection methods; corrected %over% printing in docs. 2011-01-16 12:55 rsbivand * clarify longlat in spDistsN1.Rd 2010-12-19 12:09 edzer * added example 2010-12-18 16:19 edzer * made over pass R < 2.12 2010-12-18 16:06 edzer * version bump 2010-12-18 16:06 edzer * added length method for Spatial*DataFrame objects 2010-12-18 15:51 edzer * changed max = 255 into maxColorValue = 255, avoiding partial argument matching 2010-12-15 17:10 edzer * patch to r-sig-geo of Dylan Beaudette, 15 dec 2011 2010-12-13 21:09 edzer * removed restriction to non-overlapping polygons from docs. 2010-12-12 21:52 edzer * version update; take aggregate from stats namespace; spatial objects in selections like points[polygon,] now also work for Spatial*DataFrame as selection criterion (taking the geometry of it); removed the returnList=TRUE option for those "over" methods that do not (yet) support it (triggers error). Changed vignette and tests accordingly. 2010-11-29 19:11 edzer * corrected inportFrom into importFrom 2010-11-22 20:47 edzer * small mistakes in code/docs to make sp pass check; 2010-11-22 20:23 edzer * added aggregate method; added coercion from SpatialGrid* to SpatialPolygon*; version bump; added second vignette 2010-11-22 11:38 edzer * added addAttrToGeom method to create a SpatialXxxDataFrame from a SpatialXxx object and a data.frame, with instances for each SpatialXxx. 2010-11-18 21:36 edzer * removed the full matrix need in .invert 2010-11-15 22:53 edzer * modified some of the over and pointInPol functions to catch the case where more than one polygon coves a point (think package cshapes) 2010-11-13 19:43 edzer * forgot to add & commit the docs for the geometry method, mentioned in the previous commit. 2010-11-13 19:37 edzer * match.ID in SpatialXxxDataFrame() now can be character, in which case the corresponding column in the data.frame is used; A generic geometry() converts a SpatialXxxDataFrame into a SpatialXxx. A generic over() provides a better overlay then overlay -- it is consistent in that over(x,y) provides characteristics of y on spatial locations of x -- I didn't modify overlay() as too many instances (including the book) rely on its inconsistency. Selection of objects can now be done by spatial objects: x[y] returns the polygons x covered by points y, or the points x inside polygons y, etc. Related to this: x[x$dist < 30,] would work for SpatialPixelsDataFrame but fail for SpatialGridDataFrame -- it now works; any i-selector (first, with ,) longer than the number of rows selects the cells. Selecting cells means essentially that de-selected cells get assigned NA (!). a names methods for SpatialPolygons was added. 2010-11-08 21:26 edzer * reverted overlay changes back to 0.9-72 state. 2010-11-08 17:27 edzer * added a geometry generic and method, that returns the coercion to a Spatial* object from a Spatial*DataFrame object. 2010-11-08 12:56 edzer * docs pass check 2010-11-08 12:34 edzer * modified (corrected?) overlay methods; see post on r-spatial-devel; added selection with Spatial object to SpatialPolygons objects. 2010-11-06 10:40 edzer * extended "[" method for these classes to allow the first argument that is of class "Spatial"; in that case, the selection will be those items that do not result in an NA when overlaied with the object. for SpatialGridDataFrame, I now allow the first index to be of length nrow(x@data), meaning that cell-by-cell selection takes place instead of row-based. 2010-10-31 13:01 edzer * added ,drop=FALSE to as.image function, for the case of single row or col grids 2010-10-25 18:29 rsbivand * added extra check to points2grid 2010-10-19 10:08 edzer * version update; changed comment 2010-10-15 18:25 edzer * spDists now returns always matrix, also in case of dim 1 x 1 2010-10-11 08:46 edzer * version update; added import(lattice) to decrease R version depency to 2.10.0 2010-10-11 08:37 edzer * version update; gallery update 2010-10-08 15:09 edzer * update sp.layout in spplot of polygons, to work just as with grids. 2010-10-04 18:21 edzer * version update; expanded Suggest: field with rgdal and lattice 2010-09-28 19:29 edzer * corrected help for cuts argument 2010-09-20 14:12 edzer * updated version 2010-09-20 14:12 edzer * updated date 2010-09-20 06:24 rsbivand * test save 2010-09-20 06:24 rsbivand * test save 2010-09-19 19:16 edzer * row.names no longer returns NULL for points and pixels. is.projected, proj4string and proj4string<- are now S4 generics 2010-09-16 20:13 edzer * added row.names methods for SpatialGrid and SpatialGridDataFrame; cleaned up levelplot panel and opan stuff; zerodist was not touched afaics 2010-08-28 14:25 rsbivand * as.double to storage.mode 2010-08-04 13:51 rsbivand * rasterImage SDI detection 2010-08-03 12:13 rsbivand * rasterImage fix for transparency and single unique value rasters 2010-08-02 16:39 rsbivand * rasterImage fix for transparency and single unique value rasters 2010-07-28 22:30 edzer * extended ID documentation; added examples; suggestion Michael Friendly on r-sig-geo 2010-07-19 19:07 rsbivand * including polypath from graphics if available, and panel.levelplot.raster 2010-07-16 14:08 rsbivand * two changes: pointsInPolygons and sample.Polygons hole logic 2010-07-14 14:31 rsbivand * coerce ID to character in Lines 2010-07-12 19:59 rsbivand * tidy 2010-07-07 21:41 edzer * increased version number. 2010-07-07 21:40 edzer * added length() S3 methods 2010-07-07 21:39 edzer * added length() methods for Spatial objects; small improvements to the asWKT printing. 2010-07-07 14:02 mdsumner * more consistent handling of lwd and lty arguments passed to lines() by plotSpatialLines - multiple values for each are now recycled as necessary also added arguments lend, ljoin and lmitre for lines() 2010-07-06 16:06 edzer * changed the col recycling in plot.SpatialLines; suggestion by Michael Sumner on r-spatial-devel mailing list 2010-06-23 12:25 rsbivand * tidy 2010-06-23 11:45 edzer * solved the spplot factor key issue mentioned in https://stat.ethz.ch/pipermail/r-sig-geo/2010-June/008586.html 2010-06-22 06:52 edzer * spplot(meuse, scales = list(x = list(draw = TRUE))) now works. 2010-06-21 07:32 rsbivand * checks in image2Grid 2010-06-12 04:19 rsbivand * warning in spplot for points 2010-06-07 11:06 edzer * removed the setAs("SpatialGrid", "SpatialPoints", ...) coercion, as it breaks csdacm.R of the ASDAR book. 2010-06-05 16:11 rsbivand * r1/2 to x/y in SL bbox 2010-06-05 16:04 rsbivand * r1/2 to x/y in SL bbox 2010-05-27 13:23 edzer * added (optional) printing using WKT encodings; added coercion from SpatialGrid to SpatialPoints. 2010-05-27 12:48 edzer * added x@ in "[.SpatialPointDataFrame", such that coords.nrs get properly reset by column selection 2010-05-17 10:42 rsbivand * use rasterImage where available 2010-05-06 14:19 rsbivand * adding rasterImage support 2010-04-26 10:30 edzer * remove.duplicates now returns the complete object if no duplicates were found; suggested in https://stat.ethz.ch/pipermail/r-sig-geo/2010-April/008121.html. 2010-04-26 08:34 rsbivand * tidy 2010-04-19 06:19 edzer * "[" for SpatialPixelsDataFrame is now copied from SpatialPointsDataFrame; this was needed to get split.data.frame working for SpatialPixelsDataFrame. 2010-04-18 17:35 edzer * allow usin gdrop argument in [, as split.data.frame will pass it. 2010-04-17 21:53 edzer * added split (S4) methods for SpatialXxxDataFrame objects (except SpatialGridDataFrame). Suggested by Michael Sumner, r-sig-geo, Apr 17 2010 2010-04-17 19:38 rsbivand * ringDir bug 2010-04-17 19:11 rsbivand * ringDir bug 2010-04-17 12:39 edzer * set names of arguments to NULL; but report by Clement Calenge 2010-04-16 13:29 edzer * added surfaceArea method, R and C function and docs, contributed by Barry Rowlingson 2010-03-09 07:19 rsbivand * anyDuplicated requires R >= 2.9.1 2010-02-14 20:05 rsbivand * modified instantiation of SpatialPolygonsDataFrame objects 2010-02-13 21:49 edzer * two small typos 2010-02-13 21:44 edzer * description improvements by David Rossiter 2010-02-11 07:21 rsbivand * bug fix for spDistsN1 for 0 latitude, longat=TRUE 2010-02-04 10:53 edzer * added compass rose from Jim Lemon (see r-sig-geo) 2010-02-03 16:02 edzer * added panel.identify link to seealso in spplot doc 2010-02-03 15:32 edzer * spplot.locator gave a bug when a single point was clicked 2010-02-01 15:17 edzer * functions that loads meuse and meuse.grid to the global env, and converts them to the appropriate Spatial* structures. 2010-01-27 20:01 rsbivand * more hole fixing 2010-01-27 19:34 rsbivand * more hole fixing 2010-01-26 19:54 rsbivand * change non-ASCII hyphen in man file 2010-01-26 18:04 rsbivand * hole logic fix; thanks to Javier Munoz for report 2010-01-26 08:36 edzer * corrected bug in spplot for points, when zcol was a numeric array; bug reported by Robert Hijmans. 2010-01-17 16:22 edzer * more middle initials removed from author name 2010-01-17 16:21 edzer * removed middle initial in author name 2010-01-17 16:14 edzer * added Fibonacci sampling on a sphere; see reference in spsample documentation. 2010-01-17 16:08 edzer * added demo script for Fibonacci sampling on the sphere 2010-01-14 13:45 rsbivand * 0/360 longlat GC distance 2010-01-13 21:38 edzer * consequence of earlier typo correction 2010-01-12 12:09 edzer * mostly cosmetic updates. 2010-01-09 10:22 rsbivand * SpatialPolygonsDataFrame [ speedup 2010-01-08 13:38 rsbivand * identical points fix for sp_lengths 2010-01-07 18:08 rsbivand * added centroid protection 2010-01-07 12:08 rsbivand * added centroid protection 2009-12-18 21:53 rsbivand * rbind documentation improvements 2009-12-18 09:34 rsbivand * handling infinite label point for defect polygons 2009-12-17 19:14 rsbivand * adding C API files for *Polygon* classes 2009-12-17 17:40 rsbivand * adding C API files for *Polygon* classes 2009-12-14 08:41 edzer * added test on reversed arguments 2009-12-14 08:31 edzer * spDists test output 2009-12-11 16:30 edzer * version bump 2009-12-11 16:21 edzer * added the spDists function that wraps (for 2D data) spDistsN1, and returns the distance matrix between two sets of coordinates. 2009-12-06 11:01 rsbivand * S4 tidying 2009-12-04 17:44 rsbivand * signature of S4 methods compliance 2009-12-04 17:33 edzer * change to $ and $<- signatures; should not break functionality needed to pass check on R base svn r50609 2009-12-03 12:16 rsbivand * spChFIDs speed-up in R 2009-11-20 09:43 edzer * date update 2009-11-19 20:09 rsbivand * docs linkage problems from maptools 2009-11-19 13:25 edzer * added ... to arguments of coordinates method; request from torleif.lunde@cih.uib.no on r-sig-geo, Nov 19, 2009. 2009-11-05 16:34 edzer * version update; added row.names<- methods for points, lines and polygons; moved all the spChFIDs methods, functions and docs from maptools to sp for this. 2009-11-03 08:29 edzer * added flipHorizontal/flipVertical contributions on r-sig-geo from Michael Sumner 2009-11-03 08:21 edzer * removed more wrong references to SpatialDataFrame 2009-11-03 08:20 edzer * removed reference to SpatialDataFrame 2009-10-22 09:17 rsbivand * allow negative integer selection of SPolDF 2009-09-30 14:46 edzer * added asdar book as citation. 2009-09-24 10:59 rsbivand * bug fix image2Grid 2009-09-22 16:03 rsbivand * adding auto.key to fill.call.groups() 2009-09-17 08:36 rsbivand * fix documentation links 2009-08-24 13:23 edzer * changed project into spTransform and made the example more realistic; removed spproj reference. 2009-08-24 13:13 edzer * updated affiliation Edzer; removed any references to AttributeLists. 2009-07-19 13:23 rsbivand * RD2 2.10.0 tidy 2009-07-19 13:22 rsbivand * RD2 2.10.0 tidy 2009-07-09 21:08 rsbivand * change defunct spproj references to rgdal 2009-07-09 12:03 rsbivand * adding SpatialPoints* to spDistsN1 2009-07-08 10:38 rsbivand * added row.names methods and [ on character 2009-07-08 10:33 rsbivand * added row.names methods and [ on character 2009-07-07 10:02 rsbivand * sample for line objects fixes 2009-07-06 13:48 rsbivand * sample for line objects fixes 2009-07-06 13:45 rsbivand * sample for line objects fixes 2009-07-05 13:35 rsbivand * zero length line issue in spsample 2009-05-28 13:00 edzer * added attr=1 argument to as.image.SpatialGridDataFrame 2009-05-28 06:10 edzer * version update; minor test output changes 2009-05-27 20:39 edzer * change request by BDR, involving named arguments in [.data.frame 2009-04-29 11:39 rsbivand * typos in spDistsN1 messages 2009-04-23 11:07 rsbivand * adding dim for remaining Spatial*DataFrame classes 2009-04-23 10:57 rsbivand * adding dim for remaining Spatial*DataFrame classes 2009-03-31 12:13 rsbivand * overlay points on grid rownames problem 2009-03-05 09:54 edzer * missing bracket 2009-02-26 17:03 rsbivand * spsample and gridded polygons 2009-02-26 16:33 rsbivand * spsample and gridded polygons 2009-02-26 11:59 rsbivand * spsample and gridded polygons 2009-02-20 11:03 edzer * zerodist test includes unique.ID argument 2009-02-20 10:08 edzer * added the unique.ID argument to zerodist 2009-02-19 14:02 edzer * spplot of logical variables did not work 2009-02-19 13:21 edzer * added user interrup checking in outer loop 2009-02-19 13:19 rsbivand * non finite label points 2009-02-19 08:47 edzer * allowed for boolean variables 2009-02-16 09:14 rsbivand * dimension dropping in single cell grids 2009-01-22 15:50 edzer * corrected description of overlay. 2009-01-04 15:01 edzer * version update 2009-01-04 15:01 edzer * 0.9-29 commit, as accepted 2009-01-04 14:26 edzer * corrected typos 2009-01-04 14:06 edzer * docs typos 2009-01-04 13:59 edzer * {z} replaced with \code{z} 2009-01-04 13:58 edzer * removed reference to spproj 2009-01-03 15:02 edzer * version update 2009-01-03 15:01 edzer * examples for factor variables 2009-01-03 14:08 edzer * further checking on length of col.regions when plotting a factor 2009-01-03 13:48 edzer * version update; spplot and stack: better deal with factor dependent variables 2008-12-28 11:12 edzer * SpatialPoints() now preserves rownames of coordinates, if they are present 2008-10-30 15:47 rsbivand * NAMESPACE 2008-10-30 14:23 edzer * removed export(.__C__*) things; they're no longer needed 2008-10-29 22:16 edzer * version update 2008-10-29 22:02 edzer * typo 2008-10-29 21:56 edzer * added coerce.SpatialPixelsDataFrame.SpatialPolygonsDataFrame; version increase 2008-10-27 09:24 edzer * allowed for e.g. proj4string(x)="+proj=longlat" in addition to proj4string(x)=CRS("+proj=longlat") 2008-10-03 07:29 rsbivand * missing bbox in [ for SLDF 2008-10-02 14:59 rsbivand * fill polygons 2008-09-25 10:50 edzer * added comment on factor usage in spplot; updated email address everywhere 2008-09-25 10:26 edzer * removed debug code 2008-09-25 10:14 edzer * fixed bug with multiple panels of factor variables; now derives legend from first panel only. 2008-08-20 12:55 edzer * no change performed. 2008-08-12 20:22 edzer * fill argument is now accepted by sp.polygons, and accepts one color for each polygon. 2008-07-06 18:18 rsbivand * more attempts to handle fuzz in points2grid 2008-07-04 18:29 rsbivand * blocking slack fuzz handling in points2grid 2008-07-04 14:12 edzer * made IDs clash removal in rbind optional, documentation is still lacking 2008-07-03 11:08 edzer * simplified check on unique IDS in SpatialLines and SpatialPolygons constructors; allowed duplicate IDS in rbind methods for these two; corrected argument order in spsample documentation 2008-07-02 10:06 edzer * added "clustered" as sampling strategy (still experimental) 2008-07-01 18:18 rsbivand * release 0.9-26 2008-07-01 17:34 rsbivand * release 0.9-26 2008-05-03 10:29 rsbivand * added fuzz to points2grid 2008-05-02 10:05 rsbivand * fixed rgb() for NAs in image methods 2008-05-02 10:03 rsbivand * fixed rgb() for NAs in image methods 2008-04-08 06:33 edzer * data update 2008-04-06 20:59 edzer * modified overlay for polygons and points, if fn is given; r-sig-geo report by Andrew Hoskins, 04/03/2008 2008-04-03 17:57 rsbivand * col for hatching 2008-03-19 09:16 edzer * email change of maintainer 2008-03-14 16:11 edzer * date 2008-03-14 16:10 edzer * offset to hexGrid sampling 2008-03-14 15:07 edzer * repaired bug in computing dx in hexGrid, found by Don MacQueen 2008-03-07 11:26 edzer * added zerodist2 function, to find common points among two objects 2008-03-07 08:49 rsbivand * CRS 2008-02-19 08:21 rsbivand * tidy empty sections 2008-02-18 20:10 rsbivand * final sample.Spatial and empty help sections 2008-02-17 20:28 rsbivand * spsample polygon 2008-02-17 18:34 rsbivand * spsample polygon 2008-02-17 18:31 rsbivand * spsample polygon 2008-01-29 08:08 rsbivand * SP bbox 2008-01-21 19:14 rsbivand * gridded 2008-01-20 20:39 rsbivand * summary 2008-01-20 20:10 rsbivand * coerce 2007-12-21 13:03 rsbivand * release 2007-12-20 12:06 edzer * overlay doc warning on r-devel; description was missing 2007-12-17 11:56 rsbivand * bbox in p-in-p 2007-11-11 18:17 rsbivand * Spatial 2007-11-11 12:43 edzer * allowing an n x 2 matrix to be passed to sp.text, plotting multiple labels at once. 2007-11-04 20:30 rsbivand * single variable summary 2007-11-03 20:41 rsbivand * tidy 2007-10-31 14:42 rsbivand * thingy to slot 2007-10-15 13:15 edzer * conform the R 2.6.0 changed error message structure 2007-10-09 07:58 rsbivand * docType 2007-10-06 21:46 rsbivand * new() mess in SpatialGrid 2007-06-28 08:23 edzer * Class-SpatialLines.R: removed check that a line needs at least 2 points, otherwise, map2SpatialLines in maptools would need modification; spsample.R: added correct area computation, subtracting holes to get better estimate of sampling density. 2007-06-04 12:45 edzer * added link to r-sig-geo mail for image legend 2007-06-04 12:24 edzer * version update; cbind for SGDF now keeps proj4string (but does not check equality); typo in Rd 2007-06-04 09:47 rsbivand * Changelog 2007-06-04 08:28 rsbivand * image col= 2007-05-31 20:26 rsbivand * proj4string retention in SpatialPixel 2007-05-25 15:46 edzer * xx 2007-05-24 08:13 edzer * matching braces 2007-05-21 14:08 edzer * [ with logical row selection didn't work 2007-05-21 11:31 edzer * remove comment 2007-05-20 19:50 rsbivand * $<- no print 2007-05-16 13:19 edzer * xx 2007-05-16 11:59 edzer * hex stuff 2007-05-16 07:49 edzer * added tests $ $<- [[ [[<- 2007-05-15 20:21 edzer * removed $<- for SpatialPoints and SpatialPixels; inheritance screwed things up 2007-05-14 10:08 edzer * moved several S4 methods, [[, $, [[<-, $<-, summary to top level (Spatial) class; modified docs for that 2007-05-11 10:07 edzer * thinner version of [, many without the constructor function call 2007-05-10 12:21 edzer * same thing.. 2007-05-10 12:04 edzer * [[, [[<-, $ and $<- now use S4 mechanism. 2007-04-26 08:58 edzer * remove coords.nrs in case of column selection 2007-04-13 07:45 edzer * resolve as.numeric.DMS warning for R prerel 2007-04-10 09:09 edzer * xx 2007-04-10 09:03 edzer * xx 2007-04-10 08:54 edzer * small bug 2007-04-10 07:41 edzer * more lines -> SPointsDF coercion; added tests to pass1.R 2007-04-09 21:29 edzer * coerce methods Polygons -> Lines -> Points 2007-04-06 20:19 edzer * as.SpatialLines.SpatialPolygons 2007-04-06 11:16 edzer * better CRS check in rbind; R -> C implementation of zerodist(); 2007-03-20 12:41 edzer * NAs in row index; spplot method setting for points. 2007-03-20 08:42 rsbivand * banning NAs in row indices 2007-03-19 21:10 rsbivand * banning NAs in row indices 2007-03-14 12:18 edzer * version update 2007-03-14 10:51 edzer * xx 2007-03-14 10:00 edzer * docs 2007-03-14 09:22 edzer * line sampling 2007-03-14 00:02 edzer * bugs 2007-03-13 23:44 edzer * spsample along SpatialLines objects 2007-03-13 20:54 edzer * added getSpatialLinesMidPoints and getSpatialPolygonsLabelPoints, both returning a SpatialPoints object with correct CRS; small but in spplot with points, zcol not specified. 2007-03-12 10:50 edzer * name change of Hex stuff (now HexPoints2SpatialPolygons); [ method for SPolDF has match.ID = FALSE; version 2007-03-12 09:43 edzer * pass test 2007-03-12 07:55 edzer * doc typo 2007-03-07 10:33 edzer * contour now better behaves like image 2007-03-07 08:52 edzer * docs update; remove proj4string argument in as.SpatialPolygons.SpatialPixels, as it should inherit from the object passed. 2007-03-06 21:46 edzer * mostly hexagonal sampling & polygons stuff 2007-02-27 20:28 edzer * version, and gridded(x)=TRUE removed the proj4string. 2007-02-16 16:01 edzer * don't use subset in remove.duplicates, it copies coordinates 2007-02-16 09:29 rsbivand * .ll_sanity split out; numeric fuzz permitted 2007-02-12 16:52 edzer * rbind, test and docs 2007-02-12 15:31 edzer * rbind stuff + test 2007-02-12 15:20 edzer * bubble extension; version update 2007-02-10 21:00 edzer * xx 2007-02-10 20:56 edzer * from SGDF to SPixDF is now more efficient, does not recalculate index twice; in spplot I solved the problem with empty rows/col, I believe 2007-02-07 10:25 edzer * solved bug in spplot.points when NA's are present in attributes 2007-02-07 09:24 edzer * version update 2007-02-07 09:24 edzer * zerodist issue 2007-02-01 10:47 rsbivand * \pkg in sp.Rnw 2007-01-22 14:41 edzer * same thing. 2007-01-22 14:39 edzer * fullgrid(x)=F for x SpatialGrid now works using simply as(x,"SpatialGrid"), thanks to Roger's commit 2007-01-22 09:22 rsbivand * Spatial Grid/Pixels: changed new() call in SpatialGrid() to match class declaration 2007-01-21 15:24 edzer * fullgrid(x)=F if x is SpatialGrid now results in correct SpatialPixels. GridTopology now does not add non-existing names. as.character.DMS and as.matrix.* corrections, given warnings on auto checks on CRAN. 2007-01-21 10:49 rsbivand * GE_PNG additions 2007-01-20 21:33 rsbivand * setParUsrBB 2007-01-19 19:43 rsbivand * setParUsrBB hack 2007-01-09 07:49 rsbivand * ChangeLog 2006-12-12 20:51 edzer * added \method{}{} construct; added contour doc 2006-12-12 20:49 edzer * removed transform method 2006-11-30 09:52 edzer * coordnames<- did not set bbox row names, and failed largely for the gridded formats; added methods, modified the bbox issue. 2006-11-30 08:57 rsbivand * tidy CRS print 2006-11-30 08:35 rsbivand * tidy CRS print 2006-11-28 21:01 rsbivand * print formats 2006-11-28 08:31 rsbivand * Imp/exp 2006-10-22 13:17 rsbivand * image & spsample 2006-10-22 13:09 rsbivand * image & spsample 2006-10-17 15:37 edzer * got rid of the as.character hack 2006-10-17 11:00 edzer * names.attr bug 2006-10-07 14:42 rsbivand * as() for as.data.frame() 2006-10-05 07:11 edzer * removed references to require(spproj) and transform; modified manual references where necessary accordingly. 2006-10-05 06:42 edzer * removed transform references 2006-10-04 11:12 edzer * S and S/src empty generated warning; version update corrected manual for layout.north.arrow() and sp.theme() try() response in fail excercises 2006-09-19 08:24 rsbivand * tidying 2006-09-19 07:27 edzer * 2.4.0: removed AttributeList, spplot/lattice compatibility 2006-09-15 08:19 edzer * utils import, for r-devel stack method issue 2006-08-24 13:52 edzer * removed a show; version 2006-08-24 06:55 edzer * version update 2006-08-23 15:57 edzer * check against 2.4.0-devel 2006-08-20 18:41 edzer * email address 2006-08-20 18:38 edzer * solves the lwd and lty issues in spplot() 2006-08-08 18:54 rsbivand * S4 type object.size() update 2006-08-08 17:13 rsbivand * S4 type object.size() failure 2006-07-10 07:12 edzer * nw version, show correction GridTopology 2006-06-26 10:05 edzer * used legend entries as well to determine maximum size 2006-05-22 11:14 edzer * as.data.frame with ... 2006-05-20 21:02 rsbivand * more validity 2006-05-20 19:43 rsbivand * as.data.frame 2006-05-19 10:18 rsbivand * CRS checking against rgdal 2006-04-20 06:50 rsbivand * infinite points 2006-04-10 19:06 rsbivand * bbox default for splancs 2006-03-28 09:16 edzer * version update. 2006-03-15 09:59 edzer * spplot.polygons: data.frame() changed into as.data.frame(), to prevent make.names() being called 2006-02-20 20:35 rsbivand * codetools 2006-02-20 15:56 rsbivand * transform 2006-02-20 15:53 rsbivand * transform 2006-02-17 18:23 rsbivand * trapping empty proj4strings 2006-02-06 12:25 edzer * almost right. 2006-02-06 07:52 edzer * xx 2006-01-30 16:29 edzer * forced coordinates to be(come) double, even if passed as integer 2006-01-29 20:06 edzer * as.data.frame methods for SpatialGrid and SpatialPixels 2006-01-20 19:42 edzer * xx 2006-01-20 19:40 edzer * date update 2006-01-20 19:38 edzer * Kurt's email 2006-01-09 14:47 edzer * allow missing values in spplot of points 2006-01-08 18:32 rsbivand * spdists changed to trap NaN for zero GC distance 2005-12-19 15:32 edzer * version update 2005-12-15 13:32 edzer * locator; grid 2005-12-14 09:59 edzer * names for SGDF added 2005-12-14 09:53 edzer * error message typo 2005-12-12 19:55 rsbivand * polygon things 2005-12-06 10:13 edzer * added emtpy row/col test spplot 2005-11-29 21:04 edzer * added $<- for SpatialGrid and SpatialPixels, promote to *DataFrame muddled with points2grid; deal with empty rows in spplot (add NA values for these row/columns by default--overhead!?) 2005-11-28 08:52 rsbivand * SpatialPixel to polygons 2005-11-23 22:46 edzer * coordinates<- may now yield a SpatialPoints, too 2005-11-23 20:25 edzer * grid related stuff (points2grid; no change really, but better documentation and testing) 2005-11-15 11:35 edzer * data 2005-11-15 11:24 rsbivand * DMS stuff 2005-11-15 11:10 edzer * sampling of 3 or higher dimensional grids; [ with drop=FALSE keeps parent grid topology 2005-11-10 17:45 rsbivand * older things 2005-10-24 16:46 rsbivand * plot bg= argument 2005-10-19 21:11 rsbivand * degrees over 180 2005-10-14 18:08 rsbivand * ring direction fix 2005-10-13 10:09 edzer * set back version to 0.8-4; gcdist unchanged 2005-10-12 12:21 edzer * [ for SPol and SpLines now passes CRS 2005-10-11 19:24 rsbivand * longlat scale in spDistsN1.Rd 2005-10-11 16:04 edzer * plotting aspect defaults for unprojected objects 2005-10-10 17:03 edzer * spplot.locator 2005-10-09 20:36 edzer * for lines, plot sp.layout elements before lines are drawn. 2005-10-06 21:42 edzer * lab -> labels in gridat() and text.SPDF cleaned up ll validity check in Spatial 2005-10-06 19:15 rsbivand * fixing geographical CRS 2005-10-05 21:30 edzer * degreeLabelsNS/EW to replace duplicate code to generate degree labels; text method for things that come out of gridat() gridat documentation bug; 2005-10-04 11:56 rsbivand * gridat 2005-10-03 21:41 edzer * 0*degree bug in spplot 2005-10-03 16:58 rsbivand * gridat 2005-10-03 08:09 edzer * error message changed in 2.2.0 2005-09-23 20:26 rsbivand * more sample.Polygon 2005-09-23 19:39 rsbivand * more sample.Polygon 2005-09-22 10:33 edzer * removed ppp 2005-09-22 10:32 edzer * moved ppp stuff to spspatstat interface package 2005-09-22 09:02 rsbivand * spdists 2005-09-14 20:36 edzer * coerce from ppp to SpatialGridDataFrame (the mask window) 2005-09-14 14:29 edzer * added coercion to SpatialPoints[DataFrame] from ppp (spatstat) objects; spplot: removed named first argument to xyplot and levelplot (was "formula", is now "x") 2005-09-14 10:28 edzer * changed error message 2005-09-14 10:20 edzer * clean up of code; Michael's image bug report; bubble plot now correct in pass1.R 2005-09-13 14:38 rsbivand * lots of holes 2005-09-13 12:55 rsbivand * lots of holes 2005-09-12 13:02 edzer * merged some manual pages. 2005-09-12 08:15 rsbivand * SpatialPointsDataFrame CRS(as.character(NA)) 2005-09-11 21:07 edzer * add = FALSE default argument; add = TRUE now works again 2005-09-11 20:18 edzer * request from Deepayan Sarkar--panel.counter -> panel.number 2005-09-10 19:55 rsbivand * hole fixed in pip 2005-09-10 18:01 rsbivand * hole fixed in pip 2005-09-09 10:00 edzer * Rings -> Polygons variable name changes 2005-09-09 08:33 edzer * function to draw SN and EW lines in a box 2005-09-08 20:20 rsbivand * fixing point in polygon and spsample for small n 2005-09-07 12:24 edzer * lines starting with #S will now be visible for S-Plus 2005-09-07 12:12 edzer * S-Plus compatibility modifications 2005-09-07 09:48 edzer * latlong -> longlat in gallery; removed debug print() statements in degAxis(); upgraded version 2005-09-06 11:21 edzer * sp.polygon -> sp.polygons 2005-09-06 07:06 rsbivand * Kurt's remarks 2005-09-06 06:58 rsbivand * Kurt's remarks 2005-09-06 06:52 rsbivand * Kurt's remarks 2005-09-05 13:05 edzer * drop! 2005-09-05 11:42 edzer * plot things. 2005-09-05 08:44 edzer * read_ShapeXxx -> readShapeXxx 2005-09-05 07:49 edzer * latlong -> longlat 2005-09-05 07:47 edzer * added CRS-methods.R 2005-09-05 07:44 edzer * plot.Spatial now uses is.projected(); split CRS class and method file 2005-09-03 16:19 rsbivand * added ... to degAxis() 2005-09-03 09:40 rsbivand * setting drop=TRUE in [ methods 2005-09-03 08:57 rsbivand * latlong to longlat 2005-09-02 12:56 edzer * nothing 2005-09-02 11:13 edzer * more setMethod issues for plot and show 2005-09-02 10:00 edzer * removed require(grid)/require(lattice) commands; added is.R() if it's not present (S-Plus) added ncol/nrow methods for S-Plus AttributeList changed plot.new() into frame() for S-Plus compat. removed nc.test contents (nc is now in maptools) added y argument to some plot methods--they should be there, according to the generic! 2005-09-02 08:55 rsbivand * drop SpatialPoints and *gallery/maptools* 2005-09-01 12:32 rsbivand * removing shps etc. 2005-09-01 12:23 edzer * updated some prototypes() to pass import (source()) in S-Plus 6.2.1; no further checks done 2005-09-01 08:11 edzer * axes in bubble; xlab/ylab in spplot 2005-09-01 08:10 edzer * names 2005-08-30 18:19 rsbivand * RGB image for grid 2005-08-30 13:13 rsbivand * subsetting SpatialPolygons 2005-08-30 11:37 edzer * changed references to rings into polygons. 2005-08-30 11:05 edzer * [ method now accepts length-one TRUE 2005-08-30 09:40 edzer * clean up 2005-08-30 09:40 rsbivand * drop=FALSE in SPointsDF 2005-08-30 08:33 edzer * plot and summary from S3 -> S4; cleaned up 2005-08-26 18:23 rsbivand * more Polygons 2005-08-26 14:51 edzer * factor plotting in spplot for grids&polygons 2005-08-26 14:41 rsbivand * more Polygons 2005-08-25 21:44 edzer * map.to.lev is no spmap.to.lev degrees N/S/E/W axes if proj4string() contains latlong 2005-08-25 15:08 rsbivand * changing vector class names 2005-08-25 14:32 rsbivand * changing vector class names 2005-08-24 20:38 edzer * default plotting without axes for all classes; all now start with plot.new() which makes it impossible to pass xlab/ylab. scale bar/north arrow now work for traditional graphics as well. Updated tests. 2005-08-20 22:55 edzer * bug. 2005-08-19 20:05 edzer * bug fix--sampling of line with only 2 points. 2005-08-19 15:31 edzer * methods to get the AttributeList, or its component without slot access spplot with grids as background 2005-08-17 12:45 rsbivand * added as.SpatialRings.GridTopology 2005-08-17 12:34 rsbivand * added as.SpatialRings.GridTopology 2005-06-23 07:57 edzer * version update 2005-06-18 19:11 rsbivand * rest of 0.7-10 2005-06-17 11:50 edzer * allow factors to be set in AttributeList; probibit vectors of mode raw or list 2005-06-17 11:35 edzer * these changes are already in sp 0.7-9 on CRAN; removed all double quotes from \alias and \link entries. 2005-06-16 17:15 rsbivand * small SpatialLines fix 2005-06-15 19:20 edzer * removed " in \alias of Rd files 2005-06-14 10:22 edzer * spplot: polygons behind grid; order of panels now that specified; first = TRUE argument optional to plot polygons over grids. SGDF: corrected bug if attribute was factor (now ffreq in meuse.grid is); stack: order of levels changed, not alphabetical anymore; 2005-06-08 14:02 rsbivand * pre 0.7-8 2005-05-28 20:03 rsbivand * most of 0.7-8 2005-05-27 10:49 edzer * formula argument added to spplot methods 2005-05-25 15:09 edzer * attempted to save memory when going from SPixDF to SGDF 2005-05-25 08:40 edzer * added names, names<-, coordnames and coordnames<- methods to all classes; replaced coordinates<- with the S4 mechanism (setReplaceMethod). 2005-05-22 21:39 edzer * needed. 2005-05-22 21:38 edzer * added names and names<- to all *DataFrame classes, now operating on all *DataFrame classes (only on the data slot). 2005-05-21 18:47 rsbivand * ID checks for Srings etc 2005-05-20 23:38 edzer * ID checking for SpatialPointsDataFrame; rownames removal for SpatialPoints; tests/fail stuff. 2005-05-20 13:57 edzer * version upgrade 2005-05-20 11:19 edzer * The Valencia session: changed the data slot in SpatialPixelDataFrame, SpatialGridDataFrame and SpatialPointsDataFrame from class data.frame to class AttributeList, thereby removing the row.names issue (which costed too much time and memory). 2005-05-12 20:53 edzer * michael's edits 2005-05-11 08:40 edzer * version up; spsample/overlay methods for SpatialPixels* 2005-05-10 12:11 edzer * bug in overlay if single column were selected (added drop=FALSE) 2005-05-03 20:31 rsbivand * nowrapSpatialLines 2005-05-02 11:24 rsbivand * adding recenter method 2005-04-30 14:12 rsbivand * hole in vignette 2005-04-28 20:35 rsbivand * cleaning details 2005-04-28 09:26 edzer * removed second URL 2005-04-28 08:52 edzer * version update; URL added 2005-04-28 08:46 edzer * wrong URL 2005-04-27 15:02 edzer * cbind.SpatialGridDataFrame 2005-04-27 14:02 rsbivand * added arguments to asciigrid 2005-04-27 12:27 rsbivand * splitting out GDAL 2005-04-27 11:03 edzer * removed S-plus related stuff 2005-04-27 11:00 edzer * moved to S-Plus area 2005-04-27 10:43 rsbivand * removed commented-out Rings code 2005-04-27 10:35 rsbivand * removed commented-out Rings code 2005-04-26 19:48 rsbivand * check holes 2005-04-22 15:26 edzer * .. 2005-04-22 15:23 edzer * $ and $<- stuff 2005-04-22 11:36 edzer * spplot method for SpatialPixelsDataFrame, and a new one for SpatialGridDataFrame 2005-04-22 06:28 edzer * cleaned up some if (drop == TRUE) stuff 2005-04-20 16:04 edzer * Splitted SpatialGrid* into SpatialPixels* and SpatialGrid* for pixels vs full grids 2005-04-18 12:45 edzer * bug noted by Tom Short in [.SpatialLines 2005-04-18 07:34 edzer * SaveImage: yes does what install.R first did the recommended way (TM) 2005-04-18 07:33 edzer * SaveImage: yes now in DESCRIPTION; methods loaded by default 2005-04-13 09:34 edzer * version update spsample for SpatialRings containing multiple Srings spsample docs update 2.1.0-beta tests output 2005-04-12 20:53 edzer * xx 2005-04-08 21:41 edzer * panel stuff 2005-04-08 20:57 edzer * added gallery demo; spplot panel stuff 2005-04-08 14:48 edzer * holes. 2005-04-08 07:34 edzer * more variables in meuse.grid; some work on vignette 2005-04-07 08:14 rsbivand * merging older changes 2005-04-06 11:19 edzer * unaligned -> nonaligned 2005-04-06 09:47 edzer * spsample and overlay now work on grids; added areaSpatialGrid and SlineLength function (1st doc'd, 2nd not) email change in Rd files 2005-04-05 09:46 edzer * spsample method 2005-04-02 21:51 edzer * made spplot a generic 2005-04-01 14:15 edzer * xx 2005-03-30 09:56 edzer * first attempt for an "overlay" method. 2005-03-29 20:02 edzer * Points and grids can now have more than 3 spatial dimensions, although the plotting methods are not of much use for them. 2005-03-25 16:35 edzer * sp.layout stuff 2005-03-23 21:40 edzer * added meuse river fragment 2005-03-23 21:00 edzer * comments 2005-03-22 15:22 edzer * back in. 2005-03-22 15:14 edzer * cosmetic changes 2005-03-22 10:35 edzer * getting the transform generic right...? 2005-03-22 08:10 rsbivand * removed transform-method 2005-03-21 17:24 edzer * error-version to catch transform attempts if spproj is not available 2005-03-21 16:38 edzer * transform method; rings docs 2005-03-21 11:04 edzer * plotting order in subset [ 2005-03-21 10:02 edzer * xx 2005-03-21 09:33 edzer * now all in spplot 2005-03-21 09:32 edzer * docs clean-ups 2005-03-21 08:20 edzer * cleaned up cplot/gridplot/lplot; vignette, docs; "[" now works for lines and rings incl *DataFrame stuff. 2005-03-20 21:52 edzer * added rings() and rings<- ; cleaned up \email{} in .Rd's, removed cplot (now spplot); removed arcs generic. 2005-03-18 16:30 rsbivand * proj4string as.character() 2005-03-17 21:30 rsbivand * extended Shapes import 2005-03-17 09:04 rsbivand * small fixes for spproj 2005-03-16 21:10 rsbivand * more SRings 2005-03-16 18:31 rsbivand * more SRings 2005-03-16 15:49 rsbivand * more SRings 2005-03-16 14:11 rsbivand * more SRings 2005-03-16 13:29 edzer * ... 2005-03-15 20:58 rsbivand * not very much on Rings 2005-03-15 10:06 edzer * gallery works again 2005-03-12 15:26 edzer * spplot for SpatialLinesDataFrame's 2005-03-11 21:54 edzer * the manual page (under constr.). 2005-03-11 21:51 edzer * mainly spplot stuff 2005-03-10 20:02 edzer * dev... 2005-03-10 13:27 edzer * spplot dev 2005-03-09 16:48 edzer * ... 2005-03-09 10:10 edzer * data -> Rlogo 2005-03-09 10:10 edzer * made R CMD check work again; Rlogo: renamed data to Rlogo 2005-03-08 22:32 edzer * x 2005-03-08 22:23 edzer * map marks: north arrow, scale bar 2005-03-08 22:20 edzer * spplot() function; first attempt 2005-03-04 20:42 edzer * added [ [[ [[<- and as.data.frame() methods; many \alias{}'s added to docs 2005-03-04 17:52 rsbivand * pO = 1:length(Srl) 2005-03-04 09:14 edzer * added points() and lines() methods to xPointsXx and xLinesXx classes 2005-03-03 20:44 rsbivand * changed example for read.gdal 2005-03-03 18:45 rsbivand * document lines examples 2005-03-03 13:24 edzer * removed makefile 2005-03-03 10:21 rsbivand * sorted out Slines examples 2005-03-02 11:04 edzer * clean up; added docs; 2005-03-01 23:08 edzer * ... all preliminary versions of course... 2005-03-01 23:07 edzer * documentation of some classes and methods; replaced some obsolete stuff like getSlineCoordsSlot() with coordinates(), bbox.R4 with bbox() added Slines class; now parallel with Sring/Srings stuff. Updated all test output; summary now starts with the class name. 2005-03-01 20:58 edzer * ... 2005-02-28 22:30 edzer * wip 2005-02-28 14:24 edzer * maintainance; vignette stuff 2005-02-28 09:13 edzer * vignette; grid maintainance 2005-02-25 16:30 edzer * vignette stuff 2005-02-25 08:44 edzer * return() 2005-02-24 23:28 edzer * xx 2005-02-24 18:13 edzer * xx 2005-02-24 18:06 edzer * nothing special 2005-02-24 17:58 edzer * sp vignette; work in progress. 2005-02-22 15:46 edzer * ... 2005-01-26 15:43 edzer * added importFrom() in NAMESPACE, and Imports: to DESCRIPTION, and removed the require(lattice) stuff. 2005-01-25 20:29 edzer * forgot this one. 2005-01-25 20:27 edzer * making R CMD check work again 2005-01-23 21:09 edzer * lplot update -- functions are now gridplot and ringplot 2005-01-21 15:33 edzer * work on lplot; now called gridplot and ringplot (names to be changed) 2005-01-19 16:36 edzer * fixed identify in lattice points plot 2005-01-19 16:03 edzer * new file; moved stuff from Class-Spatial.R 2005-01-19 16:02 edzer * more on the generics as(x, "yy") stuff 2005-01-19 15:01 edzer * uncommented .noGenerics = TRUE in AAA.R; restored a couple of (now working) setAs and setMethod things. Somehow, I still cannot get setMethod("[[",...) working. 2005-01-17 12:50 edzer * more change 2005-01-13 09:39 edzer * moving Spatial[Gridded|Cell] into new SpatialGrid[DataFrame], removed a lot of setAs/setIs troubles in Points/Grids; extended grid tests. 2005-01-13 09:37 edzer * moved Spatial[Cell/Gridded] stuff into a single class, SpatialGrid and SpatialGridDataFrame added GridTopology class, which holds grid topology (offset, dim, cellsize) 2005-01-07 00:42 edzer * three layer raster rgdal read now works; more setIs/setAs mess and coercion from SPDF to data.frame if coords are not in the data.frame (as when coming from a SpatialGriddedDataFrame). 2005-01-06 19:41 rsbivand * chane in NAMESPACE for spproj 2005-01-06 19:16 edzer * messing with setAs's... 2005-01-06 18:14 edzer * added read.gdal stuff 2005-01-06 15:25 edzer * 00sp.Rd is meant as an introductory text. 2005-01-06 15:24 edzer * changed missing value to -1; added 3 x 4 simple asciigrid map 2005-01-06 15:22 edzer * mostly work on gridded stuff; nothing on Rings. 2005-01-05 19:55 rsbivand * Spatial Lines/Rings redone 2004-12-24 08:47 edzer * checks on coordinates needing to be numeric; this will stop coordinates(meuse) to work when meuse is a data.frame. 2004-12-24 08:01 edzer * error on coordinates() with non-numeric elements (data.frame, matrix, list) 2004-12-17 20:33 edzer * large file split 2004-12-17 11:02 edzer * SpatialGridded[DataFrame], mainly, and coercion, [, [[, [[<-, image, tests, etc. 2004-12-15 21:47 rsbivand * adding line data 2004-12-15 14:57 rsbivand * SpatialLines 2004-12-14 22:01 edzer * further clean up; [.SpatialCellDataFrame 2004-12-14 20:07 edzer * implemented the Gridded (full grids); cleaning up double stuff 2004-12-02 06:39 rsbivand * uncommenting .__C__* 2004-12-01 21:54 edzer * reverted back the .__C__* stuff 2004-12-01 20:37 edzer * as(SP, "matrix") and as.matrix(SP) now work. 2004-12-01 13:46 edzer * cleaned up NAMESPACE; tried on SP, as(x, "matrix") but gave up 2004-12-01 12:44 edzer * export S3method as.data.frame.SpatialPointsDataFrame; went back to the old versions where S3 calls S4, and coordinates get back in place 2004-11-30 21:09 rsbivand * getting as() working 2004-11-26 15:37 rsbivand * resolved subset.matrix and fail1 2004-11-26 09:35 rsbivand * revised tests/*.Rout.save 2004-11-26 08:47 rsbivand * more NAMESPACE and R_init_sp 2004-11-24 17:22 rsbivand * adding NAMESPACE 2004-11-23 19:44 rsbivand * before NAMESPACE 2004-11-23 10:35 edzer * got rid of R CMD check "coordinates<-" message; added SpatialLines (mostly empty); 2004-11-10 21:39 edzer * allow plotting of factor attribute columns 2004-11-10 15:58 edzer * doc err 2004-11-10 15:57 edzer * xx 2004-11-10 15:56 edzer * cplot addition 2004-11-10 15:55 edzer * docs check 2004-11-10 11:01 edzer * put old stuff in. 2004-11-09 20:45 edzer * more stuff 2004-11-09 20:37 edzer * added plotting utils; worked on SpatialPoint + deriv classes 2004-11-08 21:52 edzer * coordinates are now merged in place. 2004-11-06 19:51 edzer * added stripping of coordinates from data.frame in SpatialPointsDataFrame, when set by e.g. > coordinates(x) <- c("x", "y") when coerced back to data.frame, coordinates are glued back to the data (although perhaps in a different position -- they're first then) 2004-11-05 20:02 edzer * plot stuff 2004-11-05 19:24 rsbivand * first commit of SRDF 2004-11-05 19:20 edzer * to.image stuff for Cell 2004-11-05 19:17 rsbivand * first commit of SRDF 2004-11-05 18:54 edzer * tests stuff... 2004-11-05 17:12 rsbivand * Rings display methods 2004-11-05 16:47 edzer * xx 2004-11-05 16:47 edzer * tests still fail... 2004-11-05 16:38 edzer * update 2004-11-05 16:30 edzer * sp 0.6 is an almost complete rewrite 2004-11-05 16:14 edzer * sp 0.6 is an almost complete rewrite. 2004-11-05 10:25 edzer * version update 2004-11-01 12:33 edzer * Class-SpatialData.q: an attempt for "[[" and "[[<-", which does not work (outcommented); others: use "iso" for map aspect in trellis plots 2004-10-07 21:14 edzer * 2.0.0 compat stuff 2004-09-28 18:46 rsbivand * density in .polygon() 2004-09-28 12:52 edzer * expand argument 2004-09-28 12:36 edzer * lplot port to R 2.0.0; fail1.R/fail1.Rout.save update to R 2.0.0 2004-09-25 18:24 rsbivand * end of sept 2004-09-24 22:38 edzer * made panel.lplot local, to avoid having to document the beast... 2004-09-24 22:33 edzer * lplot + panel function stuff; added lplot example to S...class.Rd 2004-09-24 22:25 edzer * added plotting of SpatialDataFramePolygons with lplot (+ panel.lplot function) 2004-09-15 08:30 edzer * changes made at Philly airport; trying to make lplot work; coordinates(x, "names") etc 2004-06-29 12:14 rsbivand * file names 2.0.0 2004-06-18 20:28 rsbivand * backoff on ring directions 2004-06-18 14:59 rsbivand * backing out of too brave ring direction assumption 2004-06-08 10:16 rsbivand * allow P4 without pO 2004-06-08 10:07 rsbivand * allow P4 without pO 2004-06-03 14:46 edzer * Guys, sp still works under R 1.8. As do I. 2004-06-01 19:08 rsbivand * more work on insiders using Barry's p-in-p idea 2004-05-26 07:13 edzer * plotting of SpatialDataFrameGrid returned par() settings; now invisible 2004-05-24 12:18 edzer * S-Plus compatibility issues 2004-05-19 06:56 rsbivand * added mild ring direction checking to Map2Poly4 2004-05-14 14:17 edzer * polygon S-Plus portability issues 2004-05-14 09:27 edzer * S-Plus compatibility issues. 2004-05-14 07:44 rsbivand * holepolys example 2004-05-13 18:25 rsbivand * added plot order and ring-direction to Polygon4/Polylist4 2004-05-13 15:25 edzer * this file is generated from S/src/pip.c, and should be modified there 2004-05-13 15:22 edzer * removed all files in sp/R: they are created automatically from the .q sources in sp/S by typing `make' in the sp directory. This was necessary to create a single S-Plus/R source. Removing them hopefully decreases the chances of changes to .R files, being overwritten. 2004-05-13 10:24 edzer * map2Poly4; tests out files 2004-05-11 19:40 edzer * ported tests to S-Plus; see makefile 2004-05-11 19:38 edzer * wip 2004-05-11 19:32 edzer * wip 2004-05-11 07:27 edzer * see CHANGES 2004-04-22 13:29 edzer * I messed up the "[" on SDFGrids; works again, I hope! 2004-04-21 19:50 edzer * time for 0.5-0. 2004-04-21 19:48 edzer * further S-Plus portability issues, like grep(), par("col")/par("fg") 2004-04-21 13:16 edzer * moved main sorce from R (R-code) to S (single code for R and S-Plus); this requires a single make in the sp directory to create the R sources from S. So, no longer modifying in the R directory; use the S (*.q) code instead!! `make' also creates .Rbuildignore, with all the files that an R build should ignore. 2004-04-21 13:09 edzer * S-Plus portability scripts 2004-04-21 06:19 rsbivand * fix plot for SDFPolygons 2004-04-20 20:55 edzer * uniforming file name extensions 2004-04-17 22:15 edzer * max argument in plot.SpatialDataFrame -- for S-Plus, R doesn't like it 2004-04-17 21:57 edzer * mostly S-Plus compatability issues. 2004-04-17 21:56 edzer * xx 2004-04-17 21:43 edzer * set back required version to 1.8 -- should be as low as possible? 2004-04-16 07:24 rsbivand * add coerse for SDFPolygons 2004-04-08 19:53 edzer * test asciigrid file. Ahumm, ... not generated by ArcGrid. 2004-04-08 12:58 rsbivand * cleaned SpatialDataFramePolygons 2004-04-08 12:48 rsbivand * cleaning SpatialDataFramePolygons 2004-04-07 14:22 edzer * still need do do examples 2004-04-07 11:40 rsbivand * added SpatialDataFramePolygons 2004-04-07 09:07 rsbivand * added SpatialDataFramePolygons 2004-04-05 20:52 edzer * work in progress. 2004-04-02 18:25 rsbivand * switched data back to ASCII 2004-04-02 12:29 edzer * S-Plus portability issues 2004-03-31 14:40 edzer * minor mods 2004-03-29 15:18 edzer * extensions to SDFGrid, see gridparameters() function 2004-03-27 19:53 rsbivand * INDEX update 2004-03-20 05:11 rsbivand * upload sp without proj 2004-03-20 05:02 rsbivand * upload sp without proj 2004-03-14 20:16 edzer * cosmetic. 2004-03-14 19:58 edzer * Initial revision 1999-12-15 10:41 * New repository initialized by cvs2svn. sp/inst/doc/0000755000175100001440000000000012321302443012426 5ustar hornikuserssp/inst/doc/csdacm.R0000644000175100001440000006645312321302443014021 0ustar hornikusers### R code from vignette source 'csdacm.Rnw' ################################################### ### code chunk number 1: csdacm.Rnw:53-56 ################################################### owidth <- getOption("width") options("width"=90) .PngNo <- 0 ################################################### ### code chunk number 2: figreset (eval = FALSE) ################################################### ## .iwidth <- 5 ## .iheight <- 6 ## .ipointsize <- 12 ################################################### ### code chunk number 3: csdacm.Rnw:65-66 ################################################### .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 4: afig (eval = FALSE) ################################################### ## .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") ## pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) ## opar <- par(mar=c(3,3,1,1)+0.1) ################################################### ### code chunk number 5: zfig (eval = FALSE) ################################################### ## dev.null <- dev.off() ## cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") ################################################### ### code chunk number 6: csdacm.Rnw:109-112 ################################################### myfun <- function(x) { x + 2 } ################################################### ### code chunk number 7: csdacm.Rnw:117-118 ################################################### myfun(1:3) ################################################### ### code chunk number 8: csdacm.Rnw:123-124 ################################################### myfun(x=1:3) ################################################### ### code chunk number 9: csdacm.Rnw:130-133 ################################################### plotXplus2Yminus3 <- function(x, y, ...) { plot(x = x + 2, y = y - 3, ...) } ################################################### ### code chunk number 10: csdacm.Rnw:146-147 ################################################### methods("plot") ################################################### ### code chunk number 11: csdacm.Rnw:152-154 ################################################### library(sp) showMethods("plot") ################################################### ### code chunk number 12: csdacm.Rnw:165-168 ################################################### x <- rnorm(10) class(x) <- "foo" x ################################################### ### code chunk number 13: csdacm.Rnw:177-180 ################################################### plot.foo <- function(x, y, ...) { plot.default(x, type = 'l', ...) } ################################################### ### code chunk number 14: csdacm.Rnw:189-190 ################################################### class(x) <- c("foo", "bar") ################################################### ### code chunk number 15: csdacm.Rnw:192-193 (eval = FALSE) ################################################### ## plot(x) ################################################### ### code chunk number 16: csdacm.Rnw:204-207 ################################################### data(meuse) class(meuse) class(lm(log(zinc)~sqrt(dist), meuse)) ################################################### ### code chunk number 17: csdacm.Rnw:226-227 ################################################### options("width"=60) ################################################### ### code chunk number 18: csdacm.Rnw:229-249 (eval = FALSE) ################################################### ## setClass("CRS", representation(projargs = "character")) ## setClass("Spatial", ## representation(bbox = "matrix", proj4string = "CRS"), ## # NOT TOO WIDE ## validity <- function(object) { ## bb <- bbox(object) ## if (!is.matrix(bb)) ## return("bbox should be a matrix") ## n <- dimensions(object) ## if (n < 2) ## return("spatial.dimension should be 2 or more") ## if (any(is.na(bb))) ## return("bbox should never contain NA values") ## if (any(!is.finite(bb))) ## return("bbox should never contain infinite values") ## if (any(bb[,"max"] < bb[,"min"])) ## return("invalid bbox: max < min") ## TRUE ## } ## ) ################################################### ### code chunk number 19: csdacm.Rnw:251-252 ################################################### options("width"=70) ################################################### ### code chunk number 20: csdacm.Rnw:264-265 ################################################### isGeneric("show") ################################################### ### code chunk number 21: csdacm.Rnw:271-273 (eval = FALSE) ################################################### ## setGeneric("bbox", function(obj) standardGeneric("bbox")) ## setMethod("bbox", signature = "Spatial", function(obj) obj@bbox) ################################################### ### code chunk number 22: csdacm.Rnw:304-315 ################################################### library(sp) setClass("trip", representation("SpatialPointsDataFrame", TOR.columns = "character"), validity <- function(object) { if (length(object@TOR.columns) != 2) stop("Time/id column names must be of length 2") if (!all(object@TOR.columns %in% names(object@data))) stop("Time/id columns must be present in attribute table") TRUE } ) showClass("trip") ################################################### ### code chunk number 23: csdacm.Rnw:328-341 ################################################### trip.default <- function(obj, TORnames) { if (!is(obj, "SpatialPointsDataFrame")) stop("trip only supports SpatialPointsDataFrame") if (is.numeric(TORnames)) TORnames <- names(obj)[TORnames] new("trip", obj, TOR.columns = TORnames) } if (!isGeneric("trip")) setGeneric("trip", function(obj, TORnames) standardGeneric("trip")) setMethod("trip", signature(obj = "SpatialPointsDataFrame", TORnames = "ANY"), trip.default) ################################################### ### code chunk number 24: csdacm.Rnw:348-349 ################################################### turtle <- read.csv(system.file("external/seamap105_mod.csv", package="sp")) ################################################### ### code chunk number 25: csdacm.Rnw:351-360 ################################################### timestamp <- as.POSIXlt(strptime(as.character(turtle$obs_date), "%m/%d/%Y %H:%M:%S"), "GMT") turtle <- data.frame(turtle, timestamp = timestamp) turtle$lon <- ifelse(turtle$lon < 0, turtle$lon+360, turtle$lon) turtle <- turtle[order(turtle$timestamp),] coordinates(turtle) <- c("lon", "lat") proj4string(turtle) <- CRS("+proj=longlat +ellps=WGS84") turtle$id <- c(rep(1, 200), rep(2, nrow(coordinates(turtle)) - 200)) turtle_trip <- trip(turtle, c("timestamp", "id")) summary(turtle_trip) ################################################### ### code chunk number 26: csdacm.Rnw:372-382 ################################################### summary.trip <- function(object, ...) { cat("Object of class \"trip\"\nTime column: ") print(object@TOR.columns[1]) cat("Identifier column: ") print(object@TOR.columns[2]) print(summary(as(object, "Spatial"))) print(summary(object@data)) } setMethod("summary", "trip", summary.trip) summary(turtle_trip) ################################################### ### code chunk number 27: csdacm.Rnw:400-415 ################################################### setGeneric("lines", function(x, ...) standardGeneric("lines")) setMethod("lines", signature(x = "trip"), function(x, ..., col = NULL) { # NOT TOO WIDE tor <- x@TOR.columns if (is.null(col)) { l <- length(unique(x[[tor[2]]])) col <- hsv(seq(0, 0.5, length = l)) } coords <- coordinates(x) lx <- split(1:nrow(coords), x[[tor[2]]]) for (i in 1:length(lx)) lines(coords[lx[[i]], ], col = col[i], ...) } ) ################################################### ### code chunk number 28: csdacm.Rnw:436-437 ################################################### options("width"=50) ################################################### ### code chunk number 29: csdacm.Rnw:439-448 ################################################### setClass("SpatialMultiPoints", representation("SpatialLines"), validity <- function(object) { if (any(unlist(lapply(object@lines, function(x) length(x@Lines))) != 1)) # NOT TOO WIDE stop("Only Lines objects with one Line element") TRUE } ) SpatialMultiPoints <- function(object) new("SpatialMultiPoints", object) ################################################### ### code chunk number 30: csdacm.Rnw:450-451 ################################################### options("width"=70) ################################################### ### code chunk number 31: csdacm.Rnw:458-468 ################################################### n <- 5 set.seed(1) x1 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x2 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x3 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) L1 <- Lines(list(Line(x1)), ID="mp1") L2 <- Lines(list(Line(x2)), ID="mp2") L3 <- Lines(list(Line(x3)), ID="mp3") s <- SpatialLines(list(L1,L2,L3)) smp <- SpatialMultiPoints(s) ################################################### ### code chunk number 32: csdacm.Rnw:477-491 ################################################### plot.SpatialMultiPoints <- function(x, ..., pch = 1:length(x@lines), col = 1, cex = 1) { n <- length(x@lines) if (length(pch) < n) pch <- rep(pch, length.out = n) if (length(col) < n) col <- rep(col, length.out = n) if (length(cex) < n) cex <- rep(cex, length.out = n) plot(as(x, "Spatial"), ...) for (i in 1:n) points(x@lines[[i]]@Lines[[1]]@coords, pch = pch[i], col = col[i], cex = cex[i]) } setMethod("plot", signature(x = "SpatialMultiPoints", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) ################################################### ### code chunk number 33: csdacm.Rnw:513-525 ################################################### cName <- "SpatialMultiPointsDataFrame" setClass(cName, representation("SpatialLinesDataFrame"), validity <- function(object) { lst <- lapply(object@lines, function(x) length(x@Lines)) if (any(unlist(lst) != 1)) stop("Only Lines objects with single Line") TRUE } ) SpatialMultiPointsDataFrame <- function(object) { new("SpatialMultiPointsDataFrame", object) } ################################################### ### code chunk number 34: csdacm.Rnw:531-536 ################################################### df <- data.frame(x1 = 1:3, x2 = c(1,4,2), row.names = c("mp1", "mp2", "mp3")) smp_df <- SpatialMultiPointsDataFrame(SpatialLinesDataFrame(smp, df)) setMethod("plot", signature(x = "SpatialMultiPointsDataFrame", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) grys <- c("grey10", "grey40", "grey80") ################################################### ### code chunk number 35: csdacm.Rnw:538-539 (eval = FALSE) ################################################### ## plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) ################################################### ### code chunk number 36: csdacm.Rnw:546-553 ################################################### .iwidth <- 6 .iheight <- 2.5 .ipointsize <- 10 .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 37: csdacm.Rnw:569-573 ################################################### data(meuse.grid) gridded(meuse.grid)=~x+y xx <- spsample(meuse.grid, type="hexagonal", cellsize=200) class(xx) ################################################### ### code chunk number 38: csdacm.Rnw:581-582 ################################################### HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) ################################################### ### code chunk number 39: csdacm.Rnw:584-585 (eval = FALSE) ################################################### ## spplot(meuse.grid["dist"], sp.layout = list("sp.points", HexPts, col = 1)) ################################################### ### code chunk number 40: csdacm.Rnw:587-590 ################################################### HexPols <- HexPoints2SpatialPolygons(HexPts) df <- over(HexPols, meuse.grid) HexPolsDf <- SpatialPolygonsDataFrame(HexPols, df, match.ID = FALSE) ################################################### ### code chunk number 41: csdacm.Rnw:592-593 (eval = FALSE) ################################################### ## spplot(HexPolsDf["dist"]) ################################################### ### code chunk number 42: csdacm.Rnw:599-611 ################################################### .iwidth <- 6 .iheight <- 4 .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) library(lattice) # RSB quietening greys grys <- grey.colors(11, 0.95, 0.55, 2.2) print(spplot(meuse.grid["dist"], cuts=10, col.regions=grys, sp.layout = list("sp.points", HexPts, col = 1)), split = c(1, 1, 2, 1), more = TRUE) print(spplot(HexPolsDf["dist"], cuts=10, col.regions=grys), split = c(2, 1, 2, 1), more = FALSE) dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 43: csdacm.Rnw:624-631 ################################################### setClass("SpatialHexGrid", representation("SpatialPoints", dx = "numeric"), validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) ################################################### ### code chunk number 44: csdacm.Rnw:633-634 ################################################### options("width"=40) ################################################### ### code chunk number 45: csdacm.Rnw:636-644 ################################################### setClass("SpatialHexGridDataFrame", representation("SpatialPointsDataFrame", dx = "numeric"), # NOT TOO WIDE validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) ################################################### ### code chunk number 46: csdacm.Rnw:646-647 ################################################### options("width"=70) ################################################### ### code chunk number 47: csdacm.Rnw:664-669 ################################################### HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) Hex <- new("SpatialHexGrid", HexPts, dx = 200) df <- over(Hex, meuse.grid) spdf <- SpatialPointsDataFrame(HexPts, df) HexDf <- new("SpatialHexGridDataFrame", spdf, dx = 200) ################################################### ### code chunk number 48: csdacm.Rnw:676-679 ################################################### is(HexDf, "SpatialHexGrid") setIs("SpatialHexGridDataFrame", "SpatialHexGrid") is(HexDf, "SpatialHexGrid") ################################################### ### code chunk number 49: csdacm.Rnw:689-690 ################################################### options("width"=50) ################################################### ### code chunk number 50: csdacm.Rnw:692-701 ################################################### # NOT TOO WIDE setAs("SpatialHexGrid", "SpatialPolygons", function(from) HexPoints2SpatialPolygons(from, from@dx) ) setAs("SpatialHexGridDataFrame", "SpatialPolygonsDataFrame", function(from) SpatialPolygonsDataFrame(as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE) ) ################################################### ### code chunk number 51: csdacm.Rnw:703-704 ################################################### options("width"=70) ################################################### ### code chunk number 52: csdacm.Rnw:711-724 ################################################### setMethod("plot", signature(x = "SpatialHexGrid", y = "missing"), function(x, y, ...) plot(as(x, "SpatialPolygons"), ...) ) setMethod("spplot", signature(obj = "SpatialHexGridDataFrame"), function(obj, ...) spplot(SpatialPolygonsDataFrame( as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE), ...) ) setMethod("spsample", "SpatialHexGrid", function(x, n, type, ...) spsample(as(x, "SpatialPolygons"), n = n, type = type, ...) ) setMethod("over", c("SpatialHexGrid", "SpatialPoints"), function(x, y, ...) over(as(x, "SpatialPolygons"), y) ) ################################################### ### code chunk number 53: csdacm.Rnw:730-732 (eval = FALSE) ################################################### ## spplot(meuse.grid["dist"], sp.layout = list("sp.points", Hex, col = 1)) ## spplot(HexDf["dist"]) ################################################### ### code chunk number 54: csdacm.Rnw:739-740 (eval = FALSE) ################################################### ## as(HexDf, "data.frame") ################################################### ### code chunk number 55: csdacm.Rnw:747-749 ################################################### bbox(Hex) bbox(as(Hex, "SpatialPolygons")) ################################################### ### code chunk number 56: csdacm.Rnw:770-776 ################################################### n <- 10 x <- data.frame(expand.grid(x1 = 1:n, x2 = 1:n, x3 = 1:n), z = rnorm(n^3)) coordinates(x) <- ~x1+x2+x3 gridded(x) <- TRUE fullgrid(x) <- TRUE summary(x) ################################################### ### code chunk number 57: csdacm.Rnw:791-792 ################################################### options("width"=50) ################################################### ### code chunk number 58: csdacm.Rnw:794-801 ################################################### # NOT TOO WIDE setClass("SpatialTimeGrid", "SpatialGrid", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) ################################################### ### code chunk number 59: csdacm.Rnw:803-804 ################################################### options("width"=70) ################################################### ### code chunk number 60: csdacm.Rnw:811-819 ################################################### setClass("SpatialTimeGridDataFrame", "SpatialGridDataFrame", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) setIs("SpatialTimeGridDataFrame", "SpatialTimeGrid") x <- new("SpatialTimeGridDataFrame", x) ################################################### ### code chunk number 61: csdacm.Rnw:824-835 ################################################### summary.SpatialTimeGridDataFrame <- function(object, ...) { cat("Object of class SpatialTimeGridDataFrame\n") x <- gridparameters(object) t0 <- ISOdate(1970,1,1,0,0,0) t1 <- t0 + x[3,1] cat(paste("first time step:", t1, "\n")) t2 <- t0 + x[3,1] + (x[3,3] - 1) * x[3,2] cat(paste("last time step: ", t2, "\n")) cat(paste("time step: ", x[3,2], "\n")) summary(as(object, "SpatialGridDataFrame")) } ################################################### ### code chunk number 62: csdacm.Rnw:837-838 ################################################### options("width"=50) ################################################### ### code chunk number 63: csdacm.Rnw:840-843 ################################################### # NOT TOO WIDE setMethod("summary", "SpatialTimeGridDataFrame", summary.SpatialTimeGridDataFrame) summary(x) ################################################### ### code chunk number 64: csdacm.Rnw:845-846 ################################################### options("width"=70) ################################################### ### code chunk number 65: csdacm.Rnw:853-880 ################################################### subs.SpatialTimeGridDataFrame <- function(x, i, j, ..., drop=FALSE) { t <- coordinates(x)[,3] + ISOdate(1970,1,1,0,0,0) if (missing(j)) j <- TRUE sel <- t %in% i if (! any(sel)) stop("selection results in empty set") fullgrid(x) <- FALSE if (length(i) > 1) { x <- x[i = sel, j = j,...] fullgrid(x) <- TRUE as(x, "SpatialTimeGridDataFrame") } else { gridded(x) <- FALSE x <- x[i = sel, j = j,...] cc <- coordinates(x)[,1:2] p4s <- CRS(proj4string(x)) # NOT TOO WIDE SpatialPixelsDataFrame(cc, x@data, proj4string = p4s) } } setMethod("[", c("SpatialTimeGridDataFrame", "POSIXct", "ANY"), subs.SpatialTimeGridDataFrame) t1 <- as.POSIXct("1970-01-01 0:00:03", tz = "GMT") t2 <- as.POSIXct("1970-01-01 0:00:05", tz = "GMT") summary(x[c(t1,t2)]) summary(x[t1]) ################################################### ### code chunk number 66: csdacm.Rnw:893-906 ################################################### spplot.stgdf <- function(obj, zcol = 1, ..., format = NULL) { # NOT TOO WIDE if (length(zcol) != 1) stop("can only plot a single attribute") if (is.null(format)) format <- "%Y-%m-%d %H:%M:%S" cc <- coordinates(obj) df <- unstack(data.frame(obj[[zcol]], cc[,3])) ns <- as.character(coordinatevalues(getGridTopology(obj))[[3]] + ISOdate(1970,1,1,0,0,0), format = format) cc2d <- cc[cc[,3] == min(cc[,3]), 1:2] obj <- SpatialPixelsDataFrame(cc2d, df) spplot(obj, names.attr = ns,...) } setMethod("spplot", "SpatialTimeGridDataFrame", spplot.stgdf) ################################################### ### code chunk number 67: csdacm.Rnw:912-918 ################################################### .iwidth <- 6 .iheight <- 4 .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) print(spplot(x, format = "%H:%M:%S", as.table=TRUE)) dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 ################################################### ### code chunk number 68: csdacm.Rnw:927-932 (eval = FALSE) ################################################### ## library(lattice) ## trellis.par.set(canonical.theme(color = FALSE)) ## spplot(x, format = "%H:%M:%S", as.table=TRUE, cuts=6, ## col.regions=grey.colors(7, 0.55, 0.95, 2.2)) ## # RSB quietening greys ################################################### ### code chunk number 69: csdacm.Rnw:938-939 (eval = FALSE) ################################################### ## ?as.character.POSIXt ################################################### ### code chunk number 70: csdacm.Rnw:963-969 ################################################### library(gstat) data(meuse) coordinates(meuse) <- ~x+y v <- vgm(.5, "Sph", 800, .05) sim <- krige(log(zinc)~1, meuse, meuse.grid, v, nsim=100, nmax=30) sim@data <- exp(sim@data) ################################################### ### code chunk number 71: csdacm.Rnw:977-981 ################################################### quantile.Spatial <- function(x, ..., byLayer = FALSE) { stopifnot("data" %in% slotNames(x)) apply(x@data, ifelse(byLayer, 2, 1), quantile, ...) } ################################################### ### code chunk number 72: csdacm.Rnw:987-989 ################################################### sim$lower <- quantile.Spatial(sim[1:100], probs = 0.025) sim$upper <- quantile.Spatial(sim[1:100], probs = 0.975) ################################################### ### code chunk number 73: csdacm.Rnw:996-997 ################################################### medians <- quantile.Spatial(sim[1:100], probs = 0.5, byLayer = TRUE) ################################################### ### code chunk number 74: csdacm.Rnw:999-1000 (eval = FALSE) ################################################### ## hist(medians) ################################################### ### code chunk number 75: csdacm.Rnw:1014-1015 ################################################### options("width"=50) ################################################### ### code chunk number 76: csdacm.Rnw:1017-1022 ################################################### fractionBelow <- function(x, q, byLayer = FALSE) { stopifnot(is(x, "Spatial") || !("data" %in% slotNames(x))) apply(x@data < q, ifelse(byLayer, 2, 1), function(r) sum(r)/length(r)) # NOT TOO WIDE } ################################################### ### code chunk number 77: csdacm.Rnw:1024-1025 ################################################### options("width"=70) ################################################### ### code chunk number 78: csdacm.Rnw:1027-1030 ################################################### over500 <- 1 - fractionBelow(sim[1:100], 200, byLayer = TRUE) summary(over500) quantile(over500, c(0.025, 0.975)) ################################################### ### code chunk number 79: csdacm.Rnw:1047-1048 ################################################### fn <- system.file("pictures/erdas_spnad83.tif", package = "rgdal")[1] ################################################### ### code chunk number 80: csdacm.Rnw:1050-1053 (eval = FALSE) ################################################### ## x <- readGDAL(fn, output.dim = c(120, 132)) ## x$band1[x$band1 <= 0] <- NA ## spplot(x, col.regions=bpy.colors()) ################################################### ### code chunk number 81: csdacm.Rnw:1064-1070 ################################################### library(rgdal) x <- GDAL.open(fn) class(x) x.subs <- x[1:100, 1:100, 1] class(x.subs) gridparameters(x.subs) ################################################### ### code chunk number 82: csdacm.Rnw:1088-1089 ################################################### options("width"=50) ################################################### ### code chunk number 83: csdacm.Rnw:1091-1096 ################################################### setClass("SpatialGDAL", representation("Spatial", grid = "GridTopology", grod = "GDALReadOnlyDataset", # NOT TOO WIDE name = "character")) setClass("SpatialGDALWrite", "SpatialGDAL") ################################################### ### code chunk number 84: csdacm.Rnw:1098-1099 ################################################### options("width"=70) ################################################### ### code chunk number 85: csdacm.Rnw:1110-1126 (eval = FALSE) ################################################### ## x <- open.SpatialGDAL(fn) ## nrows <- GDALinfo(fn)["rows"] ## ncols <- GDALinfo(fn)["columns"] ## xout <- copy.SpatialGDAL(x, "erdas_spnad83_out.tif") ## bls <- 20 ## for (i in 1:(nrows/bls - 1)) { ## r <- 1+(i-1)*bls ## for (j in 1:(ncols/bls - 1)) { ## c <- 1+(j-1)*bls ## x.in <- x[r:(r+bls),c:(c+bls)] ## xout[r:(r+bls),c:(c+bls)] <- x.in$band1 + 10 #$ ## } ## cat(paste("row-block", i, "\n")) ## } ## close(x) ## close(xout) ################################################### ### code chunk number 86: csdacm.Rnw:1133-1140 (eval = FALSE) ################################################### ## setMethod("[", "SpatialGDAL", ## function(x, i, j, ... , drop = FALSE) ## x@grod[i = i, j = j, ...] ## ) ## setReplaceMethod("[", "SpatialGDALWrite", function(x, i, j, ..., value) { ## ... ## }) ################################################### ### code chunk number 87: csdacm.Rnw:1166-1167 ################################################### options("width"=owidth) sp/inst/doc/intro_sp.R0000644000175100001440000001557612321302443014424 0ustar hornikusers### R code from vignette source 'intro_sp.Rnw' ################################################### ### code chunk number 1: intro_sp.Rnw:72-73 ################################################### library(sp) ################################################### ### code chunk number 2: intro_sp.Rnw:76-78 ################################################### set.seed(13331) # library(lattice) ################################################### ### code chunk number 3: intro_sp.Rnw:179-183 ################################################### xc = round(runif(10), 2) yc = round(runif(10), 2) xy = cbind(xc, yc) xy ################################################### ### code chunk number 4: intro_sp.Rnw:188-191 ################################################### xy.sp = SpatialPoints(xy) xy.sp plot(xy.sp, pch = 2) ################################################### ### code chunk number 5: intro_sp.Rnw:197-198 ################################################### plot(xy.sp, pch = 2) ################################################### ### code chunk number 6: intro_sp.Rnw:206-209 ################################################### xy.cc = coordinates(xy.sp) class(xy.cc) dim(xy.cc) ################################################### ### code chunk number 7: intro_sp.Rnw:213-220 ################################################### 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:228-242 ################################################### 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:253-256 ################################################### df1 = data.frame(xy, df) coordinates(df1) = c("xc", "yc") df1 ################################################### ### code chunk number 10: intro_sp.Rnw:259-263 ################################################### 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:271-272 ################################################### coordinates(df2)[1:2,] ################################################### ### code chunk number 12: intro_sp.Rnw:276-280 ################################################### df2[["z2"]] df2[["z2"]][10] = 20 df2[["z3"]] = 1:10 summary(df2) ################################################### ### code chunk number 13: intro_sp.Rnw:284-286 (eval = FALSE) ################################################### ## bubble(df2, "z1", key.space = "bottom") ## spplot(df2, "z1", key.space = "bottom") ################################################### ### code chunk number 14: intro_sp.Rnw:292-294 ################################################### 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:313-316 ################################################### 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:320-321 ################################################### gridparameters(grd) ################################################### ### code chunk number 17: intro_sp.Rnw:327-332 ################################################### 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:344-351 ################################################### 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:360-367 ################################################### 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:401-405 ################################################### 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:416-427 ################################################### 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:435-438 ################################################### 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:450-461 ################################################### 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:468-472 ################################################### 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:475-476 ################################################### print(spplot(SrDf)) ################################################### ### code chunk number 26: intro_sp.Rnw:480-482 ################################################### SrDf = attr polygons(SrDf) = SpP sp/inst/doc/csdacm.pdf0000644000175100001440000125076612321302443014374 0ustar hornikusers%PDF-1.4 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Programming with classes and methods) endobj 5 0 obj << /S /GoTo /D (subsection.1.1) >> endobj 8 0 obj (S3-style classes and methods) endobj 9 0 obj << /S /GoTo /D (subsection.1.2) >> endobj 12 0 obj (S4-style classes and methods) endobj 13 0 obj << /S /GoTo /D (section.2) >> endobj 16 0 obj (Animal track data in package trip) endobj 17 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 20 0 obj (Generic and constructor functions) endobj 21 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 24 0 obj (Methods for trip objects) endobj 25 0 obj << /S /GoTo /D (section.3) >> endobj 28 0 obj (Multi-point data: SpatialMultiPoints) endobj 29 0 obj << /S /GoTo /D (section.4) >> endobj 32 0 obj (Spatio-temporal grids) endobj 33 0 obj << /S /GoTo /D (section.5) >> endobj 36 0 obj (Analysing spatial Monte Carlo simulations) endobj 37 0 obj << /S /GoTo /D (section.6) >> endobj 40 0 obj (Processing massive grids) endobj 41 0 obj << /S /GoTo /D [42 0 R /Fit ] >> endobj 62 0 obj << /Length 2535 /Filter /FlateDecode >> stream xY͓H_\D!Te+$RTxZ y_-{(}{mި+|ʹD%w:וO s[n|Hakk3|vEfKx_׈M] fYۭ?>:^UIft^Ƿ JW~@AK[%EnQ)+jN>WUd^!+8g]<ʂPe^jE0t5>5pR} ~_*W.| RZIZ[XL3=nn4W%:w`e_$U^ թ~"=>kCB3 >,a2#LHB܍LFF΢%2ml@k  TNvլΈlCdJdG;#Q6ɟPE(%a RJ4_dx$_/|uM ? ̅Tgh8t_7Xݾ^"*!:ǚ y~BX l[77[Q@f(^ܟqƴ`.2*-]utjlzKǀ l,-DzCP|z^ǙRJ.//\r0Ub+#zӈ`鄔q/QStϿ%ebCqW-q->ٞPțR 6_]LxT/^W,N$V=`IRndGKL58(mh}KAS)}`/h;չzG,=@ dU4(fhBRl.a;@W嗪a# HP#CQ)-Zoh$y`HiT4 Yzork̩O)'E">#"Lh/N 4 A g0u1O4p܆_%ݟ5&w9\C0(wZ( Ez$&,A{Z>L*ޭeb~Wr0`'ǧ݇ߧ:𫛝0:0 V<\yg9BnHNϓ9(ŐΐPuL}=(i:Ӟͺ٬JgnSB`Xk[^Kn6,#&S{Q ➫ZMⰝz͉XNӔfKW;L5U}s`64q:VW;,b4đ'A49c䯘+)خ@tǒX4_@4<[7 3Ns>!tCt_~"$::,ۛ?d|3y$Җr 6yѵ:yU./B A'ݍL[o2 I.7eH?h#Csm0c.6%k?;%xxF]RY@QjÝnZ~p'tHD>9]ty[ZV^kq΍- jBs&D9c6c +[8pڛKfůsP$>{D8aoF=_6=6^?,zM9}_"?EàCI%^LSQAOV͊hJ*L ˎiP܁v<&v=bnolZ_{p{1~boĶ"*QҠAsm/O[Yw"VL^=602OwqӖyhA4둗Yܻ1WMZnV`4ZS9(t͔aËZ I?M&v"IL-pn~;%RQ_#F\c[׋{"`;ٜn2J0RWL6|# sAGA!V?v;m>d?a`rmz[6M#TV c U67$`dSlU2?pD`Az#&):v,Nj*?hWǿ~MWĪCb"QZYv endstream endobj 42 0 obj << /Type /Page /Contents 62 0 R /Resources 61 0 R /MediaBox [0 0 612 792] /Parent 78 0 R /Annots [ 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R ] >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 458.529 349.238 469.328] /A << /S /GoTo /D (section.1) >> >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 446.574 297.513 457.413] /A << /S /GoTo /D (subsection.1.1) >> >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 434.619 297.513 445.458] /A << /S /GoTo /D (subsection.1.2) >> >> endobj 46 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 412.701 317.388 423.5] /A << /S /GoTo /D (section.2) >> >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 402.678 320.775 411.585] /A << /S /GoTo /D (subsection.2.1) >> >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.716 388.79 278.922 399.63] /A << /S /GoTo /D (subsection.2.2) >> >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 366.594 335.61 377.672] /A << /S /GoTo /D (section.3) >> >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 344.955 258.539 355.754] /A << /S /GoTo /D (section.4) >> >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 323.037 363.385 333.836] /A << /S /GoTo /D (section.5) >> >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 301.119 273.304 311.919] /A << /S /GoTo /D (section.6) >> >> endobj 63 0 obj << /D [42 0 R /XYZ 132.768 705.06 null] >> endobj 64 0 obj << /D [42 0 R /XYZ 133.768 667.198 null] >> endobj 69 0 obj << /D [42 0 R /XYZ 133.768 473.523 null] >> endobj 61 0 obj << /Font << /F44 65 0 R /F24 66 0 R /F20 67 0 R /F30 68 0 R /F56 70 0 R /F8 71 0 R /F63 72 0 R /F64 73 0 R /F31 74 0 R /F26 75 0 R /F67 76 0 R /F69 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 81 0 obj << /Length 2948 /Filter /FlateDecode >> stream xڽYY۸~Pq JRoH*Iٓ}HFeITSI{AnA"4Fwd=I'߽HW3Q&&&:)r"ɴ.'j6W*ӿ5vٯgs]Nb- M'c*/hל75]vnշJ<ˑt2TR%sr{тx{Sc&ǵ~mp4YVNOڏtm&U,l=8u'6\ (/ƦG Ԇ\ZǤe2*8g-T35͒GclѾF3k 6 28,쟦4W5u0Fk=oJ.䚠PPT "ȬPUF7wМo> :vz.]B׺ Ubp1bO^GcK: s;CQ`KciۃEX Du܊r JphW5?h-(x1H 2M;vZ mU>8P) eG]A@V8$xX㈴7ĕ[I*.o @Ӧ(Mƻ|.$|BbP<W$ǙQJ} "#=r0[󣯬  +6yU{t dAU!#_z2&֟0L'rxyx"@H==hY&J3(=-kמҳ>RXWKCa)c}`p#iRU֏j4ɏtånSCo~#P,T[a+{pva-QT}9#ZEYK_ DEhs1viQοm(^DCY5g^>8> >qSkgcoHGSOC-Yć _T  D =>pNlz0LYyJ s ._8 AZcz%6/\$&tzGc:6jE(*|00v7jѠK\#Hԉ~ڸbM4mVvUR>߲jE{Inead,߿<ܘ%y3C3! >^`Z\puL&or[Xc^-#:Rn %WS؏PySa Bձ7vqr IIIO m?)fYbK02hW"M'WK~aL7OBPం ~M6}^zxq¹IK 3GA7h{ $%2 yF1"m环F`UyEN݅@e^ ! :'Lɒ)GWaG@/ -sW\ZXC2@~`! 8:O|Wnw/+C(_b<| Xe(:)*#Q;R%Q);ss }V]^$@+~'EiRCr5r2W{6KJS>@cA.ҥ$_;|l:{AT1Ăy^ŞGe݅[)R>$\\Kч-~fn ^ Cwe.WE˫)Rh//8W`4> endobj 53 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [315.627 596.075 373.383 607.935] /A << /S /GoTo /D (cite.bivand) >> >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [378.465 596.075 400.383 607.935] /A << /S /GoTo /D (cite.bivand) >> >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [384.563 572.165 475.716 584.025] /A << /S /GoTo /D (cite.braun+murdoch:07) >> >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [132.772 560.209 154.69 572.07] /A << /S /GoTo /D (cite.braun+murdoch:07) >> >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [356.19 536.299 447.377 548.16] /A << /S /GoTo /D (cite.R:Venables+Ripley:2000) >> >> endobj 58 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [452.693 536.299 474.61 548.16] /A << /S /GoTo /D (cite.R:Venables+Ripley:2000) >> >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [152.287 524.344 198.055 536.204] /A << /S /GoTo /D (cite.R:Chambers:1998) >> >> endobj 60 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [203.404 524.344 225.322 536.204] /A << /S /GoTo /D (cite.R:Chambers:1998) >> >> endobj 82 0 obj << /D [80 0 R /XYZ 132.768 705.06 null] >> endobj 2 0 obj << /D [80 0 R /XYZ 133.768 667.198 null] >> endobj 79 0 obj << /Font << /F44 65 0 R /F8 71 0 R /F72 83 0 R /F63 72 0 R /F43 84 0 R /F67 76 0 R /F64 73 0 R /F73 85 0 R /F69 77 0 R /F11 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 93 0 obj << /Length 2335 /Filter /FlateDecode >> stream xڥYYo#~_A2 kAV/#rD;*Z%{rt ~Ϻꖞmfz-|>f mf׷3*rg.]gOWfѭw\-3Gſt[>5Cw\|^V瞩yoߟo#tͿ{tGbyiy^g<8 Qb6Y<2KzJ` 3*<|ʪ [ۅ*QU8v5 '4e%)hL gq"/3a2thj*s~*%4*iq \YT@%xNJjExXK$wsgfpȸ&?ߔO/ ]1\GQn乆;m =׃àJMQI[^jԅ+I*2v".9gѵ\5KnUYm2\[?3Mz;G7b*ߋ}5 rN\R(*F 6rvsւMT^=c*y 26溴\B3KD xz;%Nw%ģs, *TpB݄mf0f֪ɗcFσiBW ږ¹Fo̧af'~#պpʬ Dz[;+]f~iLj]T:~Y+o>?X7z f_]]?#^;~ Fiw KL2:8l Y^Ϝ.^o>ϣxkK%G%^oi{pDI@t[+88,:.=uL$M/0(6$&^!-^⎱fKC6X ,<<"]%eh9%$caTh &8|xuBh.ޠK8[~,`4̉)%ە&Ε7 Өgʙ"+Cx~4sPOnBIExh['oO-st~uۃ}6u( llʀnoa endstream endobj 92 0 obj << /Type /Page /Contents 93 0 R /Resources 91 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 94 0 obj << /D [92 0 R /XYZ 132.768 705.06 null] >> endobj 6 0 obj << /D [92 0 R /XYZ 133.768 567.869 null] >> endobj 91 0 obj << /Font << /F69 77 0 R /F8 71 0 R /F64 73 0 R /F63 72 0 R /F44 65 0 R /F82 95 0 R /F67 76 0 R /F73 85 0 R /F72 83 0 R >> /ProcSet [ /PDF /Text ] >> endobj 102 0 obj << /Length 2938 /Filter /FlateDecode >> stream xZKsW0 ٵJjRR9xQ͵HҶ*O?H9HuObH/%Geum^͈1@1 l >I+ˏw!&vFyO7y2ǣv#?ղGT¨)|,݌ {YV,sM0vYYa2tOLB?te7ki{ܛ`AKX~Z_KkLynK9WM9A Q:l@;%.  6Vmd;{x\#ڶ: A#*Pښ@Upևmu E!,aESI۹djvgݰ5U4j~>:qlՂmHA%c%8Ӽ~0,4DJ'&$?JY uu'Cͯ䧩N|Yuj^*t<>c`MPUYl}OT2LR6xW.<~~?&#@^;=Ww(t#ax!ٯvl\('_ԇI iq} 4VSvHf 5B:;V\Ù#O2(G9pCk#!Aj ϦY$9[|BljS(85GBWCy} a_Z0~x{ݔ"ݑnĀ@8-ڟd V7::OEJ"O]>ms(=reM\j\b`,4&\Qc%@KQJ˸ӒI01~BԠPNТ!j+KwJ[66WEni'1N"ݙ^Ǯ&^Imê^wr7VC-hֺ,n4ݵcW 隌.M{= ;ӽٮV0R)ō)oIpE ]c[΂r籷<Ԟ6j eA,H3+5('06A-ׁACj.jc'B/雍 QrC]TU%{=tz?vA{^dZޏǏvG&+.D/%8̆֨[h}k\pIGsob굄nd32>k \ɥkvyRh [Xj}zKN€_$zj; =^OH$MXA R(_ 1$RYxdFAE9 TtCg81M_)+AfM֧RJkf¡Sۙ%k`Y# <|Pf9EH3|O2LDܨJh$3>菧O*`̶ K; xՂúﱾkw3j%l_g܆H\B`uNg-rUu"ٲVՐz&."A3q&Ah~}&|> endobj 96 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [354.329 163.587 424.925 175.447] /A << /S /GoTo /D (cite.kirkwood06) >> >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [429.299 163.587 451.217 175.447] /A << /S /GoTo /D (cite.kirkwood06) >> >> endobj 98 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [455.592 163.587 478.476 175.447] /A << /S /GoTo /D (cite.page06) >> >> endobj 104 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [132.772 151.631 157.457 163.492] /A << /S /GoTo /D (cite.page06) >> >> endobj 99 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [162.127 151.631 184.045 163.492] /A << /S /GoTo /D (cite.page06) >> >> endobj 103 0 obj << /D [101 0 R /XYZ 132.768 705.06 null] >> endobj 10 0 obj << /D [101 0 R /XYZ 133.768 617.539 null] >> endobj 14 0 obj << /D [101 0 R /XYZ 133.768 204.882 null] >> endobj 100 0 obj << /Font << /F8 71 0 R /F67 76 0 R /F63 72 0 R /F44 65 0 R /F82 95 0 R /F64 73 0 R /F73 85 0 R /F69 77 0 R /F11 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 109 0 obj << /Length 2184 /Filter /FlateDecode >> stream xkF;"= QbׯSJ@T@Kwvd;cכĹ =zw<?Z;>?޹$e"e<0I(2FW\/ov< țe]Zy9+aji=Ơ& u8lg&v0,F)@Na62NFBB tքS4.ȗ[bhreˎ"IF^ <[D +qT1N% E^;FuV r y[RVȔMtG]**!8Z1b](>f9'd4TtPIQL"N*R pa95RVd}jLe0)A$(Y2 IH @gj2-燖%t | XΜn{d'ˆO($KX Rڌkhxå#?;AMs{!aC4[Gz0}{}}D| _~p ?儖EP`ͮIP$p@xN`±݂q-o&OVlo3ϤwqFS홵V͈| UeƷ/3t< XٕTPÃx9Jr[4:OvӀ$tX,1 7"c\sXb yr K0f,0)e uO.S۬M )rLP 4Mm2 0`oL=mPӈ9*REKos:v98r;h%8MM? =wBN35.g3Z%{˥3FugFRJԝ \B^ԵUH=-+lWs/ zlў>*::Z$, u#nX!sڜѨ^Wn96״g6vV2B?fnC_")P*%(pGUnm#RSHhu擦/ЏE 447ʩ2C c=z0L[/JkkHҹY0w6^狒f풿fm9ٚ$X{ qhx0h5 ͌C'00 #ق-RǡnQ(Lf9.Bv+wnrjf1Mps @mvw7x͈.|u)?80 ndZE#7jz,}d?̤_kTT1ǣo7C;UjNzчcx0q-޻E.?.NUlRٍ]*Mu|60[YhCp4ױqfÄ@q|ͷ67 #tA5D[M endstream endobj 108 0 obj << /Type /Page /Contents 109 0 R /Resources 107 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 110 0 obj << /D [108 0 R /XYZ 132.768 705.06 null] >> endobj 18 0 obj << /D [108 0 R /XYZ 133.768 308.13 null] >> endobj 107 0 obj << /Font << /F8 71 0 R /F63 72 0 R /F64 73 0 R /F67 76 0 R /F73 85 0 R /F69 77 0 R /F44 65 0 R >> /ProcSet [ /PDF /Text ] >> endobj 113 0 obj << /Length 1960 /Filter /FlateDecode >> stream xY[oD~_U 9foE,]Q ҂vWMJnS 97I nseΜy—߯^%T:WmkӉX \ ;wzn/o^6ƋG~_ O:[8%+LnCsY8*}Uke((~=hÃ+q'Wkco۷"+Ikوj^w=xt[r_$8 .-*ʈ12l}'9%ss;Ȅٽ,o1B~͏\_{kޞAAzV /M[&Bf"pV5H4sJThP2;9R*w. $p[ũi4&}C."S];ʩJ¸ YF$.k8GUPx N%ʵϠT[z) zK*r`xHag^)u%=%4cYecP M]!&.;L4tJ2AjMď-7|:Ul u.6-xY׊&U +'ô1@TK^iMiBA9`WTjs )syOt ӘExlѦt˟hgg>`SdT Q0¿&싛49B>ds`bkLt&VI0+M)W k|7[ߏw&+9JL.Q0RBa4?j4~׆tbW S%޽c > 67Hv0UƦ)הG9%'^Bxrh=Kq>C^ʶU=F~ߧs߷-}D2ƿ/9o">-}/McRE-*rXvJeYmMߐʋ6R1Ke|FhmGkU&0bLCK Njnh $brOZ)62`<S:9tPx*Iո^NY|m:L)(@MrfԑJ!b⯷t> endobj 114 0 obj << /D [112 0 R /XYZ 132.768 705.06 null] >> endobj 22 0 obj << /D [112 0 R /XYZ 133.768 268.718 null] >> endobj 111 0 obj << /Font << /F8 71 0 R /F73 85 0 R /F69 77 0 R /F44 65 0 R /F67 76 0 R >> /ProcSet [ /PDF /Text ] >> endobj 117 0 obj << /Length 2048 /Filter /FlateDecode >> stream xڭYێF}W>H :7;Y& #mE=uk)Q&$:$5GJ:t"fI%Jίf Y%켘]/B,oos" 5[0C3vNEׯ*R؋N5\%\IWpͶG;1DߖkR@WWuNu,T@,cAq0oFW֎"4WײCf2d(ѠDuUշܽbπ{D}>;tj=aYH%#[T,&9E]nY!UxX~eU$p:gpZfn0.( :^bͮeS/_OXkߢ_~GHW{ܵo];7Q Nm]P|ИɂD#Wͼ ~+H[ɜ( `TYp (%u3=K7 W:* D u7jHRlǀ3 9;zx7JKO *|F##:A&Sᤑ37#BdƄEGdeJN&X,N1"Lb +KX 7ǓɏIqF+ڄM ٵi!e {?~r)}D$gT)޵5*X%*[5V*|`L2Fi*^R+˲ D^,!/EU@5+CnԃQVZ'p:˂,61 )MXNNd  ^px#$dSСvlAdnkrZIs/oO/\Rr llէ͒yC[9z{(iDiO'g1TSJ#JpiʁyȄL pBY$3p>kdH9BZB>O;ߡ 䨷D,L+n;q 昑 d78 E\P;^I~Iz~jBJg\8o:CDzh]!bddu1,~kFJ\}hœ_r04a [>It; 6.1=C F^zNKyQƯe܆.|㰏nyE>ǡDB5=]Sv(UQfTbo4})Jbf-(b,'}dҘu~")gu+3Z@ ˚(D@h!hh١lRgK\d, G;s@e5@-.isZ_+ǤR@r+zD@keO8p*T4YR% *Y3o.y"ұw!(㺋Y :=Z>蓦(i%hN&#{TKwӱfu)kiddN4}FWQ3\/dؔݰO3gqk~(}i3~<c, 1U4EK={x3\5&2N~/v,O:ݨ} 9\X($N և_Xd>}=3!?&:rxXj/̯KnЩ/S䲚/:X|3y^~̻?RC0(!1^Mc>A|qϬ:tG%VG'Ud5ޑ$:5lv'H8Mx˂zrHa}2 ~ϡ> endobj 118 0 obj << /D [116 0 R /XYZ 132.768 705.06 null] >> endobj 115 0 obj << /Font << /F69 77 0 R /F73 85 0 R /F8 71 0 R /F67 76 0 R >> /ProcSet [ /PDF /Text ] >> endobj 122 0 obj << /Length 2230 /Filter /FlateDecode >> stream xZ[۶~ϯp2f%As&h E}j[ZXnE{g8C$- 7 GgpI_<ֳH 9X"Dd$NTb55PE8x=~7BEAj<:Xs_Lzc SX]Ɩ.$#žIr'2A Kq!#}3JDH .^"v\f/df ~D|/qx\[›b_7޲u?;[%|Mi1/P AЉcVˈe0%.[i/ haz V5mPTU7"5%ѓXoH FvĆD/sh観 &yZ{22ⶱD L:x-0kiK{!X2)tHD4sX^ˠ,sPYȲڗԻIƀ Ќ,,wա#(j(s22nULXoZi|ipҵp9NZq,QkfDW3kT#&enrږ>rgkk6|BW'pr/;6] I,Rl3?0\QQtb}!%#˿ 9#+QXMGSl"zGn6]sL̰ L^AC)i,34|QЭ&m]sY*4$f,B*'Cj8o%8O=c4G$puk׭Q6{Icm1TVDhKF /qGBsA5o4^|ء#?]Hq IQli+]Eaq7kgKܝC,+[G<bY͐ Oʲf9V;1u쪛ADF蚮un6/_=ú!? \Mbo0.vUc:i8ܜtĚQ] ᭭rXǣǔ>,2_E%nm1|<bW3=WCz6I`G2Ua^$]6WF(.Tx>$$JaR Ժ/B$IžD m9}g+[4&q/ qyЊU6a t߾*Җi7tjķN© mXo*IP}-MU5rLV1:񶷯 Y}]5OpdF=o!K}0Y?d,0̋?if%kuwyO{stKY#`Ч6G#HBφK]A?A}J(PQNuO guh',sݞa\l*OSc~Ww vlk VcEY;t4tӮ_Ӿbt+7?0K5j0JtwGAdzܦgک uwHr dsBg,̛œw endstream endobj 121 0 obj << /Type /Page /Contents 122 0 R /Resources 120 0 R /MediaBox [0 0 612 792] /Parent 119 0 R >> endobj 123 0 obj << /D [121 0 R /XYZ 132.768 705.06 null] >> endobj 26 0 obj << /D [121 0 R /XYZ 133.768 667.198 null] >> endobj 120 0 obj << /Font << /F44 65 0 R /F82 95 0 R /F8 71 0 R /F64 73 0 R /F67 76 0 R /F89 124 0 R /F63 72 0 R /F73 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 129 0 obj << /Length 2950 /Filter /FlateDecode >> stream xr}T`p┝kW;JA$D& W+'η9p+m9JAOO_Ӎxų_/>}WBUE̮ogI"/gyV(fu:L7,M{o?}UuNk͓\qKi\BG]pFGu<_vf%( Qi xoLk Qk$ru"[ItLK@<;|uZK .yAU^T0HTU$!ε7cF dP@>7i] d*.#w}7]s`GZ2+0AE뤷o7Ox=qew Bx`u6X:bS&[Xl*M+pb얀 knnM86!fxh^m! jDV3er ujU.GSUYxA|Tyܚ"2~rG%\ocOAWS,goA'%MV!aiV1a[܎eT|u(XݘTN!} 2('HK#u _IeW)qj HT*͊v ٰtGK|s[Eآ#̀DDꛞ뽬14SD3G [3x&sq [qSoWL3.U8~v&!0\QNTDKusd+DzOio'R ojKhX#Ѓ Sra *[OR)vmyB0N=2F47Gn/Wy\Z"xmdg'$ktjv-krA{lw-/?⋆,i}[ 2Jh,JJ#o'$(py⾁ݐ'm AĉY$wAˬwE|VUAbG!mA2'Hv r $xw"$J{j@dogJH|uBa";-Y ső-03wD:gkAPCk;s G0r.KF;#?Ms^qDqz:{l!;Nbb 9 ^1<ƍlBC&[_g,ش dao({pD$'xGd~Z,(g_ΟŎnr巑=~YL1 4пIŐp-%8kpl޸tC>arL ۅ9u,zТch4Oe[Lu^q3 aa֖)O]5u}#;tsc}g"KUcN+0@݊*|h>_mth1$# ݭ Nmp!@0SJq ꂅ=<"E6c Z { m m0Q,z^zjAyhZzZ~#A1 JV<﵆j(v+G\yDA{tTWG>J;c33O+PMP= ^mh%D z- Ix&]y>_#Γ5;iOJ-HQ7lo%\+a/+Qb/:W"}#6 q~5_^:}-kC 5m 0V{{;Hf5<[җ }@\^@qPK~T&o{ƴ AT\ 6gX>7Y ,RtR| 6 m V&=غ&x [a0a ֪L\ɯ. :e~b/Z>q6èl1]!kTԃnՃH t 8R~NvG 6_S/zWM"~ɜ.b{ \vO&F46QWolI,o"] u ]wU*Mt 8-Q0n´ NN ?MHqڝ82S)D0W}'҅{S7Z,fWmMKccPUA´37!R0-?p0oO7>)*;$JsDޗ{Ɲ˔xUpkE?_lܧ j5~V:p |\^DvGނ_= endstream endobj 128 0 obj << /Type /Page /Contents 129 0 R /Resources 127 0 R /MediaBox [0 0 612 792] /Parent 119 0 R /Annots [ 125 0 R ] >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [297.293 235.411 304.267 246.25] /A << /S /GoTo /D (figure.1) >> >> endobj 130 0 obj << /D [128 0 R /XYZ 132.768 705.06 null] >> endobj 127 0 obj << /Font << /F69 77 0 R /F8 71 0 R /F67 76 0 R /F89 124 0 R /F63 72 0 R /F73 85 0 R /F64 73 0 R >> /ProcSet [ /PDF /Text ] >> endobj 137 0 obj << /Length 1571 /Filter /FlateDecode >> stream xXYoF~ׯ D]޽#-E<-)HEE{ZrII hQk.wg瞝;#TwKԉP9(J"iNӍrWo|jO-\S'X卣Kȉ:p.Ε{>Q v4W}:a>5m`mI/.?;')qR2$@3/@hDT.\q+s+^xl'Ӥgn{*Fz2Be3dᑽx5xY+d2qp My])8bvdbސekEcLod~xb aGIDl{Uz=ѩ[Oxvqu:gXVxGN[#sN5 EL2x<~1rRxi31lAaT!|*vDɮhPaܫE_ .8LC_S[ɴ]RΦeXL晤) G5X%8傩ȳ-?.t5g"r-( Gw+)uޘ-:ܵAq*$b?oei]:;OPp腁$嗐:po%psNyZQ[ .؈U=ʡ3! 0QTw;f^ `ToԮc~"*+]ŵfPDsC0,xG{1gr3C`;P0~|x%.oA T;wKa46.۵Z5/;٩#… V!<܁NfaٿMҐk38)[E}QCp9/ID=@xN/d>0Q˦S3 Q+nL:"6",ujAkDFgәNY@ĭ7ӎ9 ($x$b9K+l)&0E` fFN6䋵 n`IK|=ɉ"ֻѺ1ts ,J6cB :@ ߱D13ݸy;W$r,Z{~]v]$$5 )]") )!856^6:|Z*i7>@הB>79)wKNz) f'h !S \kQ>4oxwW+X;?F{mZG^.׷EnAjmdD-'FC^ vXg%{D1jq0(~G $ ^ +fׁ0f:xD78@1a&T+XZ ~uicP~myoe!зa0~%tPmi#)xs/{KE^RWxd/8U?Txd GjW3i8$>i;r= endstream endobj 136 0 obj << /Type /Page /Contents 137 0 R /Resources 135 0 R /MediaBox [0 0 612 792] /Parent 119 0 R /Annots [ 132 0 R 133 0 R ] >> endobj 126 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Fig-bitmap-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 139 0 R /BBox [0 0 432 180] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 140 0 R/F2 141 0 R>> /ExtGState << >>/ColorSpace << /sRGB 142 0 R >>>> /Length 686 /Filter /FlateDecode >> stream xUN\1S&gnAI$D"\)EDEb"E~?36h 3x^vln\Bۚ ?/<\~rwƢ{ΐ ૙oO7H1*~7I췳>n4WDKaɝ`9DL vq{篖5PGd.?~-6ci8 (h=|̧}ږBFγ1ߘbپqX-N󐦁+)ن a`fa‰gq|p}XMΏA"u1Y 3Ҳe1I$}͏IsZ1Iyw]3e'd:HkI"gO"T%{L (3I" %m9PEb9Ɍ; y(29`\UʻTe*&R\ UhuNuNhI[gEfQtuUyų EP ,Jڢ!T(̷7y}w5PYvYJ{h|Z v^p֩w<' #褗8,뫅,6XkY'̪!*h$Ao0gq̑(7)kKZܔ::VɷaKT> endobj 140 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 141 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 143 0 R >> endobj 142 0 obj [/ICCBased 144 0 R] endobj 143 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> 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 132 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [352.723 438.571 359.697 449.41] /A << /S /GoTo /D (figure.2) >> >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [307.833 311.581 314.807 322.421] /A << /S /GoTo /D (figure.2) >> >> endobj 138 0 obj << /D [136 0 R /XYZ 132.768 705.06 null] >> endobj 131 0 obj << /D [136 0 R /XYZ 222.451 521.178 null] >> endobj 135 0 obj << /Font << /F8 71 0 R /F67 76 0 R /F69 77 0 R /F73 85 0 R >> /XObject << /Im1 126 0 R >> /ProcSet [ /PDF /Text ] >> endobj 148 0 obj << /Length 1746 /Filter /FlateDecode >> stream xXnF}Wyh%K2 炴HyHHD"Q~}dRI°33UNO Q$*y`L( '4hߦAR:=is+>w'Pmp~cjjx[<ճ8hyQ%]Ae%ذ^${~tZ`N<6Y0Obdb/A YuyFZ]e+z@Dz=E\4lYDB;owBf1t Jl-*[.dc$G;" C<֪HS6,! ީa>^6#tJm kp (ܥyuݥ;]Ş ТhPs^%XG>%* йyyM7V ^< !?x(W!jZ<(N}yzֳδT+=$ey`n| AVn޵fYKg(}-Kxgw^ns *5\[8qlG"sv_+B;a2FePJUlb7>,*=u,g|iFˉ?$vh\g>@ w;D)mU;oY.KQA֢'hUm1q:ƹQ$A!4Mӭ$喬S5 _)d]<;m/Xeә Ĩܦq:ܨ}=B{!6_c6c%mtjP 9[c@I@e Rv`xv\SCz!`u"B~ڗCaͧA.SMBȇW;5[H ~ n;OD>Q'Ȳ.,آ3!|'A{9{YMeigV1e@.xv{Jvy0SPw1V8On V<?ui ño t}=J&ޑ/%kx炈^$ R]bz |0r!$TE"*H(NC望e;y=ԊA=[cFJ/YR]?Nd"qs.ome?Gc2{Iw' H-#W?;^œt`2$_yP/MkLSo>>Ds > 9m \hΐuoYJ`C=<#MQر(IlOoxpPWAXeKLŒ# 7h"Je$̕^u_yLĞhj),x~*H}g};^ryYEMŌ6U@e…TCȗ?hiPMo$yUq⧈.7{2DOyE*hc#Nӡ-q:x^Î \ɟ[1XU|+s`v|`AӔgUXsd1λ ۣR6߹rFC~J2EB_q  `HUw)IZȵ #BnH0F $2ɡ۩ (}cfrYW 6JT$> endobj 134 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Fig-bitmap-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 150 0 R /BBox [0 0 432 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 151 0 R>> /ExtGState << >>/ColorSpace << /sRGB 152 0 R >>>> /Length 18309 /Filter /FlateDecode >> stream xˎLr^)jhOve* n@Óe T z7<=#_A2b%.>?q:Ǐp}nq>?}_ǿu}}z=p;~XmSI?BG\X*b=˗w<I%xfs +M0;3_ ЧЧЧe>RxM urx|\Fɕ22edЗ+eLN/r:<| fW#kט1ɗW#k|nuxB ߀$nC߀$5mI$P7o@u 7t8qxw`v|8CqwgwCqw2GO]<{v[nn{n3f͕ u` }n3N|qn3.Zrx8[[[+V`V`VH* JǏO$ igwt!5{ E0t0tp% S/'=={{JASy\VpwwߴbŸ{pϭ0Z[+ Z ZJ{pϭЭЭpZy8wr7r>]w T%.ɧcK.dwI>]wbZFK.2ϵg)~<|itMbhUnU^ ܪ ݪUJϭЭЭT2kUЭЭʕ`7FchU9M_緭is>1CqE3t3t'PFwcccc[>k+,c7949s#&ŸMMMT2krMM,}|nr \ [F'}}|:V8iw}&'[Fs%&|nrnd1h}MMMT2kr&GMMΕLF'M9is]3ir&O&O>Vs>7y TgL&>V' T3t'p|j&:\z?\nrY9+69&g&O>vs>79hrnYs>79C79/}| ISΚ|Y&'&|nrnr^ 8ZE3t3t'̚F'a9+69&g&g&Oqo&'[E3t3ts%&| I%&|nrb&|nrnr^ 8ZE3t3t'\O\VR~ 1_>C>/|n} I%gO@`h}n}n}d/Z[?Y tcݧppI>uwKwgM;W;t1lY,ݝi%yw',ݝ- \z>W; N+ɻ;Fz\Bsw &y1ns3t#O*>s3t'Qw@`h}n}n}dϭ0Z?Y t㬻M7ݍyiws>w7Cww6{Ew3tw3tw'̺Ew3twbyfFݝT2/en}Yw{ 8[a>C>W2m}gO>gO@p>>h}n}dϭЭ,HqrM&|nݼ7{Ũ1_t7Cw7CwwRɬ9at7/ |nnYw'݈}*| 6vZa$Z?j}nY' TgMZ@$ T3t'Z?ɧOZ?j﨏Vu3tMs>79C79/}| I%&| b&|nrnr^حɓJHI7b?ʫۏR˜ Y{Z8炡炡+拹`Hp>˜ \p>C/6 ss,iI[V鋹` \0\0\p%1-/悡炡"d6s0"Y [< =~L 拹``H*EҪ8&raK0L"F 000pӡ|14 =4b8%aACT2aŦCbhzhp.yېE0@1@!b2yf5O'22&y:1_!C!CaR ZL'9d9d9Js<cz^{>7mX^T6SSSL'5f"3333)z1_L1CO1COqR j6)f)f)f)NʜM1)f)xP=ۜSS08iuc-ǩܣm\~ٵٽф@,Āb u٬ d2XC'|CŐo]p>abHٷ.8ŀ0bJb|Ca!\~*7p_cV~Q$aYD$"f2٤'d3鉙DL"b&1(%׋]#=%$JD -JDY)'%P"bh%P"DHOI>(C(]#=%$JD $oN!d2{{!Da'd2 ="Bf!C!dET;1C !Pr~ۉC !PR&v|C{=0糙LLKr3]_޲|63)Y #_aLfb&3eUf̔D8LfBf31Ldg(_%PfJ̔@͔@)2Se쒒B+g_%PJ̔@)2S|׻>E|Y>L>Af$+`$f $+`$f |Y>B>\!JlV2+ !Vah0|Z>C>DKXIJbh%1||Z> -Ob ˱6z_!6wf{==Af$+M܃bd{0݃Afp"=dv2Cݓ7y l$60Cah 0{=|QUGHC&FgHFldEHl0D,41fHY'[-ȋ/LԔ<|l0¢Cf1ItI(3鏳It,:f3.d&q6EL˪E$:f]LDIt,d8DLVE$:d!l|]%d8E@.r8L$6 fY\jl 2KXH%TH1%$L YDf ")"$LVHYBLDf &+M$,AbUR3 r>K%кCK41ڵ %hF#FZfѐhl4baB=l4d62-eQD F*Z9!ѐhIa6XW hld0dCisRFch1Mv.F#67f8Z˞02 FK*$ksFCf!ђ*Z9!ѐhl4pf4!ђZfѐhh\hFCf%+Ml4b] .vCݕt:q]}duKda6 +E.dV2+BP2 ՕTAz0E,ԅBfuq' Y]B]Ȭ0ՅPOEY]J' Y]Ȭ.bU] .VCՕu'׎ dw IyȦlR3)/YiLN)!؇C^fC%" هCD!"|H>D$"ɇCB!"|H>D$" ɇ;?̬R~%45(A ٠dP5)b. JM* MʫKE$"A ٠dФnrUD2(! M dO^{H^E$"W ٫UD*"yJ^E$"WɫUD**3yLMG]Xr:\ύ+ĠR.\I,W *b.HrM* J`"\I$פ8ҤKV."Hr%drhP)rqq)JrE$"\I$WB+"HrE$\I$WD+"J(Lre&2\!\O#e.DƜxQ.ݤk1Ȼw2*͊K.]FŻY]FŻw2*MFDec w2*E$2*AƜؘQ1"٘Q1bcFƌƌ3*6fTl(mb'83(X?׽U;7XԈ$jD5",jD5":FDHN* KߘK&dQ#I\)\'j}SEHF$Q#oD5"DMȢF$Q#IԈ$jB5"DHF.DLf&Q3_K^KUAL%nSH~G$#߹8O;"T@1N~G$'e}%# w.%.c.)~G$#O;"H~G$.[sd}D>![HG$#eg&3dԹ/~ )Zl}D>"Y+@k/\>![T@j^d}D>![?Ԯsd}D>![Ck/\>"Yk`SHG$ 0OG$#K{!d}D>"YOG$#rrمd}f>3Y^Yv%lh ~K׏7 D,`.mYfHER\Y`.mY$Ў-Y fH"m\B("m_o!K!oY`.mYfHc-si@͂7 D,i@6 B,i@6 D^b`͂6 f,i@͂YW32uw m$\[DHep( * 0* "m$Yq[sQH$ H0@ 0*IR^0@ Dp0* "m$?^8WHQHi#h{\e#aT6Fe#A¹¨l/H 0* 0%ae{IX^V텙47l:|ZN)~t\GM2m siBm ڋyQ)DڦiJ*E{oSM!6^ si"m )̥m )BަoSK"mSM? ޼("mSM?޼("mSM!6H!oSM!6H\\M16L3mS̴M!6L3m=f~lK-nKKsޣ͊-!ҶHRR8Ǜx[Bm {t31%Bޖi[ pf-!ҶDҶH"mK7+ H"mKς7+ H"mKO7+̥m%Dږi[Bm)͊Y!fH"mVr1r1fL3mV?0Φ- 0f˜i c[tʵ7.fޥЦG.2!,C{6=̥퍐7Dޒ hӦt>H707D޿("mo("mo07Bi{{a.moH[RmT06=Dy{C =-frisa7[gӖ,7Ql9Jo9W[xA-l9-d|\ryI}EҖH73!o9\+ڈ0Dr޿ވ(["m9 Җ~xˡo9ވ0Dryy|a.m9 ҖC[NR+ڈ0DrP;662Ln2O -<:C}~k(G4=*gTD,$zFE29W=">[&=*gTQiD}R\.ϋ3*G$3*gTD-s"zD="tDϹ#0=*gTDϨ>l^="zvb;;[V~,+Zsʈde^fbe 21LVF$&?\DjB2"LHE$iɴ%sɴdZB6hb.LH}_ iɴdڤK6-"p<1YݷgO`!x(C$! ҿ܇HK*H2s3}>Dr"E)FD$!}Hv"pو`!}I$8s}>Sު+dp{Q "4 璘YALG%1!er1QńHbB$1!?bńHbB$1!޿rXL$&D"(bB$1!ILOD" ĔT sIL8޲^0E0,Be&\"Y|T~lD"Y|AȾHN/[pq,BA$ Eos"lD"Y1[0,BA$$*% K){ 4U*Y$ r%U *Y I/r.TH dU iii yi߿##ߖ#'ЌK KrN*#(2AfT9Y&dUQdDdFedN$ǹ # 3*̨ 22Ȍ Vh1@ͨ 22Ȍ # S5ޜ 22Ȍ # gť̹ jяt)HH#H#寄2" 2" 2"lR\_ # # y<ޘKMȃHHH~y)HHHHMӪ2z8g."%!V "Ҵ"Ҵ"\rq 1ӊHӊHӊHsIsHsHsHHHHH~Gx.1&'&&&0sI,jyj%cY\%D%D%B..נ8f f fg f f f fg \0D%D%B%Dn M҄!,Mx@' si*i*y*\ B D D Dg<+4444<)QkV0"s7ɌJ'#J7fTQdFNfT:QdFggeTzQVA1@̨,ҳ2Cf""""!""""!"XreYxKH-F-6;$|#ҽG{O(>u#\p'K}H}H}B}H}HH1wV ҭ@N./"]^Dty w\v_(}_~?k^eLnL?]/l9}̲R[ߟT<6eΗ۫^_mQ==ס]G΅.?_}ejy|z }?iubkj%{]qbnX"G5vcou[2!SQ]..{kj鲾vT/u>xTG<].5rg{_:jG.}_EZ*bW-V:j꫈U_XuRŮ_w-vkQ}c}j?I:sĪ[:8bub~nQU?GŪ#VG-VX/;b[-vXYcq!#VG- DZ]yyLt꫆/sxB̡.}ls<շ9XaEZƾ_j"VG-VsɋXXaj[&/bub59lQFj"VG-y*/u4bub_'3ľ~ic_ҧQ]_qiq:>Mw~GC]Zb]k5^]|ϳ/2?"Vi2N?+X'bub埈Z:jO?-VƉXX'b+DZOq"VG-y/}WOZkq¥ž~*gZ%jp9jtzD/";^?|5HR©KGM^gk`FɫyX*b}Tc%Zt>WJ^-VXX+b%+]EjW"G5VXɫJW+yEbQ"jѶUa@|kaSȺQK"]QK$5^&%5^2I/8JQxIaTjK$5>kRe.^2qX%o PZPxMۨY]ǮxMk>l55އ-^C[5]kpk&װxx ov <]lM-hy8A y7D!j񞚈aE{j"އ-C爫xxQ{Z&}=DC%:l K ڦ ޘk8nZ euї E{r"އ-ރɉxxR{Z''}=HAj񞜈aA1H-C N.[=9r0]ut Ӻvt-/)=L->l0xOO{"==a.&aKT3xZH] AFh ^V ׁn"=AxTE[*=P->l1P eq@.q|TD^{X,z~t9|rxia7TrP%*=T-SqX=Tj񞢈.&aMCU3xZHQ[Urxj8n97H,uc#`{J`Ŭn8m+=X-ޓqX=Xj񞤈 bZHQ[Vrxj8n9\9]C.pt95כrX969E-sѽ}=V{޾h=~ۚ{Ys{[sv9|/k9ٲ׿s.N:s?Ʉ>|,bq^TtGˡsZ8n9-ϡ~h9P>㮎roϋݽ=/9vcso[>e-mˡ{9ZX?#X-[vikoou{[sv9|/kw9|ok.e.xׯmeE$zAZ|uMfy^kïh^yQ޿wyZTvU_b)`9XN~ a]B_\ _;nQ-@0~m&[TK 0Д2Ӌ/ U x"FôVq^=d^Z$Jk׌ۆrJ̓+/=R PCfa,oSg4Y;z 8LXަm걺.54c!2ꗨvjC30)>nZVe(@4mO_b-V,E:lvOPަzɟ3]ѯ]ߏ7eyr%kZ c)>~jZ:0L8xXnL,Q^ PGiqM藨~k48 t%I[[iqMuK|H^{Zq|Kl~TRKerF2q,T'n[f|`;ӑ*hi-@cZ 6閨i- B+[n |0i,oS|n,(` Mr%[ [!mO{_n |0 i(oS|:!(r=a&AW?k\]TR> !鋫 e~n-KGRO?|a$ץBe~n}Rj,5hvʱm&(? WU 47zvpzmKgV E;hxSo H?-*D7v$U`EF"Tʴ_>> 춨`Pě?R4VZm MJ{,*jmXߦmM]+DuӮMdߡMk b:Vs;|ֲblDJ6uJՇ3/g_{ rݷI?XL}keO/vUn"݋7VFH%%3hnW,~Vf2F U=g2ᬕ҉2v oW,>V.SZa(c4±Y| #Y]v͸sHXڂXptQz?-"G17e|rt_?"PkoFy3>c{N+z늣v=8fR:FD4j{i6gZG1*`gT&uLC3SѨy۬ӞjjVAcPE:|*bN{:ggaun3v4T8jHFsܞGj ~m6_yzMf3:<qƹչ=|nu\<:v4ysۯZ1n:>#li[vyy8_Cc\s=cKu_^q>o#[nm<i7'f:<qvs=<6}աyhu qo[Z1nwun#~E1g7O<ܞZyu4ysۯ~"PЏZ>NzW<>o>Y~ƹ~6:muDyzW<~]ZGO1n:>ni\Qyy8ȞO}uqf:b~qvs=<>oש _;:8qm}b箯<i7wSi7ow\]:yysۯΏi}:muDgum4K KmַnVYf_RxcݬܞGYRQGx:9dlQ]=^Wgd]Eۊ3 miQ=^gd]2+32N客mũ6|Yu/yuu8]HEC/!=nVYOYGQGxgd?,osv{8n*ǩVYhNۏjZ8#Ygy{ίuq:aNۥjZ89 '|{nX븝+j>'xy|vj&&xMc?uXN#v3tmşCƶc&bqFYU8v:b&qFYչ= u.U눙:guWߞGڧuk/Q?>|{iniuDDcxy}Ya~;8Nxy~8*/Vi]kk:OQxչ=?u?jqs{y|_XN]qϮy{^6(kno?:un[gyYmC׽1޷]=?6|ou}tux?cm#4y}`t+"G7g}گSp:xW<>שhu_jc}s{yT:/>չ=uzmndž;_ݷ'߳nis[:뵻o}ݞGz_6봹uxnk>x_cR7EOV)q]__#j}\ӭdk?o_m#%g]HYm#%g]_ZGK1ǻ:Gc}[zX^S_럱جQum?cm#:OQxv3<~@Fq oI*_\_lTA/mƩ򼗷)^8WQ?_Z1wt6=.g Yw A8RެNA7ZJAQ-|>a}A?e 't>A/=X[֯S:ͯxɺDu]t_+:t ^ObN?_<}Z{9~~_/2_҇ endstream endobj 150 0 obj << /CreationDate (D:20140409193623) /ModDate (D:20140409193623) /Title (R Graphics Output) /Producer (R 3.1.0) /Creator (R) >> endobj 151 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 153 0 R >> endobj 152 0 obj [/ICCBased 154 0 R] endobj 153 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 154 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 149 0 obj << /D [147 0 R /XYZ 132.768 705.06 null] >> endobj 145 0 obj << /D [147 0 R /XYZ 229.481 439.544 null] >> endobj 146 0 obj << /Font << /F8 71 0 R /F11 86 0 R /F67 76 0 R /F64 73 0 R /F73 85 0 R /F63 72 0 R /F69 77 0 R >> /XObject << /Im2 134 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Length 1847 /Filter /FlateDecode >> stream xZYoF~ϯ$1#KhѴ-Z恖HAjw].)p"'ycvٙG`4xb$^D^4 v P9&ÿL%"+D\\}CQb"3Ӥau[S,Kwb 9 W%Yf[ߠI }MC ؽH, 8DK(7ܛ@oڇ evP^D[a[==|R.x익2ە5w,}/b o-92u4 ^ i$dؕD{յ T{C&zrjU/vQեYY֣g6ӂ@i%&d&ah݋0SGyXVVԃ{CDaVu_jIϵ5Mm[9m˽Ph]J~:ͺݣ͆i:rXBﮞ#:Ơ`;#_zS?>EҕUv}55_ ύk#w:ˇev玔I_x3ԟY gC^-6W!miXWΖL&NZ3b_/ltZ'ImSj\:'۽FHk;dI S>5<7e/&eŢ:^nL:{A{be:ΆB"Ed--w8G :lP6S2G7|#US\'R#-9=&+SʐVҢ,sDz쮷 Ϩ;wǪ&L5 &kkO.r)ʚV \PDIԤ2{.oS|y%^ rBxEf)և!>qXF1 {3l6faabœYd{e1s9+!_&dlj]:ǽĉm\qSO#|*o֜^ `{%69wȑ|\@=@gJGNludOdr]΄$z7< nؤ04g6tLZ/"SPobRB P.`8!gvxݘG u5ЋKiZ,Hek dRӁ_2@4FVAʥ$Zim}$LnmWCmcWkEMχENrq,Z޽@vY endstream endobj 156 0 obj << /Type /Page /Contents 157 0 R /Resources 155 0 R /MediaBox [0 0 612 792] /Parent 119 0 R >> endobj 158 0 obj << /D [156 0 R /XYZ 132.768 705.06 null] >> endobj 155 0 obj << /Font << /F8 71 0 R /F67 76 0 R /F73 85 0 R /F69 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 161 0 obj << /Length 2116 /Filter /FlateDecode >> stream xˎ60zI=Ӧ@4A fHR@kiwڒayM;/J-g街"pf8 gp^(߯=|E3)%fvv1֪4fI*cY9{D&^ovWUV i\nξy<*OL"h3 x_kҠE>1 LjP\K6vNOڠJȪßfˎyhu3EoCm!>7|I=b׸jwUaq/" I{Fe>8(|i'5 vjRR6˙ Sؘ6 O-'>@Q $A*Ybnr.pĥJ,UyjIڢ~x4>_Pa,#9 (=+(hVkxI.6}$4r֞5 {<(H8t`NAG(js{ B؊AgJz9jإqJ/=9Vr/xv᜿w$vB}sVT?oW ?O]\KZ}&fNĬ1'Dp͏x翗klcIu_6&/QB^Q*gB S7y+l (_F%y2d`" 7hCyqths gOͶeўG  P>;e+>UMH{5-cS0cTViv*|qZsV+T̒ Uyl}ppyh D|S0ܔyIp~F)n3Rr|Kg45:[5'yHPpq+ #T94ĺQbCO|*İ` Ә0Ndu₱>!]eNGepE8e~gQQyy%5 B83\ THsB{V.(3?02c۸+lf4hhbW4\Ypؾ)cUU\b-, ^R @k ;S5&V“ {h޺ɨH*liW-ׅ=]?`;2(r%lر&xP&$]$\0Ѯ/djۯ2|sK[}O8SO9jDO~JȮ˅!iBYS `1jȑFEڮ3&,W c@C, }pԑց'ڀe ȿ`N]-5 זn w\ZJWI:P|M,2l3F2B_b=<ڿ *#Gnx[C)ޫSx 5W`e&lmY&Yn] o ؍j_ dxfo8pǠĚA'AXZ?KD}Zkp5 {XWS):(L%? 伩G\et/L ;zh d܉ySTCDc/4g^^ оjx7sG~z7nhCR$qCD1 *EKl'\6"kwrpש^ax\I^ͩR|Ɋ{:zO{0pl՗^UݣR"XAE|GG<{"z~> endobj 162 0 obj << /D [160 0 R /XYZ 132.768 705.06 null] >> endobj 30 0 obj << /D [160 0 R /XYZ 133.768 667.198 null] >> endobj 159 0 obj << /Font << /F44 65 0 R /F8 71 0 R /F67 76 0 R /F73 85 0 R /F69 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 166 0 obj << /Length 1513 /Filter /FlateDecode >> stream xnF=_@!i.iT%Q6 ID [߻sP\inr9;Ύ@+ l1BJ+Á#x64 MϑF>FFƙl8Rk5bIyPcKFqƆfj8VrGĹ~aF5YwA4]1;' "jJZ oҘ-J`1rxY.cXy p >|˶,ӌpO J6) #YѶvd++I$H`u@|D<ds,ד-_ܲ2Kֳs|dQx^'j0sǠ`0@#:<18b4b? 鲮bvp^5h5!%bx9c`^b.jDj`sjޣ)5Ә>ʥN|lyMC#/f&ǕY`iGAҎ-сXXY*?Hyr,jhcW W6N>B:_Y<"@^MtTe-ub_B=Άֿ_UQpYf$BU%nTM6[w@/N:BED\j@-Pe5b etXj'GdlPi#jB_K튀) R &"l1ݶ 2!>_aw*h ꘕWmbglHWh 񁪻ȯ1bCPSe;AV-&fm!w=p%>YNכ2Fm5^vU.-Vu5cv>#h uB0R%Ӝ.X%c-*;',OH=,] Ul\t7g`t&W?w>%V52h <-F?n1=‹q*brN> endobj 167 0 obj << /D [165 0 R /XYZ 132.768 705.06 null] >> endobj 164 0 obj << /Font << /F73 85 0 R /F8 71 0 R /F69 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 170 0 obj << /Length 1217 /Filter /FlateDecode >> stream xX[o6~ϯ2R%؆emtXu ^[l؉a)a}<Y%3.WF~`̛5'[ ^xb63=Axu5@`+Nr-tDB>{9ɱV @f,ee+pwK4Zukj)=7D7VwjHW5~ ΰ( b}kH~P}[z\c#tt!cgO``Q[G1A"Ba]S9js8ܰycNB b#+SUڸd,EۯF6PI{{Ȱ'a^X9]6:BTq6qWθ/lsڽJX-L=kdL$XcalR%VB50ߤ-\]~nfS+ˡJCax_P 61+ؐ rPJ^_a*H _NJ.-lV#>f".vnbzׁ^1i6D=0+6t.6 f./W%)45F+66͇;jYzG |6>[yt|=I}NHK=gxX1UR <2z ]2 r .KR `Ϩߚں F_c`,DYEFD2PWHp8D4E\+ 26ŤgV!|Ɣ5.G'q/[A8nx39)1[ endstream endobj 169 0 obj << /Type /Page /Contents 170 0 R /Resources 168 0 R /MediaBox [0 0 612 792] /Parent 163 0 R >> endobj 171 0 obj << /D [169 0 R /XYZ 132.768 705.06 null] >> endobj 168 0 obj << /Font << /F73 85 0 R /F69 77 0 R /F91 172 0 R /F8 71 0 R >> /ProcSet [ /PDF /Text ] >> endobj 177 0 obj << /Length 1567 /Filter /FlateDecode >> stream xڽnF_(@!͠-"qId9rwfvRHaݹOڵkˑrV¤~Òd$V(cf&֎asX>L9ijpT}{3n`!/&;4t8A n؋o 2_ѯ{rl@8Q^SH^_#|IPV?bG%=^wڈ-  tT,ʮ,ր[%@1^ ޷ ݉"JA^Ԉ N*צգ:_!sQ o(1I0#]|{Q;r_9ؕ$`S|Gb˲E3FP'._ qlϞ+{e"rm๰Unx/:ݡk ̤3%w14~@_p\spRNaŰjpnYGWX)ksL&F㋥hZZDñ)LyحS"@s:)c~EozbT X .w{昚XH_&R05bObmK 3b- ]Y;Od20W6q캭NmQ^,5 RC[И{;[JKFm?Qn.`T|#(FۋD\?|Ne6sNCP6\ c΃ `Ⱥѥ$.{_]Kqn#]`Б?zyEN/>'I:/f'S endstream endobj 176 0 obj << /Type /Page /Contents 177 0 R /Resources 175 0 R /MediaBox [0 0 612 792] /Parent 163 0 R >> endobj 173 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Fig-bitmap-3.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 180 0 R /BBox [0 0 432 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 181 0 R>> /ExtGState << >>/ColorSpace << /sRGB 182 0 R >>>> /Length 5357 /Filter /FlateDecode >> stream xŝMх+LfDR,m$ $@ dd 6xQuN9]3;UCmÏt:L<s+ݎ38.Cw*%Gݭq=wuhh͵nt|]\cwuWk(n5O*(k^#4n&4A<ʁ 4dxSwڀx|!@Yi"5C`7"vc}t- W"ˮ`uM# F`O#ymTEyI],n4OC ;CĞX!!]Ep{Xf!ʬy_]Ze!QJ#P@Ky FDCMX RH-iDF\Jo@iTX+%v' ,KG7^PuDv\lTث0$Q``!<DM}Lse{ll_ȂB*d3y 2(w.EQ=4B!R!vr8=ooxt9⟟2p^ԝz|=|_su:oђ:/R~_ͮ\][\";W_~[*}^i~ iM؍{nY GYȦrnwsG,ֽ }GM:+ N>aH_Ά%gpv&8;YNp69; JN7,*,0pvs, 'H:Kʹ]Fald!g# 9LFan~Iqo8<үj^ Q: p6,29;%,'8; Hιl$g' 8AL}%>٥O+!ݝN٪:8;-E ֊g+ 9gbЇ0aI(Bqo7MnI񚠯C9=,8;sިzfs$19;YmBK&ǹ땧ӦoVytD^`㝽ԍ59}7xJvݰg*ק0^9C}leww麗ӴvM`8=,Z[8;¹W!s--nl4Jp6 #gCɂ+eD HƎQrv gc,9;YP䜆lٰll$}Cc~-D-2;dI) L,;+$_ݚ],,d׮Y vZɵ!%]+P2tҐD,뿄#gC!@gZS;}oHC7(,oIwbe2C%A?ܷ Qw%[}+K!lirHCU59¹]*/ٵ{®ݶvF5ڨwmǃD AKΆ$}}wz}0w ~jBu8^ լ*9տ>qS?7a30f*!5Ip}$jHH5 #vZ8B_[S vy]8kڃ~*/^S'CגJPdH\R2*)9zvQGc1A( #K$}b ;+F;$}C~XMFBB}#h߾b~-,o;22D+b1.D ILuDY#;cC$そ~ -HvH%;$8OJAԒA Ζ ;YԵyk|XQw,&[+F#I}coH7\)[B}kC䥞H]"-I"c A߱XB7z!}BFl]r6%ӡty8Tp6v6\gC!S;adIJ&U7D% G2 HN lx_rv^ѡܾɰpnwsE>CoZ,KF/.h }cI07!믬 H%}' ; kM:ۍ"9O冄$g' 8Fe:k9&d 6*Ps,UH!j@F e䳹b g0r8u6->Gf;Y@F!!I[aGIߐK.! vY[BBXdw$$MI":; ;J$}CS\HߑTnxA7T;@/ChڬKӯ9*۷FrnR8_B?uٓoB&_SU4׏p"_%a7$ۙݺ14y}q92 vRYjVk\:&0ƨzƷn 2 Úqy곶 bN%z FIml N#9|zĀ-2FfPx !`%vrF>{J }4@ѫ$;Ͱu"9X&UC@PF,R=f>*=:/ =G`= JkF@s- *kMFhǫ9Td祑!`|ldym4 FMFi$c]w# V*Km-QXj0P U]Xen0P`&|k:V"%`**bTP0)$ Prh}3@u##sTTJ]/6 T~$э Q{S@ (4B4%i8/h8U 'GLpkhVUvTٍIT)$Y/ JOjbғ[ CҗAVݓt>ɞ,'p_Ei/|;Iχq:ROx}z|]n~i n;w 3=??c:.OWU/`=.?z>. W#/˱);x=ō^n>nK~=a9` :]j&V촽3G endstream endobj 180 0 obj << /CreationDate (D:20140409193625) /ModDate (D:20140409193625) /Title (R Graphics Output) /Producer (R 3.1.0) /Creator (R) >> endobj 181 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 183 0 R >> endobj 182 0 obj [/ICCBased 184 0 R] endobj 183 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 184 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 178 0 obj << /D [176 0 R /XYZ 132.768 705.06 null] >> endobj 179 0 obj << /D [176 0 R /XYZ 179.529 429.581 null] >> endobj 175 0 obj << /Font << /F8 71 0 R /F67 76 0 R /F73 85 0 R /F69 77 0 R >> /XObject << /Im3 173 0 R >> /ProcSet [ /PDF /Text ] >> endobj 189 0 obj << /Length 2723 /Filter /FlateDecode >> stream xَ_!1@a#.77waxs @(:bIьg췧Di4lVWWWWUʼn&I4y$7O~YN|r$ YI6YL ,M2x`M"ўKt͟*WydV^`p:+*YZYvHhWk}$jӸ ~H#w!M'&5ݶg8BR7!'.Yy|l5o$Iؙqy"1%k;7\4ŸADF~Y$"Ƞ-c*.3J{(ed ?Ghi ih~M3SCBX (O݊@W~o=!8@𶾭( $x%Sdq[BlٞZϧ3PwIvyrT; S y; ;9% EbZ yUN$It:a 4fI\l 9}9o+H@l-Ndl3-~G ي |S!MXFb~*vnZ U" U׫zhBQz&xPFQe7 aNuMQP(=*Kiי$"2cS^t*ݎ!?F&Eym235-/cԯU.Y< |^@βnҚls&x uE\lUxʬ }Yvd`;qRfwb$ 6 #o\YryJ;֓)@c^:*ސNDŽ|Y, ':W M|@s^c(_}AE3vwwg+ n׬szWtvU{QX#愢Bю^ mlJ;d 8'@7A@>^[!vIg6lbRDVD|$GPm.d9r4~;QcRD ˴91*|Y !KṮ6tI2 a}CXkmcрKEyp/p?yI]" !~F!a/aOۈ֒ ~S ;$rvC"/QXR.u WUVa=LU]}{L wv=;HS-<QM(15D56i!#%}o"Ө r-)cOj$E4hL_YI|\9wJ!4:2[y1%EW/lN5> 6dKj Jn DbpH~pt-vϑjr.nkpTVk4D;|O|9ZIFr^iBS[Hc4QēM)Ƴ'!UM\j䖭bSB늳B'AK0zT4%z]j~)15,m̽(jgـìh$BP#œP@P&Di3 ],֑Jz5>uSH DBqU9o˫Kh [a[$2r{0i^~ N\ M2 O{_d_H.o~C6*$RD_|DhYXɭ;.8J//4 :%s߫ji:6u}HM g+{+MLim1d4mK|¡Zmpn~$jH,k&wS`LIݨ7I S7;~rLJGmrڽq*ϵtNj)KVzsmb=\;(Ե {*u>.c-JWd׵)a4x÷Bk/eis9I1 endstream endobj 188 0 obj << /Type /Page /Contents 189 0 R /Resources 187 0 R /MediaBox [0 0 612 792] /Parent 163 0 R /Annots [ 174 0 R 185 0 R 186 0 R ] >> endobj 174 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [220.044 654.306 227.018 665.146] /A << /S /GoTo /D (figure.3) >> >> endobj 185 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [144.378 115.766 202.35 127.626] /A << /S /GoTo /D (cite.bivand) >> >> endobj 186 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [207.541 115.766 229.458 127.626] /A << /S /GoTo /D (cite.bivand) >> >> endobj 190 0 obj << /D [188 0 R /XYZ 132.768 705.06 null] >> endobj 34 0 obj << /D [188 0 R /XYZ 133.768 604.949 null] >> endobj 187 0 obj << /Font << /F8 71 0 R /F73 85 0 R /F92 191 0 R /F67 76 0 R /F44 65 0 R /F69 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 194 0 obj << /Length 2191 /Filter /FlateDecode >> stream xڝYmoF_B-|/R$.ZPF)E(wyR&d3hDoEU1)2z9QIJO4uNlD*f*85:X0v1#v [uio2@a?=!!ܴB^I|ҹ`nUI2a%v LR]mLjÝ%vc[k@~u%#'hGq [-_y^OоMȀmW{24a|E]ٸو)N&V^b6Ou^Aip?9ֶaRGQE6& zQ0x:ub`g #25dJTDfa|X-1bO$b' qyǓ<,H9JIȯوKًHp[##cKh{wB=(;yKH? "n_ F^+fx#9*]h)PY(ʜ(&w*bwݡL?tgޮ74FTmHp^\i *O ?Ol?yD{cZڐ-v7rxz뺗p?R'\d,V>yR?m[D$<w|DZw'S.7?^S}FqzWYVG%P7֭~U>Vx *= ;4\x}om2<(\M&p_3z_::\l)Ϙt5$ >aE@\wD {E<^-=AC݊RMPyβi 9•eJO {k΂%/"F+ܺj/xG_wʃN4PslK^KI{l2jxW 9tti<f_eq>C1>,M^!qjvZ୒$ǔT|w6%^ tD#HzOV=}Xw .}lpȻgL|N$г90BG տ:#Fh$#Z#[G Y98T1X.0) endstream endobj 193 0 obj << /Type /Page /Contents 194 0 R /Resources 192 0 R /MediaBox [0 0 612 792] /Parent 163 0 R >> endobj 195 0 obj << /D [193 0 R /XYZ 132.768 705.06 null] >> endobj 38 0 obj << /D [193 0 R /XYZ 133.768 437.071 null] >> endobj 192 0 obj << /Font << /F8 71 0 R /F73 85 0 R /F69 77 0 R /F44 65 0 R /F72 83 0 R /F64 73 0 R >> /ProcSet [ /PDF /Text ] >> endobj 199 0 obj << /Length 2604 /Filter /FlateDecode >> stream xڽn}B0@5͙H:i"M@v-Qn 9("99댂$~WW7$~jr(c$N'qD,ƻ*k \} W^8.=M9~ 0:u#r { (>o68wc/[D7 nq:x LәIT=Ğ Z>4T. M:Me,M#I':FN$ 뺄;zǔW- .e1S~ཆYIԓWz1Z(ϴ'ET'to:e h0eÔ|{gi|lt&ڻǕL"!i%PEǭ5U5<}KL~ 1*C0IIU M1,HU4 |#ytH` 9BllӀGR/ 5|ѭq+~ٰ[I~q3am'nYB `oފZS+b![ѯ.Yd\O#C3bQb]3 @z HR:l@ЂfO1צ H̏Tb6~:gaL G|'~\ \.^r0 cEq!ehTH!Y "RVhl`~X#1)au&ʌ#O;$h[+ߋkwy bãPwV"ple*l!o,n!\  ͔7P$mVr0O ?Wl4ga6壥[x,=/F-u-9 Թ7%'4(Qlǰ3leK$KwEѬZ(L ÂImF1dù &kG<Ou@ #?NۄT1`)%}zeu>\ X.SaiS h*8PeH 핡Xe!&$ 1)3NqM"[]} Z0DBSNjmK_1_-lPgEb$ ;o~/×\e>e/)KHtC@ 5_5XQ/5B8ci+v6*4b-I۱&H4ujgdcn;r=$ +%,b,6{u%S׈uTAPuIVtI8G4͌ t$OQMAP?Kcvy'|07L!Nb? Ь|m?:M2?ۂY!ڵJ#{X``JZm(eҩI-NJg/OpEP5QGn2?<֣ ʠBmq⊌mͭ$A)ti77wҘiI9g҈MJs Ns[Q~wz{CM>%a-o7'nSJ`kvMC.Ɗ|)Pt_!bEBŽȷaь?,*3)tx@Z.e: aj!gd/M EKyp(^zc@}oc);lp }'ۚ.Nb_ʓq%ܝm":UxZj|Dc+Uvujs@ؐE_9Bo t?./A DEE22 lxa(X%Ps ^v,?<|w%kL. ڨTEp~;cs'Z #;'آ\9Z=K2pw u?syӧ٨bLuwm~]M۝4z7 z^l0蚂s!_u5Ϝy(=Ffv-E#puA6QF{MveP$l=( UT)OM;ϫY/wpb=Qw=gv^z;/7HE. ~3B?i 'gon $eK4LCR]탠;3_% \MV!)`r@xس5z8eJ.'~>MgWx`Ajk(Gr.yo0TvQ9BD9;u 'nm LnYfu5JU+kwtH ƊrACcjHi ?/YlSm9qm#sI߹vη Ug2TM$FJvXw'*wV=d0O՝>{tG~#rŴ0YpH+\7\eMDP$hc8VYo O endstream endobj 198 0 obj << /Type /Page /Contents 199 0 R /Resources 197 0 R /MediaBox [0 0 612 792] /Parent 201 0 R >> endobj 200 0 obj << /D [198 0 R /XYZ 132.768 705.06 null] >> endobj 197 0 obj << /Font << /F73 85 0 R /F69 77 0 R /F8 71 0 R /F67 76 0 R /F89 124 0 R /F64 73 0 R >> /ProcSet [ /PDF /Text ] >> endobj 204 0 obj << /Length 2267 /Filter /FlateDecode >> stream xڍXKs6WHD( $Mǭ3ׁhDzt.Hʖ^$X,h1 GB=7*Llt{7einln߂YGfK?Վ~vǓإ [=dTغ`)%/$fA4 Jl|oƓ(>7ȃYbЕ ls4^,XʽLfdvJ֒ /-y3='aD0 ҤS y{L3tOr-Ar^r? s~ Ve`Tq9Ic`D"s{Bv.>ho{'8~S5L)$̰\=f5e< U)TV& 3{%b0iJL11LF3 \胲\(qUV_V[X䌀I\x2,~kv!ya<}"AB] U h2 sW2TW8G>rJ+Xl$(;Mm9Dl"<0*μ?`)'|B 690\,ieބCqYXƄVA3OLldA0iB>N#qZ\5M\J'mmYTk/jMBkzZ/نq@LJ16hM%02=+I9с )N`cq/S A^Ʒ 6v 9RR]u4 V,ذ~BaXBy*zo~2pHC"yN{Qk ZPiF|.ZԼ]Ed8k-y9.͝՗\N92LJ~(:?o58UjwQI_cwN1C wO%A9:i9D !x˰rqn/WFQQtQ<\sszcז2$1aR<퍯'2z/cj+&H;_SpY{#!y }?6*WjP Ȣ^ɏwj'0 U<]plY7d>E}$ ) H' !ꂡ߶D0చz,D_A%>8hMo+|L;9ot-6;*3oPaTs.̠fvFV贕VC c`B2+9aоeʹW{sk pe (UL'æ?J%_#qsM?)arQqąWz/AW/h'm|zz"NuQ_XKO^.d(BOX& Mh6k y*{ m&t#'/Is-0]^}R;"W(%b!6B/xy U> endobj 196 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [255.69 629.838 262.148 642.428] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 205 0 obj << /D [203 0 R /XYZ 132.768 705.06 null] >> endobj 207 0 obj << /D [203 0 R /XYZ 133.768 518.815 null] >> endobj 87 0 obj << /D [203 0 R /XYZ 108.862 518.815 null] >> endobj 88 0 obj << /D [203 0 R /XYZ 108.862 486.934 null] >> endobj 90 0 obj << /D [203 0 R /XYZ 108.862 455.054 null] >> endobj 105 0 obj << /D [203 0 R /XYZ 108.862 435.129 null] >> endobj 106 0 obj << /D [203 0 R /XYZ 108.862 391.293 null] >> endobj 89 0 obj << /D [203 0 R /XYZ 108.862 347.457 null] >> endobj 211 0 obj << /D [203 0 R /XYZ 149.004 138.202 null] >> endobj 202 0 obj << /Font << /F8 71 0 R /F7 206 0 R /F64 73 0 R /F72 83 0 R /F44 65 0 R /F89 124 0 R /F99 208 0 R /F100 209 0 R /F27 210 0 R /F26 75 0 R /F67 76 0 R >> /ProcSet [ /PDF /Text ] >> endobj 212 0 obj [611.1] endobj 213 0 obj [525] endobj 214 0 obj [645.8] endobj 215 0 obj [569.5] endobj 216 0 obj << /Length 109 /Filter /FlateDecode >> stream x3632W0P04Q06V0P01TH1*24(X@es< =,=}JJS ]  b<],1o ?\=: endstream endobj 191 0 obj << /Type /Font /Subtype /Type3 /Name /F92 /FontMatrix [0.01506 0 0 0.01506 0 0] /FontBBox [ 14 33 28 41 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 96 /LastChar 96 /Widths 217 0 R /Encoding 218 0 R /CharProcs 219 0 R >> endobj 217 0 obj [35.27 ] endobj 218 0 obj << /Type /Encoding /Differences [96/a96] >> endobj 219 0 obj << /a96 216 0 R >> endobj 220 0 obj << /Length 97 /Filter /FlateDecode >> stream x3632W0P04V02!#CB. L&9ɓK?\K(̥PRTʥ`ȥm``S: 6 endstream endobj 172 0 obj << /Type /Font /Subtype /Type3 /Name /F91 /FontMatrix [0.01506 0 0 0.01506 0 0] /FontBBox [ 13 22 22 42 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 39 /LastChar 39 /Widths 221 0 R /Encoding 222 0 R /CharProcs 223 0 R >> endobj 221 0 obj [35.27 ] endobj 222 0 obj << /Type /Encoding /Differences [39/a39] >> endobj 223 0 obj << /a39 220 0 R >> endobj 224 0 obj [562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 225 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 226 0 obj [277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5 490.3] endobj 227 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 228 0 obj << /Length 169 /Filter /FlateDecode >> stream xڥ= @ !us7?nmV"RPޣ(/ :EeޏQjRgr*t*X(Xk[Rʥ( e uC Z0 'Atޘ G0T8b -Qb7c7g35 endstream endobj 84 0 obj << /Type /Font /Subtype /Type3 /Name /F43 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ 0 29 52 64 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 151 /LastChar 151 /Widths 229 0 R /Encoding 230 0 R /CharProcs 231 0 R >> endobj 229 0 obj [55.36 ] endobj 230 0 obj << /Type /Encoding /Differences [151/a151] >> endobj 231 0 obj << /a151 228 0 R >> endobj 232 0 obj [645.8] endobj 233 0 obj [531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3] endobj 234 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 235 0 obj [590.3 590.3 885.4 885.4 295.1 324.7 531.3 531.3 531.3 531.3 531.3 795.8 472.2 531.3 767.4 826.4 531.3 958.7 1076.8 826.4 295.1 295.1 531.3 885.4 531.3 885.4 826.4 295.1 413.2 413.2 531.3 826.4 295.1 354.2 295.1 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1 295.1 826.4 501.7 501.7 826.4 795.8 752.1 767.4 811.1 722.6 693.1 833.5 795.8 382.6 545.5 825.4 663.6 972.9 795.8 826.4 722.6 826.4 781.6 590.3 767.4 795.8 795.8 1091 795.8 795.8 649.3 295.1 531.3 295.1 531.3 295.1 295.1 531.3 590.3 472.2 590.3 472.2 324.7 531.3 590.3 295.1 324.7 560.8 295.1 885.4 590.3 531.3 590.3 560.8 414.1 419.1 413.2 590.3 560.8 767.4 560.8 560.8 472.2 531.3 1062.5 531.3 531.3 531.3] endobj 236 0 obj [638.9 963 638.9 963 963 963 963 963 963 963 1222.2 638.9 638.9 963 963 963 963 963 963 963 963 963 963 963 963 1222.2 1222.2 963 963 1222.2 1222.2 638.9 638.9 1222.2 1222.2 1222.2 963 1222.2 1222.2 768.5 768.5 1222.2 1222.2 1222.2 963 365.7 1222.2 833.3 833.3 1092.6 1092.6 0 0 703.7 703.7 833.3 638.9 898.1 898.1 963 963 768.5 989.9 813.3 678.4 961.2 671.3 879.9 746.7 1059.3 709.3 846.3 938.8 854.5 1427.2 1005.7 973 878.4 1008.3 1061.4 762 711.3 774.4 785.2 1222.7 883.7 823.9 884 833.3 833.3 833.3 833.3 833.3 768.5 768.5 574.1 574.1 574.1 574.1 638.9 638.9 509.3 509.3 379.6 638.9 638.9 768.5 638.9 379.6 1000 924.1 1027.8 541.7 833.3 833.3 963 963 574.1 574.1] endobj 237 0 obj [486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4 390.3] endobj 238 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 239 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500] endobj 240 0 obj [383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 241 0 obj [472.2] endobj 242 0 obj [489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2] endobj 243 0 obj [500] endobj 244 0 obj [375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8] endobj 245 0 obj << /Length1 1503 /Length2 7235 /Length3 0 /Length 8224 /Filter /FlateDecode >> stream xڍ4l7\5jSjW$F콕{F!bԦU(JWmZK<|9{rNruʨ+g) >8@AS|@>+>[jCQH(a["N{ A,@ؿ Qhq"n 07|Vn~_GsP qw9fB=s.^^^|g7>^ww`hO-7a3/f|}_r=  p( vၴzj-/c x;޿!P(#vp  mBn['9, wqws#~SJH[3 ~p4 z[v:Dy!vpo.HLMo[d0w00W; A `wKAY܎- k)*ks:yy7,@"6Q ixXp2u;0F( ~GGQC nGv-4Qˁ_S#_,BNrrH{ĿwS{lP&_= #a(7 GwnPSTmJH( 4[$ -`([- b"~o~@a?P ][_@0/:P4v-?O NC*x׆&X׌28yfџ<.r>Kk']XQ8cn1Y*Qwlf{p[!afF:+WQb|3NSk: ^ĘLټL̈́KEӛdd,wA=?`'V@gr}VSjzc16?4ui/R9"QsI0=զFJejzAC;C5_k]rs_ˇgzIܟp+ˍ~`#M4lS,ZɱX`s%RtfZVy`-]XuᱻMZ.M@|odZ\j}nѾS1dx}E24X2Ave٠7⨿ޓ:>Ʃ[OWK)W*(Fkxi쪇sG#삨Q4`yojrYr?!.Dpq2s_%;\D}j;tcȴܾƕ}Y&z7wç6lЧAٯTfXt: z?X3dV1H8pwyn"3_^6Uݕ(>(L%荹eK;(3!;{Z5Djš N3h>κwP_7Ij(qf(@!7c7Յ uDҽ&!EZ}IdjhӨ-6u(6RXTJЌ$@gZ9%/w^{?1d E)ζIEl e fS-9y+2*,`${LlMg|8t7 JGS#Z&.KtpſD#pɊɟ^8u9R]+_WlQRg[w}&ߨ.ɣ##?:*}*AX<tcT,M3bv4H#dw0FF\|v15Ɍ9D>b!{x S(ug1,Cp6눻d؏쪍*)0={LϱGr{lyr=\/u+ۈOuox~Ce_ msQDdɞ"_:cP  oS7ȌIdh.r} G wz4&QXJim("{uc>/zF@$I(ܝO0qS/N۸v;F;;.cMm+%pM}d 55p5DL V|983a?SU,sL̅(Abs喪&֤ڰ8ѽ+ <%mس=kL?aR[H-"P?Hr7reVKx,Be8~=q;' gZI{('nu5đ/B.(fjY7wNFzѴn kӬS]RiǞ}i@H+=7ziXKai ~޸YOJ0ae=8!0?F%|ñxe1膃] LPXs a@ Sjw6\(Lȯ4ϜB/yz>Jh:PAGrЕݳ|#cN@? vqM®'fXj{,؟"C}kcüӴk{W) rLوf "oWPʡK|}堃's8:v];GV~o~qܫ£[HځvӨO,% `wJwz;#1#pla'8AMYQ=^PK-]ooLqX{/ZB3 FCSoJjy6bз= BHl;OHSMB~}4]h[>VCC-|kxA;̟|=Rf^*,iZ6F)S^VQnTF$rfj-*94̎Ņ=ޖ $)eC+fc@]4ԱS!<]2BB|>;eCRJ@$0|!gf(L󝟌*o(,҃hT 4jCl UsɦO{qp0m/S)IkkR᡾a8u"(ȳI. boTKcX=1,.]/ ԏPS$v|7_ 񈮕tRpgc 0=pWbVqY.G=6߉۵Lb}/LF)vQږ<ޘ_[2_SXwMX~3Dq:icm ][:>[uѤ[ +{Q1(BkAR//@Mk%rT&&\ K3ب$D%%\3IE6z=v%_i&1z?a~b;͚>X_ ϝ#A@“G;q^)֚?NS] HMlAo&CH ob,|=ssT-UbWAuZpw6?2Hݓuw_C"B?M\cپEaWPnXD(QtKnlms +fUHKصwTV|xg1~hC 8A`t7'N)Ws3b'I8wC}>s|\3B5ZbM+?njjG:ތ>5D6+n43< W13"vEA[oQ߲ {q|Nb!YI5#mU?EK:;܍q6O]d̠ vXz0l޹g-OE'o !rߓ%gC |$p^>uzT3nëkGLslC&{`硉, ;c(b|yhnk鼀EݏhDN]sxޙ֣{x֎giD6ۙssZQۿ©8;:N? nIp- El0|*{)S[R*I8:|ֿkwdB>^W9b_3^ԔS UQ«iRLE.Ů3Js G4|ZTU4c^$$Cq=jJʇ"gu OYa?oxwXgv ǜbi2~~NoIЫnל tH!|{E1neVoIn3lPZOmFL FyS>Pp4V7ڋԀ]NlDhȟ?e9!— eR?>i_2T@6(\>ffrX?}~}ݷ:#be{wwƞykQ &ҫ4 0r[8kn(5̳lVF/:ruV[ca2WNn=N]8wkg8!.˿8!:5sm[u9a$)+^ U]hW`ye]0e"`Qe@b]i Sl8D(['-U~B~hJ%j9@ů (*/ KmTͥ)S&)&M?|T%1{]/sOsӉ=)am*s?#Ez0"了e6 :&ԯI~K%_LDl߲o`dT>vu~O^NMQ(%bL?*+!`gկˇ}U,M{KV@ȝ|A~6snN\#ƮR'l7xs^C3n$iR2ΈLH  xuq7d= '%}'#\lACòµ.+ֺj*N׹lGL8ׅuh).!/WVMHiY xҔ:L_=o}kpXhs~OY0_-~ ؀QXgQnG.4X?6ZazʨYrrLzp,ͦѣzLlR9` Tz򜱡ȑJie-4g:8[bxT¨pTN?aEA׮zR))C&yӾ|0ʪt\D GzIIJv j2~c5 y# WDLٮ׆.X9KY=Ԉ?Ԭtejr*-s SZ=Pl';.D㯄H" 3ru}3.I|[l;Y1& q<7"E+*b_B&_X5҈ZH X/* tT͋7,Gx 1Y-:-OM+lIl[kf"sЄ 3]$v"s%w=͝}p2[Xn-rBTżUZqA`Y b[ˉFfҒRG(m Zd"zv -CB^ Z6mP0jȚUgQ4/ki:bE*/lv8[~eyApR`6x}vNSڇE='F)u%q[!ΝZ5J ?fA92z1.M6+~mJbk&k ԐМ]~L&y$;Ž pų5Gb`})PZ \yDgͯZ J$mi{bHs}@ۉQ2"^WYc[\/]Z;0ؽkнQUtr^u=00." endstream endobj 246 0 obj << /Type /FontDescriptor /FontName /ODFHXP+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 108 /XHeight 444 /CharSet (/a/d/g/i/l/p/r/s/t) /FontFile 245 0 R >> endobj 247 0 obj << /Length1 1918 /Length2 14042 /Length3 0 /Length 15230 /Filter /FlateDecode >> stream xڍT cݝ M.UT$UQg5s0I9ػ22tXY,,L,,lV)@.V|b;L\m&DE{-`ca/ anePd9؃\),,]+H `f8@l4(Z3Ml@+tuucf`2sarpexXZ@. gw%;_Ҙ)V.q;z8[+ .PvXX?Yyts4[قR L {?&.MMlML nU+K Յyo$A{1u6>EVf0ssdִrrJy7c8YXXx 'hG /GПN?|2@~V>.& ߎE3++daeOw3?<z, `of`o+fVTKN11O#'~qiU1E7wG{+ɠkmhA}A_y 1K#v*SZ%72 G毂R(ЃAћtN+I`}B)K͓J _ɉu{5{|pXc~L bvgsLklGJq lYnf- H8in&HÌvQU Tz֎sc8&jӆh4_^pȿyluwsޡ=S&9`ƧBtFs؉zǵMTmBRe50y-=YQa-4Y u}d⎂J*R*<}zը`#ݍ~.[<{SvW ̫_?RpiJFF++ M3I(gXj|gx,6P/[b3şt^}/}ipfg/3zTbH*TT܍hmh[PD)%d kPzVOjR$b:ͭƻzߝey[CVl鉬-Ï&H1{ ܙ\=`.m$>11~4܊ǧ a7I YȒya K4>PuYewabxF K0d\hd{: e2-fu 1\P٩C$3:y!ǻl >.B9~ࡾh0 lEsommȕ[Z)# >J I2Jc=m`ɮ$FB%cĤg}yU;Ճ]XN +oc z$hEʾNj5;{ ֌'ưg2=DʟCH?\`ه7vCvu/[D0UĬgN^kI-Z97WF"Ȁ&PWu/to%>25YɁ-p1IcqpISd̖Zme-#VOg ܃E|a^7Vldw)-#Z*&$#-aWMaB5 77VVNzY,H;0ՉSҿ諧eN3H6#<۹ղҋtFh5w,ƒ娉F-X}H,M5|/ frՐ+QZ8hP[}Ȱm#6Uc%FƌΫ+qtN2qs Wڗ#]-MŸGXsB+i5ȡam<ۙ86J1'D*ϟ/Z॰q-9 fgMl۞ 7+`݁h.kKm(FS BRSQiac(ohO\X9@Hxoʇ As a&+_~MRnH.Vd'^ Mp_wՆ;^ɂWF+mbT9q"e˭H~2ՠ=GA# qܰKqD'2"o>h: Ë,Z1+N_>] ߑ2E_JJ)>2KG4oE_?ܙ${iG΂1wpMBlC )3FG јy׸g %.jwpU ]JӄXe^ɶA?& ?MdJS~$TO0u 7U4 w-cz/wCa.v G;iOv-D.ϡr(,gHZk\c[SxcGk=&3'C[=q--WSyB דR'KcZw3PckRMWdDWWMZt?GfnB[0a4 '@?41v~a&>wJ,=][X4B7Y-whA6GsemQ!& # ;15MwαJ^ւ%KV_haÚoukh>֚Hx 0hdcW1Gŋq cG@cTF8y rZRŗ;P쳋|uI5 ?GWd//к-;e 8/%a_$€WiC3X0-4 ""ogv9[EN[917ζ rOl+ 6P'4- lbZAw (ELALJ Rݵy 9` ́@H<.SɌq vXh\m? Cb 785VN8M-I󋤼ec/ٯ7(&\*_n0W̧mY7[9.'6}i`=gEd"&촃yJGr $PwX$q'qь(]1Ԅ(qpuVj&I&e[S1//^\o 35`U s%:LHm,]&u)ْ̯d^=X1` W6>sሜ蓔 ~ A:!lKI^oiӒ ضۗ-i=8C@.;EbQrQ]:NP vdZ0rW8t*Y:\/K(Oʮs5хzsߗ:Jf"3–抦Q+anmo\0 yYӟ,/KW+OVz֣WmwpxkU::Qwh ;r]1zuh@ڑI٨UZڮA~F M7ojK{_m -}80}^D{ X2H(8zTK7!<2HPvEW yDTO.urW=n"Ic\ܢf͢Vqtm;S&ͼ68PflOYNg;,7ch[>.=G4ٶ\Ծ4S#փ'Tܴ(-;O.ayl#򣴥ED[C)%8}>IA: 7E(MWSo;(\WM[gH];o8IkBLE98ޠ66'+82u<7 ^R#Vr]]dP052hc >aYxn8M77Jt6NX2qZˊ/[0hR/NS+Qx`Zpd{Vſ&),l"7exVŢq.[Loԇ}Q9`C&ZWƯ;Icr98k0o5y"¥dԥq,q$E)iW?M}h^̓tIoLYd=dNȆu[+pt{/xogg+W||-ZŔ4eL/Mk$dk~RpQp*t6ș7wʞ+/f950g1 W! 'zۦrSؙ'!P5:Zͅ#ms3 DXbbgX~4qT0{#ao< +{ X`v~2nV.87Ă~<{NU賍w2ͯK oݚyPطS_x$6Pov\]1Z5'>7c%HHԹl@". zUɧtJK#aVDwYPvD[L#e[piE TÂƆƈ NtyI\ިcS/R0E-o =ZW%3lؚc 4<3H=2ШL\?41'6M Qq ^KIpaKxf_^'|nzhX#p:cm`);>=UGRp,Y;GʅuJ| !MRx99F4<9||ƞ^Z PRߛg~2Qիœ)#"wD ᰻BF_>RZ}u|;DLc^+ zJDgj 怏Ɛbv>i0*+㤝% (( oDBMa^PuNe>MڞEMQ?e>H9٦n{>{\:5y/|$]FҰGTI2خ$g<#gXޏb­X~x`]qYU1p{iRt Nuˀ#&,&Kg .T ʄ63\<(&>gI?uS(7_=z/+S7T!s8粅mSSl:D@H\%`ց6=H6RV2M+Mu<'/8]fl9l6\;+8HǿR?^J/Q(񍈉~Dfݦ+ߋt]5/uic!m09Ol $@kJ,{O 6 )ϓ5z4רN\z`wI0J9Q鯯l-ёi[K?K:>v͗7nɴ>/*#IDhZ|ZLw4R;YMAP6ͲwS?sґZ=,ex٢]ˉWWZ1dIpcOω Z҉߉`k<+{ks $m}dMy8nƮ&Lk6 #:? Yǜ65p-v_,"KӜ`t9B 銆/ "^4B岬{\ih~1*pPuHtM0;v :|Qa]FN$'[׳!%z*Dd5#U#Yڒ^mj7pW_2 ޟIw4 BH~Yqh7zc :3:) kFwCB9/ <589_FDJKrt4сJ $P QitPHd9'bq/(a-qO]̺(\asg@ܩ MUq\ uV 1L9˚TG٣ji9E}5>Oi\{'{>i"_ Regg8E `?8I~>ImeY-T܆B$8Q ,EYȰ~ [RTaȾEd }y*(H&k s4Q嘖h"/X9#1FJ[$[s*ƭPa%O:gsS<S'UyK +Y2Fw{ h~"FZKS??uk-CdB@Zj4 B‡si^_dZzdjBF}±ғќ6Ý8dcÉUq_oHZX`+S]coY$=G露1 4uN-D>00t z;ב=hwtL.PeHC%D[<{-`0fTQVAqJǷlzvYQgA;郿D_cQ(RSuL=fKYL1V![թ~Ch  %L>l!XQ5I7ri?I;f.̠iZ ' TAlQXq_˵+c{QBNAפ xgiЬv1)993-Bī'"p%K2gͲ;% >mYWu$nhy@:pLF$D~ft=fر/,!N~A7_I.l7*rk{UGfȣ ّpр/tv/>FӭZh.dLjC. ETRI8=b$wT ogqڅǐԃ_swWZ"@g2t|QCx.<ӶKaΕB43Hseto#))0כn.zD'(쵇 TtELDj4nv&/Z~X$ND.ǠnL~ JA`KZVKts^E24.bᥱ*"zW- ?JЀ3u+ž@BM|dk`-PRkœјM0r;җ~0|G/sSkeE/ B2nt1T,Yv6ZyEg=TTo( ) D`Iyl̀C'*rW}*`W[N9?%Il"ww+yպ-oȊˬDţ>b _XsK4/\]!- ىcxj̈́cWېoaZU`Ǥ@XmqqtM9dnk1i+F6ib椨b<_hl` LMؕW;<ֈezxIutL* [N4Xi \xr6&5X 3y?C:=}F_5+z,`m"4WQC h`f\.F !G#+=& 'C"6%0gi-/qyq?U'n>{T{9/KZvO = b˄ki нUńxNx-uS`ld"l-l/IebdDT?wEڛ@"f!U NO;(Yq.Pq1^Nmu>Ng'ž괃^a<oiM7Vpq~Yuw eE:[9+7xM++Nk–.v[O_2 CѤ~I1L> ֖d2t'Puf}eAR2p9ilY[*ϕZ;PoF|Ϙk/hu%fiav5@b# *-xH> ]sPˈ/7j*bLGӌ$86"ݟхQ; W7.XZ5H4:];Qzu8~ٺQd kSGƴ3Hx-"Vw qeK jtE֢A$^ј~9V(d2&}9uu{ u,0PԋmA+FEƘ'em/)ӎNmfT@ FĽR[0Gw_{Â}S d{-MHww'<=l'57|RhnQ!.RMT)IſtLKrbA GNj O$ժO4a)i1j;wae+_Ki]آЩY Dzn&${ $Pm].ۈfMf}}CS.1$#usiNidy8!, .#y tIO:z]]y2$#89ڲ0ؔV. uWm>Ƣ7cu9?>O2f"H]'SWvy];N3 j{+nhl䖮Po;'ר,>1Hc q)bM#E}FqgW8+˵ W0ӉMqlS\6& j`gbG<.s=ܤYF-Fi^,ELhح3{9E_D[ wN&yRfer CK1p`VBlwX%CA]M8Uj玴']~B}H&W%H~9(|0HmN䳵ǘ4v4VwSگ,y B|pes^j*+cXקgYO^H)PodVNGNXjEpWjv1:ד0ĹGgݢkza0d8O[ )z]pDŔ>7D7#FK-67Q}/,[2`Pm}$e;XN9o# OQj3Gw$X.h5'+_J`@5-d<-(i ZP0@Y(+{eXxl!$nBNtDP>& `K JbfGgsWgo14vzJ>|&itλhdR",ΓϭqEOԁE҇2zJɬcyD~]PCoж1rr#)Fh2y~B)hE3I:]cFdu<o@&s +[t]73f@u4J͗?$LQzrpUeфZ\dmfڂ+}Y mvyw%nnUrVʵ)OΡWym%(/z<*>վ]N?PUuGa9JM7 ʼnr/[~onIf0/A&F44_. ;C5#L2~5 C^nç; ɇt_U39_M]RDy\gi; ҕi$e$0'y !=?oJSL`aSe_TbHo˻["4餀ѐ?Y-(jeB2&+N"Ղ?: 1(PTlBkG 0bn :5P{7z 15@Ki`ʌDQncu=]>6>9ψ`LUPS,~mI˪mKoK>gXݷk8jMBVF1hp*M3V$m'|^|P=0FS6? FD#֛.`]gG]& ˂^bf2jegp8)nw$" ۙ9UP:}3i3,^_-C`]eCP'zAdU'&pZRa]XI8K$Z㠥LI,bjX?N'z2nġiz9\eT ڝeP\XŠenTLmm;igm𤅦j3l;Ѭ -aIݒ;]-.sDS5V/ZФ&dVqߨ*X*j;ʫ]ܬ>(.--۟L$+b_NA'{ r ?ŵЖH|AQzJz6tbIT~s篔AjI_,j(å+kT7|ELͤ#7 (8lFg%20,k6@ðg=*:ȘJc 'HtghQ.>8)>Rf綁ϥ媨<u}8]aX0`hm$ne,b?^ߺ,<֊ `/ H;ix];eq(G2#A*)ȼwHNO^{.$|g%RR@8͖HMq.VOS;*",2]ޡP2F`L$(ۥhXFXZ?4 b:OMW*HMy D6`3+T+%1cp2 0" =k[4qylۍOK-xqE5K1 :J* #>Cp@?iL endstream endobj 248 0 obj << /Type /FontDescriptor /FontName /RBFGUM+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/A/C/M/P/S/a/c/colon/d/e/eight/five/four/g/h/hyphen/i/k/l/m/n/o/one/p/r/s/seven/six/t/three/two/u/v/w/y) /FontFile 247 0 R >> endobj 249 0 obj << /Length1 1973 /Length2 12731 /Length3 0 /Length 13945 /Filter /FlateDecode >> stream xڍP\ #5݃wh!H-;!Kp ~9sf|_uou,ֻֻUԙLA.,l Eqv' 25_92 vtyI]^ rvN;;$ lPd9؃%=!`K+<}Йytف `3=@b{h;A.NQݝhg]j g d2@ h 25@ ; lf {WW{s.PvX?L`ga;_ 43ss{-`[@YZÅ 7htmH l;88mG6KٛK8ف]O ݓõwp/ۛ[AՑU Ufcc 3+?hx:T!~x[^n o"dvv9` #U ~=:~?~N?18_V;x9vvN~/7݁SU?e-!ڽqk2ZzfPrxg7`f3{}^?]Q_V$jk??z/yvuy E ڠ,ɺ_7D6 s迧lRqpqul^/׳Sz]M)eo`qpu8Kjs,..Wr ' `C `XeA:ſU`UqXF~`5ql_[_a5|/״`\!rx5Z ^[ahwW_j/J_~Wrv@W*z7:/k_:.ÿzZVW5?.VпzZÿ^ rs|O?i ^^_W!/9 XW.Fμ3&jEohYmryaot25?J~Vȣ櫓`^I3,Iɡ]я qS,ё2E j" 0/1"1VT`vx#ʁyyϤlI# JISRN/,#r,x<3B(DB teJAQ7)Dnr5+_ηk{&6 6X$鴦 NvwIں9ߢ͈^c:w+4ܖxZ{mu1w%uQ Wv* [nR2*%hh$Af.dlfC;~׎ B (I\3\7" ,!=HTn35ӌ^oeڲ٠;!e_"+qrъyefv_ {H|B«d ”Sd>Y(A,̽Ih T}C\Z=I+Ā]% L겨 F{d7N L",W3( iyӻ8ՑHx|t&Z ̫w[gx %BOB"cngX\*Z%\U2$XWzXz6|TÎ.F˕}<IqDKla~>(Vm[pր;uA 7Jh3gم)T`3ܹ'EmnHB@.vMzyYּ Rz6a/t^Mn2vB}2"חVR>/&"1[BT!~FК"~oV'd20τ'qnKލeCA]+=YTуۏI\M}i&MJX3.Lw2?Q9PΪW \ 76yDwwr71  3:8͉j+mgFtIEHyojK^]Eb ,əpۖ}?e1!sjyT?ToB @{:1n얞M&#ZB&f҃HU0鹾[1*;tp'ǪQ YeI'?pau2p ȷutV_*;KU%h, [K ₶1`O)%cN͕D3WMO&I$wf F|da {ymVJ7ƃrm_QLIrs/cϊ㪣b{E]MeeuB- 1!> ubS+L$VbI,?~QG-C!:9(8}i8N _hɠ~{q6@oPU az))9ސdtUPn6;y4^Cz>χC@r.=uU0IT\(i&>{rr 򾸈r3"FB™ O@ `NMZqɐoYV{߭V0bVPs0uࣧb[u gZg3 W2F [n{xF$~M)D:L|4@>s礕#Vm^B2FUyoEQPmVs"^b8^%^4֧C)zA^ԭK1=5‚2JE:NiV3όpEU+mְi]piCx% FcLHsV?m܌]Ev%n6KuzP:H˔cJ;`UN!߂b/R&7\x؁yO: rw>DN. AU'4L9T838+ۗX=L_q0Z!/Ke6EM֏@j}#7JWto˯Wabq7;()@X6(!ىљ(XA*RuTJ-!KB9OE/)uZta!D R2f)1X0CkE|AeM<$x_F ܢ~xBLtǏ2id&QL rkPl`b5Kunc- Js<wߛ|2O}> ävZK3E69]Bعr4Nb//{fld}C|_-Зm[v˷.<ir%5{(DZȤ$YP^Wvuƕ= 23J09dձNӗ^_YZ|qqOTeAhV$G̈́*S,-);S`pyi6s8 Q/—U .2x:~QedĔUCf\Â)Q°Y(nU3#X}qsڷ>j}R&K'|rD]{!IhEh3SfA&\d\$Fl~ m2Z)p y llX?AܮTb(DM<.Zo[ z{3Qԉ80㷰9 jyʜnPuh8Pf4eJF?1fm0:x:1z8bW;|,29[1gTZ畦$f6eEE%।.IbmkAdK_x^\Ӝz_3E85"36mG9ݲgZVEC)R!|S^^ם[)(%C3Rذ7OhnˍM@wiZm`؆}+ୋl~He% WcTzT28PM][q t9:Yyi7O2?őtlPYƤ>Eۭ'k=oO=Wd,!|zH]@jKs48ӭ}y#, 蛜!&Yc+RWa j+5z˼Үm>b26,(s!PQ8!YKɅ;XXl`-@ei>I;:*/He8fX->49:#PJ }@Hp7z9e/C&ThD<Ƨ_Pw3JEmB Mn>?26-HI&x8QOy|.4 97z_אDmF~'uTVh\:M<9 }Y~%o|}P: ZƳUwʖ!Vywgl ~!PR1vW3nL%A!$ d&b~:ƻj2bZ.hHsl kp?L%'>*NT+E~Ϭ$D ԡܾwy>=QeD;KVʚ+}zh3VXy`4!C~8Ox8`sWsӤ# U~ j1ϴU-y;K qΤ<>l*Q㭪GxHG 0"SIċd}3f*-6.F4bݱ Z.sCՑsRң^NY .C!z\+@O0ΟCk^}?XO-L<+g:df1-j =gbFA#ciȉ=\˱PIƐnfmQAk"lBgBZ5{U J=K:[Sf.`鴖HOkٗ`WPT5zS#߈4auH_kdcmlZءU.f}5G'P\ o*Q߸ =,BSK|H=yբ6a]`erp_Y0㦑b烌yӵI!y5;UL[]x%}̵ex*=LKqte){Ox'8g!x(.6pYc%g &sM=.[CY:[]Np$ 9gxnoh'U]Wh, bBF(dyд "ضqUG|^d:qęDǨLʁRt2Ef጖ŝ^60UH1`4> >חu> +xD/ zu7݄FZbv%S&ffC84m~GC;,cɀC\L^M p@;+N35t X]IBW^'r*1)/B$n⋞rT~P6NubEk*A|9CZ(Es ,Ui7kM>gg]nfn\Z0MYlRΎ+(|RD 7G&H_ĕFr4.,|GY(BCқ 誀_~l.99O)c}[ܾiMloe# H|e^Q$e[lptfTXiY#Ps.*ZgN2V.*aN&Rfd1i }I؋ז^>DzP(Z gVؿcoa/dy )C\NzWytrM60ʇMpZߐyĩ-WT'"{}: Yz9/\~NZy)ASK)'m|^e8E'eMSC:~ļlV|+3~rM)w:)vY#k#Jl|h,]jnf=>0#[~#uEׂo9[fhPjbK+e0e.6 1/TV4w5llb;@$Ob3ӥ$Qھ%c[R=0F `hH15?%tI}`X4>zLͭ FD4&8o~n Ѻm" ^t3=S4}BׯL.~=M ^3(:6NpehUP_W†{m)+cELl|c{&/r|#)%rj}ϙST[NzbRToU:CDF;{Ss>s߭r}kc񶭧V|O힛KG[Ht En24Kjr94''aiDZ U2_u^u QA?nSp֤-Zx3@Ml,q@W徤fOa7 !}`Qh̚7 ᠏W/rbmCl"=_j{HP5׍AR!:ͽg#ʆw*f=j+FǕ;Z,RI(l- 2g59"fz/;+焓<ȟgL"Hv#83Y惚&W#\JX໿2 $L*~HKk5W@n͵u ΘJu ,T5Zr{A`@":LS~ܽ"~ A\6Rիvqٞi>'#/_1!t+]۳!ʇT}CwJ6̓1I67?ڟTrXCzZZj8Sb'iX(R`9gju䘥]4W ˡIahrqP#Õf|s]<:ϨAm]ze }Vm6B)-ii[ɷ DY=^M@Epbe~Y`A :DLwyH:G) d}<ie>tUo}v>QӘ.ClVX O7WKb*OC2CjLZ!e^7b_&91 ѕnJ#]u~K ϲ}i|>'5}Ui#'ND^MscZ,Dy [{YIĖ8?[xw uҢ$C]2dH/bщ5uX}6[M7zWMVկ7S;.+AhcYxy`\Z2H̦H5ϵaOyk67e &7G|(N*8 މNqYR#!m^(BS9< F?{!';3_nGJȺudz7C8{.N"cGٯ;膧I'_r4j%kڬK O̟/FҌ?%~*y@f'(a%B m +DeEoV lz.QYeNz:s-.G(Q\+9;QZ;dzz(9?ׅLV5vٸ3䉮+ݸc$be(9*1'뇛NgIZ !Pvf!5(c163h }F0:=0h8[0Eծ6ۺ9 F?׿$èR-Nv4uR ̕ƣdi@'z(Gz1^qn=J[F gHo\ulRl")wB&`SB@{кd{-Tb+~g~|B9B#hrs^D,Q*HX srXw 1MCItԬ̴H C7,G'KF?BUo2B۠հ@[3Ќy9!f;ռT)upu˹#ARudvh,9 hJ t4o_Pjp Jxx@w~&:|L.=C}M$ƒVsjV&qz11XEMYu.eRÏvՉ.31UA e^åu }&IC5ħÒz#Ug$n >J"I ;T\.y xڑ 8{QLF|#]-7|+UϤ߶O܂)NlxMhcƈ%&YF!?'(1|X2v%x/Ln{ǚ@dgd͉Fsf YsFf˻&jב,!z8kt \kjyU6vwZ&ߣ j^inOVNZ<]Y2@ P;SؼUP=sfZ{b]֐-te/bdt8]j@ m!ͨ&7GS&6UJ\aPW =2N߉D[泎եi-vdI]ԑ!%k WO:6@XOu)a~E\¸=݇/axűըy/pnI~T)ϩSeg u@mB%jAKVVs /Km/gcv^ђi\컌(iGFԣ[?^6#~w)z*ن֦=~Uw02r9ܥNQ52/$>RO`#U9ϟ2<}C(n߬'OVBvp#AM Po 5)[}; $Z`PO ^MX3N2ieɧG$f\CE޶TH(J\/D믃彟ts#IZL']! <$q]A͑nLh &3bwcE+.Krt]jt}wvsé,9*+1H0 SaMVK7ǻc|Tr儿U,[J]YSGSt@*KD}[>7m}?l32شxh.yK/1`Vd&; k3X:?T=v*t3XE D+'x5w& s7,":.p*M?h 9AMiu(?¤{ j ny{8̜ ZN66MӦUeMu?ja8QHˣQu d ޴ H9yY9%/)e34uxAV?M`B ՚/*/=}[[B9!?M3WL62Bq' TPꧼYX@ʧڷ3mn7ΰEF- i*rhl n4{7(w# 9\]de0ο$͝j:<8&Ͼ!mhDE\ӠBk#[%c-ya/v|=Ӥ,4.y|\ ƇAf5q[}1nڍ9DT܍R=,ǭ'DIMFe[ usNkϗz $yF֤{Y=,XSd.#8:(9V4Gm)xrīQ@X =YYSjߤszlTAu咲t2D+E!ijS\qk7Uh$VG:K0bϤ |odNrֹto@ $}1 _M'ؽW(Rv*Rc/jQ%(S%J n;-a|lX]ٲ=XMNq0ےke9 Һ\ a3+jZt|Dv:%KX")w@R/aty + ""o]fN3PJ dѷgZp:2T׍NZ%!FZ[/ ް!em]: x'};Zb7Vq#%1ikZ붰QIHs , P;iNd"kIb endstream endobj 250 0 obj << /Type /FontDescriptor /FontName /QOVYWB+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/C/G/M/P/R/S/a/b/c/colon/d/e/f/five/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/period/r/s/six/t/three/two/u/v/w/y) /FontFile 249 0 R >> endobj 251 0 obj << /Length1 1403 /Length2 1250 /Length3 0 /Length 2137 /Filter /FlateDecode >> stream xڍT TYQ (8- K AQbHdGJ$U1DQĶmіEJ#.qp@ť㌀K*nS 93'Tw{o"]D%pҕɀ8 ńy0 ȝfotz2y 4ux@QQ  8>yu}?2j_%~H]@ ?{gc3D &Q$\޼I@={3tFʹZT>,kw^sffer%ݠ/*@levJ9_1GVdd69 r]( 2ϨbJTõ殽3 )^[Df1>|nY{*(ViH3TqLĦcSϧc쮍y7v+4eU:WcT ߏA7i๑O?eN8}7R{t3,KbpxnAV.JQdb3}lI45ҴC*Gټ{ 'ᘵi!wc,:wP$rW%yQKgk\[B)9:?3j]-xXXq@9|u"T.ܕ8CG䈑סRAM ,sރx#w^koِ|1"|w~]MB4!fpa`u`CaI>is_ɕC% JI$&!00dDw+L ^:ٿaJ{=SlV]k`(-G#E){?+F?-dh@ Ў&̕<ϭȜƖ AwNĆ|9@WX+hvxc=8ȧ5ybsq@LW0WFECg@5!#164 /9V$gkcWʵMSvOk-r9y|{k;6uP@Hƕ-^v"vw#f.|f;JYI '/nC.jdPR+1iׂ@h[CaxvER aͳKB31&zŵ81H<ׁ=P^h<<_d<8ո{`nޜF]ih5MTyi ZW&mso}e84/vq*F橇HvJpE-JIz|0Af`crx޾PJ j35@{Dwj2]֥ΓܮMPqy5݉ڕ@\1qXmeUٖ|F3cbm^[+QŻ8|pm?fN4R~'g؅-T|TLW_ [fRxyE'[U&L a/Cr(tV>SQP>z=I/ 67[GT%&2xp#pԴ[!X4D?/Z/VF_l(M|M9ꔯ{ja2s-})-0YUv${xh$L֑Y˝qE6׭.E*2!EVV(Q|?yF 9i$)]x7.=ǾG2~j{b`<פkg~dףi.'gG=%rZ c<u|?#kS@t'jkx z9\aU\!;B(2H2T7Sj\*4VO4,/j>Fl[I驵bRz%mM&5\{.)Kk=XMh J>Afw+6+95- <% A pse!u<(c =݈Yh-s@yR1'?H’lۚO&m1g /]B|]U&xl[9qʹn]4*ϓJvu' [4w9׼[~ $$ HF=Ì0y%ܯQ9ї>yB̸~Mq0C%? qp5E_u6e]"96L_i޴c6~P1 f2Ul%jHFjbEB!3NwlR~"rca,/-iL]#_ N%ы'-}k)AkZ1]~^Mq1m63Pq9bѵz Kgd[hsN裷'mJIt, JTc]2$FgB,c+@U|3ӠMd.MDP]kBԻѝVSCDmӭEҡg*{4vN5޲^ygLo'\SOFB֮L읳a3 /T;$Qo",YMKD_Jcr&΁L2|#duߋ[x (K6zNi~p^{gyY4dC9~@X?Nψe-vNDrAڴSwf:-We]8jgg'$d"3jm@yt Kǂp^XQV#m;FB;CZiO'tPO:Σo)1_gp~} 淈YOi@3Ϗ {O郧g_v\/ |scOʕiɲ8I)RssM9l,Wի(㊑Iw&J}F8'k&;=5 ԡIN k}Ԋ'l~qu߶+瀼Z}þĘp}[u Fmvۀu0ʦJtbԿs"Jy>bݤ%aW(ɹ1]W/ovȁ|kϻeC]N}5%yedch:>C@c"eqfEW++^r}J3Eni &mZsWG.r%/a7˞$,S7Pwc܌#>]ߵ"fAd{͈1X^k*3kr:lA;W;ܶfIļ Չh>92hZ=`O+h$[[|AIfX7] =cGd~|ȯ zj }"^` l-x lP-i~C~ZalM8; 6:_/}hqcW-[dN:z\61!$9}.VbWth:-Ρ0yrnZVIn^NJA~wXH-Ηl^)Y4q u/Rm&Qu=$=]iᘳ4m8k?Ђp 䠹8ge4+HDAȽ8(w#4p/܍ۡtv5W~rŕSJ iRxIbw"w L黶l΁tH q3mWSgon^KuSE08VÖ頟NW1s~4Vn?$>j3̾t2U::ɸ$+Sq4gkwo{,6hb/P-Uۡ!A= ;.r>S endstream endobj 254 0 obj << /Type /FontDescriptor /FontName /RJQMYX+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/comma/n/t/x/y) /FontFile 253 0 R >> endobj 255 0 obj << /Length1 2635 /Length2 22659 /Length3 0 /Length 24141 /Filter /FlateDecode >> stream xڌTU ҡġ9C7H# !HHtww 83Z.ւ7jV@G3; @RY ƁBMe#F90tAdRn;eG0@` 8g"2(@WjIG'o;=,L.v`-ty'+'+=tx ;ek\@v@+lt@4N@J0 px dmXہU%7/7&9ꗡ9oan2 #0Oy.vNn,v_% 4JvsEOh i7ߓ} vVֿrwb91P~lnn666^~Ne^ RRj}T,@;01o  {_?>C m|Y44_ `d+/?(v]y㟵d͠e qYB~>\(o ɸ@@@V rʎ_S]ߧ swZy7sym@U hffio ;0P A5 _* Rlh8y..(C7rV@Vvt ]P~M*K7JFV߈w?U_`U7F\VE7pQ \#E_AF.oAhF.:oɮ/d7 oqCt OK~Z!Gp{95:X! ٢ m !avp~;b` g[o'[  )? q? W0CjuM5jH0'7 Z2?R4 Va!j鹿$tvwtZY$G_1;;)C'WW YpCB>OVa;- f @V*nĀuBf#t7_H$ߩtwOZ8Z ׄTdH;12=xx@'Ҧ4ݕ٣aS--~-(scy_zHvt^6ASrvPS8>SɣP2cT8Em1MHLĀ}b$v3B<#Q,gGrk;! 8^oQRWP>Y&:S3&GZF4ch}++ JgCuq *^ei4[5k ^rOk/π)t}Z^曁BQbOvi[èE4av]<.&ӂGyoK<66>.!,83)Y'qsʳŷ<"[Nip4w5ֳr|bo2 >|.yٮي(`o[\rܹ[G{uA!a?6~J;ܞ{FH ĭkfGifʊG\oNw![PkIx;4{%|9^T"/EM?ܣ/oxN**P ?! Z:ru",ׁ4nr(}֠f'7ɿoRʍ 1xO?VbW=kӦzGCp_9pEFyŴ+J3>odݑkp5Y +6jׇZ>@yIʜVEeWI=|vE'z0`$=h$MiZw8jXXkOc /*Yk$FJh|yTPuNM#xCfƓB;f_sH *ٛz Rvb?g}چ۹۳@4"3ɇCYIm?ԄاI~A-@ImjwQtg- o Vέf|7!KRjU@.U.r4k未/x;/VIJ/n3ʆy&t`\2>Qp _&fhM+,) w0*GHH~BJHHš6R#FE߿+kd@fNx8{D84KAmhQZa(rG7ϊ{Bj)O- =FVEs- ^dӈoƍv_ރ=~iʲR1lLYP93*ELd5QkLX19[B~-u_ uw12ؠRN ܜ;] b]pKvDL٧A+_[db`Ke}U+ 45Ӊ"qU|udJpzZx`;3FKk{S1kΗrj>DxUø %[}ؕ,}K9tt[#&1б+TYT?1ΐud  QȬ)he[o сl*:2,&cJ?ޚsT o87\M^Zť1|;swf>aF甄xHE+S+=|yxCU@~'Zw!}6'.N8!`eC[w=[K;?0BӞx"jl7?le$ __\t&'47˅aWƲ{yI(!Wg"%8DЖXjf"V #Q,2t(-Y^l]fueFORV6Ou^:Wu XƔ>oS <.:3HSHGR%%J(^VΚm? C@QU-oTy P%[كS^/T']R,Lg?v@75|GX!T%Rsr^ĺ򿅦5,'E?rYнPI?wKl CAK7!].PMqx.[ZQ1JQr&oe;zǻ#lݴF§bmf%T+֫ٷ]z|Dy(ɋo m<Qnxeż5ߜe¤߂%f> %gx5D$-ޝKF[ߨyqʅe > .ʒbPpJ\rxعY3,5DaOI=V/qUhxQ {UoCwY셧΄&bX7Aֵ1HLߘ&ޮ(c`߾nQR 9ۡӬY nJ՝E(DuYzWOhtKfV w_ 畷"ÓJ]1M/KAHmn*JQx|ӰE܄7{ ƚV)J]9vw,U7$;Ň, oϸ˿`D$E3irS;*"M&;(8Ҍ WܗZ3gίs[An %Iz)(A[c>쒚Ĺj]oH0è I :*$f6 "/#0ʏkqnU][o55l[Bi$ =÷&=P|8A2F:%=?ɽ[7'q?[z'[*?DZs&~/ۤ-N*ߥVvG"~YШ]k85Km?G.v*40Gfz[-f" ~C#&xj"hwP&#IsȟjqS,Aеt\ )ff~  fZyPcZ5vCդZobtS'=Ԡ9Cװf 'iN7wh|KT.?Q-;ߐ?.Ogܽi?f*nsˢ߱jS ^0=9!u3 Dw|K30~}1E>iB]"֛:PEkSBpMW!y3nsVNl}hF ôG>laNy!4/=u&ܦi7u/XcPb6Pָ"R"N;%6T$wE=bʷfs&M?K<[]Oŋ8ŃW;.M``H]x`E v\ ~ټ$ovcpIs_1([K\jfCjW+羐\o8yV{Lnv:?[vx -_ FNwGzٿ]ԁo`^,E~5Yyu{,=ʰr$ lmHsn#sWh>;vJUbQ=^/vNuSo]>0|1*A>?EwɜisaODfEԝf9'\KD==D2$<XX1.~v@/Fnas`3l޽V&ki%": ļcNķ$ldm*͗ZXJ)\#'iP?ndtdfw]dLXk~B(5 - *vCbJSҵ5Rnyx~\;֑RKin{?^(OЫ/޿jM17!Q_>bU$HVVk$/aQS4RFrS<=ci39-(8i [`/R7)# f>uyW5!ofv2na0 wd1Thhq슣U;/䦆/EdN vUQ5:٪[ltgrY7H5ؾ[dCo ?LdB0PiFGՀtNCzhҊv1\¢%Ojc% Mn𛐎/б%)fӿi.oX !,0Pb<nb>lઐw [K2cGa@}]zJWz0L4=\!^"Kҍ߽tGelbHcnLNXKwFf[Z9~SDF&69zƛX[u>ʅ>_'P(;2G$~ھ`W&8VQ͈'&0.ɎYo}dsFᆶ"^NAU?ucKy1P宯@Za`ޮ2+ߌț`ʳT9ÁK˼L<|/!ߩ;},GM9kBϬ(IhT+ %1Uv(h$C(D |br_ob2s|FjUJ|};Mlb=NFY71tz5|7@1390U^ !ā.]9{6ZIet"'9A&f@c= v:2M 8H'!NA?Fv o<%w&yTP۞ k/ډ'^j;!Z|d}ȍiCZE ,|eFT,FIKl5ˋUv=xpᱍ :jW.]/ާo{Q $0}N$4?fsNrľ԰F;e3-yZnmR"l + jSS܉k84\m{4+bmI.F0 kKzɦ/2p Ox$CC/jQ:o[n)Ohv Y ^6iB>y-bU0xRޖ!_sDK n$:WuE^{ Z=FeFTJG<\`]h(yY1gyݣkX ' r SgzM6G `Ԓ0g,Ob=?"7Ww~G2Nb,!xT iy}?Azgr[H+ΔWHb8z:Cqa/ީ8#BW0 ϴ\7.l^Qp4deM⤋Ja U@P0|&&.!˃IDĮSVh3I:^ܴ>+ک9t̬dN- dnnIIW޹y:hG\bXbjZp[9#Z 〫{Ʈ`# 1`hM"3l&j GG N9:fd.W?񷗷8w~E"Ye9Dw0`ϩX) L"Tm!C#;cut+<)'eGIMZ\^;YOW *AѸT~ThFkHOTcKCGSIgjOqېǮp2|O1zitA DNAbH}^ςp+0tr'ț8_ȸ =tZ 1 TBXAP|u%!Mf68Z]/ YDtKx kny\D|_}'1H_g)5Tǣ&h^g #ۍk0<c5Am`a6]8k+34_- oR SYR'$#sB},)uZX, o>!3*BzP*LvCቻ9h2HHII.X]:&gHD| ۇZ9pNzzj:@BIMm 7R&N((ŕx2zHC/pC=f{NB#ӧ2<&?wj`LW.CKSޙyI(Ѧ{Ԥ<71}m,&HYh6ROMH-[y2cʹ~hcw9l,QשKiI+Ufb1SW|\4ܺ7K•JK"]}ڪĔYAۑjxi#Qw<){߻hFJ0A jRr3s_X IH$be 7w2Jΐn?h49D/w_㈄10)%N]ˬá  z>#&k؞ˈW}x,O! LEջGÅ>((ͮ.b"f%1USKζSc_tcTg#u7]G2n ebX^FIOTk&-i?vKN'O@=P X~:ҟ F؛O\ArcP Wpl!gR ]t@*SW3C4mZ`=k輾c9w5(OZ$b A۫$=h٘ܨrjg8JhڷSʑ6:l%vRLGrluAx⭀57Ms1&)݅P2|TN9S`#샨ږN0h(a9R>zSagRHف Ow= h5qCtc;./n;>:jj8E3$\,r-b^bx;wTڛ *³_%Ƨo-r_kUmu\+(#ن&MFUb|(({]`n!߳ѨbI1t{u2lA%Ơw!]3IIԢi/{o#_ [*&;^E=29Zv}p/j+!evy?dtlMV H %;7/:ޯaZK9rj˚$ bX{cSdBm4PIAO%,xx-; Q9 o5(  ,` _towګQHkaM0(?]H~c0i7CJst\<#mrN@lkeD9(e^Jm΄m}/uũ&H[[ޔ[識`QU\5Cܗm3A>oai;Q>YEXG!g1#SuxTά<HPn%\6л 궑juC'&88w^RJl"4. z.-*|a5Iԕ5~MXl˦qP t7|νZlan>i'R01c|@ 9Ĥutdlt]5HU$ Ѯ_a D ޡ*qguS95:zŠ!b*;!,FC5!u'\fvI&(ԈB5E!L<~~K х@@񡨍OWjWʐ'x괟2+!p ZBewOHje8Et5Hv0(`n;r ,`@ھR&$>e@~bpBʊy;B[/A&5F?2?g.S}mLEZg⸕?~|eqjWi;-b5)Ǣ {c[-W20jҘU͓|_}_'MƜ+}Đ$ vQyok#5m%ƒ8SezQ°O$¡dsLQWPé wKKV EZRNI eRkiUMi_O-=`o;˿ Pжzg–<M=_ ֍&Mh*OfSkDa~:5խ"2u7~IvQ\y,I:+5+-4b&8j'x6LI3ib[nxz2 H@1]o͋Z_NTq>qwArTRqL`-z, TO gqt=HD<8o=ӱw?KҦ P4 aRA x_9`x6.& _~g/d8M \}چ kBa,4,C A|z{GeUMͺTa?j>џ?xb )J ͹<*[Fwᱣ:+͚g2危Ed.Tsir^8,MӋA"::u,r(Dq5!]%S#gn{)d9y7qq#XX:խt>B&S˕?b_^5f83\*j1#5{R:#^@^FiHECӒ$zt"ˡ2[!bA6]+"rg{~l$XY%rF% BN n<6Kƃ6PF+q9c e4]=ю};OZ݅}H}шz v*³CN65RMgEu 'r~$^{M.(o?}?^5U~L)`Ui{!hؕhx9w;Ga&7ÈI/ZZIc;tCݚ2JsscMAx;XFzD¥O8Y/g[ə=)h5gnnhج0;Ϧ7rߍ5gs5bK'# ?miK>fRʹq_> *,kUTVS)׉0/C:hy g+q |E>B+JzSP1J.%a!\6*ּ tE C_+b^\|0 $R;<~戬1c~_ټD"{-p%J-tw&? Aݽe-wgA=pTv_4 5WHyu"(Wak}2J/~XaGZN,Ϗ0U?nMr̄F(qև9!7Oܱ1RFF+4$ڧ}_dy,H:d6ʁHc6*bLƦ#_@K|D Pv}9^`1!-2,rgn ?8`Z+~9!﷦!֓KʋۗAyjoMJLry؆H>=S#D,5&P(P~ccZEg6ߢ `r_v`ޯLķ $;[/"SX7`sp >KgoqQZEY؃sKlrA"_DLrE*d3qSo֢zzQw ^;G㩍BiM{Yn"P].ZZcpQ̰zY;^X^v^NlD09-Q*E U} @NS i;{ă'-h)[OwBOPWyչL ::%+IY09sP7rz'M/|6bsdyӽdM%V~KEP% ڢ0LHϼ?swp|I;RS(B 䮟ޓ:yڝQT|6ۤBFs{Ea#+)[~$71m(Gy1HPW[Jà<>[.\c=Zam(K2vt+C! _akq+Wn[:FM궕Mq>aK~R=k:yW \9"ɡ FWK9–9fRNsNY1Z—6Es䍟s^Gɞ*;&}~|gRU=M pvSLۨj剠YqemS.QGr}aD{ti2Ёr[lT;1+$ReXM{~+5Bao\V$]QH6eUQ|R=[fyr'li4=C/V\x\>}VM~WEeI!ӌʎE$5dԓԖ]ߕPF0})ɼgܟpCFH[j*@'i&#`:׃#y辶/Pkʭ:v6r0 (-'JH]r[ _H]AredJOJxRu,{|׻fOF*ڥc8M/#~&8/Ĕ!;mBuA{f-2̚ݴtf;ϫo2֫8Ӡu!4r٬'5%.Ct A?բV0`Ⱦg\eHZ%n$}_),GϥM'TBBtQCܖ{u|}pR O{d69ƽUB q6϶/\) 7&kog}Q"g~veeCRޟtG _=\ Je-lUa׿IfVJC';c7耦ߣr@9H ŵWk%M0ՌBSck:*[E8YKEv2<" R<}1{RCɚ1V5@7Vs`moN`Slgͳ%W1i+ga0v*R7 Ő\PȻnNGYY DL֨"E4% h7Hj]5S70Xy DDUoR!8Sj)igOr1 /'9:[,+Bϳ>R{\C&V<1|9$"wNow+jn sEcSm*}C*\BZL=š=VN&8uC73#?PJaC7mۖ՘>i I\pn2qȾ65E@F2̫N[eJ{ɔ9o:iw7 ڵTU y~>\"ӎplhE}&ÓuqhT -#~6%j0_q$Z] wƙX%Ű2M?2/L l|К0N{m.l(G̀ݼO>Q#m[+K4^̃-[µx% q:ґfb1p n۷ $FCdf 4o#|ta#~ &ӱyՀaAL}bwT-7j=FԽ&Дanu9' WVZuW̪qI=QFtR]k̯ 5ϱR[mBYAŊZD"8plΈR6s]L\l_QA(vU kQA?T%*5@ .*pډpg]{(N0FB ~BSbӑ> v#g 2_du߶0/zC;QtUH ;XW}%TC?a8ANCE˅{!, /c 6pkr/|Ӟ/!!>j|a˨ݽlPnoV+0 KSk-BioKAqnSVU)MMn~W9+5_;bUw0ksݯ@.3FywRSk} [8`ቬXbKḿ4?pȶpT}Qk11Gϓ (If{s5z6ac`^}՝ sV1K7φq6j3&AuC#UWC @\ 6vD)g^ĭv)0[8a|>U 4܏ eTt0$0 '5mH Cۮ^9o 7L={`Q}Poü0%x3B7:Nqx?B#_&~)Af%?ɀR_#S׸8@bgRCi_-zfέYMkjK(ܩBRJj$'rl)"-Zz0]Û g;kz3~Cܞ]Vo"kV!Ǟ%sfz$RX>7%r rN=NeKD.͟K7ӀY=5Q!hiڝH[Cokv\fnc3JSnn^(t+/=G3lĶ^9@<U@+D!+ Yݭ[\ '0bzd!·yQawh^'< :d+0T0C;:I+gth)> [qAcpd JT`4NoqZ]~x/bQ%:AdSƘS-]VV^å ff5D1J|M=>aid&̐2_6c: ZnVx@K2?/<7 sݹW IES&Rڵ& f ]V)F-<řVlY='t~1H4X]H;Wy}l lxg`^/zcR$ѬpK**1~! .s)䌅Ixz;oպشvDm&­R2^YɺPS*&" &|Bw9?'%@`\+fSE> =/[t KٲKjP'4Cw@k K_u(A0u-EmƨnN Igw֏sE5K)rƸ?v"٥b35uh~UřI>kٟLNn{;B8$ȷ\AUT$OC.$<fT̀Q:WfLi8l[N,qank]Fh_V_· \]/PN+ň+`Iڈ]4+ B~֛kH~DlwRm~˷' f<-1I27!郿>b57Z7eԛSA,> o{iVdKq:/ՃS_]M4)NVGduɑ]24Z!{a}͇PcMp̳Tb{p:0-0<-Fky8tI<j/R+ ߥO\Ta"cw.c_6 6vX1㝣O`q#%r\ 8*$&>D6Ң7sfYEYtdX[$Ǥ8^E;sDm8߆ZSK4! ١M_|~rf%I2Z={r5%RDZ5U}ՊڷGigw/(4#קf<|V] R@H*Clvʬ$dpO|D!|MJ }$ń=+DOaa;gpw5lVVz"X^tWU e!!*5E$tQ_B1?uqFmtYWi?v 2 T'5ҰD01jIJYDKytLFg`0q`Cz?*i($2,3ӧl{[ >LSHuܵ[>][JXZzҗ:a-kn*Ӕ~A qGܯ,>5Fى6+w>2!j_pN>ΔPQ#Z,JlxB)C RW4bIK VHgѪ-z7ņ..E-\tAH*<qS +^if &O݀B5{g%P JCqWْae㧟) #IDl=<*}!'\=ؿ 4+"ɐ}8盌"&(dt7 hG'B\Apun]tO֢t̏7Afڗv<sbBl('v|VSa+GZk:yi[n}>?w\bxMy:Wꬠֶ5qEkNCU_˯[BZ?<Րܠc׫m_Orj',@$ĥaLN[]$mh '.hJrGWLM 7Uw! /7ƍmGFt,J.Ua5`{"3#\H Ok#h|q7,3]E~Om2|GU9pV[e+R,P+a~1|o/mI˭& q*I]y[ w1q'Cek%M-Pn01:3'ܩG+B"^š=ZadpPW`.-7l,m +h8Xډ|<%Zj*3⅃.AҩmJu^=uOfa=* UuY/ #_Ʈ e\қ7Qix{pp(`?Sw؂8e/AFIoE o s0t:c|Tvq``Z&y<8X8hPuDǏPѿ_f#Y9U 381]^zaH"JLE Rm% Б(Mr]Ī͕r__[7  G0Sl8Q1)1] ȱxFEbdy5#/7vuoתL0SiŪBS !έtˢn/T0|aI x8@VqADQB)unuoL$xlaV=37)p2d9/g('h]ƽIH6$ ΞV١r=.ȃ2̰u#6G{U9,pyۺ70K .`\wzާVLVE%d*Ib$jI6VA*`*DZ' z]L#p2ㄚܮ^k=a\Mxt7\#74{)=%F` .X sz< + Ňpv@|~v R<@9/D qq}cFǨPѺ9;,gQklA-au_BUUțҨWǟ]՚;@I&ث~%D+_ 4W+S6/͖O+G`~ol$MUN@/lȫp7׭"qQOOKLGd^ةȝi)%pmu"@ }H: XetЬE%$o#s6جlxՎ[p1Y2bϬT }W [ y8[YS.rSfi_*䩲CMke9`\>#N;*)Zez*m"Щܲ"iF=kR #IGV-\Q 5Ǎ2f?yq-}t''D3¦x/Qa8SWYϑVk›z? \|qq==?*q[<6M[D;)k![(O&w1ݱ;g_-iWӉg\nSu2]M _%ox8h3nIW$ǍN"OӢ3ٛ{^hޱL1dCVoF>JGasiQR*#@Y_럖ؕmο Ri,hD@ƽ 0VS|ԛ N(GNu+5;1"h  PϔĢx+73oba..zổm+GZZeOlKP3h?[*BӡR6m%5.̈[I@%nN̺JޝK~r^X )se ͟.4[U"-QJY X*! pgܣm)qU p(*:M2b| _,Q,h}i/tLi K1q)ga. lG-V8u -*Y:s*1N=vg憞xirl5):[d𜬢y0:jQt4d7T*-M(HC~t(oClhq-傌r#@}c5`5Ϭ(a~g]kXiQT|Vf1+U2M{+0VSM/zXH b^DE!O%SM&4ڐĪ-j0e T @u./2qXtȰ JJp`y\Ղ r꿏Iwϩr7%Da?Q5jMD9,:\g8\qU5xo7K7s}fLZb.C> ډ]5%W~8% =JmHUaPyqS3tHvwʚζ Ai2ydb>FXO)s @lP-q-:R -x#Ƣ@3 GЯQu3<_ɝW&~67LU"GI+v g7I9Z#+"X({z&|*y-O2<jL c>tpC;ۦQ5CNKk3n8 i\­]Nh$Δ/&| ` #Ԗ"a#н;]6t,=$Ś]rҲPbm`aV-P) 0p[3V-=l^&IwȫLcCDjlRQCyRcv0}Q4RgԱE5BHSZSUy>%, sG4 b%<>r,܏ Єʳո|,RCjdDx+C-oBZGaJ+S =۵ȊL\ޏ >QT}uM&w|Gtr1C^̶+ץSC=\WU~!lȍdcel"@.r/QQtzP~¤C)(ʄ6 f=V㻶?H` ӷFF *bnKvƯ W21<@u;p{K#u]N]iEC^ͿCܥ1~ܕhMD;o W k mNTfY i RUz@3^e٩\;* a=$]R~_eLJp|X$ₔA 7Z_[ $ Sَ;aíO@!U5] zjqlòJ7 1ǖ7ywr/L{HT\BxC pt2}awD0"%3z!)^OX{Z sc`yA}lxP+ 'ܻ}R{w1q8k [:W=OX0AB(RRWzPx8]K5LᲁaT~χK*b$ ɴG]9tL~. n9ԐtC8g+)o0gNQ fH8. &j)Di̢@oJԬaGxDÒ(ȯQ\?>aThlLQK8xWbWԴHY4hY|5iA4V.[REsjYyTԤW!_toYщ\N͙"tJ[ؔ.F'bt-ʩHjdQ]E;S@f+45Ycue2N*\Mh#~GL?!/ -|gD 5钌{)$QAZGa" ~i !-B =Zdڟ<j1%-T?рa S9yqQ_iҒӏAXz,Lˇ Zg?Bi03Fꈬ H٢g1bmP!CU .> endobj 257 0 obj << /Length1 1581 /Length2 8157 /Length3 0 /Length 9199 /Filter /FlateDecode >> stream xڍTm5L#-0 CwIIw330 )tttJH H H( ‡Ykާϵ=L `5DC %Z Pee5" qY!7(&ygS!0@@ *) & @I h0."G#Æ !!; A@m@0iq;0@!H*!mDH{zz;YN'iЇA0a6.+nEz jep&@'l|+W!(w2yCav[ɇB@0@.:~w(@wf ܠN(*s7eeX !pE@lfapO_ "vw7A]!jJܙpA (&!  ^6z@~;~]w$ P[@"!o+ Cmko;3| x=';y0'/&>{|y" qqU7V]ހT(o㯍 ;)C*)Phs%)UmH鷛9C S;n+wPȟMւUCCfn*P/X#oᮼхAk@}vwW]u#a6p7.N^""_C~+#Rwp+2Fb@?H$8s~@?xpwP@(w76[Pظ#w .mBjC/mTj]M< *aͷΞfB"="96M;q˨ȍ+Tk&w9PЭƌttn:ߒUh,eغ ]mm މ$ 5?:GILIXK^j'b-n<:I[':}<:]lZS}{:FXH=jnadu,Aef B+e ZϠeC%!>S{\Ng6Ν173j kCCnukJ7sʺlzo-tR2Zt-k?qfV{^Do*TUgywل>N~]Ri4b]=2#Ԥty!/P! 2ͣ8: ^bV.L/*Qň9eUhT@4ϩz7즽{{aQPa)oasd3fm' jTA]+eS0оo@3֬hnU8E3ԡ#ːt1&Og8 & h(sT \;Y6=܂N-< crT `^fG_^%QLg6xuQz)Oijt,ݖ_ |s<^sȍ MN?A[~&(kb;gOE};+V6m7_j3J2M!_l\G4ӉĖz^Qf pݼ⦍rc']W*o+eM23 4g\rOO &^NZl5YaşKPfASCbުczUKv,M=4a7-r‡̜=!C˖q/a$Gj@ 1.p1PlʦzNLB.g'}8Xmo3荢ze~bzRS8n5|B6lo-!KfO],'KD*xq3-1S? 4@_.mrhx :VkͤG>0>dFωN"{yb9Rolp^p,Īzjm/3i!խXj.pLz}(Ն fkFgN~ƃ̈́ǭʳIIeAP /MJ X.I{/;*"p`:yu1+Ky1a<[}a|2_cV9S.o6Rny[15m@GRHL(:ٛhK!u'Lld Yf;vL8VCU?ׂE7Xӟy HかF8c-?OݻD7^*=glxή3H0 *ks'K4Z}4;MB1,W_KKcl# ; S)~҇3 [XWx5 j31z Tr*@TF"{Wk5Ng4 -Y9r7rT>P8PPgrĄp)/cݔ )kO8ۼ/R?'r$KV3.uЫrh%agdbI BQ(86KnovNfy{$]`r7J:7W#6>iB_u  :RΣ8zfY([Ai5٪Hf @}Wd^~fLDo=Alk 7Aob+oiӿk| zWTc?0Q.kQL*;Eͮlk?8J .|9Me 3u㡾 hԹ%GePٯ&sMf2:^fL$<ҎD=P+ie_+Y q*c ٧^|B1̹gĤdtɼÒK |( d%zK£ W*~ħ`]*]^7.6_N\?/srI\cV ZW֡1ἰW{UH$ EQNvlӐ Tk0$2HAͲGD%' (bfgzbQf8Eϓt\G6Vy̸Jq78"38i^Lˌ]A$O.9Y /пx_Y1~.:@ T6@ $'| 0ULH^Ap y:)ʶAX?X4@xd). Uzuߎ%\G6dSbOE`M)sĎhŏD>-0_=Qeט. }Upuzޅ H1 G7 S'%I3Tb ܗq@KsĨ.bc4FbD$ί-E|\dy;jU{˄zAQ4vQJ2r3KDeՔb h>{'C[VX])_ٔrm .? Z .`TUhybSՅŌW2='"${l8B qi8b˰pAM2ȚDh ^Z jgOXJfsėS}MkP?Ohn}22^]}ƶAdl9hB+@ 3-*Ѐ&K ҠQV(]94 ]Q`^DSkͩ)HzYQ@=lڨBߕlH&8y݃Q?31n$ bEdP͡Tb}%(#\+nOK7 "HNo2nݬ*>[(n= &Pe| Kȋu},ֹ񋬤{*Q|O|;3 %!`'\E7?54EHDuܧ~)V+Ar}W`)bX+AۅnxtP.1")3m,gʽOV(ZgDf lhKFַؘNFpѹ$uz>2},%F(MiFF#~jZU\=أ6*-ӲE17Y^QGI﨤H#?$Ihg,t:=[v9rUnbP} x%>^VTIzS_ݹ3gG[EAp C3x KDv^Fa}wnj9T6XJ:JgjV+fh'vS 'b.o 5IϿg?,t $S֥f%5gAķloR;ٶ+8bo冭707GZN4nb}*|p9!:#fw>p2aƑ}sŽAsɘzLˆm-:`K{OdžnON[qKy b.́Bqoe S<쁯{t9O IօM\>7i, ~Ew ȍ u]K/YnF_b毬 ѢOMi_5ZЭUJh]=; ^޾p5dGLt=r^3u"W2ug$/QkaBTlGqA>|X4oQMS<էNS^' AO s6>M.FT5.M}L >T'$PiC3/3obAfbyvcf/ Toz-FkC#]!=FU?xZ`/ۘa -խx[<4,K۠j┢4)p|rb)[w9 [j8 qLp US]|fU˟ ])S(>acrӸCʌ7E'/4 .~}ϰvl|- [6U7]B be?X*j0Ƿýfڊy3()v?ĢvyFgRƖ$j/Aa9+.Xjb*g7cvyO)KߠmMFkTߔG}+Ang Q'G|DfJt=)b I5>ɊL=Xn/X̎{p˓nj/qZ]ĤDH:TTWzo8~/VrY};!@v%ZQ Vض|&?B.Wtn©={:5<~aWLZPp`|Ю^AcLK;\"F/u񴹔lt򱂲Mⅅ@hY k#VA-wy/wvphe0w-v:.ycHX}^2i{d~gRj#G[=?ۜ4Lf] Y`N ]2&HkJfC FE}5<1=L6'-v0h[hONצ3"AKE}QG'lyRy7nE)^ .3 {eO~%Zxq|c 96oy0LUW׶. a"Ib5eKiBs^&d]ÀhB+.lňt3X,cbY ϷnCh2 if#5D$B`<̛F aNEQf= /AY v%V+Se7H vƒP 4K^vU59w 37eB!J?ດD M8pȌ9 ټeBzRR4ʅ2:b[̷$|L>rtV^ :Yvf`wS:X; 9S-H>N! `|q"!{@]ˎlYf \gUJ@=qh/-^->Q@s,Q#Nvy(V6D\oX1CnETFKLMt;ǗAFgGTʖ4jb0_#Oʻޑ XZԪȉq^'kp/ m'vm/\]8IDm?ȟMr-u ;äWx_K!Ne ,b0V'Aa?jd .m_0oUˎg;7-fNij8s>>uaCBstwcu6wb20 ֍zS1<o KT-S "~!_ Ȣm*9Y2>OF+ҢpV`}.#͖`SnE7$AU_{WGnPZr~^ !;&&/Z~c8K.4*rUjo=Xs1 :LtPl`6%[G}gl`ka1Ζ`8T_g]J:I85a&tS3^ʠ_efU?X^YWgQ4MTԄpH13+ CuM[UဓWa,źJ |- m1[S|rau$nB{I0SNX=j=Wz#l-0BkV 7pdۑl/̫!1sZ^n>Šu5thLp!}4Fс&qmqJ {*uzc+ eo,7pZ|ylƥeyS}s|-$)<d1=>k`,/-O]f{NIFfsy]u+lSjy`aPau|[ZJqE1W f›?Og{Fc%,@]Z7-(7MOte16n[F Vȹ p- mfd &0SjҞ;Z8Aa $nǑ?pc2[K?[OfcVIDY{R+i^&0fZs"jAb+E&UztK^y|ՙ|G ?1?1W-Iʽ($#٠iK^;5_gʍ+2EO]Pɽ*[xo &>(~*zU˭fGǙ0R)vcj /aϽU\ {Oean bqNtQ'D]fgsbsħ}̓^} nU%[shGMaeᆽ/Z=8P đ߆@ "41$}ia9Rs`"ԓc@:@-xgbG_8g+K՛xx endstream endobj 258 0 obj << /Type /FontDescriptor /FontName /QFGACL+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/E/F/P/a/b/d/e/eight/m/r/s/two/z/zero) /FontFile 257 0 R >> endobj 259 0 obj << /Length1 1379 /Length2 5945 /Length3 0 /Length 6881 /Filter /FlateDecode >> stream xڍWT컧S@QaF0 ƀnAB@B 4P@Ns=;g{ߧ{s06VqB:40X$P30@" hGR-a(o8!j(C83$Rr`i9 eD!p'@ySՐXee~T<`(8@Ю0\F(`ahB)ўr~~~"o$E_GLa0/ . L0w{!6C: ('pCao rtF0l ,;ܟ޿!P(.g; `/Ơ/C7!8߅C*&ߟ輡('[ 0&k Ԑ0ڛW}p :VXH?Dgg8'OQ NDH@ iY @]E7z~+ĸ<gXh,(+}Np(s#(Ü&c6 Я';w?濇+jc/*UU$ ,I`8@ww6?uHp s]` I_Qg=>|C cXm40'juf \n"[9P? p1Av {JqV)5Pӯ@P(7xM- Qs(__BPe=x\ֿ73H|ȶZ~˃ce3W>Ԥi5የ*i}};<`~#?MG_RL3vm<ws@07]` q!ݱ[-w'MVj(G,mJǁ9̜$hd04GǮ ]& Rm%X/%LWywpX3$eCcfQBzVR9E7Go!t=QX NJ#ƻ+# Jhy-xey}7FfiW ? )mZqX{-8}}e$~ dF*v'H>u2Ś샖ThzJZku;-FnZjZGYI2.OLH]] 4K/h&z$^d.{GX1{hW\5w~oͽvW59,=EkM4Dnǭۧa=[]<W*~eqy>/2{6Sr_6GJf )zu3` V"af~qnmYLgIBѫi{k}:}́k a$yy!!y^i1$xm4\zBSJ2 27ْ[Һ1лL FVne twS m+`'*& NL3>oh9+ )Min kfKD]ͧUczOG 0 ~eÇ(Њ/+Cr`) Ɏan]d|k ֙ΛGZN(V[g~Ay6ukFɎ j䬴C-ԥJD8yo0ί*Sbb"cQק~r{+MUYُ\k7.Α~L,d{!>܅*ak#e_΅ęk<2,#S; i1x}#&$by6W?>q ؠ#mVCڜ?VWl[D*#iXy;o Uzo#F}v{!IrFB -e: 6y$J!IxQaQAZީ0ѽ9AҗM#lsͭ3/ނKX,kilߞRTqu$Bs=I5PQ<4~ 6pqXy{-FM+~^T[bPRڐT]~E0qgb*Oa')7ɤ3z_C< LZw`VaFzmquzms8?+/RmS)-{nܩhSQT gSܙ .',uķlEOl}%ì(_x`sJPvKt>QI/OIq$$> ۾W5-*2m^Xo粎ꁪH,.]K2vS~7}jS >ן⥨ cJo4UG|Ч6 W\u;W4$ϖY^-A]ݑqɃU]u2ߨ2XQAwbd~э?y`ձàZ)[9|?CWKw-{-­̦Fv䩦݃8l:5'2&RaQ`NbUjxY @O?dHiƶޠWM:!$ՐJ)|rW#UZ}Bvuy#i!D=QwntHvu\Z3- /d AmrJǒ7~0͹>ʷ%-x b6/#=Q?XLNiavD^ V-4,2f?Ӿ;@ʥ8,s]ڒuxRoOm®-]R 0@XԡBf-7N!lcx\T𓗸 };toUP~*[<G. = )L)< ihˮߪ ݍ>$X"ՒȾP!NF[g7될[fbk׊_ċ#tJ]nXJEBzT^&tVQB ssX %=N$*(sPa[e)}lIAt/>%i,| /1ӱ)61фpL%g{3c^شbxOTҍ\weϙu*73|2h/4(FWnw8f|82;xckd|5}Y< ws K,fsTzUy^y:"5^4}ysvȌN8#92^ I`GwN%.iN7S֘Mm*2)6{;om?DwUEڡM fE6ff~B2#m }nb:m޳wuj$.㒉ğvM *GgŔggcP 4>$|Z! %V#}F'R2*;+K't<[B^cѥAXW]{!;]6_|":'%&_6XNOÚd1nzn׀cXKivWܸTloh'97G g'/dڏ)|ƅXӍ 4 ',rJ`m+|j}Tj_{ C}l)M*>"ٟc;V4T2 :LvZG E廒>&z+$c7SQP+p}w'4} S4\%=I%S| _j@{pЋI.rQ+p_ݼ!5{"` r v{BRL>J$b.G١>5^}l gc.}Cj69=Ssi* KT_@OJ1TlT!BkG(qcgws6#ԷK/\Xcއ)|ZliՎ r5(VTT!+sܸszv<pYiRг|P":eu?ʿ?L Y^IubKYvv1[s: m R:tLdNqMsr5zSM!Zw_!^ø\}jgu)MSzn[sMD<%ף.9WCԜ9HD*a{VTMQ#C韃* FYJM m^*Pj}}y;WۻU֞&Мj rt;_U,'J4$U>|:LjxZT C X-?zc@h^M;"p7N*)!A7`[ѢT*v>9}]aE^l$ T͋))) qYg3 #M9 0杦@[33s!V #P[/-LҞuU\Ajiq_!`zTbjpB\/at80n>BAyID A˗|1&&h.II]HB^BKrXșMLhg0/L|X1nam0.XSVz5* uG+[w{fo? endstream endobj 260 0 obj << /Type /FontDescriptor /FontName /WIRDCL+CMR6 /Flags 4 /FontBBox [-20 -250 1193 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 83 /XHeight 431 /CharSet (/one) /FontFile 259 0 R >> endobj 261 0 obj << /Length1 1379 /Length2 5946 /Length3 0 /Length 6883 /Filter /FlateDecode >> stream xڍVPݳI HG~R*(WMZ$j&*HSAtE҉H"ERyѯ{=gﹻ{'M-$0 ' ( "#H-8V5ĠEpD Gt3Ơ*@啠 J (*Z@`,`&7DTQQAw8B`p0<(bF8\ȿ(DxpJ`pPP /zJAH'`G`n/ -L $ Xz"0[`qA0, |pڟvC`bnB@lP)tF"Bp A=wc$ I0/G? !}`D:fOup,/xh7M @AΧ"[.7vGIp [~}?=&?6@  _! xp/p'J@#pD8ށP $;ьpcO< \ @~}^9{ wqF ih` )-Pii@7j Cy6?hw %#Ϟs\Dg097m  C!}Bĉ]#N18tA17d?Q}8h/鯃 F"qp?}h)$`Y{b~C(;6q5sr '<8n} 1 1XЯz*`c1<%=D0/zy^:ObQI)*MyV vW=ザȎ$1~UlCYaؑsb#h|U* Rر_ oz\K {AUw1cfK iKޱJtQ<"xS'G-Ʋ8;̒3po, _#S?驥+='˻ xtx$c4 WBɗ^v_B[׋ЍLt,Q~—Lni}i?WRR艂ޫg# s++\Lޞ WJ87a0~Ap!od G #XUG4n)Nշx($AxhWy{y] ZiFF}A"eY5ồ89nQM\hvJm~V~>";K i.wզvYӦUS^Q}N]!x`7GVtmC^D5W1"n4Ȋ%ֽ}iJgX>NsҚYݦ]n%ZmEa~m.ڴ2q=Yh 3-7qfԻ\!t+%E s3C&WNr<-8+/7{T_JҘ%e`:ػ=6zd*~@3rdL;J%$X`4p̿͘NڞGف>Igjܠ _?>~hUs׊6iU\O*H""Tnk~=:j˽ ]it|jLٌQ|}/ iĝԍWa{Otymkz~ؼyB}0<^ֲ*7Dy>(oK >xgx`dAjUyZ]*?_[z;;Uy%wؓd0*DٍC&RՑʹ7j y;@b5}QQṔѤW*Έ[i 'OV6_P(q_P?#4V!.S5*Gg#kK !/iepJ򊵓9O /12->wv6ky51,Nx}P1[Fh:K) q|L{aWocrs b,/'1yj4?1~r .S|&[ ۦ:݋xLhi|4)~^n" ܛ؅i{*e/PTa% DAE;hcG4Sٹ2A_=U@:QMydl4HJ/>$riWH퉆tܳS% `';&[˰'W֤C&_-Uhz ri?Nv:+›OLx 6eq썋,b_k.U?/[sYٕ%BڻqkRc(Y%6 z>SyKҜ6IWtBjzn= fQeD/>9gαT#y,hWijԵoz^SےMj6vȹ]WLbQQ4Vp'Ø~E:3jJ()_p wp`?`3N`#,Un}YL^ےxҦ\@5%~q]H:&La뫱P\85݁Ԕreu'MC\_C@car͇fkֶٛiRE:oñ5!v8'GvG55Qkڻ5Cyۈҷ.W3| Wʗ<;7iANIjJ 3Ϝt$ڴ+I^h|֋$"OKPk>/zHrY`ս" m}_ja#}G{YjL󒛵ZEsM1b_K3C؏ seTRdHT8٪ޖq"c OQDQ\|ݯ2 G u/TD5S@yRiV]"wPTo;N.rK̠Okʭ+Am=5?4@em;OḟrNZh#7mRw6 {&6Uo*ܼk"}F'Fut?Kj̺}olZ9ΧAL^Ä$𲄝Z>i3Ql*lmÒ]?J8;eTGyn!X} aYܖQh?_?TmKAy r#|6$F' ɜ7f #ɸ]}i hfK/OZX3LR݉3SpI,׎Df_@ʃ$⋌}/_C|P7EK]qV)d[.{w[FDš8B[gFԡH-,\Yfj6󭀭GNkcn=+-Zh7U]ܴzyGWdxE"+;g=Iۻ%+fv%",5˱)stdgP="em`1WZS:(7-8jLNs8TW`)IIKĤ*YsƕyrUë Pؑgb zKBT^TE|FU?]#ˢ8E4& *nu:(To[%\X'wQ:S*2pf ԣ}LM@:MἵƲ޹\[(8b1\a^h` `,Պؕ|&%!\x+_Bn9*d,Wn-0(3# <~'1oqg&}EeTO"NegHţivK,՟MSZvw92Vl3yTL铋p$F]RdTZq|{pFG¨$뛱KD., ݔcLCJM|_ױS|>SZ:S`y|S31X`%?%0/ÒǜW,5#]7_C.X3JX9d>2ܓR.űAjU6zzK2& Ltd\V1A+3CVzIF/6gfLwي-@T6+ѻ ux̧PZvv6vzDZ  =jGGbI.YگԎA޼NQE/5= ӊ$7;)Տ)G.iڃN Pi;)1s}j`[=I2,lbih짌)5_:矀-c062s5ʄ]DBd:_\ur^Qb6ĉk[.Yֽ5ȑ>N=oߦsZW<'1+U۞S78P=MnP]|+ZO"γ]("?w.]`Po"m+j۰`ԩrՐV L2X§C紐>͟ Zb>[}GM.Xql `B?-Dz ]u+XN}^(xL,]w |vwSUS}˵,ME(|a䰢r]8?_>w7Z,CЗ>1rkzclH$(?(jj=Fyvoney _iN^q}_:;#4tXG6%ie#F^)ESOF*GSV z²Sz丠uN`0(HOװc`x /^:# QsO٫hܳjȋP^Qѝ$0ʒgu&ۤk`%L͡I U ByMUv\{Ew<]a:K{7X{蜢p$4F(җ΃Y-/K2Skx{- ~D|+K'F<]p}oG86tTrD K^Ky{oz4p#Ϋ{LN֤Y@, i-T4绖&_c< ";1VLb8}ܩ:휌린P[͚%UۦomEv[JiC&1S}}$* jWCYaDqbiU|Vo](U e|Rs0pb};2rZ[7IrA#~n{Y2^S^zﰷ1}D^8Ėw>$z H1VLӳ.4M[B$L:?|HCH7mO='THW.9?K&<]xư} );V_p LKoLLIݭcX?ݧvj1 3; SkQz6,fKV3osݵk)B|@ɁH:P,]Nj.2IA>keotՎSs7ɝ`ȓsq TGp}) W/69P*+O^?(yꅠW *NDqltFNc`FLH~Z/`h~}^#_yxi¿xQArb/`ɧt_l*άknj¢褹"W5bL '1&a:4Еۮ) F.Dƚ1.~$9Z`ݶwL &8A\3Y>eaޖ'UWLqsA]XHo yniV3`W?&J _Tf +  c/#=PTc* {ˀlFh7 endstream endobj 262 0 obj << /Type /FontDescriptor /FontName /EJASTL+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/one) /FontFile 261 0 R >> endobj 263 0 obj << /Length1 2285 /Length2 16515 /Length3 0 /Length 17870 /Filter /FlateDecode >> stream xڌP\  =6;=KpwwH. Ϲsz{cι֮(l 2JYX*<v&6DJJ5Kg࿤@G'K?@#gLl&ȸX\||,,6bFy& H) p4pg#Ƅ;@hibd7rڂ3TA&@g A͍ٞ։ hflP:]lcBYX:K 2sv3rKJv2߭27ܿ di `fi(J19;3L24q\,mnV_ n(hW}b@p=_fvfQ0ugVtpJ,B#3:8YXXyY@Ăjxكf` @K3 pvtxS`ji 0[!wt谀Oz2x1{rJDbd0qXYY_Tߵ(mgwqox?kbbGo-_ǿ-vqy\_SM?A뿈3/bLWg&E ?c6M-@'ܷ?#cBqONV,` #_z?&Dw|,eZYd ?"CfП`[jp`_{hE:O8Eڃ?f f>i_Oެ"*fg G?Z . p+\ps<\=v:+qG0Y翯`f݁&K  ZaB7ƽ)y=4ZFeNGdښM[>qFжD'gxٽv38C_OՄ_5Z!e(\xP 0$W'BkdգtK(`0.Qnn1rHe}Nً<,zW9SkC`LRy~*-tH]ܲMb9SPwbSߣ_SkC~<k T"o'跶 , i ]?qOZhʪ:u@bh6QFK#TC HjDխ㰯k}`;EH^F"b*@ }&!$9Qx&Y)&V eYzYOmTιsVof>`[DK/pr?3wm17VE&֍.|-*XmhShO;VC@N"?wŷ!XuyKϯR+b2xu̠_y/Kf%.e`]_ ĺz230jsCd?^x.nNΗ{?8j eQz`5TzvA1@>a=bA#EgR.긽MX^W{S3^6*"9 ܃1: H(`5t.`_rdkun;|]( 3$ڠ wb%/duQ2~_mnPԱ 9,t=><5TԱgnlp -Ч^|_p׍9{ޕCb[Z5E=9X].D,Jع`Pi\[WdQvٕd,rf af=P4NTHFQנ''ymeոE_<#ݣ}mq>JhD$݊+˄<"ZIY'Z i &\9JqG 6)/ mѨ|B:0ˈ^@du"lK:Riմ ÑFG[.1BuAQ<-Ȃ ~9(mզrX\ڥ^yYo-€ AJ9*I#$#,$`[wGΊoN-?Ds90ɣRcƮl1\9~V-LȺx#?csՀMO.P?e,5z1oEe/b OQy뢎DW_qhX)#b(Iz{*[t][Eֺ"5{h`88ҨUkwogf6׻ ܽ5\/ C=?7YސS '?ob" 8qU?R l"XpzoJ`v`w>'.+QؒC@ ;:h9@MUH/jϝXPW,m qBٚ{Wyd(QaJĚ؂SY0*v?"ٜJ&✴ oa𪕪6멄1 Xrߪf I^D5PB?Ml[^dĮ 38WմbQqy3>pXp %ku1 `+ Wj%x;漩푫]Ʉԕ!DSEG(5,a㯨w﷌!/k;N;=:h7/MC. Lq J[x8>C?%^ڏw4Fb:Ґ2m_TO6Wqۋ82p29I.#"eRrF'cr1_7{CHƤz߭b-t֢ny^dPt4ڼډy{o e6rfYYRfo`$ N3$ca8wHHI" 6LxwՕ|R'@9d!^!/`SÕnUqd`ns]72RiH|s 5|DzL^{)+=:#SzY2M#ѭ$#7K,U(;w{ 춺:aJZ%RđjQAo{~|4;j_H>v7LWh(; v̠1C VT~&` _EXa/zY%`Pksg}Lmʮpa'Zr+4Cm=xq RnENuLu^B!ҭZT.ykfo`YҼL{SO &KG>(a(0{XMƲlO{w_2f̜*l%27Q %P2Mے~hB)M*`&cAȕ~mJYff vC_`01:fĪhdq'<<^N솮[o0ҍ;v1xgR|aKyi--#q0m_bů DdֿHB+KNSB%_tuzcwp5cwc+l߭Sl.gUW,`{d2nűP_G)`Q~T81L eK{3}Fzxfd@#dlQPp`RvK6Qyi?:\U mBD=[ )X1F3X`G[~TĢN?Ґ^ZE!`?(Ll'@%Q;(hh~!J0۝:[:MyqZ~{a-~)\X>m%Kf;BwŚC&k &LY|9Ms01Jie)YTSls*SwMGFTv%}4//ɇXACNr(~*oy6UUxB9Х!KBa4!ڜjF p1Wmt$NjSIVegҰ.s2bR(O,rt t9OtqXOV&]w~:ҖL o2װYw }ZNe3g蟝ڜi īGXCϾRQ*b'T(Ūԏw1zC `$&t/ 5ǟ!rQMG9I(\xc%Cy~QZ As3EY+!-I(lSOaaK^BIjjBN_N$j_~=2-2ǿڴFR6q|EwNQksha@z<>*ݖq] r~u,iN]G8BQqJ}o{fh}Ŋܨ˨s+$oP9>˭ktۼes5U=@Z*u i(qy4IZFnv~evS'YZV#4.nᲽ4< }ԍ%]{z݁hS7`UZqsf5ʚEۋy)i(9.kMRMAu$>[[ƒ0ܲ@SP?$P*Bќ\4`|8{ݗ,&ت@7vE;Z=, *COcEu!#"oDld_7dDlˈܐ MFk-r?Sғlqr%{<u&IRuj *Zz~谗+SWP뿋2vw'uZo|Cm[vIʏIU7d xm{.;UT* LNGVχR5JtLzN1 )]4Yq1J\d pWgbWeᕑ1m!sgYpJ Hix׶M>$Ʀ0@ D^}"wme+~dxh2%/6״[G#+.5ņ e.(au^zx\Zˮ9OV~"]6˅\s~G8E㖕l_DY*DcJGMZPkd? ŚtyiQR(ځ@ͫ n#+ɷ27ㅋ/3 6ći:Թ!]}.)8(GDYcp7ٗZI8]K@ 5Qim02$ k*o[ܯoأ 0=5.)T7/:T䬕L# <_"_2zu)xL)!0h^ (p23-l PmBN{n] eIq|HuH6o#~s]*^ /ոoK-O+(<\s țw+Tbc-fEv7,Ίd"N $z|0)h دni+ }K̍Q7^BնqDŽbҧqMkwnYVI>MTn#VH #ÅӬ? cv]0aCgiGց:uQe-}<+=TwVCB Ot 01hW+L#=tw]ee[ްp[$S"4,iHǷ `XDUu#)Tb(b0(Ԉ :RoaKbXT.F.O@utCNkhhHbLl /݀ʘkyS;C!bOhBcٯҐE 7dֱ_+p{8PEzΥ/żDyvTYcCA% +n P\CAEFeq<.T9¡Q$)*{?rQs̀g=rK#;!|qr>RiUQ.¾$,.y|?"3-0}1K2z!Kvs0  i)>%6>%x}jr꽤Vdy[:^!/%p^OiaBʁMV;<51. "TaAmm7|34''Dj@״`&YIXx9Od_<.O<$gTmUN=[O/7_W]9j$NyTӲ;ui߁w^ P!qN]u XDH>=%(5~z˘{V,Y/.QH`Ǩu_BERR*Uq1yxRq;HƏkp-f1Z_k:+BAWQ#AkĐe5+%?3K?ȾrX Š_uj}czEC*r'59eMZn2Rg;~  ?Aw =OĔ`J}I^* 5R UVt^,n}-D"f~XgrƦ!òXyMJWPqAI1:(o*~#=qNQZZeo91#FJh;S]x2y /˞[Rn2zYԬLaA7ꙵ#J)4Nhm:dЅib+;i'SH מ̞Mb6^8BlǼ;r,=iTcHd[Vw!ͣPz$$AZfDC[g.TZ׮@ݗ5A~U~RZ\T袹VNJJ(`>F8ſ#V*EHcxJzqˌ废ٰr٧JKB!Gxwv;6j5-JwZo^= u/:GL;V8 7BA_zbQQn!HE,ta:Kn.Q5:fZC;tBIL9CTP&>E05gAtgڢ>[DBH~Q'-V"]╟s>.e" 1>eZF6z MaͅE׵ֺO|3ʵ&v<eAm'~zy93N8>E w 'aLWnoa>3qS}#vKNfY PhJ4:uZ֚,kϞ d0P1-l_:RS~BIm1ՀXB +gf~\ɻbuD(0 /7d}$ xw=zlCa{2GFn?13S!DRm țJ-!<2*}^KJEkC>u^ZTҖK$zHk%_M}'#,PSU4j$*of"~[`Kp=&qcM~ MOIn-ޭ]LO%7&$TRz;ұPd"Y5D^|Pg-ݯ1~7,M!v({SxAUZ22=\fyo&Yde͜K#wߨ\GxG\)<ʷ 5k?+x kkbiђɭ r$R+APvh./sQ5_ 08|$@a|3л`` V6͉JG׃KK-Hk mxnibl/_*VҨQ3rL?pzG7ƊKk?Qsz(r es~\b#ޡ~wʏryJ2?hri(?7tN8ʯ6 HP}(䙸PXj9WgDҍx8h *-H2 ePQdGz Ⱥ] ɶL3*^@s(W*%1h.5XLѩn쥑RC}fL2 JDz5@-h?@mK>E~k֛=ȜT |ԑ?^|\>Cx'nA;/k!˃B.wd 9)7J@rG-Z0Qi?^ .վ*MTk<"vՔ<о^Fs1x~nrA^KPze:=*$J;/dVRN+Ó8;Q|Pb7Fp0X‣۠8¹i qď:mTdQb.&#B|~P[הǷ޻=JM@)y8Q|ܥN,tSy0I,/V2HYGL1W/maQgٸ R^.p*K7;"=I&O˚ǿ [D2 ޼QR ͸h_EǖrǸ(B8wyQG Fh\DC% Ŷ^KK5gɥ:*.lq`]MgI6;eJ`sOY{ɝ'lfyC6:YMEtwVJ#{|ghsEG%ic'yYǞϒHq-ê픇@ppFf^52FujNkh! _9=l]~ac[IwR&BJnoc)eQ*<(Ut &gJ9\~='?lЦ0EKڴ8PY;Bx1U0j|>&I2߁k=n39O(}x<Ü 6D,M#az-3bLOrmHf(` x!;I`TK8$bW&)WTߏhB_ÃHOb_qODNHWD?yqd[) %ĉNSP>=֡MhtlC7Xk#U,~OOCf<::vb3骂b/043k[ iQM~VUsX*A{ Z|SG"0d(Oh)tڜX^QR#+A f51_wL"e9/ ȝuǸN!~:31n[Pk.7ni 1c!8f2BedejL_k3} <}MPfg3QHs{fa^i(r"eM434SC2R҅2\dVV2wmO>YaPk3Ұ$L Хͣub@5"̓)º) _ Epc+#lw1X%ԦUfdHƁA}gw'.Y\)vv礙aamFw6\sJ{džOjgJ>0. =aա&&c'){ˍe8AgK? a*t7>Klb0ïF,c-Pªy>:DC2w[‘d򇫂E&{O#4zo[纾di4:BKR(DXu|8=#܄F u )fV)ӗ°B !:- e#KRIˮB! s% A/&0C=]Pp>ˁqQMڰ?\8Xt#8kÖi!q]S?SHwBUƊl8(a9. ?a6#;q"4b2Bah_reP8bJH_lV\ZZ[!W$T{[F^VLR8́"~dR/6 ک?&*ۋ^zgV2#l NgQNewFkOHf$aaYx.b"y`'_DşwܣnûB]D:0a[\Y7x :$ -. \l&PUHcaF Г +g5^wwbkڬt :W~Ĺ t>:b[n>Wi.SG4H͞Kf=Ƶz }gt7̍5D B@Ao^=\pD{?_W YL6|槙Ug;L)Gڢt-ǴX$|Aʫ~᳴QJ#E Z췅ԕP\[* FXi +*w2$m͓*R~C|ɁjqZ5K5$QSqRv>hC+p)snX%]# `O:-w"ڳ+x#I"w}ku|`5TCf{P“壒KYJXH7!pר3B !ru%UN,5=r͏ cu!m[szeZ_Ң*&FsS^6_>10Co9U }.D%Ŋ]kCyEkn\$&Vhl.GX"}ojVCeACeŋɑ"h{ ]$ýydKD균lSUMyiw9B\%WOLPT;$t&P,%o{;i#- ˼#t*mMC(3s<+7|Z0/QhfaMkJ#lmZ} ׽Fu \l"/[.<Ow'BSng5 u8Bgt{)41CcfXwAƢ@u)7xBеYL<.1f8uw =}۩s)st!k|=x]H _v;9<0OUB@4;A҅{-H3@5U ( R!D m1n|(~O wORXm :\JGC/c~^)5u& 6!5A@RqmMHLLFX m_@g/EKonS]bÈZ|GX&v];d#196ᾧN8x5rzà{J;njhJzywUٔG &I,si,:Qr!}hCD Sˇ=On5&X3Lvze(LHM@0XL` M]1Yex`2|_3%\e> `}~N!KS.^h3p>DԳ"rhŰ˃<VEX5Gb'i#pS#5s엱d.Mm34wP~\<%& h]/^8&x !PucC:Rx;0XL6 Fd@W8xIiuA,vW Fa!Ẅ!OZlu{fSО;+7B=^]3k{O4:Sh)=/x'i]X]zQ!fIDAgzEqkA@kDmDKZ&^M311=iQ$/5HSic)1/oQ#w+8rv+ܚa`ik `[Nvzœ6WPpYgk"9Y$ijN'pQ֥J1:q;#^ |w/ :"z|VI)[-N9iJ{y2-n$(@f+GRQ'n>.{8, -GM7&:CH$ *[Ƨ!ߣf>xvzS>ZnC 硡-&T^(4qh4?"k'C,0͘aF[`OV㌜(J/ ϳXG Qϝ=+!ٽ'rņ#E_VN[b׺0vfq2#+ލ.La{ k|'[K'ftާǵ ʒ7[*b0'yB׷ q" t Xcqv2wmI)jZ jj-U? l! sX-kOX: ύ[6D?vnm}(U9A2ǁr#b|y8Rbҳݦq6VZԖ j DDO4 4oFM9YMrH8-2KO^VٸBuYܮ4 \ xbvc[#'^k6$))KF%R/DOc1kywFji>&%>cG%/I V4Y~Y~aMΧ"j6ZtOdAo+䳎D}Bw_L$:2"=VG ^U.FASKAhѡ F ~H(Mė:\ F(^Ej'o;-N !S$˨0عrRoqHmr;^& brUM`GWP 'W>Q=xz07Q' oseή<Ϧ(vͭgL06j1O˺"/J\nhb/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> endobj 265 0 obj << /Length1 2799 /Length2 18404 /Length3 0 /Length 19986 /Filter /FlateDecode >> stream xڌeTYӸKpwָ[p%%wr;3N2߽?bwUڥyL-)P VA]ʎ@EnfAZ;:a#4q$L@9w;?CG~9@ tEwtvr1+֌q=hf1:YݼV͉ӓޕRifP]<_iL&nj@Pv[ ̀C@VVtXoF?1ӿY;u`am(K)0y1Lع:ΛxXۙ  % 0Of.Nn̮vdThIsqG{{+¯$]f{b[GOW*N,@Y@"2KX3efD  j}T!̭@KkAb4.^=VX4gv޿j4ÿIs298l<n>n[Tp(`; P?Aˠk r>_GV[cr˂&/ {k;l@ZEGЪ8_S-߻4vZY7в:Xo\_;@ v@GW_MW@3[% j_* h*`hkٹ&..&QcVהX@G .Z`%qX~#o `,"Vo`,2h#oS@|JO_ S@ jo `Q@jF >ħtE| K_9;? 7k;srN_bXY./'n}M# S3[W;W?s!jbbZ!Go-?|PE\@ob$KkY;3c]вCK4v&T!^@vtdb@iJw9AEv:aYAASbwܠzPutrAuqԠ~AΜ@4rr%vLNP;_eo_BG7A? *o\㏺s]A#V A7+*@>O:#W3G? Tu? b:;f' 7sw-~ !,; ԇՊz2Lpqkܼr"ہo1C*~",ɛ'2j%T H(i' !Mp ďtG;uGQp U挬FJH|m#v ޾2 !IEq<Cȩ]*?̷N V D{9][̪ ~1don禄:x;ǻ:E:Kb]1 .*@&PPqQpM-?gS6^Sh}ϧ Yڳ.1cXABYHIpѶcW)$CF|xAu u9͊= #" DϬ^1щm\g䖜NɄ.}Af7W;0e\x-O`,i4(}ar3Jsry ]Gh?ض)24R۬yUc?~Sjs-@2tO*Z}e@pT? J xMs0%|4'Ə)5+n Kr"+_O0I`|jl˥baQ3q 6ۜ}zRhk'n~)+styRoa?f7>k u, 󪾡Q5>$PN,MR+6#AJэj x)cKHŞA>ϻCqF%UT2ʧ}sY6Ԅ8KO]HEQ6D,!M;)5YJa q7=P(|f lZEe07lhq@NǗK|/kw_72WdygR2/qN1aAB&~}X0w0L⡮׽{V.RtF[bI*qsJNQ(C'zX G/iǦN[>E"gC !aQ Ni(/f6R,+YpROzz!4Ά͉lTFu"?JoV2iFdXwa/`U+ev):7 C7]*c7ڎSPҎb5-H<`O5ul;V$D]ka+%M׳=r #4Z˶Hk`ܓ$YeӺW,9SwϛN+ K>ʦ(Qu+ ,n&mo0RXEfW3A:$Mܮ:rfcl0I{R۟LS]4'_ϯ}cQ,~~ i^q%Z ڏ!>Xjt*A'_pe4뇹~ U]&iB)Lܼ+!57]| d0jD|+ɘ-stCd鱮=1D^`8AXl:(҈4|opy4]^WwY!։8VI`Dvpf3# wcuoVj2 J|!L9"Jb 6Ȳ~*ATHjk~׼b Vڋ-NᵇU5bnhU2v/?"<}Rڵn3Aw *i dl'L:"bUSIFY$(?\F-aʇaΣWHU .!´3=ЩjY9STx!! iv*{/Ŀt1^&,zɄ 0*f+J&d@̘佦{Ԃ|u:K4xHMe;x0WvLyRem@A5 ի+wK5-X<9ks1:;@"du+ql>v :fqLet0IKLOzjF/<^W{z70ls+x^LkJ ZGFA/Q̐P|`5/m,nɝ@]a›97KC1r% v\ cJTMh9݅ǬLSAm >.ʠ֜+_ ss- /;$MEK _^VDaW[WhE(TpVԯOm\'JmrP3 dG)k3;wGR@w)?V\VjdL:.tf6a(RO8Wu?'^ 9* *+{}[`nSy jZFcy H3ə$SldoDL|6n22 zټQkj'';$͜fWl-i [zTdLJ;KMO&3#r."i؍FհSO'O~o>[zt:DIBK>;w7n Ӯ2'2X9'wǁ LhIP,'W5,UVwۧzوj sk+KL~[Y;XPܮ+YM"- ŸîWN9jey"@8ܖ 0*v|] ՆM|m @nL$@'bEB v~6KpgOtRU$/{wzI)@2ް3Udʏg+!Unt|*E؜a3c3cAd}/thh|_G8n"2[N,G_r pYA-6w˷̠])$!y<< pI7*mh3dq|K:_wo/E\N=h#=~\T_2Z!RZ~r:Nx838jiI\ ፫%Z>Ŷ6 j^#VCp񍬄w[a0{P_mZbJ]%J_]g8؆roKb]| 1h;N P I`5fuSxeN8ʣ'x>`rw7(]BAW2^kݝk3j*Lz;^"F&~MA.QSF.k=Xxc3DL|['p^(v3O_)%Y>Zg>t୙#O|u3%mdjuSҚV Tqz4[,BMb{TFSғuBC@:[\Xti3zӒ.wKTD'bgح-.7/8'fF:4jGq>8!$5s+_LEj_O WEM%QEWYZRZ&9'ros[D7\DJo0.LjꙪBY#-]ґG95 W r4^\p}Qifxϑ,HF- zLٔbr0t܌H{ Eht/ʹZHݫUw?,5>8/0o'd D[xT:!9lZ}*o>E*-(ꨫ6%;|-B`<C@_? Et:MjPu`'uUS6,"h;00 Xo6bm&A"DXi+D ֏{Y[;l= jG&*>OlWy`[}[/=~VD`z1ױ/1(-͞F&|F4R̾]lPKkc8ުҋ%6b[ ̻oyd^΂D0oSjŭ1/(*>JSw]kDeӈyC?`.L1DÄ1xTD7 3xݵ%١4JGh_] ܒߍ=bPo8iW6wS>v 0hJH~k6m'sK ]|RL!f1"RgFчvd"ڲ' &fV*8J.y9.ͭ@$ xtѯ+Ɇʗ4\iPŚ:LK쵝uh,haN#UKso0kBP@#eUAir+h3 ^ OzM0+mV~bm9MxpH`AXLxxf$k˦ZK6֍NnڶHO=(m7Hn4Y"R{Z`hD*0'-tO=rC:46{I F槲|sWZ؄ƪC H X[ v[#cL#&> E()zz:Uܻ*;ͽ8j0Fcח{)FhqonUr"Mu\ E!tl ֔>)酊[=.2i}gȂ0 F}@K;q05HI)52?)ay,Kkmʮ_xKo6I>]|guV>Z6$s>!ZoM돟J?1AyXvU;r=L&%u٥g"E?q QĶ6j3"),+tHM_$*ǽ琢է7TUg?B_o_K|vD?XrZ(U$fd`HHj;$_&Y) W\ndES^",g2q"E{zJY SOGU`BZ*˹Z8$WA'ū$f6uhsJaƏCcpB@&%C+}"Ecmif# P,]Rtz \T|ԏPý3~-Ho)DxJ0q˥b2{Qs 40v.p/,ڱ}ă5m-od?N |޲ݘU?Qm+F2&Rlc]⡑V1(]5Y⽒>LmWyKG; : LfÐ+-rl{@%$7rT0 #{Zى=^7fnL "ҍ]jTK@k6Y!RArͨ~bjc (>EۄK UCi²k3ΨuTҊ4q;#Qf&2ua |OeDh~ ]XX60mZ&s dll$u~ԟ%% `7{i!8v°,l`|2MyD )}!t쳤SKڽ}= nZ6~2CfX^yA+ٻy{Π*;晳qڌwBɌ9M|0cbvS6M|@Gt٦n./4ūc2o|t._7{UuY$Z])"褘ћ` h f+-+{JW:.+ędJ/eW~"-vWip9slح;|Y#g3u}ℯB6ڪG4(|9rb|͵yL_Td^eBM9TS~ueh?lY[%P'LnF-=@D<4*0b;fCbnsh_L&!As 0.1^W۸:6;,A^;;x\E|E?ZP8C>[CʑlDo p"[9Wx1ƷcDbIw `cXW |!hOxxdf~&M.xd6 K2fuyZLRx.ٞI'  L +y#qw:2{zg"]HE;cKؚ,OsaYta㥶*"I;@h2,"SۇOYweS>D|9؊$**T.G\\6  ~1g?$GE(+:o*l/{y)+wb3 ׮$>2x}ɕ?M׿=&t϶82X_ BX#cފ+,^В%X ~U{?\DaN:} lGzp7oJ݈e]p)ɓ ?N1ꆺcS)M Lt%2`O?+> gəuc{~X}-~^aU-u 4@ Jd-!䓓v0r7Sj@ɔ[y_*|_z6m58 US$sl%]2['.4:]"|E+j}.*f5i 댖?|W q_'~\7y(V~6Ss,J<`u!]6 X[>5-AC KpJmm5)Mqk[a9&űs-2 б`{'+u*@ؤ߰!\p@nPwlHeA'UʩXc6X,j2ߐc*:> ezc;b6ڛpTDDyoFuꁊ!'9>#&6f ʒԔgw?meܟ}Q y.ݫ]5G%oe]mF0N oGUb5"v+7 $"I)y2'V6ԁ HC*,JdZKcb7ms@=)#x̴URZ#.UV j^;9]h+s&Qʭ>N1gb@5ѽPh,'x8"h6A\̒~kaVFhNH \ l5(GE>V+zˋ@rg~cv[ٻkʎ@@/'lo.1B'|7_uކ UP_$*_? NX̙OYO<7LGum)ubl≃FaetFt]-<`~@xDtA!f:<䘹cȥ$ aZ<])O%.S6P`1gCZR' ]|Xܗ9~2 JB_`Ή,1<;s\;%;bl x/ʑ)0}f^ȜvFGBF5lʪ}4zԑu1dvW!SJS}a,ԔPbUFZv LRnr"3~ɕrA)=#Ix#zdYdiEϣ,P44!cBY]!"~W(yEv=j&+ZQGbIEDIszΈn*Hl஠.U"lwteOXarMޏ_EK.hDx{wJ^lc!|o&QW^.W @ lDkl8Fj60AC34?hbNl|79=<}"Ğ4{*XbGF-h#Wؠ(Z>͆ݨag3R3Py9Z?9^WA?s7nlS[3ťFA2bSq#A,nHMx{T?. }h]GQIsdGkop~כ4 v3;0oSb>&\(`bh#?く`VO؄o߱dFuFj=؍"1\8Ib$A{֊c1͗iVf!Y;x<ŕǕIZ>IF|Dn?zxHH>7_.P=$?4|2P@BF;/]I\&/JKR eR.4T_+']Cvh{Y [!C204Ӆv{GyF\'QY ɯK eg5q? rPanK##\FQCe|77gGUpaSY#c2Z=@Y/'F#Tz%fP `ozd{gT'P|ć/R2jj1XMlb:%mf#!| oE~SO~(xI80ԫVIuP=8r#wG~;BTa+.Pm?Rx@n+\) PYBkFpC>w/R}M<&@:%QO}.S:Ћ+]YdcN!NՋI;ȔٲԺU| {V<;)!KGf\ᓟ$ik?O-a,6J@|gkҳzM@Jo*}s[VEw7GCʚ*#BƷѪw9%R=~ip#s8PZn$^{SDYo`7\ Mq15oZ-Jvn}W&1n3}F:5ܧXV|*U?5of8>5#AǸf-k9VWv5s4ZTnpwi{ݵ͵0zO@B#fq&LEV7<|r0Ls'^5 u9,2QHO im#Kq@#K^̄טj3`) e{~6INrmco§,nalr`|j[~ƈPɆor?r\[[K-[@̻xcqr8N6dvSXpWMj`؁Fh-gԂ\Ô0b8zabX}ihNB!jOXy8#jڥU̙~EJnt+u07& 4L~x-JeZ۸]BSWE*"C=#z8+%7yB8 60e4hpľ$l$4;T %v(8^u&B'Rؘ,,IN}rtMA2a7JOBzdf#|gAR< obK5s4vbٞX?`bux@p}D%hQ]ękt_1`b{ lILs=^ɉL/J̬Kɤ}do$ݖ>c:s_:ךPs%!DcVIm? &4ߒ}LZ=[}Mf^[&ȐRlQ,ձp7;oִvmo^K% J]kXlEՍGHm̝**"^={]ky5M8Y/NA 0>[##iRɫH$H1w& Dx H* 'vS+Dٯ ?CtHiRI{3muO 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—x8cB/ endstream endobj 266 0 obj << /Type /FontDescriptor /FontName /IRXYDU+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/X/Y/a/asciicircum/asciitilde/asterisk/at/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 265 0 R >> endobj 267 0 obj << /Length1 1392 /Length2 5960 /Length3 0 /Length 6901 /Filter /FlateDecode >> stream xڍwT6R HC7 tK 1%  ݒJI H R"ݝ7sk}ߚf{k}_{YkXxdm%8 5A$  ౰Cΐx,w;DHPT=~A_D_T@ pw @ 4xU8 cC:?6(p@ 0₪hv6P)إHW >>///^ n/ xA.q(`jx,CnCj!P!0[;詨Z_`J'W"(w0 @ah)"f vFQ`O0l:P(!lܡH/#߯46+l..~ Pw >|{>Aavhz=A< * 0(޿m$ @ x8* eFqsv({B$?<P$` euF P~}d0[8#S5R5C_N997#qqq@TXg5o`GByT&o٠[_Y)y8;`j=(ihQ75 P (H(B Ն"mڢJ A7%:'[oTmO@X}@ Q*x^nGBkb/?x4{ MOm$kZϫeixV>b/,E'F #Y9x4&ge[A9=U12Où{>m֙˦~M<,P "Ue|,1K*'|*_$7ލ7{tNNNv'F46F[ ɻM8bp%ּ7Ҿ{CBStlmzOc汔L_#09W+ ȯưSX}DI7|XYáƖ/L񒎹8,$2t=뺸{PyQ`!!-~,:p( ݾwQ,(F[} beAH -<ۮ6 OO,. D[{Wl|h0>|>d| }g\nc{viQZ]rFF i}|`*+ZHdU=.͍8э\]V{GʂN! 'QX,V\I~/B#5-w-6s ;Z486;6W}Z3yZ?{8V?:vnuVJZ-MƤ'p4 !)νNwz 6[w??]j6=QKkk8HJNoD+Gk }ZZ6XBHɹ1$[qK 9BaVu`X1K&(`+hI2|Ò!*#k&z*BZkG5#uZY%c7LG22"mPQeܮޠEiN8M:^M<QGi/̴OAsxG#?^adE#Ь>G xޯ19ݧ~5Ժ0G@ofqID@x_~['z|GYKr p3ruTOzKMX]sEkmh#H¥M|lvHa2C1@vY@LL2_A%B눂4 )덆e_ ឯHRԐejaPH@F9q1)nDzpίjzIEwCNĴ^Hsn="H7h %h5';I%?_sQ,%P"=!{;!{МT6m(F^- &U+lYBIB@þh𲍆 \5TQXE*穑l2'WDĒ\<57cqݟ•82=c)!H 7weaR/qͽxU) ls PwIRs#Yh>=lmZzQlv8eZm{(:AU/? MeIa;'3>Ʒ~mJ1V'؎ޭHSբOjT)#7Cy$2]kIڻ}na9׉f ZjO_E|<p.HQPgx冷=mYz\B%)ܛ+eså/QӘ Da1{8TIu/I(0#1p: l>O|TL*dD#l\!FwbZ(Tj ^txOӧáP&HW$mh3ģ3 >BXK =9z8`g(38mv>X.O0BOV_P zhݭo;]2FqX{kqQ Wwd7{k>NLopv/DH\߿樘nG^lV-)@p[3+tvʣܽ0ûK3Ǣ!>hzJ]hEǧ肫\D{HAx'; ۩Ө"M6B׻$gDhnxà/ت×aLznqr'ȌiIg7AX}N=[m(7a-~ΩʞxMFv+UÊ woZ, `Xo3kkX^OA4DhǒӪ`CI,_ ءUU+ ;9CQtZ)R_w( n}^r (ptnd~R(JL]6"xE.xqX"@ϪWN>ONZu„%[ OI"N7m-ʰSd1~w[ ы:/ Tf( sk}}F'm*_?r ]8e˕JtK@@B_jU]t~kwӾ|2p-.Ȯ J8@d(ui<Ůbe9/^9ǨH8<Թjnyqv~]ꡒ k{?OJ\4eBk>Dfz=> M$?=soPgeICk44P)ew+i) oe}mݘrq{̏ڂ꧿)mfƩr.ιqK_*[װ&GXY011c Va^!H}>O5B6;еتXx<Uf,]ږE8k7?x_te}4YzbGA 䩺F,7}ZRWM?7Hʨt͓UG'kX#44qLuܐ1> Vk ^OW\ 4Z|ƂB> N?p DŽQran cC硧BL@FC%XP< ]8׍͔@﹛=e;dk!w 9{ b`)$Pѽ!s^/W,&<ڡTy}u<< +iNxn+'Kol7"IwޙU,wUɟRt|ʚ?OmIzIE'#"DyɸfG-%v`S7ITSAдںlr^W7y+{QdA*Z9_'0yS/6ux9K$ҏҰ o8tGf龉Jڀ„xf}me<1%1*i8]c@)ĈmM ~ݰzI{ !CK=\_9}`]+Md R r Jv>a4@xk =KNto2{rBӭ7&_oIO9NGiMUbRZMwe"m?BT\y\}R%ILl:UjTtmqxF<.d^|lh/N`/zIG,R*S78)@GS.s'lU6ۻ=[9+|y ҉} Vy{3y=`T9,_li0Y8V! cƜ>C竄90`fJ; Le;>7be*3zJB#"er,zynU|ӈ ȮwD1^4<π69BC6^ٙ9M>bO}mrzީNve^ 3 3-_+DI=_K$] M_ :PvW͎ Y$"!c 4ho̚TQSmAG3å= P`jAA nrY];P*z8M"h"h>^hTo:Fʓf+;wZ8L N,F<^d)-havʣ1q50U.},^ʟJtz~9˳NUw6q'݄21y@6{U`vA?W`Ͱ(7F5-+ީ5n3qbVe7q'@-g#uG0Hd3B6 VšO?~Jy|X^NA9D~Cȣ IHe>kεOς̖X?<9d纎^UѢS|wEt3 4Td>{A1zc3hv?IrogXab#5-Yҿ) @%JA*wL\TM0:.?v=V :yI/d͒ &/ Aw5ghЦF'|*zHmixɂGLI^cʝU-Î)%m/̚vۦRk;@6f.,¬6&ꚩD$UV)J}htʋwLG&D~XXml0: b8 VOK^?YxG]lǕp^v.1y mҴollʹu}٦q04m&>3[[ecM$ۛ}Ev| 2˸}BȻKGD=3,u?MnxԂP9%'g'%(&؞pЍhm6 b}(W$KW9ItSFw֝%a3?+}vp2-Hq:0,7w2`79ޗx,CE\.-r%}s3kwoA-S?Wu.CG U)Ptycد>  {#n/YY^ugUtv _Zoѻ1o9>~i1JhV #ڈrrj:zlD Rq2&\3ABLa؏h'~/Eo{AM-Ķh@:bˆ}Ws8mLXx80Y:tvN/6Ԝt"^pTږ6?v,dg,C_#)"%}*&sė)OQ'.){NLn%$QۺUP[suäOM*~ͻ!R];f CPʕFhL%—I9u[mN0C~GGz۩ircK\}x|7y3& K36H B"6^-Q[>o7V FŹ|dH L鷝NsvvX%+*pM޶Oqr TY [[b endstream endobj 268 0 obj << /Type /FontDescriptor /FontName /EAXHAV+CMSS10 /Flags 4 /FontBBox [-61 -250 999 759] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 78 /XHeight 444 /CharSet (/R) /FontFile 267 0 R >> endobj 269 0 obj << /Length1 1403 /Length2 5936 /Length3 0 /Length 6886 /Filter /FlateDecode >> stream xڍwTTm6!!=HP 9030 %HHIJ"-)!! %!SZ߷f3{׽uf;OiSA"| I6.@ vPp$B? ()A6p K I@@!H/ % Txm@ $`WDhLnP.p B@m悩8H(W Ni4UR@ˋΏDrh@\`q xH;b p( ᎉ@P@Ly X] C t3W"8w0 EB>p= hѼ@C'Aw( vw;")+ 朕H?%8 _uB /[_Dl=\p7ҟ @ qL :*a eưuE0D`p; (: mP4fGɎ1XcF>a&P3dH?]P6V4^7ЗOB '$  Āb@'۪ȨC%`9x9J :HLÀHH\B_Yw T<8D? Of=h#12A7ap!#1'(P?f^` 80=;ף#>o UF@D($zA >`V@_AZma޿G(@1!@ AWq!/_i(F{ۏa0o0>J:֝{-J $@)X'33&4T[U,uNfF.}b.9cVYg>J=f`!5IV`,@a1F6ڷI8ZQi\Sk j;{Aɕi,mfp\ LCgmy2c/]aڥuPQjk'^|0SfΨ+֔g`QUU6G85xOG's9(ܜ!scʻ:HE_+ ӟF4)27f5}ٌ4:ip#ilɖWcԟ..P E}Ǜ}i͟,BP9(ishv.ޱdz6ypnpҕ'M 5!9u,'LOQ "@ó;#/ϴ[zO옊40~kQ#*ES3 O nzڿO\#9%!≀i(9C,e,xg%ϭhIt d z< ,{:qI־[sT~u"Ă'ZFpf9)m0?m[^ \l9a]#%fǓT7vr+mjnۧHg]F>4xCEΦUÂ8ѹz}ڦ#kA~ͩa5 oqPeXq:)E}@ޗObqqRGAknyDby%(cjz'xw`r1G#rZ$ݺa, 2w/{r>oҎ=%^?t kZ;`x .x]-Nsf;S۳Y׃&r_, pxg6i;'UekZO)4|HW H@V:ZZ4y)Ѳd`9_S8`Y[Hub&Eaks%B)!r=ۨ hҞxSW] .V@0U 3i&nnc!wZmydyLs :?f̭<&*o Nlgʹxkl{BT*phxOL/{$ǰD&xE "K[6>Gf0'cC/?pgNт,gQ?:I*_hU+l\Ί?Ӂ$u5p^`/`~Zd^(<~KfRpqO۸|vR>جtI"{ۋ*s;VbO`@Ogɐ\oe=9NL":υ7Vm(J\,},4nkv{_| $Yh>QbH'dpGn9kOX&>YpOT /i92f-9= S.<D{_ei8Tг'#U'c$:g5AdlT_o_yj%Pl#"R,eBmda.D `|Q$/*q&:mx(k%/<1AwxC'&uQ-Rw_+ *U8 zN }?Z,a&ANhq}O.az =%rG#Ob#-߭ RO}݆CYZ-qVmJ!kA3aC}斦xߞ\T>?Xx`9iM>W|uRpT wu*ۢ`"xB77L5I +R'Ia!s,TFx^KѽpB^un3i&+L#SnH Qij8ihrl~QwpŮ+vOQӖ.Ɵf dǐvsH{%IA9 zgn֩tkEisNq; ө~mM8qgZq X`O&I5%|)yjy+ gO.y؞D9<']+Yxk[׏^Iv\ Vht٭.NXT Cׁe ݊s}6m7^@L}kЀ;ro&Y|yBjȻoVm7>SCfU;o4ZZRT 8 0ˡ/wݸw X!an`ȕ/S7ɨ _*B^Gg8H`^f%wHvJm1V"K<SX*o=e pICk(q;FKO)|3~wۋayy8s͎>3eK׃G<@n=9^5I"yȿ3:ޫ=p[m2[H4قdf6S Fy,ɛ7ePܥ?7,FA=5T#4\nwNɄ~y~.UՏMsP9>@b)lSC=Yh%X CzPЃ3f\H+e(@1\Z,&jj̢t'MrBH~]n,MOvժaARnIęgRf&B27f/]ͦ8 y.[LNO;=dHMirodpTܡU,tC'&t o?˱-a&2dJ>py:.VWA.:u"4^NfCFϣ> X748/}uk9Pޯ}UH2䒅12UE~Q .ʹ^ 7d bv~+;i;vWu(sq@Nb 9]^4c endstream endobj 270 0 obj << /Type /FontDescriptor /FontName /JEVMCT+CMSSI10 /Flags 4 /FontBBox [-97 -250 1077 759] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle -12 /StemV 80 /XHeight 444 /CharSet (/R) /FontFile 269 0 R >> endobj 271 0 obj << /Length1 1408 /Length2 6039 /Length3 0 /Length 6998 /Filter /FlateDecode >> stream xڍxTS6Ҥ#H7 & wAjHB$t^7J](]zQA{oed3̼;W8 (:  *Ɩ EH89Mo;  G!c6U0 E!<($. "@@4@tPHSwr`} @RRJn08107lE0FA0?R:c0B`7IW 8`h Ev&D 0qr1`k@!0$≄<c-; X/@B+; H_8 G:Bh6#XףּJ0~hB8 J=f5$TCb$ A+H7# uE.l?i`M$901{@0uv6c9X@# C{OX:"P8p9$Ύ5ZcX>* B"| baS5(˩ Hā$3ϿNo`GF-#  M2x /PX=<5P ~C;_YW=~GA`Ά. ;!h]^- ;#JH'Awwp8#a(4};zWmo ;YFPDL`]AY|~K ,Da!,@#ʃWcE`43/'? @<=<3[ < Ϣ 2./;k?,-w$YGa=w!֘zlyl0W99|UnbfGUy_p+'+4.8fj/ِ ߊ;|"BGtg]R7@)%[&^)k%2fҚ2*DtiY*ى$5x1Td)DP^+ڶxKU]}#M[A?^q/-_*>^1Jmyw(2qMھΥȪHrf? ͡-Ovws,Fji%YӸ?V3կ謃tpAYJd*6=ZZe^)=֤u/#b\CUgiE;A\NWjxGĺֹ-nE}|6M TkHϕr&#5v(dx@_{|AuԲpWxUUa9NB,ͰTjE{OGy% p4;*o+,͆Kx%\ՠHU|"f/c^ұ-kX֪@V2IAA{S#M [*UDzkEYY+#[_EU|WjO?WJ!%p1|}qU_JYS@JGڣ[_\qfK=Z`#9<61mj}ІJ֌n %b˛f/Lv\u~~.ӘP&q#8DI0K\Y}}*QuVbx{Y90`Pbt#l8rx9~aӌ^y(Ξ3'[~>ݲ3еUf kcal RCL!"5әR8- =*|ŧ ;s3o|>'XZphgafVdtqގ7Fp CM)`:7& 5q6äg}ij/Rt Wmc".4aّ* ^z_5IKvȾ4 n%KXYk59X(BHj;2[(ە]qw$BPMߛ^'ioJ~x@k5ցߖjM) .GUE׿^fkQZKk}ՉAtՍi^ZᘄtX" b`%%]8ޮ Q ^ D8{D^(egHCe:h]r?Xzkh62Ã7N* G{s/۲I]ol$܇yؖܟy·X*nc|FQ!ʥtWǥMX`T;‴W+gxO4@:8䖝\"  $B~'w`ZWr."bT*C9'3){5)6˘ZGEX\!vfo3#C7Aڬ{Qں+- CneVRjEmtI.r$lyk(Dϊտ:MwSXQ*^|b|ɻQϒ&8ҿ%:5/?^YUW^H;~:9*` / ,l&և.Ѭ4Hm]vr}+G[ntV{I(?#t*qi=Tނ[:`Xq AGn~>eq'LuY\=O2pVqYgP.F/!UI&9EPqї+ˌyd#ch<AV Wm`2Dby(@vi.IZꫭ 4yuplC_nlf;]naw^FLyrї.6 #Q {~ rz:d,n9XȳKm<u-=GĞ|h%z< &dJ݆>WK.}2ϰE%Ak̈=spu尹]Cql)^Cٮox8rC4ma͓T/Y1eG0>Rķ9Dҍܦ1|KxU䦝'#;ӝOvjx3Nװ􀛏E5!Fi&PH\č7df7}yj=e)[!k0 z츮\_5hOmi 3यo; B*lAE!6[338|̽Y2*Ч˙ׇ<;jA7]. ԩ)!hLيuF;/~5)\TEu3SY,Ӥs]mbLh=7/W]^hq{Xd$eǔeLFXɓ~J21e48JLC??*c?CEiHSeKMPjJwؠd6f [o,r˵ (GΟjh8?kjۊV!7[r$^'HfTV\ahDL@Jd]L'X>Byޓ j8Z>~o;(.1\更9M*I-Vd+N!)I2X֒Q(`3y ь;5Y{"7ieX``]\M$j ^C[NL?G]!鼿$\NvXA*C{'twh2Uٓ}^Α څSMj Á ӕr!0=wlo/? >lQWQ7WU`7Ef?-]<ܗJhR"vbJG)#1qW@mbcw,ks kt>/”.Ƌ96c6o#ȅ&TYuݚDɺB;tTM3GR&6~nPdGzXpJs?.vS~yƳu Ÿ\4 7s@;P;SCO#>I)uF/eZ7XI4Bآ@~tL.ЃIK"06 Yԗq5Z\Tމ;bQ+K ].miwz%uPPw䢔QYw2&1PZ)~5}5,ha[kpÍw PF/G?o{i7ز $P}.R+9Rc &(&ꗧ~S!Zlh^ ߺ*'Kr;}hp_gzXpܫk;kx6%ė[v[";枊Zܺh{?q&k.naJ"g[V'{uibWcZE̥3˛}MǢʫBȒ҆/_fI hub p,iyPbK?SpjXTk>ŚTkQsGwKoqXt64OH7vlXl탷z0B:\_l`-ܻn"F ˦(31nyӃR:GwvÎwB9XboD)-KeZT2/UknV~6~뤊qQr O7Ŝ\dRG#d)I~p^1څpc52/Uc|f=t}n0V TuF1HiǞ?B?I|~u_/W߉~Ы)3ؗUv(Gq$_W,zN$-鹶e3=3p-{[Omgd 7'~4*iyMt;ڰ[i"y=?]"aO.SwZW#[1e͊=0OD31/},!F/+E=I2`)b}܌D7ZKO2?;D`<ޯ5FPp(Wr hY, _X=S"XLQB 4Lzt^dE~u*;Eyۓ0˓|~?ڄ -G.JKss4;[riY ĐZK¹ oblh=&mI&9)OnK*kO<*|0}k<y97{z6HF}i37PPM\8+z]Ώ>9 _;ĺKN"hj}~f~'=7pf ќBRK}w:-*WUҪu}}-f]Aj335],Xh()~{Vd{΋5b#CrcJdQer:o> endobj 273 0 obj << /Length1 1419 /Length2 6309 /Length3 0 /Length 7278 /Filter /FlateDecode >> stream xڍvT6)%2Ftw( 6`6`#FJH7*)!JJ4H>?=}پs_XD 0$P5'ā   &1(rPvA08L颐-XKˁ@1HoG@ t-&QFbN\p  hq0 _)0W9QQ/// o ' sA f@27F9` 0pÐh\ s5u0g?€_{{‘ xc$#Cyt{Z&zBv.+"UL -#wo7? 5( _kcIG I= !7R7! /=0Ev߮? =m@pۡt)\,Ih57 j;ߣp#a(4  tθ 7&n]WiZ>1I)%4&&)  -o(B8;ٯD!hg87_8X Bq WQ{wwFϿٓMMV7W(x,-D N>u!NWuk -ޟbUȄu{d j緻"?a7S"xfFmkEhŗ`>q"!\l)@ i8Y01J-Q80}ib[zh~8Ǐmff73ӓՙ"\4G#?YV-8ND(,r >W_wxxsab³},9wi!^mHRGʹv}J\2F:i.i!y0SqH4£~}"v"Re'C}i7"E Ȫ5kuo_Kq=Kn2*~8V_HlcBt)jg IW3NGWT4u/Bƥ3o[J*JMճ*,DK[n~)|PsAF>JU0ֆԖ&A&1 y<~A؛Eil_ #Ʊ1IΝTʧQes瓤4OrEỎhv冾bpǻ!$_o-rjl,شM(\v3m I*N2v8{p K[ڮ;bcmpwwI4~KꜶ &Ώh]##Sto^I 'VSqWo$*}z:^k㧐)=顿i(| ]k 9J$6'.hA A6OJgeDY/6=a~ n'ri]BÛťJ_]Qv n7gڔw6p'YZav{Awj(z@"OH V@~m|[ U 樿 ȈTj.͕ :ԫZ L! ?|P#hs|uuKn3v)C.@jJ)x[^IY(= a< ~ NadoT'x2ŸI(t"Pۗj\q# |{Ʉ%+$ov&ѹ_(RY>s~|<{@<פ`q">XwNǦ)2PT']3/ጚJ']ˣr+,A;;ViI2N*,BwJc=܆QH7R:ǐ>YӍ*9_d$s~}1Baz}YGi+Cfwձf.J,oM8J8ː'}J%BEZkgj|m 7. wyYCgs0찻ujDXJ)0+㛖u>ZiW_5J^ZODEAge[ڸGA]:lzFx$UqRP+f(:G樂EiUֺgOI{6yFݰou+71ļ&O{I 9Ew6A^.ˁ!"41L9C;?6u6QsyQXdweN,j(l}nb+m*2 K\M Vr""S| lpMt#V ģ9[}Tcᵾ!B"fjcLr=6 +yf~.OOnw29*}Ԯ#?0<;dYsg6U 5_ K^`~Z?rrTì>qJw'2$U{1sA9"m_) <syEѧH {W+e3!GS;mU 3 z-{au*ROWxλ7f歺ƔkAv 8iW-( >yqҗ59h>`- z]Sl^P~Sd[6FA u8wSQ$ӊGjBVLNYX5Z#iҡnxbfMA?.VQ=<=YU ,궳"]DjT^%v=c9>H1[Bq8PNGlirYZXZw&Zth3d=)$߸:!t^t 5ݬ?z-@_'tuF9xjkm]516W]3vxSx8¼4Q;gUj"7MaK{I-Ⅲ2{$ce㳘-6˫Oe$F8[[ӍB̐5UrC(u:a!dcthBzxB*{0[] R{v:wQxx :6"mK[[uޗ" \}sz|̥sDP}vNqS^AC8CZ&O*QȉdFfw dɁ[QZjutFIc@iǍ{znl(:z}0;_)dK{*`J+lP59MF,DRa"5g5%CϬ$#8&P4z.n-;z6yqdt7 S#6S" "K42 L/57 z2˜%㪑ꖯˌdmϴ}`nM;O1J'Q ;[\(_f U kE\)x@4GsVC{Ȝu<5dILhw5xJ|u!6篽jDёT3@EazͲIͣʞCowϐYr}<l&@*eކO |>V8h. @멺y;*$'JYBKXۗLLQJ"Tބ*Ee?(n0If]93wM68''U.yES^Ò5wHm;vmΔM|w7V͔^o-><ɲ,[8>Ski+] 7.]B' z*|/byo326 Kk}}&k0ǎ+/L&THRzirN3R;~@ }B1#qإm+n+Ǿk(f=<|ұZWL/晊`KPulKe#8,OV=-Oһ]22`K=g#)6]^v4߽OzϨt /e@5B*{=uܟbj|ZO)9PE kTyCB%g'pli-P\xϰikK=;|9}ѸH?&09x?i/+L6r%myD0e8 |v!OC>g?,lwU f`!6K>%vlq  =o=Ž"h%k;I^R* [X[3Zm@+iN i4:L\JG4xb}s MBHU1.~A` %|x$^nn])KnuIgxC4‹Mr$dZ(A @LBce|QV'Hd(*g4 ۬-b;!OOyDatI0UJkvіm9S !~mMq'ẃVX[9g,Of>D( M`8^ dV:dU2\swO1F ;zN}i_Uo2Wށ[5q42C9ӖVX:B^:_į&(Jd!?ⅧSY q[2d}s_7y. `mף|vqMNr5^^(t9sh)ipr[o<^~($br-amULg}VGƜ!8#f _%fБi4~urU#\ɏ?2~jܶƼzeidh۴rRIݖ cULu~)U}?$ jM5l UYG|{uNG5e#Ѽ]GH&WSۚ> q+dPG9yL1`EW7H{)^+K,9*9vLQAιϰ>qFY1Y#G5][;{n/)r@zs[dk;,_e>I`%KdnW6? +;mUbN>ʯIw|dwB,1f)Bƻ 9ㅨ:Ƈ44etzNVb_AʺJI> endobj 275 0 obj << /Length1 1396 /Length2 6070 /Length3 0 /Length 7020 /Filter /FlateDecode >> stream xڍuT6-N atn:#6Ft7 JH# P"H ((HHt{ssu}fd* C9oX!QaPZ @b..3 ಀ1R,Φ PHPT(*%'*-@ ٿQh9uQH8C#6?y|@QYYi_@Uw8 3 q8_%xX9a;FvR @8À?@ῑ fo)AÁ8 Gbp^H 5 =fO?? !!P(C 780+ a?!n. AApnV5Bp@,Fp Qgܔ50u;~OCqcYW$@yy#^p?!8 JII@/Ygy3?/O3APB8q? ĢA@TC@@ : w}-A8A??y Bk"uML~#OM d%%2@iiY`пge5 \OE# (nxC ?p ?ԷI/oJgB~y7'Ge/,N(8j -e8 ^,'UB v63B`ο*p=H e@é{`p DレH( S}bR@ p$ñ @'S"Ha :Ѐk NN88_š^h4Nz8p_8npyv\# O)}1XWr&d>]~[R*$?o̱$I"9LClEvi 1Uus?V1{%IRwеL~O6|EYt,z,f+뙽`_tNeX`IސKb/B{U:yH` Ɓ#pIro #sNSR!;x=wY֙m 6 AMFra)ޝ,&hnP={ "w-Ɯu d%ɂ.r=ҸӴx7V6q0Ekz̮j_(S3k;)s5y[vaHJ A `!(sZI|se2+l==W2ֿ,hDBS:=hԁ0i75vZwD g(x?? q9q6| 6%|6Hϕ X8_7u}$25#2_xÁQH89 ]b"'k#l[^ `6I agMIjZȣW@ðSˁEU1őCGHT8 }ʔonҩ29OV%QVv4B&R4nM=7Yxң(wHsɰCa ԟ$qT!O?ͽN׎b94"k9<壱COOZ$ $[;*%|&=/ $>>|R%mu1\YmvVv'<B_=GB9c"˜2c.)zp0zЉһ(T g׌NX٧ImW黼]# qdu~{֚%o{h_a3^邠Q.b2^cMJwYD7@4s8\>;JG1R@;3 ]ƻvy˜Ovm/ҪVFo91lY="f낧yz,I垄e VcstI_v %`^["kEYdk+XHؕr?TU: =3 ᡾m@ogrfy^pT9r(MCp>GUPÖ G߉x(F%q00eWxH16f|Z=UmQ|UQd,RFp0B7v>vRׄl)if K-o8_I[GqyZhM*F]x"Gzcч. +NxxMHhۏu(fq ,d&E?!^5IS뀬uA^3ֹ8 IzgdqŞzHÿ(n֭b3  hY*z<"-3Qg2wYBui*]!bQOR@f5_J>FʻbGyqz,SUYv#`ʶzwRwSdj1O=㲜>jm)|>ST{GVHZt1?gD{h7V) 'ILg*<&7b($i זCZc56/JLf@553杵USb'Jgxi n5_8P)9&5Y]V h{=gra5 E~zG-oZjΧ44>4).k|ںDK.]=a=ho#Jۜqp*e Җ+MSoշ3DU*iȍZ{,9GkqkQ](0ik5]z酷-+;.}"͖Jn3}8G<\vHS3!Xpj!uRRqm|ѸD9hԆjR_Wݰ6NWZZ =ߗE˸?;lLW~.[lL [,LlՏ@ѸsX&BiT S9 ЏH>??Y[AZd#m8!a~GH^13aȅ#5' (%?0!@_":(z  k]\l$̽..#MȭٟYv24D8!t~K&5+~^62(+#aWϮ~eblI'9kY]1{9yH;XY4.c)anZnFMj04..sS*}r=;Ħu(00JzxbP}@M"@q_wg{qUr%8:r#?,Bh)*e@ER긱CDLTIkAaœ@5p5i>%WST (\ݾ}>LcdY&~^" Qz+} =Iw5Ȼd*)(OźЏꩁ!}@]cJ J Fk]s& 9)JۊuECiՑBR 3f=H~/ϐKr-y$szdK@WNl(9Y1MR$_01Y{\: kA{NlūZ#fDpOOlXz`Қ5+!W#[vkԪo^0-uum\=ͧ[yjmj&lP2lh;-ϡ#p+vSzh2;Hc>L=5qz-]x}*_4ƃzB~ÝA .]JL]Cq6F*R$96WA !mmgIa{AITu3,_cnfp7(1 Z6qW>$j^ipo[CQZ͹St˅jOBNF+g1` {(yM@{y/njd8{ k=O^gn ȼ>y8~ Qsӛ,f쒛PկԎ7,z`ʺ)NJ'՜șFtVjy¿`&؋9j\w|+?n1-sX7%롟c9EA҄w4pJM[Nxy;9MjoheQ (RWEN'Xg-}&_6'-=*Q{pӑ`}0zCovU#!)5K1#syxJ °].O'9n:n dD/帞CK4(hoZ4|0zp=$>]ٰ*#WN mP޹?:Z}Aj9G/>t,~72WGXH3: e+2m`Pq]E)3/Yau.-k5dkړ^{'JVɓ?ʑ_Pzu d=c%TZ/ n;,vJ崌,ߎ:v\L3se/%3gˆt ѢoOP70wL]Gj sX?ɬccX-3mp3mw8qx\ ''ڐQ6"mrhFS4f ݴTL:81k>+6a1) YJz5 [m h񇧍_]i0> endobj 277 0 obj << /Length1 1841 /Length2 13144 /Length3 0 /Length 14289 /Filter /FlateDecode >> stream xڍPҀ n! 00 =;ww zr{*xղWAM,fjg ubfgaH(iȱ8Y85@Nȑ5`-,$FNo2I#7C%;[5 C;G~ %ANoq 30:LlJFN@&Fu;prgeuuue19 3\AN5 4Q2@wi,H /#&mo.ζ@G[t"=/cſ 7 F&&v6F [s 05lob62~33u#*¿8,`5q[lM%llN`?9MZڹz@fal Mfcc@7 ?hT!~`Vd| 6rޞV/!LA&Nc9@Anlo`_zofjgkWQIZ\Isx2sr9\=OJU@gl|ֽd6l6@?fo8uoF2ـxggP{kk gs2z1[9gfbaKK܀* 'f?d Txw޼mLەmƕ53c9ܑ&oj ts,vNo.fvH\{n*X%!> *)x*'UCox&?zj/dVK-w"[,-ޞ,dK_?}}V[.·؎·@{ӿ=·*-?aho݀&H v&Ձ-wbĮ;c\}WZR.{bӻXGE VxlVk^)x -f[L^ 9mMN\Dwfdio,NiYPƢ" xy9Q[[ūĦcIܧspo-0A6RQw'R0"xj Bg QȐu!{%f(ۿݛ -Cq(͘vS_]gBF'7mIWi 4"rpv pDc4IݖZDf圵SǼntYdjrG#J<'#2|lGZ֦8#nӇ,Y˾ОY*#E {#h$Bo QOB_:SarH^K9` spk` T(S15-:L+5ǪpRl(} 5|ND۫Kzj\j@5T"rRɾk.ƊA#p@\|_Y4v k˂D?wpH3erNx[84m{Lb*wjg?>_{fn&k>el!e;!'狶(7uYEJ?!P\?V8O4#Rv)gмXnO e>⺍ϓ(iyꯨ㟿#xsJQXeEO_NAe_|/} ^ע v[\5͕C3Ӫlq*K׃m; 28(΄DPp]\^O`|` ٢CM8i|*J$NvBQ$5Ϙ̙dmu%EBbQo֭2ov2ji/ \"384a C~sbUԼ=#x'>&|HIstMwwl@<) Ow U1+Pl\E0)9! 1/~\;|C32X xw$`9%x7dAWRHǢ/0quZ\Z0Py.l’%>[b PxqC'ۣ3aTHq=Xb\  $p*"&W ~r0)pߣ4,G&eҖ$i K'pԎP(a:>PGx8AfQh[ߘo2F+҂f8k\1y@Y X/{\|Ȫ7aXJY u0*N' 0X_Rj5X"iF9$J2nŽ!M2ܵ}u!CS1I {=UǬ NU Uy|3̕ȩ~Sl߇W#w>M)ehԻFRvl? ?~Yj|% HeA5bWauʖRJD1 ×#iWK>䜥pD͑S:|%_k~8vSfN_*nw[Y!KZܝXBČE)a-[NMPDܰCx[M܈LbrC% ȀRa՜h9$w=l9܉d?\ʄ2P 9F|OR'B9'X h9l{{EXJN$_wK3:&pU389i+;A+ebOsAD`dX_? 5+;6#P)lDhHx3:C@jKcySnɣ¶F5x8E*C1dO()m;v2Wq4KG΋A즮8cR{߳&Y0voR<#Aj.cM!L(˔|ؐ(Q޻ܟ ;'pB6CCύQ P|҆!гel&{ ۶9jr7 un`|+ !>z#/E鉛(8K*xHIǘkM3륋e뺁bhpmkd#\BSPkDO#",#֜sccR_Fܴ4R33LU@NCX $}E9;`Zר=d Z9 FEavЭO8kiAm/iϯm浨~f"5aNs 9fni`')!7u1y| [PANџU_YEa<H2Rsd/Zr|zCh@uxUg+Up:iG7yY+=4#__+VC:kGS$v!M*UA6'b=#E1AUߙqHqDY D$'d5@m5jZ]Ws!xu[ =&jihr9^HhyU"r*T#2?QvQF!lzGhXSAQڕ3 @1n(%Ӥ:PK||ޑ+Ȧs[q0fä@a"J8NV ]&12x<9`Y=G0 5Bڀa5š?8+Q{sp v$Pz "W~;tL-~:gPY͛A#ӝ'l:g#@ٲt#vn+d];s%es?MHDzk_\snmx]ud][>R# XT&$\j:H _aXqW;FE;@&Ms`wҿIuRBDM(nN)td#bW-Lq١^m~/:ͻyًrL%jz !H9azP-Ckz<:oqld7TAO`Ad$lJb1[_p;fDE粒j~0ôL -O Z )}>}l fM-!LX0$7#E@r|U-7'YiT:eZv?u-ck(^htSΎ; 'M+'۸OfE6Qe٫K83b E*;_;-SiD~ dUZ|p d̋Kz)ES"u1;"a%B W~zR3i›aeItkƝ$#ipRnD Կ't~v*h=DZ_E&eX9er_ܻ v Mԡ}^R9P *?|1).#x*a#BX_)#&mvZҳg v/0ԡtIϢ$,?qXHP 5^ W}B'% $[{鬛,fmwN4-[Ymi/f%z^O$#=z m_Yx-_g|'L#[ɖ#n6p-Q 7߽Ysjv< _He {6iB|Ʉs =9o·j~xQJ)$]D)cNzrz>x蹄P"c1T;\Q?\4b嘝Ep+ZRƾ /ue<&g}9{a‚yaՄ$4v#f=|o.8]If_gIɄ.xbHkS 1g$ozȿQv9 v)6ZA0nUٽe-?Q`?3aXc\{KMfXyYr O i%TQȪ+YԔDo-pYQqJUv!;[ò7x/6Le> Ůsڶ\΋# {ܶ4Ac4g oH}0Qp(.|}B1_1F! EB {WwQJՉrFOf';pH)FbxkEl69X'_3t=F qZՊ/wCfOd =] QpHR l慸.yfwwiu,Sli,)a VCeyx3lS0,~dp^Ȅ첉EZ15eNOjHee3Lru+ :1ΝwB&^yx.2c9vi eXfkG`j@| =֙Ԩ_s{ۑf^:UoE1eOG4#jQPY#Q̫ nPMvmG =rYEA!0cvl~K#'VBU{ Ӿ(e#OZ }(=ܛi%㦺AF"ϣ*K,WB΍߫TDriYeh ~%RdSSኖ/"dhboVBi m}na%rszx.ȷAClqlUeCьN9+6mn危ej vM~WJE~nCR pׂG|]E쉲Md4U}J]e~@]?|iOG{U,&<MUs5s!.9؇鮅=^/8wãzRVF˴I`ڤW|*v){fΔ9-ocnɌvy,H3D}lx?F4%ߟzv%}L&-吗Z j[E )L;8p5 Bم^gXYeD qunKlaqtwC` ]9s [dƖdճ@s4n`T~$A?!:˒,.)&GS< R 6mںv0P:lC".2}i0-]g@Xk<2"PvO䃝Q,Wb|9DSOvX~{ _fa|d!#n.=~)-߀Eͳ!N6+ ֛a]mwI7;AMDXۑjT4 2^ d0M0YMn1䐷 7(&<vM6 P.[fɯR*R1l/pdƪXJ (Ϥ%q~MeHE,S j>E\^Y6-gBZ.|ҟ,'-L9%1ށ3J2tbaO:ʀ"c`*2xC"^ugv΄霚"~kRDYS-(C1!4h/o*>Ydf?M˙4;?ͪR_M-_?Tڅ(tDŽo5p~G U'u8kVb Rw% \=ƕ8x;EUz>8MM=7ͳ HngHXsb˒ZC!RP!Frn 㓬R^>u`HuJ;I \3qA$=A]R: :$Ǟ %/>w %z1_Yr"ͪwSxYtz/hHk(Hi ȦRaEdx-h^/8v =ss8З"Ե˧ZAad"!W|W|Ϋ`%@dv҆*T{A0/@a'6P- N| D52Lg S}<:«gf팽j"19ژk?Ad;xYPfRLD]V|0@lkyx'4Kk+"z c TFI#;vd i2S3No̬^0=BL6O }˹3p "p].{ uڙdY-[iW,.?,})+G~*" ϒ2nI}< f޼bcYH;)#DJX.򷻼17gϾø5_ҊbtVgMe.Zs;Koj#QiĻ.G/+Fcu=2_uz, Ħ 7xceZ'B ʡe')OfA|qw_QRWϣT|!)@k!$ZطYwmlrS{kXiW ֟`<⧻sT bpYw%:KgaۭJd9}JѮpQs~"8!as_V+l` dE_]\I)?,i oG:7߉Yi),!kCז*Ô ߨ#lVq9C*kZ6蘧Os *4*wKRrtu=v֋Hx+%v4aڮoLDD܅X\S *pw0l)DadC΁wx}_ʀK >RJٳe}(O29b.| 1E)bɽE.:ꄽ^ڒLx0Jp~Q_,ܥ߽]V( wlֹ$=eӮx iCY7C5ß$>"b*ipo&ytJCdo5bvIB$4o-6 (T@ϥPv BƪsJ%CQ6tih \>!|r2.I#ʏ=˨oeazn-=v,+C,^FR߆kEӭZYxBތZZle#1@-M]A;"`-V6-uw!V]À ) m]4%Xp_Z%ϛlϫc{!+8{Yߔ L|}T?I0Hۍ1ccCi "ku]Z鍌~a >e:bD5[;xk>^:mZP8v/`4X}ؠFz[a$5>Ov9^7}tP3%{KQ}olVtoGsNCVnR\3NRԟ‡3zF{XGw=?n*ZTLvqQ[Aph pD*ˇ[:*z7(e [5A¨|󝥛4d`3H32LW@47Nv&i 1['ޱŚ^&y23pPxdn}@s}N!ti|M 0>YCj} |H5dWGN.H"0 E&V Ϳ(PȠnT@IӶ"TU=黑Z@igl%%{Qi&#oVcFr|vuy߷3XYu, "]l~F.x۟dع355@١_ePÅC;VR.;Q5[b aydhSj#u}Y#]EgZc.>֍.1*|Fd%:ga%p5 QPҊSuTƧeNt|Sͱ(n WŸJ H%TȕDCNqH̳۹ endstream endobj 278 0 obj << /Type /FontDescriptor /FontName /UMFBMN+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/C/D/E/J/M/P/S/Z/a/b/c/d/e/f/fi/g/h/hyphen/i/l/m/n/o/p/r/s/t/u/w/y) /FontFile 277 0 R >> endobj 279 0 obj << /Length1 1707 /Length2 10610 /Length3 0 /Length 11710 /Filter /FlateDecode >> stream xڍT c%8k%{pn иk4H ww Nsg~{]SUR]UB\X98R*ZZn6.TZZ-vTZ qC 2wyIU EW;'7O_!_"*6w*lEV [۸_%#SPp= 4w؀_*Z4!``qqqbgwwwg3wf@EY`uHۃƆJ в;ǡ rq7/;%%^4j C`u9N6οG"ß斖{GsO5 l*x!/n`;sŸG7J(K% C#i^Y(98q>i0dr5 CՑ] RbBf rrppps@N <A:90hv8^d|VTogs7 *''tXd1_{ 9^Ə/8yC r I)) xX>A>f[iU7uSp#+`ki[A2 ?oay 7d{"YW;? !v1^e3T / v^ p"β`Pbi / u3|/+gMq~i֟.FoEKC枨/ |Q 9@\^B/|V(-KaseA|v?]o$Tq5AvK߈eAC^.%1'|9ݿ }@vȿK=A;_~ "O?=tB_?a Sۭ}d(Z;>N>:a;is\0տ޸y ~SɧP2eX8Kky х kj'{B1(:WJs'1 %'E Yl0k}># p9Fi|[kzQ25j1e徨5 \C*nH;./Lz Zmn/7JH?9 ^tfT{N9xxhb"'aOo1BlA1b4"^t+w U@ݝ.i@2~fZK"vPR `TJuiI=ښma¬0s]Ky^}-ܰDX#t9 h<{sWQ??a8j W5,Ϥ%|>HS*58'9[eɦ(iOw*jQ.Eaʨ@]:i} :9a*A꾷k=Sl9K#+;&7C3*3LMs;)xGlmܲ8G+oN>6>l7CUJvW&t+_Ne{߬}K YK⎓US /N/r&%? իI۱׻Yp-;#NR[Fn&8][4%|ϩ~[ϧ\ ]&?-Ee\E4Ydn<1}' @5@Q(5UPY1cLIa!m)t}Y`Jwa۲LޱImh)،İS#Z0No'e9\d&WcL} $ɫ59ywAI&}.Wg.{ANvwxQs)N}Əli#e<[Kxe-:ضsm![ŹsG?܌qXd+eFty6Ōİ-^>L>8+/>p̽Q3{Ռ`>ih2FH6k&;w|ɯe$ 3-pMR ?'ǕbªyOɦ~1 ]WdYZKȰ$#26DVwC{SUuPo|Q"U QB؀!xBP!. |̓d\ :1+4aT+74y@"3|.kR ׳wf'S&f0u 3iwdhJXJ3ؙ2,B*{r\|Fbs&z?.e ؜lR{^]d~Wv+4+/LWFih=mN>͹7pXk: \"hHH׉ܟޚh_Emnc؍P d vXyuOV`j 1| -B>gU펩"#WZftG! DJ}BlRG1%/}n2<۱9["{Y. v#+N,jU{}(r篐\U/gplH_~Lmp6Zڱ;@x7#5%#O'o&UY#į}p3q`pL 8;ܲU`%l(u~}{O{&;tćsTe:kKz5zL6xSIɫ?w'OQ O"Ō9er # lɿܜb @jNtRP)?O1Ώ `} ؿt(J$-{Y ^ =g!CNً1sO݀&wE|~ף1"kޕʎ=:8{CҴ R<*V(aLI\ņk<ة}=(ocSL+A2N36AI+9 6w]iN¯+{# Z![[?}# &T4gʛHF zį}d?ӀT CФ56[_TYg8UYy ;Saim (3kxmSfiD%,h A~.nMb!+J5 <8sVdhAGJ1*CGnWÎ6Q]9 Egps^ʡbwpBJwϴzI!4aBC[u&tqyE X>CV-_%RpןnT鋄j\oYo>ҴT`j,nZ B+o|eF4G8;*c8WрԿDŽ[ԍ qچϚ 4`;[Y2>'^mYHfO>,,Z]91nGGu@ _GZng@y::$Bd蕞  ^aL>Be{v'nه_1vb`* .5b#bpjh_]m0c.%ZzApܑmvc<)P4"K> ڵyRI5 BQr!J_&jm0fi T47_'j-K=N,Մ'6ni<%!PV e4ٛ>_`[HL; )XU/ˆ ^91,+lXJelE1(=a+QW&CČWV\VH wr5rQK/BEd lFf+φ$]AOi9jj_vX[aCt.VId,IkDL_l$CHI R7(K՗aQ8 ʲqr&ZV&bm}ϫ_46Ps*`;'t~9^tucnk_zɤmS5f~ v8/OV tÊ$m_qmj&daNs}/oC3-aQ9r{n ƼHf)C0"5JhfXImɤ" tզ 2$qr1JczݜlY/Tėy3)N\2Qک"\ +ƃsos5+'"X#ja}oE3zU/bCN%gi135Y 8Sd/|tIRW>=rBaЧURk9޺ZJ}DYb®u;#T7MI4xbV)Kk z#?!{Z@>~7 Édal r<1,m h$=8z#`Ğ텳/W; F7.Hz1`n( n8 'x rû}N~b io*ͪ޳3=k먋/"o?RcI~U1;($cLX~S3p[2:|~5 U1DSl@۹IDnc$ CD/hR0Xo `Fl_kv-"/eT/Sh@tTju;ګϥ@h}fGS>pr?5+[\W{ⓣw3m ¶ElKI]|Xt1MM'qה؁{=9~o8{?k"BZISū*D0p Q5{<\kw|s _t2n+#,Uclۚӻmb&FpG}]3ESurY}\tJ!e벁 %so RŽÔv}Κ;k.'^݉L kVn0cԋ?9)p^;1p&)M2|_9Ҹm|ήZ.{UM(di[]dŅP/-%'z؍Jğ`VBLmly Ѡ7ݝHkDقR;|1y;kWaTE7`sDDAO=MN^'}(I+36*ywYOrFjGtb,[E<)ݨe>$G@VS@T7գ۳MdsQOVkzC΄(`QI]ER_mU&DeY7Qe~R꾶j̻[flr_kEF=FdW'35J3SY-Rbr}tjwΥLj,Q(1!ePםb;IV3pa?Yzhz(8 n!#h2p*Vd&ymzWxYΡaD?>xҽWJ%g@>P>50u^"I=Ekl܉e}8qj`84X:筲 3_z f~M0KؕG{kqnjBXwvN7_W -Pi8F ְwE)q3 KZ `  ML@}*vӫ"BOoqjA'U-=+.qg63&s>'1,?zvɼ+RWl|s`rzFZ[(/v"qVvpѴ́lV,] c֩YGz7EY\,h2 TRVtzNeyjčƱ @5l6Lp_ i@uDӣZMYra+*8 醘.kVB}>Z,z&U݄S7Gм-Pi [~7mQš-2>!^RIKh­^5c/k(9uDm*w/MjGB3 YR%};0Δ#~I[lJ}|Җ`2dÒ7]rބS$, Ì\R +ay}@~QWKEdN("cyh_*Xƹ]NP[4> ~?"|U\; ťKهi .#*&hC_H:Ӵn{65d&/^ƅ#cW^Is4w=.bVgXy4,3Jr+ E{qzԋQr+үC>ToNXT2tA@`Gi3gi}Pp' {oV{IelU돖yvϸ~ǂٷIĄ"ʍlU jM_91+[4iKl)<|6by%Qdc!"4J=A_Eqox:b]/3* 6Ff:*o"/JCP(zG7JZc-q$\>W˴|݊%=wyV-XG-#k!D]&H&&a7YXE׬SS?w/)oNב%|]. (oA74\=^ُcdʄSuoDk d LE{՜#{ oylhS]+*Ԩ:Z3|Q :d{v|Dlζ2BgN Ҵa>guw,"!/O[b΋U`HK)fxyH`ɹҚX;dHjA".Xd7k_p1rN(4|D$F>- ȫt|‡UNs'S;4,[o-y!iRp(;1ŃNvKcjUKn15*2aO@SV5&%A-h Tk c̏ gi'ko$9:Q$Y%oC4mͷD z7_IFt{j РBtZ-+O4=]ꛨʰۅnza~ѰtIT41+yW߶v%"BD,'  %Qu?Wc5~-И} [k$1< cU/mͧ[Qi:uŀsii[ͯޘ3t}=VEM=R HUb,]r#19Tve4I3^>K=C7B_ݽų]) 現yع3,A}hdq>!hM6v^YݕxJkMsww]d4%AB6,*/U¶UqE$N໧P'ePolPf$k4bH %s{oUC)gS 5_#;jޚ0Ji/ʟj}U$|Zcs| (ڕ]SEY)zϷl!`ŵ73Eb q+Y bSȧ8$ԯxvVZQourH eUTȯрA~.4hgkHN?m^o4O&>\O + C5ܽ>)?]${Gai1bHnXR2I0uv_]-W9۸E9ɒ-Z(W+YEcK+Prj ?fLgpnj%uGDwZM^Bor&BK0+<<˧)C'v7C)S5XŌ!UMs:g 0UN)~F#fgGB=ddzr _p_K}+=D?%,Kb#' 5 LrWg4ʃQԲ&=v8%_eo |tV?G3:Py-D ͩ)d`^w07ʌ1"V5^ *&'[HC-fGTW6q2;29j,{|$r> \ /:-'KEa}g+&Nך:Z%E(Ј* 9y{Lqa`Aq:qʆ WTc?g-~K vQ6V]my?uN8S%gWHSN@f ]wK{VPN_ڥE>Ryf<.A(i*ʩMvW2VȢG+Lxb{D?谺sggl"Oȸ \ځ -7z0{ű4Li\5tV<(޸Jn, bv!!r6xܽ_3|& R=ia|q+6JGtFt8"5-~?_7"x9rYPâç50la9y.0Cfb^`gS_DSCWi%ӵibŽcid*ላ4v!jr#1Q4> endobj 281 0 obj << /Length1 1587 /Length2 3300 /Length3 0 /Length 4301 /Filter /FlateDecode >> stream xڍtT[5 Fr)*=MPz&XBBI  UEp&E R)@zoe${fsfL GrID* )PtHyPC !C b . ID RY ՟DY pZ0&A D\O&Ru~X),hydC+ɨxV$,JzιrOrDJ%P]K}@)8H֮w OŐAa `A"B#@2Xf^ ;;A)Gf"q+Œ<0D<@LTG0D&A!11>ƙA::ײ0 ?Qd"G!xljoaY!yzD*y>]2qD/1'8  nC$x@# RPQP@oú7 X{[N䦙!8Ћ2`d@)i`pp,p]D 3O&!׿ Ñ[W 74ձ!S[L^A@+J( ,Ծe5~ ;OTK` s4R @!/yBH~'?~'14*c3$~K3hQ1 "xj$Oq*ukb~^#(!+ug)em@F]Q%6WO`d?/y D2vm6#.Ȑ+UVMRApH[B &Bp Er./gn>?6奙flP^9XХK믠~o;;$! Bq_fK˷pXT9N4[,"dqzL>݆}[G,ĪIx5*ƿX|\B<5\}" +ʩӻ?Zj4 4ɱ?Sc<1za)wZڛ%Q^}-'é\Vb֗=vvn`u0CکTY3Irr>鷾#Zb&Hsfj>y92;tmJuKG5}vM5&~])%x9AT4CՑN  %q\jG_9u4:#C'ҭ L}R_$*E9d&e(9ݞa8*3T_m_mj{IwwB-Bƴ:k5STɹ$*{3Y≖}_Úk5?R'a0uaɦ[ Csw:Kr胖W} $?w]5)*yTjN$pC‹u-\;ˬax&n9W0kL SY^-6Yˏq8$<="+1mqr$c.^s%v,gK4rJ8v*G LoSVal9"4xCRFBY4"Qb)=/V?FYu+A<} jء#'kGNVjSߟs30ʠR lp#;-6_:VƱ,GZzХ ֘'7|>'<mM5`*8<-Xg"=~ۭe}.!}z;w`LDs^qZjK9gv#)Slޱ/`F@6;;u]\;T5 h3zO%^'q\87T*ht.WpZT"ݑ2]9|>5'K;#C+MN{/.ު#:l)FNv q'!3:#,ߤܯ~<,$_~nMU2*N d5e݂m;Φ8nY^sZ:gqUy^Ozd]I_BWeHmZ7{ύ<ӻRQG 3؟? A 3}vtnzJ4C-w2ˏ3tM%`P4g 93̧DDWcD/Րy  @}`GgL~WKqc VK pIeߖ;'#Dz/y,`\[.t8j-zڼrY.2X ^#Y&$ݨΌ?BDz-]\ۜL/gJ 5|i-0GH籫O.aEq9hBqsH{')Pͅ\oVŻr#c[2'uh z}!-Vf=cO)nJ̺ZS ݿ~~֪<}W0><.Lœs{>Ƴ-!%NWbO endstream endobj 282 0 obj << /Type /FontDescriptor /FontName /HHEDCX+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/M/P/S/a/four/i/l/n/o/p/s/t/three/u) /FontFile 281 0 R >> endobj 283 0 obj << /Length1 2511 /Length2 11182 /Length3 0 /Length 12616 /Filter /FlateDecode >> stream xڍTT tI -] 03tHH7 %4Ht )usZ.7lP3) Vprsrr뀝mA_PҎ 3L&t٩B!%[_K@)?C0@ 4le ߿&sf_I;#Av0Fs-@j9{'0;Ήhvh@ j@;ߕtN˵n@G& N0#h+AU6`;׿ hnB<+%PSawvwf! NP? aS#ى lDa`]XHC@g'ɀA氶{p=Y C,,abϡ ;e1eV g'' '[saK[ j[`< Ol 0Y!hab6|G;{\? ^Pǣ_PPЗWauRRPw'x7ȿ@?q>SXBBWkpg)9fԠMߘoG[_j?j"8ÎB ; 5}Ȫ *:a! `'9;Bln׺o`Hqqrm`O'بR`_FY9q@4Nrq<`irk3` uD=P~>oH!2H!/p=".#↭#p(>"~#>"#a|Ƨ`|ZƧx:V#="Hxa @'Rl t~eo`9m@V<>0z,9[bgu(A`va.,]`Y][ uqfb%e" 0e? ?r}sN=>c20g԰bհ`!?GA šcok daGY\0-uх7B>/ ,'[!` UIRJHdRs>fT}҃[XJ97!90h:&)KH4*П#{u#? n:$LlHF4jIx-KsETjc:/U?cy:Kzxfo9Wp}Nf~hz YHwIsMx4CϠ j_Uʆ+B7+Y3fN#E[T2kO't5Fu,N1OI9TaL!UHDELQx2 ?rxi6Pu0z2p5sĞ[O]z f͖vJh;R 1Fn2:filj/p pP˄љrQwHb@B.c[@lQx߂5ౠC^SH72VT4 ߠE܂׉֔uY#1$ wz\{1wb!$1zi ~BPu<;I6MiC+ꃂeT\G:m=ր?K +mBE{SDž^V,eLlrna⒚tGm 6];/IJZn05 F-B|ri' Ձ LO+î~}X4{X0&Y/c.'#ϲuujd֊_fKęΤxҥ dܾngkH9mce~?׮8Uw|_C)жwígBA5dcSwk.U<7.j3M`Ԯ#sQqbXi muɁ*Q EOH䥱I#r]ӆϞ7zVBD}Ѳ1NIG 5wƇͶ* eHgt!IĞAATofw";T'pˮ"]y-癆\QhgVBN(GQs?88~F}|Hw@0_wxG6&wBZ]FwYteIprv ).ͩq,ū,Me]HeG_G%g2PɨPA|X3N3f uMM5RnfIђ2#oF)@HTXm"gMP4"dT<\9*jLĺ6.~E&٭YoWH=ѥ^'κ/3wӮyq𒩤3 ^T|-9łs\/FXޣdkE f򔨑rx 1~5%z1ŝQڰDaU^SXQ&ۃ ;Al2g _1\A)^f l1|ֿpQRyMU}ei>kD=8A$15i >/]_d{V_)T+3K\k)mhOHǷM.C!//42ubU' -M!!c$ͽ Yko^adQ dUy]Ƙ9D7}Ic;%3^nPɻGU5R_*o3[68, p\ueҴ_0;{|V4#D{8=q(q#sF+-;=ڼ q$ʖ0BHvGwM;Iw:ɐh]蔗MM/Z :Řp⊷сprFΓe*w:eu!3[OXG\k:|#b^mx Ro59V>xCxaZԼ;3"^ B>;RnW ,}2@=/TF ŮƲM3ZGZyfB_d4m躂'h[B}eoǁʚ_]լI36ۣL*?O4TG:tU1m|5,5)kQ}:[Y1^F)HoS> ț86 +$yk{aHVG;.*V6j'Lgr1kj#nMRdŎ[' E-l~nS[~(Up/[*v2КFӆ")d%f KjQat55qsgvmh27?ҧJďw![@;O"-Ģ FT| zB[i|K݃(޾R_@r]5ZϏBX9q]IGzg")r„y!?f zWH׊7aM$MrɽPQww7x,951?G=">zzOe J(y4W{Հ~- ~gL#/|d?CQ ^b :μ~C99u.n c:hſl "C曞~tw+PR#bZѠo@.xae!}M ^'˧+y\93kw hWͰ+(Um`26. I>eoRCKj?(.Yܳ.ŔdRIq"/`P(=G `I}؆F{r:]ܬ}E˱jS*bMFX "ӊp,;'gs \݊W5Q^#EYՃ.2삺Hpk3SGf:(b88{33ʘ^Ym߃%JM唂!S>R׌4qn>|;q͙CsUPjl}|=r4il: t 0|k-G׿Q]&!yCaq7>JFuۛ! ZauHDr91o#/lJ& (r~ZuOHv 2"5|Cщv͹ nʨ_3wչ%iuj4mIO}nJƼCX,0r+D&,RyMY Җ %bޘ_zߊDh: *j楇Xx{]>1ZÎ:T*ۤddr&PcAO]w7{4g#n c1$EP\,bP.U4WqK'F.‘?S.EiIY4Y}}y3!9U5OMM€}[% І,-Q%*NuX3kF&pq _Ȗ_mĨ'/_L!=!]f`fI T, 6`JӥXD?ƚ*\l-P nS̆_a"QSЄdEt\mwF"g\Fy*+p)|6+u]KwJvJRr$=Ccj,~/YZ G(MǨ jzr?? fS:ŭ>>W`p ?2wq$[1ۅgzsuv.+NsyE]OZ=#/?d٤2,j;|{؟ i4ldxn><%0ȀX*wǾMl[: |fs.FMauogj+NcZoWp:1EuhmES_x-u''edģzp:Q5zI٠YKJ,87MϭޛS*?e98a\FA¨ZTh)O|H:Vkn^ˈ}>\Dg=8Ek&>ExU(d6۫C^ԙ8Ul>9{-YĀ/Ębl&~8oWpIݳ0t4h-uiB)R t%Df}Ԙ_*HW2S/p${f1cjK {]0հXUeG6p.L,98٧ [r0&_MtɚZ նqmv*Nf{aPܸZF-DP}+,&YZ^ ګȦiexF"_oR{H*ۙQY }\!%~?Κz5N0 QN?+=Oruu?QM"e20FY`bg,Q}VUu6!U|BR,,j pTU;l yU>$ƨ`|D›~wb?GŌkéD<A]!K"MzTUD­EVAEp!@zΒ[HbɷeFb_]Wo_d^y!d t@>]~p{#[k$b;{8|䏿FcG<LVZٞӑCZAP']&_S:;-<>Q!nJ)jƱ_"x+Yxy'3AG֢huz*9FTz|( gĭOb"lņ7\{ܕ_m$Vdɭ>:ܷ lu;@2_Oy9&H8N>fߓ*XS$^odJSϏ]'@L{ìypn#]'ZXG̰ :Ok@ e̲7le849oӍOs\ώ~'OrڵE>jFIF ȿ+kO%m]a{^ v .5A͉6n^  \Xm0-AX~σ|e>N yf+YВ"}ߢ8FDzv':~g'}IxLszqGHJQN 5H06a4Y|Hos 5utof%{UP3cIJ˱^OaB5«uf s[ɸKV'GLwă5 qn[WcZ}glG)OlB]ŢE7k3 16rK1# :wDeUWA9)$WNti^J)`|BZ  톆r…/]hEk Yu9 OB y9YSv--Ԁ~}<~]ѠcVMcj1&wZJ7d Ƀ|T.+(g`~k}BZUG}GjE\R|-OmUdj3ce:Kϸ'B~) ab 'R\YxMր H6OSʌ2ST WKʐhɔuB_L~N8\&n-ĔwYvTǜnB 7o E'z9x*&1 ii(ӓGM4I_MK u4*sem~R8WP <#Yi>ovH;:d(:FCt3eJVƒ׈l^Y`EqTO'^UG+D#^*q􉻻VΞ!>>0.]cZj:\T<^2W| Iwǥ+T8ȋ uʚ]ϲ,6 iˑDvZpύ] n#KA,4ꩦojeΥxx#&1hFL-'C+a+Xr>"TW)vdyǿ :wh%0gy|҄m\A7&>.ٽ9ezHQ"4[<ě8?_ټՔd*F;1JR r_NGP_oZ i%*ZcB!>=9f(;maWL3\-Luk< ў=,/ma;L)Υw5-,Qv/Gn-Ij=KhA]A4k%rOTTe6?aX{w١4tѓGs:>¼b0ր⯧vCCGYKhY @;Ve2= ͣy7tAf(t;F1*L| )4Z"IhEGQ#jc{KQ ƻWU6R>(M%eq~ N훪Rj QxB"J`3U;ACPAْ fKRW=5ߏg|cD?PX{u-zhnƘqӅ cn<F|Vx%×F*eDk2f -1̹snSmN:룒DQPzZ>#xwJ@zWuBX>5!՝|kMĞ4'.:w՝˺xxZZ ͥ\/s o۵3;(j#lڞ~{LE#)YICk+60lIuʅx;w]W;tO 2ɮ ,98֋0a_.D5ލu!Iot~fG*FC!ܢYy<`aIW0񨆈n.}{=&h֏}OdSFM{ꦏwvUCq ^ޖq*~xZ̆D{䨍cT]ɷSda@,]h{c4n$YspoT3P Mmr}T0:VGܪB&f_$Ret b[~Z͖4⋪PR?x`iZj#s g-ɩp}AGV<{1%E͟0-|мT4 5 Py.[ endstream endobj 284 0 obj << /Type /FontDescriptor /FontName /HHXGKT+CMTT8 /Flags 4 /FontBBox [-5 -232 545 699] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/A/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/W/Y/a/asterisk/at/b/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/f/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/quotedbl/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 283 0 R >> endobj 285 0 obj << /Length1 2135 /Length2 13078 /Length3 0 /Length 14365 /Filter /FlateDecode >> stream xڍP-NCp`=[y'zj[ݽWڻ{CE$bjg ufbcf)XY9YYّ֠HT G'-A@W85N b `qYYhM Y;[#5&t6>>?Dl@`-@lyhٙAEA+hl qbs4Gp;[TAN GW)E /eHTu _v5;3g7#jl^Wؚj2%{_03?tlb=lk0[JΌ@k'@W hg@ *oyN&`{g'f'Yye [S1;A&Zڹz f0ug` vpɈjBm39XYYy9 Ăzu{П?ͯ |f"@>`3pvtx ` 6qH_ ;`ϓk{Z{|YeUEROT `bpqx>MHӪ ]o>[3;_ ^?*\n ڿ^;z\&_l[n?7lwk#8ho&AV]l+ |[s$ v*M,l+5l0uL^oףz(akbgԱsq@$bx)Ͼ09.9"q\?L!o `X$#6o`8,27E7z͠XAWNS7Fuj^3kx:vF"&V׷ٿ^2qRn6I8( ǫBS;kk"^Ab_՘ fH,<-^6FWUֿ%gG ^zC jXחm'ֿFؿݿU3_9^,Wu*7lnw|/7dU/J'92qq|E:d@ w ov&AAw"nL_fv5蘼;v<'d;ފ$alK/={6%?z?ƫN#-N},:'^:1󞫕N=:7X^) ^e%QB 9t,LR %<w_L!n6츚/8['`L>0&iw׍2( *g;r,݋DZWrӱ2? KDΙǰ{ 3O> ;Bۓ// tw3mszg 8( >4|0Iz2B7elP87ywT6M5U͇Z^WqH1|K6+!.]Q i>geSo80r6Buz>m| e%ƽlVCdNC*mgG;WV%cM~=ܩDQ LRƼюF=;k,uקw}7Wл2zBs Ga b g w֩45$+* i*G??c.;sU`y]qjzeKLOqcw{)7V0~:)_88̣~pٰ鉱ʒE uD8 w\5 bq 19K|] RN)Zb=WU921Na]!j/B sI)bWzO=H!)k7$w}ע6BnL;>%J}Cڴʜ#2nLzYo<(K9">ihUzАN|Gl*ͮz'|x{ԔIc˅I˸Mx&Cg%m|ael; mgrJ'`Uu= #nUwLא$~pۀC(`#P! YcN9WIVyLpfZmd`Y{DDdSQ_S/Q}X8 J]bG'OأS|]gkzzw{e6鿪{/4K.q畽?@+ܨ;t"<['~G)A]lu$j5}l*%RX{&8i)Ƕ_$*yw0lM+b\eLq/[C0 F`=Ҋ+!ͅ|v̀j҈U/F ,R(j-bq{)}l'n8 nr{~Mn[{k醎t}Xj-[ƈoSQ3:}-jSGw/4.ҡJ3.qb}o|co ;Qa0/y o8}9΢dyD72 2*pF z}\<cB:2e`@^^o nV܈fYc߄XB*{lSٗ7~nR"uSE59@̾}c-Vqv~8\bD4m>P#eGr vNEҩ&eF<Fe`vƭ̤'t 4& !wI4dg"Ƀd^3xVv̀5ZBj*tdy2ڥ9 9_o"~9Z>b$@~ }NY{2 =05T9՞YQyuBiKWRț}cbwX4)%_0sp%K$>NFQDAQ:Z#.O-¾w_['&RgWcք4H:yH06YϳI-s0Y\d?;%!. .ljD# !ҾyP?B \t Fp Yr=NZaCr S}o;,^z)AK6;RE(oNȁl YiH߂aĒ蝙MZI)<6 jxVN Ӊ4f>[M>hMm3z\w_(%wiq{@NQa-hnejr_|3ΆydkX Z=*N$XoX^9;UOe$ozZo˽JJ ϫ;`Rmd}t)V\FOc W6]9++Fx>7pW\AuCBGwpB#= ^Ar˱ƣr.]ol6_;M<!{ei%$xdLaN}iJoϫj5_ڐ+Tӱ5hβD;j@a`\]8)k}{YbPtFQ_k;T/~:.Qa øc}1se#Wm0:O0  sHVP5<:|bsߝ'2iAD 7hy֔ԨX |?<y, 4s")iFTfq=U"dP}Dެ3H==b!ӻVDe]JLGbz%df:u=IRʦaݤ(+QF^H؀,[K| jH}QQ,)MI)wYݠG 2>W)y~噀sNFyTƟ?^,a0!2_ &9N"%Tj.#Sn ;IQR+ϱfx6Qb]ZMUٽa= P퓾;`cJcllyFHm xGaxz|li9.OŌK/7e5+s  ï|. N9"JZw$#lG#4\>ʳѴx`NvՄg|v |ҡT R&^԰4 > ^.(*c{ ?IY#3+kW}}$P)EBWɮP㨶BeOp 0M8-œ5LnTu\ ޫƪbljw1v >Wx\yv{2%S{}%{"ݸęX9k@_53ƁN^Ѹq9^ܼۆz4uŧg:`*rJ8wA oυYDy C}Va;$tM oއTiNsgZmFM{(-3IO3Tf+& m?*mödUÒ ʝa T}hb8* k\\aHf(E,Gm3wTeYn`YY̓funV玪 ݀z街E\>sr1i 1.<93jebmqk.0WrzWCY?-6 j kù^M>L=(z(()jǹd;ȝ֠"3DZЃ :ֽTD*t߮ pX~|]%(C}d(:&fzOmGD H .IIB"je$jF}/mak2qtGD|`sM_”CGE)eɐ8axFl8ӧN:6R[ȞP ڍhɼSN<(:Sm>`ii9TV_HrH[+XUz1 $T0+d4ʊFmj.fxɳs;WBn6Ym50vSґԕl (>n8tǘ8'0̈ݳ6 Yh#DRL8/H8:4/ ,tnfZ넸t]^YX_Rv TT60hzZr[J ! x.D+q `Nt`HVYMaڳɍ/96()إ κMŞOÞghA6@M"WkOUpkl#~ԤNTJvy1dwH, *t]i-տ]giw~q][N>"ou-!>"6^X@nMDCi:UXQ#v jzkv=MH({)cNgW)ǰ3#?n:$WJ"$ =¡;IW87,\bD!n]%oۙL"o /4-EeG~(scp0ӼI5@f4 :j^0?M.xwR<4N+_S[ \[s̠|jG5b2O# װi,QpL}N;KwhX0eqh.ajx%J[\ä,[Ysu'qj_ҪR]^uk"J^KcFu Bzy\=έ h|M9Tx} d S{ͿЁb`r|;0kZE qf` AJ8(O;r藱nE>}ě~Sh(/a)[l PiQjĈ=f9 7{)?JƎ&TE&˧Hiٖp+=KlSn"O$\骴: *s(&Nt$v[M^SP.1\:(\ayEwdk>Vdqd]ڊS2i-rkD ''g:87m3+wU;W:_<ܥ4TIR(,RVQ(n+E׼ cF`VglcSw"Y)^b)̚n_rي:2>cjh*~{TP8`:& /yPz-L 287eidkЏ@ml[za*qRΗdT÷ЌQ5zeU$}ʜ-Og޾Wp i .*N;׿Phe MG^ns'& bT2>i,E7OIK!(ZͰ!=42a^3vΙ"LLJB[_\#g)x-> "]$ؐ?6}_?֨۳ϰ"=$@zyOղ3 q0V.&;ayNqzXBC!?[]zG* n`W0nE쳜]'q%5`3Y0A~po,DH`bӿ5_T:]Es̍ly :~S;:5NFADž$:sF="nw1u@ƌqB"՝sq ~=Ɗ}ÂBs+ RnC33⇃L8|UʷK;.mЮޙ j,W? |h B(i8a/Ժ4 AtrcRF]zO|ȕ;J&`oYfQЂ֩,hנcǓf9#Dx\ dKmзo?$!ߕUǬ|Yڧ( 0#whj `|V4{zgopvzٴ]/7zFq䘴=X秮m҂tbIl,nmOsN[8}A?J4x"YGҧWJ6H/PZGlZ>q~'ҡ3F +:%b޹M nft"svd`O2M.LJM"GXM's5Um\~?@:Z~ny6?|{i=drmA@tn- ^AY}HWTh_✄kԶM1w^e 'RC`kҚkx\vOldh2> F:/k{Kڇ B& >KyJ8!*S=>v [y&|Nx.mqɶ 6q(ƥ\uX+R|SG.%^zy\=1p!2#Mf5렃Z;æ%b5.~0i+1WKش^a /,@糠Q䡵:)@$%&('jjJ*~$k`DaOP݅r]:""UVO|ʊfB]9.bR&|Ш#"XMB*zD1t֏+]NߟSλ̾[FMx=IO~i|4Sp'z$4=C V79m 1*IyF!cH)z:ژ/4D0R 5o=+`3އޮVn=0AxKa1߀oZWp߸F' 0!LY"wpihib-O4a[ lFFooWN#.9|hu$1O^TXpTP{ ~BҺyMV#7_$qI>GpVD3ƻin,J*G$S%m +-;J$RN R`s/1 8fܮ ކm%q'X@ ;݀@TcO3r: &^םUm.8Yx2{}@\8S9 3lZFY8 49uBlQWC*^&(:sϞ/+Zu J#Պ 9Ծ:iAN6,ޕYK[/ *GE-+?%;߀6n/&,6z!kuw7[ 32Q b:hޔ qO^'9aw:}*Y5_`clmS1a$n7.֖5%2af+/Qw}Co z5IWqTݮ#}օ޴YhI 1Q $/%IJHFn@}'wiKƱp1 Gn]=fl sxMv-zzȵUbowAS@ŕogR| *1y( ېTivfĬ-R?5<};=mʻW}WS3\Bk lgF~BSڛ䏄W_j4$)sR3僣iz PR!-Oޫ²%b&]or?v$!ݛ/0k_!VDt5^јIVviv"[2 |{vַ@- wkۧ>K_1;^-RF1؎o;\W[~CfՀ|&HȭnFo1mMtzf1n]}7*i(ܡvv*Y#8>Iu30ri=O!`P^ Ձy-z [s1FR1jgSqXs&ILf\w҉ӌݶnfU ;-A$a./m hx\e t֞,mS k ]g8WDڐ~ &V~)!o6v"S8 &a>, B֮JO)_O"ӨC!F|rAiR 4h|MjܣG󡞤.L/W ;'퍹ñ6K \K ˴LLs&V94oC GD&̜:É]pRrJ*&EnqT@4ղ7L<6{vr |9C['S_jӵ!>GHuNʻw\_r|1؜ +sn]]+. @.S.K6/]AN{Yw mz&j+3ܷKL9e WT24o#?j Wf <*<26V,#Wf(RjJ,Eb~BNGʴ9^ νc{Pa&-oVsMC<㹇 Mf:d, Tۨ~_<qdǚ"(H撋3c`a qG{8]*-l[9?TR|0Y b.,ؼcj* p.g=?Wؠí]\l1%nc[WXyѾq{Bs2%]S>ߦgb<wў @^ CMDfYfqJZN#BccxV_n$![O]r8]'(|;,^M өSQ+a*.f?<"Z!vYQ5fҠ.5E7P@zG[9M[37_7a&]pnRav1l;󃥙53({~Xn$Wœ!g|]Yɥ D[l6ɋ:Oş娪bC.馩}I>8%q!r/-4#֙*puUCZ)wg9+asR$,Q? Ls;|1NJ>,qYu:_ΡB7 -ؽo;ޯ( -rcf:]I[Hl' (J;{z92we - Z\^Ӈ=O7wZR#N=:*/K[4r<-3\Gjܖ$ʭwGJQ}bw.~1$?t%7-v w'R #Ke EPk2 NJ?*Ѹ4e:{P cp?zWh,B [<73Zvύ-8x-I +>0GGiV3~ͥ@s|jyovA~ >;tQQ>7RQcP[X }8$J3ZAQ'c _wǟj֧ܙ@|rKpPL^;gӛ8 Q޻(sGhz֖vjZ@1Uӂ7vߨ6ks0p>HFɠȿOQ>"@l54D,~mbW,%kӧƌ9uR:9R^>_<+ yLůcų$kD56af"'zݳY?"S3>[n/1c7`Uu܈G£~Ĉ7ed`yB*l}%"PHk6u,oqsv** A@H/WUJ&mQoG [;y|*{U#ä՟%NI$J85AN6]MX#gtt]P>fs&|2|oZwV6ɭÈ/[1*%;jT\9[K#MVCp'N7S^Ov^=3P7_N.sR!tQ:K$ջŘѨ ?>$]̡YlRkЩP"]J:6[*+lL-ܴLT;o{k>HzJG?O.Lc\HHg\F-`xcH }{/brC?=b=G %sJ$RAY(X?5(qrV|(=Sjf=LR=P-sS= *G({1ە5~|]1eQϊag;iyfvd޺?m`uŠeΦGi'Z 3P<:auͭN|A#~ag?{ r4}w#b۩LMVӮzPUVF׬he):{E"g4NREX:ݬCniD\'Bm_.bՅ*Kʸ߉ce#ȡ=nLȨxt;$I%ܿikP3‡܏STKP9N!2[=B|Zy][ ɻF&K5B9,QN*vqϮ"JfJWPSq0<9  ,HƼ۵K)hV)??+CZ$q$ץ Ӥ|*Sb-җH4#7+DΉO$_1<' xyf& 6;,2PR3v|LE+oP#'+o7E2_;O8 ݍQ7W~YaI#Hpkiv5H#i@(2P]B=c1K6ې\93]aCb[*CzTB")~iR9&EĪ`--9.H1 ^'g$A?@9, e_FNR1&}|IOޔ?P'Y7gZ-83kL&QK-vtd3E }LS+fJa Z)k{~(y<_i 2r̶FrqT xI0Cj`f=Eb J_ާAbo?|+Sv֊.7ґc}wt#{0++ǂ@s!> n/P(֤BdE2o4ɳ=Kcы %@{g2:!z*a1u{{"-RT(Nz8='ru!b]Ӿ4# p>}`6Cq+D'ˁ3b5g=y%篙%X_!m2#qu1Oau"8/hwZRf֗eo(ƥָK;yhAӥeU{e7Sk3  endstream endobj 286 0 obj << /Type /FontDescriptor /FontName /PIHQHA+CMTT9 /Flags 4 /FontBBox [-6 -233 542 698] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/A/C/D/F/G/H/I/L/M/O/P/R/S/T/X/a/at/b/bracketleft/c/comma/d/dollar/e/f/g/h/hyphen/i/k/l/less/m/n/o/p/parenleft/parenright/period/quotedbl/r/s/t/three/u/v/w/x/y) /FontFile 285 0 R >> endobj 73 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ODFHXP+CMB10 /FontDescriptor 246 0 R /FirstChar 97 /LastChar 116 /Widths 237 0 R >> endobj 70 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RBFGUM+CMBX10 /FontDescriptor 248 0 R /FirstChar 45 /LastChar 121 /Widths 240 0 R >> endobj 65 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QOVYWB+CMBX12 /FontDescriptor 250 0 R /FirstChar 45 /LastChar 121 /Widths 244 0 R >> endobj 209 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TXWKIS+CMITT10 /FontDescriptor 252 0 R /FirstChar 83 /LastChar 83 /Widths 213 0 R >> endobj 86 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RJQMYX+CMMI10 /FontDescriptor 254 0 R /FirstChar 59 /LastChar 121 /Widths 226 0 R >> endobj 71 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DJJLRR+CMR10 /FontDescriptor 256 0 R /FirstChar 11 /LastChar 126 /Widths 239 0 R >> endobj 67 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QFGACL+CMR12 /FontDescriptor 258 0 R /FirstChar 48 /LastChar 122 /Widths 242 0 R >> endobj 210 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WIRDCL+CMR6 /FontDescriptor 260 0 R /FirstChar 49 /LastChar 49 /Widths 212 0 R >> endobj 206 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EJASTL+CMR7 /FontDescriptor 262 0 R /FirstChar 49 /LastChar 49 /Widths 215 0 R >> endobj 75 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ILEUUF+CMR8 /FontDescriptor 264 0 R /FirstChar 12 /LastChar 127 /Widths 235 0 R >> endobj 85 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IRXYDU+CMSLTT10 /FontDescriptor 266 0 R /FirstChar 33 /LastChar 126 /Widths 227 0 R >> endobj 83 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EAXHAV+CMSS10 /FontDescriptor 268 0 R /FirstChar 82 /LastChar 82 /Widths 232 0 R >> endobj 208 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JEVMCT+CMSSI10 /FontDescriptor 270 0 R /FirstChar 82 /LastChar 82 /Widths 214 0 R >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UEIZYW+CMSY10 /FontDescriptor 272 0 R /FirstChar 3 /LastChar 3 /Widths 243 0 R >> endobj 74 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UPJTNE+CMSY6 /FontDescriptor 274 0 R /FirstChar 3 /LastChar 121 /Widths 236 0 R >> endobj 68 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FJSKST+CMSY8 /FontDescriptor 276 0 R /FirstChar 121 /LastChar 121 /Widths 241 0 R >> endobj 124 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UMFBMN+CMTI10 /FontDescriptor 278 0 R /FirstChar 12 /LastChar 121 /Widths 224 0 R >> endobj 72 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ISGBLI+CMTT10 /FontDescriptor 280 0 R /FirstChar 45 /LastChar 117 /Widths 238 0 R >> endobj 95 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HHEDCX+CMTT12 /FontDescriptor 282 0 R /FirstChar 51 /LastChar 117 /Widths 225 0 R >> endobj 77 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HHXGKT+CMTT8 /FontDescriptor 284 0 R /FirstChar 34 /LastChar 122 /Widths 233 0 R >> endobj 76 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PIHQHA+CMTT9 /FontDescriptor 286 0 R /FirstChar 34 /LastChar 121 /Widths 234 0 R >> endobj 78 0 obj << /Type /Pages /Count 6 /Parent 287 0 R /Kids [42 0 R 80 0 R 92 0 R 101 0 R 108 0 R 112 0 R] >> endobj 119 0 obj << /Type /Pages /Count 6 /Parent 287 0 R /Kids [116 0 R 121 0 R 128 0 R 136 0 R 147 0 R 156 0 R] >> endobj 163 0 obj << /Type /Pages /Count 6 /Parent 287 0 R /Kids [160 0 R 165 0 R 169 0 R 176 0 R 188 0 R 193 0 R] >> endobj 201 0 obj << /Type /Pages /Count 2 /Parent 287 0 R /Kids [198 0 R 203 0 R] >> endobj 287 0 obj << /Type /Pages /Count 20 /Kids [78 0 R 119 0 R 163 0 R 201 0 R] >> endobj 288 0 obj << /Type /Outlines /First 3 0 R /Last 39 0 R /Count 6 >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 288 0 R /Prev 35 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 288 0 R /Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 288 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 288 0 R /Prev 15 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 15 0 R /Prev 19 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 288 0 R /Prev 3 0 R /Next 27 0 R /First 19 0 R /Last 23 0 R /Count -2 >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 3 0 R /Prev 7 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 288 0 R /Next 15 0 R /First 7 0 R /Last 11 0 R /Count -2 >> endobj 289 0 obj << /Names [(Doc-Start) 64 0 R (Hfootnote.1) 211 0 R (cite.R:Chambers:1998) 90 0 R (cite.R:Venables+Ripley:2000) 89 0 R (cite.bivand) 87 0 R (cite.braun+murdoch:07) 88 0 R] /Limits [(Doc-Start) (cite.braun+murdoch:07)] >> endobj 290 0 obj << /Names [(cite.kirkwood06) 105 0 R (cite.page06) 106 0 R (figure.1) 131 0 R (figure.2) 145 0 R (figure.3) 179 0 R (page.1) 63 0 R] /Limits [(cite.kirkwood06) (page.1)] >> endobj 291 0 obj << /Names [(page.10) 138 0 R (page.11) 149 0 R (page.12) 158 0 R (page.13) 162 0 R (page.14) 167 0 R (page.15) 171 0 R] /Limits [(page.10) (page.15)] >> endobj 292 0 obj << /Names [(page.16) 178 0 R (page.17) 190 0 R (page.18) 195 0 R (page.19) 200 0 R (page.2) 82 0 R (page.20) 205 0 R] /Limits [(page.16) (page.20)] >> endobj 293 0 obj << /Names [(page.3) 94 0 R (page.4) 103 0 R (page.5) 110 0 R (page.6) 114 0 R (page.7) 118 0 R (page.8) 123 0 R] /Limits [(page.3) (page.8)] >> endobj 294 0 obj << /Names [(page.9) 130 0 R (section*.1) 69 0 R (section*.2) 207 0 R (section.1) 2 0 R (section.2) 14 0 R (section.3) 26 0 R] /Limits [(page.9) (section.3)] >> endobj 295 0 obj << /Names [(section.4) 30 0 R (section.5) 34 0 R (section.6) 38 0 R (subsection.1.1) 6 0 R (subsection.1.2) 10 0 R (subsection.2.1) 18 0 R] /Limits [(section.4) (subsection.2.1)] >> endobj 296 0 obj << /Names [(subsection.2.2) 22 0 R] /Limits [(subsection.2.2) (subsection.2.2)] >> endobj 297 0 obj << /Kids [289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R] /Limits [(Doc-Start) (section.3)] >> endobj 298 0 obj << /Kids [295 0 R 296 0 R] /Limits [(section.4) (subsection.2.2)] >> endobj 299 0 obj << /Kids [297 0 R 298 0 R] /Limits [(Doc-Start) (subsection.2.2)] >> endobj 300 0 obj << /Dests 299 0 R >> endobj 301 0 obj << /Type /Catalog /Pages 287 0 R /Outlines 288 0 R /Names 300 0 R /PageMode/UseOutlines /OpenAction 41 0 R >> endobj 302 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20140409193630+02'00') /ModDate (D:20140409193630+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 303 0000000000 65535 f 0000000015 00000 n 0000010295 00000 n 0000340153 00000 n 0000000060 00000 n 0000000114 00000 n 0000013113 00000 n 0000340083 00000 n 0000000164 00000 n 0000000210 00000 n 0000017350 00000 n 0000340012 00000 n 0000000260 00000 n 0000000307 00000 n 0000017411 00000 n 0000339888 00000 n 0000000353 00000 n 0000000405 00000 n 0000020075 00000 n 0000339814 00000 n 0000000456 00000 n 0000000508 00000 n 0000022490 00000 n 0000339740 00000 n 0000000559 00000 n 0000000602 00000 n 0000027561 00000 n 0000339652 00000 n 0000000648 00000 n 0000000703 00000 n 0000066640 00000 n 0000339564 00000 n 0000000749 00000 n 0000000789 00000 n 0000084651 00000 n 0000339476 00000 n 0000000835 00000 n 0000000895 00000 n 0000087288 00000 n 0000339401 00000 n 0000000941 00000 n 0000000984 00000 n 0000003649 00000 n 0000003839 00000 n 0000003990 00000 n 0000004146 00000 n 0000004302 00000 n 0000004451 00000 n 0000004607 00000 n 0000004761 00000 n 0000004911 00000 n 0000005062 00000 n 0000005213 00000 n 0000008948 00000 n 0000009101 00000 n 0000009254 00000 n 0000009417 00000 n 0000009578 00000 n 0000009745 00000 n 0000009912 00000 n 0000010074 00000 n 0000005543 00000 n 0000001034 00000 n 0000005364 00000 n 0000005423 00000 n 0000336104 00000 n 0000337672 00000 n 0000336676 00000 n 0000337953 00000 n 0000005483 00000 n 0000335961 00000 n 0000336534 00000 n 0000338240 00000 n 0000335819 00000 n 0000337812 00000 n 0000337100 00000 n 0000338668 00000 n 0000338526 00000 n 0000338810 00000 n 0000010354 00000 n 0000008772 00000 n 0000005744 00000 n 0000010236 00000 n 0000337386 00000 n 0000097165 00000 n 0000337241 00000 n 0000336391 00000 n 0000093224 00000 n 0000093285 00000 n 0000093531 00000 n 0000093346 00000 n 0000013172 00000 n 0000012946 00000 n 0000010531 00000 n 0000013054 00000 n 0000338383 00000 n 0000016515 00000 n 0000016672 00000 n 0000016829 00000 n 0000017136 00000 n 0000017472 00000 n 0000016356 00000 n 0000013337 00000 n 0000017289 00000 n 0000016982 00000 n 0000093407 00000 n 0000093469 00000 n 0000020135 00000 n 0000019903 00000 n 0000017638 00000 n 0000020014 00000 n 0000022551 00000 n 0000022318 00000 n 0000020277 00000 n 0000022429 00000 n 0000024971 00000 n 0000024798 00000 n 0000022669 00000 n 0000024910 00000 n 0000338923 00000 n 0000027622 00000 n 0000027388 00000 n 0000025077 00000 n 0000027500 00000 n 0000338096 00000 n 0000030940 00000 n 0000033086 00000 n 0000031151 00000 n 0000030808 00000 n 0000027777 00000 n 0000031090 00000 n 0000037777 00000 n 0000037415 00000 n 0000037565 00000 n 0000039912 00000 n 0000037839 00000 n 0000032946 00000 n 0000031294 00000 n 0000037716 00000 n 0000034108 00000 n 0000034252 00000 n 0000034337 00000 n 0000034437 00000 n 0000034474 00000 n 0000034717 00000 n 0000061831 00000 n 0000061893 00000 n 0000039800 00000 n 0000037973 00000 n 0000061770 00000 n 0000058548 00000 n 0000058692 00000 n 0000058792 00000 n 0000058829 00000 n 0000059072 00000 n 0000064164 00000 n 0000063991 00000 n 0000062063 00000 n 0000064103 00000 n 0000066701 00000 n 0000066467 00000 n 0000064270 00000 n 0000066579 00000 n 0000339040 00000 n 0000068586 00000 n 0000068413 00000 n 0000066819 00000 n 0000068525 00000 n 0000070151 00000 n 0000069978 00000 n 0000068680 00000 n 0000070090 00000 n 0000094687 00000 n 0000072018 00000 n 0000084132 00000 n 0000081046 00000 n 0000071906 00000 n 0000070258 00000 n 0000080923 00000 n 0000080984 00000 n 0000077701 00000 n 0000077845 00000 n 0000077945 00000 n 0000077982 00000 n 0000078225 00000 n 0000084283 00000 n 0000084436 00000 n 0000084712 00000 n 0000083984 00000 n 0000081180 00000 n 0000084590 00000 n 0000094137 00000 n 0000087349 00000 n 0000087115 00000 n 0000084843 00000 n 0000087227 00000 n 0000092948 00000 n 0000090337 00000 n 0000090164 00000 n 0000087479 00000 n 0000090276 00000 n 0000339157 00000 n 0000093654 00000 n 0000092816 00000 n 0000090468 00000 n 0000093101 00000 n 0000336959 00000 n 0000093162 00000 n 0000337528 00000 n 0000336247 00000 n 0000336818 00000 n 0000093592 00000 n 0000093849 00000 n 0000093874 00000 n 0000093897 00000 n 0000093922 00000 n 0000093947 00000 n 0000094386 00000 n 0000094412 00000 n 0000094473 00000 n 0000094509 00000 n 0000094936 00000 n 0000094962 00000 n 0000095023 00000 n 0000095059 00000 n 0000095716 00000 n 0000096137 00000 n 0000096520 00000 n 0000096915 00000 n 0000097414 00000 n 0000097440 00000 n 0000097503 00000 n 0000097540 00000 n 0000097565 00000 n 0000098118 00000 n 0000098489 00000 n 0000099205 00000 n 0000099890 00000 n 0000100025 00000 n 0000100336 00000 n 0000100976 00000 n 0000101421 00000 n 0000101446 00000 n 0000101862 00000 n 0000101885 00000 n 0000102338 00000 n 0000110682 00000 n 0000110918 00000 n 0000126269 00000 n 0000126591 00000 n 0000140657 00000 n 0000140984 00000 n 0000143241 00000 n 0000143462 00000 n 0000151332 00000 n 0000151566 00000 n 0000175828 00000 n 0000176335 00000 n 0000185654 00000 n 0000185907 00000 n 0000192908 00000 n 0000193128 00000 n 0000200131 00000 n 0000200351 00000 n 0000218342 00000 n 0000218749 00000 n 0000238856 00000 n 0000239443 00000 n 0000246464 00000 n 0000246683 00000 n 0000253689 00000 n 0000253912 00000 n 0000261030 00000 n 0000261263 00000 n 0000268661 00000 n 0000268899 00000 n 0000276039 00000 n 0000276265 00000 n 0000290675 00000 n 0000290963 00000 n 0000302794 00000 n 0000303066 00000 n 0000307487 00000 n 0000307738 00000 n 0000320475 00000 n 0000320959 00000 n 0000335445 00000 n 0000339242 00000 n 0000339327 00000 n 0000340261 00000 n 0000340499 00000 n 0000340689 00000 n 0000340859 00000 n 0000341027 00000 n 0000341188 00000 n 0000341365 00000 n 0000341564 00000 n 0000341664 00000 n 0000341777 00000 n 0000341863 00000 n 0000341949 00000 n 0000341987 00000 n 0000342114 00000 n trailer << /Size 303 /Root 301 0 R /Info 302 0 R /ID [<0216693F84F58D84E2A34FD736641080> <0216693F84F58D84E2A34FD736641080>] >> startxref 342440 %%EOF sp/inst/doc/over.pdf0000644000175100001440000102661712321302443014111 0ustar hornikusers%PDF-1.4 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Introduction) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (Geometry overlays) endobj 9 0 obj << /S /GoTo /D (section.3) >> endobj 12 0 obj (Using over to extract attributes) endobj 13 0 obj << /S /GoTo /D (section.4) >> endobj 16 0 obj (Lines, and Polygon-Polygon overlays with rgeos) endobj 17 0 obj << /S /GoTo /D (section.5) >> endobj 20 0 obj (Aggregation) endobj 21 0 obj << /S /GoTo /D [22 0 R /Fit ] >> endobj 29 0 obj << /Length 1965 /Filter /FlateDecode >> stream xڍXIoFW9Q@JܚnAH=9JqKz6$eAə7oJlz7?94ڻzJҾd׋c8+l̚꼅n  .=6RO׿d5 1+.ꄜIoǃ+u׮~2d~ ցA3: {t6la@L!S@3vV}{ڑ-dukYJ ]iv(6eWG %_ ,)i Y(cU6+/N"} |)6e-p|߮%e˴W7%: Ev8sߊ{tO"i2,C\ *Lp5K& jRIzx!QS9x U`)?ˏLҕ:ϙcv9WS8QD=qDs) =%2J'{u)Yk@;aߊsU,ZX SoLLWC̎OrIx)\=$ L)CqdO2x')x՜F.=4( ctz%<.5`6]n5xxsY,k왅F@cDMq O= aLxC#6| E;&o:^D״J?CK45msJuKɹVjFb9yB^82'KL*s2OtR;Hv`D O@IM F& fžƣaBL!sn =ov4RS;F)Ҹ|8&cNc q 躡I*\hxK[[=iz MҨѝ.Y52F{TJ 8їpE7COCC=2L}`O:I{qQ!ENv>/0)fM\D[@اk9F8~ t|31CE&xRRu-kh,H\6]}l&|O; KlW$3_ƺm(+ۈ|D h(p"@8w= U΁C-5`˛ -4+JqB 7(eyD& >wjm)'FK1w: KSUY֎*doL8 =7פn2a2~*ɔ-*[7Xww(@/u:Դj`dԻ*Ga endstream endobj 22 0 obj << /Type /Page /Contents 29 0 R /Resources 28 0 R /MediaBox [0 0 612 792] /Parent 46 0 R /Annots [ 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R ] >> endobj 23 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 358.169 212.801 367.035] /A << /S /GoTo /D (section.1) >> >> endobj 24 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 334.318 243.586 345.118] /A << /S /GoTo /D (section.2) >> >> endobj 25 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 312.4 309.458 323.2] /A << /S /GoTo /D (section.3) >> >> endobj 26 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 290.204 389.188 301.282] /A << /S /GoTo /D (section.4) >> >> endobj 27 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 268.565 210.759 279.364] /A << /S /GoTo /D (section.5) >> >> endobj 30 0 obj << /D [22 0 R /XYZ 132.768 705.06 null] >> endobj 31 0 obj << /D [22 0 R /XYZ 133.768 667.198 null] >> endobj 38 0 obj << /D [22 0 R /XYZ 133.768 371.23 null] >> endobj 2 0 obj << /D [22 0 R /XYZ 133.768 254.567 null] >> endobj 28 0 obj << /Font << /F40 32 0 R /F45 33 0 R /F21 34 0 R /F28 35 0 R /F48 36 0 R /F53 37 0 R /F63 39 0 R /F68 40 0 R /F8 41 0 R /F71 42 0 R /F29 43 0 R /F22 44 0 R /F75 45 0 R >> /ProcSet [ /PDF /Text ] >> endobj 50 0 obj << /Length 3238 /Filter /FlateDecode >> stream x}]o}_uDKl@o{wKч>(Բ7'IYLbQp83o, ㇏V"/EU֙uqm|tP|ys^ya?&WwY3ob0pKs=0^=,*qe>2g|.Bt?ه /$=|F,(NR&-@(Y!q'.GDy%L! \iSfe^Q&.PJ7Gq Ѡ|Bw^>ȘV)g>F6F} e94〄O4#<+Q(ɋ҈Ƶ ?{jE{p~S u'~+=T\+}K0F5 < ^u@m0XOQGkٟx~eیB bVsضD)zJ=^%cZ .<$bgG>8g ws~!p6t'}ϊ8ee"#ϣ^!0(Ĉ"V $ \ĕ?QYQމov^hY.w< @IBm7y!ԏH\4wQp'7ne)g#ͼ+3gZ hGV{m6Duꖆ z"嚦4@O:zdvdՋ]ȏ0&JV[3JiuS_aOabY'n;qf~78xĺV!xtO%00"ٟbHpm?xEq.a['+ʗ̂?W# Ѵu׍c`5%_ =9|MN%0R`GyE%2*K Gr+)XO=i8xm"=&7),Rxyܭ'>dN8}hl"8  _4wٓy߅c4P-j4z{݁I9pJyGw@1(?bw@(PR{%?҆oh$ni\F|b; CEil>)4Bbn-җ5N42\4o %nFd%M;ɪ8UEī٢j;j1 1A"!L&ԯ<ÒWq3 IHteS Bu0I]eHSPTh˝ <4&IYYnE`ݰ֓NRpKYUqBid$oSHp&S$W* neA){1;zU,g-FfsB!2)u{110$'3eϳOM2ON7X0Qnɨ*=K҉/*u˹ )k+C8pJf<`ÊjSguR J5>ĴHHQ2I2' ލIuU܋ֱHL [}q{})"J,j7Qڽ-'\?sP-r՘Jcٞp%Mj9IqM~ ‹\I=52dJ$o;jGLр6ܺZW\!%?$T#4{)lH >Mvhn(o,>y6;/.w'UB]QUxUݖ׳1](F7, 1\(JqQ"Rh6rz,É&Dxp\휖] Z##u#ux(#4k߉ݧ+Z $۞j^|dsBS$a3Ǟt WaA0!iҩ+۽ߞËys9{6;x#Zt0.h{mtYQ6Ȥ>OmƷx{a|ɯ2+Mfvd@Z ȀmdHfyi QlA8e}3'ah`i.bBԭ ׾Gj=*ɕ\d祐Eۖ84sՂsޣڸ>aYtms澁_ZƷk$ўD0ҝtyLz]e,Wvs=JJi.mz~~Y ~HUܛE%՚[b?Wn( cu8tG+N5d1_F1rk)c{ޠ-**?$u#5:Qjm˱ L3ca7W+B^3,Uk%vaٷ%'$uK0Z[a"Zk*: VL׼5h -EIkPp->[e`a0w٬"1 &ra81aP `aA8j9PF?6%NrX>ǓLpw:͚ʛV9O T9'ZB/ YsWho;,:[M:Sjt83O |2QIU 5rUF5H~*8x\*~F1<{>ccHv&t +NUQZj6P\):.$5>v4 AzK2ljܛ2WƟϩM1gJ}z[(܄jB"3m_8(/+ߎm`Y JEo\Sc}IZv~QG$mπoEcTOYI}={ILB$vz{VP*rWȹ tsK{#tm=Os]l2d"DF߂ 902??GC )uԝ J^Y]A+&5Ԛw3KS)o&Ȼ.z?hҬD9r|y]H*;-U ;.;M6_t4pf~bO$tʏI0b3&]mcxHE ϱg~SurRWCAEwYj3?c|{ VEV.PHGZVߙT'_]V#i^Sղ+<@},l> endobj 47 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.772 209.037 139.746 219.876] /A << /S /GoTo /D (section.3) >> >> endobj 51 0 obj << /D [49 0 R /XYZ 132.768 705.06 null] >> endobj 6 0 obj << /D [49 0 R /XYZ 133.768 285.639 null] >> endobj 48 0 obj << /Font << /F71 42 0 R /F8 41 0 R /F68 40 0 R /F40 32 0 R /F78 52 0 R >> /ProcSet [ /PDF /Text ] >> endobj 57 0 obj << /Length 1279 /Filter /FlateDecode >> stream xXY6~PƮ)&A"(}kkl˰=}gC:Z>Ȕx!2X2x7^MަA&X6Pa(8 (:<FjX:Φx_~qhbތ>O~6EK;ß8N8 ,(1Il*Xfa=7٩_j Һ>H\B&Ck֖-QX: lF7yz HeY(nab )6{h6 ʈ̘h9.glBDeLBꤴZF\1Q#!Yf.hAg h7uDgtXNٴ(mXFk_I@tu~O1dG %(CGC!^J-/ X1^rp8-[`H#a}" _FHN5 x>.|p;+i]m#֑mTs~b{⹢d1ԗ"nCݗUIykRC,PlSq(re6T4>S;8c8/#Cx+Cu a2uGۼͬZ/9:!L]t+Wr"=]n2y/w}]SEk~g9cgglwksW [wՌȌsߑu8[!ٲ1b^0R~+w'98u|MϕBÎs8}F񔞭$-ݫAi&2f>?3Ƿ]|ǩxxa~P~3r) `zC/9.]w _.g$kJ-2- eAKG}ȴ~o]X}t+ͫjÕWtUF(e\R!ݮR%Y2۵E+LZrת\n!=z>Ui. 8Jz~zS"nr"!H* xOXI& cR^­L?(ڶPIJ,oarQ˦PUpZYKz@K N W ¡3eVlzvt/č{Ԝ;+쮠%v$(7^QYq=ȕҥǟv߂ܵ_wlF'ybt\H~1Yy֡T]>myK^]9I) _G#iam_8ۋ endstream endobj 56 0 obj << /Type /Page /Contents 57 0 R /Resources 55 0 R /MediaBox [0 0 612 792] /Parent 46 0 R /Annots [ 53 0 R ] >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [221.618 348.814 228.592 359.653] /A << /S /GoTo /D (figure.1) >> >> endobj 58 0 obj << /D [56 0 R /XYZ 132.768 705.06 null] >> endobj 55 0 obj << /Font << /F8 41 0 R /F68 40 0 R /F71 42 0 R /F78 52 0 R >> /ProcSet [ /PDF /Text ] >> endobj 62 0 obj << /Length 788 /Filter /FlateDecode >> stream xڥVYO@~ϯG[›=|"RZUU['ʃI) }gf:AT3|s%B/ujB[+40D6MD=]vauf =?y. Y&BD˼2%Mr..P+:> ,K2mЄ& s8D6Amh`sUP,B 8hXNx|$FO'X`=&V<N$sYd'};:ƙ>6'WJTٶP Du=垃mJS{r8*κ?ٖ=_I3sKEƙGBv̴O#r endstream endobj 61 0 obj << /Type /Page /Contents 62 0 R /Resources 60 0 R /MediaBox [0 0 612 792] /Parent 46 0 R >> endobj 54 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./over-005.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 64 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 65 0 R/F2 66 0 R>> /ExtGState << >>/ColorSpace << /sRGB 67 0 R >>>> /Length 683 /Filter /FlateDecode >> stream xVn1SB3&H AD( " xh=9sv> 9\Ýw0EAkXF1pm Ro>? Qk G 4\)sV3( +@7p PM˳$,"-[:#3KM 1p3l<VWrbh|7,s ;ovC9ˇgVyr_@txuB_Z=WE4kr6tr=Y~z 7{CҫrS;[/ޗHroh°ƒ L R3lgaih.hq\8ehFm`1{ZLm?mnEl>8܃OID,Nn1S}u_le7ɣ0XnX &`eq~# I儤^jYzxOmbd=mSz%.i.˕1r&ŗ#=;U]Nz endstream endobj 64 0 obj << /CreationDate (D:20140409193632) /ModDate (D:20140409193632) /Title (R Graphics Output) /Producer (R 3.1.0) /Creator (R) >> endobj 65 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 68 0 R >> endobj 67 0 obj [/ICCBased 69 0 R] endobj 68 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 69 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 63 0 obj << /D [61 0 R /XYZ 132.768 705.06 null] >> endobj 59 0 obj << /D [61 0 R /XYZ 195.463 382.253 null] >> endobj 60 0 obj << /Font << /F8 41 0 R /F78 52 0 R /F68 40 0 R >> /XObject << /Im1 54 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 1087 /Filter /FlateDecode >> stream xڵWK8 ϯ0`cUO? ; iMCۃx<24t3KQ-?6-z$S$E~|HQNͫ$r'2P@ILʤ2|}| _XbZF QѼwKťb!/7S~ [%UZ`}u!9toum?/`<ϭOĺ!gK޹=oayvIzH2H34fJ'QiTf[o+2PL Bֵo.#(Ͳxz7U'0[̖k zqtzvZCdb5K ?X):E@5oxTL#2)6ZIS0Bp!ޘlR d/H]TНrÎ< 酓!3KfdNjYS _U'qi JQ7`M~`ع-6;3tMk+uƿ|瓹i aS(oRhKamKȔR\cꔊ@fWnޏT0)oV9Sb(z݋˂02ʱXGn EʒDwb+&V=grnz P@S=4kO7"ˌ,[tm{8O{#,1g9$bwP?aM=s fMIc-GҬ..[/cycloKCu5L:O=/6Gm$f'4L z*5~vj> endobj 73 0 obj << /D [71 0 R /XYZ 132.768 705.06 null] >> endobj 10 0 obj << /D [71 0 R /XYZ 133.768 448.3 null] >> endobj 70 0 obj << /Font << /F68 40 0 R /F78 52 0 R /F40 32 0 R /F45 33 0 R /F8 41 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj << /Length 1103 /Filter /FlateDecode >> stream xڭWKo6W(V$,hQE랲9ȶl%Җ.->$x D?oePU`1qA6Y0_(&H%&ycMcEb:(! ;3Zq2e@RC(A/b<2tYAt/B?2mV,s$tA%,8&O7Rpb@.!i~vulwӽ+"L7&)䲡Kр(N?7)x U'= T0Mkh_Zxs'cY&2mg~ fXNxJ++m_I{i99{664Z6Fg+_V"vKrs[REDxs0-0OݨuuȍXK%'cGM=yo=>Q^N*H}u8?a b> endobj 77 0 obj << /D [75 0 R /XYZ 132.768 705.06 null] >> endobj 74 0 obj << /Font << /F78 52 0 R /F8 41 0 R /F68 40 0 R >> /ProcSet [ /PDF /Text ] >> endobj 83 0 obj << /Length 1720 /Filter /FlateDecode >> stream xڵXYoF~ >P@ً2=HAaSZm.I6}!D&$rqmRΓD#%yVm*4gڤLm$3 _é|/=%mໂS__G3:k%R^@<'l\2.<J2c A] y)ioXpulw"E$))n&aHVkJ?8ob*9Z slI@'R}k&=dgbxtɉV& c|s fY҅M LgF-| &@3A΅~Г8skjLU\2}@I[V/gT.+@MR`n&<cJ8ϴKL_,O+XL W >z D޳0_s\ )Fz\lzL,ЮkDJt0kJ4irZqՊ&j\;/b)\ir/jw,pj"BɸʺhzɨYsm";߿%pO&46=3m$YrҚLS_*SV S h6X[XW~˗(caG 6,sw]nEaM5=g'cmprՄYnQ\6w,Vmr̦2 ^To^ἡ:Y6ن-馼 ZQ~NYLF ȠT'37PS5s+M rj:Y %\,}l'{WczI[{afRuݱD;%'-D9*̳\;ÈdsƇwgGҝνՇTpH[ۙ~r:t*W7ۈR56ޯ{.NY@^OuHWN+{%rW"ϵ( b?EybW #˿n Dx`8ؼb:Y0?;Hzyh|'?Ie7ٸLck<֎w_>g.zDl.2O? iM V.T$ o~l (j@دܿԲo^Y8p=x5ǿiއ'\&ȇ1zt:ðIj= ,e3]T]gih[rMo6Aɏo׽҅#l{SAsp_t:|'6 C o`K;7`3D 9sG{S]5ĒdnBDѥp-xsqa endstream endobj 82 0 obj << /Type /Page /Contents 83 0 R /Resources 81 0 R /MediaBox [0 0 612 792] /Parent 85 0 R /Annots [ 78 0 R 79 0 R ] >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [464.877 356.492 471.851 368.352] /A << /S /GoTo /D (table.1) >> >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [221.618 270.669 228.592 281.508] /A << /S /GoTo /D (figure.2) >> >> endobj 84 0 obj << /D [82 0 R /XYZ 132.768 705.06 null] >> endobj 14 0 obj << /D [82 0 R /XYZ 133.768 459.495 null] >> endobj 81 0 obj << /Font << /F78 52 0 R /F68 40 0 R /F40 32 0 R /F45 33 0 R /F8 41 0 R /F71 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 90 0 obj << /Length 1164 /Filter /FlateDecode >> stream xڵWK6W T\_"7h"mSc;~ޤChIuo>pYF^ U֚Zk|3zN! ktCg3k>'JR#SNU3C ?KL?98Jd c(nǥx;Uǁ혛_8cm?nmf[ojM6i(%Y}Fѫi xuh.LTZ$)]Xt)$LR倸b"a\*P}+JAJ:RςQ%UxL๕[pOR)~H0g! U* ^F *~N A18*B(fUeh]NJJkn_ @uFDȢ68+ٍKp+ZLoiL}w( 6w{U y=?֊;c6P}wg #X%DbYJ琔\3jeQٗ ,=Rp(>:5 Ύq]J ^:w2jmHuu8޷dه=.e67iOu糇x+wS^P8|D'=~pư2Hs6jJ7ojWZ:[ ?= nUK׶"pj]pIpmIr&;]ɯ=A*|/I B^DPF(WmX3;&hPF .AF ]K9R><c9!KdȸHg&YX# qxe"o2-{ Ԙx4=~(H[ endstream endobj 89 0 obj << /Type /Page /Contents 90 0 R /Resources 88 0 R /MediaBox [0 0 612 792] /Parent 85 0 R >> endobj 91 0 obj << /D [89 0 R /XYZ 132.768 705.06 null] >> endobj 86 0 obj << /D [89 0 R /XYZ 174.281 587.955 null] >> endobj 88 0 obj << /Font << /F8 41 0 R /F68 40 0 R /F82 92 0 R /F78 52 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 672 /Filter /FlateDecode >> stream xڝUKo0 W(; 谥P ؐ[8N'h?R;)n0E~"?d56Y2Ŕ1"Ksf -rl~GR&u֫ FOm ~I ?΢4g(Rْ){ɤEf kqs'I|熷 hhXk!9Ʃ%'r$=N|M35֠1Nt-門u79r4B LJ iTgw,riܓ4C` Y(D& DMu6hD過6#K_;}Uo9J+ <|؃73N8a1T}aUp6A*>hɺ.C{tE-K+˜Pix[|\!v$xlym>9))v)/c㵤$$ aAǰe$ }^Zh iBAV'_Yׁ. > endobj 80 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./over-016.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 99 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 100 0 R>> /ExtGState << >>/ColorSpace << /sRGB 101 0 R >>>> /Length 649 /Filter /FlateDecode >> stream xVMo1 Wǵ UTv%SCTz?g9jԁˋ3W@p `-xւcĉO i:.JgOG}~(+*J #) +T ΋W.>@覺,H`Mgrfit4|g8N ϰ^}>ÁNc) xWYJ{XO=3Bq|[MQq!0ًupóQFs-Ʃ\M*,ـ4-u>γ|ɥϰ%ُW3pMvnSmrSNƥ>r> [ܔilxr[b2׆)7Ƅ4V|`oCa{.6sX͡O3\ͷTrQKLh)iYk1H{ (ˮkܒ_Sz0:?kFᔡGk\֟V~Z c[F03_S~HM l'ܐ|d> endobj 100 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 102 0 R >> endobj 101 0 obj [/ICCBased 103 0 R] endobj 102 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 103 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 93 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [414.472 182.634 421.446 193.473] /A << /S /GoTo /D (figure.3) >> >> endobj 98 0 obj << /D [96 0 R /XYZ 132.768 705.06 null] >> endobj 87 0 obj << /D [96 0 R /XYZ 203.468 382.253 null] >> endobj 18 0 obj << /D [96 0 R /XYZ 133.768 169.016 null] >> endobj 95 0 obj << /Font << /F8 41 0 R /F78 52 0 R /F68 40 0 R /F40 32 0 R >> /XObject << /Im2 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 107 0 obj << /Length 601 /Filter /FlateDecode >> stream xڽUn@+F [SThY,q"%1 ;x6T!dsX<:4L>/Y6gcҷ现{߽УaC {B9'aE7™dȲ+= {C9/I/m>^g|љkVg4GVi3&+|4ثa}sjЉОScgARP/:{=\vC~A([hp_:F#Q P&DU / O ͜4~N>m)[2xLnj)m#? -ba/#eu ZJ> endobj 94 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./over-018.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 109 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text /ImageC /ImageB ] /Font << >> /XObject << /Im0 110 0 R /Mask0 111 0 R /Im1 112 0 R /Mask1 113 0 R >>/ExtGState << /GSais 114 0 R >>/ColorSpace << /sRGB 115 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 109 0 obj << /CreationDate (D:20140409193632) /ModDate (D:20140409193632) /Title (R Graphics Output) /Producer (R 3.1.0) /Creator (R) >> endobj 110 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace 115 0 R /BitsPerComponent 8 /Length 375 /Filter /FlateDecode /SMask 111 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 111 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 112 0 obj << /Type /XObject /Subtype /Image /Width 78 /Height 104 /ColorSpace 115 0 R /BitsPerComponent 8 /Length 150 /Filter /FlateDecode /SMask 113 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 113 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 114 0 obj << /Type /ExtGState /AIS false >> endobj 115 0 obj [/ICCBased 116 0 R] endobj 116 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 108 0 obj << /D [106 0 R /XYZ 132.768 705.06 null] >> endobj 104 0 obj << /D [106 0 R /XYZ 176.58 211.515 null] >> endobj 105 0 obj << /Font << /F78 52 0 R /F8 41 0 R >> /XObject << /Im3 94 0 R >> /ProcSet [ /PDF /Text ] >> endobj 121 0 obj << /Length 1157 /Filter /FlateDecode >> stream xڽWKo6WA2b1| -zٍoiZ[Qv*ɻK{áDE04͛<#,8?WY0DH(2G&͘TiFw$*.E\uS:̀j h~ XN`E:>ߒWZB߹/`~ >`)zohnu6x-o6$Ld >;[$p+FL\[Zi1}++i3jtjN~ "WzDnFu("9-9[fd$zdoժտ; t?$ꖼ.^]g[0m25骏!_QSG"Kʠ8v2M>bej(fCyDm(X#sX DVYK]# Fd$/X 8! Y> ^!_H@6lb</,cb{Y&9n)SQ+Ru/{.SBG1ÎEsNfg9qlt !7 \?Xd?+Bo(R rA f]_aԌ o}qxf5t#1h43i nc:tM!Df\ 73WfBe}DODpÄi/jlnCb%i FyyL.)G3뽳s_Co亞q1w> endobj 118 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./over-020.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 124 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text /ImageC /ImageB ] /Font << >> /XObject << /Im0 125 0 R /Mask0 126 0 R >>/ExtGState << /GS1 127 0 R /GSais 128 0 R >>/ColorSpace << /sRGB 129 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ߟ> endobj 125 0 obj << /Type /XObject /Subtype /Image /Width 8 /Height 11 /ColorSpace 129 0 R /BitsPerComponent 8 /Length 86 /Filter /FlateDecode /SMask 126 0 R >> stream x00W` &`;0π"1~`A4ej}U,v݇H & H `uyp. endstream endobj 126 0 obj << /Type /XObject /Subtype /Image /Width 8 /Height 11 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 32 /Filter /FlateDecode >> stream xc``e. endstream endobj 127 0 obj << /Type /ExtGState /CA 0.502 >> endobj 128 0 obj << /Type /ExtGState /AIS false >> endobj 129 0 obj [/ICCBased 130 0 R] endobj 130 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 117 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.208 574.505 172.182 586.366] /A << /S /GoTo /D (figure.4) >> >> endobj 122 0 obj << /D [120 0 R /XYZ 132.768 705.06 null] >> endobj 123 0 obj << /D [120 0 R /XYZ 177.089 242.965 null] >> endobj 119 0 obj << /Font << /F78 52 0 R /F8 41 0 R /F68 40 0 R /F63 39 0 R >> /XObject << /Im4 118 0 R >> /ProcSet [ /PDF /Text ] >> endobj 136 0 obj << /Length 1220 /Filter /FlateDecode >> stream xڽWKs6WVj&:Lb4@SZ"UQ]삂,9v=@J&D&goggJpVdHTV5йIfIft9,|Mb+fCه鹍ȕudZ J2bâ[TeZ:sv=rU[6aG-"?Ѫ$ (0X2#II`I20a'rD٬_2J? {N{80v瓪H;mvwߝ{ RqB\Q{ \tP5t> f$-XTCI@ᆓ z"MK{LdV~쟖GN(#bd>QQYx@Q`ZTO3z;plKa+vQ|t"3*ȀR U _:L2"۱[_x Ps]糚'V-(*D^X,ha҄Ӝ]3gpM[[W_v8]Zɧ2~ uuZa NUfפ~˴#B@n~^$-KIYkQ.7\ ;<3:h 3p]~I4\{q6L*`h^ao''SD s֚[6LI0Ɩ[#g7Q)};?e}^tٵ4Bt*P J^ӆ_W/JX-X6@qchd3}` .lx臺8-_S~|!џuh.GPߎm{Gg}0b{c,JP ' endstream endobj 135 0 obj << /Type /Page /Contents 136 0 R /Resources 134 0 R /MediaBox [0 0 612 792] /Parent 85 0 R /Annots [ 131 0 R 140 0 R 132 0 R 141 0 R 133 0 R 142 0 R ] >> endobj 131 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [450.381 499.667 478.476 510.785] /Subtype/Link/A<> >> endobj 140 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [157.679 487.712 275.018 498.83] /Subtype/Link/A<> >> endobj 132 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [366.854 455.831 478.476 466.949] /Subtype/Link/A<> >> endobj 141 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [157.679 444.593 296.398 454.994] /Subtype/Link/A<> >> endobj 133 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [319.373 411.995 478.476 423.114] /Subtype/Link/A<> >> endobj 142 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [157.679 400.04 347.606 411.159] /Subtype/Link/A<> >> endobj 137 0 obj << /D [135 0 R /XYZ 132.768 705.06 null] >> endobj 138 0 obj << /D [135 0 R /XYZ 133.768 546.71 null] >> endobj 134 0 obj << /Font << /F78 52 0 R /F68 40 0 R /F8 41 0 R /F40 32 0 R /F83 139 0 R >> /ProcSet [ /PDF /Text ] >> endobj 143 0 obj << /Length 149 /Filter /FlateDecode >> stream x3135R0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.sud endstream endobj 139 0 obj << /Type /Font /Subtype /Type3 /Name /F83 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ 5 5 36 37 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 136 /LastChar 136 /Widths 144 0 R /Encoding 145 0 R /CharProcs 146 0 R >> endobj 144 0 obj [41.52 ] endobj 145 0 obj << /Type /Encoding /Differences [136/a136] >> endobj 146 0 obj << /a136 143 0 R >> endobj 147 0 obj [466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4] endobj 148 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 149 0 obj [531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3] endobj 150 0 obj [295.1 354.2 295.1 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1 295.1 826.4 501.7 501.7 826.4 795.8 752.1 767.4 811.1 722.6 693.1 833.5 795.8 382.6 545.5 825.4 663.6 972.9 795.8 826.4 722.6 826.4 781.6 590.3 767.4 795.8 795.8 1091 795.8 795.8 649.3 295.1 531.3 295.1 531.3 295.1 295.1 531.3 590.3 472.2 590.3 472.2 324.7 531.3 590.3 295.1 324.7 560.8 295.1 885.4 590.3 531.3 590.3 560.8 414.1 419.1 413.2 590.3 560.8 767.4 560.8 560.8 472.2 531.3 1062.5 531.3 531.3 531.3] endobj 151 0 obj [638.9] endobj 152 0 obj [562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 153 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4] endobj 154 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 155 0 obj [319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 156 0 obj [571 571 856.5 856.5 285.5 314 513.9 513.9 513.9 513.9 513.9 770.7 456.8 513.9 742.3 799.4 513.9 927.8 1042 799.4 285.5 285.5 513.9 856.5 513.9 856.5 799.4 285.5 399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4 742.3 542.4 542.4] endobj 157 0 obj [892.9 840.9 854.6 906.6 776.5 743.7 929.9 924.4 446.3 610.8 925.8 710.8 1121.6 924.4 888.9 808 888.9 886.7 657.4 823.1 908.6 892.9 1221.6 892.9 892.9 723.1 328.7 617.6 328.7 591.7 328.7 328.7 575.2 657.4 525.9 657.4 543 361.6 591.7 657.4 328.7 361.6 624.5 328.7 986.1 657.4 591.7 657.4 624.5 488.1 466.8 460.2] endobj 158 0 obj [531.3] endobj 159 0 obj [272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2] endobj 160 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 161 0 obj [312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8] endobj 162 0 obj << /Length1 1459 /Length2 6831 /Length3 0 /Length 7805 /Filter /FlateDecode >> stream xڍTk6L"-P02t7%-0 00ХtIJ" %!]R- Ykٽ{_~I[We SB!x| 1@^C @ A>HMQЮpRh۵NOXCb  B Vp@PC!aDl(go4ߏ d`h8 hXÜ+B y+?'+ m'x]+ ~4`!#bPnVhp@0u;zꀖ3 _<|+; E99[!H;ZJ|n^n<旣uoaGXY_; P EÝ\\_>eE< ts%՟ ^7_uD<[8wg~$ZE_ @0s`^P{_a}Q΀5?vCj0- XHfVl{kЯ̯eB"{jJ!MNB^!]~wkGFU-  -8 ' k.R $^weQRrG ~9~?f+'85ݮBuu}kPY]/,C*`6p7_ {p$L u`luN\'ަTDBQ6N@XVD׃_~~CܮCkp- MkatDA5Q~~?D!hu˿  %@AŃN+e=yW%VrNI9_g}A&l']R8flx.QQJ#aMٚN;2\ 0[r\EH(N=?({tXQh(q\hxnyɨM-XkU \k+-+ ѭ{rkը'}KHNf GLH6 :W2#@5FB4{5!l%ʶ,Krv `ivukǠLIvX=q6Y,9 )Lv~7l -KƮ:?,EO.fl f[=\EkdgY^nyfcadhMѳ9R`~Ee4!֥ɢAO4OIÇ^96PzJ~ G'! Қ)y1;'iI͟u9_r/1i~B*_)<]1ymm2QQ*K![c3s Oߙ|0~#<,tP IZ=3Nzd0޲DS_><1%ePͬ/+6->J)m ?`TNKԅvEVi2E\S>Y ΂/("69(6t-N>kx2)o~NcU]9x{7Y["x0S'@Oz䆏=fťgL -HK;m_|2L3?b(Q4Uݳ6imkVRbGw͒MsfgCY36H|BY*WEÛtgZ`ub}ro1Ze3i辭)4]d5 ˆZalH+N?1}$h=m9)}Tv[_U$7~zM?q#!\/iWb[zBt8VX}@õk[hm~Pꩆ]2';9SWtM#KYٟK$a흮6O[=] ͗1 )P QJOʣuY/N۸r=v 8:#4XH%'=krzEœ\0!blǸi1_k!R<H~Bň>Q7֬?}K yx @ڱ[O?iM4:\xGN]`<V0e ީΓ%m25,>)z9wxġR&h&R5\:P<C=_esZ:λ?ؓ-Ex$Fe.UQַĤ_pRy#p'kt c=/l5?$ ö`k8L_)~f?ǖ~0ypEamfm.$SfP ؄KL J1ϋ7A rmʏ#|o zB*^`Ƨ[ teu rD `sTnOE=go6,Mσ+7h282=y>weW2aJ3_暕{?^'Ϟl ȸ g]<МiȷG>M`VABn?D7h' `D~wJs,,1-dVMF0zMia:>^VˎJL .L^Z˴V0H3C։ZK#H"$&yܠB_.'L|f wpcsPs AY^0}nSy!OR]L+w Us5I%Ve<,57ـPmWΚ9eq`/*0,88#XN Λwy7"']T ?z9w٘n-ӦgbDI"o^|tt; r&ڲ\GℱǤxsN\3%(nZ9k4_##ȀB9nYL)mI"K`b[CZi%U\m2MD(s htO"X"2~W,@ bBS3iFޓ$# qCo1IHr\C07E9V}SMz9 l+f\L0Z,FMDKR3#&hKMe4fQMF\.xD21UuޤEPgƉ9,z@xRk+A/jiħ ZqK,±1g. 8C=j-F Iɉ]qtmr,ۈZVgc;[nFiqLSߎ}N-q&O#qcSdi򋑲 L>Iw6 [09Ao1t#_7Yڥ!%}R(S 窏w΂[&}\ӈw3DewYXZ&vN%/{z^%Yqy&^=12%{R_JvO`0s|>/ĖOÞ~kVwճyQ7qJ[LjH8Hbu}|sH sGGI JsO. V%nuBn<<ЛQLUfXa3 i:u~fngd,tQ N0QF|:ԏ IX6 A( ?GBv`YzM>g ?Oo&Ӥ"Z/'Js?́v(wtP: pgA&E/s"w$Hg:~Ri8ZJz[ܟl>eфgLlǘAgb}6+ FL2sG?T !j[j4J5nn0 Ybhjϝ.ϣA&[=>]>RvV9:DX|:,B Z >ӄX>h_ue{%eSA:JJ-T(Пl&69 CY5v&Sgĥca9<<ɋ4h%U! ٢QR ɾ$Gfصy&Â= 9HKS/*[NL3bdQf1QXRAG!Q" -a~]e/rl8>%􌄴DQR .SX Ql–;ʎdRb=y̡҂ɫ*a { XPUm&qZx<&-6>䖐%P&.Vۈ`s&CF^g Lx@h=#NnB]g hLu}(}CHc0udoTT+BO#Da72̿Uvx61K6)ڑfrrKҸ3)Y7g'✎F]c\nQ-vP52pkXp 87}X \$7"$z8լ'5NuۺF{rNwŘy4Ɛ`V\vm2t@{lbp8b[ 1TQtӫWx7kHp@T mDħ5dd!,ׁ4jBͬ&!`F {%-,~p?N2'a>/e\NWUۃ"Vaw#%yKL~EYS5LFa@/zckpS DhС|EsPS EB'NN '*B_CC}qU09H,Ec3t߭.-5ՋP>d gH"-_:Al`+|HIPB+zz<)Lb~4`ޅ1| +$_U۪Ea*6I̲Ǟ2QTܜllZ/ke۽*N"_h_;.v>t$C\li 5Xi$=ch~N"hE;yڝo0^iI?O* endstream endobj 163 0 obj << /Type /FontDescriptor /FontName /LIJFEI+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 108 /XHeight 444 /CharSet (/e/g/o/p/r/s) /FontFile 162 0 R >> endobj 164 0 obj << /Length1 1935 /Length2 14202 /Length3 0 /Length 15392 /Filter /FlateDecode >> stream xڍPi.  и;'xpw' efgwfy9WMB D#`lkqa3haHH͝Ðmm8a!4p 8}$ LVN6Nzz#==ǿ m8.Z D#ϿF6?@s##@_!ȹ͜8\]]i imLy)NfE#h d5haHfR(ٚ88+s#㇋1$! X_Ԁ@pyOg##[k;wsS '*MD 01OQGh`nHhnGt8fc![kk#FNWs-ml]m;N)70?"Jؘ8U&wYۏymzz/%oe$le__2bj-$ >6D?h(j47w22 m\8z}윑ǥѫ?U"6FG  a>ZX Kj tst6N.&0t@'O1$F: vz#o3q?vm~0|021wC` fingqm!3kont|jѦ?jng>8t'aF8m3j~t2~x~w9;8|\^ 3o`m,jp\iyfHR)h<~:?!@&QTel8 $ u#/zC&(={}SkY?ÅJ̿jo !Ic̎ W̭te4d~OaU t&Z%Jۿh$0s .%ʥ J;7*hOMƘ9reFN,b,ML\;)ROd/ ŅQ< Yl᱃AsRX>A%4<~ĝٮFVFR2:(`b1Jb̯澏DJT?:OU:(c19ƭyPe<~+3H2Y'ZØSQr{ϥ-McfUd E~P0쵠#lH=pIGΤSB#UALA 94kǯ*&O N!̼f:+[Q8G9e>*FGDЦM}e?=lRvNԲNӥ4hYgNjes!W\*ma"eo}<¥r"BDZ^uj %xމ۔ )+/~A4\8S>'%~3PҒTzSP30No.RK?Ҥ/cU%惱9 !HE8ĈT ],#iEzyuh0Oʒ§c"B*Xf5KX4yȕrj/̊VT^Pm!X S>#e)1}(vNVk+2l |ZeGI5􋰦JW9E S0)'9f 6#bF '2 Bj&AA(N"bL4B`Ff3E>r& 3Y^G+X%(xlZzch)Z /[^dbcGgEHzZmi?q,k ZIas9)YM~BdP !ZK7 !GN rq1+HQsL)9D-˖tv)YQ!dka%c*~ot,Qcb-Su{B1j}5PKFСQH:}a$]S8]'7=wrXCP*eҠHhzI#dHk[47p}XdY(U!v.sWG' DQIߘXP%~;c${(ЍXن| ̐7JhjEǾ~ m[ z EHՏBoPZ$AP\o!~F0M;z(ܪpi{nXϝ%yf{)[uԉas7NaTM :B1ӣ3eO޷ ^ oG?UID#x1Xtt1+xfS_'UIA+Y៖:Kwdl9m1d0ۍ1ubCU ~i DЂËD m1eCxo{EP< hUt 5)"ݚ?-]QI/e"-{rw|E,O;/^WuxQbm1ʐD{/D )hY|܁,S̚Ga>e"9IK蜶emjc%&R;8Oi;qe%\8?y3/GذS go ,eAs_->1Dcx2A`*V{WA?_EjZ loç0G^v;0Zxy;xEL 4ݧ6J0c$Pka8l(N,XLщ<1=X_罴oKDf:4!UX( VJ>( ('ܡٞ !S3vTxyICXA[TL٘iC6vk'!գv@r]&Rg{OgvG]G-G1ːoeJ~>Mg}Tb69]fj$ŀE \w\U3{&v^l xakݎL_۪P3ECSKZ|h?DSWغm1IoTiz N5Qb~RlrT-i[(iʆ*< 6ZgYxAI*l&e!&G5`~3dX6_`0WK4\ ttmA5xĂIT% шK_˦GQ|{Ġ[vfmĎ)Ư/lp;͝CE(ez4VKmY_Z#r@Ma8m %Þ[{c,Xt{9JeU$*؀q6$[ըI΃Nx+a_#w ՜r t^ jpL0\ݽr=CT|0:F dp!R@~!;,,n"M>GD+Y f!cdE'2#iMۇ~Jfz uw5'<:vwNl,Voy Z,W`1,Xj1"reLqXCRz\E8Ƒo!lްo[:AgSхtsn[8U1 X䯏nBK٤*IK{aO_$Mq2;8W0K]ɧ,pt+O?=!9+7c#{EQIFhs] 7RTHF-vϝ,EEӎԑCV'.},;\U!gs@яPZ3ٯ}Pc@4^tќ.{z%|S3/C7ȟu ,Z3 \8?oEuZG) 0?(‹%>jaRxBy'8`k66AzU '4d܅Ӥ w U+Xӎt~AmIJD?eU?06,2@oD=U桼j锵Lm!6U͊fGlgS!vL J/Be)zyQ?Nk$ D 7!# c4ǡIIƩRWFuNc:sa-GHS\51R:;n$%v}xN(LccnoWt ~y%);;1ܑoV﯄;\ԉ5ks%|O)~; X5/VDsl/JvŤ݇ٮEV.:|&~&MҊfCt\8 ',UbNssD8;m(PQ=߷wfoѡ c\<_y~}D%uH@{^Oҥo~R^Kji3tuu'(vz_W(g*%dL Yد~ 92 5QKef#eAOP'1=!2v۶%4}AW7ʔ;2-c~EbŝI+\6@ںFMrnA v.K[y/jy˜'vMڳ(UhQvcdɿוԘgѲǘ@&;~IZGZv{I]V)` 0-<IfB=2A"W+9Auf[?&A:o Fz߶@EոOXi{(RƁ8F4PE]d L2C^k;kGtT]v)gwJSċec%9`Q﫚T4Jz?' `HؘU-bIm!*%䀔C; pAGҔm ˛nz u7TŅFh]SYחtSȮUwܝuN(~E7!dehv <\,L<ҥNC}pD1ذ܃G!W>Ueĭ7wÕ&E?$ϝ# k _zkX^١-Meo%p6H]b]S/>xvcp+)"fI; #{mU~ȴiŽ,lOa QIvs<DiW2ys#zp3'<|-\J)!x 4˖jXx 諳gxjlEjom 3'i;Tusk|_W $}Zر~x\TckQ8sgTMn̒Ot(}Fr6a=>QA]g*1mAy-gBh*T#*>::yQe>m>c˳Pb9E p1XfFg֡\^,,g\kP`(jVa9{'&1NkW Zh%xW~k鰄 W\+7{ +"j\Gw}TtxY&Y^;#z<3+( iƬ} XvFMd;(?*Lfap:>$8Xld+܀e3|scZ:*u+\[T(d۝C767%GиCCЁYIj ]Hn}6BQ.r]isR𙩫VG7Fm<oNw-P kj_?Wz=7k>$}a=gveĝ?H~! [[K1](u!nO(KoBfTˆȉ@8GEa]uy6:jiw2T =Wc@go_暜WTeAwӘ=&=+MELu1ersA]:1 ꒻q˝HNOoӷnon1I끷ѽ=9f SJV#N+59~o<hK9'jGuy٩nZLѸ3T~%qE"xP9w%e~](n,bdW<+cģsne[hA~;),`g>A]wtacWrZ rĬZ(q+ 26 PͰ>{0֌)k~g >$m kZn-v`X5Z`i1e^Sd߾ M oL+[֏0Nݔ8h =-U kF.up =-Vr8ɾT^Ǜ8q9.!}S嶚ݝҐ[Dv2-kۍ$PhCdF?\$&PoaPMK; h1tNu to |SPu9whh墡hE#JWJopJˡCYuQ6 ƐQp6З Ҟ,, !we!GPA&Cf+9D>!FEЀ/x]{zO 7=rQ{e-,ysalv~ Vl>R R4[ԏr*7tUP]y6+rwxBy>U[ #:]~=d!+ l.%޾nSərrHh#GBfv?X:; )uΰj;{үVo~(M/{nV J*ADNޟ[=r KDߡ[!pzyqrg3͔7A']{^aj4biie0AlCHsy^6ڄ@j 6w hvC^5yGA<`D>FM=QOKX919̙cD'< xK6Y<+&SdبsDtb5={ lod~:啫w3HX3gYCc+ARX9ѵw["IwEbpQ} qb:HN җ,Ҵq?|'\@Y qFD4W51yT`<[ QqHEjO4pkp>ׇ+YH47=bK*q$\Wmk Kٲ{hַ<>~ڒEU5*u=b".khz"JUpu=aJy^;ܢnҴ$LӤ~~C N'$ڟf}[ʯ)KspSI`po; +aD@-(`! @"6{@{P A#98G蠓'{BqpsO^z\4[?=WbCY7@Ğ5Pq'BA׎M%> ?z-@}/u~- ( Y I9'b¬hd;N'ANҩFUej[dxV*-?Yspտ]SVM?R_F* M ]KnEۊeEJ֨Dz ]Qs#zUM@:ORQ\٤BT׆YQ՛.]8?-]aB(b[{ F޷2Hmۅp, !LJ(F6V]'HU F`GJ&`[ō2؅j0ѿ&NDf?ײy׾. ]I*J[i/t"HZA%+5-mN C-59᠓ubڡ·17Ƿ`$m0ǿ F-G?a?آ[Bӑ!7i ϖm0GQq ;PK/m_1j_$o'(hV a9")֦IF]8/,:SF6QMU\,۫7͚N2s:^'i Sӻ ^0`0>t{!ZGĵ,lj/in+Q}8[<>oI.åV.vQ||*Hx;sH6 e#U,BbM^mfS"h=9aDɸ|.wo%j5|9 bgJ^DRHV&]| 㕱 E@_NWrq`~9Qλ{xR{^xTݸMVg/=2B{raW=jkB_uTOY~zQ )6U̪2F V)]|j>qx6k]M442? I~Կe0߽21{UÒ[{X Ջtq;IH, U_lXJ?x J&?kS^kp/qdG-Q]>19. rGX!j0Cb 3$.AQ/S1Í!C/fi~.0\M&)e .6jձI~~[C/H/mc%8͍܇rx2wX4򗛹Sx棥He3|#WlE%Ǿyj!̐[ǐ.d.Gamz^WasSǭ-8|~Ƌa|<ĩh~G$O_Yot? r0bÝw*6b٢czj9$Z5n9, Yؘ,[eb9꣉̐|(qRj|!+_Cߺgi2eeiil2dP9)q=)ŊoF~PU TmՍ@d*n`㯓H҅/= LEҝeO|kZ 9AϬՈ~>W ȉe+%mWD_jad^{]D}0@7[GFezk+v%]{@h@`ETs`GhwVۢe&~bDwRuhZ: z0V;XŬG{vS 33&t?DrP9>OV,dGU\  D2I֚{3@#%Ym({W(ۯzVF݇"#| Vh<񳜫gAD7svcn쬌oTL<_B$ všϦCJ:ZC a]Iat^ʨS[僎Qvk`h#G]cnbʆ2y@Jz%K吿IZZJ4GI@[(ǵ[À0I9}ZQH\~A)!UVeuUYS`"v,yUg; ɓsG, <~ R5Y=ͅg%YziX.D}A[7ͤ8AY`cFK('MXVRCMca;T!{%<]3k~U*V75bz]û,%,=G{{X~A Q03NCv19MOV݀Z c lHFJ_f$+wcaѯch7{ӈ"L"0Ԗ̀j(+ysFc_%FpEf$1(rYRbOaMK:cgycZ6 )չg8T{jHY)a'[jɀcf=5HG~43ޫ-*enZ{rCaG_QZl(&I&o!Bh}?h>'ԹRA,}6O~Ȝ<,;%u<塇=Z|.0S yڍ9\8:x.'M2^Y.i67Ɠ[H5=% Aa՗Dq]"1 2Uv+uS" |"wp)!80TE]RkG06]Wג 72G#wׂEucToK{Gy+ aƖ,o $ZV h5aoCq)+EG I]3[:=ˈLpe-r,/~42ZHG0a:zP?ժxt8IF4 fQLh6%]}r1Hw9[.| +dvw47CPB4;a&qXL|)Mȁ 1 Kw_ K*ʝ[]:!Z(ٹ fOڳ%} F@)!Div,_չL*  |^3Md1' ״$!i1#Y~Re! Ky;h2ݧ :IͰ/V2MQ1~' aU NS^6ik cdj]ЖjJ!կY(<Ǿ(uو@Й]:̉Tx|{95<& %i?ֻqs N pc3 n wk;ЯKEq>En&#p ll'&?9|kR'6f V'AXր5S,fFe}1)i|t+] 0r39k0I:w!)'6$;:Amc#TUtbL |/B*>Ό?ͪ f;nEKpnW6M(Ğv w#ݘakPz]w,&C2{d#JEcϷ:UlwJh"Q0!leHUǹ+l(p48_6tJJ~ YlR#dtk_oŲ'r5}Fkm6ۦWKqF+&*ƕ ِYe cqsGDtAʯg]ll&F"TyߝY>86=:0FxxQ%)-I<˞{Ҩ=ӏC_j~Joh> q΍bڐ Rѕ]xi{@!%1vj5  ;]D]Ҳ]UzѝUb춮e , ]qBWB+Uf qI.KjFs _u8NS.9IAx{H&60էdҴ%"4=^QK#w %l:gLbc(" ?hb돊mI~Y%yow@fuַ ڡTc9qhg'?'w=d[$ڢ','| i|xv^MGVlIdM_$mh|4y7~l5[ Y`P|`9 m%AVfXNIez'EVɍY0/쁴эw@oB4f`ƶ㫊kC- -(#-n a^ n(`l*Ng.GN`(Zn7S_w8aڎXwE0Q9wIcgKl;"@:2pne;˩D,L|.H"]~qPx6ҨMu Pn%ݧQ)܉?۹jh7>_q#F4q D sQ ѓ}i8Jw4D ,1?SXg70Ɛ^0NvҘ~9mQ"@ӓ,o]LeI%7"mGn0=*-2S6t/._xKCDFE +!=M #j!zYr̂Ӯ=qw/]rkv?ޔ'W$\V!]M"~m_=ٟw Dt YXKx]뎤5-O`+x'y\P$6Wܳcx&.z Eon~kjOQ0mbNձE4[ZT2虧%KZԽ^&KNE[Ë!{%tE=P BTWl1k @Kd}ׇ[3_ۑp@hbz endstream endobj 165 0 obj << /Type /FontDescriptor /FontName /UCHISL+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/A/G/I/L/P/U/a/b/c/comma/d/e/five/four/g/h/hyphen/i/l/m/n/nine/o/one/question/r/s/seven/t/three/two/u/v/w/x/y) /FontFile 164 0 R >> endobj 166 0 obj << /Length1 1951 /Length2 12687 /Length3 0 /Length 13886 /Filter /FlateDecode >> stream xڍP #A .4 48{p; ]fΜ9W[]>k=KZmjre5&[##3+?@LATʎDMvWD 8mm2q+Q d`qYYKā`3@D-fk;#֘9@m @GskDc@ rt掎v,,...@kf[#hP9 %֠JcFP5utB@Wdjdc^dJv C`3Oc lc0[J̎D=LQ_+>cсlG,ym5kX:\K["Se8ٱh؀@2q^EH@.VVVn>r56g#O%ҷ$Lw==5,a[dxєs\KVq!?N3Ej|+1ʜ#wd"E:sEʚx!e@:(u?VMHEC@ {5:Ct?I0Z68Д`IhYC޵$X:21Bp`'V5mI-:t`I]S4fҹQ1 t #ƻ}#}GpVm{"61?i; M7]g9ETcY&`cT'ϣ\JKgc-(|~[3 ܔPHWd~Mn vbc "g|;);FAEPQڻҠlZCkݛ ~Ta l|2]{ux~< RXrt'Sv2.<5ƻmOi WJ+n%M+t`.mMx@GTo5/Y ƅM}-_-N& CoqV_;5]}e}(1'&!!fևEbuVXm&lc,~f8H^9h* g|DHCʆMT(r2h7{ݲsiDC8η,ɹRe :jy%;mPGoWnyغKJvQ=X+пA6QtVW";軝*6b nCy|)􂦽wO>9s^ՉD#} [& :rZ0aUo d;HB.uLJCbj# *mE;fH.) ]fF^fguC- 2Y#>p $Ď㣀WD|8sx ~XtJEW+8M |d*pUFWYfs߷McIOA|F{/;IL;CѼnR.&h *`gA wb=V_i7+ r!;{9NRX-*9 {rv𸸈vLx0 GnU"!Nv#OmZCo8~՗oꨍ5eG~nz j|ҋg*s+"G=.Dʭ%g\ݠOt{xrj$6- Dx&Tk,ZX~n]>] /9U<>Ai~--%@_=o(("ɔG~fOzQ/ʙ*Um*kT1Ճ^: >Y_.PTZܾ[Z >AYgJzpAvb7l8hv/1wǻS+w'z "xKߊZ>=74e)F΃M5gnrԿvO+_OPeIp).N›J_t<qD_t+ZXh,T *i`&q1K#Vo9 ԡ hҖsm) `iқJu((T;Ȧ @xסt^I[c:ݧZ4` ƥPnѥ\2tD,z6}\XcFt }˜MYf-f*[ebH"X݈}Fw]Z)b;{MO. OOŇ[=Ujݟ6I$$mv_EXwJUgϣxO9?reEtrbѽPH|D# *9/Y!,Nqg/ KȚ[]ƊuCD~wQR'?`Y"$EA*GQv!h+Rl \}*~ Іkv}R-?ʜ'?7%`H' AarI:$z_ݢ~xBJr*0mf!UJ V+l5GuI7&RHt%n-p9d@qKUZW $zOf[tXnb!) @=8}MZ2m[۪q:|7Fdm4aw,>nF6tޚ/<%5c-U>.RTfiە,f{ja 疓(&k}C ҿg25S IG3 ^+ŃY▃# N&B?n-"Ć'aHSƖ׊wd6s;/ѱ%mSQrOy<">mV6I:_ki"wZ QbYp{`!RXZ՞R׸1ox=]^DJuڜ.]QMV~͍8~wtޓr:"Yei6;lP uuhs0U*b,֖PGm;ó9 rrI?_6(^=Xn*qw,uDB;H^]\?tQe ˵oFbh|emBFTXUJME'*oiwAy/rEK}eqOhDo,=% PnQoشغH '[UDw2TֈBhI>e:_ ᬢw˵ƒ^~l)] WV(̭'kޫu2@cޑF=c@j3T6}9ٲCl ܈aF$vJqbx+/J4{=i7S.C [˸ =}E&/@a#j75oO|'0zJNq`@MpؘJ] pͪ&>4ۼ #PBmPPP/bkꞯ% LeME h"֍X.nIRFܛ>$lFC<{՟p"OѸ =/4kuJ~ y#9(3TWj5coXG{?Z 4SQ[Temdqb~ 7^(9]il4"<ں(&XZ4m"Rײ,TbQ^٨[oEto ;{PccmpF+%Ur#Ծ7)!.;TL}^7Clp_[A{*N{imAʤZܺXƴ-wZ &ZRܕnlFe8ڜprROx8 x6"IKXdrs#:y.Fx䏁ߴX w'Klgs<wGP;c0]5I^#S^7?9"6BlsݛP}Jg@WUf{t qvFC5F!G=-);r՗ԅ+t}0Ԥ7tFV~i V;cqAm7dy߽XvW\X(D*i՜w/ 4EK;ԕU-LLA81Z|vf돡 H\Gl'|!sEcZF&EXGEW ~b2&}mЌ͒g>o&Y9=3!C(165t|ggBg8jDЭ i^ h(T?Ōa7 ? Rx*roY1Ui-Cx;LtۯWJƶGs ׌MTV\mglOݦazO\@xP@^reQݸBB5ts$fpi03Pu#0݌,yC3YuߙU|הejf(/Idm?'a9fL9LkDCW"y)q-Y;:OkPg~H)*iޛkߟB+7!ނk$yVT'ez).daiK~ͩQenTۗО<4V^sQ\9}?ΐb)Wnb!" ؈7\GNp$am)Zđa g2!l^GgF(+>Ʀ$ {%Smzi {Mɒ]A֮F)s֭"K^<<8OU'H|زKڿ 9_p?֮J_ N;0! ԥMGmpe R6n"+9[\y߱~@նnyuV#NU,2) {<p IY@CGɠd[fu ڍ$ tX1L2Ih0́4|šxF?F oK6G[85JzcICE3BhߙQ٢}-lb›U^i8$zQ ef>ᷤ;qS\)rU d3K.˝@oL>2HFLKD*SeMdkȞ)ĖˡMYl ˞|PѷWdan@ڎJ8o6ʣ҆z@@B Q(sYhɛaž,p(~jz^kZ(YK\]3.f?2~GMꞝ{}[Y{aM;4|zG۔j˲30b>njUZi/j|wChJL,x/;A;N=s\g/k]4}216>|/sF.P=Oh1)\0ccׁ; Z&nS@fZJoꮝf[ZJTB[caݴS57~G obZZw"AqWV>31A(ܵ\%rcM2I&3驲&7OH=R_0iA2|D>%7+(!2,n u#nuN/_%۸ nkw9fRFtSQmT_\/yt7@5 {Sy؎_()+6k H1ǚt T%GzAIbW'RNc#̗12:l2ܕpȔuYzn)/ǝHOcW@ Mѯ0>{?woxzQ'&W#djS۩zq\LV}͙Cehhw繏wbFm3$*O V7s݉Low0Ri:ӣƌFH VjD˪TBmhCp7h t`SLJ7"LnyMŨQnM1|2m sJBXbbGJ9 yZ-aܫs {u>vl\)QOM@|g6Q iyI5oa{&G>nU =a?L۞ O/ML6 ,;A `zYQ0Q踄VV@ O2K`2L;k`'˒ Qț̳a+?1cal'u.:ʆl=Q!;1 Om[;akF3ݑUA>LVNaz=[pWknJ;ǮF)&}N8'hnkXen6T1=k߿C>!$`RnqÒtˇQ'z#u-/꡹/Pޜ'"AK/^= Y[u"%{QjIb?t1Ap%};&V6-2IIO.x)R-N^ED0\'-mh%N戟~YVR. wՏXjsB'Wf yy (J2Qm9g:= 3N%uEhxaxo.dS|R<5R[CPqPej?3~ Byugu-aNy!zvI95GnYϪU=[XLl759jᎤ MjCvhMgP|8sZHBq~仅 ĎwdMQ*qx:~A.V<m#]&MfD)y:oI~9O\G-l#rZvKϗ{ &LU}nG;Te3M]>x X&pҥ\X 7Ns)J;;.}֛M֨m: oIfϷ1*ΐN]UIRŘ>ڊR>t[ǯʪNG`m %;4z3hXZT p od7<\bx=Yf&9;ߡ︧s"TL:-$x@'=ay}A%'@6%5%7"qbSGfHq#$60Yh{Y )/Ie=q Y>`)ô87B{HR;;BUzOmE˭ vC>uըxh smQ7w򁗉"rA,Ct9Dp$?{k}S4y TX NXhe=l})CO=aȊ:JW"T>p߿`l'$R߾7=`س]䌉-Dr#wbK-;Q{6K'%TaNR{QY쭉0yfEP >3>ԩ>Tp}w;oC#g6i9| 6^Hȕ~Q}xXy1[F%$y0H8Uj$ۤzFj֏ee%B,.T%~)j/\*>tu}X:>؄7o8U|p<*jet|;s-iw:R"=4M? /"gXW,QHbc먗RGKq%|m6tܯS&b." r~:P?A!\zl^k\ ]Tt!>DT9lT^96|$ͤ\syv}Ypq\_%ݤuAWXy"ojAv@ {=9yAKF_=Ts}YKueob5%2:Wнdض0֛/m3ɜ鮠RqN)HS&OEhҲ`n?8&_}`XxHۢvPe[bsWu ,c1sn'd 0΀ֿD 7 ÷ H>/|雸5tquZT;TѼ;St'j]R#RM')Hgf;^Sͽ>ʅGNqVl]&*ҘCe^!PlZ@@G|PS'S]{#* *z6/c%UE,}Tk!ұ4|=5NPvMj"7R0VKX!g~y:6*?3xֆ`j[71nWh<5P+/ i%IhP|P=7&.{*mPs9zՃIUe|X/& :Hamia”O!E+qhGzR衙GMp^Q:-%9.=, %:,1Zm ġ9 񻱡S|R+ y^Kd k:_x?kETt{vJby׍H͜Cx~+:v0ou HcYW57|* m o&Z{Љڶ!,p96p,:ym?Upupڦ1pG_y2fb)$=8]npm"SVU H|6:o |%*HK g=8QGf',ӹlؖy89(sX+F譸a**'@7r[E~3GMB;a9}S"q7w/z#O"z c!Q^s%l򮜀Ea3D3Q˫ xd/ M4Cqzpe' Ph]w} !Ϛă0#˚/x1.@^y()4u3:C 6{g"y  |}% 5ugr|g۟~([eN sq$3w0= c? ԓojfkLB9X]^4֬ҥyPzc%S?>.XIRϤo903Ohu.x9ZN[D2+1#>mI wr48\ZtxwZDzX$:W'S5 4e޷H ]'tPP2:BZư¯Wn} İ/s%a%zcaIinȕ/Z̭ [iÇS<$ño %nn뽌wlL̰簘ۥU xؾ|#螺"Zgʓ5Z]8@bo|ј9#Q˻cTæ6Ҍ7wZ^C7dGls8m-zD]=n|%!& Δ)O:5 魇y & p!eL{ :ivwCͮVBL=~0ˇ 5ᱸV0] -btbB HI]7u4+#< ]G~QEԜn T ƊyqH/s "b6}KMvUrQ,gػƯ5&6TkL\ endstream endobj 167 0 obj << /Type /FontDescriptor /FontName /KYADUF+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/C/G/I/L/M/P/R/U/a/b/c/comma/d/e/f/five/four/g/h/hyphen/i/l/m/n/o/one/p/r/s/t/three/two/u/v/w/x/y) /FontFile 166 0 R >> endobj 168 0 obj << /Length1 1470 /Length2 6897 /Length3 0 /Length 7877 /Filter /FlateDecode >> stream xڍw4\]6тDFeFE] 3 w;E'z zD I>}5g_w^gؘx H+2 (h@ ^M )&`{E0P@Ah"mD>882D`w PC".l H'/_K5'OLL;@YM5CZà^ !i$zxx]x([iNn uܡ/-#fl};r=p5pC@(zs܀?s;ܟ޿HG'0 Pce ^WOWne `w0 B>9, IsruuQ βtt"\]~OZO`C@l~9 0g7&h?2[+@Wx}/'o%/1 `&@/;r߈Y0?b]|` B{en/w}J54`N^  ||bBaN_K?'* :yp-8NwB{ @B ky~W@npo5o;^[=Hp (#֩!D2 цZAC@._W /zܬ׉ RUP4{K%5k` E.< | znltE6Hz rDV 1o'] BnBS 1PO5 Z"M۳j9:/Rl_ S9y|PmnDx/92-N^&YXS8g/%Q /cT jye7|:> rjPcqv%#?U+Q%NxU:kcT<Ŗk9MsוC}OI7Lj/vb }LO{/tҲҚ0` MVSR]d`1(F va,}a=ͷA kaq:lirjE'~='piI]'$]U(Cj^t@"NT_+N/z&"UҽqK03g`ey錙ZWo:-$?aΖg.'e4c#f݀AmC9aV'lՃdK Utuv璱B9>|+E110F2OjH$+ƒqaI=;PB2 !fjS=*NiB8zMĢ_J>fa30'q<>w[ChTRWHv{7U1:/Nxy;waBca"sG("Uj RSE^:R,OHMz$RyE/o ]z"'aeE VRT^I'i`}} -vep>P#ElDX ~I %n"S(]u:FfDr=P"աUm˙#ҍi:wo RR&r4"YgM&DnIf :hYW+9)5>ɪ L )S[qU=E bw"eH( (=/';ɏ2@Y=0\d[P+zN#BvBS#7l?[$]V(8LeT>O%HN j0yAA>Ƙ-j}aK1' KuOB"~eV`Yt㰨q>.II=!K,wbgt4rWX810& E*%,IL>q2%nL|dBhHءzgGB4Ҳ~ȘiVUVfHLSud:}lNM($J5mC8@1]mGĽhШc6@i_SR~̆}8܂caN^_DsAS_8uI| TmR_r$HTj8= Crqd |SFhTh80dyeHħHJ@i\9-.dqizOHFS`Ӗ:'S1'f-7r{gͲ::_vܰBDnE9y` súz~\#]F4=* O)(z{iGal#ܹp 惡إ"(Gl2AoMz8CdWx ҂շ8v&q"7p,G--wF!c6b, Iݺeΐ0(Y702t_E [Q}7NQ?,,'UC W2I9I=/LcOCukTLT{!P>[y-~D9|u"-njb&Ż58!_ں6hjȱӞ*|aAqL<7C9ֿCܢ1JDs.YW2%V;IbuԹvDh6n1W6#۞4Y4|}]USJ{Ev& ݚ(SMn|֡伆8 d?&BHʶaT~Ɠ\)ұpq02])kMۛ, 3 (B+eR3R'~}н~i;g;UՎP>7`ر l5* fR\SGO;{BklFӖ=@h(@qՄؽC_M] ̲Yh Q/]O@~ʙ%So6b LBqⲧግyB2#Wx a@;lȚJR Kϰר 귳$5"H Y)8fGA936 ۫ƃ\E !Tx4Ni(?^yVk2t`#MF;%'շli>oϞW'R+Ut\MjTxy˷6vKסoP%&sA7]}2:ZI$ -es ^Fɼv?WVs2W:HGHfu^d.@f[=*_R.Q#S[`=\B$y|SȕYde4pz}PPaUb !Vw"y+J B*TְXз+ś*;,ᾤvNV q߬oJ\ ק\I2#}zT{QOh{F|նɠ/t5^L z$*{\+1(Lkzڴq\2ə3-k0g|hﱴMG| 8:ޛZv({Y/((ĸaeR5\{|;Lm:>(]ץ֖A?ͷJ&v$,;GzOɄ//B{=&؏ K"_XH>,JrV8_BrixF&%Ȟ_c04D_.!io6eYvRYiN^Z ZA] dĻL.ϒ;q| 7omg0!=$ڂ{΋Z8S{C_ӻM%TieϾϽ,= &Ukir[wfgUR#w,CI@f2VCU,2UppN.$?o8<#8'h{^p"90zISZ :إsja?4rUk4.笺vnmt1W/LSdز֧aã` z[QE~ - oi3}vA&t*7 g-\K7JKxphN^ymZR[wZ(M߇l(w&שLx@̀Iյ\䢄&Saњ۬e]enP`bR= ZݼJoFʆYzW)Z4d(z*ѐ"xb!M̩ 8Z$ՓWܪo\JS"}87˪`vO^ܣ$RAv% !"y}뜖=(zzbReR{V5[xdoV-)X9+. 6Zh AwŜRǒ!=fRb[r /t ǺT`S{ߚjt7c&rR7:Q9ԋ&`|?V'cWy^m`jHާEP_㋴Qֿ/V[x!, &uf ]lTm"=c>edHohT?/r(.{y(?S:lWrOe j>n"ۣt~N:Zf\ΆB3:!nx˘N^瘮FNQv+6伐EӞmjA7e3]9$q{3٢&VB ]&TH!vf.iW$X|Ft eNݬ&֟Tiud%P x~ݸug.y n%^i/YF˾LNĢ+|D; 0|C'jR$VNy .rx.; éQEY%j._(T[* G+^60B&Q uT s0efT:l W1ܾ~U_YK'xdq<h g2[S=)3^Sdc0wn ¹7m#ҁnRQ${)YEYb,`yn76$te *(F"'^ت> endobj 170 0 obj << /Length1 2423 /Length2 20482 /Length3 0 /Length 21885 /Filter /FlateDecode >> stream xڌpo McM6ƶl̍m4m8 m7vwxlju3KA l`pwa`adʫ0Y((Ԭ\l(4 g+{? DA@cLl'`qX8yYx<1tČݬ{3'?jS a;  ob G45:Z]<őݝΙdnb P:An@3_Tƈ@PrG`n [+S3 T@1 #ogcSS;Gc{O+{ -(!B07oflekl6;sc2\9]l*/pD.'fdmVfaȤno ,B-8x@'Ԓ/z5OGJ |"V@rz_02u-~@0x +.3xX}^/3{[ϗILYQS[qx33X9,-iۀT`7wSyߵ7x߫l b|vMHo5Uvu yOR쯃 0=#7 =^m .`Bk&D No ޴߈$_ `XL+I7b0IF&O70F 878oFxjZO#pt3u?v$vv%!op,op!;_?&@phXfgh7?rj?~'vv5j0#eo 4.v";8kGF8ں:8;:O΃ܱ?no3/]8o&_L. {=N{N.SW.7߯z h8`b]~YНaw\`bW3{&6;ht+2ԃ-N}#DMxkrۓϳanE߾cPhM"ɕE{G}hܮ^-,sCz^` EI,) {xZsԙi2 t'1l:^Uj]:xo0F')ERepˊW/x!ӧ01fZD7~q]dOP~IRބe"UĮm3tf|i.~mnng0my:4.,~ixWT_; n2o4 1.M4[ 3q(wЅ#V37l/3|Xs΍y[w `NWoiElFaY ⨔ꀍ3L8br[ Ғ5CzAIF[߃\9ml]P6ǔoݦ޹EK5`v쏾'{8cv|3=欢%۹BŚN$rfS5ۄ~;,Lу"B_OI O&(Maom;Tj  J[؝I6/zru-K s^S3O͕/9Jܡ.l0罣@Igs3Æj,$?9jҜ +[1`^L}4<~Wd~ӛcA$ZK!L*"Ǵ_sƁY!+\~cW=҅HMֺk/H ݧKcye"/ h97.sG32AǝK.1"qSqW6O"mSTy ~_vU^?%bV-i>*$ :O $7 #e\ dew(B#aYDpT$sxLVCȳ"Zۈd=B ڊ+5aQpQ*ZB,W\-͞e~bh2u!P1F·*׃>Iވ͋>,)=8S." mOlx5ZvX28 l!wﭶ祄ViVa<κF0`LjA5#6hLǕ IfNk+d֛E'Tėѭs _X# >:WXX,)``0"){Q W>p# r)\f.nZг{1d Cv^7.fɌJ1* I阡"fոhrL+>l"~zlPW`-((BBOivk4 .F_K./-L=m1ttx(fvh"4r":!ƞ[8hnIxƔ9dd|^Q2[;f49*[N {bLDTgu)gk=yH0r׷uW7α((:^WQ)QO&) }5Q~:[6\!6@#m"/2Pε\ҷ1o۽&,,ƌwb]$'3{1=W+&iۡ-n_X{ˤ2>e_ftO8O'>|/ʐυj-"= Sgbu%?p[d#uh^X= bIi* &ID/)̲*Jג6Q-؟)d*"c,aܤ*sթi$[ƫK{e/=̂Au{r/k!)7GO]%Ra\ 3t iݏZCT"V"v;_`Mïii#uЫ&pTCLf'U wT9]mPxTzab/l$t4xZ~ݣ>;$Ј|o|Tbz}AR3&ҩrM<ȚcٮUGy+MO)]d0}.P|=~X fg^w~m4C'~eUynK .A5S oTWWѴYnhvH5Y-3.ԫAN2ڻGQhǞCFQ6zܞO!|]p9}y0Õ3 VJlBUCF#_;a5aVgQ{'!lsŢanԠgGws l 3k7N -BВ\qۤ>P{K/g >UbYaqs窈} sfM I2z+8D.qLOP}F\:Y&g ^"k&k^Geze} ^6HXFHRi]YW},hJwKBۊ*O}pw=dLE.i\_vŁaꎁIf?<2u-9 ;2:i;KTݫU_F J6%4bE`@rz^̖e' e_,VU [yĭɺ0!Ս[Kt9P'1!.09(q+B_eoo`hpҀYd{G#bxPҘ׈/)NF5@rni䝢C/ME FB$i55+M|.+smL{t͚Ⱥ͘c$q)2ifb?Dq )v3~OH&)6e]рQK]QJ_ |^^ }U|-tfo߳hc*zg0c4hgO ;͎*ŮÇ5mD) >QkUQ" Ap1yqXpY/@ĥ~|'tp]tkxYG{ڨI}d ;%=rjz^(T) (_s182rd>7{by7'z ,ds7'W[b6׬3+f2dȭeV7¼nor1s<ū\􅃷1h/L>7띗xmL *B-IDn9ٹ 2Ua Bﴸl=Lw!5jb>iu!o4x^l1)Nw q/݃:mâK/ewɾ."! ZAzxq=AfJ9W#Źve>bx^YBT)% 2gv=#ؠ " dtF4GQ'馪|=j>d|/UI,q+lBw`%ƿ7 ,IHZX}wYe|jBv:'W%tܲ𺯫FBLz6dW1V<$kVP jewq|36)^CLR:3}e jQ&p.cUE;3~*ѳ?ٚ (sV< K$؇ưڥy?l[4Ht:4}ln*~Tf d];yXDaڹ48x ԭ!Bij<-I-Kgcxn&D/dϦKv@;cWtKZU Fm JaE鸦ّd[SSȤ71bb r_Hl`kSdt)|f1hApϐ|ך0Tv yXc7c{ٵ|z* L <"SeL+cyEW$ bNO8@yKӂIkgxVrq}<ʐ %7M yM)]Jě+{55>aP5AveY3Wٷ3_fBTe#Ho}ЇZ B#1Ut#S Z`]O;Bs/i *D>cngj]8Q`G`jW' {:e<%WBw\#1F|G~|vPnhS,>ndT9 '}cr#CbfkUa !F6as.&*dey(qך7~SR-h)䈤@}yҽa$-"h-︦/ ^5*lAD.CTPؙCɐ%+?/u 璆ZN~5_jVxaraA13^O/tSR-WY?W6ϓb7Z2'#lA+DEs `AawR0=NiF({t,cVyCi "Ϫ[@׽mlJ5e-X7A')p\ϹG?I'ZgN9jcϑw0J&oG|e8PZ:Sв/6m5)qn2˔MiLHu;'&8Ii{gm\h^]L4'7ka!A2*298ݩ]S@`A$o#7٨ߏl$O~L&1csڨUͨ BxG IfAMEGGcb"@s1P^p'b~+ ~a-q 5li П%Mi?$]GBe MQ;m0)QW9O))j3{S/o-M) _м?KRXFd}.=u,Fzlű" v^ӎGɼ?F27f)RY"}^ӄ}iJ+CvtOKS71JZ 'PUE:"}n0$by$F Ĵ-qVKBjTFMs@4ql ߮Q6 [xeVf%(mtIZYo$/q!/9ҜTfy;kQRN*HzK1p{׸!x9xR+:5$I Ԩ Œk'?%%tϘh<[hQY 0b[`ϲMlYƴf5ԓ-EIU3՚: 剙8ˈpG* FvǢZ"L@iQ4gX''פO1W'|:Eۚ0G ql管_iNSo0v)N+|5!6ò'fAK,G9&>d3Sl"rΖ~%8hڊNL. CVR wɅq|dX<+[Ej7(43rOa B)݀f-':m^*5: nd~ Bp9y ?FGOE}~"G5uuO \Dz (:t=:|Jf{*QIrh43#:vBEn$\ #aI?/q%Hp1LƠ.a36$piu\zk6uH3kK]+k+[OGᎅWVj/C:6%$7f]GXG!h<$ڗꛞQ LOzD: Uђ%Eb;.f|L Ԥ$mhHkN+-q>rxaqY {G }}- Z%ߵ5zXTetRQ/l6ZʭF D;GKd->.(#+h>*du)LէR`mځm#\07ëz ,M%o) @H; Egz(1H][>Ca@d!t)e&G:v0UOÌ gDO_ߴDsF?GrF(ԶYrXb=@tVEw4WcM17,mcGp͡k^I/g:u% h:-H=13 ǫskMNLj@}Y$s(HvBGcѧH"뽄d=%2D ch^3f۳ g'HELqHan ͷxh 7Bvy!)Ru8Z牙S{'zdjܽٓ9Hp|E.U(5q+. a1!yYoW ) QyacdE׈5Ţ'$6'%tnQ|oU&qs?kR†PKv뤀[7CHOuH];QєIӇ"_ ˃Ya ̖xy4[u`|-8|ZQ8AȋZks7TIfN `|+eŒsnˍfBN'}pEfx>DLX۾H~ZXŔ8I?E8 ;x%s *{#35%N4&%jp/+Śl7ԣ4o&m!WZ .|!܂QSQ 0*cS^%s53|ŶVZ B۸g`Ax0]mLhyJDJ\0?@g Q<$2Eg4-r+8B(|R[7#Tɓ迸X~Tl}ȏ~xM}8ka%s'5S+#pI?-DSye;#짝צv})d;5Z! 4a$k7v(_=4ELDV)^LI+q0'I<`@t?l\7;@VqNyn?K䪅F.|]dw$HDc"J9cS?S1AEg|B6-sBXȵ5<3$3ibE!O8dž*4x e씭.En%-qmCN.۴+BoH mה^~nJJeYTI@Ĭ>|#5 1$R,dA9aKj&f;x4XCo/&f^i"!w6;︆&7y1 _;|25 ^sA0[ p b0q!ʃ&dh[Ҹ©42-v ՃS5|-kJݡ"*2V?|7L?<HG}ctivݠ\}#12r _} #!Vi`uO7h.n$BἋ+\jby1:"nٓ H%(M9`da6ӯ2|Sؤ ȫC;Y?G#ީ@]Di85 E;|֏W&0OY`*nt*8܆DЭnRNEcDtQV-X7d\NL:ױ~\ ڽuÐ6or["ico!+ S@w(?*&x*DE6GW-۾7lok;lz_;i֪?˘L֛m+eqDftrl5p;c!t)MêN)uXh]B(e rF7R%qy*%]asRj-.aA< e2W \r6"ޜT#yBl޻L >of[|~f|\ˣ47-Ƌܞs)u`#Fr9v_| |vhfx=)ud&2ѽI*|bmh8zيrtJ! IW0_wZ}m:\'}̼8 * gߗ8!WCi֬ݪ䵺8cfW{6Y+yyb8REg1J#f_)Y:~0|aa/dx"ix-,*2lE4ԮEyΆDeSM7 B2 c /쇩W39z-tRjN { ,%鐥 XJblܦo&P34w .~bw6rn+kȷN}h*̓#:[|jbG"V W 1U9#vlզKTXMģX6#w5THggs+@ c2Z (LO-Gk2\XƧvjMoL>]mhiym;GZ.PǏ*{ťJǸ@~|h{_[hpG֙}CWd~y:]\GeՇ;^wFu'cs 7{&9UC ˮ;D)9tj=DM*墏{6%F-?)^W]c. }[cՄBۍm0նS M21z8=jnľlibC<5p5cj5uP 1AuFYf}GͷڒڞeCL`*pkcLf9gUp%ok1mJbY̌~\e^۴|AX9"Fqr"Wja>!;nj3rJl yh72SrJoFT8:ǽSn@&U7x囍]]7JA0}'L^K|rBz XN2̸).aY_B<*p=MIXpziIXjn LCzC-^Er \Mp$dGzdoɋoW71uֺg0Xkű3ue;jأrIwuN0:uw&_:7榬mڞ~F@"PԃCK:9Luמ`Fp Inj"ZQ CbdXHZ5ߑ}W;jJ4ʴLx"}[]OínG=zlY U}w a1!*h<)م?Svrg!>'0L$s6O WK*Bh7b##;K)]( =͍-";+gI߫,oOuhGR?f3Su:SQvrLm?I++#hYHm[ejnt lq x'jM]o`@H,n#^@c"s5li;uWxޚLGl1r\|7RD ^Sfx[vahe / 09G\_bǯ;.p3MlN H7U}تY3ķ4^Y?c(LMwGK _Qɐn&!)7E՞y8^+t*zX( $=5]/t*»XH^"&P1z '!wr:tFgG"H9|s$SC2 r.QOUah݄0yHLtnl ZwDJn 5m瞌l cUo%f驅zOjmuM5dU{x \rVttLsldV&K1)-iH盲9rlԉR^gX ˻Rp' 扭7W6SE 믲A+1l{Úd(_^5͊7cxCٲ|-y0V:~ 5m' :_`K#g>}v'o2q+E99_m54.b*m24Ъ j^rcCoELڇ <@m1G5z-*݈8*uidE\TnIR͙-f!=-.w,K,-|/ABгUtnkz+cIG&U>SvW7ReBăUJ7aj?@vF-u$[)e4=|OEJ̐a}(c|AGA\{wH@3d#, Nu<;Os)f1s`$M*Ʒ,ٺ1h0# yq쓟ֽE6ws؇QQʷ$  \ bnU%3sοҙ7:OTZiGyJEr_WehWM0apsG=͢huFE]k.ٽ"fwXPwr٭bxCV uLiwg)3yFa.(G `NOdZP0Ƭg 5\Ip%Ԝ΍IE"RV. ][i4 xu0~}p>\2cʰNX9C; kd<5!X1f0+ݎ.G9h2&Ob'M3y]|{^rw}ʗgDX )C2(z}H'UW/Da7D"->.5wq&EގM%u#.[l \3~q*ڟ GzRdwmg,5a 1mF=%= H~SbL|2&pޭcadz*?~LYkvĭEҕc?֌Q̩up.u4$"ca"F!خTsb }!\fo4͑u085z`z.:-WOǦh xcSH^(r6f=A܋-%D<"bfuAv";ɩJ?J|G!NWMXx 5߀h<-؂u^ŝ ~ 8/XF;*xR2sF&MldoHAIu JxPg,2&y_tRjKZC+WLL*D6)hiA. fsNfCݠ]WوPvNa7wEaa{S`Q}"{{*m$QXXu|3[QV:as y=5zGeS⸣ԡ m€jhF 6SoyA2  @EG{5 C4{ O1CL^" >AUY^1j&2}P_mz+>}NqI@4P+ķt?R":BM2i%fbBxUxNֵ94RigCҧ@r{F@s!63Un=˼Gq)qX$pLe+m!A@Y"|eqѻu8F#"!ͲXQ"iI+>`nJ#f̉;HSt&ybvw!~ )/Z;{>qS ;<Ǫ ~F q`Z.^ xs*?]FZU+^rlo!I;6 !@ȍdzNu|2I_( x' 5{ '~^gv2D^psW=~RHڣ}8: ZY,\ҧ>ʄB8a>cںץ1PpPk&/zs}m˜~`$_>\Y;iv%al%q]5:A ߓX@D ,}*7qQ 8S J'`KdnR:H& B3VlUP'ku%,ą($[ᅭٵ_39=VԌDw00e)mnZ9='X@?:Ҽ*&'W9=A)h8A3-@i(4?/9BPUH9`Hi'wz[uء`S6) q)Y vt?NxY9C먚>ΒՅ>`#Tc _ۙ7z},UVc_/P h.>a5aƥIPrrOqr\g&!Ӽ*V\}?t쌛x9dnN$zXD}D@:3Py&g )h;e`IX"Fԫ4BP|Z O|$b(&w;:H`#TJq vy֙9GFuk; nsM'KC}OH  8b5ã~S-_ļeE}e4f#}װy*Cu\w[i(# &(mfϣPm̔3W*KlD}i"~+_kI(b,6|XrAKF4Kb#$S-St9B>wpAa]j$mmO~^sp<_} {I9BJqk`Dx ʥCD8ʄH*mo|\>UB+ūTUGOO:M'MGHJG }d2dƉ_ka L>Y⹴25ieЭ4ڏ(z!7N H H)2Ŷ60Z-m G^w 8tbgSS*fO=E*?{ܾ¡$5XX[S/ݔvt)uٗc:"l!t.bߪVekF JW'͓ co3z$L;g95\չd_OGh endstream endobj 171 0 obj << /Type /FontDescriptor /FontName /DQOWYN+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/U/W/a/b/c/colon/comma/d/e/eight/f/ff/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 170 0 R >> endobj 172 0 obj << /Length1 1676 /Length2 9047 /Length3 0 /Length 10129 /Filter /FlateDecode >> stream xڍT.L#2t!ݠt C 0 0twtJwH ҝ H\{9ֽk֚獏VCSqpEZ< ddA1@P#D_PQ&g{SuT\<|AQ!Q  * 3s[T* &lm{L Vilal@-ڎ`B`N\f.\Pk V;fn Ko53П̸0:6`?ڎV0w3(([ .KiO_p/߁?,, `5 l+a3oC3{G3735fb;\\)reys] xl8CV`oNܺ+HY/G?2k D gna;%o#/'G'#  b +a,09 'd'~> wzY:B=1cj 2['#xq8yx"! 翣?j O@e#@O  寋aw5UX7@6 RpC6s{eɮǫPu| yɪ Kjaf! `0dYBcx{08y=ޛ{8?Ts Gw+ 0B<0+ y+G( D"n07p#~~7nA7o( rtKX_1c]x?Vy?ՎQ wd'>>pst 7FLfll ߫iKΑbzZEz)JJCר5hbT5z*&qnكtuep&A!z\u3RS/r+a*,g*{>pŸʬedǿ<ʋ4i%-~ƆC307_6+ϱJ}܁D*i 4NOg?c?'0ָl#=x[r}W7(Jٙ%Ц𧻓 hNM(I/r`ub4NeW9J/,glQ]!b<.gjrnM\} ڐяħS\YQI4b?4lxM] ~Zn>5_]d^=$%8h™o6xLfm"HGYPiWC8=yV+^2I tyo?UhGR3i?RA4k}!;Ef3Z6\&>d%۸岑~ $`uGӑ 2S \d*jl>Zփ"_a7$eFaP[I6++ |s.)vl]p!@RweS%;^:5sZyaZ{q:nDQ ݟ-DL@ε:a 4mavɚF L_V¡$ ^k"E.>$&$?VV"')zBv٥*+,p0>e;ÙQpm;#qYnXjpzM !j㗜g4knތz-m_˳ ř:0w+P%C ̏kIIUI@?ƛJqWoF!MJK?K"U8i S&;8IT{TTT6 0KlC &n vCk% ?kSeͷgb+Roݼѧ緤`1qNʤ5,ݒGv|xD˥_,T#N`_Oln1DoV*Fg Q%\M$qIr/LJցϠŁ{cIQp@差i;i#my^[.f_9XKhGrB a(FELSJsK 6uy xZ]e{.vJViQ'ٌ,-3 zQNy#0 YӶ `Fl_@ki~pt,VljS#Iyu3g7ߘY?Sy:rVbE/Jp(o0#&"g_"4S9`a{TS[INA-@|x`hL*/ߎ~]۩wa,n֘z# cZU;q#iRԈ})3RvϳB:ЭzqM4OISb2~iK>KqBz:g'-N@11gBB/ ϭvyJ$ma¢,يy9 h#(ai8bAyuKU&<{6xx_uH׶gZMPZtD ?sg1/EwrT,T:ͥ<|{:e1I^)'@ w[v1uP<Ju*7oOC\?cW YC,  ,󱩎ӎ4?MB:n-a R t!= +wcvW2X|3ſƞk^ L{sʋk#ˠ{ƯϦ56Z#",_[3GѴ.&[珞4"@^Pwr>U.]!?|e eA4=,d=^ *ʍML*O/ 'FZA3AlR 0/C;x3{ Oj#qp=R;,BڢNZ_q#wW84;-h|S(z}mf&>QpD8G:r 02(:"|{P =w * i$>6D"3L WrV*DTaj7S*Wg+[{tڥcrhbw0>k0mEJɵ_#}}KZ,%#(\X}@GEVtNPO)P*L"z9Ұ4氲UOxq۞S?IlT!!kɄwipsPD"唫NU7w[%F- QF6V{Û76Ix?腢m|OV_yUfE- YUUcP˗2-,iCLE61@o=YcWX-TZwⴟV}[A+5=Yhj(#U>-+j9n`"GBRS\Տ(]oP 9V,&,Ri^\\dh^8<>p`%RAƈWge k$ꐶC# Yoi 7o|@-={E̴[ŠJMz-{)p<]Lʑ)Dt[p*[ucն*%#g7cCh4ggmzE:ghfG؅͟sa&{4XξgC٦_8}eŢn*<DR8/43UvތLC[Y̷O<ư{RU릙4rwN2ZSǎkwxI-ݳ~N qr4يXyU@8l_VZpVTy6a-<\Tuw=AtDxȎ4MF:}wkT#wkⓐ Av}1O@1{1}3W4 Ysv o.6ܔ #5c!ie!N;rIɷhJ7 I1)ըaeԨ mlT|e2`B]VVKRH g҈ с1ӌ7"o4YV7ʮ.CP?v'O#xPE礲%mS/m(EKX oQ\xױS76Y>V-[_,,"YiMyy"IzirЛ2` %dJgHl3Q-kyN[D짰^YJ/'1e4,Ū7'c9hzfThjĪj됆zUGE| oyՂ,m!(b_$q}2PS ٥!#.!<~+!0%bdJ=4cFd5+4-o/0*9MD'GM8K-*.S bX2,wQU0rr]>&a g]6AxmxωEV֚?=axE~>̽]ݕMm nA`[BYwp$W t4!R)&Ȅ7}F_櫭9͓&Zu-Cڧ0bd'5g([ {Y) {=Kp՝k~ެ 24X-#$Ho~O3#+FbA긵}#=#$XAcC4Z5 샨M{a"6W^emxw-,OJ:q芽oBd*hf_\z$Ky} kl63->œ$'n(]4$VU5K'9Κ%5^ <#yx-yX-[:2+rcUyf4eśj|mrZmLZiWs$EiI>4r:IkǪ"-QoMcIiP.-{\=mmBBGѩNR)~e9h'Di!!a!m}va~qb%LCq3](%R_<΅1rmXَ#awo7j@{_&XW=1鲾!a}ֻ-}ǀ \Zi[_\Ƨ;ΠBAQW.EJiF%t/G4 , a/#奘Gx{vl P3,U'g8$#p8Ժ\/L1rNx |rj_U/+b 6Ljk1ZGQK#6a'?n;>Y\kibZC6˅'a;p'cᶰk3s;mOއⓑ2@ZV̽ lc};HmE+zCY̟;*\(YbM~\qTD~". 8w #)6:g ק;}w[S'%jJ) W1GAq݋=4$;UxB.Һԛ UzʢcNiqxKW "`fX{tuHdm`Yf׏MC^PG3ԃB~p[d7P{yTK OԻN+upqM1oуTVڵA=ľ|` ā@M\_;NYsEŹMγ!DϜSBYUJJADfs6~EZ.@.GJ/v+Ădc]ȭiS Lt|y̿Sy!Ԉ&c9Z-l2{ͺD≆#0"F &0s[Ӓspj]ĕb X4FgLD^m)Yj57^35u+̔7F2wxB둫jL3a[S Hn,>i||pj:^t߮Pɑz9JYKٗ_ΔV;vXEt?"v66|ʗIJ;*E΍=DA̙PJ/ C-, IqYZwӆM=M6V^K4Ί [%4Uz&"rGXcn)9^]xYlCbO]!-"" ͖s QpD_v;蘵 qbYt,c$G}{(wS3s1TY.H乓r\P|($UL)'um\.úRRśhx\"p0&뎾ygV3perШKYOyOHt_"V##>ݾg|X 8ae[,QB}ߦt rm*Y1!`\{l93ϛRk^i1[X-9l(pH"vñ缘"b^OuznSm `4 o΂+MlZN<+p輭RLJKmjC=C<}Q+m!AjܳMRh$q;? 1tq|VXLn5;* /,ԁVdAڡ% V|%Ҍ;0%B?I/mVzS\/=HX 4γ-kg`5W#k'x3k(jVʵ}}V1:." = ܷY0!Z@d0 {O\ۭ4$}بN Qoբ,JF78 ݮ"ҏdo罢Ksv m~t7e}R)@7TR$BW:Vzn82PODӅG|͙meP 5S0rV08ҷ]:œ&mO!†H )cjgWdQ53E@ ۀjQ<(&VO|'a; P4U KۤĠhUr/kb'jQZXQiƵ\ kJ&=jH}jd訩?- 3a IK[1u0o4r fD^6$^}㢏c{]Ax~%F%}LY]MۭW=7BO3I?*0Xb JζV?~bT F<3Y$]71|lXWNriyq܍3QKus9ظ$GbsHgsϬcr?F T>`NhFS(Zː`|Kl:t4/"=wU1v(bX# ;8~jI&Eɰ) f\NNQnգrSe2T{bAi}(XW[ěΒ,g9h7rؑ?Gx _/%Ļ vj03zv^(tZ:BPb4fPJ{]]u+if>BGyG|>˷3w׺y&e; {g}*bп SNAӊF"+ )b%o V:4-|)P޶i|%SA\1*jp b rć4G djIh ';lS;Ώh endstream endobj 173 0 obj << /Type /FontDescriptor /FontName /NFPOMO+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/E/P/a/b/comma/d/e/four/i/l/m/nine/one/p/r/s/two/z/zero) /FontFile 172 0 R >> endobj 174 0 obj << /Length1 1831 /Length2 11163 /Length3 0 /Length 12317 /Filter /FlateDecode >> stream xڍP] 44ݸkpwww =@p $Xaf[uNQ|KGNMjB\ظ9*o<윜httZ 0/)K/4syɘ@!%W0/% !I c34 dm忟F &I{ P1sڿd04 `qqqpwwg7wf:Y1A.6 3 h .@'1v4: /& xA@+x TT9!+e Ok\\@?,,fO`jr..3f`g苿lfbgf9Iu sp98;0#Ke!P{{ d@N@{r9V;׷biKWm(?2k S@ t=,l8S~_od|l8}_Ý ?_@@ΗpnYB!`.,[%%xظ8\7rS 8һpN0\A@?koiytDY[+e]]^.Brk-AWbrkM9ˁ<@.6-g AA<36.N{5 eR/)e!P?n`d2z9NKǟ{ `@]^\/|VP'?)Cp(*7/:Cbo$A/ z\/ [ 7:7@nC uuKɠ7K@.N_?$^l_^Ku/ %zI/v\/py9 '࿪IK\_wW _x g9,\^?es|@"B8ض!^ܝmoRtn}:Sr S] +ɔ>o;+T?[ڒ}L4fѾN MlD`Ӓyt oVwt}}@ޣqru SFz"cFX1 W6a:O>ד3l?%?u<_4⽁Ӻ_l%>hK6\:EuJgC9֎#ݺ=O |QmUs{îPt~&'Tbf`cn"w+Ss.u #[\ 6 c` y'E͢4*# c^4"u$8=L8~M 6v_&Vb7!:f2:SV{FPξ3L|bm?N{!E)q8Y" uDʳKHX@^DF毠˽!TFL1KV1@= IoWo~z74>+aqiN){EΠ{=wOu1e&4aD/d]bM!;?t}S|R،S1MtJY'J7n 64.SEBݩjFqU m9/$L&byH\s\DzR~>$I#l|ݍq4A#1F.8kvQC;%!eI FȲX PA潀^!01b=*dg~VM4cC/&2 (o*>e,*b>JθH<fm| 8 8nUʏ LV7ȖhK{(P%L[ \xLLj̍:JZO[Y +>undJ-xN7`(ɮZ.&`c!}'V߮yՌG1K{73ن<$V9tstDFRI/۳ YFoV 9yѵg'dO&(˭ߘ"yķ+FfD4=?ku m̟Ux,׺ Y^VBQ'npU*ݑ]ofewoGNU=虐T \7`^6R?hk))@>X FHIBd{' .<2y6+)>,9 (_4|d6:E'4悡͎T^[`oglI΁a2BC81h<5R1tV"bwTxmv,ԡ}7w5 z<Zv'W|)0(1i-!,tC#[KN{yJ9 {w\!_+~CId0#0Zԧ`r{+7Q L ޽*Xhb)g9q䴋 O) mPSc3@Tgpu}]4LBG4XN3~~L#s^QۖE:yL.ITfk^A՜V%*uY2p\\*@Թ#t2(GMIԋ%M{$Ey׎\lk68qu^vtDV Ve<"A>:x񰆘0_G,?Т$tcη+J!wpű]s{ɏ^bIE8(:F~,n[jV`\\KG]k._ 8 ~ ɍM~OWi;x|#$ 2렌DgF=| 2MG.R\V<&Rpd0b2j"ξk{O}ЏLHgzUCJn4JzocXx;zqikĴSQ"32Y9Lh W$hem=;?$EWJCXBV=~j0鏍V?2_eH.W6*Тvуhs%WLjGtQ TE3hgĔI7\ֵuRޚ}Յ:1{PuX ]4ob붎m^DkƪDP G/sMANSBb>, B\Agi}QAmik.0'k+Gʳ]_zaJL`Z(nx;c[+юey9B7Z}[?GM'(9'Mx+DbNikKB[VvFru9oq'>[o KQW=@`xƉyD5NAOsղ _^7 >g>⾁QL!T-Ĝ7gkeE F#RK|M6#졵 fߛzDfUcc k % {O?2+,uUqaÜáTGnkDq́$擫o e?t~Ը$$"\MP2SVe\*Ee cPD7uw۩<$1!>l AQU2Pfy}ۮA+uxkYZT[hS0ΏkG>,{a:"vDϞ1kF;-Π Hl6aR&a/5&^ 2wi*JϽ*%Iȅ B+zS94r7N~:9P{v<s&4 R8 CHXnCg2&͂6~eag|zr&.K ^c R`v.'ԁ>i//+ 2:&Ȱ%=2gќ+;v~b8p'M=RM'bs^ {=9C+ьY3NK%N(K_+kZ:|,f>̚L5j$2lX/rˏbV:+N7feDaGcP1UR#'т'i1"v4>Qx4nlW\hѥI?v2!R e!+%sBgB}iäᣴWMk5&SǒG#!^AVɽ;ތK_5xḿQd0}C!' `Xx}YI3V҄7h4Fu€߶$4N>-;x쮦-5%peS>.҇%Gu'튪&tQ08!XF ϻ_ݰ XڼO>*HZK6\ZkE?ph@fGZv6֢zZ'8͖ R=cHqW-lPjKLNU?֜o/7IIǯu-;''F ))ΝE\Uoc9¾q b!q7R= zs-,xbM%]>ZqҨq낍5h2: :.KU-%:w}%;0ty+lfdCӷĈ号؃xA6G4踧oTgYYg z:XIFa㰟2-|ra&x|F{K2>r0!Rr- 08[8gᐹ /TkKvEWX ؆qK!Fy8߃|/plް\}зKX-p3 .-VV8A\l-6-N+Uvސqn'JkՍ2@ԥ4wHsBl~4Y 2)xTݎHSn#n#Y/K1OY`">?͈i~v8ds=_mtJZ|:jyr6QH Qar8mϣU!~h&@(dӌk~@p|wc3S1r6Ej9xdF&EigQAc$Q#LW_=C]Z4 -X4g!;Ʒw 36AiQU]*&MqG{?WCm%[`Z_56}-V%=4-3*Ŝ#Adx tS{gc9,E.<|WT}%蓴އtpĝhy1h;}R/'[`VѐuK㝆-/DT i- 0oCeV+H -08$uopt ck]t6;_BtaC봄=G}/mJ~ ,T ւ1_][_ /Λ$y=3u:~ŗ& @|/VFa,ɳ@-o 3Z Y;3p~»gb2;\.oԂX Ug)^9]dFA.lR+Y'{,?Dn}SMRǏw3\!CdTAa9,qkBǚ'elfʷf!Th\Zlp(& xh[UPǙpS8;"95t\rȮbH<^JЙkqg_t>( fQC9YȤVUȑiDUKW:o1 |=jV -$+m^#HxpyUskS(5E("kG'sE ͙f_ʅX~zX9`X-7ʄ pN3+jznUs\m%8p{~U{EBk(ײnY̱hy}:X? $`P*'-'JB?q;Z&Ok/"c,: )|u4텠>JWcS7SN-dj!ՓU?Txrx.V2'gE|6͐GP?\,u~2ylKrKAP 9&xk\m:E%m~0"zeҽ-Sn?s~oE+Q9ޢ~Dž/APaשa0۝*Al*RWdtogUÎhfWTs]T09 J̇R:OdR]"NvTPݰ,.>Z cɜdU߷C6нz'?w&pueZ^B\QhG,xI 孡rs_/W.FUML~Z;1*YQ]y*\@"zY Y}WzOTm 29m Xi^$'$Gh#6fhP?~nZ OEԓ"JBScZp9V>I]#t'O˭tMEv}Y/Om';y^W c0TuiJ u3rx1,9ëE%|vTo;t%fq̷xSb_:=꼿LtEl|_̄KE^[?E+E Y4shAH56`a1T&!ē|_e@*saW:sKfܝ#w-O!S&p$FX!Ono?: %ޔfDJ>DtMhyt\|$T(sZ2\ w8ѻ (=?mڿtY,JP>IdĖyO/^-,|b-οWMr-BB=Ǫָ/x&x/GYUx>i:_)t(E;4{uX/Y}9`\(tRMӐZ-H>3y0(QH5Ct7PcI]P@clIE(HA$%ó`~|v66}j-?Ə]/4du lr LG\kJDYkdMDJ W^{+&ApF.OVm{7MLzT'~'JpnG(4l ݭ_b\J7QDn>6˸eyr8UmQM_0riH&~D>V$;j]c,uskmm.] endstream endobj 175 0 obj << /Type /FontDescriptor /FontName /RCZKWL+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/G/I/M/S/U/W/a/c/comma/dieresis/e/eight/f/five/four/i/l/m/n/o/one/period/r/s/t/three/two/u/v/y) /FontFile 174 0 R >> endobj 176 0 obj << /Length1 1928 /Length2 13251 /Length3 0 /Length 14443 /Filter /FlateDecode >> stream xڍP-w:@pww 08C K N8{Ϲ+ou^kw$SVc57Iك]YX v&6DJJu+[_VDJM=~q'&ty S\mV.>Vn> @7+3@ rFwttyO)-Q;) PX2mjV tqqcfvwwg93;Y2ܭ\, g \"0&DJ_f5{swf2@N5ُ%0u5V&DV?MM`O+P:ۿl&oHořм]$LvqF> +'ۭ{2V;os+\5V YEY\,,,ܼl#ajO'}o@V样@7O#DVV daF 2 u6x?e6[f`[Ͽl.x38Y,\fkӪ Wm,3ʂIxpLk]hAmA^y<7_rKYz6Ů.o`  3+Wʺ6ClaKr)[Z5@ll3`deaۮڼ=%oz[N) 67c8@'''['m9@5 lv&`nG?ẙDii 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¢_0k'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\bFA endstream endobj 177 0 obj << /Type /FontDescriptor /FontName /YIBKIU+CMR9 /Flags 4 /FontBBox [-39 -250 1036 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/N/R/T/U/a/b/c/comma/d/e/f/fi/g/h/hyphen/i/j/l/m/n/o/p/parenleft/parenright/period/quotedblleft/quotedblright/r/s/t/u/v/w/x/y) /FontFile 176 0 R >> endobj 178 0 obj << /Length1 2417 /Length2 15029 /Length3 0 /Length 16444 /Filter /FlateDecode >> stream xڍeP.!{q/ݭ@ww+)V(Es{|ߏ3Iv}d&TdʪLf& I{W&Vf @\AU^Mٙ@6$**5+W[oqg+,`uXX@_Ag>;cw+33@D%lea G)ou`j {45:Z\#  #rvJhl79f$*?,UsWcgL2ٻ@<@d?heoecSS;Gc{/+{ -$)07Konlekl;xc 2t1urtuav+K̀ -ao&`gwuA+wV SpXmolneofW*fn,VNn w~,@N n, 4dˉ#o&_dp~>sp* ?+spuv_ 02u,~[A`8[yt!dz33{[7EESQU[ߤe9x|؀&6vv+7 -ll0(co' pƃ?C_hoh ~cޅUV/+[$fkE?vV^+xIbjm͕q5/xx9![HZy̔\M-b`boS7|ȸ7 ^*ao`&qrQcW X\*p~sgZ `F<w/E_ HF߈"mxzʿoS8,j8N/7_vabj8~ |)Kghe6q:؂_ _;?7_ p#?N;_+ 5 n濭%̭0O`N|3op--AhiV@p lDb =x3s?lpL`cZ6 f8ںLqmO'7WY\8B ?j w |Z:8SW?ٸEw䃵p6w`K \!b .=/ne;ۜTdm3LݦY,3qWW00ʐT}2}]?XृR0CTjr{ۇYY:PUAdր9Ь4_Nk8W'P5iF% 2 .s!VHѷIQp6.kiח&tX<~o ב/Ym^ƗFҮ&b&H] ^>4|HSQX.7b$Hc3^IS&JājX{2Kb~1zH[cJv -+S9h2Gi7,G U;ۺ Sfvwgs_ιVEޔ3anx[qc<$ tOVO&r4 ͨ+Gn9y`JѡQ{PW`CQ !*?e  ΦU-3]_{mYjuj_owꊹh`n!&2 fdq [EC撤?AEiwד OL@d*^$N߼~.uF6 w2[%"g5[^)vu7q"DƺPd: Cwٍ[Ơ9N̚B|sUШ e? #%U6v<X*@rb3?L T@◇wS{e, Ij{q2봅qKϟV-e%9N5`P3Tn0sZ>x|;iכXW1oM[\O]ӚۀG: Uc7qd2br_7fZ;1SkIRz,']`'DZV,* wuG"*X7^#%+42d@#= &*^һi,xjfIjo?z3WȈLwv|vm"䨓bs!| GM9:`>-:;0->=:iU aD+(caK',ɨi0I jQ-P>K%\f_#Cٔ=C>EHܑH=˃D@SE(Yq:eyѴ]ztUZs}kaALJ{nC ֫$[(.=BmD1a v6c(g?ao̳8iwrDy|ZGmE5=N D*+kI?λH }P`#Y@wqC)ӗ)=vpT!לi^pUHI^'s|6f{ڟ2g舱 UL$eP`}s9*ƾr}]YU'vX{>Lb MC}a ?8#I9-(@{e5i0ϳKf9'e$$0 Y*# mHx4,ʎ'YeӟHXs[8N{E -\ܝ𕨭[Vzrۺ8g'ZnC`̖z&xEHY60F0m5s?B2-L*I fS,|<2mmH0qCnю=${N/u6B*Ӏ:5™7EF2jJs?:.,`·V/kԽzu^-bj‡.Bwq2PGe<ӄ_ ܰE|HHV,6zus˕+++l%7k,Byϒ_-f]Kw1aY|J#NVLEͳ#G0PKj@D~Ña&WE 2[ Qc-4Ճ}k:xS`P"BolԋHHqhk5Mro^P 7-28̚C~!~}بUa qFiʍ:&1wMvƣ k"3N oBF:|A_lIYr]KhL77ǑfZ3I&; ?^ʡB_v;Vb.;wu]i|&oqX%̛:ja[%Hu)W>K!1P${hׁQ)}~)z>"\K;Nz@W-y'_ vY /yg.f͜g Tum"4eJ23:T\q}1X-6j}~林v/lND7@Fg/z'RC>iJRg!瘇 z`.i˴ Օq'z2$WP\ {|f*zLW #B(ʭ*JD>r5Ӟ]Όr9gct,v1&R`ؔp~)$nj_| ܹwdN.cHÐZ YЇJ1"?Z\3bHx10 7VގGZh]`.IgC+|i;"H$MLV hXc %zc;QZ`)=!`. fQcho^Nb~zh."W 9̈W=شM3`@Nz⬉ [ ́1Mw}x6. JcozH nZ̘6=&3,,~JUA1=h1.n(ʽ}E!@NW WȾ kb];YBah|NNh 6^V}% ܡ#zFHkޞG(#1δ-ƭ&M^fT*}@G,(쐍 FC׬BmhyeCVU:NJ.JEB9(>4>|DƮ 6S8JP%84ܜ  zXk \aߒsVXE2: lƜ4@N[Ep >.1_NTb-6},@=9KXm?j6fbn&{HhFw۽.V,P^f$^N@+~ʪRҦ(Jq<ćĢ6{+UMtxt2%nJY+*wHZ[Cޟ(9oya_+?qhMmM7PM\/ f 9O]Ϡ,WRC-Y@.@K }9mLx!x;LD߸Yڦ;| ҮDď.(i)tԽP[^ 'lƌV^bbnV"WHgO bczmP%C%6]S4jcb.L'JJRkzd9G]NRDN0xEeB\S/Q 54b,t\oR U)2V*OV+2fpIJk>Ds(v sP!cM v|،)UMsg `#_v\8%SnHr4&H?Vs>Mk'<0\%4xytc/ vYcI0]Io\14cQ_YereU6&sB{%)L{,[ŴZBz B|BޭH'0V@89+f5FɆ7ۄ^/XqCDfHnL|t"|^uC)cҧz*ӑHx93Zri% ɋtSewÊ.[yp_wŪ܀M- nK<:McڱMsLhi^PEk[RfC2+!wbV"Y14RaKK! 8*=pFj :: AP%mTSsO'1@7-\Q $>,%-.E(~bb7pXG$]Yv7@ʇ9qn9Iіkٰ/"~t~sTeuڹIW&~xdx:HHBZI pr+>)2:Έeβ@y sd5'Z=Z%O9̂őluva^4erYiخP)YCBآW;5i-Kh~R:+> y'K.q5?i+@Q'cX: PtMApR;3fE]bxbwda-%&{3۪g5H) L}+:BFeSv+fEOGʫ\xsdα@S"{8V/dּ<%0k-G8o|8R@ߌFC"z LO: YסȗT RZ_ʩ5ÅR: `S=cDl?mXckztg2:va\g#dt1jd4٨Kltݕv5(a޿418Ydf 9.WaO]&YءyKWTERYSkV[%bJlNէ645>Ўbbsd!L~Chw4\2^MVS\yzygП/)QrWhĸ*'.>h'D'MW$-T["s!" >! %U8&8JKi}.}|))ףA6I`D[#08<{['`6ZTba"#DI)lWdi*ĖwRP D`0vΏm/]{'b!XݱO׬V:/:^Rq=qcH>V PG@[EEPzyarƊN+IxM ~Dbxf2 >>HBcu~xa@!t 0ݚVꮅz;+?nJFhN%LbUwc9dU~.BV:uu2$~]]8 ANaf]\ ^>H%RY mlk%zSX6}\EѧoM+ BMF F|VBx!c b^ј((^p6sגMLc@.LG@m8qeR͟SŖ.y>%s[>yKOɜo+ &sc;|+6iqI}Pb69_ 5eTKe={,"(%N9y^+Ư_R}Y@Ӛ]ΣPP!j3MM͔N{g `MT%K@+ܧL 7,b^DLeYB^ʼn2ZL4Ā4G ߵM֣R^DOCUTi HKE\~T& a2_:"2S888~4IU"dOɃIYb`-e:V@1NﰹqۓrݐC"2!VִT~ћMW= r)ק3{ԯīthkƯ82n)Ki^ dl߇`nBF2A]foTr&R5߫ '%:?n.&wnb($nvPAe(l)G]LcrԤڀxoQ87C('Y4SF|wu*HW3 n ԹMJEDueay9ߋ r뀶oˇ?/ 6T܋1ZD7d P zUě[5aDmⓜvh&R'ydK>VLhWL!U~VV"eW~ݏ&bvWM i`: %m= k:-%3(bir)_NE9>rzn׳KbeQH̄vL^̸Y26|=2Pk;@8˹[ iT7#mFI dYȞ3KE;,J/1z04kiS0N/:KQgG#I⮽'˝QbFqf l8b_Oˢ |t$'g -scQtUӑCƪ4iIq[eSȨ< i\t!xekXg獓}Ϸ Z# I[ J( êTr qn)9~!hЧ_޹-nmh B}Ŕ/}`޾X4=ϢC((m E%kӝՁbJxI9w9ys$48éG]eq^[}klf!J \zRu3LwFǟ|;s >$R}r;77.jo7>4j"k|r}b MqKhCD d€qiĐ+BeWJr | H/4Qv*2I&Hыye0/H:I~KBS6te]<̌u'hmp\`K'~?7 '/b*P)x YS%0O2U$ ~Eo> É)K^Bhh5yiP+ERKOYbz;RB=\\uHTU_W]7vZP*%ѣYߔԭlދAĂy>h'瑧hRN{U}%=)ttf @uFK8Ebl8@E6YQ>woHGg>I=ل]tԉd%e]ިws &:*`8x3s[uo'ǥYG$༐ 0PAE`lD3c 6{6Q_+t`$oXL4W$4'~"4` rcm/bZ-4s1Y9c:f}`7X 9[RG_eP4Y_9~ ǒP0p K,pBy=+fC TU%y4 F`h0 i->c4g~ǫGdu!WsđX.x˖pϟ &(Y"_zWJҼMXbj)<~0v"/B!ɀ?hV 2oTTy=AbLfTYcX5L!u/|=$mfV˔={ ݬаE=\ԧ82ж'\9FĊHs-4qIE$y؛5r )a_ԅe7ئjyf)i!A3PUhOt'6y/\QkD~9pV餗10lYC\cZ.]Y}%n(8-?+W,_n|7$I[ 3Y虬S<]CtZ[ӐlٺKUHs߭5䑫sƺ Mp\ G1/`T3jbwqTu‡a/A^bYxHH3^(aJdUlՠ\~<(* G$ßr\QrXG-:ԃ1&i>;G^ 4>]-H$&6wjE>%M*BO7"O<g." 3=9_VvE*frʴOj|_ e(Щᎉo)2k-SBY~c 7Bz_`R38DQa S|6kqhRI7dCe ,CN~jN?(.#zmiS'5++uW Mٹ呚أb<&hߑ{"/^?fR~P*}kZVD vmk˩z)fei[' @œK->7a5S{UP$ AʋT RsG}9 i'h -—crf-tăپjk^o0o6}w`L轇:"/,jSM@G2vŭ-qẌY I ^"'*zAiPC4x-nY4xH_SU>a؉Z2/@bRsc pG&z9?mMޫ'p:8T.W}dtUm=83e[7&NB>7.恦F}$y}.Wo{KMk9x6\v n2­ktNR)?Ӑ puAX)BhjEYyoQS/yTǠUZvq8r[1ۙnӝ`ZKcaVM}^\(3G3ݛNrraǵWcx^m¹lڪz{5w` endstream endobj 179 0 obj << /Type /FontDescriptor /FontName /QWNSYV+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/B/D/E/F/G/I/L/P/R/S/T/U/a/asciitilde/b/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/hyphen/i/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/r/s/seven/six/t/three/two/u/v/w/x/y/z/zero) /FontFile 178 0 R >> endobj 180 0 obj << /Length1 1399 /Length2 6085 /Length3 0 /Length 7047 /Filter /FlateDecode >> stream xڍvTSk.ҫ4!${oR ! $"("(](MAQ{׺w333{m^.#SQe(BbE@<@UJIA q ^^38 QHPE XM QH,K˃eA 8$7AP>B0(wŗ (Ɉ(#`h# Ї`]`|EGaqJ!źˋy{{! v)(c]&0 ~@?̀38a CbH( j a?`?_gIWDp`# AHg 0b}" qà/ 9l E㈆c1@ E_i𧬎?58?v؟κ"QHNp$ 9 V 7QcsaR 9iiIqt 2Nx @`,^Q( p9ÑdǛaN>^{`xyAQH7?474?>OT *')@FV,7V#ItBP4R_#w^0?ʷI7d+K! O7n ApJB C-a&Y{"۫CW(Xcc4>0GG_ 0_|_>9?*|~`w]u# kĥ45&.% -oCx'W[%b 3/'ſ 8z|׿G9RLOB׆(y. /E&XuGHa>fjyC+M= gvCg ܬň09"D8FVP~@q) t}~Rb boHL`l%|~kд:ibKQ7l*}-jyàJ䌰E疗PQ*(W|r5a\RI*ZBZa+Y.^*h%9Y-;>G_MVmrQ6Y( %u EQӴ9aOT(%,wF{If"02kGY8H1̣,#mFP6yO=. z{ZDGYp;?->'@qa8bWb~rm c+7zR\[Z9upx}mS~&+n9K)HzZ=d"ݣ0O #fzUv؍e u jƞʾ丮VHhTM ,=H$d3~2pǧ: #ۗb(DjHnwh2~һHZV[9u}X=K5L0Pi !X~Pdܦe/J*<'`Y=͓I^f5X?*Ke88\>1RբMp;fac}\׺sƾ} }sL!Bqz} *u+uUsٳ$`wRnN:I R?Mbw^{) zNNSJPyd UӚk)#!|ږ-z])ᘔ\ϼl1H:٥rdEf5m&/ .S .i&y5)s~Aj#7\~c;;-qÞnlmk`b[q%Nk_z㜳71 M,[>iP 3@jR7uv<z/{N6gy4c1,UqR!R+ \ZP0DU%fdLLCsy ls?Aw}Q­G Ac}6畅UU?Ofx2mVӸ[AHmK$IJ>_wYyW!>a2R't,yWÒu_uW73yS  we[s`4njU)#̝O駖}7$X!2}a,dR%i fRpʼZSD/5-EԄ~d 9{۰^kvǭ0>46 gn] tN'۬א̕zr>%%e$v჌"qQg}/'iDmp=Li7roG0jL#\]Sy$_ uˤ~:QS *N5 Dd𔐸ȴ.9rAlH(=0H>ߜ0f#P7tmV5xnokb4,(kk}~(]{^r8¾0^7o|Yj/CeG{묫䓄c][r{ZrX,ݲ+hNgޱeX _H, Sn4F-T̬eC^ [fa;s+?SA H R2lD;W.- tU \{cnB셮c>"[\9a?KQg޻̻Ǐ>!&b~MDM11-V4K :;&`: 2UErhf 1yJ]m U( _rHJzWyeF2%ME,Z_~ZTp?F*s2U듢os|bV飭* \ݥbzPza ގX7e$UIPfY2Ao>̷"yZP^0~^lǪ_`ig.ֶciF:aiF%B#\`>^exYgCZ-|d$A{gdwέ4yąz_ǩef.4> Q\O+ ]3aJJ-/;;껛A.}d}>j҈\ [~'2tH%n^ޙ}6M>}'bҵUBtfU>alo|0eɝ$bN./~rKKXN/sAͿm˲hk׫|ˇHnϳO;im]+aԮjLK`/Mp#-)2GהdH*8[L:go]TgU@^[X@ʩ 'Z[ƇXMԯ;ղ;fiL¾}˼?fv& Hۧ>MAӪtwV|ߦuX}4<6ݡiW'Ρ}'2٪ɯMrrW^_qGC;9! ?LGV+/=„I2 P wȇIv[YW~j.J .)O &!zÕEk#j}aicXssѩs*׶}O4x_;*#mӉ:S8sSC*v$voy.e3w (_C̷gy3W.,c{Y!I'|lђ1'@o54 `zOF61ߖ%:!#&Xi`V 1JY4ǩP3˥yģ9kHn7$g5N;9U,\ltd+lQ6E&BZ<^yfT%rxDǛ]yֽhlyH@S_9"9,eQ$|DrAoڂ9 G;7rղ8.0; x 8mrhI[fer"NRVʛa)aӫC7 eT!v7?tmZp 2$|xSGtt]5,iTEl/MŽw5 9؉x.i_KW77£,j~`\EoL 1M _ ^)Z:7ԎJmҽ$ 픟ZJ9e$ ,qִJI(t P2C%H /M\ez'$,zJ$7L7nPsG`AQ}#C r?v9GYb:VQU޳u.D ޷+Z^Ϸ:Oքئ63*_S&[hvh%oakџQ- m*ؘs9^[7bmSʳߝwd+؀)cMIIOzʱ&5lz5uH}mi1_+τަoϤf{҂ޑzcn>:lB㠵Kknk #>J>|~#@ x93l0N RR8YɌra)MBIrFvmvɼ"o͔4s?pZ1=:_ʢ'10iqo9|sllLxT*գs&P8ԡV endstream endobj 181 0 obj << /Type /FontDescriptor /FontName /GUOWTK+CMSY6 /Flags 4 /FontBBox [-4 -948 1329 786] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 52 /XHeight 431 /CharSet (/asteriskmath) /FontFile 180 0 R >> endobj 182 0 obj << /Length1 1400 /Length2 6060 /Length3 0 /Length 7014 /Filter /FlateDecode >> stream xڍuT6-N etn;Ac0bm4Hw4JH <"! t{}y߳su eD!B 9 PDD$""2C`]. 8@!Wl,.zEŁRrr""@1ٿQh9: ($RCNX\P>tB@ MQP NX7Ў|@o h^p'`72 h43"p$ቄ@\s>;@g6@QY BQn/t@ VA~B\1(\> p~T1Bp@w,A( nH b?硫@á ެ sp@ a?A<݅͑O JJII@Igy3_w/O3A;D8q? Ģ=@TC@@{# : w}-EpG/ O kV?>UU_H\($+) JK]?/r"TA:17?#>;A C}I(K[RoYE/7/ᆸ!\}C-ῥl!<۫䡂tQ\HT$"ێh"|0#H0o\p*~8QTFC|"8X/) @aťq(4ZŁ 3ۂO'_ h4N~xp80=ʇ; o>VadskLUw${򩿓lQFS#G>6!sOxK[B}ǻ[0tFՏ7)<,'";W+W[1ֲ߀nloqVll(LO3s8Djs<81ܞ *HFZ?]^F ^K"F] B>GX ;JGdph~w]Ν&NWf{OpԪs%Ar\=pcKUV_N tÜն.Ie!Ck vJ)or޿Hb$eKG R2I}Ne:Pj3f<& Q8N˓xH-e#gymc>*~tQQ08q wLJaF]⬎g0t^d[rRmWd#>uY[%7u$iPO)Bug/0GKcvNH- ì]0cnjR>uhGՐml.A0pƍ.[[:0n`#ӏJV_HSAtC̕$ Cc}DbR#,ELըrylQTK@y7,K5/@uYRC &!U[ݶ^izZLʃSS#5VO9{f*vMBz ~Zj7”ų?Րz/ڻıQgԙܭ[^x' _hG5-boVq'pyjOcUȶd{hV piÈeDϱA PNBb1*,BΓD zUh W&˽mo;3b2J",} 'ٚD\HFcβ6OR=>X>{D@~īo-tr[2Ye\]+o^k4?0=lܮ eN~ϻD(et[̵%vǝ^Ly*όVXStNm0tlWڦ/=2ݨcĭ˦ yxc[L 9gzt;Fp&Trlqr1p󪹗]0'~Z F!T:5wʈf09 rw8 ﭸ |8v1kPaԶuJyM5ozwoJ#6&c ơ~9ԝ$d`g&li{"=Pc. =B RװW)uN]_}:jD7<MJmx7䳾=e*F+ŧA>]D7 2 ?V"aW^< ./3uziCsۀ*v9&5[4%wZ=7&b@l #Pwd H`|~؝ٍ]4#lۅq)miWDIUC/s+#5IlM3̗az0dَk{CsI辶4V<I-sH?'>[4.'$^7U,s X*E%q?X{3NJf'EG6|R\XPqRZt gngJ`%'ySm*?5!N .3 BVQ"|N O^x)>+]pAN+F e}>T 3;_{n9 ge{fcb!($:ȾI%׆}ZV#56Ot2!kz\ݞR`BG*'AZMGbDn^k=W*<"5Y]Vm~Ջgrn1̠qh y%I*m泉ÜjuOJ3zq6-v1샋Gl.#Aކliښ/OkT& ׫|3PG(V_lGGO$iX1p NνToޕ~9ϫۅL.li%}ۀaU% zc#aϔ(v{ mz(xuܽI8­Pƭ兘)d!=+3thԫlSVx$lgI96z Xrù{ ;c(&_h^Ԟmq%`qP&!FOzu``P}ƚ eԸLzY :w_$%{PFx638뿏h.(w8w G3=_o+xv~~` 3'7y=I6K%Ys  =;ĦAu(P0rzX9B` "@awG[U E8*[n$;Rd )ݯz}2ݮG+ūssZu޷7_MQdٺ{|$zGqI:B=g]f! %׮vp:$I\ ʓa./tY1ޛv,WX4]bJ.| 2])^Ƥt)>Q:ckM̓s&=JVڼ]}mp?e"/HH4#l攻A6\tl0Е&4C֥S 93%)`Φ m{SCq-V]k1co[|۲0b*VCv ^۵G1猪Kխݳ[ amF){FNj !:џUpvAm#mY@zm/ZLDPƧ[&7\B\Е F3ǟ<ߡz8lg(N?)ͯtxH?C+1t/0zZqUcblw# 6ש\ Lpz)\f~撌vkA(ε%|g'JU:ͷҚ8 ٔMC(*f]z";Ś~XX.$9ܔ{EJ7cXCϨ>:+Hj"; EØ}Xx{{HMΘ`z/}]p9@dN}qbᕨaIcF_*50k9P-e5Ϫ%u*C?4 `E*o͑_ʪNp8ؙ-3e;h^Sut5M7v#wNoO;I]{W*<7˞FnkTǭ u%nόx&N,ym7J>PblbWȪ@$G B}oZ._drBr`xq5w1J 5"Q[y:w{_^tOؘd*g1^&S%Zl]qFC P+g DS^F֐ P#]i~w_P`₦C`N*_f MT`WUwI)maGԽ|s#njd0/k1K ^cɬ ȼ:|0r Z ]m=%C)T8\ﺂ1-H)n.Su`I鬎W}rTWlPx~f^`u+6,n0sH Ը)5ay0:6ZSU-/苂@F>o n/;{M?'}^uH7/iyK_k=9',*{|!XᘋyGPrƹU7yzItݣtTR:%+^ OFB5GOlT(<_l%*Dl *FI+||>=7w ƅ W2[Nݺg kiD}ޤZ<*X!۹-ee~,@;4':`G¹1alm-r| \u\Nh*EҼ gk-odNڸcx )i Fϵ*)m%v/}8-˚GeJWvb㽇ʌXiy79HkKzghJĽxvUzZ$X*@Eڭfv[nƱql ZTF!EXg Ӿ˹AdG5YsSK}f5`2/0C3%4g|g#d䦝s 3ہ:/5ḃ\Ūg.^ NLPM He皸?uv\s8 dY(\ۛLЦ:OKHµ2w^g.4iU$Še j@B^$zW?D9cYd\Eu`(h[Jk#;SR\%W+OHƅuK9(20Ѐ*PdQx c(~ W!F*e?n&M eݟ endstream endobj 183 0 obj << /Type /FontDescriptor /FontName /FRNIHB+CMSY8 /Flags 4 /FontBBox [-30 -955 1185 779] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 46 /XHeight 431 /CharSet (/asteriskmath) /FontFile 182 0 R >> endobj 184 0 obj << /Length1 1809 /Length2 12340 /Length3 0 /Length 13476 /Filter /FlateDecode >> stream xڍPX.܃Cn;kq<C cfgwfޫsn5[-6)K9HebȨj+qq89y99QP{пt W0Q2. E& Bo\<.~a.aNN7'п !.Y;xq@\6З<>-\BB@.` #@9d `B0@N@Wv8+ h\A. Kj@_Q6`) VP "[]_\-A.-%_*2`;G @  h ۃ*PO(+h!t/Ki/ jvG69Z@@PW?,^9B<}Vаtsq;dy-A|܂3iaGm/'ПJ?/| N ?@]@~>T7BX-s5/bտ=F/˄YB69TU4U X4`pqq^~?7?o࿪GD%G+@_$^o"M_k jycN>N/%oHO= ?z/yv*eCTVYW숔˜qsKv{,߂6_K{#-ǻ?ճ{y[\_Oe;]\^/>\/j s  8xJA  8FB ^[ pX @h_|nwml^-^d)Vqes9 /8.T^q||?Ke/y /x -\\^?We|A OB$Զ6Zԃ7/Y+m9b`s_ѷMv9L}ӣ_/ַ#ZoNqR2|hiYDž !wD++l&byB;>wTJHv*ѺIN&ަr\*eoa8)_|D`nWcE{h똖Hԙvu@ lOs"]ŭQ)څ<| ee xb(h (8ʾ*5Ӊڮ)3酬xo}湦-PFC\[!0Yȶf>,E4:*{}`2_ɣ1!p.A=G;GWD}#>˻`hBDjodV ] uV\Dg=k۔!O)2|⻜3 yl" 7y ~9?gg='שJB+u5`}/YQ7.F6\GM{Z2[wQ#Abf+nrRщw~n0?(*S.~Ќ#[|-" hPAo/9ʝV'].Mҍ;h,2+ as2N~w'a֋qXb#BR>㏬8֥ri%E"|)w/J~i-|V7X'j^@!ͭ2VQ1IKj6Qte+~n9.9$p^7ViA0Ffe˞y}nAsrLUȕqHș|]c6+7 "j|I8zۚeJ^u;$sl$ QaZ?P7}] }W)-4i68]Jtdɨ\(: ,ul#O޲߻޳ԄǠt*ciG9:!L0_mv?PוeɔIecIA sQL"Dܨ;akR O;@dFW!BXYSڡϸ?sB0r>^25<.8NsHXZ?4 Ihbp7]Gc979q]V+fI(?6X> F !?"b&fISZn*jz/yZ^Wt/Tm厱rږm2Kmn\^qYSjJRҪ;20WP"h%/2샳Ea^nǦ}ˣJ Or6+CdmTNG~ථ{gED(8KԮWKRIe;$t6OݔtVrV;vRq(3u5d X1) :T?k{N&'^Zvㅴ':}s@e85pÍoOv 3i4a ;-P^ qjT,>Ⱥ{}p/^_3j1Cfڽ!9lލ ??6sb7a~z$?UymӴ혧ҭtT֒s%iY:=.Qot6 !>zMzO]o'Ǻ'<\qK6Mj3%wG²P)?#9tֺ#O¹Σ-:Y9=q.UGVS]ȿTqQ 4VׅQ;M>..\[.x2hMgMS/aPc]Xu׋en6|K4Q᷄NPpb])lGޢYmqՉ!a_}03сiIޣLB>f-±?Z6\o&ѹT >:6:D/Ԙ{z~^mZ|QmαOTTU՘p()NL2 0E~ ;EHn.v?X_2'q-Fau*gn0ξXߊHnqvw~/r3y}RQ&}˟MṌ.5]͸U yXY{ N1 TͧBS'{1bۙ4i&d+!qF>@nk#/Y9HgəׄzPr.׾&jP!I8FZfu&k=$.ApקZ{F`RǿҬQ3r7)kIe^MIuvUﯪY1S{Vd#[vyդK^uoyAM[%SƥK%NWrدٯ'ʿHw4dQ00Qt[ѡHyFLԳr{6ʼ)cyaQ_{dѷչ9VwjTp~FYo̒Bz7!Tq] _ Z]lieQz]7=ҳ".{ډuIky'NG8bbrZ'-ޥH֠ȬW/eiĭs靖*C會]8џl Oj5C ęgJ|Dd@J ys?b5ǥ@0Cz侨"i5%ӀJ qxTyqChR"U CQ~[<yLLx+W૒Ե\ I!ߔּӵ=,SJV>6r&|!F&U29auՂ gӬ֘K<,@,|%&ږuvΤ]Nv w1 nRj Y[c>@7eU#LBK[+y¢O(+TFuXYWdcHr%$tz\gk;vPv[> |Sz7:LYEq_1 bϹHޱb:qcl[yiC3$=⬬OR q4vV8̞|E,r5id+16nWP?9YPՆ4AZI?k6j+LdۍjF߅^[i)(#ɪԃD٧ayF٥Lm臭NIO!$N1+W?l/ߙp"F 9խIp/~$i sؘ][jU=BHh4Dސt7B4Eˢ P%.i+%'>j.w%]I\I?)KVO|/0_ͼ/L 9nU O4yׂ 6qVrљXs9$5CRM$-Mk?ԧ9]2O8eਲ>Xg%Oh #2vwEih߱šCX}`a],BNZJi dd6"ӮK6OaQ/8VF w]1fn2 k&WEq.֥2qo k;E<]ߌ T7lIpY䨻k,Pxr^-mA 'QY%VqcBғ`q16u`cVژDx'w%/oJ܂%%?kW}RopۆMn#^$836b+%$y|ݙdSmI`R3@k+NXy%50'r5 c@I&4Q FogIǿb;*ӴŚ#I`ZsK 094*9M?Em_nL{|%"NYu{WSmF"~%Ӈ+5ynыItOf #II&fmLnѬo# 9ʎۦ3^C,ח6ߨn:#:~b)߉HDpsK+;VCɸ4u䩏yQLj鏹%lEA&?+:6]nT J 5`ʹGpǬxL3X\tz` 5f#)Pt| Z$WP*OڙWs5?DL\0O;alo#= i6sU[kYYDoXrE8GEri˚Y7>UQЮ( )ޭ^mnB_A1+AO%Arﺼ 1|ʕ ||&,G6gav7T j*÷[wl j`WzNRq(>޲Ǿ0nȠEM8!B*0GUҳ5C'~1<vqsA 8/S)aN(N7,%l?(0¯ W_,w tb5ǐhKPbN5rz䡩IAMFclg50%O0kA)Q2+e٢k&ʉGH# Xa%((xLU."9@hNb{Q\m# N(sPhٶ :x>AYZkF5%̟ { ۊs J(ȷ&wZCbn0YS󭈽ר1X6̀<ēCا&}qO)d:B-q8Lij9T w /d⨭9& ׸F[o0k.!gI#iT0UK};2tv;F~ABRnR,m2.]90$c);Qw#s(1~"dQksJS\ue0.xB:4h7d'tͺYkzAgY V'%%>{`^;T>fONiJ$m3pnuɂ0,<}%\?7PHס(}p:+ f`WPLo˖ma_ؔS] zv;d;ZkvR?NtpqiP|D#MB"WȈLG_~^q",,M 14~1OK1Z-4TݳEcHa":ލfom;@R;fc6p}av+g(6$Qe*`VoRPTl ¤Ƣb>r6]L^%cRX,+3;Txe` ZVe6QSsM_Oi+J2}oX'SLADFN@S_I՞Z[(%#x< rrQN]@d6i"H}&=\uk(pSi+pU S@ZH4ʳ~H?mw)~fkLrmjoY0ߍ=ȔqVaQHWzKk5#M3ęֲZcxWͣMl#]b)}"0.LKjʑ/ž7˅e_TZ0-y0vv Cݓ$0w+s 9q@B=ߩS~CBD% uNIH" ^kFpQ3`IcPƯMtEA3TޣoVOju .Q+2 #d]GV+Y}(1} Lwt/oWAb=.c mUќz Ӫn^Ra1D}AR |p?l(}0U98Q`A{$<}8NKyÝ밮@7]/#z=ps{ɩB5n'{'"U~.1Pl^싇gÁ-g\~ r^YQˀ-2Q{4 ]q|BdA+oB5SNv%AGa$`N21NE$*IxS׫בٔ= eE4o=T\8,%gFU62nE W74Qfq6r Hϖof3)gw=v[zMJͽf[ʵn.͏n[gZʶ53l,#aJfti)\na)&g-hY;@Ck޲K'! b31~޹plLD T44eN< B< (a"3Q3x}C$0KRwkvvYuEփjӊG_ɮ#\X6'ڠ:A# O'?5z-RU]vL[q6J ?pH gt#S|SOjN352-V-|>?orH!GeyyOAg܎8 !n%B|z9jdfokI0PsוB C_rA |.VnxǚRܡN>:56~?Xt 4UQ)(% ek% rꮧl\ XDH ^Kǟ><⭰F~c?4*wOa)8>S|;ڋ9swƢPr! cR[7Qu4ی.T͌ \=̱|VW>\፞mU+n/Ͽ`">v΍VbZ\0fΰ".J"GPIS(פ]ÍQϘDUP8=c:`8pKT7ҿ'9]N~B3gWޣe [y?%AVfW iC- C]u`GDm?e*<`ķsSAU꠷{Tw'èa6tp)oEcXDRߐMiÞꡏpjiŜpL9܉l0h`Q+;mnr\AwU M35ᱎng3/ ce]LoU' hqSagz2èz,rkFh)\@ӝ>~sG%~3OTZ$U=STǡO6#ZŁ#-ckm5Wa_2#]Rr`KVW"Jbზ_jI}եdD@뾆}݀KE6r'@dةVo+GtM,Xa޺S*/s23sj#x `3FN{M2T&Q& <[2C; `6CP춉ڂVJ +q6鼯8[L XڌgQbd܉ܕ& ~=׈cS,p@KtXP\"'ƾ3s?fm&QӔÄ䖩l/\RxT,W*'J B9fOV;|c] kJĥYyÓp\}.8 "c DN NBqHZ>}tA.ڹv':A0^NNeGb\wWcM>i*~obqCT1DzeRX"i㦷}jQq:Stx, y%zu-<]G[ NZ9̺Tu"Z(̬\c(ƼgKFSc~js(G>_JZmpEon^{UR?*oIjc C7_*7hͨa;Jt-qhGG4OnO҂g"`( =ֆ`e=|*NZw)Ց81ux;q2i@69U$t H!kOM `_aƊQ8 Y-Em:0-CfT7ӉqDbL238Zu Ѭlx/p;-(Cjgw dZP:,I)cϙ2wzn&e~6cC{Ao- +]≔rotD~dWdX獺n;哮(̱~9uA $D|1 ]=|gfu4bٖXTՃȧ.Z}K*L;C6|fKPOsM7Sfʸ1YR?ϺNKfĄE :s1%v~xf!ՈjhLݜsS2*s@Ov uՎN'~h! ~}Bŀ챡u;oe͕T-PY:?*{zʿDf+"K?X?^,~Kk`U*MX+Xr`"Z]V6sq@lOO$TY'3(Ǟ 05Kh=7uv1YQ(GZ] nchvac,.~w *;P\ǬxΦG3Kĵzox %BEo7*]CAΖ@7TC2.Ҋ-M,0FOӚ^1P1Iwa%+WoU}xU ։ $[ : ƨ0xH_:x ~} Qؠ,}`hB^bۗ9&5y3̒'fD:v7ᘀ.$zEm" X]zx"R;5t3QYUfC7ez[Hf$l :}5 ݳi)0IDl:]|v GmGٲψK&O ;]5 >w/{@ɥec0{{3JY/vzJ> zWDWOh1ǙA _f8@u ;e~32chjAorooXP K41 %|p&nlYna&o icIcg7[Y33 pRn(fSrXi"N endstream endobj 185 0 obj << /Type /FontDescriptor /FontName /GMLRMY+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/I/W/a/b/c/comma/d/e/f/fi/g/h/hyphen/i/l/m/n/o/p/period/r/s/t/u/v/w/y) /FontFile 184 0 R >> endobj 186 0 obj << /Length1 2350 /Length2 16195 /Length3 0 /Length 17589 /Filter /FlateDecode >> stream xڌPk V)݊Cqw(P܊CޯtϜ3Ir-Z$$j "f $ޅ `ffcdffEPrG@ trB h.7vy7Td]m,lN^.^ff+33 ANqc7+3#@dtF9x:YYXW) ow`b {hjl PZ]<'5/;3#Bnb P:܀f(ƈ@PrB dn lL.f@'{v<@h/c #@V;=-V@< =/Cc[gлɻߥ$ET ř/LyohW}VN@{2{6 w{ s+{3h:0i[9em.B#8X@GԒ,9z;4Vogc7 O" hae'h/>'+zm==b&UEmq SRTf`08ظ<_Tߵ#9/   3(޷9MX?]m_Q_V$jk_?zc;+[[oPkqVY_ o#%{ӾSt5vGJ~1X:1wZ.8p|o?{@wo S{$/ӿRϵ`Ao;?34EXYXׅtwg؟Ja^qt}DM rIC]ߓ^%~>mm kKRiy6LPoG>=4]t*R?HO.|h -Kʍ\q> Q?X6rP)b!F#S`EI".) !-E֙gjC?]`R2PP14qQ&bi7K7*xu~?-Ni<]"aLlmp9#>+hiBLXvͬZx] |R!װ" ̂TH4jA7;ؿ9M R3RCiu_n(?l0 _bXo|2/FC-RT\KpE, lѱ>! zx~y堖77zI+'t{u{yDׅjQ%eR7-V}J5Yf4|[&nܰ?18rWhkY>ЩNÜ<[Gbt`,)\y{ͧTe3=x_*9Mn.`Rk='jc؛NrE%avCZ7b([ vh10:Ⱥ“2r$#_F|Uvmo]}IJk%qG!pZLGN~C80E. fi}y_38&u78~KA Wgq >#y\{ʒ"14׼Q 4[Â_X'i*ʐ}WkE Ab~wړT-\ך, 1MD3v( pIS{.E%ṢxwĘ#\^ϖ:؉HK'QI'W%OegOVWJDTqujjL*nYz驞_;ɪ2|L[9TpoOݒ\+oT)UJ޳;Z#O|YEv" #tyc^caFln}=Y!V,ePC[|NhXp}D8Z2 UtP)qB=?4e[* %D&R4}EgBm:j .<`.ZĶ"=‘w*0m!ElIlFG~;' 2j R߻_xja~bZ̙!Nt8%U@j9[ 廷'CFSm[!TKGm4uN&^o..oʈ·*uXZn+#4g1)=B#PQxP 2YMt{H2`Jd/Ѿbt02xft{)k1x=EV1-\ v#[o<83=oj oQDɘbrX9T [򦹎X C΅)B=TIZ5 R3LjJ%Zt,ܬ B-l\H7?$J|3k 'XB c%GEDF]A*Ôe޼IJP $.PG$g^"(|7 (a8&<{ f_DdU9iIbf=u_!?T՜)`T* 'DB ^K)U$O?藱qB!^ YpSN`1ߦ&17^6+FAj3{ulsc5>joX[rqw5ݦ]U@W e{jčI5,4̞~L(w6^bw<@'ef'NOcY].=}ֶUIV+-]o"l66M@4P\q-;)'_c< FuF]V/hl ?`UIfO.wAiZX>Z!'3aS\fJc!ZQ x5U898nD 0D˻<2Ӈ8b,7P>%E>'2YꥯP}&(JG5OXw`{HP64$@}N8T?a:+iR实lc/Tχ 7a|bCx4:JuRo"+onNJkp0A[Lgχ5X-~bVb9 = w߉_*O*Xi'#mL)'*}UĬabDtu?O1N99U!YiuA+VŞi򷼄2/eZ4e}3ZC[sq&֣a[lņvLG[*W] \Q+B b8ZW\e Ş~iA%q*m/礔IYsrC%@v-ĿI]i!e7PW| c ӻY|<%Sȼ(m˖/ZkQ!s.g׍_=dWX a"=j G 03OPwS]^LhrY"ee9;!l>" ^;:ZewJsi0)JMєrUöZ%8 Hs}e8@$kCP}2<{"BQV{;ˊ5Z B=ӑ#ć1 Ds`nby%'&T*#^酫N26p+nhp) #O_,1!u__޸v>puڂ2#Bn]CԄ&u+; r@;KHf@9$:xm~;VO fR"OU2Mjh2ы n+|bxv7[r*3fGNY'ОJx}a`%0|=ΨlxXnr&TIUcqEG3 ?/& :y s攚X@ߜӂ? C 7M44Wd`,afdYBRAZW"(&6򲉉)cԋt/'xc>>*G6RػfjMl1~69)#wg9al]5}Qϟvv޲=;$ULτ&nc iIKSX:LR@_+oinApc2ƟXH4YPWlt(3R)D-08`8-hj f_-c*+"na{7EF:Λe5T$2}Kwl5R܇{Ęqsk7mL!ʞ@skݑ0vv;m!s4o),#_f븋"u&i I=Dxp+/KYSM >$A]vIUl-lfjsfZH:Hy}+'-/ͤT8*I|$Y}{'EVG8ew>]9cÝ_z˱M|!1XL֙23*+)cX 敬C:熡2ڏݠM}>+E?AM`%I<-uM1$gmĢ15 &qX,scMӰ=d~Nc1ڤTb#J:#Lu?biz2B\FکH0Y%Zv0T>#j =*ZNG$ ^A3C{6ETԻ,BzGugx dW<K.H4IO nB+0*dh8{Ӊ m\m"%|>`'΂BڅKd2\-- H$u7D 0__)"Grk#y's4ܑa̎ayl5A0^AJ aiFxW_d&,*mj\! &]nܾW7^܇SFVJcjz~ R12f{LbAZʻBDX&WDM&~fXXT*t;\F <&$2 l cQb}[$@3(IUdKblOO2cUૺedh]BLWb~oX f!_& Vt8(/l;:f5~[.5ऩ}Uzʶ]KY \z/O;uhMiXRHE=(c\^)Y_gd` nTfdU!G܂=@QLC#JO y#p̑[T9jmwvMp@Fw܆E]]AQ /} Fa~S3k| |tQHf$ᴼ. ?T͎E`Lz|YeFIj)7ֆp\O2Kԇ:6|qg:;s#RϚ *z]>ȣ FU]b| :|vo^J!7ӎ&YT_H=Aw,&p ^6[qx_Hю]rs ERrtc,#$tF Bq =pLԸ# )5~z[ڃID?5;e%؃dwHH.7=f=hBPA5iKw%n+%-:[5j+e]L}ZCɎݓRR?L ~gG_)P[Rzr9#qa<,z\.).n,aKNY=yQa>/ :Tv\\Sg96/t⬌4^T`oǣHza}Kwv@Z33Ji$GFc4jQ RWT6M A3Ȫ=-v%y*>oAw1! uG"FG_*7gSDܵ8ZXi[DEЕWøqa+bL:4:_68ٮlQ;aG @|J ֳd71j Hgf6:8?EX6_J\ P8CnW :M;M9=͎rn/M6|d`XdQ &v0&{\c\P#;⬿L"Vu&͸@f4k/sNF'IkaHQZf*>U{mI a8toM0D8tɁ= ń7;25Y՟黡+6Q>z=eFuVC7ֹmuy_^rp#4`G+-fLϼ,$ 9 ;wiI,IBJP6q{sjb؇yS'[j\ٸԵ|FY@E5|9)cu^3Fm3F/vgsQ,_ҏõ1 u~j=>]}6)8Q8r^ :3a?t?9B`?X)8f ~,ēVk[3| qT(doL,Ľ@,zƋ"xH+G#|7I7JVzZ.X "^x'q\yz$Z^cT2uXwx"Y)"|Ȣ&oQh Vί{(jJIurœ`'-맿 y&p,%Oz۰h9ɶ.m[k)sO}#S+QKkKze(i 1'딡l J_HZL xO K20Z 3,J ~FP,!(!VOlإވGG1'[B%` OM(i:H˛sn/sy`9L[@ c cκ~ 0pP M$geXEQȝR8W:_&,\cIEF}HBB{P3{'F{ȜQz^a䟤u @}#޶p)\ٹbxZ꨾n? [oG?;u%ރs(g˛Kx!7u[>"{^Wf2_ T-PwX]g ҷ:, bVBC k=̳߭iCZ_B7 ~ 10}ߙBe^93 | ̴stHHF8QF+Q{JQUVgш}ڔ}3`jpx9ܶ #>^|MXΟ z&[{EIszd2$.6ڐ $jY`; +̄ _3*3562$~ TH \<É$4{9JGYBIaS: 'ZV=DƱf*Jm4)\$y!4ay.Po3,Jb Mae> 7y*RsW0|YPssW)s: 7YcvW{].؉l8\7t=s@`2'kTQ&`B6Qw#_*g41inזTNaJN&'IHY5'I.O/3v˥rCZ}̹_ k6?pBPۛi|֫Լtsda~ޒTn8>L4AyR[]Ŧ~L+6#285 ޤBO\h7,P*HyiI?vEK#0V"GjRܵ{;wޔLMנWmwQ k1U:y~6D(?m@"0\\SK@*N )#N-^ǑFSRE֚eX 0&(U &󶢖1w…2rjix%䧋NNƳ7J(,pWns-9LkT;]ScR/ _N_[̕#4lqlZc6SkD4xt! X)W*ƻFTtG/`E`0M ]ϝ;?=g0?Oǻ2O1cyK 7Ijox,mo `wPՉۅmAJENsbc+ κ+ð4RCb7j\f 6?%L!iPHMJlyTn6AJmO@"&V*ebUťiJ(疑nJϼX;?=ȃT82={dqr<T=x!TsZ )ެ0ݺ^3V:HG-,7! 8B/U EO!ˏ6i Fӱ''D)Dl!mv}ɳG]ڎ=,N :o&jW%vb hoߒN>#~t`HS*h\zhpCrA EjrfQ~ ~]NoXJ=jo(EYhWL#о5Z FrIYTmkܩŚ7(|*<-Qn2F| )d-.\͍EO|f{4"ǃ:cQ+2 !rgbW?(fAeԞ2a*ך9MY(gq%uUK(*FH7-yj bS-NOfMjRE#Ħaѳq<Η-}t͆xI+$GqՕe;9wO/7 8.#{w5OJnc~X0~˪ڬf@άȖ둟p~y!dOҾ_(K2X577?(١CB4z3P(|D!iiS6 DѫUMALDҢK~E}f.f*2_bQ .47!1k|a\s^" 0TE%ͬ++~*AEk#cr6 :.IU(3RTjGSp`Un\y Mv\l0$c+ȷ58 J"7:deԖI\=|KTu%u=u̸ #V8]qܟƔCy"o3/OŸ˾Fn-{#OlեIʑW/漎U$qI BՓm^f%Vw [lzWUAC+0<{sUiFX}/u36̔ڵb%s˩lg='E¥g|Is"!2zeA2-HәPI[SNcNpr ԧU)XR^ ̼ކlUL o G4ohst"ūl Ͳ-WmܕQTɪp麪77m迭quSGGOo?%neIjA-#SLiwцXhm9vfB7!FKS~W)ڙANcZ:rnl/ Nx nQGϑ<*dN*2,ä Ao=|[/5P=I 4u4*b"*FSG pKCnr@6N͵v` rmUsDCBnŐh p_J MҹX- 5ٕ5  \H(3& 5K Ruh@:4R~`rX1U; d]u"&L+ Ȥv9=YqYuCI-pGr.)-y=&;AGͫ!W @uՆd L~v{{P R^CDkBjw4Ͻ@V_lt(0j]k\' ^*\/" E`N'n '~*8-c7c_]B2i"H:N3հfoPOu tfo>*( Q:BByP֧>rvHQՂkOTsmCkGt$vk~9JcRR5*٨.-&xmfQkW$^ޑzSgǃ/M`)ΕL!3,Y߸8P5)2|HW'!Gy)ΔCpeyZ")Zu7 = s.0e˸ Q k""R`(UZ5i{OO@,'NҌ)YQʯTv,tdK%c 绥2q_/|̉6+|X(EX<5{<% ? olqg/I6wQʀ90WCTE&I$>Ww$$@F3}OߌȞuF6LrP+t)z_+U-MguiW6+w U`cVr֯&'vZ&^F5o9V["jx{$Gmo7 '?Ԋty 94Y%pl 'є̹eZ3)R"fr81bԵ#j6ImXj:53%+3"7W|F>M'62Vm6P?0؎.~:ƿ1g|p]'j倏{*Ț lMm/Ow'Ed7S _O14"t?b:#Ђsnᗡ=A+@ȊQ@AF-ުL2oI#n~.鏉9-`|iI >u endstream endobj 187 0 obj << /Type /FontDescriptor /FontName /MRNXDE+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/F/G/L/N/P/R/S/a/b/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/period/q/quotedbl/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 186 0 R >> endobj 188 0 obj << /Length1 1481 /Length2 2280 /Length3 0 /Length 3220 /Filter /FlateDecode >> stream xڍT 8T{DXb6KY* Jrc̜1'13.EDM .k)]e+RRwHgyRo@@28)`N$@ a!>hm<M@XsA( `6@4Ʀ @"L)`C p@`ѲF8a\ȟG|}thbAo> N4> D;il C ?Xs1!\:z*!  8j8΂x_n/qAu!:Д`r;fO\8 L. -ddrhpL .d h0cHc4B4?0t@th(~<:y8Ğ㈟+^-̰FA̝t bB09G{PP0hoA]>t~{(( 0 b&G >71!D~?cWG Ο aWTa f}Ϗje~򷠕 D}!`D2M|w Z8{={&_(wFȂ. KA &|S\)fDZ_B`>N?;/2F4tC,axd(dltּbΆ`pƒ7>@G ]9zMÚF##4.!"DtG`輴<Fh 37R"*5<8[0 w0$x!`xF2otbz0.P:_/tLSn$d@d(];~H(cV1kԄAvbeĩrIe+ EJ4]qӯ_/Enk%4XQk3WSBVUzA3_W^15Xt'%{7Hݱ<{ز]{M޸EӛkSjHF}DGF9³#^U+9Zնgbcb~1Tb vY-S29 ;utCc8Nd>.T6m -{ ?lɳȴxͣcE7 xC}BWK fI$~1>9}c`w^f]/2gzB$vcjGhquC3%/:],{0X%dWLpuIܲhʑ/.Gw7/YumYa2O>C/-,4ilYg JYo7|ETIT-/3[e͉}c'b{fJ1P\3UHyTʛt'g=XsucCőm 91mԌ!G^ݱD}X%nZbquf ЮNu8Q*QfVbrjgzFRSuIL ZQR1ǜ/8IP)~X㑎l#u*G3i8,CB=i#5IeeD5gWx)F=M"gD]|+̤^4e=~Q2?zؒOj<%nHop9b9̤ <|ʦ͛2bo{ 9W_Nt$c lYW7sŒU5IRdncY˱suCV%?K \y,ҠC#.'p-$i')OT=ExUhAlfH(<"ݤz}U\=ޙ9 mW? E1'"q]]_쓯{?(qzini˱gN4 hحMn,N#K6RkSz7GDv,+gƶ\H;?ٗ__-fV9zJOjC%C(_RSs/.]ž&x(PI;˄Y !B>fR(ZJɫO3eaG2IW0>2|t'(:hrcC/ϧT;(UD?U h(ߘ:QjqK~t҈a=.iJ4{;u7S/uDݻUUg,u 48y_mL#oOᮍ#eb}x?K_osh\hkqBw']^n?;/G1/!C15\62kOܒtC}pMKY gNfk&\-qVNs?3fxcyvct=I"`rMMIav@=bGvvhxr#)჏Gś >mR,}@iٻ}Cǵ\fD9`vY]$@Rݲ. ĊiQ3c-XXpDf;$ϲ7/ջXvj@unFLFFPr>l5\ erbK-4gVWz#q~__X4×|z-+bd7̭τW63rj{090>7C硏BPDXg՝jA#2]~[<\xU/8k|m~2yqAr5S?cwUKg̬/gOWZ-OYu1X[|Vbx=8s8g8euŀw% v=Wg7zej(4yvÁCćQۋR/#-/l8 ?xb/aZH#㣩]bE֖c;k $_CL endstream endobj 189 0 obj << /Type /FontDescriptor /FontName /QBZSZB+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/e/g/o/p/r/s/v) /FontFile 188 0 R >> endobj 190 0 obj << /Length1 1614 /Length2 3396 /Length3 0 /Length 4399 /Filter /FlateDecode >> stream xڍw 4m~-+䍟j 3g7E(z cf0fK"PR"{e %[TD([Y#;hs9f{{뾯9DZNKv$Bبp<w3$JÓISqh:h3@8s2 0a"PVG#LU x,`.I8DL1?~RiJt8*&h;Ak2QBJӝN`>>>h"MLuӒ>x;`8,I8&16x75ٕ@cp$ aqT<66,(8ҷ`oP{o A!ӠdW|a6L~cӧG吀TBjj@E~A}jW=c+PlE!}a?O8F~ c?R߬ B1-ԖqxP :dp5H }[ds kLGˡKr#l#Ⱆx:}K.?V'I8K2 r8?>p0kBG牆$ u HeM8࠸H'绥k&O"dUS`MRV'TS`.?` ~BPj0w?;mߠ#oFUND:ȿoG iA01~A-G0 *|T zp8_)[z+#7ܬ]31vP{x7# w7<=&F.,2=defP1Yu;ĪgNCZ53*'y쒏'X#مUUXBuvt>5>DiߏXR}vDѱ1n\ϕ:«Rse!J-X|4-975ea'D$eE{H =;J{Vin.ϯlu*i6:vqܩ ݨ Trs >mgyȟj?7n`(.܁ &QIzRdeB[ *İjbFΌDv>g@ʹ.HOr#J=eaӤAתB !ο{)]z"foFg҄S'"BKӯ4IIӯT&®ful;Zi~(S=zbkd+?<}L |?vH5[U.יWo Yɬ{";?ADY[]:~xrmŔ )<ÄLh$=v ׂhK=۫& y1A *&tҥKnP5SRxy_ȴ0w,g|2"+xy+솇v7f.\1g8 ['0P {d;>I;ceggʮJ+2ƃ2jo\65znrgT]S%XLOŦS c3L+gdcȂsù{i}y),5dٝ;;}J9"5:f.qbYgjsLm! c櫖Zh= {^R}-6 g3𺡬أyK%!mw >6Ƀn#ZZ5|#ݍ';졺eoS&>YX?9UɭJbO 6kxҌD$$ġP%JǝC NqyLB'w4NFbі3N /'J_\ *[DD\)kn' ceˬw.gs |R(?2ޛr^JW}I&7hL#&7fd-UJ;߹x kyiB[%+M!,^!񅞾@gK_wů|'.,nPΖ:s~f_>XlڥyތճfyL\qQ㱢E`O?}a<&g|*70}i,½>,E+u5!(=/T #˅8dhF ^ 26J[C%Es&EcM4+g2\YS$ˎU}M ؿW+$HTze]] sޙ7f.$^nR$7UG̰O9!Ίq:㣇&wXJE :8^:EBVsXZ7I0K$U3T%d|:+/P0vҐ8g`C>]冎Ҷ_B$WN8"Ɛ !J\\YS1O:Y'̎3lPUi)ݼʖirrtm5$H*r:Zz)=!oΏ׮8Fn s3c(칒s92K@$.(m~`/z*{xäv؇qѝ3h҉t`D=p5g@=^2 ,Bl܈czJ $vJߔZͻ,o5~\4dA O[,.$'45$KГ,vNa$:8Ye[|⳽=OSÅo#*26b{U-S?Ɉ ,]a+ubkuB̠n^Tb^2`0&b~rCmqg VX|nt_/n8|y<)YM7w(%s7eq IJwXZb<[ g$:jD2ru}sە<|ʀWε]ڞ E6X4P-tJb{? ӡV=qfN& endstream endobj 191 0 obj << /Type /FontDescriptor /FontName /TFZKNT+CMTT8 /Flags 4 /FontBBox [-5 -232 545 699] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/a/at/b/d/e/hyphen/i/m/n/p/period/r/s/t/u/z) /FontFile 190 0 R >> endobj 92 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LIJFEI+CMB10 /FontDescriptor 163 0 R /FirstChar 101 /LastChar 115 /Widths 147 0 R >> endobj 39 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UCHISL+CMBX10 /FontDescriptor 165 0 R /FirstChar 44 /LastChar 121 /Widths 155 0 R >> endobj 32 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KYADUF+CMBX12 /FontDescriptor 167 0 R /FirstChar 44 /LastChar 121 /Widths 161 0 R >> endobj 36 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EUWOLL+CMBX9 /FontDescriptor 169 0 R /FirstChar 65 /LastChar 116 /Widths 157 0 R >> endobj 41 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DQOWYN+CMR10 /FontDescriptor 171 0 R /FirstChar 11 /LastChar 122 /Widths 153 0 R >> endobj 34 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NFPOMO+CMR12 /FontDescriptor 173 0 R /FirstChar 44 /LastChar 122 /Widths 159 0 R >> endobj 44 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RCZKWL+CMR8 /FontDescriptor 175 0 R /FirstChar 44 /LastChar 127 /Widths 150 0 R >> endobj 37 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YIBKIU+CMR9 /FontDescriptor 177 0 R /FirstChar 12 /LastChar 121 /Widths 156 0 R >> endobj 52 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QWNSYV+CMSLTT10 /FontDescriptor 179 0 R /FirstChar 33 /LastChar 126 /Widths 148 0 R >> endobj 43 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GUOWTK+CMSY6 /FontDescriptor 181 0 R /FirstChar 3 /LastChar 3 /Widths 151 0 R >> endobj 35 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FRNIHB+CMSY8 /FontDescriptor 183 0 R /FirstChar 3 /LastChar 3 /Widths 158 0 R >> endobj 42 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GMLRMY+CMTI10 /FontDescriptor 185 0 R /FirstChar 12 /LastChar 121 /Widths 152 0 R >> endobj 40 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MRNXDE+CMTT10 /FontDescriptor 187 0 R /FirstChar 34 /LastChar 122 /Widths 154 0 R >> endobj 33 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QBZSZB+CMTT12 /FontDescriptor 189 0 R /FirstChar 101 /LastChar 118 /Widths 160 0 R >> endobj 45 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TFZKNT+CMTT8 /FontDescriptor 191 0 R /FirstChar 45 /LastChar 122 /Widths 149 0 R >> endobj 46 0 obj << /Type /Pages /Count 6 /Parent 192 0 R /Kids [22 0 R 49 0 R 56 0 R 61 0 R 71 0 R 75 0 R] >> endobj 85 0 obj << /Type /Pages /Count 6 /Parent 192 0 R /Kids [82 0 R 89 0 R 96 0 R 106 0 R 120 0 R 135 0 R] >> endobj 192 0 obj << /Type /Pages /Count 12 /Kids [46 0 R 85 0 R] >> endobj 193 0 obj << /Type /Outlines /First 3 0 R /Last 19 0 R /Count 5 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 193 0 R /Prev 15 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 193 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 193 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 193 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 193 0 R /Next 7 0 R >> endobj 194 0 obj << /Names [(Doc-Start) 31 0 R (figure.1) 59 0 R (figure.2) 87 0 R (figure.3) 104 0 R (figure.4) 123 0 R (page.1) 30 0 R] /Limits [(Doc-Start) (page.1)] >> endobj 195 0 obj << /Names [(page.10) 108 0 R (page.11) 122 0 R (page.12) 137 0 R (page.2) 51 0 R (page.3) 58 0 R (page.4) 63 0 R] /Limits [(page.10) (page.4)] >> endobj 196 0 obj << /Names [(page.5) 73 0 R (page.6) 77 0 R (page.7) 84 0 R (page.8) 91 0 R (page.9) 98 0 R (section*.1) 38 0 R] /Limits [(page.5) (section*.1)] >> endobj 197 0 obj << /Names [(section*.2) 138 0 R (section.1) 2 0 R (section.2) 6 0 R (section.3) 10 0 R (section.4) 14 0 R (section.5) 18 0 R] /Limits [(section*.2) (section.5)] >> endobj 198 0 obj << /Names [(table.1) 86 0 R] /Limits [(table.1) (table.1)] >> endobj 199 0 obj << /Kids [194 0 R 195 0 R 196 0 R 197 0 R 198 0 R] /Limits [(Doc-Start) (table.1)] >> endobj 200 0 obj << /Dests 199 0 R >> endobj 201 0 obj << /Type /Catalog /Pages 192 0 R /Outlines 193 0 R /Names 200 0 R /PageMode/UseOutlines /OpenAction 21 0 R >> endobj 202 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20140409193634+02'00') /ModDate (D:20140409193634+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 203 0000000000 65535 f 0000000015 00000 n 0000003632 00000 n 0000268161 00000 n 0000000060 00000 n 0000000090 00000 n 0000007559 00000 n 0000268077 00000 n 0000000135 00000 n 0000000170 00000 n 0000016393 00000 n 0000267991 00000 n 0000000215 00000 n 0000000266 00000 n 0000020303 00000 n 0000267903 00000 n 0000000312 00000 n 0000000377 00000 n 0000027405 00000 n 0000267828 00000 n 0000000423 00000 n 0000000453 00000 n 0000002548 00000 n 0000002703 00000 n 0000002854 00000 n 0000003005 00000 n 0000003152 00000 n 0000003303 00000 n 0000003691 00000 n 0000000503 00000 n 0000003454 00000 n 0000003513 00000 n 0000265617 00000 n 0000267177 00000 n 0000266044 00000 n 0000266752 00000 n 0000265760 00000 n 0000266327 00000 n 0000003573 00000 n 0000265474 00000 n 0000267034 00000 n 0000265902 00000 n 0000266891 00000 n 0000266613 00000 n 0000266186 00000 n 0000267321 00000 n 0000267463 00000 n 0000007349 00000 n 0000007618 00000 n 0000007222 00000 n 0000003904 00000 n 0000007500 00000 n 0000266468 00000 n 0000009221 00000 n 0000010511 00000 n 0000009430 00000 n 0000009094 00000 n 0000007735 00000 n 0000009371 00000 n 0000014879 00000 n 0000014939 00000 n 0000010403 00000 n 0000009535 00000 n 0000014820 00000 n 0000011521 00000 n 0000011664 00000 n 0000011748 00000 n 0000011846 00000 n 0000011881 00000 n 0000012123 00000 n 0000016451 00000 n 0000016226 00000 n 0000015059 00000 n 0000016334 00000 n 0000017918 00000 n 0000017751 00000 n 0000016568 00000 n 0000017859 00000 n 0000019945 00000 n 0000020094 00000 n 0000022947 00000 n 0000020363 00000 n 0000019811 00000 n 0000018011 00000 n 0000020244 00000 n 0000267573 00000 n 0000021903 00000 n 0000027345 00000 n 0000021963 00000 n 0000021736 00000 n 0000020492 00000 n 0000021844 00000 n 0000265331 00000 n 0000027136 00000 n 0000028390 00000 n 0000027465 00000 n 0000022820 00000 n 0000022068 00000 n 0000027286 00000 n 0000023915 00000 n 0000024058 00000 n 0000024158 00000 n 0000024195 00000 n 0000024438 00000 n 0000033521 00000 n 0000033582 00000 n 0000028279 00000 n 0000027597 00000 n 0000033460 00000 n 0000028979 00000 n 0000029123 00000 n 0000029680 00000 n 0000030095 00000 n 0000030427 00000 n 0000030674 00000 n 0000030725 00000 n 0000030762 00000 n 0000076402 00000 n 0000035060 00000 n 0000076676 00000 n 0000034929 00000 n 0000033691 00000 n 0000076553 00000 n 0000076614 00000 n 0000072957 00000 n 0000073101 00000 n 0000073366 00000 n 0000073566 00000 n 0000073616 00000 n 0000073667 00000 n 0000073704 00000 n 0000078282 00000 n 0000078631 00000 n 0000079025 00000 n 0000079574 00000 n 0000078111 00000 n 0000076810 00000 n 0000079452 00000 n 0000079513 00000 n 0000079923 00000 n 0000078457 00000 n 0000078828 00000 n 0000079239 00000 n 0000079693 00000 n 0000080172 00000 n 0000080198 00000 n 0000080261 00000 n 0000080298 00000 n 0000080403 00000 n 0000080798 00000 n 0000081285 00000 n 0000081808 00000 n 0000081833 00000 n 0000082490 00000 n 0000083113 00000 n 0000083488 00000 n 0000083939 00000 n 0000084586 00000 n 0000084915 00000 n 0000084940 00000 n 0000085376 00000 n 0000085503 00000 n 0000085962 00000 n 0000093887 00000 n 0000094117 00000 n 0000109630 00000 n 0000109958 00000 n 0000123965 00000 n 0000124283 00000 n 0000132280 00000 n 0000132512 00000 n 0000154518 00000 n 0000154960 00000 n 0000165209 00000 n 0000165482 00000 n 0000177920 00000 n 0000178230 00000 n 0000192794 00000 n 0000193135 00000 n 0000209700 00000 n 0000210175 00000 n 0000217342 00000 n 0000217573 00000 n 0000224707 00000 n 0000224939 00000 n 0000238536 00000 n 0000238827 00000 n 0000256537 00000 n 0000256984 00000 n 0000260324 00000 n 0000260554 00000 n 0000265073 00000 n 0000267686 00000 n 0000267754 00000 n 0000268232 00000 n 0000268404 00000 n 0000268567 00000 n 0000268731 00000 n 0000268912 00000 n 0000268991 00000 n 0000269094 00000 n 0000269132 00000 n 0000269259 00000 n trailer << /Size 203 /Root 201 0 R /Info 202 0 R /ID [<210170F6D39B90A1993CB493E21A7B3A> <210170F6D39B90A1993CB493E21A7B3A>] >> startxref 269585 %%EOF sp/inst/doc/over.Rnw0000644000175100001440000003122012321302443014067 0ustar hornikusers% 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} \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.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") )) @ and shown in figure \ref{fig:toy}. \begin{figure}[htb] <>= plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=2:6, axes=TRUE) points(pts, col='red') 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")) 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} fall in two overlapping polygons, we can retrieve the complete information as a list: <<>>= over(pts, pol, returnList = TRUE) @ and the appropriate points falling in 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]) @ \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 with {\tt rgeos}} Package \code{sp} provides many of the \code{over} methods, but not all. Package \code{rgeos} provides functions to compute geometry intersections, i.e. for any set of (points, lines, polygons) to determine whether they have one ore more points in common. The \code{over} methods not provided by package \code{sp} can thus be completed; it involves {\em any} \code{over} methods where a \code{SpatialLines} object is involved (either as \code{x} or \code{y}), and the method 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. } \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{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) @ 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:line} are <<>>= sl.agg = aggregate(meuse.grid, sl) 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}. \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, 47-65. \url{http://dx.doi.org/10.1016/S0016-7061(98)00077-9} \item Pebesma, E., 2012. Spatio-temporal overlay and aggregation. Package vignette for package spacetime, \url{http://cran.r-project.org/web/packages/spacetime/vignettes/sto.pdf} \end{itemize} \end{document} sp/inst/doc/csdacm.Rnw0000644000175100001440000011635212321302443014360 0ustar hornikusers%% $Id: csdacm.Rnw,v 1.44 2008-04-06 20:47:04 roger Exp $ % -*- mode: noweb; noweb-default-code-mode: R-mode; -*- % merge all depth coefficients!! % Customising spatial data analysis classes and methods %\SweaveOpts{echo=TRUE} %*Intro and plan* %motivate spatial data handling \documentclass{article} % \VignetteIndexEntry{Customising spatial data classes and methods} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{color} \usepackage{Sweave} \SweaveOpts{keep.source=FALSE} \usepackage{natbib} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong \newcommand\code{\bgroup\@codex} \def\@codex#1{\small {\normalfont\ttfamily\hyphenchar\font=45 #1}\egroup} \usepackage{xspace} \def\RR{\textsf{R}\xspace} \def\SP{\texttt{S-PLUS}\texttrademark\xspace} \def\SS{\texttt{S}\xspace} \def\SIII{\texttt{S3}\xspace} \def\SIV{\texttt{S4}\xspace} \title{{\bf Customising spatial data classes and methods}\footnote{This vignette formed pp. 127--148 of the first edition of Bivand, R. S., Pebesma, E. and G\'{o}mez-Rubio V. (2008) Applied Spatial Data Analysis with R, Springer-Verlag, New York. It was retired from the second edition (2013) to accommodate material on other topics, and is made available in this form with the understanding of the publishers. It has been updated to the 2013 state of the software, e.g. using \code{over}.} } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt edzer.pebesma@uni-muenster.de}}} \date{Feb 2008} \begin{document} \maketitle \tableofcontents <>= owidth <- getOption("width") options("width"=90) .PngNo <- 0 @ <>= .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 @ <>= <> @ <>= .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) @ <>= dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") @ Although the classes defined in the \pkg{sp} package cover many needs, they do not go far beyond the most typical GIS data models. In applied research, it often happens that customised classes would suit the actual data coming from the instruments better. Since \SIV classes have mechanisms for inheritance, it may be attractive to build on the \pkg{sp} classes, so as to utilise their methods where appropriate. Here, we will demonstrate a range of different settings in which \pkg{sp} classes can be extended. Naturally, this is only useful for researchers with specific and clear needs, so our goal is to show how (relatively) easy it may be to prototype classes extending \pkg{sp} classes for specific purposes. \section{Programming with classes and methods} \label{sect:cls} This section will explain the elementary basics of programming with classes and methods in \RR. The \SS language (implemented in \RR and \SP) contains two mechanisms for creating classes and methods: the traditional \SIII system and the more recent \SIV system (see Section 2.2 in \cite{bivand}, in which classes were described for the use{\RR} --- here they are described for the develope{\RR}). This chapter is not a full introduction to \RR programming \citep[see][for more details]{braun+murdoch:07}, but it will try to give some feel of how the \code{Spatial} classes in package \pkg{sp} can be extended to be used for wider classes of problems. For full details, the interested reader is referred to e.g.\ \cite{R:Venables+Ripley:2000} and \cite{R:Chambers:1998}, the latter being a reference for new-style \SIV classes and methods. Example code is for example found in the source code for package \pkg{sp}, available from CRAN. Suppose we define myfun as \begin{footnotesize} << >>= myfun <- function(x) { x + 2 } @ \end{footnotesize} then, calling it with the numbers 1, 2 and 3 results in \begin{footnotesize} << >>= myfun(1:3) @ \end{footnotesize} or alternatively using a named argument: \begin{footnotesize} << >>= myfun(x=1:3) @ \end{footnotesize} The return value of the function is the last expression evaluated. Often, we want to wrap existing functions, such as a plot function: \begin{footnotesize} << >>= plotXplus2Yminus3 <- function(x, y, ...) { plot(x = x + 2, y = y - 3, ...) } @ \end{footnotesize} In this case, the \code{...} is used to pass information to the \code{plot} function without explicitly anticipating what it will be: named arguments \code{x} and \code{y}, or the first two arguments if they are unnamed are processed, remaining arguments are passed on. The plot function is a generic method, with an instance that depends on the class of its first (\SIII) or first $n$ arguments (\SIV). The available instances of \code{plot} are shown for \SIII-type methods by \begin{footnotesize} << >>= methods("plot") @ \end{footnotesize} and for \SIV-type methods by \begin{footnotesize} << >>= library(sp) showMethods("plot") @ \end{footnotesize} where we first loaded \pkg{sp} to make sure there are some \SIV plot methods to show. \subsection{\SIII-style classes and methods} Building \SIII-style classes is simple. Suppose we want to build an object of class \code{foo}: \begin{footnotesize} << >>= x <- rnorm(10) class(x) <- "foo" x @ \end{footnotesize} If we plot this object, e.g., by \code{plot(x)} we get the same plot as when we would not have set the class to \code{foo}. If we know, however, that objects of class \code{foo} need to be plotted without symbols but with connected lines, we can write a plot method for this class: \begin{footnotesize} << >>= plot.foo <- function(x, y, ...) { plot.default(x, type = 'l', ...) } @ \end{footnotesize} after which \code{plot(x)} will call this particular method, rather than a default plot method. Class inheritance is obtained in \SIII when an object is given multiple classes, as in \begin{footnotesize} << >>= class(x) <- c("foo", "bar") @ <>= plot(x) @ \end{footnotesize} For this plot, first function \code{plot.foo} will be looked for, and if not found the second option \code{plot.bar} will be looked for. If none of them is found, the default \code{plot.default} will be used. The \SIII class mechanism is simple and powerful. Much of \RR works with it, including key functions such as \code{lm}. \begin{footnotesize} << >>= data(meuse) class(meuse) class(lm(log(zinc)~sqrt(dist), meuse)) @ \end{footnotesize} There is, however, no checking that a class with a particular name does indeed contain the elements that a certain method for it expects. It also has design flaws, as method specification by dot separation is ambiguous in case of names such as \code{as.data.frame}, where one cannot tell whether it means that the method \code{as.data} acts on objects of class \code{frame}, or the method \code{as} acts on objects of class \code{data.frame}, or none of them (the answer is: none). For such reasons, \SIV-style classes and methods were designed. \subsection{\SIV-style classes and methods} \SIV-style classes are formally defined, using \code{setClass}. As an example, somewhat simplified versions of classes \code{CRS} and \code{Spatial} in \pkg{sp} are \begin{footnotesize} <>= options("width"=60) @ <>= setClass("CRS", representation(projargs = "character")) setClass("Spatial", representation(bbox = "matrix", proj4string = "CRS"), # NOT TOO WIDE validity <- function(object) { bb <- bbox(object) if (!is.matrix(bb)) return("bbox should be a matrix") n <- dimensions(object) if (n < 2) return("spatial.dimension should be 2 or more") if (any(is.na(bb))) return("bbox should never contain NA values") if (any(!is.finite(bb))) return("bbox should never contain infinite values") if (any(bb[,"max"] < bb[,"min"])) return("invalid bbox: max < min") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} The command \code{setClass} defines a class name as a formal class, gives the names of the class elements (called slots), and their type---type checking will happen upon construction of an instance of the class. Further checking, e.g., on valid dimensions and data ranges can be done in the \code{validity} function. Here, the validity function retrieves the bounding box using the generic \code{bbox} method. Generics, if not defined in the base R system, e.g., \begin{footnotesize} << >>= isGeneric("show") @ \end{footnotesize} can be defined with \code{setGeneric}. Defining a specific instance of a generic is done by \code{setMethod}: \begin{footnotesize} <>= setGeneric("bbox", function(obj) standardGeneric("bbox")) setMethod("bbox", signature = "Spatial", function(obj) obj@bbox) @ \end{footnotesize} where the signature tells the class of the first (or first $n$) arguments. Here, the \code{@} operator is used to access the \code{bbox} slot in an \SIV object, not to be confused with the \code{\$} operator to access list elements. We will now illustrate this mechanism by providing a few examples of classes, building on those available in package \pkg{sp}. \section{Animal track data in package \pkg{trip}} CRAN Package \pkg{trip}, written by Michael Sumner \citep{kirkwood06,page06}, provides a class for animal tracking data. Animal tracking data consist of sets of ($x,y,t$) stamps, grouped by an identifier pointing to an individual animal, sensor or perhaps isolated period of monitoring. A strategy for this (slightly simplified from that of \pkg{trip}) is to extend the {\tt SpatialPointsDataFrame} class by a length 2 character vector carrying the names of the time column and the trip identifier column in the {\tt SpatialPointsDataFrame} attribute table. Package \pkg{trip} does a lot of work to read and analyse tracking data from data formats typical for tracking data (Argos DAT), removing duplicate observations and validating the objects, e.g., checking that time stamps increase and movement speeds are realistic. We ignore this and stick to the bare bones. We now define a class called \code{trip} that extends \code{SpatialPointsDataFrame}: \begin{footnotesize} << >>= library(sp) setClass("trip", representation("SpatialPointsDataFrame", TOR.columns = "character"), validity <- function(object) { if (length(object@TOR.columns) != 2) stop("Time/id column names must be of length 2") if (!all(object@TOR.columns %in% names(object@data))) stop("Time/id columns must be present in attribute table") TRUE } ) showClass("trip") @ \end{footnotesize} that checks, upon creation of objects, that indeed two variable names are passed and that these names refer to variables present in the attribute table. \subsection{Generic and constructor functions} It would be nice to have a constructor function, just like \code{data.frame} or \code{SpatialPoints}, so we now create it and set it as the generic function to be called in case the first argument is of class \code{SpatialPointsDataFrame}. \begin{footnotesize} << >>= trip.default <- function(obj, TORnames) { if (!is(obj, "SpatialPointsDataFrame")) stop("trip only supports SpatialPointsDataFrame") if (is.numeric(TORnames)) TORnames <- names(obj)[TORnames] new("trip", obj, TOR.columns = TORnames) } if (!isGeneric("trip")) setGeneric("trip", function(obj, TORnames) standardGeneric("trip")) setMethod("trip", signature(obj = "SpatialPointsDataFrame", TORnames = "ANY"), trip.default) @ \end{footnotesize} We can now try it out, with turtle data: \begin{footnotesize} << >>= turtle <- read.csv(system.file("external/seamap105_mod.csv", package="sp")) @ << >>= timestamp <- as.POSIXlt(strptime(as.character(turtle$obs_date), "%m/%d/%Y %H:%M:%S"), "GMT") turtle <- data.frame(turtle, timestamp = timestamp) turtle$lon <- ifelse(turtle$lon < 0, turtle$lon+360, turtle$lon) turtle <- turtle[order(turtle$timestamp),] coordinates(turtle) <- c("lon", "lat") proj4string(turtle) <- CRS("+proj=longlat +ellps=WGS84") turtle$id <- c(rep(1, 200), rep(2, nrow(coordinates(turtle)) - 200)) turtle_trip <- trip(turtle, c("timestamp", "id")) summary(turtle_trip) @ \end{footnotesize} \subsection{Methods for trip objects} The summary method here is not defined for \code{trip}, but is the default summary inherited from class \code{Spatial}. As can be seen, nothing special about the trip features is mentioned, such as what the time points are and what the identifiers. We could alter this by writing a class-specific summary method \begin{footnotesize} << >>= summary.trip <- function(object, ...) { cat("Object of class \"trip\"\nTime column: ") print(object@TOR.columns[1]) cat("Identifier column: ") print(object@TOR.columns[2]) print(summary(as(object, "Spatial"))) print(summary(object@data)) } setMethod("summary", "trip", summary.trip) summary(turtle_trip) @ \end{footnotesize} As \code{trip} extends \code{SpatialPointsDataFrame}, subsetting using {\small \verb+"["+} and column selection or replacement using {\small \verb+"[["+} or {\small \verb+"$"+} all work, as these are inherited. Creating invalid trip objects can be prohibited by adding checks to the validity function in the class definition, e.g., %<>= %x <- turtle_trip[1] %@ will not work because the time and/or id column are not present any more. A custom plot method for trip could be written, for example using colour to denote a change in identifier: \begin{footnotesize} << >>= setGeneric("lines", function(x, ...) standardGeneric("lines")) setMethod("lines", signature(x = "trip"), function(x, ..., col = NULL) { # NOT TOO WIDE tor <- x@TOR.columns if (is.null(col)) { l <- length(unique(x[[tor[2]]])) col <- hsv(seq(0, 0.5, length = l)) } coords <- coordinates(x) lx <- split(1:nrow(coords), x[[tor[2]]]) for (i in 1:length(lx)) lines(coords[lx[[i]], ], col = col[i], ...) } ) @ \end{footnotesize} Here, the \code{col} argument is added to the function header so that a reasonable default can be overridden, e.g., for black/white plotting. \section{Multi-point data: \texttt{SpatialMultiPoints}} One of the feature types of the OpenGeospatial Consortium (OGC) simple feature specification that has not been implemented in \pkg{sp} is the \code{MultiPoint} object. In a \code{MultiPoint} object, each feature refers to a {\em set of} points. The \pkg{sp} classes \code{SpatialPointsDataFrame} only provide reference to a single point. Instead of building a new class up from scratch, we'll try to re-use code and build a class \code{SpatialMultiPoint} from the {\tt SpatialLines} class. After all, lines are just sets of ordered points. In fact, the \code{SpatialLines} class implements the \code{MultiLineString} simple feature, where each feature can refer to multiple lines. A special case is formed if each feature only has a single line: \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialMultiPoints", representation("SpatialLines"), validity <- function(object) { if (any(unlist(lapply(object@lines, function(x) length(x@Lines))) != 1)) # NOT TOO WIDE stop("Only Lines objects with one Line element") TRUE } ) SpatialMultiPoints <- function(object) new("SpatialMultiPoints", object) @ <>= options("width"=70) @ \end{footnotesize} As an example, we can create an instance of this class for two MultiPoint features each having three locations: \begin{footnotesize} << >>= n <- 5 set.seed(1) x1 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x2 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x3 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) L1 <- Lines(list(Line(x1)), ID="mp1") L2 <- Lines(list(Line(x2)), ID="mp2") L3 <- Lines(list(Line(x3)), ID="mp3") s <- SpatialLines(list(L1,L2,L3)) smp <- SpatialMultiPoints(s) @ \end{footnotesize} If we now plot object \code{smp}, we get the same plot as when we plot \code{s}, showing the two lines. The \code{plot} method for a \code{SpatialLines} object is not suitable, so we write a new one: \begin{footnotesize} << >>= plot.SpatialMultiPoints <- function(x, ..., pch = 1:length(x@lines), col = 1, cex = 1) { n <- length(x@lines) if (length(pch) < n) pch <- rep(pch, length.out = n) if (length(col) < n) col <- rep(col, length.out = n) if (length(cex) < n) cex <- rep(cex, length.out = n) plot(as(x, "Spatial"), ...) for (i in 1:n) points(x@lines[[i]]@Lines[[1]]@coords, pch = pch[i], col = col[i], cex = cex[i]) } setMethod("plot", signature(x = "SpatialMultiPoints", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) @ \end{footnotesize} Here we chose to pass any named \code{...} arguments to the plot method for a \code{Spatial} object. This function sets up the axes and controls the margins, aspect ratio, etc. All arguments that need to be passed to \code{points} (\code{pch} for symbol type, \code{cex} for symbol size and \code{col} for symbol colour) need explicit naming and sensible defaults, as they are passed explicitly to the consecutive calls to \code{points}. According to the documentation of \code{points}, in addition to \code{pch}, \code{cex} and \code{col}, the arguments \code{bg} and \code{lwd} (symbol fill colour and symbol line width) would need a similar treatment to make this plot method completely transparent with the base \code{plot} method---something an end user would hope for. Having \code{pch}, \code{cex} and \code{col} arrays the length of the number of \code{MultiPoints} {\em sets} rather than the number of points to be plotted is useful for two reasons. First, the whole point of {\tt MultiPoints} object is to distinguish {\em sets} of points. Second, when we extend this class to \code{SpatialMultiPointsDataFrame}, e.g., by \begin{footnotesize} << >>= cName <- "SpatialMultiPointsDataFrame" setClass(cName, representation("SpatialLinesDataFrame"), validity <- function(object) { lst <- lapply(object@lines, function(x) length(x@Lines)) if (any(unlist(lst) != 1)) stop("Only Lines objects with single Line") TRUE } ) SpatialMultiPointsDataFrame <- function(object) { new("SpatialMultiPointsDataFrame", object) } @ \end{footnotesize} then we can pass symbol characteristics by (functions of) columns in the attribute table: \begin{footnotesize} <>= df <- data.frame(x1 = 1:3, x2 = c(1,4,2), row.names = c("mp1", "mp2", "mp3")) smp_df <- SpatialMultiPointsDataFrame(SpatialLinesDataFrame(smp, df)) setMethod("plot", signature(x = "SpatialMultiPointsDataFrame", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) grys <- c("grey10", "grey40", "grey80") @ <>= plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) @ \end{footnotesize} for which the plot is shown in Figure \ref{fig:smpdf}. \begin{figure} %<>= <>= .iwidth <- 6 .iheight <- 2.5 .ipointsize <- 10 <> plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) <> <> @ \caption{Plot of the \code{SpatialMultiPointsDataFrame} object.} \label{fig:smpdf} \end{figure} Hexagonal grids are like square grids, where grid points are centres of matching hexagons, rather than squares. Package \pkg{sp} has no classes for hexagonal grids, but does have some useful functions for generating and plotting them. This could be used to build a class. Much of this code in \pkg{sp} is based on postings to the R-sig-geo mailing list by Tim Keitt, used with permission. The spatial sampling method \code{spsample} has a method for sampling points on a hexagonal grid: \begin{footnotesize} <<>>= data(meuse.grid) gridded(meuse.grid)=~x+y xx <- spsample(meuse.grid, type="hexagonal", cellsize=200) class(xx) @ \end{footnotesize} gives the points shown in the left side of Figure \ref{fig:hex}. Note that an alternative hexagonal representation is obtained by rotating this grid 90 degrees; we will not further consider that here. \begin{footnotesize} <>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) @ <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", HexPts, col = 1)) @ <>= HexPols <- HexPoints2SpatialPolygons(HexPts) df <- over(HexPols, meuse.grid) HexPolsDf <- SpatialPolygonsDataFrame(HexPols, df, match.ID = FALSE) @ <>= spplot(HexPolsDf["dist"]) @ \end{footnotesize} for which the plots are shown in Figure \ref{fig:hex}. \begin{figure} <>= .iwidth <- 6 .iheight <- 4 <> library(lattice) # RSB quietening greys grys <- grey.colors(11, 0.95, 0.55, 2.2) print(spplot(meuse.grid["dist"], cuts=10, col.regions=grys, sp.layout = list("sp.points", HexPts, col = 1)), split = c(1, 1, 2, 1), more = TRUE) print(spplot(HexPolsDf["dist"], cuts=10, col.regions=grys), split = c(2, 1, 2, 1), more = FALSE) <> <> @ \caption{Hexagonal points (left) and polygons (right).} \label{fig:hex} \end{figure} We can now generate and plot hexagonal grids, but need to deal with two representations: as points and as polygons, and both representations do not tell by themselves that they represent a hexagonal grid. For designing a hexagonal grid class we will extend \code{SpatialPoints}, assuming that computation of the polygons can be done when needed without a prohibitive overhead. \begin{footnotesize} << >>= setClass("SpatialHexGrid", representation("SpatialPoints", dx = "numeric"), validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=40) @ << >>= setClass("SpatialHexGridDataFrame", representation("SpatialPointsDataFrame", dx = "numeric"), # NOT TOO WIDE validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Note that these class definitions do not check that instances actually do form valid hexagonal grids; a more robust implementation could provide a test that distances between points with equal $y$ coordinate are separated by a multiple of \code{dx}, that the $y$-separations are correct and so on. It might make sense to adapt the generic \code{spsample} method in package \pkg{sp} to return \code{SpatialHexGrid} objects; we can also add \code{plot} and \code{spsample} methods for them. Method \code{over} should work with a \code{SpatialHexGrid} as its first argument, by inheriting from \code{SpatialPoints}. Let us first see how to create the new classes. Without a constructor function we can use \begin{footnotesize} << >>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) Hex <- new("SpatialHexGrid", HexPts, dx = 200) df <- over(Hex, meuse.grid) spdf <- SpatialPointsDataFrame(HexPts, df) HexDf <- new("SpatialHexGridDataFrame", spdf, dx = 200) @ \end{footnotesize} Because of the route taken to define both HexGrid classes, it is not obvious that the second extends the first. We can tell the \SIV system this by \code{setIs}: \begin{footnotesize} << >>= is(HexDf, "SpatialHexGrid") setIs("SpatialHexGridDataFrame", "SpatialHexGrid") is(HexDf, "SpatialHexGrid") @ \end{footnotesize} to make sure that methods for \code{SpatialHexGrid} objects work as well for objects of class \code{SpatialHexGridDataFrame}. When adding methods, several of them will need conversion to the polygon representation, so it makes sense to add the conversion function such that e.g. \code{as(x, "SpatialPolygons")} will work: \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setAs("SpatialHexGrid", "SpatialPolygons", function(from) HexPoints2SpatialPolygons(from, from@dx) ) setAs("SpatialHexGridDataFrame", "SpatialPolygonsDataFrame", function(from) SpatialPolygonsDataFrame(as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE) ) @ <>= options("width"=70) @ \end{footnotesize} We can now add \code{plot}, \code{spplot}, \code{spsample} and \code{over} methods for these classes: \begin{footnotesize} << >>= setMethod("plot", signature(x = "SpatialHexGrid", y = "missing"), function(x, y, ...) plot(as(x, "SpatialPolygons"), ...) ) setMethod("spplot", signature(obj = "SpatialHexGridDataFrame"), function(obj, ...) spplot(SpatialPolygonsDataFrame( as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE), ...) ) setMethod("spsample", "SpatialHexGrid", function(x, n, type, ...) spsample(as(x, "SpatialPolygons"), n = n, type = type, ...) ) setMethod("over", c("SpatialHexGrid", "SpatialPoints"), function(x, y, ...) over(as(x, "SpatialPolygons"), y) ) @ \end{footnotesize} After this, the following will work: \begin{footnotesize} <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", Hex, col = 1)) spplot(HexDf["dist"]) @ \end{footnotesize} Coercion to a data frame is done by \begin{footnotesize} <>= as(HexDf, "data.frame") @ \end{footnotesize} Another detail not mentioned is that the bounding box of the hexgrid objects only match the grid centre points, not the hexgrid cells: \begin{footnotesize} << >>= bbox(Hex) bbox(as(Hex, "SpatialPolygons")) @ \end{footnotesize} One solution for this is to correct for this in a constructor function, and check for it in the validity test. Explicit coercion functions to the points representation would have to set the bounding box back to the points ranges. Another solution is to write a bbox method for the hexgrid classes, taking the risk that someone still looks at the incorrect bbox slot. \section{Spatio-temporal grids} Spatio-temporal data can be represented in different ways. One simple option is when observations (or model-results, or predictions) are given on a regular space-time grid. Objects of class or extending \code{SpatialPoints}, \code{SpatialPixels} and \code{SpatialGrid} do not have the constraint that they represent a two-dimensional space; they may have arbitrary dimension; an example for a three-dimensional grid is \begin{footnotesize} << >>= n <- 10 x <- data.frame(expand.grid(x1 = 1:n, x2 = 1:n, x3 = 1:n), z = rnorm(n^3)) coordinates(x) <- ~x1+x2+x3 gridded(x) <- TRUE fullgrid(x) <- TRUE summary(x) @ \end{footnotesize} We might assume here that the third dimension, \code{x3}, represents time. If we are happy with time somehow represented by a real number (in double precision), then we are done. A simple representation is that of decimal year, with e.g. 1980.5 meaning the 183rd day of 1980, or e.g. relative time in seconds after the start of some event. When we want to use the \code{POSIXct} or \code{POSIXlt} representations, we need to do some more work to see the readable version. We will now devise a simple three-dimensional space-time grid with the \code{POSIXct} representation. \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setClass("SpatialTimeGrid", "SpatialGrid", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Along the same line, we can extend the \code{SpatialGridDataFrame} for space-time: \begin{footnotesize} << >>= setClass("SpatialTimeGridDataFrame", "SpatialGridDataFrame", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) setIs("SpatialTimeGridDataFrame", "SpatialTimeGrid") x <- new("SpatialTimeGridDataFrame", x) @ \end{footnotesize} A crude summary for this class could be written along these lines: \begin{footnotesize} << >>= summary.SpatialTimeGridDataFrame <- function(object, ...) { cat("Object of class SpatialTimeGridDataFrame\n") x <- gridparameters(object) t0 <- ISOdate(1970,1,1,0,0,0) t1 <- t0 + x[3,1] cat(paste("first time step:", t1, "\n")) t2 <- t0 + x[3,1] + (x[3,3] - 1) * x[3,2] cat(paste("last time step: ", t2, "\n")) cat(paste("time step: ", x[3,2], "\n")) summary(as(object, "SpatialGridDataFrame")) } @ <>= options("width"=50) @ << >>= # NOT TOO WIDE setMethod("summary", "SpatialTimeGridDataFrame", summary.SpatialTimeGridDataFrame) summary(x) @ <>= options("width"=70) @ \end{footnotesize} Next, suppose we need a subsetting method that selects on the time. When the first subset argument is allowed to be a time range, this is done by \begin{footnotesize} << >>= subs.SpatialTimeGridDataFrame <- function(x, i, j, ..., drop=FALSE) { t <- coordinates(x)[,3] + ISOdate(1970,1,1,0,0,0) if (missing(j)) j <- TRUE sel <- t %in% i if (! any(sel)) stop("selection results in empty set") fullgrid(x) <- FALSE if (length(i) > 1) { x <- x[i = sel, j = j,...] fullgrid(x) <- TRUE as(x, "SpatialTimeGridDataFrame") } else { gridded(x) <- FALSE x <- x[i = sel, j = j,...] cc <- coordinates(x)[,1:2] p4s <- CRS(proj4string(x)) # NOT TOO WIDE SpatialPixelsDataFrame(cc, x@data, proj4string = p4s) } } setMethod("[", c("SpatialTimeGridDataFrame", "POSIXct", "ANY"), subs.SpatialTimeGridDataFrame) t1 <- as.POSIXct("1970-01-01 0:00:03", tz = "GMT") t2 <- as.POSIXct("1970-01-01 0:00:05", tz = "GMT") summary(x[c(t1,t2)]) summary(x[t1]) @ \end{footnotesize} The reason to only convert back to \code{SpatialTimeGridDataFrame} when multiple time steps are present is that the time step (``cell size'' in time direction) cannot be found when there is only a single step. In that case, the current selection method returns an object of class \code{SpatialPixelsDataFrame} for that time slice. Plotting a set of slices could be done using levelplot, or writing another \code{spplot} method: \begin{footnotesize} << >>= spplot.stgdf <- function(obj, zcol = 1, ..., format = NULL) { # NOT TOO WIDE if (length(zcol) != 1) stop("can only plot a single attribute") if (is.null(format)) format <- "%Y-%m-%d %H:%M:%S" cc <- coordinates(obj) df <- unstack(data.frame(obj[[zcol]], cc[,3])) ns <- as.character(coordinatevalues(getGridTopology(obj))[[3]] + ISOdate(1970,1,1,0,0,0), format = format) cc2d <- cc[cc[,3] == min(cc[,3]), 1:2] obj <- SpatialPixelsDataFrame(cc2d, df) spplot(obj, names.attr = ns,...) } setMethod("spplot", "SpatialTimeGridDataFrame", spplot.stgdf) @ \end{footnotesize} \begin{figure} \begin{center} <>= .iwidth <- 6 .iheight <- 4 <> print(spplot(x, format = "%H:%M:%S", as.table=TRUE)) <> <> @ \end{center} \caption{ \code{spplot} for an object of class \code{SpatialTimeGridDataFrame}, filled with random numbers.} \label{fig:stgdf} \end{figure} Now, the result of \begin{footnotesize} <>= library(lattice) trellis.par.set(canonical.theme(color = FALSE)) spplot(x, format = "%H:%M:%S", as.table=TRUE, cuts=6, col.regions=grey.colors(7, 0.55, 0.95, 2.2)) # RSB quietening greys @ \end{footnotesize} is shown in Figure \ref{fig:stgdf}. The format argument passed controls the way time is printed; one can refer to the help of \begin{footnotesize} <>= ?as.character.POSIXt @ \end{footnotesize} for more details about the \code{format} argument. \section{Analysing spatial Monte Carlo simulations} \label{sec:simquant} Quite often, spatial statistical analysis results in a large number of spatial realisations or a random field, using some Monte Carlo simulation approach. Regardless whether individual values refer to points, lines, polygons or grid cells, we would like to write some methods or functions that aggregate over these simulations, to get summary statistics such as the mean value, quantiles, or cumulative distributions values. Such aggregation can take place in two ways. Either we aggregate over the probability space, and compute summary statistics for each geographical feature over the set of realisations (i.e., the rows of the attribute table), or for each realisation we aggregate over the complete geographical layer or a subset of it (i.e., aggregate over the columns of the attribute table). Let us first generate, as an example, a set of 100 conditional Gaussian simulations for the zinc variable in the meuse data set: \begin{footnotesize} <>= library(gstat) data(meuse) coordinates(meuse) <- ~x+y v <- vgm(.5, "Sph", 800, .05) sim <- krige(log(zinc)~1, meuse, meuse.grid, v, nsim=100, nmax=30) sim@data <- exp(sim@data) @ \end{footnotesize} where the last statement back-transforms the simulations from the log scale to the observation scale. A quantile method for Spatial object attributes can be written as \begin{footnotesize} << >>= quantile.Spatial <- function(x, ..., byLayer = FALSE) { stopifnot("data" %in% slotNames(x)) apply(x@data, ifelse(byLayer, 2, 1), quantile, ...) } @ \end{footnotesize} after which we can find the sample lower and upper 95\% confidence limits by \begin{footnotesize} << >>= sim$lower <- quantile.Spatial(sim[1:100], probs = 0.025) sim$upper <- quantile.Spatial(sim[1:100], probs = 0.975) @ \end{footnotesize} To get the sample distribution of the areal median, we can aggregate over layers: \begin{footnotesize} << >>= medians <- quantile.Spatial(sim[1:100], probs = 0.5, byLayer = TRUE) @ <>= hist(medians) @ \end{footnotesize} It should be noted that in these particular cases, the quantities computed by simulations could have been obtained faster and exact by working analytically with ordinary (block) kriging and the normal distribution (Section 8.7.2 in \cite{bivand}). A statistic that cannot be obtained analytically is the sample distribution of the area fraction that exceeds a threshold. Suppose that 500 is a crucial threshold, and we want to summarise the sampling distribution of the area fraction where 500 is exceeded: \begin{footnotesize} <>= options("width"=50) @ << >>= fractionBelow <- function(x, q, byLayer = FALSE) { stopifnot(is(x, "Spatial") || !("data" %in% slotNames(x))) apply(x@data < q, ifelse(byLayer, 2, 1), function(r) sum(r)/length(r)) # NOT TOO WIDE } @ <>= options("width"=70) @ << >>= over500 <- 1 - fractionBelow(sim[1:100], 200, byLayer = TRUE) summary(over500) quantile(over500, c(0.025, 0.975)) @ \end{footnotesize} For space-time data, we could write methods that aggregate over space, over time or over space and time. \section{Processing massive grids} Up to now we have made the assumption that gridded data can be completely read, and are kept by \RR in memory. In some cases, however, we need to process grids that exceed the memory capacity of the computers available. A method for analysing grids without fully loading them into memory then seems useful. Note that package \pkg{rgdal} allows for partial reading of grids, e.g., \begin{footnotesize} <<>>= fn <- system.file("pictures/erdas_spnad83.tif", package = "rgdal")[1] @ <>= x <- readGDAL(fn, output.dim = c(120, 132)) x$band1[x$band1 <= 0] <- NA spplot(x, col.regions=bpy.colors()) @ \end{footnotesize} reads a downsized grid, where 1\% of the grid cells remained. Another option is reading certain rectangular sections of a grid, starting at some offset. Yet another approach is to use the low-level opening routines and then subset: \begin{footnotesize} << >>= library(rgdal) x <- GDAL.open(fn) class(x) x.subs <- x[1:100, 1:100, 1] class(x.subs) gridparameters(x.subs) @ \end{footnotesize} An object of class \code{GDALReadOnlyDataset} only contains a file handle. The subset method {\small \verb+"["+} for it does not, as it quite often does, return an object of the same class but actually reads the data requested, with arguments interpreted as {\em rows}, {\em columns} and raster {\em bands}, and returns a \code{SpatialGridDataFrame}. We will now extend this approach to allow partial writing through {\small \verb+"["+} as well. As the actual code is rather lengthy and involves a lot of administration, it will not all be shown and details can be found in the \pkg{rgdal} source code. We will define two classes, \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialGDAL", representation("Spatial", grid = "GridTopology", grod = "GDALReadOnlyDataset", # NOT TOO WIDE name = "character")) setClass("SpatialGDALWrite", "SpatialGDAL") @ <>= options("width"=70) @ \end{footnotesize} that derive from \code{Spatial}, contain a \code{GridTopology} and a file handle in the \code{grod} slot. Next, we can define a function \code{open.SpatialGDAL} to open a raster file, returning a \code{SpatialGDAL} object and a function \code{copy.SpatialGDAL} that returns a writable copy of the opened raster. Note that some GDAL drivers only allow copying, some only writing and some both. \begin{footnotesize} <>= x <- open.SpatialGDAL(fn) nrows <- GDALinfo(fn)["rows"] ncols <- GDALinfo(fn)["columns"] xout <- copy.SpatialGDAL(x, "erdas_spnad83_out.tif") bls <- 20 for (i in 1:(nrows/bls - 1)) { r <- 1+(i-1)*bls for (j in 1:(ncols/bls - 1)) { c <- 1+(j-1)*bls x.in <- x[r:(r+bls),c:(c+bls)] xout[r:(r+bls),c:(c+bls)] <- x.in$band1 + 10 #$ } cat(paste("row-block", i, "\n")) } close(x) close(xout) @ \end{footnotesize} This requires the functions {\small \verb+"["+} and {\small \verb+"[<-"+} to be present. They are set by \begin{footnotesize} <>= setMethod("[", "SpatialGDAL", function(x, i, j, ... , drop = FALSE) x@grod[i = i, j = j, ...] ) setReplaceMethod("[", "SpatialGDALWrite", function(x, i, j, ..., value) { ... }) @ \end{footnotesize} where, for the latter, the implementation details are here omitted. It should be noted that single rows or columns cannot be read this way, as they cannot be converted sensibly to a grid. It should be noted that flat binary representations such as the Arc/Info Binary Grid allow much faster random access than ASCII representations or compressed formats such as jpeg varieties. Also, certain drivers in the GDAL library suggest an optimal block size for partial access (e.g., typically a single row), which is not used here\footnote{An attempt to use this block size is, at time of writing, found in the \code{blockApply} code, found in the THK branch of the \pkg{rgdal} project on R-forge.}. This chapter has sketched developments beyond the base \pkg{sp} classes and methods used otherwise in this book. Although we think that the base classes cater for many standard kinds of spatial data analysis, it is clear that specific research problems will call for specific solutions, and that the \RR environment provides the high-level abstractions needed to help busy researchers get their work done. <>= options("width"=owidth) @ \begin{thebibliography}{} \bibitem[Bivand et al., 2008]{bivand} Roger S. Bivand, Edzer J. Pebesma and Virgilio Gomez-Rubio (2008). \newblock {\em Applied spatial data analysis with {\RR}} \newblock Springer, NY \bibitem[Braun and Murdoch, 2007]{braun+murdoch:07} Braun, W.~J. and Murdoch, D.~J. (2007). \newblock {\em A first course in statistical programming with {\RR}}. \newblock Cambridge University Press, Cambridge. \bibitem[Chambers, 1998]{R:Chambers:1998} Chambers, J.M. (1998). \newblock {\em Programming with Data}. \newblock Springer, New York. \bibitem[Kirkwood et al., 2006]{kirkwood06} Kirkwood, R., Lynch, M., Gales, N., Dann, P., and Sumner, M. (2006). \newblock At-sea movements and habitat use of adult male {A}ustralian fur seals ({A}rctocephalus pusillus doriferus). \newblock {\em Canadian Journal of Zoology}, 84:1781--1788. \bibitem[Page et al., 2006]{page06} Page, B., McKenzie, J., Sumner, M., Coyne, M., and Goldsworthy, S. (2006). \newblock Spatial separation of foraging habitats among {N}ew {Z}ealand fur seals. \newblock {\em Marine Ecology Progress Series}, 323:263--279. \bibitem[Venables and Ripley, 2000]{R:Venables+Ripley:2000} Venables, W. N. and Ripley, B. D. (2000). \newblock {\em {\SS} Programming}. \newblock Springer, New York. \end{thebibliography} \end{document} sp/inst/doc/intro_sp.Rnw0000644000175100001440000004641112321302443014761 0ustar hornikusers% 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 \title{ S Classes and Methods for Spatial Data:\\ the {\tt sp} Package } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt 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; {\tt Roger.Bivand@nhh.no}}} \date{Feb 2005} \begin{document} \maketitle \tableofcontents \section{Introduction} The {\tt sp} package provides classes and methods for dealing with spatial data in S (R and S-Plus\footnote{our primary efforts target R; depending on the needs, we will address S-Plus as well}). 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. 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 R will become a more coherent tool for analyzing different types of spatial data. The package is available, or will be available soon on CRAN. From the package home page, \url{http://r-spatial.sourceforge.net/}, a graph gallery with R code, and the development source tree are available. This vignette describes the classes, methods and functions provided by sp. Instead of manipulating the class slots (components) directly, we provide methods and functions to create the classes from elementary types such as matrices, data.frames or lists and to convert them back to any of these types. Also, coercion (type casting) from one class to the other is provided, where relevant. Package {\tt 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 {\tt sp} provides classes for the spatial-only information (the topology), e.g. {\tt SpatialPoints}, and extensions for the case where we attribute information stored in a {\tt data.frame} is available for each spatial entity (e.g. for points, the {\tt SpatialPointsDataFrame}). The available data classes are: \begin{center} \begin{tabular}{lllll} data type & class & attributes & contains \\ \hline points & {\tt SpatialPoints} & No &{\tt Spatial}* \\ points & {\tt SpatialPointsDataFrame} & {\tt data.frame} &{\tt SpatialPoints}* \\ pixels & {\tt SpatialPixels} & No &{\tt SpatialPoints}* \\ pixels & {\tt SpatialPixelsDataFrame} & {\tt data.frame} &{\tt SpatialPixels}* \\ & & &{\tt SpatialPointsDataFrame}** \\ full grid & {\tt SpatialGrid } & No &{\tt SpatialPixels}* \\ full grid & {\tt SpatialGridDataFrame} & {\tt data.frame} &{\tt SpatialGrid}* \\ line & {\tt Line} & No & \\ lines & {\tt Lines} & No & {\tt Line} list \\ lines & {\tt SpatialLines} & No & {\tt Spatial}*, {\tt Lines} list \\ lines & {\tt SpatialLinesDataFrame} & {\tt data.frame} &{\tt SpatialLines}* \\ rings & {\tt Polygon} & No &{\tt Line}* \\ rings & {\tt Polygons} & No &{\tt Polygon} list \\ rings & {\tt SpatialPolygons} & No &{\tt Spatial}*, {\tt Polygons} list \\ rings & {\tt SpatialPolygonsDataFrame} & {\tt data.frame} &{\tt SpatialPolygons}* \\ \end{tabular} \end{center} * by direct extension; ** by setIs() relationship; The class {\tt Spatial} does never hold actual data, it only provides the information common to all derived classes: the spatial coordinates bounding box and information about the coordinate reference system (geographic projection information). In the following sections we will show how we can create objects of these classes from scratch or from other classes, and which methods and functions are available for them. \section{Manipulating spatial objects} Although entries in spatial objects are in principle accessible through their slot name, e.g. {\tt x@coords} contains the coordinates of an object of class or extending {\tt 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" (items) and/or columns in the data attribute table; e.g. {\tt meuse[1:2, "zinc"]} returns a {\tt SpatialPointsDataFrame} with the first two points and an attribute table with only variable "zinc". \item \verb|[[| select a column from the data attribute table \item \verb|[[<-| assign or replace values to a column in the data attribute table. \end{itemize} Other methods available are: {\tt plot}, {\tt summary}, {\tt print}, {\tt dim} and {\tt names} (operate on the data.frame part), {\tt as.data.frame}, {\tt as.matrix} and {\tt image} (for gridded data), {\tt lines} (for line data), {\tt points} (for point data), {\tt subset} (points and grids), {\tt stack} (point and grid data.frames), and {\tt length} (number of features). \subsection{Spatial methods} A number of spatial methods are available for the classes in {\tt sp}: \begin{itemize} \item {\tt dimensions(x)} returns number of spatial dimensions \item {\tt y = spTransform(x, CRS("+proj=longlat +datum=WGS84"))} transform from one coordinate reference system (geographic projection) to another (requires package rgdal) \item {\tt bbox(x)} returns a matrix with the coordinates bounding box; the dimensions form rows, min/max form the columns \item {\tt coordinates(x)} returns a matrix with the spatial coordinates %\item {\tt rings(x)} retrieve the spatial rings (polygons) of an %object deriving from {\tt SpatialPolygons} % \item {\tt method to retrieve lines? --> Lines()? \item {\tt gridded(x)} tells whether {\tt x} derives from SpatialPixels \item {\tt spplot(x)} plot attributes, possibly in combination with other types of data (points, lines, grids, polygons), and possibly in as a conditioning plot for multiple attributes \item {\tt overlay(x, y)} combine two spatial layers of different type, e.g. retrieve the polygon or grid indexes on a set of points. \item {\tt spsample(x)} sampling of spatial points in continuous space within a polygon, a gridded area, or on a spatial line. Subsetting and {\tt sample} can be used to subsample full spatial entities. \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 {\tt 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 {\tt SpatialPoints} object; aspect ratio of x and y axis units is 1} \label{fig:points} \end{figure} We can retrieve the coordinates from {\tt 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 {\tt SpatialPointsDataFrame} object is by building it from a a {\tt 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 {\tt data.frame}s, but coordinates are always sticky and allways a {\tt SpatialPointsDataFrame} is returned; {\tt drop=FALSE} is not allowed. If coordinates should be dropped, use the {\tt as.data.frame} method and select the non-coordinate data, or use \verb|[[| to select a single attribute column (example below). {\tt 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, {\tt coordinates} by setting (specifying) the coordinates promotes its argument, an object of class {\tt data.frame} to an object of class {\tt SpatialPointsDataFrame}. The method {\tt as.data.frame} coerces back to the original {\tt data.frame}. When used on a right-hand side of an equation, {\tt 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 {\tt spplot} to colour symbols, or {\tt 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 {\tt SpatialPointsDataFrame} object, using symbol size ({\tt bubble}, top) or colour ({\tt spplot}, bottom) } \label{fig:spdf} \end{figure} \section{Grids} Package {\tt sp} has two classes for grid topology: {\tt SpatialPixels} and {\tt SpatialGrid}. The pixels form stores coordinates and is for partial grids, or unordered points; the {\tt SpatialGrid} form does not store coordinates but holds full grids (i.e., {\tt 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 {\tt 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) @ \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 {\tt as(x, "Class")}, or by using the function {\tt 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 do not have to be stored; also, no ordering of grid cells is required. For plotting by a grid with {\tt levelplot}, this form is required and {\tt spplot} (for grids a front-end to {\tt levelplot}) will convert grids that are not in this form. In contrast, {\tt 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 {\tt print}, {\tt summary}, {\tt plot}, objects of class {\tt SpatialGridDataFrame} have methods for \begin{itemize} \item \verb|[| select rows (points) or columns (variables) \item \verb|[[| retrieve a column from the attribute table (data.frame part) \item \verb|[[<-| assign or replace a column in the attribute table (data.frame part) \item {\tt coordinates} retrieve the coordinates of grid cells \item {\tt as.matrix} retrieve the data as a matrix. The first index (rows) is the x-column, the second index (columns) the y-coordinate. Row index 1 is the smallest x-coordinate; column index 1 is the larges y-coordinate (top-to-bottom). \item {\tt as} coercion methods for {\tt data.frame}, {\tt SpatialPointsDataFrame} \item{\tt image} plot an image of the grid \end{itemize} Finally, {\tt spplot}, a front-end to {\tt 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 {\tt 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 {\tt SpatialLines} from scratch. Note that the {\tt Lines} objects have to be given character ID values, and that these values must be unique for {\tt Lines} objects combined in a {\tt 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 {\tt 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 {\tt 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 {\tt Sr4} has the opposite direction (anti-clockwise) as the other three (clockwise); it is meant to represent a hole in the {\tt Sr3} polygon. The default value for the hole colour {\tt pbg} is {\tt "transparent}, which will not show, but which often does not matter, because another polygon fills the hole --- here it is set to {\tt "white"}. Note that the {\tt Polygons} objects have to be given character ID values, and that these values must be unique for {\tt Polygons} objects combined in a {\tt 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 {\tt SpatialPolygonsDataFrame}, are built from the {\tt SpatialPolygons} object (topology) and the attributes (data.frame). The {\tt row.names} of the attributes data frame are matched with the ID slots of the {\tt 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 {\tt SpatialPolygonsDataFrame} object: <<>>= SrDf = attr polygons(SrDf) = SpP @ \section{Importing and exporting data} Data import and export from external data sources and file formats is handled inthe \pkg{rgdal} package in the first instance, using the available OGR/GDAL drivers for vector and raster data. This keeps the range of drivers up to date, and secures code maintenance through working closely with the open source geospatial community. Mac OSX users unable or unwilling to install \pkg{rgdal} from source after installing its external dependencies will find some functions in the \pkg{maptools} package to import and export a limited range of formats. \section*{References} \begin{description} \item Chambers, J.M., 1998, Programming with data, a guide to the S language. Springer, New York. \end{description} \end{document} % vim:syntax=tex sp/inst/doc/intro_sp.pdf0000644000175100001440000075136212321302443014774 0ustar hornikusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3957 /Filter /FlateDecode /N 92 /First 738 >> stream x[YSɵ~7CRp8B0Y4础j{df7 C/}!Nپsrd)&U`)aFqfu9agX`BHgB:&Tx`XD j&aeRLjH3 RЉLqA̔N xiY³c<{G' /B#ɴ FfdžiolPB9f 噑:cF4gx fwLKNL4Ba9"T~, ! lAoK879e .:[%iADg9&oSܣ~yAt𭀽az/\'a+7x y0P,"͢bA@*9h3NgT&IHKBV4YY uDBPGX AZAuO@3g <de2/a~Ў/:g:&6.>!@zGHԃH]ԇHԋLԋLʣA)7MSBF$F$GzUArKFПz(V H韎~Ă3Eޞ/OpxX%n=֪h0;us3!E%ӓIʚJ7/_[\(G[ nh-,X7yA3im.jW|ߍMWeӿCowD,顼^,瑖-3 p_|)|Eu]T-mQu=./$\  XGs)%Yl4?`ꏴGr;En8HSB5QC*VhS .)8&:2o`ݢfuGۑh2Ui5\_$w_DŽ=)UbҮJj=*[lR)oϑ./)>^hv)2\LeL1Dg ̶rH S$$ xG0:KYOG9gCcLwcVi'SFc47$i*{QCr\'uv]Lzq:`V9}ԇ. QcWGuVLбϊdՅo52wx п98b`oք3?gXܼw6=m&sADP¥ BW؁XVOAiaZ18Bԣ*]dTL+Am-y:ꊆ㪭%k* ½s<IKX'-tt`6)꙾%}SWl Y'dk4Z(r JGhozt&7NI$cKwwu[%SrIkW*S 'Z( )<%"m]Y"0zG4u3 e `#-@h"}ZC,c-1Mm}sKJ$sBl_h5Zt]vC~i#66zQxSMr2fQەʸ EEE]*Rf֋ {=V@X @w|e軗V[naYԱl|X1rǮmz7& mR;:GsWpU]46MƳ"_It+̰4ܢƥK"<^ {kNd0B]",Z8w|bEnqPr: U!0غKj7Y7ӃӠ FdXrt`E8w|!5&ajšY׽E[}7I!>}D/uEǦ)f6I4y|&SYƬ^%E%ћ' >/[⓾W\OP=~8w['YqzvX'9=|;i{@Gj!GeuAQ8 fGA&=?sF,9c?/M{hT߲!\Ae0~D>'^|3܂4p&H{  s@ ^5UӰju>Ma~6!WlNendstream endobj 94 0 obj << /Filter /FlateDecode /Length 1665 >> stream xYKs6WHDī=4qtNCbъJqKzٴDitDo˥сKhW3)k'm2d,ǃUx6l_M_U|ZYwǠYaA r Р|'4-}P&p rْ,D=|(H2yQI=&00E[3"ꝣ[)+Ckw ޯsSa-Z( (3e-Ng(OᱩeѲ(}8] F286al:2ǛrnY򶰷b;;S .d^d$28nfGu9:*6 D) 5))lL}r=-A!:zFk v0$ր*_H5=S+J SہTf+v pb BODp^9!trзvūQvN(vs ~E%|mfqR$K1ryPpPx$'kgbKj匪-Oa_\-C=Mq?`D_; uW *lb71&۳qq,wa|ZW̫I'aDMdYwp5zݲ ug TK#p}0{!s@2dohEdq )5C"A͸RD[[˳,(L򄭺~\h|4%ZT20MawCt3D7̅'+xhTFEsd}[n.D)UnώpOQ sp]U,I7e"2}Ղu"nqo'.כZCr5߱(u6IF^89#CV^F_JBIUM hz&~.!>f;}RZ d\77_!ٛvRteuTqǸnb4+J.I%KCw^>6fUs-Qa k `_F k[e/`Itωm6#bd#2r}eNN:${r\UۓsBjy @r|Z+aC/Sٷzd٩671=-9 *Pu*t8JǏ0)WH[j[2xE Z3@S{;U:X&bљAoz.pc#.❕ƒ^Mɠyd`M%y|mdW !dNendstream endobj 95 0 obj << /Type /ObjStm /Length 3072 /Filter /FlateDecode /N 92 /First 821 >> stream xZ[s~َwqt2$vb;,W;~X+iTyq~XK;qm&]`euK٠~gMbQ<hI_Ur6ЇHeY qH;GyP(T$+n -mO^ve4I4 9 +ޮ]2繬:^ZYK KIR) ;nvWGV¬&˦v$} r16R4Qj)M\)R0@κHnM٣,Xk\\1zX:cN )$1,m" w| @^O`3kl ZEL6vmm+FOB@RRLK' >%*?gEgHq *ZjӔ}XdS io31B̖6|}MX*){`U«ъ*ز'C(8#Œq".ڹXiLy[7cIOmˍlt;kq6%`jLAR<')c-"'cGL% GcH. vg}deOmH1HJvK?$ʚDzqڹ Xq2n/ܜfQ 2kcãiܯ$T=> stream xڥYIoFWHdqM8=:9"%kBŢDu7Z^m}oe.^ߞ>msUծ' x1U- 4[\9 v8Avf#=MaS+{`3V<'ąLTZ' tGl;vppjo0)6/[-nI֋y)T(=S+dM[;U=BEdQ)C~Cȶdk6pPzFѣp "820j^&O@[q^t6f.CB@W;P e=Gc\SHQKx@mFn#Tlp7. MZxHw y'ah.D D`!D~H}dЈ4L_,4r;nb9NMT["11&2g5P{B%`k7<"^cGF <HFl!vzdf5DX^Ȩ.`Wk:24w{6\:We-Y[EgnichJt]f :.; pJɞڪw2RZ;úiVZ,'%Ž4RI )WE834z 56d_ps M2l0R Jclr`HCC'wܔBϸ#Hg9史h/Mâr⩃ƈul1nwm R:c$Z T@4B02V-qpdTϧCD!U ,{2L;!CU6V/A*)Z ah[3xg)=u[T6)(sb7p?]$%pI((}*i7ZyT…@,|(F`c(X#{}Bq^<³%Vڿ3C,"}GfNHY0e ؖu؉ڝeдid^S }%XjMFֆk866YdL[ʙDZMV!Ю>&d8UGk(б. 1a4=8@ufCliIR@I$fMj`Pʇ|rat)E5E[Qã^ao6&A*,$yVh,We(z/mkc38TcR.=`VrMs%SYD҉i0lAI8!N^j \Dp Er`D- MՌyrSiyݶĎqSdm^'?5~r7Uk@j#^B͖4̶ۦ\8뚱)0jyZ*5P ,RA:`" rIƂE)l1B1'5 _(q,uÕDhi[ʉZ ];Uqz&V궬u zA$+g0Y&'8>\ fMƠ H~;/P;ea.XcA(n$ kЄ27 '&-EI[u-쉃tfƈD Jc^5> stream xZKs6WrF0v6Ne*I%5́CђR%'>@Rle؃LF_7`3y,E$T$AbR*Z /( s_|:_(-eXBɶo%*MR~}*^M# ب!>];g D"&fܝ}$%T , ʕȒ޷XgXN^Ni2L̨gf=i5-~ÕٲB؍k33ib'=!zT!?\,"5aѬħD,G]S'n۸"&s_dߞlV.rasaT~LB5zZ(JSlN{d:n 9:Wkƅ"_Ï23+z&o*H\h}RO1^L /ISxf#Y< 3擘B'jU>n XEƴvut0_}i'oʞ(|-՝msqQ]~·2P\ݺ|hĆL87fj櫵M<,Q'E7go]u 6RfI \jr l)9)n LA,\!s;Z2[Q3/l͋ 戥B{yn1`s=/6obyN$ qH%&X|.nnR%IV$g>Ҹ]@?CyirܢfHi"4 7Q$t/v_VjOvzpVu_x];: U[8jɝnZ1?gsKb`lm7uxTb50Q#ni*0'9āqu٘%˂$Nv gT?D=Aasq /2F^N#GtB&#Φ}7^!4v ``DpdU&3[Wkft<{n]B1^;b5E[u 67#%BdׇQ::-V;Ӷ=n6^?hbW"+12>c8ehRG.#̲}ԑ'$IV*4B'z6|.Թս gi.wB)`Hιr=6:[V-SvІc+؎K*V X sۍ"'V bӅ΁\:" |UP\|Xӻ'e"s uqVsyK]Ry`4mV]ﶆ\n*@##~-gwzmv0AQLSP1wG lŧSqE~,Ae[+ 毸Dnh0C=1 ?m[< 0v䛜R9DgI+rnG ;V!5ȩ'?ܜܟp r/J)UքS 8QN3IG5aͫr8 BǠ:#Efn3n_[Mendstream endobj 190 0 obj << /Filter /FlateDecode /Length 2155 >> stream xYI6W=iHjkmE3@iqؖ#̿HQzH-ֳxY,o|]JUf:cT,͕6v5{~DGx>𧽙( < TVn>#CKf=K*l^,38E(lh֔Qh|eFu?l)eP~P#$ ֭ke o}U;,х %<njUC0ޡK?eq*l3 (| UM>z&i&LhKV=밞rcXA81j_ZgbRXli{wҮTȒ*UPhwf\'%J, *I?Q4rM/cYe[ysVXlUͩY5- P"4Jn204©ۇrӺ)^5Qg,bN WcCDKCڰu8qnB蓢eEk_r Tg"&t jw7N[\d}?nu7lXel-mU{W3LױkXZ4%!65lƵ vJyцr:qfˠ<= uJAa Cg^#;dU |Sge}|ķ"`[&`^h#z,d$(6H }عA +i>?rr<蝸I|7H`x#|&4L0<+d ,6c#"d~l1D$+2HDsP'~{>)d!C;jO)ԈD\&C%2vL>6ҳaФ,7 D8t 7z_endstream endobj 191 0 obj << /Filter /FlateDecode /Length 1001 >> stream xVKoFW=@_Z-9E, 'R$hPv"k)R$c7A7|:F:zex:QfSd\ʢ4W֥j]׉S/`|LuW#aSF|\KcT`y?r09|&#є)a X L9(=40TYk+;cs9+wvsLhv1wFWr[0}- puudix#!E9)pBO|Y37Bۈ_޽YDׄN\kVtƫ_H;Sgl!bI-n.SpG6hTC̀-CRR&|sY{Z?+'Z?qhpdA%.3hs}Aj&>_u |{n,YK}':fVay*wkN?OhKh,nPoo߰FO 0~T6HHNzG1#%c"( i#A ״A-bXܥZ.,=Tܕo+C+@c`t&N HeW}h* ;̪}G0T̉mp>˹ݎ~w5|X&+R:U䎡ӁorJendstream endobj 192 0 obj << /BBox [ 0 0 432 432 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./intro_sp-005.pdf) /PTEX.InfoDict 53 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 54 0 R >> /ExtGState << >> /Font << >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 347 >> stream xURN1 #-W !t\AA>v Wlٝ{FKp oՎ:p1@3 ֱ߯y:[WmO֨p'|4vB DŽ.NM"'Ab⎤/S$1`A2{)*wrrxL b(R8e;8jC^,s\2wrC,Gr LjhZIӆwrPf,GrPܬbn_Ym߃9#mjg5'@zy=usԤh⌔fU8dP67|/cH'endstream endobj 193 0 obj << /Filter /FlateDecode /Length 283 >> stream xڅMO0slv(FO= n0&뿷E223ӷH&~. PY͞)vLԜ#\|oEEVe(rPmfTx%C2xƸ1|G?zevU:fVhϔǃ1&v0wj?Des5'ƭϭn4(cXVxCsUOzendstream endobj 194 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 195 0 obj << /Filter /FlateDecode /Length 933 >> stream xڭWn0+lbhi [렶/hIED=f CyBgoGgWJ')Wh0!Vy&\dT%Tr1lYLAV [\[{ߩ BpĆw5$e9wnA9-a 0oдa'WLv եM"2H!z&0eR&V3ֱl%B-8Laz<S5L7 "VgX6ٟ4Ƨb,rnU7'Wۭktk3 Bz:N,dXQIGLΟ]E1%yhh[(Kk!s{c{,]ogs-'L1qJwQ+o]߮ALٮi2?͹МԖ3_W…י6^E ?$Β޸!=L> stream xڵXO0~篈V&c'Aڤb$ئsϱi'S\wӲ(VΞZbz^p)YB 8O1=aF9w_96ro+#ߌ,07s-FΌ,UibW q9kպa*J(Yӈb"8J:3b'gQ@>3k{UG͘;PX&޲uP;H҇jg%fUSDSVuVG[c*RLc!V ø^4KPXUkT\UTBK' uX]mFYKQq4a6~逥)UPFo)vl\p;TPڵRƦ^wZX}R ʣMIQtKP]JPR}r㙍.=0÷T6*d>g(/:=;Pxåb'pbX R3U(y-;L^G>3t]@vOzqH w;b8(W /?E~TH}!J"gDrQ{R+%kɎB\MRBM`WBy ֎KCgqn۟RL}oQ=8z!y9hot7UhghH1cT=>xeZrŴϛSV^61A\x6-](V|#]EG]v~)7_]/՚lS@tG5y-ZZ@bӭs}?endstream endobj 197 0 obj << /Filter /FlateDecode /Length 1336 >> stream xڵXKo6WۋĪHAm[thCvֶ i;JD9d)>͓'xE̿\_%K&ETd2\/&B($KHtr=28Ƀ4E`F TͲY0ഠw4OqrȠ`R->AΣ@> 1 q eu0$Caj%AF r?y i cH9;^TEꃨG\z!I<Ró=j}!r'BǟW8};3 7,Ǯ}/--@?ƚ+GôHI:Ytܛ#sq}֝lFY&W,GͤgLp/dRnԫsش6x /N- Ukk*ym( #rs.֣L>47#{6»=9IXsг#kٺ[3*S3[]_auKgKnq䫓0G'aa;j. mI|[Ep7Yy\K_V,@4nS4{Y0 %U3-wc> |0Yvs4kt s:SVs4&zÙZ¢ۀ%T#Y^xP{RenKZipG xfܾ ҩ;*PCDt1B#2J f˥/ofi\X`xn(N e_?l8rdCHjIx>2O =G+( פ1] ` (c$*T!LLH0~ 9fQ8M _fVLhv&gpZbȬ ֑l-CH`v6Axb(__xq(Koc$g$P0Ǯ]s[ sChXPK۵K3$F0EZۏ$Rʀ-0dbS5s',Frym7["EhnP5 7gh1PͩԘ: w o!tMݩA4 m I2 (-*ӟgtdHaMY,0H6t|xE(* 8HֈU+rӱG㼫\\v4i =-+plI\}vL0%Ah{ʫv Me ZW6iT܇4w'g[n/{PCoA9:;?B{%AC"Z?p /){sendstream endobj 198 0 obj << /Filter /FlateDecode /Length 1225 >> stream xڭXKo6W=I7=j4-;Vj+f#@ e.+/^kH^,7 &1\hej\/n2JNYfap 𺄡`nW$H^qvQ0F*X4cY:Ҹ݁Ki,90Kr,2i,'XUDG,*X `c8^& N+'}0ʔ= v{&04T1-* 29`cEx'}Af~|[>`4^WgϣELgI5--+-q JXߢFCa7wCʲE汷/`ʰr*|qpVŢsdt!!wӄCxB%Ҝ'K%SI#Qc zԛ1XrJrK`Y/a>x?WFg&0"JHye՜P*zAs^B]/j zoݴyʡqյ'Cj7( A2 L4q%k{ iJ'ku^uoLf,ONm*s<_ "+벴9]iB:y>+'-O#XpEV_]FuqnEaxw}4$)eF`ygC/+HOuB]C^t2ŇdionBV9,uX@`_l?.[ ESxX*'fmtow}Z\_GF͟h.!ORPCb(\&tzw;;gu 08 !J~/~#e?re&xs~p:-Jj87~vA]f£k2pu~]k׮]`?>a14ZVXf`:۬}ji黾兩w_}yg79[ߞ"8p=nZp< >s5~Y6HGޟ^""Pj#VyBeiÿD^5)A6N|X^ .endstream endobj 199 0 obj << /Filter /FlateDecode /Length 149 >> stream x3135R0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.sudendstream endobj 200 0 obj << /Filter /FlateDecode /Length1 1896 /Length2 14010 /Length3 0 /Length 15184 >> stream xڍP4Npw48k`-@w'XpN~ٳgfVST_6+ 9g'w6.vNa'NNq;; BdN%_K@)_Cg0@ @n(t.>k~-\BB8 `K@n r|h th;[A>QEˋ gbxmZ 7d2@ ; @  'W'+Pw9X?b;_; tvt:l`@]N۝to_ ,{ 2%v#a^,d%rrwC>0dwk_d v (ͫ )/@ޖ$qC!`JAszP߿PV`Kw[ b!`o1q8uì|1sroT XRJ`pq^?7/?@_+3@?$^_"m_g jί 0&|?.v(+ppS=>{ކ8_S}Z݁6 + Sx vi8xpl\GzsT^OS:Y:[q{ܯsB @ѿ">Zm \Dx^P 8TFЫHp 8,F0|7|%f-yc &6|kH_s?^Y9_j~_:^ s' WWsחՉпZZ^ r5ϟy}ke/aA(KΖ"w־!bۙOgb[tzc 2dCߤal2^I|;jmDhKl4OԚiGY",[ïX>c\.m5;93Ι7YJDX"? 9JnbZb#"r+iz?J ~1b Q_HS# /cҍKۓeg9gl@ +N)5"{!N2b9>fO'ݛp CN˫ZCPS' qm,3|c/a/vw4Y@$ԘxxѸ|멨;vĸ ?t ˼K(r{ʝ'Y="7Ư,Jsxnd0SVTdӃOY]%5OpybQMg?g3' )x-| ܢKQ(lda4n7 kh =J/ RfЧ\;iSS:W-ꧩ0IyK; DgYO"jGeAzH*J,Hv[(φK  3M8Q$7a$wBD5C9!y;IO#_e}+Eԕ)9ϐ蚗."t?8%<ڍ*'.+LyiAB[o //%*`H,,Jrjܬ@ri _vguK7 B~Ǎi?s?Zc""r jMa3~zT!æFN I2K1%tʯ w]> 粿-ԡJ[lT`k;8+ j >x+l滵_iӨښ?1*JM,M5߇ cl;;q w48;g=QZdbHOb+fKj1#d=JV9/CI1T*3t,,d֟9¤3$ۧc`[\HGmՙ(_}Kj|Gz dģ>,:;ᷝS=6>^%d!C*}@#v+Gw8;TՒ/| !]5?Ekc&RebXU.XRG:A_dQ{sV{K_ERLeFfuz{"!&:XEPRQ)o4ɠ9(RD4wE_ً:pkc޶zIO%}f굺e>D׎.O1?$jP6t:L-b[[q}ft wN$SCy8 iBNn@b;f&lJVL\C| LQ>Qg4h]v8thMy[ǁ-YJ`Gcqj>iW&p;%V*lc$;ok%Fd;2Y3F|^&lIh+-f'+  z?ڞ*Ϡϖo]M {-< )ϩeH=97uXp0pCQj$%B0/Q 7'A&rKو/㺌6;WwkiѭOD˾oy9Q]u ߚ+&DEwpyc?{# ZŻ@9%m։+/ς\ycVPm}Z-zc||4|>MMWV~6KSҭaFOf #ֺZ6?j;SՂz(ЧgoN&o!WfﮙwA7dLFks MNgv6T,lQ\6ң!eh?W.>-BygZc6_cŪ2QVmߡ%&tI!FDl̺7dfIgYKEt}w%mu0R:9{o(.h{cҭuEyc볉5Z/7$~@iI[w^[A#%鰍**k_ao]i /al6ndtOE&MH!DEVW l >ZtsJ.|؇3.61JYWץfӣ[29dG!/=S~U#%q*- ?O]C>e$[j[" m3"V 9^m5$egg6 [נW%TOw9Yk8}GeHBޡ/ۢR&"yoJoM )HF||u DǀϪhP]A'n sri<4#F0sI`-`i P>|S߅GD%F0>EvP=Da>^ )MgEI[ZCIOvԡ,K_+c52GC=ʆa:̥ oo:X|h%d=LfuXFFN@52 a0d)EQٞ:RJ,'[zfi(>[45`Dq$B5z?JdCճ),#ADR6 HBd19_}gE>f|9z1g$ON.ݘ ʼn}alfSI8\/SMl nO^=\he,Ҕw}e $PvKlC1ۤՔ:IAnyREB:m /`owPH7oEHT2gFHB˽yװz8ޞ3!?Cqa/Tu'C Cx~C. *d[mGe')]r3剺|v;ڳ-*4yӘDWp:rmDŽR)GyR^_ѯʈPk@0JaT|020 [tjC=Cw/xneS!-$9-4>1ɔɻvEV񱵅_2Kf10 PpӬh |6Ɏ\0D7sy5˭]OB*H]~'&x[ |lԿ\lWqab.0CPGr;7u;+".ZH@m70JڶЍOQC/q10I$.1>5/ԑUcͫu]~7m:ECiKd4亹ǽƸB>^-3:$4{A+:A0TXRUmR*7x-/::ЌL͏fVt=Կٕs\#䟈?gnEMu->;8r(Hi[>.0 B + 4P}(ۙWne!Z'¶psђ# %,7OS[ .eӽ_fMdqbCԄc8h J?ySy-(q,X́qv)wlS蛟L Ǟ&+zeM u;DC0 0TcFoD;C 3I) #mRz6? *YZ ;]gT'/SMj j Q[4= ʮsl͗@EFe* NT(͛t P ; Rɛ7 P<#۫2:7|\3AefӁ4Q0ˁ'}O"dUC40aѨq=+sJ[#,ݡ}`:W7S-L_}ڍ*>kvҵEOZ -m{W|ȷה Xis0 *v/-r~jĂ_zpB&(㣩}1}2ixpVrJnXIH\8tӷY]SLh޷_9"hᾜ$*M3g?#aEF zwzj5Xqq dܚ*T`k fk*@ͽ2' >8D48^zA,xqAKt-Iq#{ނ mK"<GDںf0.X/|owߺB]w3SVg>1G27m P}&?j0w۰"gm1O\^.g$8"ϙ6:!y2s4^Py[ zjtIJdYP_OslŦ1pEwT47JiZhNVk˙>[e-tʕV."|+óO )X QCҒ1ɪ.񱜓Oa#x2-|[ɒݦ*HΛJ Kļ?WTǹ*MG~vϮKܬnHb=1y6\>> b˸&u߮b]n! sN~A;IzhƔO1\A,@+|4 z-cVuMυJ ݦēسoEEgRE> OEQ;NIe(pVܾ25{8?T{u"903,qIS| lW l$Ҕ&wZKBkf%EW3q[Qp "l;{5|^.O9]  JBj'$hmm9%nbcK,ladkhVTM}a8r_GK92{"7 Pk{$G̳]m(-,lgDKF{ UxSeTAQy10E/v5eCEY8(EE?^?3~TϪb6 Bgw 3u\,MZȣlq窮#);2ID&lVÓ!uY' 9\ ^tKJνr-I_YRp缴\}$!C)m]Vvp- C( ; ޻MT3$zq%Lb ݆X't4J>x$o9qs0yWd 8Ur ,H\Ab$H7zd5gTfB["flj¥8)_ҏY<*Fzg7 I9fa~2,W-@pkt` U[KpTdJ٘j̉g[}UU$%3JE^(ue,~DG?R,%G]U4N>u" x>cM= NdW')@[:F1mLva3wK0t=QEU-)7Z+qvtOWK'5ȹ5|D9YŨZݧy6KZ wg}3=E7u%maDH2oO_(8wqjJl=h)UzWs8-N՘VHܒi٣!\R B=J:[Nzn+RC!!ƙUēzvh=Q],Uux+LH|A>~?Lt"Uz.C=?JBST~ +5bW"j kH̴ Xr%}>HicI@K{ɶº/k xd\[_fs88sKcO hr9?dVkIIpZ!;OM]C#hDkMʚ ~\cQ3ˈGs*aLI`>~xM9| A=XNu^>J3 AO8DGqx<@NXqOȧMy!l!솕PTb0Y|"ϚR7\pgUI ozO/'<Ԇj \iCPra4TX8"=՗JBj8`ǙmQ[Bxd] hKASdo4'HmXdi/(%AXxv LǜW+hUmX|Ȅ4WϗpGDZ4ɟhjӜ]3F۸2{tN̪`~+KKbko'A[N.w'$}+J Gw! JL*#*Uf=act"Qh!4yiͺ⎊uLsgǂz8ǐMٳ^OQj_|; Fs(ͯNYh϶ade<[Z 8}Eu]r:z:P/$܅sƿЍ9ڂKqI-}Cu[T!^Z64z )U,6 OVP-dB#8.E~Q5О1G2Eηc%L + LJ'= ʶ,֖K)Lp@VVhCmV8,wY,][v8׀Wgv`?K=]a j4 vF·фP~ߜCğH/)H0y fe7ۙ#:@NT\qD;G-aE{I3)C9E$yT.MT^"c2qպ9Bqf$;m~i^&&Zs;qOyDtš|Z8Cu dLʥ:X cj u_~jF 4HVΉi+(/d|qyJǷnc@A!C|"OI=]LI?LΡN!Qʔ)*>em;³24̬kv.6(J%GoRY yM A]u%>6OF E}I1|Ҷ4}Za.k->Ce} Qb*w e-ɹj("3̛w w&Hd|FaZ$dt&5$z1ev0#OX{DA=08eHЎ<9`Ӱ1s|zA=9@ u2*5GI3!w؊3ߦh]EA&0t,KJRˀkAJT5ZN4KfW=OhKs<{Hw,\6|x6s܎36僐AfG0pqGӤu\Ŵ c+ fS .1;.ByfJ;ܝr7 HDD| ~cE=BЎ$ar"<MWʰ+'kKӖ%縑Fo-܌I`jVR!,J:+TexwR2gJKr Ģؖ?[«beCcMQ5*QY{yFl"uF*1H,Jx: n+cA- Z\<W0}]J#[l θ|{>/߫񔽺c E@iQQx1*`e]E卍eu,tus~>, fٛ[!z,'oxFwIbr #]0\Յ I^)j d~h"<@ A)x`^O/KrW؋LR[{BF8s܍c'B2(&7܀/>|I+B4}'~z:%ljYcge0<b^攙q:K_*RJ>Y&g8ӄ&Rr0֮E m?iߴh\BLs?OrFqŧJޓߕDbܴ}}4leׂ_Jiyr|dh}e|I$"/t}UXTL a*`[*9'i-]ai7qwW"׊^\DRXIo5!~s4ѳܜMBz~>&P|:`e Y);9g:(啤[*"e`7uN"m}ţdr~Gk5NiX5`Z8hfi.ZNxnZ~/4@0+OAS5[*8P箶^0a\a N{h(B^3@5(u~ʓcqrTEf ̾ 񹳤X|k)[b&CVSʥh9ųĽ*m/L 1:HY(AQbDCē"P2ː̊wMa%=8;Wd>WLuB_<>.%Aދ}"QKDI]NJ |qLӫ.fb}_ WCbH`6D]uX);B8D?|;I'uχbTStxvuYM#,{P\RU .o==Kxwl|c({uM*@I+?iO>FPu Zm8E$s2̓XV<*G^[y.=R?$-O\%33I\]2s\d3ܗ jj숇H\p!Z b0^6: QI>~ +ӈr8ϩlb ]-pR)$**e2!y9Rfۄ+1PZ|y c2{a8'bŒ@;qb͆!-xa ,&רHsKm?69V@RHv6+!NCq5Ćk4g2Nru]>߯/_9Wi`^@p!ļsKu&D-)-T%)Q;S-v7 ؂}0ҟn6fUo_99|qLV#q^L>h>= 9uZzϵA%/. VM]NuB;a"D;OxO=1&s.$^v鳛GC+y!I}Iz_H0)?s /;(vaKK>2n&V}<։51'y O>\(74A_;-oRn) :}0>1k蚷ZLUa;HwuTJ͚C<δI4jQۻr*9ji-j;mk=}GO? r4 {PuF0t. UcjG`8nvp&#B6nϋiǥxɚz,ϊ-9o5.=Qv?eAx?P;LG;wGqsTM4ˬ϶ME煴a m!(Xmp ﯕ8w"$;af#ƣ|i^xiѤ?䭧=ճuE6w5z mؤŹW[U*pԌ'l>WOAnyIy9^2̿1֯e)(ֲ.rht* 3Ԕ'1).#k1F Q[2YQ3-לI]HAo ,ɫKH1`߄彂_.Z:cWǣ'J9W#$/":Q^ۆ]I7 YJ۬ȣ\):9jJ>of!L:-{T'XAmB1OʭȏGux(9ps|bȋV7a+5\W"b yUXYqMfЅ}Tj?'򕹰(W>|XR.&b(;R_53Q8/uIR-X#6W51c#ƮVc|B/Z=U@s]Z:ENJmMqN 9~4݊O}suG>)mwo^hmk,e3bO^2i0bԄ&ef#O<"f5Ҟ/k KՏ^v_ #e{J^(ntr]wmÄc@uJSQTc)Mx1ͱ qH7DatѲ!h4?Gt  ؐSӕ=|70xx ̃L,CnDC[BaqrCZ:E:s>6 MY$%4^Dzr)PO)LuV x[iޜd lWs#lÇ3kZ>q!$CgcR#oظ]mcG/a[$0SiE ʣ1b0>(;xQVa?$U#5V!Y+Ak!·5~*bWԐOߏdфqlKe Y`WyK/#&'][9@ɸ?AjpsCayl 򔗗KOc><"0򁒵oQ}԰o\%cGAyTO%g-]Qq QV&B:bזpb-?%PSaO|Y)m\q?{"J\JLT]ϥqrq#:ҥ@xH9("7#}<+Z*Y`OlbVD6PT}endstream endobj 201 0 obj << /Filter /FlateDecode /Length1 2038 /Length2 13437 /Length3 0 /Length 14679 >> stream xڍP-'݂;wAww \Kpwq䞜{꽚*fղzw_AM,f6I ,l Eqv' 255sdj-5؁_ gr& 9W;;' "ؙ t6( dj %~||LAf@"bhͬA A'h8򳲺]XΖLwk@ rv PڃƂL аvˠA;k3ˋ9.Pv9EV9vG k?ff`{G%PV`x@@?@;? hm4}!Y: - ([#ąyiqA>IkgK=Y\[2]Y5\As^Y n666^> 0b##O#/| _k  8|mo06LAȿ,/lg{?v~L97+fЕVe[?Fqq`gr|;??OUW;GߓA;eAofy t?_+vNc[yxgWn(_6ڠZlg6YeC,i\bf^Y;T.?N 4KMxIk_rxX rX_f/_rC_J^/o_*sm~I4y^ }Yg?GKRRo 7'M]%%,2+Ȃ_EoB|'6suv~yy?_3  yal&bSzUȝy{Lhz[;{'B"}ezЪX`7Ҧݵ"ٓaS-Bxsj˃ϣ'x}yb5$H;>ON>ZMrYNoTr{dLo(Q9cA->oNU[8nھU>,g 9VOgGrM'߾43O7I[/i4 x}{w;>.EJCXX; %p݊ʒ0k\F ]j`$|*)FGLl6hNgݲHJAh<ټZ3OpYMijzH}!UAaJPa~) Ǩ7YlO iίg_%*:1W= Tg)H.j>x.|ӗb @Z)CHoV7;׸ p$+*R*QOr4\ofkq?hxw>/Mv"0 53hIpr~&kۋbud w oׂ+ Lݮ jQ=]B5i w6IAcd۹B!?`&oZy/,9Elr >caJ_DraddmDV^ MDF9c{B[LBTAaw~FК•~X+~d2qCǧ?sܵڧZ܏eC9W%] 땞GPуߋI\Mi&pW&d%iCt@pߜ{V0gE< UG" Mti{N6AsimEC.q0 MbBCmޗ~ ~HQ~Kr&~%ߏhcg|ZހDՏv2uy`=wJ_O&#ڰ:YL#Qj1˨cNҏQӣʒXqOn#;RNp2wi-Tou{GE2/ƪ}ƌX4۩/Y\ж6;5"dJkܒєl`@rg`䪡ZlK3hôJETB^2˵%^ǜ['VG{(8nƸd4(,([ _fN?^MfeZ8c4G###|!%Ď䣀WBHNv鷝xܽV*|FU$W'"}\>Y1^,WwofH^n:}i8^ _hzɠ~{a-l_sS%2ReS:PsJ!;誠:&d?wh,$$+"}RX{`8PNE} vb+l2 "6'̈́E23{a'Q*'w)_4-CemJ9">[u}YB)ѧ`GOIZLuwg[g2-d  )7pCukqwkR<03y9ª89CPxYը*M 4 -j.~:XKs\H|c BUSx6)t@3eVf6yxLO0/ó\SՌd=9g~pEU+mak'LVx uo"9 ӕǮznѫL%<NC^mc(E\_OO,.-Y EPrFc#Qk 645gýC<şEIx3Pis nh ZNQR蹹JX` B<-3,Q/.fI-o4.mbvC'們0Ld,msZ㫀%vwEeJIaUڟ]Hm+ WZ*\V'.۩Ń>\"cZ s ޗH.cm= X1&Q9K+WEWBҟ6qQnƮ"~b: m3(MmYR~e1XQh/oDS)pěU.4 fUYsH"'u؁~cQ1KC|F?|e:F٦s(u:V_+yƀ[C:!Qo~/CCDT?;()@߅flIPH-V,Bb>dT`բI^S), <=сkq}Rt~3 UY{1HG~`AF)i|IsӃ7震H~)~r e0q5?45~UfN֠t}sY~T$-_`[\p%x@~SMR "ޤ!d)<,sJMJ ; co XٺN"uK۬&:k_;Id =|A2f 2>]D߾r4L`/-yfmod~A˶+y.<ir%ٚ~?" -ht,rrm(|y/NE A]ۺҞaHYqVA+˰R/.1.)l< #Tj7K0~Rޔ)"\,fn ||D:/}{$L@H5tĈ& iNGK(EEV& 2]ͅWnĈO"p)fJiQwd&9?pg9RmQQ湟uXQQo vyM`wLoY;qj㗏%2Dgdk'Q}޼DM;Ct2+"Fg ߥSq"lNh UAİFGpICnu&44K/-I j~;"Pk ӢC|`@u+%& jf9;,}:Ӭ,oB5_g=}5~@ǿ9Rn:M*p\iE˦mK·ƞLҰWj羥Cs7~5䕰\-O-,Tr SFLh'<Ƭ?GOY#&RFlvk}'˅{LEoE#y)x;@MZQG{)),{}I##&]^V \L ͷ g `vp]"!+X |u1GvY7x%K7.w7])]=ul(s,.?o5}dK_x^l_Ӝz_3E85"36n;0(:HYȢڣɐTj*E|۝z_!Odؓ'N^ҋ$ yK;'rc-2Yd4gL60lݡCEj6H%%tWcTzT28PM},[q ? t9:Yyi7O2܃?C!o}dYl8PO()zA]C5R[k5ܓמ.= ɉR˹a|X# ?mu1ډgMz2d+kbk8| ߭dm@%PP!PQ|%y]!E;B .XXl`#@吏a>I;:*/D "Y2ćf5GC{zJI-qQt R7زrFЖÚ 'b n|B/a½ICƦe;$srjA# pBpZqd{ʸ8e2Z;鮓6CcijY eg3ӗv:(>;V 8([}dq?m|'%o5}VQiԭQ>*ڐLIs$_W"Ox']RfKLb)bi-`!uונDκJ_3/'-.hX牝Wn߽6=QeHp %SyVʚ+}zh3VX~`4y##4p(H8`s[sݤ# U~j1˴S-yI ľNyԃD o>F;F=b r]+.w !11B3oց(?^h [M$#z! lB6l47S-bXuR} |K(qQ`S$_O 4\0 >19[8taOAC 7'\rwd2 2LyAO|䵫ԕ;K9H*]#jC&0SG<(:p>OC-!íǪp^X-q5bptnxvc#5YVKɜ!CJ3%l(HyPL߶(7TR&Z2T1h/F:ih[Gf3ܯi>:/n}k ?&IWQjh9:~ԩK-EpyGZ]XJBe{]ԽzVz!GU9ɨ"e9ccCۅ89\~ljIYH44.L-43~uޜւEe]kiaIA4EAV@k~ ӒSbG#]!5Ojr>e}-gBLlO&W/6%c6 WByNa\-c|Di'm <9aaV@:#1/LVȕXNqN~ qY{W8|]iI :4FWO.C`m).ea! ߗs2UD(N_a8ɀZMBp8ϲMNK7VHm{ME葱,Nt^kZ]&:+*`r-Tqǚl"{IOz󪼏$õoTXx1g_qnJcc64ziPWwi6ZXӥ[a>`{Sai!J()97CVyS9xuzt rX';_0#STx2G^@Egղgoeg+jwP/uhO7Yԩ^0}H9TMl$%> Zc,EmG4MCK(k6b1]{$YzK 9k|ο ҥnVVS|Շ+5L-Ib^Mq]$x;X#Sx]VŇ!ocg$QLdKA&34s?CYU"xOzz3KQVݺc2 (3F߅4Ȏ嚡}>,ՀzO2j&xfğSw !pؘ_k,_DSOm qqJ,:3I%y ͪqAxëW#yvLha%Z4\Fpɮ`b1- 幞OnYt#7kʘ\^O- ȃ1?1〫64>-K S([J Z3.kysd!Ax@ǮH~=NUE홮}Nw_;:\?e% S֥˪/7ʋHLqt F5Kâ* ՁZk?|gCG 5{<@6*[ARRA3u-.,{}o !OPʟI&DYj>U z-޶)I5ŏ+-$'Jtr)ڔGz*xbTH`2wG~7;=Iy-G&HCjU?"KB#}}8f[WΧۓ?ěaew"B˵}or˺sIYQ(s@$ ^6eIIm8"67xA Q  ;2y߲Xh͛ jZN HڒT - یxT+e\ojs}z/p넮{Y>kY)+A,^ƍ^a”jɦf+)7l9GȞefZ,DRs[ Mo˃  aEBV$UfqWpK,_?qBC^;(y W} w5ev/ 9ҫl; 3B~LMخk_ ќ Oe֦`1Zafx6p`YSGL ]6N,?İIR.3∎\Z{y2|<I t] -~5h RoWHrF'U 7fyB'C] RT GPdݽKU:{~RpDQ#1>x8b޼Aie-(,iJ[#R$ٕ%VQź}͇v=v* .dIױ\e"|7t:qe!C{(-4vu7ꏞ$rq^}h@Y%QuNuv.x>IhLpXMhw={4<"cl (o;vjRY׻T(N1c]0vŤU 83o(vW!Se"NA>WR(w5Ux#!mX̪\\kXhNg‰ ]Գtx_xL%/zw|M;Jzi-(=Y(hE>}2 lk8jو:XyP!apb &)0o>iP"Z8Ix𓳅b K8Y۠-V:k g"Ĕʺȡuoec \=#@W=k;Cw.Pizk@RU-Uë4i@1XIƳ2unz8QApz c~hWmkհ{GJF9eQW@7Bћ>j?A2Wg z,O oi+:|f¦hxtzHu={_N0'lpt@ujS<{sOtq.p9mI#+]NjLٜU6=tVX[DLQK|I6&rh=PSKD[0"kL1 Q%B)grzB6y! 2tx v޷MnK`rovhDn[cJy#?)Ւ&~@|<b G3Bհcf )`;q&m .N;Il"gV'ǘ"ŰwZV,Lg>P%I9 1m@sG&Xe#FXt՛+U*BFtG!;]$:|2tko{5rYEbw 7~f^esBx}0Hګ!t:(|>x9`~F{ ̄6y&/gn=9}ST!t#گu5R>Ű7M+HrP.Wf+mǓ#c,|ukA* I'Wb=> +~SXwU5˵6d#fcxIH5e 9H!]KK,}ƠF1?eL51He̻]oہ*n,\RoȠJ#MBЫ"KF]$\szpổ3xsnukQ˧nNOy#6Fd n^AwTr7\B}M[zrORl$/ ѽFSө 7!5mig5CzNH;ͼݴ{ Zza1BvO i)vFH F~尭yV_~e„0IXJ㰘X_&ҟ}qdq7[)<2 FmFg+V<^:e7wh,;9C=Bd̺'Ie]–GA&CkV[I⦪J" ǿ Mp(lsorǭj\mv\,yϟߴ,W%&!(d (԰Fb\bg/륐MsFJ?P^2NNUosnoy)Vqm :jgZRaMDV-Z,.*"KnN#5rƷ>{υ-Ls40+1`+abݗQ|z8dSÖ2| Wx7+xFη$;) 9"UHC{|7+6eFH>}5>yJàsBjܼrl"* v2T}~Қg^Hj“:~F׺-JTT\djUg6n1bҝ%=L>'-Y=fxћ{}> 4zӇ~!=8.D ^lbH+ Q _EO)=WFU 0s Mxz!MlgG g/%gfz[z6y"P.! O7xnrۇ?l]+'/N亜^r!mma2OX}?,Ƈ\N+ }u*"7̞z%Ap$/m:{a_$]i-^8\rDT$\9wW6]r<彂NGUNY/}2-SZu(2.cb;HT?#Ib[[@+vc U`I4WX\+s:k^Lffrl,D@ >*'elm'Dr6L.e}· ݨ~ձձ x5lb13P)$"3EnT:1f ~,}MVcP2I]kӮu71A[+/qiȻȊQ5q88h=*hU*tF^,jF|/)E߹7`$ Acnj^@W.n{X_LE{6@G!s;bc>Ocw-kB܏kHivQXn.\e~ۚ@/^iʋ;UhmF_NqU9dllY%wÓ"}H8 E]6Tv Nqk~67N`\Vd/K%"Ӈk٫gނ_mk\P O/? #/@xG0/<'d3ei,]?caSZRHs#ul]pbwG{̪J D턭mu D_q*>__0}ٰ0m,Ö{-` uzdmfQp!jZ80&ʠ$K5__:,c(QtCUU |LYZWBkNwRp*f?!qy6q,)c{{s;endstream endobj 202 0 obj << /Filter /FlateDecode /Length1 1419 /Length2 5931 /Length3 0 /Length 6888 >> stream xڍwTm? Mݝ #A;UA%U$%$Tw<9u}\wyX@8 HA AHi8, T!8| tE`qi4Da/POB±Nprrx`)) _@%w8 z3q`8%eq8 +88g x?!!?@g`@ #Owk p`? UOBd rGC |p@g C 7!GAqXA,'Fe׬tPAÑ8,T8 BDy#9"?a8xLO oIJH@Yg_4ӌFx@#B@`0p'x3? h keg _#Rl(0P@X D%E?FzstD}#C ?> Oh8`/YRYH헟wㇸ#|D ËCCw@xW D 'XT$ێ#|w8o2= |7~E|@s?\vAx!~?ϡ~jRXL` <%;1?/^/(>tDa?-&  Gi'iQ00Z%oQY# a[r\ڸRq^c`u[.}e+ 썾N鋃K)[ +ߐ.aPpp3]7}vx~gwmE.F6ɪ_B㬣3ovkhgi{ٞdžh{_UdU%1-k+qUqˡOQΖMn gT8gc6Z,r&x-C~$;Qˀ|!֬' b#vddO -azr+8{9FUNǐ˳Z7{>i.l%a"_6+lA+"BȬ6"iOhSkƣ&O0]d,UtPd;* pAJȞh+&,Q=VՇިONB^:D^!q'[~g[@}яk2f]NE}/˷gk+FΌDx;WhRW ~~@up0t#9!Ciq ge rAGrDXws宰[uڱ_@/Pv׾),&k1p9/"dguWkZ¹ jBS~_5p>˴+_.wC*vmڏ!{<Ͻ-CaV\ oGNL-E\$㛎Ӷ@MlcwifWi% HOJ3GH<Q0~yZoM7FS&]޼JB7{?zDټ^xU=}M#?VĊDK`L) &0;fMrb6]Wyp6ġfshQI){1i/0i>,j\K '!PUpIۨ Wa\Ԧc[7&8\[99lhzC WBt1grY`*_}jlÑ4*h-nEPצy3+&Q_'7rmu6 _ZFf,BoIxORyj#$&,|b] l;Bi8/'浇/O V RezT\Vܱlje /v{do+ *7T6>ٍ < t Sհ\w<59m IDґ"ƅ`R9aDد.5&o9 ۡFjO%݃a`T=ȑjX~j3[Z9Ęg_yJ^j8\G+|~=Y]82zt9:brו(ttP [Zj Dې):o|X*lB8þ̃]c ϔ:cϢI_vh9Or+\ _]fO[VVMd(?SuT&B@my5<qKl3N'u|No|Q J1q[R;XbZ9'oEI!s [odlR:0A=͔h!ʞuqGN2_HS+Iq}bmO?tP `Wʬ_ 7p:8e.R+WK}1f=.'MDwrIEN׭^EZjrQ66Irw UW_r瘪oSFgoYQfagmF!D$MC,O^tEtXܙ,4{ǽ7?A>`{6@5n9N:9/)Y^L^qthK=%"%K:NS[\$JhM9O]Í r-UYޡZXzSFW1~o1tsS*lU bk0c;nU6s]Ypq)i8aw:J 7LC7+ѼPv5n 5uJ,{.-k4.;pcɇRnO +kZ˶~ɽ<f ܕN.cF꨻&j6;D.sr[R@[(Yr)W1GzCv6&QYAezհ*\,{N P ӥ!k4!-4HKK{{!1YZw{@9n!kSk$Ddнۙ]ni/$ٯ5=ku>m){^Z]e űS@t} WXYvoxCv^uН  ǴPbO*hqG_^rtOMP8'0~pdTX9$Aop3dWfmd!=@jCcڄ#GIe}qn eLoGVpqI|\t$YȔWc}iɇ 9o-*LA9NgPq-1T˽A<ɀ',^ ^ pͪ3q1k?Ԡl]L1<3Y$`T-_;zB1^yPX,ʹc}=@KP<e4op ;McLk-OPb#WxeWA|>5`8@$:'S;T%}ݢzP4*w7s(5$q|k0xv_m[T9Gdoȯ)4ш 3s ׇ=sm/h J68nƐT %!$0. ܲ8Q`}@{"9 .#*H%Ɩ?h5m5|I{ע(A=HX?Waf&N6D?fdwëZ5@~rYaIUY9+v> }dU}6C:v舭kMiҭT3}Ǘ8u~̤PcFYt3dPuwAk*̐W^d[3Vq|mt(E֙l5AQ/82概qEB >Keo&R%9\^jjָo\qB=s'Sna0Dz,%Q?;#٭Ć#W5"XڜҶT bڶա2<  㤗> stream xڌP\ B 'hݝ . w` r;3M2{UUkzNCJL+hbguec*12`IIU,aIՀNv\; A2Cg-@ `dbdb`010pΑ bjaH`I=-̝A400rr:Zd ́6 FcCk?!(x̝ m(in%hU0@wets vn@H`ma uyؚ r @h4z`c7?޿Ylhllgcohaak0dݝi& @ֆF 27 * ASuYDh+? G1O`jakb{zU[ ?& o :«xR2*񲷳XA` ]gGן"XFF3hfa ;:H 4hf#ϿtAebgk+ +S]:!!;w- kA| $GDI[S;5:\Y N_9;.W_oE[_j?jC k @ : Y;q_Suߧ, 4pZIgCyښYF '1 w;)[[,~=l@'ЬRA_JQ[c;_0tt4X^ 5z:[;g TDXD#6o8"'^_3^7bKF >'~#ħ1~#oS@ A71h8A"h+,~܍~#PFV@_ߧg/b3,$66&BfPL쬭 ed)#(*'Pu!(wH__z;?sAX@fao$&a5:;2+tFANl5jP0{;?eaGq-@p}2 cw,v@#ddh+#KNKΰ\VP'4A-qA=Lg7?@1\A> o? (pɁ"ycq^Dg__6@w11weUpwA\7Imo^-.PV:~x)Jq-@uP.1^IvFh`u7Zgo+R. ٨wn]ŋCgw*ؤដ'hUt HҦiPܑo&Q2F_ >QE3yi1O{.09a`kaA\ y %Jaz-̹7d |]}OǔRai[Y:4ʸLۃ_YTH$^Ѥ\lk5ZnQk7as0i~_X?C{k]fz737F*Qs툥Eoߴ%,~xzkx.ø| kyOY\nkܫϯgg̢)RDóVbSAgket"E27X{IX$;g#t=,9sNTXs "ijB8oL6nJJ„cU؃[3ڜ#nNw">l?KvKzΉubgjO}CA_v#rM9;1I88Ie]SUfJDF8|KbQ&X2ez7)DoH[D"G:n&@[[SvR«Ӧ N*z3%c]"b4N&yIl $$֏kmXSȻ^hlY2&R [!$;_R.,ISlTMT%㯜?G Wr0)Gou26cFmTZwI2MtSrGofFԙ 8eL&7q}x* >kfyޓߏvGw[_Ygҵ+\?K"e ٜAar2"B%@y- dlY/Ȋh'W{r`ޢzn|2{ڒG ~cq5AkQFG${t`%P> +fɈa[w]Yםi- LY\jB2;<'9i^mpčsomŠ>AG} RޥI~HONNuf:ˇO-[{l%z-Yi`b ?=6degĻ!lJ_=G`PK:ʁsjBB|v( -iNV NP01ZĢ{![Zd G41{/3+T^]2a4_p]0ィ po3ql8 ت3zJ񩊷zQ*be{?r{-)2c쩩qe5M""ɧY4spu~ 1] [{S2zU- ƚڬ=mh,z~x:qzPgސE/sA-`(I8$&S;\2غ1gŎpyAr"$2/dsflR0b<0ۇ ù1XV&vk4gkGƶڲ/0.0F8°]ytڙ Ό.eit,9sLFn 9 en$B|߭njv{\7wl qXeV᥽xtK ⵷gu'K.t.'D|g4~5㤰vM} ߜgQGO^l>E׺y\. {b}-whGH)fQ3ݶ^SL˹DlJ.t*R;x$wNTu\eD>8zKi1OT<=Y_6QQ!9yjcE BZHGZ6ƑHZƙo8g98C 6&{LSԗCȘXP=vHOQܖCz9^s3P;Pt <+attQ/Y`GnLsd r?*T5JV@S+%i;Ei*<\f]DMJM#IDWk) Iί9l&iRw>eئWbkO-vP<'pZMշ!%M([98 [V+%-Vxgba{ql S hq*ԸF ZG六*URo] '8hBaaH/Lch:u?G; pkF!fN LHhun*FRdxB#Y{7p=w%6(t "Xׯ,x: z6S0{:6q1m,yHƛ{k;x4WB@Շ"UC@;wLtwO5܋3h5QX/v%t&KGY8إ/k!N"~Q\+ :iop Nj;up(p겡=xSZbG[vܨFt) ) Zv\(-rѾDP/a8%~m]GsS&kr8@s/`iD_TtxSԛ`Bp;'vn%ZF1^ :lD^V'2uۇN_|`ea8Dم/瓵$~mz{9Vivpg`7e܊aDbٚVdKΫB(4U8`旣{)pI) li=<ъ#^!I]\e([d#9␶GbM@_eCVx7>'d]ȢqLM0V˫8w:E$,Co:;/%u-TTdZ}-_&K ]H~4L1ޔ4P Ky}j Ɓ&AgSҰLãy|-ݘ0mbѨL:jb`~&xQ"r.) ugںzͮh=8YR^BHyW{U#~6]taI#- &+c=5~o?/JI6,EK3om^#Kq VW@h0;fehmܠ\:op)zRc+!J)\AZIʦ|EXScNjv_eܻ#DU2VL .VEr}|>Z_Z8WygPzHi\>˜ڠPFf^r5f4wxKqAVJt)Ϯ6t(ʛ"MCOX3e6z?*]XS3?"9GMEmW2ن?CQq=v M4Kp@6AnI:: 2 j"[w,ou^Mh:ኍ^0 tF?-Ah4,o4Ԟ*pyVܥ"]dAfC>H{{$CoP$Ek{Vb6Zos6O"qnM-ϥZ\#]ݩ?/jm.wop!Kgj{pO= ϲP"+F"Ltᴿ=2Džܱ1 D/玴smPo T^ZE_P"w9 ier!N 5'?]zt©><+P/6D4{_ nĹԈe'tj Jz| ;eOem\2Av}/Jo#&o&G>d!>~y\g5OqoPM$\,.:MN )xw_MM?t>'$d:)gy˖X)|nȵjh\Rj^ej ך%q^Cz;^f';ϰ챛DeފcovZN!>9]25ʨy\6̧3gpL]؟fM⟤Ru1>\`-`?#yC :Z2:D`IvHx\Ԅ~Q[K\£ڮ2paߘtXiIH]P{5xtq:QLWjٞ~Qz74"E n="*~3DMбS3'#WnAIa\XZK8ΠsD4 p4-zBp`8yPFfĐ)ܘ{;fz?mX?Y> 0s&Rņ su~9 ^&nx`vМê^>lʺ *fE{<9%킈[yguyb:2ٯ{z8嘻pKuܤKC3!MowQV#BF p1}Ir_'ĚۮLͻE<$m7ah͵1`~tgYdx\kxYqJM`C5jpO7e\gc&[烖xzKH|}t9`YwQ|qJQp2a\^1A,^w>~oc@a3yvO1kqi0Џnb;.7UTǵf^`_EL_-@ d)Cze˯=c'}q gniI¶|A[|cS|xh beUs5q|EkV"+sТOaESU1qXS ܭA`~QW~ӺR1>o{4ǶlJ$RˣCy&3o V;Zw-%mƯaFR.9!sh #bwCIXNa5+>+G'c[6N%8j(^)%$8&o%{n(t ;v 5ʺ4}N'Ky[2wvr4< 2 lDxV/a1y` "zRжDPo6bT+,XMGthr/v0DO7" 1:R02԰awWoR<J VذA>|"B(Kn9p:M8C-WuOȮk9x,(^(2??JcDmEpޅGؔz3mA~s"";Ju%Gj͜0̀ GEb}058']8^'G)lSώw2%kh&ٴR"6QP{Mќث "qSj)!41[سQ,y-TO`9oM XZoB*햑 Nщ̙w#X%>F _4Ӵ.urdGWRH3^)qIMO_i266ItL?1co*z9ܵuJ@}[>5HH@Db`7H㇤U#iIɵ荀T]rUz: C(HKpSX|rLP%e!i|تwEGY^b`%Zu ݥ0c)HHWPNd7&ɄeػQWKS 3$ZiS2k.8jo6SkTg<&TBUA@$ 3?M톰>iS,紲k|/іxqn1]F!8|ZΓ)݄hF`WԪnl}>#1m&Ȋ-3GAP)qE'"xi8}_ 3П! )RσQwvᢘ_hm4lX0 v4;_˩(}ͷG֭>J"lKC2iEtgUc}&Fw URt챉ŅoRr( RZ2gqbP3߷+w6JP׬YBlkYSw˧٪$5k:T,1t3J`4h#t+X|FQC$<k4"WI3. ՜5gqbttW_b?P&tf" '|5l%n/?S f9wKA| ")`öS3ta+r~j8U\C,zao}MC`ݎG1ErC9$w+B ,OhHEE}<ǺgRj^t3KAc.Kaܺ\-|?neM[48L œuqC::x;AU}iCm,v߫Z ޥG+"ⱹWpTo'̄R#x}1aG:yޕw~Z`&Si{ F#8gR%(B7!N~*ʔ 韉BESh՝+Dz  l3Ua BIVoW+nٕ㵆Maw NKDDKD]KDc^J4V[>aXTV uq<7L |8 qM;|"/1d[|>8DGfqFЇF Y"\ 7#\@O"͞V!\hU>̔;#;{hQ(vz ~%F;vqC= @k!<Mv՗uuu(EwŎxo14/luOyɉ@:H`}_:,( ڒ@yY>[Nauiwwl >ܾ]$ZVyw w:.?5Y}<#xvGٞ60NSR-$& qJK-11%4p;%ډPN(\179&x#sχ7r-#I+{CpִcI]iA$fYI_,+vJVX氽:FL\NGkAhgL]wRBi Y?UE=u0+ʡF:ry St P>zI*v|QT e.BiL^ٰQtGF ʎ$?wYLnDpǬ7df|>~7?dәQ`N Fv hdo׶+z,fepoߝ-4ll({ #*Nu^D )~&*DDo|BIҏ+R"Md(^33`';NFܸN5ܚEº<s2~"ixj'b>5\[)pz%q("/R^e& rdk#0dƞQ*^㝣[&Lڟx_-Z\eaQ0δ.4_jZ:{b fK9Etk@!v7%MT'AA%t݌U V0ڱnA%3ɷ BhBW6ZѾYuwͅ#*+胘40 NqojS#~;Uڲ=͛C#)+3/s{'yds=ZOxz^%Q%^>M+֧|Uye'Emgi^sIݶ M$Awhъ>U ]Pjr+  YI;㓙v8{RL(^byLA# V^JCQgs |RY'rЬ+NkA-WkW*+:#>ᮑ,Wθ%w ;j%JDuY z]QF!_El7xc}SyYK؟'Y F1$Pt(;M1. n)[Ǡ^U$-yt=_ n_[y§G^r]"} g!%$cDt8" yeՠeVJ6{sAyˋU{?'/ʮ2AF#O}ߣ1rJ33A|u62oExCZW!q.>3j&6Ǫ2w턝M1y4REٯbXI v֐ Ԟ#ch^\M55Vq{vфiFyꆁxaM{ѐhwңjjr R.Y}BڈJ,=Z$AKa\̾c5EC-қWxGx_I9c>^ܙ }bn㰇{h 4ZL ="Q֥qH7e3w ˺*gdx"{_MӱyG/kl)D0hWn δrY r?/g2kVQK?N'jpJUS G(?eTb|_-ȁh`-rq[eky>WfG#{@ߑfg%:'xлm*.]8cw&dGESY. yD/Gk7J#rCTTY }j>V]s fXſ;7/:*6ҙ5,;~&פX94ZAҶ[iT KT[|3bDD&SEFlam>yl_Qtz <}7G 5 < 3$x8X;X%Jv1m jZݱަ?;HJ1wFOV250U-j7W{ɷDMKp^\:dgNQĪ 5jя0aQ`aXMXW-S<7l{ֿ=1P4Mu;RP?@ ʼ>k}瘐3c~d+uԄm;*o`fzQc>UE_Nx.fɓZ*,ž\ pq eq1]8%!΋f.V{vDIA,DB8M6A_#Jw.D^ii0O#&#Jd}( $OdFjɊ ǨP0! t!/P>? RI iVeux}Q̾~`^S -3Xl)h$^-&ާ j1v TX6N5:Xav,fKj:4]!F!AH4f%}D` }OfT+r! ϹRVaS=a\`a엜uǶNJK"d\PęKdaY0!ղoT4fXV* 5:q> |bB F2  ?(nYًLnsJ`C-JӑRvQgb$*ު42E8/g?_6 K=<*/o&H\I)`MN&Um/鲗DٔYo{=rUʄF))՘G ) ֱkO9O]ˎma{s3Hlڝό&_5Ɗ;P1)XPiԹ:J>0Hp%{b$ {s& εhݝ ي*mp˿g;\)4laőKpA0F5$} z م '~;$g1xe.sa>a`H`  2XY'?#ffX~T28"gd9hUqt,A xԮYKۯ} 3V+st# gFF2$pfuQckbhqÔ} V$B $VKJ .rux5|܏ nxן%9vm8P5YgB/hQ%=hE-1Aѽe3<~.7olyЍ;[ W2iҢcz՟p'l*;fR<&(Z5\x au=h4`:7LF;僊ͪo<2_3}A4V# ]S.&"{'멼 +`> 4CFB#_A!B%7LJ[`p{}Fɢu?05qM6++JrHp?ޖycޭz"wNaȒ6J'@z^grryfTۇ>.S؈ǙS=#ZBGYj(MJ'CPpq*TnO]!J/-lx:=ⵛ M3$=+j{{sb_u-+ ^q]r)U# \qE1 (7ynyʿO:"a󆆝l'᛹\2,:h׳]f;HI$4-v?O58i5.ZMnҕ:4D!&9בWQɘWv\&"FN*òQ ݃%J}if'mrۇ6M<݂ *VW';”eG]YOPV9/fQON`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\y6wR1z.2endstream endobj 204 0 obj << /Filter /FlateDecode /Length1 1379 /Length2 5945 /Length3 0 /Length 6881 >> stream xڍWT컧S@QaF0 ƀnAB@B 4P@Ns=;g{ߧ{s06VqB:40X$P30@" hGR-a(o8!j(C83$Rr`i9 eD!p'@ySՐXee~T<`(8@Ю0\F(`ahB)ўr~~~"o$E_GLa0/ . L0w{!6C: ('pCao rtF0l ,;ܟ޿!P(.g; `/Ơ/C7!8߅C*&ߟ輡('[ 0&k Ԑ0ڛW}p :VXH?Dgg8'OQ NDH@ iY @]E7z~+ĸ<gXh,(+}Np(s#(Ü&c6 Я';w?濇+jc/*UU$ ,I`8@ww6?uHp s]` I_Qg=>|C cXm40'juf \n"[9P? p1Av {JqV)5Pӯ@P(7xM- Qs(__BPe=x\ֿ73H|ȶZ~˃ce3W>Ԥi5የ*i}};<`~#?MG_RL3vm<ws@07]` q!ݱ[-w'MVj(G,mJǁ9̜$hd04GǮ ]& Rm%X/%LWywpX3$eCcfQBzVR9E7Go!t=QX NJ#ƻ+# Jhy-xey}7FfiW ? )mZqX{-8}}e$~ dF*v'H>u2Ś샖ThzJZku;-FnZjZGYI2.OLH]] 4K/h&z$^d.{GX1{hW\5w~oͽvW59,=EkM4Dnǭۧa=[]<W*~eqy>/2{6Sr_6GJf )zu3` V"af~qnmYLgIBѫi{k}:}́k a$yy!!y^i1$xm4\zBSJ2 27ْ[Һ1лL FVne twS m+`'*& NL3>oh9+ )Min kfKD]ͧUczOG 0 ~eÇ(Њ/+Cr`) Ɏan]d|k ֙ΛGZN(V[g~Ay6ukFɎ j䬴C-ԥJD8yo0ί*Sbb"cQק~r{+MUYُ\k7.Α~L,d{!>܅*ak#e_΅ęk<2,#S; i1x}#&$by6W?>q ؠ#mVCڜ?VWl[D*#iXy;o Uzo#F}v{!IrFB -e: 6y$J!IxQaQAZީ0ѽ9AҗM#lsͭ3/ނKX,kilߞRTqu$Bs=I5PQ<4~ 6pqXy{-FM+~^T[bPRڐT]~E0qgb*Oa')7ɤ3z_C< LZw`VaFzmquzms8?+/RmS)-{nܩhSQT gSܙ .',uķlEOl}%ì(_x`sJPvKt>QI/OIq$$> ۾W5-*2m^Xo粎ꁪH,.]K2vS~7}jS >ן⥨ cJo4UG|Ч6 W\u;W4$ϖY^-A]ݑqɃU]u2ߨ2XQAwbd~э?y`ձàZ)[9|?CWKw-{-­̦Fv䩦݃8l:5'2&RaQ`NbUjxY @O?dHiƶޠWM:!$ՐJ)|rW#UZ}Bvuy#i!D=QwntHvu\Z3- /d AmrJǒ7~0͹>ʷ%-x b6/#=Q?XLNiavD^ V-4,2f?Ӿ;@ʥ8,s]ڒuxRoOm®-]R 0@XԡBf-7N!lcx\T𓗸 };toUP~*[<G. = )L)< ihˮߪ ݍ>$X"ՒȾP!NF[g7될[fbk׊_ċ#tJ]nXJEBzT^&tVQB ssX %=N$*(sPa[e)}lIAt/>%i,| /1ӱ)61фpL%g{3c^شbxOTҍ\weϙu*73|2h/4(FWnw8f|82;xckd|5}Y< ws K,fsTzUy^y:"5^4}ysvȌN8#92^ I`GwN%.iN7S֘Mm*2)6{;om?DwUEڡM fE6ff~B2#m }nb:m޳wuj$.㒉ğvM *GgŔggcP 4>$|Z! %V#}F'R2*;+K't<[B^cѥAXW]{!;]6_|":'%&_6XNOÚd1nzn׀cXKivWܸTloh'97G g'/dڏ)|ƅXӍ 4 ',rJ`m+|j}Tj_{ C}l)M*>"ٟc;V4T2 :LvZG E廒>&z+$c7SQP+p}w'4} S4\%=I%S| _j@{pЋI.rQ+p_ݼ!5{"` r v{BRL>J$b.G١>5^}l gc.}Cj69=Ssi* KT_@OJ1TlT!BkG(qcgws6#ԷK/\Xcއ)|ZliՎ r5(VTT!+sܸszv<pYiRг|P":eu?ʿ?L Y^IubKYvv1[s: m R:tLdNqMsr5zSM!Zw_!^ø\}jgu)MSzn[sMD<%ף.9WCԜ9HD*a{VTMQ#C韃* FYJM m^*Pj}}y;WۻU֞&Мj rt;_U,'J4$U>|:LjxZT C X-?zc@h^M;"p7N*)!A7`[ѢT*v>9}]aE^l$ T͋))) qYg3 #M9 0杦@[33s!V #P[/-LҞuU\Ajiq_!`zTbjpB\/at80n>BAyID A˗|1&&h.II]HB^BKrXșMLhg0/L|X1nam0.XSVz5* uG+[w{fo?endstream endobj 205 0 obj << /Filter /FlateDecode /Length1 1379 /Length2 5946 /Length3 0 /Length 6883 >> stream xڍVPݳI HG~R*(WMZ$j&*HSAtE҉H"ERyѯ{=gﹻ{'M-$0 ' ( "#H-8V5ĠEpD Gt3Ơ*@啠 J (*Z@`,`&7DTQQAw8B`p0<(bF8\ȿ(DxpJ`pPP /zJAH'`G`n/ -L $ Xz"0[`qA0, |pڟvC`bnB@lP)tF"Bp A=wc$ I0/G? !}`D:fOup,/xh7M @AΧ"[.7vGIp [~}?=&?6@  _! xp/p'J@#pD8ށP $;ьpcO< \ @~}^9{ wqF ih` )-Pii@7j Cy6?hw %#Ϟs\Dg097m  C!}Bĉ]#N18tA17d?Q}8h/鯃 F"qp?}h)$`Y{b~C(;6q5sr '<8n} 1 1XЯz*`c1<%=D0/zy^:ObQI)*MyV vW=ザȎ$1~UlCYaؑsb#h|U* Rر_ oz\K {AUw1cfK iKޱJtQ<"xS'G-Ʋ8;̒3po, _#S?驥+='˻ xtx$c4 WBɗ^v_B[׋ЍLt,Q~—Lni}i?WRR艂ޫg# s++\Lޞ WJ87a0~Ap!od G #XUG4n)Nշx($AxhWy{y] ZiFF}A"eY5ồ89nQM\hvJm~V~>";K i.wզvYӦUS^Q}N]!x`7GVtmC^D5W1"n4Ȋ%ֽ}iJgX>NsҚYݦ]n%ZmEa~m.ڴ2q=Yh 3-7qfԻ\!t+%E s3C&WNr<-8+/7{T_JҘ%e`:ػ=6zd*~@3rdL;J%$X`4p̿͘NڞGف>Igjܠ _?>~hUs׊6iU\O*H""Tnk~=:j˽ ]it|jLٌQ|}/ iĝԍWa{Otymkz~ؼyB}0<^ֲ*7Dy>(oK >xgx`dAjUyZ]*?_[z;;Uy%wؓd0*DٍC&RՑʹ7j y;@b5}QQṔѤW*Έ[i 'OV6_P(q_P?#4V!.S5*Gg#kK !/iepJ򊵓9O /12->wv6ky51,Nx}P1[Fh:K) q|L{aWocrs b,/'1yj4?1~r .S|&[ ۦ:݋xLhi|4)~^n" ܛ؅i{*e/PTa% DAE;hcG4Sٹ2A_=U@:QMydl4HJ/>$riWH퉆tܳS% `';&[˰'W֤C&_-Uhz ri?Nv:+›OLx 6eq썋,b_k.U?/[sYٕ%BڻqkRc(Y%6 z>SyKҜ6IWtBjzn= fQeD/>9gαT#y,hWijԵoz^SےMj6vȹ]WLbQQ4Vp'Ø~E:3jJ()_p wp`?`3N`#,Un}YL^ےxҦ\@5%~q]H:&La뫱P\85݁Ԕreu'MC\_C@car͇fkֶٛiRE:oñ5!v8'GvG55Qkڻ5Cyۈҷ.W3| Wʗ<;7iANIjJ 3Ϝt$ڴ+I^h|֋$"OKPk>/zHrY`ս" m}_ja#}G{YjL󒛵ZEsM1b_K3C؏ seTRdHT8٪ޖq"c OQDQ\|ݯ2 G u/TD5S@yRiV]"wPTo;N.rK̠Okʭ+Am=5?4@em;OḟrNZh#7mRw6 {&6Uo*ܼk"}F'Fut?Kj̺}olZ9ΧAL^Ä$𲄝Z>i3Ql*lmÒ]?J8;eTGyn!X} aYܖQh?_?TmKAy r#|6$F' ɜ7f #ɸ]}i hfK/OZX3LR݉3SpI,׎Df_@ʃ$⋌}/_C|P7EK]qV)d[.{w[FDš8B[gFԡH-,\Yfj6󭀭GNkcn=+-Zh7U]ܴzyGWdxE"+;g=Iۻ%+fv%",5˱)stdgP="em`1WZS:(7-8jLNs8TW`)IIKĤ*YsƕyrUë Pؑgb zKBT^TE|FU?]#ˢ8E4& *nu:(To[%\X'wQ:S*2pf ԣ}LM@:MἵƲ޹\[(8b1\a^h` `,Պؕ|&%!\x+_Bn9*d,Wn-0(3# <~'1oqg&}EeTO"NegHţivK,՟MSZvw92Vl3yTL铋p$F]RdTZq|{pFG¨$뛱KD., ݔcLCJM|_ױS|>SZ:S`y|S31X`%?%0/ÒǜW,5#]7_C.X3JX9d>2ܓR.űAjU6zzK2& Ltd\V1A+3CVzIF/6gfLwي-@T6+ѻ ux̧PZvv6vzDZ  =jGGbI.YگԎA޼NQE/5= ӊ$7;)Տ)G.iڃN Pi;)1s}j`[=I2,lbih짌)5_:矀-c062s5ʄ]DBd:_\ur^Qb6ĉk[.Yֽ5ȑ>N=oߦsZW<'1+U۞S78P=MnP]|+ZO"γ]("?w.]`Po"m+j۰`ԩrՐV L2X§C紐>͟ Zb>[}GM.Xql `B?-Dz ]u+XN}^(xL,]w |vwSUS}˵,ME(|a䰢r]8?_>w7Z,CЗ>1rkzclH$(?(jj=Fyvoney _iN^q}_:;#4tXG6%ie#F^)ESOF*GSV z²Sz丠uN`0(HOװc`x /^:# QsO٫hܳjȋP^Qѝ$0ʒgu&ۤk`%L͡I U ByMUv\{Ew<]a:K{7X{蜢p$4F(җ΃Y-/K2Skx{- ~D|+K'F<]p}oG86tTrD K^Ky{oz4p#Ϋ{LN֤Y@, i-T4绖&_c< ";1VLb8}ܩ:휌린P[͚%UۦomEv[JiC&1S}}$* jWCYaDqbiU|Vo](U e|Rs0pb};2rZ[7IrA#~n{Y2^S^zﰷ1}D^8Ėw>$z H1VLӳ.4M[B$L:?|HCH7mO='THW.9?K&<]xư} );V_p LKoLLIݭcX?ݧvj1 3; SkQz6,fKV3osݵk)B|@ɁH:P,]Nj.2IA>keotՎSs7ɝ`ȓsq TGp}) W/69P*+O^?(yꅠW *NDqltFNc`FLH~Z/`h~}^#_yxi¿xQArb/`ɧt_l*άknj¢褹"W5bL '1&a:4Еۮ) F.Dƚ1.~$9Z`ݶwL &8A\3Y>eaޖ'UWLqsA]XHo yniV3`W?&J _Tf +  c/#=PTc* {ˀlFh7endstream endobj 206 0 obj << /Filter /FlateDecode /Length1 2092 /Length2 14501 /Length3 0 /Length 15771 >> stream xڍP"%Hw'{w~H߫j֘昲> Ez![#=3@DN OA rK OtpC/4tz:̬ffN&&  mx. @O!bk23wz?G'377'!k gd~ bk :Oj>s'';FFWWWCkG[ϟ 's24E oh <@/.mmL*R;Ϳee@wi olv6463q٘LAV@,/CC+GwCCѻ߉ąd!_aދ,fc"bkm qr+?Q_gS_Ll@@)[̀Nv&&&Nnft36g+o=l S?xOGC O"xff `4. waz{.9t:?"$}p+4ڇ-F}#&-AY?Nyf~q{hH~^U׋%d+x4E3bƽ뀄[`xjQjsF?qI aiPnngѳވh὏X =7X~zV8iBޠPz Y,)\wO9ilO+|ppbS*"rM2޺$-|EzM꒳ȑN!`Y?pe6S;O1/3 ݭGE:u@ ,{%ʉOYq*^䖃$8["Sl({)*G >!풰Z*&onjkԇI?M}ACqKDVr=wG`dF'i8|T;//X h(a /cʖX!*61y`m3@7[5&|=d y ݏNF;cHi(XV_ h@$WNSΝ9K _ު׽!~+8J7,LBzt.s@%O3vuY៮T>Zeqj]k=(Pݣ^BgNBe⿴ sͅ} 情^U;- [YO[esZ1tfa\XbtYAZR:XegS1;HZAOvHtpt.?5f3N V\},0_IS'E(jA3 ǥTx][%SK}%^Eq$\<Ѝe?1vu@ k?7V}p&!(1",^!ѥy# B9EADRZRS\ұ<19u¨U'w}tƔ%%k6D lӺ-xԲܙZ s)($ֆ3w5c'-ڔ`X۵܎ ۻv᫹,^*}61k%Z6`kiV"#xI%+{>K 7-k+F='w2f~+AKl)cSKt؅s [ɞ!ǒ=l9t8h!|^wC΁<֕=De*4'TˆٹDtʲJx/-R-c_Z] :AR%NA&#יT.M B$X>f\HHig rsw玭p%HI'g܍S; 3A)@C\X)013lD~_FLA5 zк~]B3?&n䢓lˉdۺ"~8Cf-m&J1h{>%EQ'oEN28kPg%OG9mU8݅ >nE A0ቷ"b nE4G;!s ~NDp5 F: ӏdO[2e> f^u7&X00CG`q$dإlt[lRgFrіqvӦ  z1(QlՀsp:Z mzbm!2[n$7cyr 7p kmn"4HM91αE$Þ>&P%w0:)UhJ~{t7/'b]ԡSS?~9ϳ=Kg5sVb?Y |b:k- =|(f%ۭE*^ӭ—BU;(Ѡ/ɱ0điHn)'V;nqx9{U8>l4\)/8s]=]%>;&Ogxf5`j+ڹޛ$G,<;?+>]({,^ln͸h;9jqi H#jBUnJ>@,S1qSFvpebDa9Aq4)J,$Kh| u %MEL 4@ #j3vBPO7 <FǴؚ_o N'+)XU͕ n'n~NKጆ,=oEG$>eQޔF)- VH 8ɘ'mEbלy"<2qsa >&ʘa%&~SBƃM,$6/O .0oBcvXA.gU2a1ĭtv(בG kz0KdZjDSi/D TIuHʀ`ြS-t`m ~85YmYNU}tUJ|r ~'IM}DF0Һj>:j[% uCX U\BN1h_3H GWC1׫r͗V ŐPb*.=J9f o9\bqu #597A~y+iH6 @=5嵀:\ 4vgdۣ%t cBٔ.'sn=ǨW]HPgӥx]y6]"-QJ N 5jg#V\I4$`~QE1Ve"y)\q`{toUT`em-^Bf>FQ PI4| NnJ2H]uf! ^wwuܼ@z`RSgM?AQAY$?mDr J#7=&Tj!b'61awf-#1/ўEbҴJT6qxIsDec}hn@j,.2՚~M bv{n0Hy%o)߾ylМ72##O-:0EG!`ÖZWhYKGW'7@{92v7WZuYv$ne0(+ǖ ik2Ρ~lLغ5(;va$ VTn H8un)]d<}&qvnW9mTP(Oe53x$ h(g'>+a0i;ο{NLꪤXɈ V|,P"Y:P* nK $ €9ne87&@g2{-hL=ʛL4l`e]lLjIH#0~ ulr7iCX4{*Q%e'#7@~^;W0UfwXMuh~j8vOa$5x~k߮f>ϲG)8 z9Yp[Lfh9?&\)cCAσ.˪K4b9fԛeK.|nH m!Fۑ#TU1O5Y@j#=)ݮRGmRA=[xh.=7J$4_6v*ghqTʰk~ϩ̾q)CD/.N =DsyV[wc#Ri$Ͳb h|ۮ9iWꓲ=RZ#3-96J CఝP_|9 -$J]Ly1ZXgzm0 GZW"4Ы"鼓!2ue:7ѻM_k z7YcӁ#nE *NÒ4V!$.qjVjUez߶n3':: P o m8ŸOV TZ$&HI+8B]Jݿq>7b`_k[)H<ao{K@[_#;'BO;: [kvˌ+UmTXfu字=HO=+Wbn zJP%\ ~F6MB'w0Ő Ebm, tpŃ|3Y:Q% isRyiaVJn¦MWt)lrxęDzM9+!*#N\0 7hưX56SmϺTʎ/Np#Wp_:٨b$ɽb|OI0UU 5(w?)z]fh?lH~:uYgPJN!F8WDv=겲'`l-x+wu, '溕ēn&F3ѵ\dY AYaTӕԀa> fM&YI2=%퓁jYfDc86ªS‹ƯJ_WL]YGڿ͍u^RY(8J Ff; {2 b{e*&q$uįW=|b 8|N7zta H@,r"]xFnK}mҙj'ސUU Rg=~Þ4f`*B^9ƭ&ڈ;xar~$[UsSHipUCUbyC4vwgZ3hȯoASҤ!e(-z&;$F&xϑCNjX\3ƪ9 ,,AQ߯"5x׭Qc*i,TVwZPm$+~egN'kqU@mdHi/OtkD`$_1#]'ٔNBeDsp?q0VZ)$h4*j"̚f/܃d̢CV.Q5;5 tQU/w]KѳD;/㲾$ 3R*t…kS׎=4ٿ bcGzp"x;&VyR^ԑ\pb.,u:I3[x-ZcA~+2)%7B.'r.CDw5M #S|S^G'6c#zM~UE>`ڢ,JnQ%QZs~zrO3R.0P'WaӘiW[BFN݈:65̳q{Q'ȏ͖2FlK.,fKKI4 CaKiwMwy5%q#L4O(dy_~ٷz} ](}']ٟ VBȵRn)+ᶔOln]S.S_Rv@=Md/,cmK\"/&[#OLjGa(ETr̼-ɸKG(d>_B(O "R_vM-Ǽ&$"2HK/smb1W~o@MH XSHͲPY/"q~cI<_@b0A%L컧蕈E˗<Ed \|)\pTg/?/4-UKmPo&n8ir.wm,ǩAPYTmWᐗ/ 3` I,$:e/J.4."a#63^\yY+׬~)H|b5Y\?̉(ݡAsXH|GC`n&nxy%Y4OvO[ NW>+Bs& O~ }[Cȧ:@e\MX!q#ƸD.=NK\.ܽ!Q*rM0`%N(aj8>ve e41_}wIʯb!&34)l!>R# yKڇ9ڔ;79­  eLk"~vɄ80h8puaL̑ SuI[!Ї Y;6⸑DEcF̑ 9j0+nq"@YtIR>_T.8CQ_<4X/CQZdG'iV:H˃qȩH-C:2/iԢ3nm".yS~nYCBo/SYA"S-%bY&D:P-3< q9S 1`J :0i7V}oj/$CeC!f}8f%LUxSSD<>V :9( ,ei}ѽoXO^cxE%JUky9uIf=tT埔0:a(ZgM7ǵ[ɶf}Q|N΃1Gw[}S*!Q/IqrNǍl N] ]?z.Q2(@lѸBO*nD P;OqK\O_g{ktZ1$TVNn5d(2:X>O6Aih$d{up!L/t[stPu<&%lAKː{Ojא%עFA2rVQpM#>7sw+KayUeϑK [XX"7r-5ˎ  C> ُ}ۈHf3xdejEuq ïkz&f0 KRnq! l$2m}^eV0ӍB,X4 B ",ة.Tno3}T#Pk B)TGvP"FM^vӓ{ MO~p=aG  * >|~!h=$'[v>Y" tO$7R\l&^^8B~+ܲ% BƍhXuW@6:=b9 NM8!;Ɔɍ/{, '˭l?uɠ5fTrDP.wګ1NISH0Ju: 3򲱵 &s^AMpk*,;U *A8gi_nr@S)whu #k7rusx1|1s]LG]&`!?z>P1=Hh n[) ?; Py%d~:RߊA 6_!%%sOo=\QvG`kw'(ku<@4F$qٓWU 8ʚS,[W#M~62f FO|sоmzE2C֊D>x"D!|!~W)i 1(~VĹ7Kq h[ܶ{1+e0)ʦ6H= "#ɩw }r-m pXxǀ@y*/1α0,b8xĚ&UސK&$墏K0r^K?o:9G$!~,B,`wY#=সd|^OOyaM4 ;Zf ,N.8oyrĥš0 Z6**@ht_ LeCY|=k&F.w> FKh7wITp~MD0\$sИS#;HY-J*m'Bs(eQ#tQXF#[TH@FA!IϣPK:Wz)jGvoD*w|.Nv#6O#Z 3ct6_#inC~`9l5)r]$kB[X#ۺ1|sYS 2:F_OUQ(Aז|W&P#2vZP Jk8 ?3Q/ 7>F˻W0E7#/ԙ&ZnE'.wj$dxeY#--[LF/p ~Gw(nE6zwA\ڶkhïDᨺ"1y\)RZViuQB%Iƿs+t:냳JиnY_trhx$.rp-Cɧ7Et%0_t+hGs*IIQmsce0O܍}#EAybBrsׇ4삺?4,t3>&I[Fz=81elQIdwQc_NsX\DYMV\|'5V*ݨornDu*=qVzj qg#PZvr*Jm>7_#-UWbr鴗e-tvl5KT;^޸̹+E!=`REymguU;RhSd&ەB,5 1 NX"կ QVhU)VRmª%j@S9v {֍ hA2 SG*}0bbYG'&ܾ&xrnnT U4AUwjm\4pvk1T<&_1qԇ? l%@&kPWŹXD-}C(1MJaX qOx_ , qS!e)T|.(|<qZ-ԑU=]Q޷jovH/CБ}mt)q(0o7`w WͨI`w8%+ 3H5J36w,"/70j̒ P]É#{/l lDJl#ڨbߏP_SJF~O;'u5CMi\ןϪlӱ02eq ? \+IHDk#G poXp~ b@#qx\fȐ݉ ə.ךmۥh^XҞf.?<'vFa0GEcEdW9Us^kq—l^g|PPyvzAt!fxkGJ?r~l֚BJr>uAYF$H-e2?Ɠ';yܼ=+fKщ$3bHsi3 c"iRاwCI<D[he%3&V0>czc\.mO]q?nV(k\ybKh/*zBh&_\PX$Q *wvTLJ.z)*%lKLheY <*E6R6ՓhDK@@}AuOaUc$S\xb3$7.'aHtDze#q3'r&(jhs0%Oy k6tf6p>ڂ"zf冞X8Z#6}6CȾ#)f2 V̺*z峛$jPQ+ơ^,;o-YW{;u&w%"NC~ MΡ JJI4xd"f=&Kq$$԰]>~f xHWMyP;>|DA Խ4VOфh{Bӗ@GUE.5]lS\CPk_#%Gv#C5pa&)mUγO$6qZ8h@[i#^lr侖|ߎ-$嶺sL)~QLwݶ롴-HؓڶeXJS4fL3{(z=Ha0嗙0_xӞ /Mm[QjG|"R~'2\W7fvoH͠{42MٴmxR ,##EFIE*5Ҏ$ ::-4DH+3;]FΊ%چ5-;LF0⾫ނ܅ = 4DH+a/>$ntExe4[Ey^;>i;0%2\gY j5`^kB(c :ꭤ UӚyPeB^+WHD-Iu/?j*XבJdx"cx1є͔U_k1L1ZRgh4!׀lpvٹh9pm]bZykz6œGPthǢd/rBjc}@mt]62kCulW٤t^ǟd^f$:pa|V7XBۤԷYBJwC0B![_^U*S8(Xc{Y0-o (cy3?5 l%5^x* `qSgMB\#ARRrf\.\DG,XDKh EuK<Ƽ+ UD=nHXGJn5䉆G"@IiEZ‚w M6k}p3 }'RN}0o#`M S|}X&ohm^>XDAѮ^m4ɸ]ABA-&Jk&29ϰ<_FBN,`A s֗Zm_Jc:xfh0?!l Wԭl*bͭLHq6[(Õ1t8 ]Em''h݃\q#l+ *"}ɉ{M \T9*oم Q&:endstream endobj 207 0 obj << /Filter /FlateDecode /Length1 2368 /Length2 14575 /Length3 0 /Length 15979 >> stream xڍuT.Lww3 ݝ%C7Cwt%]"% ]Rwl=kbu/*̢掦@)G3; @\Q]AC ƁDMa  Qk]\w4 XT f` 8+"0q6(HN^.֖V ЙyV]L& +=أ@to@ 'VV{WGKaz&5 t P2 5@̀`%7s .Pv:#?k?v[`am(K)+%b:Osd;*pIA@s?2cS;8*!e^ڙZawd@(muc@=? f޿w fn.ࢁ>_!-; ԇ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[z`t}>$< /GTyL괰gR0gFDH Ua".)o%%5  w;=Lڰ+"\k*(PNXӒ=aot/cnw\KcjA^s縏PgAEsj=~fa 9R"uVB=!9=6x\Z4>7h苖"DOK:JܽY?_Ml"A)al?>Ѽ:s>m1Uuq7*}^h-?N^?"r>ܝ=<&J_%XuMBXE1Tҙ ڣ 5:r~ B%ǻz#޼qz%~䢔\節̪;\>nB8S&s|Dj!QZ!3E9!gP2K&3ڈQqCpx)v$!4 QjzAIpD1šش_9Iӷޝv 7dHbAZBi*N1G S[{c/=-* *,BF"ͤ-(nʕQt+6h6m+q|+Ip&>3 ͫ:*`+IOx,efl_|NkZwx9-wJgS(#"cuڙ$HP_3v>qz}^ 1^\U^):A*\WG_?=kPWoTrUT߯5^j`nÑ(A[ Κso!{cB9$窐Q] c&O>g7ɝƹ<qU$:PnŌs=XgVڟw 켙#St!}3c;-sP{^֥՟Fܢ⡥Ul-wxU{ ;捬*\(2{ ;ee]zz#Z;K<EJ 5]{5T)(:fs[l`v wQ4CsmF1-V'^~1Yse~ P 0Ha9/@UٿȒb;qϓWOA8(Ȑ`|`u0F 6dc+xF@(FD)A|B[CRAK:clPM#4󁊯P`Er:K LrrZaEbO`DsNjDiȞ:3Qí51R' ;vBP 'ǏKYwHjXNj˪XxU뿄yɧ2=fNlmmyRVo/\q @!.8&_̫~c\L!/2ӑMGn̙ ^Z2B-yk%A7fAev V/P^jRkC8sI\Pq&-=]RQ(l~ʥm/#zbCD~ŕf@3|q8|+zpp`Z}@#B,˨YKT4L^k/jI#+@n|DOkoEK]B8}%-u`pv Ӫ3d7FQf*ڹPY]5qgcn G17t;:g,ƫl f{x*d,G%0 }6-`V ] ?1c0蚇o b^Vܩ)SR+he+Bj;1Pc8[35p 奣a궞і;'`sR[ WR3%\W RY6b*)*t]}&IM2?or~1ֲTJ[B=U!{nSOf5+z踓N} -$1sNU _kuRRɜs[,dҔl}; "c _poyR?9űP&FQ`c/_2Awҁe|}"f_jY]g |b,?ZL[ t,!TOv2ߏ*e3y*=T|ĊҞ6`7OR$:#Y{+J H;bC( $ִlyrtB, ,J;~,U-zQrIlwgd퇱:賺 W -Y2 y-14{/wB˯)Q1`%!M'E | )Yýgr.ak魰d.|'9gUȮbW@6E+6uߑ819}>>M|rR%+t9 rcŗALVnò-dD#NGcw̝Ru8w>eNmasipqAl[&-',qqK*͟r6&2V?@q}F Ⓘ:V5zp4UHy*S;R.Б~?ZVFrU٧PQ2>pVߘ܌u71Oy&"R#b3xrC`͂ه iKT0. :@*X xVcΜ%;7DmiU#}4zwjTk. Ck14п@}X{Ӏ1Mu-cb˒n豤n)0/:H;ua/Ϙ.Y_Ld(ړiZ0eJ2Mݓw"7h\G !CV⵪ַ(w_;JՂcߋB6T]њUO m}5/)[urBu~ ޹[с-1LŠOkx7 io GחKB_Lv`'ǹZ҆o$D8 9ʘ63i;V-\^xt|q;?⻏?=e~d#L :ͯ̋6 dԧk&B cIT*Ȅ8|Mdo)e1Z'T%$KK.Կ9ѧ)z5C#ϬHxIe`MtMkR&c1cyjnwďsi iθJ4bJq|QF kQ!٨ر>Kϝ= $$LI]T}UP*6ڍ[}1 TDuoS!(0t+>%v37 ૹz.ٌSqKu}!Z 9Թה_Yi>B=ӌrTбv3l FkO^qC1)onS”Ȍ*]୑O|Tࣦtqhe#$,t x $ZMpo(kaە՘;ebp<:s: J`etmȔ~Ǻ£[ҷe_B[PE(K+Kr36##'e:Qh vr `l03:`hj|pN4mXmI, !xQxD =+ dIL |BEjǀ;VvI9eN:uFKQXֵcy>XN:LJǛћ4h_KM ymd %/MJ|akӁO:N l׽Y#bG1I=8YoF#t{•T^vp(L>qKƠc?f,*{9&~A \Bik^do0HvL4u@DVc޳>KܼV.*,7"e֮HOѽd2$%vD_PMkHt8($mAVGR򼷫6F P0)[E^ˇP6Kzwۅ=J 8 4SR(JxfwX>n%Л x޾oecXceyƀL9=O!b#I5 }[ \GcINwgMo_(kdk}6 Y̛kcܝQ#6Z:%(w]_DS ˼l:^heAa!WQho?%z*+|Y)vZ~QO~kp}ۥw{eH 씣F}k.~FMf'-ah38H.Lgn?( ȰJlg$\@g[]5=Qx˒7@+q =5'|ikD9Rdow9=): d,5E198clpZ<<)ߍr*b qG^XP 3%Ц=} Sl||pTfePY+>q;f87qQq7? O3C>_P #/Y]r4'}@$:G'vtXTJ*3%_ .y+3Tpr T8y!j^a_B߯>X.@ g 1cyB0";[~&zo^[E4Ł–z,W8U/\cXԸfG=Avw7c\: iƂ~Nd:o4w*pPFJes>&::iqK5Mi`R] H\Gh'=tvd~8nћr&ڝ(ubGFiX&\,%_smbԎ٩. &O2Gk{8錷\UqYX3q['?,L t TTvq}D{@:JS,P%Ѧ2+qȃ}>5ھ3"+k7̬@gx7UX c^]Ǭ-FcOuXBXE_QĎgՃ86r֗w^ݭ6 -'|Bǁ \"NUd>"JU SgX!5HG; ^DlGѯI94 \cJOE\ggE+qdPP ۬< 3C3o!@=UQf}YJ9WO>El<# m*IKc0)n([2(dl&ȎKZXE81l9L9u|yX J34lp)`3dQr}|t, CҔݥl T eLՊ~=JfjafgV`"AʓCuL0}xq0oyQnŠ|T+H9]J([o'"9Mih|UB͌#Pdi)0k tZ+T1zX7${ŵǗa%MT(^ w52Uj!O:p@0 R_3ofYX) ެ~g%ԻQi m.*(\N?C#Z@=TBNMF=.CGRf2ƪaVJbldf*gљ^bl|C&6&(h5 ؊52/Ay- 7oB= {=4ϸ5p67N HeB;(o C쿆TXTKs&OCr' ?͂#ɤ#}xu 1ؖ(WUk3`N ciSȎ~-0Ã0-6Z{eD`Am%f1YxSk ϱ/Oc@I1]fnդl_zT=[ćia-hEkaidTx,2NjV]zDKPRD/bF :\5#/]Ga5_t9jCj铸V4Vd#:^TL,iF[tq5!l"jm_M< l%=y.>!#+Zh͈MlJ;z~VOP=+8n6c*Fz/}^23vRy.E qDO Cǭ/PBU1ɗ(SӶD($!fgT>*k4\X/h.V4kcuގ e23Ɓ=pm]13:ra!vǏ9%y9*_O:8P"E2Ǻ*o4DFBlrjlÝNNK5=Gh[L5&$q~Y;KskH7T,TX\Bnd`Aܘvx\hwgv σ?H0F[𔵆%]IX\>СU:-w=m󵳣=ۃ8[O\"ds^dMAN:DQz:%dXo|fQoY& ~r 9T}Yi7lmO~f*A5l+렻kGL4dZBrbH\pc#8!2E<*q1gr_ AܡXDQ-s=Xg5~T,2䗕@v~5h4cX E.R8 wRg7U?}s*:xiX!kG:I EzG<)y}Ό%ufxݤN3ymldnPE|e!rD3{ljoh޳B|_oʒH9Fis#+29P|KՍZ9ʦ@!$È@c.+PHtetU~!YzfCMS/#M4dt,n⚉sڜ%5=ٙPY q1-͞Q<t./}\9amvte>ǬRݎʪe2Q9FTnCQջ2I_KUȮCch^iYg*GMg5aJ.b7RGYl1Amͳ2v82CNJWR[W6hE|.C$ҮGa_d=OtH ^`K[bYSrܨW_XL 2ѧ-ryVφa0zT HU$x*x)vn\ۛqREaH-lI+5ͯO6lgj@"S<7_uX- pD~ :W&\R8^ۨ閞6!ࣩlP15vnz ]GbIox57?[$)^_R||AS'L1<2=#s8E#MSؕ|L`ZP@aCQ)wƄJ?~*RޘǫP!;SҠ=o6:~ 6zyMc5[\P~'f礀}%*sy;|>om:^ 5Y)Np֟$#~tm\Wj2hi{ ǚ sP1u!E@>A죱pNhcO1bF. W.Y-xxv`->\pCݬ8A~X?Ķ9P, DLY%TW'u׽cu]*:\dVx!Ej"w V7 )׽+\͉ځ.t9Z}ɑr\2i0~._~H ,Dq/v%7 DZqb z~W#Ds3r'9:YLbѥ $BB\>TAm׽p׾p- YC.>~7G>@gXEu L gmέ2.7#[-(' 5s3Da$)D+4fB}b8aBSO2,"{[G7zd5iサe6endstream endobj 208 0 obj << /Filter /FlateDecode /Length1 1404 /Length2 6009 /Length3 0 /Length 6967 >> stream xڍxTS6Ҥ5t]zB@HRIAz" H EiRD/z4 (-DDD$IIq yum5?2j!_$07?36?+!1z<}8wO{<?  ]$fB 55кP{`̌(!0:-R@ `h_ZpjD~=w0Q 0q<[PvA1ϺjK`/F8/UoB$`8H_| yOzpJOҙqJ]؏-8VÖ)=2=MLǯϔ;b[g :w?CHV&.[H MR(,.eSDve;EIbMNz*!7il@,1n|&oIvPu:<Ҳx ]K?ueg:؋ͱl>MПe'Z?MT2%64ѦV`7'߈Edool5| Pq?[ %2 R%*EIh Ea9;6miv8P4\h2jg;9) Ue k_%dwMkLxQWʎ#Z(,fY\ۊިi@jL1Ppwwx2#IO/nee&Lc|J]τTI{?HYzҚ@H8ʹ5PZC8 wݻxW`-GUt  + ׮gӺ|MF?lYodz*ܪD)a$?`W@Gr8NZױn5~:Y\fMmlyJ0u!cɫ-sBOCMzweU]٫5eM]2RI/5Tu&b V%two*i`W6dy/dS:h i@|' |665jpE1>"(*aܪx165}j3+5<-a+R ;GS2%~GyؖmiN4lp _%2zHu-i=5*JKOۤ.˨:40N[WϱPQ` /f۪O)12Ug[ޡx[[%ս[_b 3_#bcŎmӯ?Wf0FS^Guabqk_Z$d݁9S]#KMhvĂJ㶗&D qg}|&B%ėu<f3_Vb4ʫᒡڎL~{r5+oDXBܫW90#rl @turߙ\ ~>'- SoR)Gωm") kK[A!{%5#~moCq|"6TB1Qyc=:fO^3|cbpy:JKa}sIV驃vAkU՛AUEL]3՛_$+ 9§>o(f,Ck NߊJUzKmh{:_ULi1$F1t_-g ]2|:,أq4\dY~vP$!ĢRSo6NvY3½7J, 3&YK:c+wwmTaWV2;yZD{ؾP/F^`&n8i $r*@gl6L~A/*[Kk|>"~'w`:Wr.U*C9_gk2Ƀ˙ZG@Ehնl!vfo(3#C7AƬHdb]ZzO 5CneVjEm.rD<뵶dbg%N 󔳶6r>+WQv>x>~8Bvs&ĉ}go f $N;3?(.JzqGS8 3 L%;Bc7ޤ({7ޥ> N yFw&Hg7^_Tl?HKb[FlҠ_ത?٧T4޺$]{IN))*8F5EE*iYG鞓5}ihb J*糉gL⾄(b_r 2_q:ɸWGsg?BZ|/gԝ,iw6.2Îůܥz93IG_X7R",),?i a@go#Ͼ ŷkhԵWs>\!IP^k=.&dJux⯖L3\;da5Bluә{a}{RxQKޮkx4r],4&ܰI᧬h\rakMOMRtOJQHFRY'{g;/h &fq7n>ګ&G;L3G n #'{ikE羷xk8+: YsA\M*j+VE'}m8ç?*8(Axɭ*Iwfg8t5{KeUf^pdv*P`$>KSYg5[pGb1nV6 i /,b>cd:0HGQsiyy_:g[KeDio{Y㧓Y!+ixKJy+ʏ[A}NP(;Gnޓ&bǰkd2ĭT|fd< h=R?7q`O|jϿJ?z^[h] y6>>ëH'EokR"߶YmȔļ sjEy]|4iY-us*wm3Zը8\7ʦ[ Gբ6endstream endobj 209 0 obj << /Filter /FlateDecode /Length1 2444 /Length2 17146 /Length3 0 /Length 18570 >> 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](lƀHPtBdj6&@;7g;S *-PX_t7p+F&& [{#;wK;s (!D03obdicdfwF aes4[;928Ző0om3O 4y;jdfigj Sg{Fu;KgؿmDd@';+ X0@/oO{= p;=_ 04q-Dlaz?f_?6a ;?1 )W)"rxҳYXY쬜nF/p[ddO ˿ӿ@o |3LL&o?.&(+p[_?z#[K[Mfȃj@SKgv2za;s6Q hddbޢX@7zf&{[9;V63ۙLZ=vl6_,O5=F;ӛ 7 FH98ۤAF"N& `XQz eP2(qeP2(A,F?-`TAo5ߐ~o~FNoAoF&Vkxb_dv%g4|K ᭋme[mf. Û?[QJ|ko2jOuol?o7ToV7 ?ս9G-ۋg?o loqS-[oAN@StM~2 _;F!jSۍd߈9.omrY޼»Oqo<KC߅?t .̓Lxj徭 \g(4=(p UᄡOB$Ϟ'-p!qm^O1*S{m'u?Մ>[C@vPd;8s(bܹI(] Sޯ}T:M_4Kc1KDOO~:{}35J"C}Z੽~c\ű O}tS0Qg0b!bcH'O9it&(w[f/B=M .dbsa`m(T% Nsk ZZg턎ǰ66jȚs7<,}.|^S}7Վ2_(p )hC15lUm:Cx+ /l?sFd=\] m' ٍћHLb~jcCqf}Y1j896(y4ќᄿP$ fV;#ȷ)I0L3L]qyO?0?'G$6X8evù]DT\ {kPt l*Asْ:c|3J]Qץ:qKz}Gg݇"jCj5(tbf (Zxɸ ۂソltN][1f-"^ ~*Wdc2Jc;w9EvML`iqN\΋OlBDEh_`FP B JF}QBK}ꬿ$  C!m4(<-}ݗ1g7ʼnk6j<ȩ5FIP|Ix'馵\!\?f޼Z }D˞B@8t(fs6fNmjN#)f#M )WnZT&vVY;`M0]"FYBúݛky"甬_>RtD/'Ksh[|(1<0oH Q)b 6, 2@ևtM%:C0UVI!ݬMA9}lH*k_ lwZY6FŮK cESk`w 0ȩ]IFզ!*ĺx4H|-s\ _K`"z 7-a{Ԣ줾mvs?t^~6D_OYXPۇn|)bnٿ)9U^xN 3S1YN7.Olnġ{QKOa}t3LmةGnqՇ\?n$/987 C}mx4k Cבui7Ҁ' q)SQ~P)a 2Xz2sK<ӢU4g/iZ9KW#^8Ÿ.UJ@ #C/2p]e/9y \yNIx d/^/F4ca -b^Bi~U *` #`'DVtja6 r6•AP5Aa5+N3Gj/~^E*IVp~]Fe.iec+cxcUnB!EIOdQ-qX0@l+uN+W<#BszHngc*A2t{-"ǻb/ա&T19?Z BKz5C :%E= /j@?2걪{Z係 {*pxޅaLN]oRBR<8S*bYY:!C$TECgolr#7eO1=p6):gpI*NmUyb;uO$ #yu5S$~x\ GA(}p2uNT0ilK-z `]iY‰fM!v=:y&4KSpi ٝ7e.*B 1&'gI1ZU{z'B~psR׫Xnjۭ֟ לw}syS$L Wu(JopM0zFxӛpݐr:FI9e6/fnU3Jv <ӽ$6GvO)hI%VsdtzNMr;;HtF=K܁@VpGli8+h؍\tPg2lx4-c~^|V/-- EUBd#jWL"c?xT\C6Z+25x*9~EBkBQ隆vfTvŗ9ve cEswʼng,䟕_ 9qȈFeC21{UYSL ue! I~-I:*o-y\3,Hmn*1sK=)p7!U$(5vÜs lS6_)Q~&Hjk,O3(3G@}V%ݜ[np\IÐZSܬ%!AņܫQ b ڑzPKq8HteX<0 ,1Mn,LUevEC50.'*;ke5481m\Urg}QgqV].~]izx_!eQHGA}L0hB&kUB4X{BE9X )%D\ޚ]Z%,Ϊ2m 탳SG`id,. -=y5H S`ʼxb*.WTP 8Zqİa@ҳ߭8B7l -ouH5˳2cMK>|ma4观Ec!V;T5e]U U)ka Blh4"ڰ /` 7lQ 'ÃH[X ܾsF/nJgMZ\ brhcFn*2>4 Q!| .' G dN)G9Oz=ӳyk;LЙ}IEb4hE3UN挢pZZaTkn9c/w4KVFy2 %ohۅ+|oαCmþaAYᶖUr֊,Bå]~%%n.X 2 TcNY>,ʸ.zJitԔד(KO#Iه<:ހTy)iJwKO3:NZ=\wy, L 4TN=3bP2eج[ΩiN!ԁrʳ;rqu7~M W1c1d ]fP4gmDjNªk+|۴dhRBNL7>>0n̯x'vk)Ci8 zM(?O"4?xNvY"D; =[T߉-/z]&I\Cr U7enC)vMa^`#* FUѓ" ]I'ܞ95~^ n,>ǞuOR?:CG{Cˢ`3HHmWyZf4dY EBb_幌 5<,TJa:%B w-UKtXU3pdGd_Sє!?ܣWz ?#@b m_^nRmx_x7z_Mԅ<R&aa_5^ r˷yߞPNR:YI߱$t]ՓH,{1#4Tcl :l*&;68A?wt21Lådo!#"Vidk'2|ίO1hICS"1:Y񢴮"xQ 237,K5 hash77~xUq6Li @̰+5&*|aZnPǭEOU'ИaQkօGqCĴRgcR)l !Q$>Fwe /Rq}.KC;\(.2~T 4ǥ2My P({n:si?3\z˯  oeMF H&5xx@ | ۟bj S]ɮ9 ^;ӻn[IN݃-W1UY>᜛d;4ƍާɉRS9z\3>y=ʰK`AR j/1Np{8J)|᝼x@@yAl*T^PR"_to&Rٹ7a7HژR5"9*j9DR%^gRѢTЀb*@f$;'c/}Oȕ}֟cE+-"gN/MPVHӐ:KߘFɧR Z6tpXp{)zDW.=#cajo=߻2P\K'E_#py q;]:2yIG]iT2> {UHSFk0=@CNv@ox{  %}OC4Տ-EK{-|v)@HƱfΣnڰiϻگ K0x1F[ZZ.p+$gA<4nNY蕽*^Dz\]Ac\IO&>[QaLxǩ I|1FvXWQR<0Cbzu`="N&2(ʜھmvLb [fOyZr ih]}-\0o{nA TMD)KX% YvD wք9~^H077g"\ٴ[s8~ύ9h)EZt<**]:مXnB(x2ޢ, ~dw-\)oa1b#KqW}ŕMGƻZu>VY.}hib]Uf<6XSzy\nR ;5wIAe֫ƒx;!b]^!}5FG{W(Qu!-TH@s^_ǤQMF" `@S*֖80˹+>vO'=e).:|e߽3a~ ;B1fU9<Ͷ~MH u}9pXk}FFٜ,,"@LWR_濬Ubym $)*)@3=PQ9)j^Ck4@WdPa:4~[ob3s,270Y"ĭ6n^Kj7m Y!ꋊ̉,S9Ct?*,M"n>K^ tĵ^Gr2upY,L4Q.}Vc2+Y6'髸)Rc?A~-j |ubwޞsmpP;~fJ77.uÐpܟ݃W]Zku̶QdB7w`kAʹyg^Wh1KND³zI$, Y#h,d!UD=I}Z6h+2W>5#dLdǨاг@gՆzedkC+^ >ZQR`MoJe }O;e(8Eڭv3 x/!bKBDϦ'aB2M̩ W{>|jw\/o=)7#K/((71d8? zE~KLS)(HuwW GK/_˴2R*p-w\^y}K([EgiE޴ 4J^ԭ+ԧB{pJǫESڍ!ö8i`E5{Fԇ4~{F/ ىtQ VLϰlX_bORʺ</o=7]:hh^_OQ{[jZyv(䚺8 ZU" LL\^-oyF}Hmlb 3#%BI #H)i 4@06ҐPt<9ޑ*_jÊbgE*9t3j'kƫg*a؀( MݦXtZ+iޅo=5"i6;V`0! K35;wUai;N;Kbj/=; `z?5T~c[U ._a jRS]7an#1?Q?`c1c8Ӎ!/`k0]mJfXݿK,ڰ= }^<8z#P7JS]DЧ{'L}!3Vޏf&$H$8.wSVl,ZQZ+eGrN~840/cޏ(ݛlh0=jם”~I[*pDi"kUmG9OXb`T)9iB^1H% "'ȖӛVxFMzmJثCz2!7>bW ﯐"xZ-f؁n*N)ؐv <{xw Oʋ7.<މ\"cnHZ~FMQѶ@fFle"6lU ϊBdmsg^;\J#Q(i76_hu2lGYĆ.H:%@% n,ONғ3u+ڎD([P˥ 6}2,0^RPXRҪ#jo9+h=M]1ݡ5zM/fغ1qgF10r&Ul.>jrњtț0R[Ly()LX2ȓ8c[h̡&fc<@ Wѫ)fI̢|+y)༟HQQ5FEO*ynXR [Y]~rfbu_W"ơkIi&j ?Ree@`;Hr,~(qKp4'fo;678t3x.vT '?BW3VM뀢f;!Q/sKvE((RƜf [=Bߑ~xVP'_+%nӎ\ʹ5O>^x6xKlMBͬ{%rϒp[/>ĿvNg)͂y6}Mj"NCC_/j=DYUJ<[g4ǙaF }cFt}>WĊ847l(P!h Q' ĸKuŦҀ艗Qw06U sWY&FBw uiPCAjTݠ1se`)dD\h詽BLpt)tV!LV)m%Movdd[,V6[Lows>;F\+Qyd)ZC'~OoOĢI)ҶVO7רּd/2B8[LAdzCII2kZq0E2}UeTE:V3.7`CInypMugΏA2u}ܲKe+Ɗn trT?2m೹~t(Y{xXHM̓A)xDHWRt6W> cWbP/''ƥ+C/O3~=E[ct)/q)Y]-JaXEh9CZ;j7y d( F ؍rŤIG]4$X~?jFLbTS׶] @nfۻiį٭!v'䇏ZXtd#.D+ޅs'J[ju;ktNN3f🿏3w2CO| 0SpV&f bɆu?y. QEHD7 K#^o=t,3UDp6g ñĿPvxLd wrC )0=&pEbXO8ԐqzfH չ9.}kLZGrS+ $<*` 닳͛0Edx&tEDZ|:@'~a]w׵')3PbvYYuŤM骗UZE^ozX4d::z+.*bHql"-7T'$^{3O[QZoWǨf`>y}iq/ ܢuz<'q~J{4o{">$h'S7? 37q~3s=׆ +WF9X6flĤ*pert^K+eWg`3>C(j1^M նzL_ٰ) g#ƏFjЉ&?0l])1|D.%Efw@|? azDkYg5y,ЄdI͹|-XNLNjvGHDL|Re n:o&~l+EDa<>:UUq^N訶-|7N"sjA)Ts%]=ZYA3  Aq#0ռA^ULw-:X~ω>s=h&$WО~6ą_]P^B%Q^F9|F#c!,UeBYWףVm'`clǮ4Vi>@~\V`w5F]w/k9b_EV.b=Thmnc̉KDm(CR;j}gHUu|& 6 ]=S-{1ѿ>Z´Eiޫ$V k\qy*t`o/#^mO`(-31mr ]äCϏUf9 s'mW UҾ]\_Wii\Q *R9?sY$E6k8'Nn[_B#Eo.kd@x@K *N!i ~u{қ^cvǻXF5[=hըS=?(?-zxdJPx8?e'i꣬ zK=X/P'v<<#4 LR ِu^ /˯] ʓ(/i\i-JUEUN tR6V[H*ϣ_qJT }$Ćqyhbݠ=d:H>?8z}آCsBzved\۹Zޮ}?gk?W^}Ge Vte=|VZpTvu-+CW|Q"IWkTOzJ{J|c6Ļ0[B0X^W{G\a>]U5*)|zZi2cƀ½Rr!9*#/YFef/pR6ml_0-jaqvs+% &ES"!`?˲Rp KMXc͌-ydu=ura?Di&y)C)oR8vވQp ^@]Cc@qP&VbF5?<[^r]؏ߞSjyxLܑ$woTo/(A_2f;OZ)#]y(F=\'ޘ T˅[q΀v昳2X}̩ZFXxfMD"[+m}|܌ŷJT3Rx-9`Y[4d?נʈ(dէf*H'u/Տ챚K0?O}l{l]= 0 c&lnkctب+EOwsT[ƶ|ڮOw?󉬾Gwb Z27(#- 0&'LA by\2:'UBܭj1o9$z>JoOO _=%^T9$4˱̛ƲuNpbo?$+tbK4u9;D 2*Q"߱+L'm I+0y\2(N9A}u&HɤU,d  8H^K5KxSo~T;PiKyJX7جzGp>j`~B[cCEW[X/0YR2A'i[9^_mByu"}pa~%R(rzAYj}s15ypX0P@#GZLtѵ4}a*mhb5Hm1[XH_{L27;id}!v"5K574 *VtBn0㟍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 :*ooendstream endobj 210 0 obj << /Type /ObjStm /Length 1571 /Filter /FlateDecode /N 92 /First 802 >> stream xXˎ6+L7 ) E eLT@\J2LTݍM) YLҟdO145ㆆ -I6LjIG)Lɴ!B3coUAp̕9\Br%%% J?'=_2YXܨ۱Op:&!BCmj͡)#s|z|0g@sO_<嶺 %퇇oV}vXIL襲V)~=m^5ݱ'V/IJJF$i>{vy33\\# dÂ|hr䨾:lnuNN&fbLrTG}[ix'W͢*:ǒ% YU"S%ĒvH#93fX*/<%(,e7 ڧU}5Oyq~&p,#|QDKz;z;\Y䔩t_pҖ%"MGѫգ}zu}ڎ: oX5I޹rR}aSǤgi`z7aV?_!9&GH%w3̉jeQeqWYy` lK1wǒ*U׊OnK`Tep( ǻdS*—ْNs,me㺩J:q+֦,t`s.pQ3޴pMl6pI.nv9p?f!%!1>3|q%ŝGyʌLJm~?if ?Fa/]yW%`>tl2d7 j" U.rNKKRsq;$vTLo 5F-`ĥۥBIV8.eÃ{ ҇#]h^Dendstream endobj 303 0 obj << /Filter /FlateDecode /Length 1724 >> stream xَ6}ȓ))E ih4ЇMk-|$|}D^;@ 6E=Ù!j.~zOG*rUGeX7.F_/0Jsˉ3v\tS\]ØѠ?a {w2G`T}D!702'!O &Z‰X%p V D$*M}5I7b&g2 )T0RG70>n{F1h^|iN!i4R^փEWLG] Cdq ޻qz8EY`g,яKm$Ds` o#ː 4i8u|m| VtL]."zLȟ@3U\w-րcF&D6zDsϵXPko$.#ys(|e"NC7''&c(3^TP;h һE-*( dI~\=mr[=a8 R| ϥz tՐ(]o72֡% kOb9s 2Z[Ï= \o!űzP#5 IrHYJ>ggGYA%.wQ[5@W ڍZ<C'Nm7'mSԗ- ZCbm~೭/t-1P] q]1CyHFՈ'\] vA@*nSeSoD kTe&Qm 2^'yH?f.VIJl>= X Zb&JA=2<*^y|-.L2"UywNyZDSw;I⥬ + 5ېHi1H I1R/\" T$mxNB-!1:*o}G@:? 'Vuͫ9yâ3!I\kgq$` Q Ds] Ɲ9%'r&T2Վ2[̈́+iliޜ?iehId~XĂM6 6;ɦ WܕK7ٙ7NH2\gjUg5GJU(ʡ 8^%洜J6 wሬ:P#L,&Xt׷IMT;7]HB .r@(ⶺj*=ȡ: wpЏU%**$e(&S9\(cj__r_]2hSD`!/222+ 㿂QQpM(y!*Hou3 PKsJCQ;Ԃ} y <q:$NΑ͹b=0 0)|lJ].=JhRx(`]'ѝJQBvğ@w\Us䩛yT&z)%Ux.,{BšAiu+A}A=( T}CDj__~tIDX5=Ax o۶GWlӲB9iߜ^G/<{(Qx:^~|o_~t*k=)Qk-vafendstream endobj 304 0 obj << /BBox [ 0 0 432 432 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./intro_sp-014.pdf) /PTEX.InfoDict 124 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 128 0 R >> /ExtGState << >> /Font << /F1 125 0 R /F2 126 0 R /F3 127 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 782 >> stream xWMo1H3ǵE4SChHz-ɦq䰛l|τͥasg~ ׮pݙ},Ykpz8nEg<uD9onx\'3,pO!ul7aÚwd{/dzv%TGG68۴ ( P$4q]T[l)qXrU*.GI+@XEgH Y H#Yऑ|{L@qRh ' |"R GH,|4G/L+@p1 [Rt=(6p}_6.~xHDHUٲ7E$-^Pn aTPlje H TRϢ`J|^Ci4Ph1q*+{;:uA5̮( J1UD[> C!;,#fl;H“ȼd0L8ݞ7]>Q 4MtETн4u;"Ԣ0KS#5 {c?(f`?ISqЈޅ֪yȧq+{㢜c!Wiji:HL?kX)(i,N fG`-cƠebw2Ɛ{HϨ`C^w2(CޮXc㚷XθƄ}9)4 6 -7BIXCfJVh@,?seWa jendstream endobj 305 0 obj << /Filter /FlateDecode /Length 364 >> stream xڅRKO0 WJkrDcN z&PGƶ)tbh~|lG\gF: -9 +yY9XlLp1dx>37 ׻^xZB++-+@%H@ > 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 307 0 obj << /Filter /FlateDecode /Length 871 >> stream xWKO@+,NT/ޗHTjQA*57$NHQڄ_ٝ6w3y~z!=?",D 'QE:fBjo8%;A9,ml_@u9K5-a*~@#5@z}:U: Rg|@Ƈe2js,FRtD\sz_8ZsgBT 骩Ș{{QD H>4Sg5'Lbc,:̑a>:KS,U g"Q|xI)7Ul׹XUGYA b Ul~DX6\$6|dAY`vL xJt&?(CBƣ1qzm)nӯV{ѳjOiU ?1uX @Y,"cY5U+bAi%<`Xu ',P)>Өm<9fl7LIͩU@(×V&h2Qj 63lfd]5~]Y~D!*LsK۱e]3kh;RV-^;'06m,3ٮB*ֈzڣm/1F9b1Fm[7Ojlʨ~㴦)O]E#7Q }~c}yya.i6on RɄjЗGS[R0{aHYxmC(UhؾaWD=v_}Nu4[8=Mqx[eMK&%'{w:(_]<_D~wf7ǶolBGLI qHYн˖ħor XQendstream endobj 308 0 obj << /Filter /FlateDecode /Length 1206 >> stream xXIo6WЃ܎Q % ]A6tS#K[e76*$p`z ,=~Bҡ7B"oxEPH{ә8t4 8wF4pZݸNsc"S%yI#˨J0Ѳ>hCv]A{ˢܩ̳ _B[C1w#lR^+1boھ%hOA!Rgp?3iȩV|gEaEWq a>'PB2N`!DX$4hF&wfvkl n+VٌƑzAUͽ"?, %1knz5.c))&\fgf/y䫐?ǟ<)u߉f  @l'-͎86#~`5mh`@#V:,JpD*$ `J邤_G"qu7k%Qhen鐆d'~e!F"Gmr4{Hh΃yzfzd*歧jKNm-oqI}BJy.* yMGcm UR8 Fз0o{a)xĕKP 1Ha%{e!|h5 VGb+WQ ;հiB5NɩKt[vNPp0\, }?TIǀ`+[WǾEG:(D5 [ ïzFgmK̕@?oX<l1BwT'2 R߯l[` LWלGhX#޹C8R >[Sگ'l2ڣC 0(Yn÷auF8+4 ]Q > stream xXKDWrD3#iP@%MAbN!-?(X,~hdk)8<tOR}9& SL櫉vZO)c|9y9Չrc+3i\H-|{tsNQd:aHg'? d#GRԄ'~6x*|?V0 0GޟpgY>aif+cdf* ɒzf]q]v8s-gCIM.5 E/-:aȒ+}cZs$0(Gʖ78ZI)KwԸdËQ,y ۫wIWc)m|P48j`aBPHZy$"VhԴ)ᴩIo.+E a oL4]y+Y,VxSv/y@3;ޑE?j[ȆPͬMX]a"D7͘^‰$Os;7=@l@g*9pP/`!n[YҺ-/F:E-d%-ytl̮Kvʕ3!FݧKt=yo ~#ρ?Pٙ}O3?`OE|Eg"bU Q.$+.9)Z66RN{Rcpa\JXu{=Oj\# kZHe+ lT:Ie~xJoyLU$TojwX"%cr-fMp^92㤓`iV+hp0v'/'yJ-X& ! 6t8EC+3@z-BZxi1h\#)~gUYٻߝ:?/ׅʸ45VƤ,yxq96[(SYUC#mRh%I͊zcvP3í!I8Gl'mC}}`JPC PZQ^IއVV|oI@.{Z;4Sl~Mv:_tZ`5#vPxtH•{!څN(8lcqy8i$^|aq޿ЊU -<P1ڠ PN`ӗ4y~Hhy{UqS'9eZj%'tSgCBIUO< n#|\%!<璐7 ^e.>˒{2\UףfOu` e5p{3|0<"g)+!ҐY1^Ew*zzs/=R)CIjf_pӇ8 k@^6n-9FљryQOP:5}:rq Ёy*TُHZU m%]qi(21[9r#Ŧ'w^$e:a(q$@C8)FW⯌1. Uriu> z5)cendstream endobj 310 0 obj << /Filter /FlateDecode /Length 1704 >> stream xڽXIs6WhzfBn3]L;M=%9#QN HQ=P E,=ﯟ\\zV23z5Ir̲4W&Ng٫exa6^4.zWu^a`vn}4y)C=XӼsh]ۆ4<ҨnV:"2hB %2$:Vy@Xw(gBAocVXx-Ňp쓼_XĥCY -8Y Ȩ/<$Jndsu"zǬZ tm:*gǔVM1=Xd)+^T NcHyɎ[.V׊_7} ݽ\?*} H$qĀ`ߔx妩"Ca^G:]HSV˚=hy~H1xہ)xPD Ve`D8p]&>_OQ&J,d*s%U+MI.a gS\.PtlFI[)*/i6պQX۸h29Yi^2K~$qNc-Az$JN+4L4߸LZ.1wv &r *?N |ahЛ؎TCH[ּ`+i@Zi3 "Jʥ :tWN${v6\\&錃A!D\ASttz) Y'"O]ip[rq9M;Fߴɑ&"ĸU7/O X %`iQIF iPT҄qhWk#womp%g坞˹uJ! A%T݄kxF!W,Fi!JT9r*" DOĉnkZl4$IoKZ|C.p|%lEwN5F,*ɕzh)r@J[u";aeŋР֗]vP8o=ҟp S-XCpz_C{y6U3@(e o& #LKB4뉨IBςw[@?s9ЋAح6)Kt »m+^+:?d#S[lą}&EX'I ÿ=)!j2i~Qj$?R4y HѕvQ<`F̹@|@r%s@z?<Jf%3EyQHJ]+!Ñi3ERK52"~ i' J}!.=,f"/=NT 2Ufc"NShƙ3ҍs"&0$gk1??cV¦MFO9@xx3z=j,S8UXRlpendstream endobj 311 0 obj << /Filter /FlateDecode /Length 1285 >> stream xڽXYs6~䉚<24Mq&I̓DQ2sE )$}X.=X)݌ѫHI(a0la%R00*DG!ad`6B?y CU_t='H؊έHv*IL[Y!2FdDBF%N_M%(ӈ1Yu``NwQ_<#W@Nx, +-UT(E Yy=F`:8~(& i}@Qt){^ߡ@|^*J=_Kr`!˶v%i[5ҘE3QrIǩĴk.o7jrƴkV[k],(۶WRd)5'ʚN.EŜxC"pƏd̟b}']ޓosmX3BɐDqű3|*M" q==eb i>Ӌ؍tl ^)c4QIq: JH/E&2$|3mJ6%n`;ìw[GL q~c`82-@gefr7/!&K "83* F:o9c#CYJT}XӪyh&$ ~W]S8T7m_tͰ-Ɏ _QMLT]}C bkϘ~%S*/B ց;՚MA80.>Pڂ:J`gW8!IY2UH8O.е^Kt̓w[y xEd>{X+Z?&pL1d3JU߬8ـqx %iQ;vst-em}; 4mc Lx& ܠ (Z=73ߙJbB%FٜQ6> /ExtGState << >> /Font << >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 174 >> stream xMjA {=0=0׭乏zp[aƊtZ[{yr.6endstream endobj 313 0 obj << /Filter /FlateDecode /Length 775 >> stream xVo0~_a)gǎLc !ocYnEm3u&@Tb;wߝᄏT&@trذقIy,rf*a]HKM4Bv_죫;g\k OL24U@Z_ 2)A@Xz n-øoo/Cpp ex̴LpK.tN^v ^3pZ%i;% 8lqyMp;R8KmfHR0ɤR<5SBr\2*}-bY|5NKlIGjq6e`cux *[(J{fĮ֑P nڪ"n;vٰt2*nm*6aݣ7F5ŠQlD}Ts"YOTa\Ae A"# X;^ Tc,Ub+\TOCO{"ř җh5FR1X; Rr 3b} _Xb,;Z-ttʜ|شw1hjT-n5ks},m"67#d = .̈́cRNZT7Zg.nf7_L c,~}&)1hH52Zup B׿= Dp7aS8(7giagΕa v/+endstream endobj 314 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 315 0 obj << /Filter /FlateDecode /Length 1595 >> stream xڵXY6~ϯ0X+!JJ  mܧ$-Zv;uYNvSAr~spR4L/"=y$ 3d(cĥ'6dn*8@}fЎBACLg6S }~#gJY,b_B.brӮ 9)Sq 'dKE&ārW™LGYܬ ٍ@[Ik8p?DZт "jiZ<#hIWO^'ϼ4R)zS}Uu43Mh5JR33j޿ga~(d0͟ ]ZL11I6&Q0 F)X RxB"ij䆄I'tL;ZSϏ$p[G\qvD Rlp/x߽ItbB‰ (CfCP Fn@'DTq{ɔs4\[2K<6( &L'̔ S:N*0d ӾnϯM(`+a'԰\yK$>-]3rj0>bJC*>bCgI#Jm6X.NnȔfAm6L'9lq"Ukox~q[Ļ% HW$ØF.:Xgqr4*؎ܫ(I7y.Uh.Q KY؁%`If$1>m%_0'G0(fi[?M\lPTʲl2F`txna\.NGY7 E(Nbr޵|j@{EpKzReئHHqV0TV=@TZ|R?FY#qKf)y~W~8:ܠ+TRlw%%)p˶} 7dWw[{6P՚ =]L>-j,)aQ 6H('RG?D e)Ow+Mf]ВwtYIqu|FlBo̮||S!"̨xbդv@ V^-doô ºPV(i&֜)&LGcݠޟ}q,BkS:>|`*/-㠱j2l`5B(N2#9QizibO$Dh+sL߂d(Y/t> *pOeR:}YyAuRkČKg} /V%jJK>Hpv2T?cG7osh'3홦W}^hB{ywuB)&!iP_.4д87?w4 ./=wթiLYE?;+2mDQkQWȅhL<& j>~J: S'=Tcy9k endstream endobj 316 0 obj << /BBox [ 0 0 432 432 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./intro_sp-023.pdf) /PTEX.InfoDict 158 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 159 0 R >> /ExtGState << >> /Font << >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 209 >> stream xmP @ + bӽAԃXA{݂z]fLF1ĝV#&|pl.%3Ѩ^&8$,"c[n7e'H1ϧ$mSWTdpq%5p6fI_X"Gkp~_N^֍FU,rVn_EaZwߥe>,,R~bendstream endobj 317 0 obj << /Filter /FlateDecode /Length 827 >> stream xڵVKo0 W;a0dSI)NuP$"}$&ї[G&2Ω—&V<#6IY4iF`54/<2FUynٺs3`kDžJLlę ^78oy|^a^ 69:,JUzt!RҰib˸t$hE[W^lG\yY nhqaJL>e  5(>9&<9vOzpĘeQbll zGQ4UC^ l5zj_jfT#}P* d`{εiY ZMjR0PW迖k% :]+fX\U Dժd{\CGn[p5ABŠ-i.0-Y&!%wʡ}sٰ f CYHjUI1S #tu0 -%))3.Z`8Hae% S)肇ŤdB8&-eɖ^ >1ZÓL,m{^lD,MRu*\ scm#f!fU8 ׄ9=2F8LqԡF?RKjJgO,ف{4}AZ!A1/8a;b{ hܙeOVN|=:endstream endobj 318 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 319 0 obj << /BBox [ 0 0 432 432 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./intro_sp-025.pdf) /PTEX.InfoDict 164 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 166 0 R >> /ExtGState << >> /Font << /F2 165 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 697 >> stream xWM1 W;׮i%8  +THL#"3~~]@ 0x. k >:||hbwCy|p]߼o H*n JNXr訐"ih(Id"*2nʏEgc49Ť\Nsl/to8,ˤKvA(rhvߪ>/[|<1%_FΎQii!c4\ WbiTLw6|JiP6{xq6[zs.n]Kt~*lƇ BًUT!TXP1IY&iԱ{5zW8> stream xڍV_o6У TDU`e Z[úŢ/Yv|?ZRtA<wc4A\/b$H2DiNLn,bɈe.޵&h"*sͨ )ugIfiV:{ǥ. =[:[zqg3 2)ލ3[Y`ܐ^?hd`\N| "kz22Y7F1obr&6W@Ԇ~'uJĖ [v$ J$QK-?&iL _!3jf;TKDxjAc B5. s.45ݶzpPe夘B2S`xDZJ3cCMI"opݷ, /;U;fpȵD͢sd; !-bjT]Z`Qα(LsJB%x`DxSmT1LٳFKPV5Nv^\_. J( rR012 TXaDQj,T_ rEr2!ltToZ l+8yGU!HDt`ҚkǔDYh7F9^1*I X?sbxR+d#;izr}u򐧺|ENYaˠ|`'^)/> QN݀2]GpdK<,R)oҎ]}FTee!> 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 322 0 obj << /Filter /FlateDecode /Length1 1518 /Length2 7518 /Length3 0 /Length 8517 >> stream xڍT6,ҍtP0Cww4  %! tI ]Htˇs=Z߷f7}nY[ T r pXX `pb#; q/S{i"5O8 ŀ@(/C@hԐ;< fq_Gu `@uH _!$<<\xyy\0!{apͽJ=C`.<0oWYa+tv"?n!>7 ާ?w_Hu/;$@/ǂaw-,Cl}s r^?.s;mBJp5G v}6eOD/MBZe9$uE]Dj85A}p8 A~?5n?u8?'oTD@׎OPvs7 @i 3^pO.`tOQa/}^@~?( u5^? P(uzv Bpf0wa4#,O3عf:<0Sd,ɦ~!ZXUd;injlMmJ_o:FixG#6-[W`'N5|WOB >u_ELx#{z;0ow-֢>SCooB5Ez-AD2/xV -gNЄ*`*-$hT_4~@KetxpE;v&$8qgҕuU!0.Ar$by)c$!G^ 鄛,в-E9ڙ@ccW];47"lxcxҵB(B>[q&<5kk>+, Pq0̺,$&")"#a C61Ƽg.r ) j%G&?Nժ=z;,Gc#~-zԮBg>cd%h|-WB5^퐐ZRadvU.})IW7c%sqF BR7 㥩? z)dc.?}󻟲h ZS{R4bT~/Uׇh+V^Z35"ukPvDϮ'$G9D">55OQ_i/%́d5t3Sʰ6k~^atC_KSǼc}PZ:DBU`(*_ <~iz''x=q(cgH0o =ZXh/.5ez@1JT5F/0\ֹ|KɈĺ_`%ǁݻ}DB wo5q Qtb4B^G~SYƅ;U4 xAuόOsc&J!f$:`fB*s]3^ew71@qqɰ gX9$fCLD2Oq<]c\&CoC;f:iYF| U u#\E&>ՆΉ_UєɆ=\`ODƇ3aՅgrjF F8cాB bi#ّ5iEL˻W1'衭x2L"Dȑ6Z|rrM$bqW C37 ,ΛgϽUiLR=:i)zvqgf}]xhm1e h:pK#nf"jĖI3oRi]Ƙ8>( r-b+w2˔hv4#C.F;&H^p`CF%'h&.U7@k$_ 54|XC>&n{PWmdl5)Wrp@n.NIoﰦX\֏3ݙŰ6 y@k`~k}jTpxkS4mAT垛}0y^7{<S;uc,|5'҅+h~ʯWۈhN"yN 2|#_k)5?3vWSWU^_рSwd-K?y#WdbrYj~dG; )|91J/ptuIYw򍱂P" JѱbHu^ OCtWɇZD&# Y݌̒Q/t Y>EW~Yx0/ ?@~wq [s%dD=O˜omZ Djl4WG&!sgfZઝʹTLņ:d}> yӹζ"{c@S ܱSUϾ|ZX e򫹅Δ I#ᠴG^:¼/o!eyTQt`1yxC##qxne&x *u܍Ӆ;jJ(:ZCywz&0:-֌"JG&>JrWrCWQv)&X@pvacg%=Eu* j#1߳oc,QC/GI02볓 QuSMyɰߦG3̆cԓJv `N⣇L20rkqvR?^97ǃUe/5CFl'Klg񝞂}0r^qwE^?Ul7[md}ȟ~l"5+w¿;;~V'"lZ KX[ɧ箹\oLݒpO+^~a2KrrLϋB Q8a>Ӂ)-aztx: owRJ75{J EL u zM 5zk%|_GiWk1c-x73 dzH]/\ś Il㏗_TZNWSK3s{a RM Zx;.,_ v74FfqY{C_;Ӥt*s?tIoP&L̚MhZ25[SxEgbG}I]՞Di@'7"5.s3+q$N1L? ZoDJ.Tՙcŧ"&}@JJSna8YBӎ5̳~#|M𤼟k~m$ұc!uhx GS[/bR.u J Έ\\w(IJ7oowǍkмbaQZhz<ٹ8m9rӯNґT؃z<7RVa:^=KkGsʚƖ2#=HȺhkL#}"EOrXͦ=76Ӊ oX2(yVm t3IَE5ENǙ)HQ]II qnI;*^=*&!o[eEWmL\6u+YnAT2hsRxSGu u؀/X+s|~OĈe9BsdoVچ39N5"/OeD:P5MDnM\CWwgKs2 ۤ {EN*"^J( onazOֲ9 r7+d3EE4`Ǖ`i ?ܒ),y,$3O&!řya]#!+PCaѳs}H_ۦj+dD@ hq$+Ϗʟo Ev6XiTAExWD)հ^psy5Qb`1iWo43NgMla/".xǻd33"5~Ӷd4*.lF z7w\0_>2zjǭ(D! D;#T]SxG!g|̿œʲ"wvO5S?'A S5VVK'C#f= t >"^H y+wO9Q:)O&Q M$H ʏ~ \)5̅M<X$˻4g n8(MŒЉwFW} 9j*Χ;Bwu &#}DF.`8AU{]RekJvX{ٚcՇto5}]^@7F2pH41# L;Pl Y 6lyO2]苆O ?8agq[M-MqoƸ(/wA3*,D4g0>^AᒉA,(zeI)kjj"F.E^.W ( ;VT_xgT3B Z3.=Ɵ'E}Gr^ɫ`RZDOzL|S(F[5r'ͫSߓt f E̅0 -0w,:Y1n%?M!Zx?9_VH̑C7i?JeyNTzXng##ɐ]$H~@$w(,Ԣ35>VXmDkJ> 𧃮N&^Bƪ䂬w[ ;N]A ݔ^"kʪ"(tl1nt-ph^F:Ten_5mk+/MUUpN [*'.ܕ4x%ǒnʟygE:)oN֯OQ7a'L*ˏqIhϕG/eJ1!D&^F֪*{{e]`孭>K.'V#0]t"أs62y1g2ldQeA),ڣMFq&a@H@BX[XZSBe?:rZ TIqʻ;g@\f2i- Y5Xl~fڦ_4xz)=YJl&tqQ\.iRzƈJPlIȊ?gB1yeS<:0D-RcO-,fT镪ŻaM<<`gbr M? //=ks.-O==V{M(tfD7!BMRI[\yN:O{ěvI)CsL2`kV j44/_8d]|n2Os8,P]e0W HNuߔ>p)>e)s(~W :$gS&)G55IeU0>)3%)6Ӭf}§"qoQ9벭|19ǁ[T@uPmK YA$Y07A%Z.~l <"c\/ws6i(p_d% /7 x>v)gV_]#Ȟ(:Qy`mtXkdFh̗Yر,MMeA9. j/K`r TW'/F.y;\ -1L^2^ǨkKƦ_ )JJrIL:ҚA{\?:T+@`ʬ-s,I8lck{ea0 XHmM΍Ii]R20Xac "l5_8KbQx֗.~r2d?4|A9­1|癨>&f@%g::T^Ϸ;o9#A>RD%`t#fڲdm2/č֏Q5> stream xڍT.SB[܂C.E )R\⥸mq-SxtfkVo˷wއ^CC dUy@ /'ȃ;2c2a'ȿda`&?Ʃ:Ann^ȁ!VUN ?_% [XXt#A -%d _-, rttH< p[ s[~ *dB\k;Y=@00C]3ܠV`8@[I g;௻psrMWo"d3XC*pO8;rpuz  ǀ?N%qrB~KMxP+Y'GG0|r_sY{/` ZYḁ y4ac@ PPv=-m~vm~T ~X0]A`&77 b Xm P`?caO1qߟ<?KK]yE?퓑qxs8xBBA~ YX5@P jSG_Sư(L+ ?yH,psp9B^8nǭPuz dUJpvHCmF 'JsӅGz 8={ث?\uPK'{/`טxs?.pqB)Gyk' d~D. o$4A<./Ko$,\\!#5/_|sG6ӿ܏J],cx'`O%¬h]}pU4gi-4X .z2KMV B:y<"/FD[;xɭv ҁ}~ jm_.>zȭ] y.nBDW} K[5/ʧ8u^0[d!yJx7s~1M;@φ{[ms[GF4焣2)dse+/ckI^[jZWSFqf r.dbQ+m h|G_WKfn{Ux r險<," Eؘf17R5e°5{ЂSӱ&@1rm?_`?xFgW(rn]:$:퀦)L{?B": â5-(Hu_whj}cEJ>.N}s~~bh_x<~܄AL:DVz3tEW{'ĪIaLօyUȆwk{,NFmhϢR[lgt,KbQ?iL?Vznoť[mRU%68ZCbB-NF'F,#-^>z41jv5Sc:I)2ϩLOK*gHKtT=i|H}F}3,El}LDkJh -&,ɧt㑖kVLdRp$lJAJOn6Ş fsAق>(z`tn?4~S3sн!/7a IJZӭ\}d.?SBm&gX/T]PΉjeVf܇^IA+ a499sQVe  (.)c5]Q$\AړuW:-drEm Qn=%Ѫ <6DK!:}7=X$[eY g;WTz@hu'3a6\rz`wao-Q`6Cgai"7h],cݡCÇEom"PSIzlFS8Z:o[+ Z1g$U&5VN=,('W8⮔!MJK;su8OyΔ-sgohQY^9@Mӹq|u5~02m^-^Աh)ڨ{a2T]} z^Oj$,ђXxEy3G^F4\pP+/UkQCմ?n j1֯AQD -\ 5m cz*T8~>_.$t:kמBj Tn$)4h<xmhE;Z:8aQN];=w(&;PI,jn !iFrˆp(~5j~)3;E@2X,vty!K" t TI3TlY-G¦< 4Jbm8Y=yd[ЗQѡBb?"@1n|:33S ޯ:ߙ ksw3WH+󺊠Y -F5/wmTrl(?\ >ɒ clJmv˖Zs,$ ppBgMsf㼰s0ʃ©b?K^3RHp;QSuכݚh4zcP-GdM9u`_1AmkϜ.kAgv:Xa仌aB[3^u NGgU]kyћ}YMn8>dEQqYT=0Q_ \$8>٫ PWLh0-%vϝ{JΤoR{vX2M BL hb=C #Ӯ"Lx^{w<Zn O/+՛V)  B31BԿ/>!`wاgenQұq6A9dn)k%oW_-_i(ϴέłMYC4->wYDɌoK&Y Se@y8/b" J2NP5%(߳nzB;o4$ωΗL[ AX$WV=${{Ii>қq:`wV SR'&l;#eZϡ({@ꮗQ_j_QT}ݜ(V'|Ytƙ H2 FlLHRHE)0z[Zr4,$0$9B#Ė_v̙ $W.ܵիd=e,‡jb!jH͡"uERX=LOy'1y=t2i1Q^)7@%>91R``=s*U4I}B]>cW 64;P&Y,cGOUT|gGeSl1b+f߃LmR,4,Ԭ`@C|s({̬pOCOdb?s j ݣ+J4y\{]x(d~Eʟ߱FvS1Nove9ho^&+md(8GXH*֔ ht48"\>9PSA#N3I䢱cT ;ǶWIf'Jnj2xL G1dz$Q3 S.?_׫c?|#~t?n.]FlԺ*UD&{Q5 e#o =tW艠le^J)aL+Q"O=_u3uaEZNT`[Ƨ?͉!ܸ٩cm&2A#{6?j8V GւG \ Zh-x JC _iN^ AN &?H,ռ_83t{Fj%"BQMg^gE?DF}.}=oe|c]0R3r&2i6\[+ה[!wo4C[%0U&%ҳ6K.Pſc쎴u;G`줕F }=p#lJe_MkBPrSٞ&nS/+F'/R4Es+,^*zFuԏMU #q:kGUt6繈`" {-Ld$_irn<33:ϲΔb2K5)nMrec'-3BFJft*}7˖<2}|Xuv=Pꨰڍ4Zuw Ƈxh6zvlI }^HOg~vC2-T2jv̗̄Ɔt-I4wQIcť>εTaV /+? Qn]Hus.=t*gbqc|0hu:*v]@ ߬} xx2#oWKZ/FÚl-=1z-RV K,i_Hs[Y=1cBQq5D;w". 7e{[ ^Eo7Z?8E|U9(}(u|4Q ](-@La:Z+Q ΣX~9;)ݲs2z66@LM-`4v^wPAf=\;-:̣FF*[ fW%ܜD&W4qXʴ'm^KDZc|9"JHfdK$Ht}1e_B%-5ϯ3đH^'OcX VoRm|UFNdU$zټq=Iׅ@y*^,rAuM (HKg o({DЯWEآÕv ~,8 hVQElY:PEG< *`*Ƙ#t@4,_j tZ(qc|'1,թoAxwhۥW(g(:OV7lb%٤1gP I8:AT~ugg.mjR ĵ_)־dd&w&|[5/Wy h0񶯂͡oLjOp!S#܆5L<4BaDħ!Oܼh~M*(t y~XN1B[S S!~?sksra]r²;˾vVBg-d5{1ƴ&h-%h?f/l7!ٌzZ=W ?'&Vt//jW%-2<>v88ZOࡵ_M:5LB=)HL_=Y3Cx\嶘σۑݚ(G͒‹BNA'/*N!pI4vۆVŻKTF)'v* B4qJ NaXI+5a29zN19=4fU+\7+¿iu3rs1&ݜ Mt݇r<{=w%a3M\S 5N3Tt)IX[]5*H_:S/9ESba:08tCO ϔtxkպ2v#V(ysZ-J[I=|{Jѧo|Z)Z{SHEjqOPH&e H8YL'p\*,eXX s2zknʔi')t"3h?mVg΍]+jFRAhsA5?-S2}s=nps*q{C?Q}VRx~:N7(t#mSDXɾ5VEtJjvdmjl_Z qLPVjgN{h Swݹ ˨!s Pinn.oz4?PAgMlS67fY&%aBќKMr>=r)O9ХUR˾rP2L._]^]ϭ{ i[D*5voaz !Lc蛿;:/\bl?a!z۫iЀSl[ܨ3/_3%z`HjG?=ppoww߻IݲS`*0Uoa`x*yCvӾ  k7b-9~T`LC139kڈ,hkWm"CVF h@08[3ߙEmFy7іT\.!%c!*~ݯOFͲ ]egCxE6IkD֏n_ %ON^󾹿k.^Z v dvqʙSQ>eb/ߞ-9 +@k ڏ^{9sjʯF$*!`#Tbu.?%= @6`Em&xڝyj6VRT| ]qdʤdti`KD=Lh`7:H<+ݿT>-pE7xrT@F`00[d]T?Ym AkDzwj}d1ݘFbq?M_/AgdX)^Ƒނټv7B'pWc]GHpʇ*8:-z 9".S;ZUഏ}_5c.\8p{r3M-TgxHfut2oV%̻/skΊZVhq>[*M^G{'rD/5YgHcKa҇)iɋ޲#4#par29!'MHϥPfL[-z ` f׎åxO ŊذtSBCV.K`1hj+4(=\+J=]&FC htWl@xwIjT$9S. +2eXBZ NIlivDPa۞MqPwg/gѼޟ'A\y}]F>i $p5> stream xڍP\. ]Kc N. 4ҍkp A,Gf̽_^u-ZkסRdZd7vV@RYrttZ`7_bT:+  Y&el vv^ "2[Y PNu{NW%w#li(ق3Z;4`uss`cd5wte؈00) ؽ= X!VֿIX;iC yLEl@nn  9@^lky;P?3u:I֠?T_Wso#Tvv `CP,Ygy/*ӟIH@,n (?jjPb IC㯩kcA< ?oZ>?6[j?#/Ivw{ en@T&+w3qv{n A] ;?}O\{ NRb w<ssoTxqps|ٟ dX!Pg3=5wGyxlE">߈Y7A6Ϳ?f7~i ux&olV6п _9Ϳ _|._9?9x^N6s^D.ω\ylnj52ȱuezɠɟqX-_`\}u?T, [aWb^ Tgv\(>)vk[S}/TM-k%{Y)Yg1n cMܜNq܋ Ioٮd8*Zk{gl9\ K_lQ7"7ᇷ)}tg.w6m:׸"=S0ʑ;!K!u%JXYamo];.Yabl5")?CC#sYfܻF\%#wB'A d X$U}0Hx^5`r#Viƣ_\9tf -yIk&'_ڼnS,`fnژ80t&uy ^t|Aѥv :|#SnLY 2pd4]o[,aECbHc $kD# ](\y y 9 HKi+ؘWYUd< _o[dXAod1vQHzL_^{}YX@'[#e!_;q1@z˃3;I5,GȯeE]^凁 dbR ˙<'g'N&r;<Ȥח/՜nTtSPJ0x$S}AvEQ>4qh is3G 7+d9GڃT g橘\8W7c|^m^kN'#e#d iJ':q}I9v1RU4su-GS&~9{Ak r%]#7P[=ƂP,TVz%ZRבemD&UL :8IIki> y]LQx.JDuXm "MEӵˏW~R1镳c'Sj^9.{/7b&h`sG[h55~eQj wSnw+㩳ïXt\̀56 GFh^"`.9U%)psW" NX_j geɗZ'F#ƊRX]4Xh"T}qy@pKxga^| MDq9Z(214~~GXF%'4iyW?ҸlOwc#3a5\!c:MK?շq"P-Fӻz`[Ej?R8[ }@ūzYq+Xvަ7.=1+EAv،Mħقw1kĈѴ.V_7(Gnukʭp:/1KoÙ  j6s+0CYo :x312a8JpfJ F]I;EÕ7뎄N_df.T,֊W0bBaPNmu) OKQK BEMz]lB7]^;XzOGzJ[="i+pl2f$eOnS.[K(p;vɎ Jqc78obz4_/rx̿YqC:S/՜;UgҫM''Jka:;=xTs{S:@Эp7s:,fèT'Vކ,tȰJUKfh7$Y<ºiοf[8Ҩ᠜[>· t..4rWi;pl]{ı&DLPR`􃵇󝰑ZVQUr˩7A6!J3#zaGRGcƿU(᥍ ܻZvK# x<3fd䈸/ny&)%Al]g/E )X۠Mr:ZҊeP'0&*޵dگWE"9_{f,v+W<{l-ȃXH[REEu*e $i{+ԧqQNq7GjUXOܶ^dXJEwK O\I&]᪊ReBjz}Wr ѼzDQvXsL\2x.cic pc^^uorzӐ}Yw4~ّm8%Y',j|GjXE.%#C~Z.,wp_6lsip/ѽϯ-EM g=0n-=|6G/[v!QΓ4jF1`J!\p2v;GÄ$}aIŭV D~O3P>Xvj˼oi`'wI뫤AyU\z˫ 8lw9^7B&AClڰti<c,_M.LP݌x,(i6UeAhF0WbfrO]%]9TI!YUm.;+Rd;FjޖJMTa|6u)$픟.Dggg6^B6(6ږ#_,uAd*kČ2` ^ͣ,*c&$1>K>Ԕ\ @k}-ПhgoLNՌ:q d "B"L? >}a^_ {֯~3[xb+1*b{g XyXq?&96?977H<E-#*Z_okbD/T&%EUЃcd6v/:xܿX[XYn> ǔ~9PkeM2s]"+0W6BAM?+j }'T]|j^ #Ze |mP&Nhc2 z*L>=OG e_b6FIc4.u8nͩ?3kmӫR3klU ,mS4wK N yk>T\n!xA'=_)w+KfTOW[6@t|E ,MAzjm(jk ^Vl{X•DDH a_fYKRldni^Wp.#?5Rfgdp.CҦkNm.\+mIT k]}45“e qi$+lE~zrR(Qo@Ҟa2tcfXJoƄRhQ ]KuFBga4~}ILW qŏmoaskqr6 !>k涏<pJOsf /J$ӾA&k_HocAUBs!2򮿾W`l #sj+*kEnްD*ba#Es0kjVbv̗6]>f!ѠDݕe̖ (k/kτcw=˜Rd*V+ċ'|$AAeppXmu,>Dzn|)v\:n~a6,Y3+J9I9ق/W/Љȧ?+pdӱxchMz&qe&XrcQ!Lj}5T*Tiϓ;}@l&~t+CzR4&*fYBqpsј|Y>]s>r!^Ōx&~;볯U}ҮGJ4cLdz豜/?C Ibr u>;65sHu2{2x}c0Ss;>Y8'gʝs\[⿾2̠iI⼊K-(KoMߊDtmdMEcq'掞l4?V^s;zBt@Dԩp9S}5ca@N3c7gSKﱽyŴxL Svl>OB)6m{;# olHE7mR[h9H̍Nx)[)'"Fvz 2QU㯆/lm`7N51|;7p/(H+iX ,Ja?+R(*STs&:sL֭M\Hz4Q@4nn5E]1|XthZ )MPgǢ"4K]&>I~H U{$KJňGh#a}E`nJnߦT 63dޅ|~mx|3t*Wb4E3S&DIsM R"ͭ=_ZB1eQmX#ĺ=40#WpC쑱D_gp0ւ:! g>k d,s0"/"?=ş~OoD*#lw0%"+\)z^O K=S~ MbeO \Pw >b%GOs#"r}6 .)Z,7%uv(S\u>OCRł0ę$t6Hu@_% vW{3jE@?L{SĠ.J?*AmIG hj$8@.orq0%v#ׂ [?$[*߾>yH7G'i3NpYabcGJrߧiܰr(PeygB]U ;;QGY$&훌ϋ'ZAX1'OƟƨzن ?-=(-L_3&ÅLh F9&ohK5~K뭁_CӘ+,f9,(nH>9Od+KqbÎ+Z$N>9=CneG m0?P_` LYŤګ^٩RY7`lx&!O&)]*"dTGyZ l8"\[<`߽b6E m+FNƳtxUco'|WYD.K˩Q:.K [0 Zc|F_=lP+N+ܚs=_+BD0Z<NmG|+v]0LŞS]K"51\# eHVdEW5fȝ]M 1Sui ̿Q_ iWonF#A;Wl'? xdAœ}Mq07Ou,~&k7WM+_^62Q?˛Uy~#䁍gӱ9ǡHjB3u$;J~V]\4J)ˢAW~¼(d[y Gk2$g(3'þddQYK{7s0gҦMC3ULcg@(\4݃["aaV9m DE~U%Pk'NlU"s P+?yV8"@v 0y+O+Eϻ?i=>7#'^=0ӨL6yWze-'R}\j !DkC Î+N4+^n>cAQd O`Eo@2q=!|z *YF됱L̓3bhReV9 Lv6xz{$R{ ZN4Zc*eJq}ScJ_6b?kS=#^[C)EHUERHTaqB3 ~scn[<ۊN+[#s(KeAPu |h3 48s;2g2_ h'Os;j3$ϑh\(@Jc`!}'I h8S\kX%h/1*KWǬZm6\ W-ءѕjŃa~K/B֡h\eq6r!,v\=vjk[x瞋ݨ{exMmQG.J:.yi d ͼ>MtQ4}r|IEY,/E2MloJ˥h Rp'*9>H%7"#*urXUeb8Vw ~U֚?=5>O+9w" 揤E㙴Lcg³\vEhzhھ ҅J˯5+f?˛,l32p;j&V1VsEǤ2=} bƶ2 =!(q {*mJפhSHBb5(sه:9=@cmj,N46fik[곔N~ZgO$wfNOT|n)`2/1e]#p9e+ ~jLBi1юS|wo @| -( MO ɺD"LOZ\X;"ӂu ]weO m 7<&/\LmFԐ]T`=ݷ5d590A # -x(ʹK~p_38V *.=p5Ϲs8E.QJFWXm O+U&r{ .3MzGyJFs+X[_U  SӁj,=[9ƭ1K!n8>GntUf&;޹0ޑ.0 ~I -Oqyoij}s'CO5Twuɵp R׾o%q;_n2HB]"y Ɋ`ƛ:5Dɪʊ6msW |[x2A.mN4\GgT*[}ᆵ%;DDt>anq0LEH eMQJH> S;L VYA^<2cڕg%ebH1z9$ #3m]vY8\5iAGp]Hj(b#\ 7;[O6n L yKO/Sgh zfd[fa5mҶS,T}ϷPx#/L_7SdT"*5J"w#f$~h3~`yF(I&QDAXpeM -7qܷ["uN@8Xf6a$A-bm){)$r秼?t5aUG0iPvQKFv<.e\lp5!qȗ'`Fn7P4p%L$]!2bnvqq%4ϩ7nxtl>x/l~hlIx9u;:IB63liշ8 }'X > _] n,&/=g]<Vt$>֏%EQuڑT!_Ɏ*D[pO,ǂp&Y$]3Cf}soA뻵É=V+VT67,Fګ5\^f{T"<rGC)ʯkL^{F (8ZwWP n]1KwMk"tBz8fM)W螙JB-Gգ) %(-Cq(2~~)7!kpՑ "y'5fwSF&00ɬ09dU-}&!s tv4 pRFXkӒW c )Q@([Ҫ:J̷£iH[mhn+yMbuPv7}gb&Q[}&9M) OwUI 5MFwa9G{i4-'R>QN*"!U2y%Css:[_ T*̛+bZ^+w9ӑ(=]k?k"9endstream endobj 325 0 obj << /Filter /FlateDecode /Length1 1419 /Length2 6309 /Length3 0 /Length 7278 >> stream xڍvT6)%2Ftw( 6`6`#FJH7*)!JJ4H>?=}پs_XD 0$P5'ā   &1(rPvA08L颐-XKˁ@1HoG@ t-&QFbN\p  hq0 _)0W9QQ/// o ' sA f@27F9` 0pÐh\ s5u0g?€_{{‘ xc$#Cyt{Z&zBv.+"UL -#wo7? 5( _kcIG I= !7R7! /=0Ev߮? =m@pۡt)\,Ih57 j;ߣp#a(4  tθ 7&n]WiZ>1I)%4&&)  -o(B8;ٯD!hg87_8X Bq WQ{wwFϿٓMMV7W(x,-D N>u!NWuk -ޟbUȄu{d j緻"?a7S"xfFmkEhŗ`>q"!\l)@ i8Y01J-Q80}ib[zh~8Ǐmff73ӓՙ"\4G#?YV-8ND(,r >W_wxxsab³},9wi!^mHRGʹv}J\2F:i.i!y0SqH4£~}"v"Re'C}i7"E Ȫ5kuo_Kq=Kn2*~8V_HlcBt)jg IW3NGWT4u/Bƥ3o[J*JMճ*,DK[n~)|PsAF>JU0ֆԖ&A&1 y<~A؛Eil_ #Ʊ1IΝTʧQes瓤4OrEỎhv冾bpǻ!$_o-rjl,شM(\v3m I*N2v8{p K[ڮ;bcmpwwI4~KꜶ &Ώh]##Sto^I 'VSqWo$*}z:^k㧐)=顿i(| ]k 9J$6'.hA A6OJgeDY/6=a~ n'ri]BÛťJ_]Qv n7gڔw6p'YZav{Awj(z@"OH V@~m|[ U 樿 ȈTj.͕ :ԫZ L! ?|P#hs|uuKn3v)C.@jJ)x[^IY(= a< ~ NadoT'x2ŸI(t"Pۗj\q# |{Ʉ%+$ov&ѹ_(RY>s~|<{@<פ`q">XwNǦ)2PT']3/ጚJ']ˣr+,A;;ViI2N*,BwJc=܆QH7R:ǐ>YӍ*9_d$s~}1Baz}YGi+Cfwձf.J,oM8J8ː'}J%BEZkgj|m 7. wyYCgs0찻ujDXJ)0+㛖u>ZiW_5J^ZODEAge[ڸGA]:lzFx$UqRP+f(:G樂EiUֺgOI{6yFݰou+71ļ&O{I 9Ew6A^.ˁ!"41L9C;?6u6QsyQXdweN,j(l}nb+m*2 K\M Vr""S| lpMt#V ģ9[}Tcᵾ!B"fjcLr=6 +yf~.OOnw29*}Ԯ#?0<;dYsg6U 5_ K^`~Z?rrTì>qJw'2$U{1sA9"m_) <syEѧH {W+e3!GS;mU 3 z-{au*ROWxλ7f歺ƔkAv 8iW-( >yqҗ59h>`- z]Sl^P~Sd[6FA u8wSQ$ӊGjBVLNYX5Z#iҡnxbfMA?.VQ=<=YU ,궳"]DjT^%v=c9>H1[Bq8PNGlirYZXZw&Zth3d=)$߸:!t^t 5ݬ?z-@_'tuF9xjkm]516W]3vxSx8¼4Q;gUj"7MaK{I-Ⅲ2{$ce㳘-6˫Oe$F8[[ӍB̐5UrC(u:a!dcthBzxB*{0[] R{v:wQxx :6"mK[[uޗ" \}sz|̥sDP}vNqS^AC8CZ&O*QȉdFfw dɁ[QZjutFIc@iǍ{znl(:z}0;_)dK{*`J+lP59MF,DRa"5g5%CϬ$#8&P4z.n-;z6yqdt7 S#6S" "K42 L/57 z2˜%㪑ꖯˌdmϴ}`nM;O1J'Q ;[\(_f U kE\)x@4GsVC{Ȝu<5dILhw5xJ|u!6篽jDёT3@EazͲIͣʞCowϐYr}<l&@*eކO |>V8h. @멺y;*$'JYBKXۗLLQJ"Tބ*Ee?(n0If]93wM68''U.yES^Ò5wHm;vmΔM|w7V͔^o-><ɲ,[8>Ski+] 7.]B' z*|/byo326 Kk}}&k0ǎ+/L&THRzirN3R;~@ }B1#qإm+n+Ǿk(f=<|ұZWL/晊`KPulKe#8,OV=-Oһ]22`K=g#)6]^v4߽OzϨt /e@5B*{=uܟbj|ZO)9PE kTyCB%g'pli-P\xϰikK=;|9}ѸH?&09x?i/+L6r%myD0e8 |v!OC>g?,lwU f`!6K>%vlq  =o=Ž"h%k;I^R* [X[3Zm@+iN i4:L\JG4xb}s MBHU1.~A` %|x$^nn])KnuIgxC4‹Mr$dZ(A @LBce|QV'Hd(*g4 ۬-b;!OOyDatI0UJkvіm9S !~mMq'ẃVX[9g,Of>D( M`8^ dV:dU2\swO1F ;zN}i_Uo2Wށ[5q42C9ӖVX:B^:_į&(Jd!?ⅧSY q[2d}s_7y. `mף|vqMNr5^^(t9sh)ipr[o<^~($br-amULg}VGƜ!8#f _%fБi4~urU#\ɏ?2~jܶƼzeidh۴rRIݖ cULu~)U}?$ jM5l UYG|{uNG5e#Ѽ]GH&WSۚ> q+dPG9yL1`EW7H{)^+K,9*9vLQAιϰ>qFY1Y#G5][;{n/)r@zs[dk;,_e>I`%KdnW6? +;mUbN>ʯIw|dwB,1f)Bƻ 9ㅨ:Ƈ44etzNVb_AʺJI> stream xڍuT6-NPFHK0@6ƈ (t HI -!(Ht{}y߳su*cAE@`y, 3cP P"xM'`@]PLZ^LF rb@ ' 4u1hqxB0t+A@(JM10xaH%a 4AXO 064sDM1x/($\P0G@X 9TGh@  k6@1 ; a\ݠh t@ Axo0 0|''9xK% Eq D_eSD14u? #Gf/_ Mr@hB0!xXNZZRp"aʛ!~;~ 0n@DA᠞ ߎbb@8 #(43ϙ|,'ɖ@/8OiYܶ?>557OD Jed. r*0@?_K2w!p6`)0%-)7_薇o7oᆺ\| PO Z"HGyW%C$P\DLcGnp#HFap_oB_>`΄ .ATa'.% bP@2q 2#( Bc cZP#`F [pm¡H$alj b >?ፀ100a^"S|h%x!Ck]Z_dQ?့MkVlS3Wӻj>"V,"t"tũ⊏ž5wm mE++naL5Wbuh10@ ed&Y"_PښԵq3N}}Rov~崮M:Oc4\HwߡKawEEaӊTBX}^1D^lS+hWȺ}@a~~x5,W=;VWpi` ycx(IȻ7v>e>XaVzg+D6. O3$hA<6sC$rYTg$nIIZ?\ce!!v7Va51ΐ>~p *\ҾqzUOM `njMld6քi-Z@{s[I ^{ GRѾQF4,_he#@!jM cQSd'_Zib迸 r#+h\ziyR#Bb>5/+Ye[{chޱPi+sVuH#OF73 ~f\ a:0 r^sґǸ=Ma Rpٳa5 _UvhJF%P7-?ӟgzT^=:r]Hnfף;o~zt~^0(2}M,D9d=4 AWh]Qx! _c`:SPY?ok<+}5Z79IJXE`;RN~_Ƣol3U-2d@C\zd!ŧZ>;|#2Sc@ʵGԐn`^r.Tڙewtca."d?|&o˗]/Ж!׺ay ϥxHsx1Q~q09\ekw<{[Qk4;:&7َV#\ᴼa3M\ OupTfo:)FB/Ym{|mopt'w7]h ۿhK4s7, %6@ћ:MU|m2Q }\TO[fFQSI2=idE']\1EVf)%P쪃5uqƭd2Dv3߾15'96/Ogh/#qj)LڹfK~~ZG_ BDWՇfʭˍUerWzAv]4;e97lVE NǻAŦ"/ 0Ye[WqfR]"~NH֓#O7P[d­(^"̝-!Fl88z{fdG"]3#6%mY¾BཟYe4hW3pȲlִ?Dz0zk4V/3J̔c |W[$\&6U*v ќϏA+q. DץM3Ȳf7"}\0ϓ5ML7 D 5~ &"<3'^RV(L<#-Ԏј=yOR5w#HeuHHk1(I먑6S[z(8!ګY”')MFszv ѻ7\`u!i mt;_?.y0O)\=b5bk3 MK9 y28m̐Zu?O$rҙCT;`|̅) S',ъ0 7K2гeByZ]0Sgep|+?cmz>JT"tr5uk$za@ -Ϫ7+ϕ/+uz i~8__o`"RX'\\N7ZU5aS9^2(%ՠle?Ofh Q1|M}JIEKFW4@%MɟV?H)8ƭP8Qr=LnpK)2f儒>At QqE_ĮXo:Xo][' !MǤ]σL@?Tjc޲7k9Os&d%-޴o"qmOÈSjI@NV`Lf̜*b|wP1-wSL9 ]T C9ZA\sh ޙkkgGU~u`*8ATƗf l;HŨh׶dOc]2ϒ=hXh5jE\ {~k[U9e"[EyM~<\.{^_zYxot 3|ꄷN4Zph7YҕQM$ 5Bzj$hEԑ~, ҇3I𭻏?rKx`$g?p;>yA!g]-[+2{="to= /pl>%ֺm)܊>cV߯l~sCL"Ϊ2F5QcfXҔ{_΁g^(۱-ѝ"in 8A>\svPʑ,I2tH,z9.l7f6m hX[P!ׂw ij_. 4H@Y\P#vg|Ȏo@|9h^AKDGAB.Y&= lPJ/ѽf/~hqPU"SurxzN:eo4pqpS0 ;w뷋7l[XS.&8_A/xm\Gì12#Lns,7AϜ {\Hhwx߫_.HmΨpΈF7c1C֏ƨ0Y@Dfmyv?j΋Ȋ6Qۣ> cZ@ &9 }!P蓗-M%g5E`Ҟ5U[kqx%ՁJƞrT?ѴYlOlxA#,LYi W^7bzu-ÆwoV/K_{w ޝnυO!}ṘkJxu?9y$|eܪ,=ַ%!MvZ) ؗSJ1MޅРa0v!oT;ࣰ['6,% 6"(ߑJ2-:o! >Ca|ξJ*w4# 0ogկ.m_޾)m~4@;$;[̩6qKv92N }|%TN4{. OظIVhB憌Mo5Ђ&m 4XqZL>qaG >5k؈ ߋ1 Weu!Q!}|_˶jY 6rO-!Pmmҕ"jMly,8L +dϋJ+M0= ZSE-%r sv=#q?%6ncxow R2d[}sއ E 23b} ^[=J9 }SQfŠL\VoRe W&n\u闛F83֋vM \'㮟2l0xC! rTl&d2 3w3>dc4"K`b꟧4zoSw|CA*GOo{c \վO֛VغT~% 6KۡbO??Gݐzܦ&Dmmg vWT 3*5AJ]Ow 37endstream endobj 327 0 obj << /Filter /FlateDecode /Length1 1474 /Length2 7664 /Length3 0 /Length 8646 >> stream xڍTk6L))J 034!(- Hw#-))-tZ߷fgoVF}^9[5DC  | VV( ↀaPpw:E0Q ;D ~~nEP VyW#Æ &&; qڀa-0|WЇ@!Ht@"]ā@OOO>3f/"zb  vƇ 0p"2퐞`7Nw!0[:@_MY/ 'ݟ_`  N#eM>r;!w`0 l}u0@YNC D!N0f%C"p~uݻ7papOߒfk uu)SWgAEA+eU(K}Ap|`jXC0fSC<ΰ?';aNu=b11ý^0?@@$;;no:`Q fֆ ;>C0Gy ~qW+#ew'v?v3ݑwCZh--jHݎx+ /PzAluH0j8Aa8ݹ8޽-6A6u`6p_+~qp' |v  ap~ Vr@/QW!Yo_-ڸmo.ɀ@ 68ӓp!grk !#,U%ju CSrߣIAu& ~ՍWxI.--a>{ɎqRMmH},=-qd6I%**$T*_!76ެƂ8@y<$=Sȃ ]Jw8Jے~Fj0ƺڮDu#195__Y"]mu@`5FMj"zW +El^\- r| ۋTHq;G~T'Ӭ0@$%?*0b oz.W'!davc*.+#a%6sQ6á~1h&yJ%X$RCa{84Ti|Wdr_$Qeٯ׆#d}ْ Mǎӭ"pf#Ppې*I*۷N{) +p2]c,lxBe|#?]Ro,8fI:V1W>zѴn6堨Xa{6j~ߠ?I(%+Ŏ[:*1I>4ЏmX}9Τd}a*j]ռ1 LSE> 5c .miX)ɍM_AĤgTVϺj7na$@Ko[Lh:^!)@F0Wؚytj~h{KŴV7숢tl$_$,y>- E~gf K;݉RyRD54E%`reZ{Ěp'+njQQ[` Z;A\IHօؐ1G07jv"s{[ c4͂wjF>:.(`KtX4A1Uu084H:0g$1Ӧb Ee"04P?] fk[$e_?OU)(3:'ĘQӡOㆻX߯v -|0͗{/4JܞVM:Y9Uk1d,/%[כUp$A3ڇceܘAu(ı܇?xPUX؞l123$}?C=8 g(.^Ԋz T=<1z0;BkdV*G6SWq ңgnĭ>킉4L 2e"0bT^Sl&'+(uݶN>5=%O=t 0FІNQhcGCN !"@Y6s}' }o ,' !١]@ z_Ed?Čgp%[է˫?H֨U|^rPcV$'HK~a+h:;-֠[y0 h4a[T5}#>F^vnL4Gv.wGU_1WޱAL{pbI]Nlo Ta[A:r;IXinOպ_cZTy_UpHg*~nN=)2':~>VǦI9-wv&ej飡g`ϳX|i5N# hbU{CaTKn6Obxh(1K9q *T.)!oܕȂ2ʴc©m¸G*nA,5W[ȚDķ>b)Ѕ:8,k's#&+ͽ`OKb/N*p:?$-HcCyO BV ėJC3)9YtIgYI0O%/mQ\jAhwZz9%%ߌD,jFαVP!Y/QHt/۷.two(s;m% NRTp!&z &sDžP0bu;"!N7-OJž|vWҀʯA÷Z +U7G.+Ns[ΩOGAj>WΗ*(-PO6jEIê-cA&)BaT]lKLHsfC^Wzgէ E: y菜g}:K'B\ptRRk1؇9oczfD [lᶍpnAK9Y$~{Q`<Ⱥ _1WҿO*}fn7ܪvR ՗v$TۺBQFcS+a6vEcc!-]qVAܓࡇӏRIa9ڣ+ٚH`}; oӑ ڡ۷&ΎX7(6lL+UleLI_F-= HJ$tQsVAH/ȃCOo> jfdqlD~MzvVς?7,z@I;Bh/_u4whwƸ _}Ej?ITdz|Ӏ/ E:t+=*', Q3jے| vyX FĈ>^9zyK6Txy.2ѧ_s:uTfdi7;/O9ڵ&*e9K7!p趜(|P,sddGU~0kdͯfcS$O;.'00jҿ}Ggxr|#p\E[(YmΩyēk4Vq#2}2@{7[Bm͑kr G6ޜYXYP "ܛӂq;>)| X6R>={sU +N BEi4 ;z;0u:&ؕr/zL5xLs:ΤEz8F!8gL)s/HPHLiuQLaIh?`YZoh1×^xÒ2>ug6p7nF毢ީqڥhIi2%̚]޳R=_d"mPy弛\iR:Ua unos_ɻ[Gm_dWNX<[ijlN7\fQ2͇s'T;~\ȱn(|!dC&cT51߈=)R#g*C">S3fݗksU(Y偝6~I]跾ڽL~lܡFaB4&2dز.g9bw,]!{3x8i0&1>KL\t%o>TeFسHϹamɇסBRB>~ܙ">Rٳsuss.0v:ID./5锛&`V,;ғj *EZYҟu@{&GNBB[0p~._A_`A+[g׻D[x Gx ~T%Du +I"m ٫MWb5>ƭ}CLT/Hlg6p zͱ®ٝ(.ʜՄ]䏞 K˚ &qӌ]/Z[](*KpY֋zRC,۞0Y)-_uк$1w)Ȕ'?R6s{4ϖNFC쥱<㇣Ky(\e!SkTmsHކ s<}K8&u[CGo0+<5Gw\LFYvlHNj:kΐRKcblY09އOjUI=Fc;j:g9@ͥz#sOՋu8ZuPA(,&= ؏1 vn(`Oƽf;&ٓ¾\SE8?ܭxZ9CbLZ&R8Q#쓪1EHQzL8A*υn:ZfH=f6_wK?sU|[dcBi2V'ۚ;87_*z\*/W|%!Nj6&bYlYJ)0j>=0HeaJOW&(DJf_U%9yVl>րqDTO? ~s42iA?q=)H&@5u J.{q^aR e=fg0d.OԜL!Q~ըK;(x]Oo}b7.jW9:aQ ! 95'gFwiQ4G֑؅fo0 ӗG#]] '"*;eʼ7}s| S mXto+xL?eqgWuۘo@SGlsXd.F=&5Rnh&SPX|kWY5FP89`޸oLs*wc[63ڊ {&Ѡ $$r5k9&;+8YɰhYu@ DZ6VdK6SM+6{߫XW9UO]Πhty9A+ L9qy0}\CTz-FӨ}AzG7J֡vfV 5v]'90aD˓[lLxGKͱeYGA+Y}b%_z43=MQ](Źk,i: JKl# lAo v.ځlZ/j- [COh(d_jIVGQ+bu65vT{ YUX~ 6i6]ZiTL_|A.PݲuqgUNlu8C%,ϧ(Gqo|${r癱F񖚥RUի]\jjL\f{0򧲣.7d]bU\5iO򀸟ņo9'.rs*MKYw1Vؚo )]PB(h/tO T^vEn-\ףKbhW $A%}4| dwI [S~6y[{ʚN9RRO[h2Ay"! &^|t8f$p'^ZIZ`I3?!fၱ*^ן?(egC_%0Oz>7oNrNN!o4QW!(\yg:n5hsTHd7h^PV]ʞBzև13Ž5a5qwcŔU9NnvT1i[]x_ɽ=@_ӵ!,Db1ql*rBi݇kȟ ba^PHwr.d<ʙQ]EٹpL^EHA¾T'f ѾH(Y+sy-m[ GgM+"Vjr"^GI٤Ṡaag|ؒ"[N[IcR&rʵKܤiy=sl@%;Qk>MiT2`oXL>0bq`Z &S|&J#NXC6 9O_4 I:?L: - lf5H ? y\q{T6X;X!k.X$Z(flaҰ@ 2Lĭgu)NƆ辂*qJ:TGC[^tVK6?`x 29TzXz)D(Ex󳯕8*cZkFԇJD;]55=Gھ ۙY1'I=7T4nd? ɀ/,~ 6vAq#Shm@PXs"Iz!ӎKaEH)^Onȴ0;a%8BMlZO[/0^|ڌ}kapת5fT8WiҦ!74P+ĉR{L|Mdb[K4G> stream xڍT TgTOGyI ( ouH&d$̄Ʉ+łX@juQA TB]( "ъ FPZ=g{{chࡈL:d \|x<& @%X4CCJi?pBHQ…@`$1)%`Z2B`A4'l+ x"H+0Zsu:D ʇ1"$ȇ x$% \.R:N99J@"E(DT/LQ OJ'(#JaTw $6 L:MlU!S'|>!1!*F7& T@X,ũ|8 Fp(Pn N TBJRTP \#4\QS`L 7X̴%D1PEC 06bh pP.[_B6A,- hjSHurSbc$)H,*D?ZBIȐؘ޵hL&|"a(F{[r#I?F-%?&T7o_P X138)ox4` ` ľ[ ij?N z[fuw4ta248fĆԃ:)_Ubudq8+e$>8: T~ԃ `a7JhD|Z1cQ ǥ{,^Z9~8MRRj@z,5 V J_,60 jiI*Pb'h2)0$*ߔ | _F@aV;D#|8.a{qBŋrFV~Q7Ļ؏=<Ʃ7yEY* Z oh?J*f CYa[ f –>- !W:.3=ިp\K3I|:3*9Y8-]0;5حohM=U^`>teK蚵׶ŰwAxeEBIW't'e~∲MgβL X`vŸ֥yM*?&V0r5Kr=b?il񦉩e,3N>;_/ =ݐIIϓ8e{_NkN55; HT/5h4?N#A%!-c G/wk\5`$Hnt%Ve|i(`1K~O e:&g-Z:ϖ[}1{%Qeg[϶*q']qK~leP]I_YE߮{ܳ_ѕ /gw *ZiyfâO\tk'Z\BbS Bίu0}ru5/ Ybw'޵ymy|/ >p^}~IXX+7.DNMWO~W%螭7ąJ R H Ԏ7ʮ-x;h[_t\w; 'JT|JΩs{+6y.-_Zd}sԵ']vfy)v5yĸ2;gv:#n-a)3:ѐqvȹ~yKYg~]e=5)'BYK6Y[fČ,S?h/8סc^|Dy|d=khS4[0Re/ՙv@K:r8蠷KwcE­My uAg "sST>JsS?vC lSI3Ʒ^.4_Ow~@'}O(?ë[s9$}l_n8񣖆o+HPd0=u9K/bGj<Q6v=f]iϵ[wjޱr7\4⯍eKfiQ?="[]s|QAO y̱;U\x,oeendstream endobj 329 0 obj << /Filter /FlateDecode /Length1 1702 /Length2 4395 /Length3 0 /Length 5447 >> stream xڍt<Ft9g(3#;玻ٛt@FMJFFd%BQddo~_$fi-" x,LبP gld tM$a xhf3@iqfD柿) TUev]o4D3MDk&XÃLQ@$9]KR=+4 MG€9~ڭ rhƓh~xК'L 4g09rw a$bCrd Y@Q;@G#8-`PE$b}$9CSv(}7O&KD#i9Y/K4?P<.O|!F2#P`YE@.%UU E~u4z'aK_ # 9d4#|g"I忛SNM=7 @fjjfhdm9t׈%b)h%ؕ?CUahK 0(?>ڶ!h 6]Lx$v DD &." ' M5ȴ.l;UR z;] V2AFJ 4DT n! /H+D =="h6_Px0Zi+!i$|TɌ`Ŀ /H ifA_cAjwoh3フh4d' c<ԭ ~+p-_fp\Tƒunc$uxvhú }3$S?ICYy<]`ڪ=`YW׏?ivcY}g"<}Lnv=}O%-tΦ ~޸Wo{sK;vEhzd9{Z&C&g^ЇRQu1`7 42 QvT:Q#Pܓ2gݠ2{.@!ĴoJY|^i|*""/u(DI .͘8~ ϧ @FvDotO${HwNzQZs)u𼣳t291}$~-CK$C):nOf-ΌrjF2jɴ*J]jż/Y퐬=҅.oH[\/2oAŵ*\W𫰐[*@.6|f?$eUL~,3G  V:X-$SWz'rӭL{VE6otI+ΐWʤ`T2lLFzȔus0B9h06k$M&#m?lh8Jr̿)UaϮ 6O>p{;9~Fpo +ꆘg=+LU*2kEo%yp Nx0D?xazOϾh"Y9XY ˏ ]_Ywg+pw*J^ۦgE oSK;+LM[w杹̺ny:e6=,-"o[C{ø@Kp K,jO IRNޛYt[ ܪa@i~J@&ՂCC[cC|xn*S-^XPf̰RrS 2,K>i˚yPSoC=l_@Bfשdo]8jJi6|_,)E_P #a,"'+wFaVO]DM<* ?t;[;{$|-S _0|@Ӟ\ǜ%X8`H?hVdmrt|[Juot"+z"}^@b$ChZdK~qH =uSWPs| b,SRɠX}u?7)KCLvWDmOݮv|ć/P1CɜB!w|Yax~WFyowE؋6D,W D7Il_j!.Ry&/~By6ֆU][?mռfFdmQe9^ڬ_%;sd$N1R^>y`JV q<,yVlIc5C9`w;R(DYؐ8,ϖǽnFrD.OXpdQdDGړ )sQBV?56pU5d_j^sϓG 7/ʾʩ:l=󄕜E ׇH~c ml|{K&D +҃Q#Sz._ z&6炪Mei4nj8(T% Vo/kLޡot#LڞR2Һ=Cr1ͪm EF=`puptTs.UYW- ERc8X0Gb#ӂur< L}(oYn,$+r}s6YGd6M=dJ55cS9Y$Bp6 ^k?H ufy=dGm.xFݱH(|hKZшօo,@V͒qfrYVd0>v@ͱ|t:^uGx^:(!7Hhx[ o-N hRwWx 'måaodZ<6T4Mhrq1,kɫPwpw=mg {n|`EXPۇfyI衇٧7Z O}h~y gcv@7[}o v=E=TC \|Yy3Q&,8fT*yRSt=zϚ]~boO3ue5"cA=rf4oH7qDC{ 8b+c|]O^•Ƭs>]zO-EX˅r?SM)pf|{ׁR;)i tLR̖f*Z<`6[y#*{Ss3 2yD8x lDTz8ߦ3ҲP6m۱2Q BWCw̜z׸[ƲUu?!zuMqږI-EL J?Jڞ,¢K9Z'xu,x˼ʣAnٻH?8.2эd bs21ק4Y"5ҟ k2מ+J^PZv*Ir0r,,#{J>ԝ4endstream endobj 330 0 obj << /Type /XRef /Length 231 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 93 0 R /Root 92 0 R /Size 331 /ID [] >> stream x= AQs.r)tG6M$ {7+P2YȤdS ,>ϝݫ%M( VӧNC_X7ߌ@3j ^a` } ^;m+[xU68UNjƼ}{Kw`-V6lXls&44, =Ͼ<̻߳l&g6S8tعѹxo.a endstream endobj startxref 250102 %%EOF sp/inst/doc/over.R0000644000175100001440000001314512321302443013530 0ustar hornikusers### R code from vignette source 'over.Rnw' ################################################### ### code chunk number 1: over.Rnw:104-106 (eval = FALSE) ################################################### ## A %over% B ## over(A, B) ################################################### ### code chunk number 2: over.Rnw:116-117 (eval = FALSE) ################################################### ## A[B,] ################################################### ### code chunk number 3: over.Rnw:120-121 (eval = FALSE) ################################################### ## A[!is.na(over(A,B)),] ################################################### ### code chunk number 4: over.Rnw:124-140 ################################################### 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") )) ################################################### ### code chunk number 5: over.Rnw:145-150 ################################################### plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=2:6, axes=TRUE) points(pts, col='red') 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")) text(coordinates(pts), pos=1, row.names(pts)) ################################################### ### code chunk number 6: over.Rnw:157-158 ################################################### over(pts, pol) ################################################### ### code chunk number 7: over.Rnw:162-163 ################################################### over(pts, pol, returnList = TRUE) ################################################### ### code chunk number 8: over.Rnw:166-167 ################################################### pts[pol] ################################################### ### code chunk number 9: over.Rnw:172-175 ################################################### over(pol, pts) over(pol, pts, returnList = TRUE) row.names(pol[pts]) ################################################### ### code chunk number 10: over.Rnw:187-196 ################################################### 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 11: over.Rnw:200-201 ################################################### over(pts, poldf) ################################################### ### code chunk number 12: over.Rnw:209-210 ################################################### over(pts, poldf[1:2], fn = mean) ################################################### ### code chunk number 13: over.Rnw:215-216 ################################################### over(pts, poldf, returnList = TRUE) ################################################### ### code chunk number 14: over.Rnw:220-222 ################################################### over(pol, ptsdf) over(pol, ptsdf[1:2], fn = mean) ################################################### ### code chunk number 15: over.Rnw:239-242 ################################################### 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 16: over.Rnw:266-270 ################################################### 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 17: over.Rnw:278-287 ################################################### 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 18: over.Rnw:292-300 ################################################### 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 19: over.Rnw:311-317 ################################################### 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) ################################################### ### code chunk number 20: over.Rnw:327-329 ################################################### image(agg) points(meuse.grid, pch = 3, cex=.2, col = "#80808080") ################################################### ### code chunk number 21: over.Rnw:338-341 ################################################### sl.agg = aggregate(meuse.grid, sl) class(sl.agg) as.data.frame(sl.agg) sp/inst/external/0000755000175100001440000000000012321302443013503 5ustar hornikuserssp/inst/external/test.ag0000644000175100001440000021711011635334430015005 0ustar hornikusersNCOLS 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.ag0000644000175100001440000000020211635334430015307 0ustar hornikusersNCOLS 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.csv0000644000175100001440000003711212162333243016564 0ustar hornikusers"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/0000755000175100001440000000000012321302443013304 5ustar hornikuserssp/inst/include/sp.h0000644000175100001440000000577112223040246014112 0ustar hornikusers#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 */ #include #ifdef USING_R #include /* RSB 091203 */ #include #define R_OFFSET 1 /* */ #include #include #else # if (!defined(SPLUS_VERSION) || SPLUS_VERSION < 6000) # error("no SPLUS_VERSION >= 6.0") # endif # define SEXP s_object * # define PROTECT(x) x # define UNPROTECT(x) # define R_UNIFORM unif_rand(S_evaluator) # define R_NORMAL norm_rand(S_evaluator) # define RANDIN seed_in((long *) NULL, S_evaluator) # define RANDOUT seed_out((long *) NULL, S_evaluator) # define Rprintf printf #endif /* 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_lengths(double *u, double *v, int *n, double *lengths, int *lonlat); SEXP sp_zerodist(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat); 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)( tPointd a, tPointd b, tPointd c ); void SP_PREFIX(FindCG)( int n, tPointd *P, tPointd CG, double *Areasum2 ); void SP_PREFIX(Centroid3)( tPointd p1, tPointd p2, tPointd p3, tPointd c ); void SP_PREFIX(spRFindCG_c)( SEXP n, 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)(SEXP coords, SEXP n, SEXP hole); SEXP SP_PREFIX(Polygons_c)(SEXP pls, SEXP ID); SEXP SP_PREFIX(SpatialPolygons_c)(SEXP pls, SEXP pO, SEXP p4s); SEXP SP_PREFIX(bboxCalcR_c)(SEXP pls); SEXP SP_PREFIX(Polygon_validate_c)(SEXP obj); SEXP SP_PREFIX(Polygons_validate_c)(SEXP obj); SEXP SP_PREFIX(SpatialPolygons_validate_c)(SEXP obj); SEXP SP_PREFIX(SpatialPolygons_getIDs_c)(SEXP obj); SEXP SP_PREFIX(SpatialPolygons_plotOrder_c)(SEXP pls); SEXP SP_PREFIX(comment2comm)(SEXP obj); #endif /* remember to touch local_stubs.c */ sp/inst/include/sp_xports.c0000644000175100001440000004103312321302416015512 0ustar hornikusers#define USING_R 1 #include "sp.h" /* remember to touch local_stubs.c */ SEXP SP_PREFIX(Polygon_c)(SEXP coords, SEXP n, SEXP ihole) { SEXP SPans, labpt, Area, ringDir, hole; double area, xc, yc; double *x, *y; int pc=0, rev=FALSE; int i, ii, nn=INTEGER_POINTER(n)[0]; SEXP valid; for (i=0; i 2) { xc = (NUMERIC_POINTER(coords)[0] + NUMERIC_POINTER(coords)[(nn-1)])/2.0; yc = (NUMERIC_POINTER(coords)[nn] + NUMERIC_POINTER(coords)[nn+(nn-1)])/2.0; } } } PROTECT(SPans = NEW_OBJECT(MAKE_CLASS("Polygon"))); pc++; PROTECT(ringDir = NEW_INTEGER(1)); pc++; INTEGER_POINTER(ringDir)[0] = (area > 0.0) ? -1 : 1; // -1 cw hole, 1 ccw not-hole /* RSB 100126 fixing hole assumption thanks to Javier Munoz for report */ if (INTEGER_POINTER(ihole)[0] == NA_INTEGER) { // trust ring direction if (INTEGER_POINTER(ringDir)[0] == 1) { INTEGER_POINTER(ihole)[0] = 0; } else if (INTEGER_POINTER(ringDir)[0] == -1) { INTEGER_POINTER(ihole)[0] = 1; } } else { // trust hole if (INTEGER_POINTER(ihole)[0] == 1 && INTEGER_POINTER(ringDir)[0] == 1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = -1; } if (INTEGER_POINTER(ihole)[0] == 0 && INTEGER_POINTER(ringDir)[0] == -1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = 1; } } PROTECT(hole = NEW_LOGICAL(1)); pc++; if (INTEGER_POINTER(ihole)[0] == 1) LOGICAL_POINTER(hole)[0] = TRUE; else LOGICAL_POINTER(hole)[0] = FALSE; if (rev) { x = (double *) R_alloc((size_t) nn, sizeof(double)); y = (double *) R_alloc((size_t) nn, sizeof(double)); for (i=0; i 1) { for (i=0; i UX) UX = x; if (y > UY) UY = y; if (x < LX) LX = x; if (y < LY) LY = y; } } } PROTECT(ans = NEW_NUMERIC(4)); pc++; NUMERIC_POINTER(ans)[0] = LX; NUMERIC_POINTER(ans)[1] = LY; NUMERIC_POINTER(ans)[2] = UX; NUMERIC_POINTER(ans)[3] = UY; PROTECT(dim = NEW_INTEGER(2)); pc++; INTEGER_POINTER(dim)[0] = 2; INTEGER_POINTER(dim)[1] = 2; setAttrib(ans, R_DimSymbol, dim); PROTECT(dimnames = NEW_LIST(2)); pc++; SET_VECTOR_ELT(dimnames, 0, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 0, COPY_TO_USER_STRING("x")); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 1, COPY_TO_USER_STRING("y")); SET_VECTOR_ELT(dimnames, 1, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 0, COPY_TO_USER_STRING("min")); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 1, COPY_TO_USER_STRING("max")); setAttrib(ans, R_DimNamesSymbol, dimnames); UNPROTECT(pc); return(ans); } void SP_PREFIX(spRFindCG_c)( SEXP n, SEXP coords, double *xc, double *yc, double *area ) { int i, nn; tPointd *P; tPointd CG; double Areasum2; nn = INTEGER_POINTER(n)[0]; P = (tPointd *) R_alloc((size_t) nn, sizeof(tPointd)); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[0], (size_t) nss[0]); s[nss[0]] = '\0'; c[0] = atoi(s); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[(nss[i]+1)], (size_t) k); s[k] = '\0'; c[i+1] = atoi(s); } for (i=0, k=0; i<(ns+1); i++) if (c[i] == 0) k++; PROTECT(ans = NEW_LIST((k))); pc++; co = (int *) R_alloc((size_t) k, sizeof(int)); coo = (int *) R_alloc((size_t) k, sizeof(int)); for (i=0; i 1) { for (j=0; j<(ns+1); j++) if (c[j] == coo[i]) INTEGER_POINTER(VECTOR_ELT(ans, i))[jj++] = j + R_OFFSET; } } UNPROTECT(pc); return(ans); } void SP_PREFIX(comm2comment)(char *buf, int bufsiz, int *comm, int nps) { char cbuf[15]; int i, nc, nc1; nc = (int) (ceil(log10(nps)+1.0)+1.0); nc1 = (nc*nps)+1; if (bufsiz < nc1) error("comm2comment: buffer overflow"); sprintf(buf, "%d", comm[0]); for (i=1; i= bufsiz) error("comm2comment: buffer overflow"); strcat(buf, cbuf); } strcat(buf, "\0"); return; } /* remember to touch local_stubs.c */ sp/tests/0000755000175100001440000000000012321302443012046 5ustar hornikuserssp/tests/point.in.polygon.Rout.save0000644000175100001440000000147011635334426017121 0ustar hornikusers R : Copyright 2004, The R Foundation for Statistical Computing Version 2.0.1 (2004-11-15), ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for a HTML browser interface to help. Type 'q()' to quit R. > library(sp) > > # open polygon: > print(point.in.polygon(1:10,1:10,c(3,5,5,3),c(3,3,5,5))) [1] 0 0 3 1 3 0 0 0 0 0 > # closed polygon: > print(point.in.polygon(1:10,rep(4,10),c(3,5,5,3,3),c(3,3,5,5,3))) [1] 0 0 2 1 2 0 0 0 0 0 > sp/tests/pass1.Rout.save0000644000175100001440000002525711736575120014735 0ustar hornikusers R version 2.15.0 (2012-03-30) Copyright (C) 2012 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > x = meuse > coordinates(x) = cbind(rnorm(155), rnorm(155)) > # should pass: > names(x@data) [1] "x" "y" "cadmium" "copper" "lead" "zinc" "elev" [8] "dist" "om" "ffreq" "soil" "lime" "landuse" "dist.m" > names(as.data.frame(x)) [1] "x" "y" "cadmium" "copper" "lead" "zinc" [7] "elev" "dist" "om" "ffreq" "soil" "lime" [13] "landuse" "dist.m" "coords.x1" "coords.x2" > class(as(x, "data.frame")) [1] "data.frame" > x = meuse > # coordinates defined as data: > coordinates(x) = cbind(xcoord = rnorm(155), ycoord = rnorm(155)) > # should pass: > names(x@data) [1] "x" "y" "cadmium" "copper" "lead" "zinc" "elev" [8] "dist" "om" "ffreq" "soil" "lime" "landuse" "dist.m" > names(as.data.frame(x)) [1] "x" "y" "cadmium" "copper" "lead" "zinc" "elev" [8] "dist" "om" "ffreq" "soil" "lime" "landuse" "dist.m" [15] "xcoord" "ycoord" > is.projected(x) [1] NA > proj4string(x) [1] NA > > set.seed(13131) # make sample reproducable: > x = meuse[, sample(ncol(meuse))] # 'randomly' shuffle columns > # coordinates defined as variable names: > coordinates(x) = c("x", "y") # no matter their position > #plot(x, cex=.05 * sqrt(x@data[,"zinc"]), > plot(x, cex=.05 * sqrt(as.data.frame(x)[["zinc"]]),pch=1) > title("Meuse: zinc bubble plot") > print(summary(x)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: lime landuse zinc elev dist.m 0:111 W :50 Min. : 113.0 Min. : 5.180 Min. : 10.0 1: 44 Ah :39 1st Qu.: 198.0 1st Qu.: 7.546 1st Qu.: 80.0 Am :22 Median : 326.0 Median : 8.180 Median : 270.0 Fw :10 Mean : 469.7 Mean : 8.165 Mean : 290.3 Ab : 8 3rd Qu.: 674.5 3rd Qu.: 8.955 3rd Qu.: 450.0 (Other):25 Max. :1839.0 Max. :10.520 Max. :1000.0 NA's : 1 dist soil copper om lead Min. :0.00000 1:97 Min. : 14.00 Min. : 1.000 Min. : 37.0 1st Qu.:0.07569 2:46 1st Qu.: 23.00 1st Qu.: 5.300 1st Qu.: 72.5 Median :0.21184 3:12 Median : 31.00 Median : 6.900 Median :123.0 Mean :0.24002 Mean : 40.32 Mean : 7.478 Mean :153.4 3rd Qu.:0.36407 3rd Qu.: 49.50 3rd Qu.: 9.000 3rd Qu.:207.0 Max. :0.88039 Max. :128.00 Max. :17.000 Max. :654.0 NA's :2 cadmium ffreq Min. : 0.200 1:84 1st Qu.: 0.800 2:48 Median : 2.100 3:23 Mean : 3.246 3rd Qu.: 3.850 Max. :18.100 > > # coordinates defined as formula: > x = meuse[, 1:5] > coordinates(x) = ~x+y > print(summary(x)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead Min. : 0.200 Min. : 14.00 Min. : 37.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 Median : 2.100 Median : 31.00 Median :123.0 Mean : 3.246 Mean : 40.32 Mean :153.4 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 Max. :18.100 Max. :128.00 Max. :654.0 > > # a = NULL > # cc = cbind(sample(1:10), sample(1:10), sample(1:10)) > # coordinates(a) = cc > # summary(a) > > xx = SpatialPointsDataFrame(matrix(1:10,5,2),data.frame(f = 1:5)) > rbind(xx,xx,xx,xx) coordinates f 1 (1, 6) 1 2 (2, 7) 2 3 (3, 8) 3 4 (4, 9) 4 5 (5, 10) 5 6 (1, 6) 1 7 (2, 7) 2 8 (3, 8) 3 9 (4, 9) 4 10 (5, 10) 5 11 (1, 6) 1 12 (2, 7) 2 13 (3, 8) 3 14 (4, 9) 4 15 (5, 10) 5 16 (1, 6) 1 17 (2, 7) 2 18 (3, 8) 3 19 (4, 9) 4 20 (5, 10) 5 > > grd <- GridTopology(c(1,1), c(1,1), c(10,10)) > polys <- as.SpatialPolygons.GridTopology(grd) > summary(rbind(polys[1:10], polys[11:20], polys[21:30])) Object of class SpatialPolygons Coordinates: min max x 0.5 10.5 y 7.5 10.5 Is projected: NA proj4string : [NA] > plot(rbind(polys[1:10],polys[21:30])) > title("2 x 10 blocks -- test rbind on SpatialPolygons") > > l1 = cbind(c(1,2,3),c(3,2,2)) > l1a = cbind(l1[,1]+.05,l1[,2]+.05) > l2 = cbind(c(1,2,3),c(1,1.5,1)) > Sl1 = Line(l1) > Sl1a = Line(l1a) > Sl2 = Line(l2) > S1 = Lines(list(Sl1, Sl1a), ID="a") > S2 = Lines(list(Sl2), ID="b") > Sl = SpatialLines(list(S1,S2)) > > summary(as(polys, "SpatialLines")) Object of class SpatialLines Coordinates: min max x 0.5 10.5 y 0.5 10.5 Is projected: NA proj4string : [NA] > summary(as(Sl, "SpatialPoints")) Object of class SpatialPoints Coordinates: min max coords.x1 1 3.05 coords.x2 1 3.05 Is projected: NA proj4string : [NA] Number of points: 9 > summary(as(Sl, "SpatialPointsDataFrame")) Object of class SpatialPointsDataFrame Coordinates: min max coords.x1 1 3.05 coords.x2 1 3.05 Is projected: NA proj4string : [NA] Number of points: 9 Data attributes: Lines.NR Lines.ID Line.NR Min. :1.000 a:6 Min. :1.000 1st Qu.:1.000 b:3 1st Qu.:1.000 Median :1.000 Median :1.000 Mean :1.333 Mean :1.333 3rd Qu.:2.000 3rd Qu.:2.000 Max. :2.000 Max. :2.000 > SlDf = SpatialLinesDataFrame(Sl, data.frame(xx = c("foo", "bar")), match.ID = FALSE) > summary(as(SlDf, "SpatialPointsDataFrame")) Object of class SpatialPointsDataFrame Coordinates: min max coords.x1 1 3.05 coords.x2 1 3.05 Is projected: NA proj4string : [NA] Number of points: 9 Data attributes: xx Lines.NR Lines.ID Line.NR bar:3 Min. :1.000 a:6 Min. :1.000 foo:6 1st Qu.:1.000 b:3 1st Qu.:1.000 Median :1.000 Median :1.000 Mean :1.333 Mean :1.333 3rd Qu.:2.000 3rd Qu.:2.000 Max. :2.000 Max. :2.000 > > meuse[["xxx"]] = log(meuse$zinc) > summary(meuse) x y cadmium copper Min. :178605 Min. :329714 Min. : 0.200 Min. : 14.00 1st Qu.:179371 1st Qu.:330762 1st Qu.: 0.800 1st Qu.: 23.00 Median :179991 Median :331633 Median : 2.100 Median : 31.00 Mean :180005 Mean :331635 Mean : 3.246 Mean : 40.32 3rd Qu.:180630 3rd Qu.:332463 3rd Qu.: 3.850 3rd Qu.: 49.50 Max. :181390 Max. :333611 Max. :18.100 Max. :128.00 lead zinc elev dist Min. : 37.0 Min. : 113.0 Min. : 5.180 Min. :0.00000 1st Qu.: 72.5 1st Qu.: 198.0 1st Qu.: 7.546 1st Qu.:0.07569 Median :123.0 Median : 326.0 Median : 8.180 Median :0.21184 Mean :153.4 Mean : 469.7 Mean : 8.165 Mean :0.24002 3rd Qu.:207.0 3rd Qu.: 674.5 3rd Qu.: 8.955 3rd Qu.:0.36407 Max. :654.0 Max. :1839.0 Max. :10.520 Max. :0.88039 om ffreq soil lime landuse dist.m Min. : 1.000 1:84 1:97 0:111 W :50 Min. : 10.0 1st Qu.: 5.300 2:48 2:46 1: 44 Ah :39 1st Qu.: 80.0 Median : 6.900 3:23 3:12 Am :22 Median : 270.0 Mean : 7.478 Fw :10 Mean : 290.3 3rd Qu.: 9.000 Ab : 8 3rd Qu.: 450.0 Max. :17.000 (Other):25 Max. :1000.0 NA's :2 NA's : 1 xxx Min. :4.727 1st Qu.:5.288 Median :5.787 Mean :5.886 3rd Qu.:6.514 Max. :7.517 > meuse$xxy = log(meuse[["zinc"]]) > summary(meuse) x y cadmium copper Min. :178605 Min. :329714 Min. : 0.200 Min. : 14.00 1st Qu.:179371 1st Qu.:330762 1st Qu.: 0.800 1st Qu.: 23.00 Median :179991 Median :331633 Median : 2.100 Median : 31.00 Mean :180005 Mean :331635 Mean : 3.246 Mean : 40.32 3rd Qu.:180630 3rd Qu.:332463 3rd Qu.: 3.850 3rd Qu.: 49.50 Max. :181390 Max. :333611 Max. :18.100 Max. :128.00 lead zinc elev dist Min. : 37.0 Min. : 113.0 Min. : 5.180 Min. :0.00000 1st Qu.: 72.5 1st Qu.: 198.0 1st Qu.: 7.546 1st Qu.:0.07569 Median :123.0 Median : 326.0 Median : 8.180 Median :0.21184 Mean :153.4 Mean : 469.7 Mean : 8.165 Mean :0.24002 3rd Qu.:207.0 3rd Qu.: 674.5 3rd Qu.: 8.955 3rd Qu.:0.36407 Max. :654.0 Max. :1839.0 Max. :10.520 Max. :0.88039 om ffreq soil lime landuse dist.m Min. : 1.000 1:84 1:97 0:111 W :50 Min. : 10.0 1st Qu.: 5.300 2:48 2:46 1: 44 Ah :39 1st Qu.: 80.0 Median : 6.900 3:23 3:12 Am :22 Median : 270.0 Mean : 7.478 Fw :10 Mean : 290.3 3rd Qu.: 9.000 Ab : 8 3rd Qu.: 450.0 Max. :17.000 (Other):25 Max. :1000.0 NA's :2 NA's : 1 xxx xxy Min. :4.727 Min. :4.727 1st Qu.:5.288 1st Qu.:5.288 Median :5.787 Median :5.787 Mean :5.886 Mean :5.886 3rd Qu.:6.514 3rd Qu.:6.514 Max. :7.517 Max. :7.517 > > proc.time() user system elapsed 0.664 0.024 0.671 sp/tests/spDists.R0000644000175100001440000000067011635334426013642 0ustar hornikuserslibrary(sp) data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y coordinates(meuse.grid) = ~x+y x = coordinates(meuse) y = coordinates(meuse.grid) out = spDists(meuse,meuse.grid) out2 = as.matrix(dist(rbind(coordinates(meuse),coordinates(meuse.grid)))) out2 = out2[1:155,155+1:nrow(y)] # should be equal: sum(out2 - out) summary(as.vector(out2 - out)) out = spDists(meuse.grid,meuse) sum(out2 - t(out)) summary(as.vector(out2 - t(out))) sp/tests/point.in.polygon.R0000644000175100001440000000025211635334426015431 0ustar hornikuserslibrary(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/zerodist.R0000644000175100001440000000111411635334426014046 0ustar hornikuserslibrary(sp) data(meuse) # pick 10 rows n = 10 set.seed(1357) # fix seed for exact reproduction of test: ran10 = sample(nrow(meuse), size = n, replace = FALSE) meusedup = rbind(meuse, meuse[ran10, ]) coordinates(meusedup) = c("x", "y") zd = zerodist(meusedup) sum(abs(sort(zd[,1]) - sort(ran10))) # 0! zerodist(meusedup, unique.ID = TRUE) # remove the duplicate rows: meusedup2 = meusedup[-zd[,2], ] print(summary(meusedup2)) meusedup3 <- subset(meusedup, !(1:nrow(meusedup) %in% zd[,2])) print(summary(meusedup3)) dim(meuse) dim(meusedup2) dim(meusedup3) dim(remove.duplicates(meusedup)) sp/tests/fail1.R0000644000175100001440000001037512162132256013201 0ustar hornikuserslibrary(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")) try(CRS("+proj=lonlat")) sp/tests/base.Rout.save0000644000175100001440000004407111635334426014613 0ustar hornikusers R version 2.6.0 (2007-10-03) Copyright (C) 2007 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > 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: Min. 1st Qu. Median Mean 3rd Qu. Max. 183.0 272.0 346.5 489.2 581.5 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: Min. 1st Qu. Median Mean 3rd Qu. Max. 183.0 278.0 455.0 569.7 806.8 1141.0 > > data(meuse.grid) > coordinates(meuse.grid) = ~x+y > gridded(meuse.grid) = TRUE > plot(meuse.grid) > sp/tests/pass1.R0000644000175100001440000000342011635334426013234 0ustar hornikuserslibrary(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) sp/tests/zerodist.Rout.save0000644000175100001440000001216312270774632015544 0ustar hornikusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > # pick 10 rows > n = 10 > set.seed(1357) # fix seed for exact reproduction of test: > ran10 = sample(nrow(meuse), size = n, replace = FALSE) > meusedup = rbind(meuse, meuse[ran10, ]) > coordinates(meusedup) = c("x", "y") > zd = zerodist(meusedup) > sum(abs(sort(zd[,1]) - sort(ran10))) # 0! [1] 0 > zerodist(meusedup, unique.ID = TRUE) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 [91] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 [145] 145 146 147 148 149 150 151 152 153 154 155 100 91 148 141 25 64 97 [163] 71 5 92 > # remove the duplicate rows: > meusedup2 = meusedup[-zd[,2], ] > print(summary(meusedup2)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead zinc Min. : 0.200 Min. : 14.00 Min. : 37.0 Min. : 113.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 1st Qu.: 198.0 Median : 2.100 Median : 31.00 Median :123.0 Median : 326.0 Mean : 3.246 Mean : 40.32 Mean :153.4 Mean : 469.7 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 3rd Qu.: 674.5 Max. :18.100 Max. :128.00 Max. :654.0 Max. :1839.0 elev dist om ffreq soil lime Min. : 5.180 Min. :0.00000 Min. : 1.000 1:84 1:97 0:111 1st Qu.: 7.546 1st Qu.:0.07569 1st Qu.: 5.300 2:48 2:46 1: 44 Median : 8.180 Median :0.21184 Median : 6.900 3:23 3:12 Mean : 8.165 Mean :0.24002 Mean : 7.478 3rd Qu.: 8.955 3rd Qu.:0.36407 3rd Qu.: 9.000 Max. :10.520 Max. :0.88039 Max. :17.000 NA's :2 landuse dist.m W :50 Min. : 10.0 Ah :39 1st Qu.: 80.0 Am :22 Median : 270.0 Fw :10 Mean : 290.3 Ab : 8 3rd Qu.: 450.0 (Other):25 Max. :1000.0 NA's : 1 > meusedup3 <- subset(meusedup, !(1:nrow(meusedup) %in% zd[,2])) > print(summary(meusedup3)) Object of class SpatialPointsDataFrame Coordinates: min max x 178605 181390 y 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead zinc Min. : 0.200 Min. : 14.00 Min. : 37.0 Min. : 113.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 1st Qu.: 198.0 Median : 2.100 Median : 31.00 Median :123.0 Median : 326.0 Mean : 3.246 Mean : 40.32 Mean :153.4 Mean : 469.7 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 3rd Qu.: 674.5 Max. :18.100 Max. :128.00 Max. :654.0 Max. :1839.0 elev dist om ffreq soil lime Min. : 5.180 Min. :0.00000 Min. : 1.000 1:84 1:97 0:111 1st Qu.: 7.546 1st Qu.:0.07569 1st Qu.: 5.300 2:48 2:46 1: 44 Median : 8.180 Median :0.21184 Median : 6.900 3:23 3:12 Mean : 8.165 Mean :0.24002 Mean : 7.478 3rd Qu.: 8.955 3rd Qu.:0.36407 3rd Qu.: 9.000 Max. :10.520 Max. :0.88039 Max. :17.000 NA's :2 landuse dist.m W :50 Min. : 10.0 Ah :39 1st Qu.: 80.0 Am :22 Median : 270.0 Fw :10 Mean : 290.3 Ab : 8 3rd Qu.: 450.0 (Other):25 Max. :1000.0 NA's : 1 > dim(meuse) [1] 155 14 > dim(meusedup2) [1] 155 12 > dim(meusedup3) [1] 155 12 > dim(remove.duplicates(meusedup)) [1] 155 12 > > proc.time() user system elapsed 0.456 0.036 0.486 sp/tests/over.Rout.save0000644000175100001440000000630611635334426014653 0ustar hornikusers R version 2.13.0 (2011-04-13) Copyright (C) 2011 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: i486-pc-linux-gnu (32-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] 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] 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) [1] 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) [1] 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) [1] 1 4 5 5 > over(pts, spix) [1] 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] 1 2 3 4 5 6 > over(sg, spix) [1] 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] 1 2 3 4 5 6 > over(spix, spix) [1] 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 > sp/tests/fail1.Rout.save0000644000175100001440000002005412211064252014654 0ustar hornikusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > x = meuse > > 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(expr, envir, enclos) : 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) : nr of unique coords ID's (rownames) not equal to nr of data records > 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 > > 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")) Error in CRS("+proj=latlon") : northings must follow eastings: +proj=latlon > try(CRS("+proj=lonlat")) CRS arguments: +proj=longlat Warning message: In CRS("+proj=lonlat") : 'lonlat' changed to 'longlat': +proj=longlat > > proc.time() user system elapsed 0.876 0.036 0.906 sp/tests/grid.Rout.save0000644000175100001440000001460012061417711014612 0ustar hornikusers R version 2.15.2 (2012-10-26) -- "Trick or Treat" Copyright (C) 2012 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse.grid) > x = meuse.grid > coordinates(x) = c("x", "y") > gridded(x) = TRUE > gridded(x) [1] TRUE > image(x["dist"]) > > fullgrid(x) = TRUE > fullgrid(x) [1] TRUE > summary(x) Object of class SpatialGridDataFrame Coordinates: min max x 178440 181560 y 329600 333760 Is projected: NA proj4string : [NA] Grid attributes: cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 Data attributes: part.a part.b dist soil ffreq Min. :0.000 Min. :0.000 Min. :0.000 1 :1665 1 : 779 1st Qu.:0.000 1st Qu.:0.000 1st Qu.:0.119 2 :1084 2 :1335 Median :0.000 Median :1.000 Median :0.272 3 : 354 3 : 989 Mean :0.399 Mean :0.601 Mean :0.297 NA's:5009 NA's:5009 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:0.440 Max. :1.000 Max. :1.000 Max. :0.993 NA's :5009 NA's :5009 NA's :5009 > gridparameters(x) cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 > class(as(x, "matrix")) [1] "matrix" Warning message: In as.matrix.SpatialGridDataFrame(from) : as.matrix.SpatialPixelsDataFrame uses first column; pass subset or [] for other columns > > fullgrid(x) = FALSE > fullgrid(x) [1] FALSE > summary(x) Object of class SpatialPixelsDataFrame Coordinates: min max x 178440 181560 y 329600 333760 Is projected: NA proj4string : [NA] Number of points: 3103 Grid attributes: cellcentre.offset cellsize cells.dim x 178460 40 78 y 329620 40 104 Data attributes: part.a part.b dist soil ffreq Min. :0.0000 Min. :0.0000 Min. :0.0000 1:1665 1: 779 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.1193 2:1084 2:1335 Median :0.0000 Median :1.0000 Median :0.2715 3: 354 3: 989 Mean :0.3986 Mean :0.6014 Mean :0.2971 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.4402 Max. :1.0000 Max. :1.0000 Max. :0.9926 > class(as(x, "matrix")) [1] "matrix" Warning message: In as.matrix.SpatialGridDataFrame(from) : as.matrix.SpatialPixelsDataFrame uses first column; pass 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: Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 1.00 2.75 4.50 4.75 6.50 9.00 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.816 0.048 0.849 sp/tests/base.R0000644000175100001440000000170711635334426013125 0ustar hornikuserslibrary(sp) data(meuse) x = meuse[1:10, ] # limit the output coordinates(x) = c("x", "y") # names bbox(x) is.projected(x) dimensions(x) x x = meuse[1:10, ] coordinates(x) = c(1, 2) # coordinate column numbers x x = meuse[1:10, ] coordinates(x) = ~x+y # coordinates formula x x = meuse[1:10, ] coordinates(x) = meuse[1:10, c("x", "y")] # coords, as data.frame x x = meuse[1:10, ] coordinates(x) = as.matrix(meuse[1:10, c("x", "y")]) # coords, as matrix x x = meuse[1:20,] coordinates(x) = c("x", "y") # coordinate column names print(summary(x)) x[1:10] # first 10 columns x[, 1:10] # first 10 columns x[1:10,] # rows 1-10 x["zinc"] # column zinc + coords x[, "zinc"] # idem x[1:10, "zinc"] # idem x[1:10, c("zinc", "cadmium")] # idem x[["zinc"]] x[["lnzinc"]] <- log(x[["zinc"]]) x print(summary(x[1:10, "zinc"])) # check bbox print(summary(x["zinc"])) # compare bbox data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE plot(meuse.grid) sp/tests/sel.Rout.save0000644000175100001440000000715711635334426014470 0ustar hornikusers R version 2.12.0 (2010-10-15) Copyright (C) 2010 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: i486-pc-linux-gnu (32-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > x = c(0.5, 1.5, 0.5, 1.5, 1.6) > y = c(1.5, 1.5, 0.5, 0.5, 0.5) > xy = cbind(x,y) > dimnames(xy)[[1]] = c("a", "b", "c", "d", "e") > pts = SpatialPoints(xy) > z = data.frame(z1 = 1:5, z2=5:1, f = c("a", "a", "b", "b", "b")) > row.names(z) = c("a", "b", "c", "d", "e") > ptsdf = SpatialPointsDataFrame(pts, z) > > xpol = c(0,1,1,0,0) > ypol = c(0,0,1,1,0) > pol = SpatialPolygons(list( + Polygons(list(Polygon(cbind(xpol-1,ypol))), ID="x9"), + Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), + Polygons(list(Polygon(cbind(xpol,ypol-1))), ID="x3"), + Polygons(list(Polygon(cbind(xpol+1,ypol))), ID="x4") + )) > z = data.frame(z = c(10, 15, 25, 3), zz = 1:4, f = c("z", "q", "r", "z"), + row.names = c("x9", "x2", "x3", "x4")) > poldf = SpatialPolygonsDataFrame(pol, z) > plot(pol, xlim = c(-1.5, 2)) > points(pts, col='red') > > over(pts, pol) [1] 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) [1] 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] 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] 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) [1] 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) [1] 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) [1] 1 2 4 5 5 > over(pts, spix) [1] 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) > sp/tests/nc.Rout.save0000644000175100001440000000212411635334426014272 0ustar hornikusers R : Copyright 2005, The R Foundation for Statistical Computing Version 2.1.1 (2005-06-20), ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for a HTML browser interface to help. Type 'q()' to quit R. > # library(sp) > # library(maptools) > # data(ncshp) > # nc1 <- as.SpatialPolygons.Shapes(nc.shp$Shapes, as.character(nc.shp$att.data$FIPS)) > # df <- nc.shp$att.data > # rownames(df) <- as.character(nc.shp$att.data$FIPS) > # identical(rownames(df), sapply(slot(nc1, "polygons"), function(i) slot(i, "ID"))) > # nc <- SpatialPolygonsDataFrame(nc1, df) > # > # nc$X = factor(sample(1:5,100,replace=T),labels=letters[1:5]) > # nc$Y = factor(sample(1:5,100,replace=T),labels=letters[6:10]) > # spplot(nc, c("X","Y")) > sp/tests/spplot.Rout.save0000644000175100001440000000270311643624005015210 0ustar hornikusers R version 2.13.0 (2011-04-13) Copyright (C) 2011 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: i486-pc-linux-gnu (32-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > xy = expand.grid(x = 1:4, y = 1:4) > xy.sp = SpatialPoints(xy) > gridded(xy.sp) = T > # deselect 1 row and 2 col: > tst = xy.sp[-c(2,6,10,14,9,11,12)] > tst Object of class SpatialPixels Grid topology: cellcentre.offset cellsize cells.dim x 1 1 4 y 1 1 4 SpatialPoints: x y [1,] 1 1 [2,] 3 1 [3,] 4 1 [4,] 1 2 [5,] 3 2 [6,] 4 2 [7,] 1 4 [8,] 3 4 [9,] 4 4 Coordinate Reference System (CRS) arguments: NA > # convert to SpatialPixelsDataFrame: > tst = SpatialPixelsDataFrame(tst, data.frame(xx = rnorm(9))) Warning messages: 1: In points2grid(points, tolerance, round) : grid has empty column/rows in dimension 1 2: In points2grid(points, tolerance, round) : grid has empty column/rows in dimension 2 > spplot(tst["xx"], main = "empty row + col") > sp/tests/sp1.Rout.save0000644000175100001440000002043312202475465014400 0ustar hornikusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > x = meuse > nm <- names(meuse) > # rename to non-default names: > nm[1] <- "xcoord" > nm[2] <- "ycoord" > names(x) <- nm > # change column order > x = x[ , c(3:14,2,1)] > coordinates(x) <- c("xcoord", "ycoord") # columns named xcoord and ycoord > coordinates(x)[1:10,] xcoord ycoord 1 181072 333611 2 181025 333558 3 181165 333537 4 181298 333484 5 181307 333330 6 181390 333260 7 181165 333370 8 181027 333363 9 181060 333231 10 181232 333168 > meuse[1:10,] x y cadmium copper lead zinc elev dist om ffreq soil lime 1 181072 333611 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 1 2 181025 333558 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 1 3 181165 333537 6.5 68 199 640 7.800 0.10302900 13.0 1 1 1 4 181298 333484 2.6 81 116 257 7.655 0.19009400 8.0 1 2 0 5 181307 333330 2.8 48 117 269 7.480 0.27709000 8.7 1 2 0 6 181390 333260 3.0 61 137 281 7.791 0.36406700 7.8 1 2 0 7 181165 333370 3.2 31 132 346 8.217 0.19009400 9.2 1 2 0 8 181027 333363 2.8 29 150 406 8.490 0.09215160 9.5 1 1 0 9 181060 333231 2.4 37 133 347 8.668 0.18461400 10.6 1 1 0 10 181232 333168 1.6 24 80 183 9.049 0.30970200 6.3 1 2 0 landuse dist.m 1 Ah 50 2 Ah 30 3 Ah 150 4 Ga 270 5 Ah 380 6 Ga 470 7 Ah 240 8 Ab 120 9 Ab 240 10 W 420 > class(x) [1] "SpatialPointsDataFrame" attr(,"package") [1] "sp" > sum = summary(x) > print(sum) Object of class SpatialPointsDataFrame Coordinates: min max xcoord 178605 181390 ycoord 329714 333611 Is projected: NA proj4string : [NA] Number of points: 155 Data attributes: cadmium copper lead zinc Min. : 0.200 Min. : 14.00 Min. : 37.0 Min. : 113.0 1st Qu.: 0.800 1st Qu.: 23.00 1st Qu.: 72.5 1st Qu.: 198.0 Median : 2.100 Median : 31.00 Median :123.0 Median : 326.0 Mean : 3.246 Mean : 40.32 Mean :153.4 Mean : 469.7 3rd Qu.: 3.850 3rd Qu.: 49.50 3rd Qu.:207.0 3rd Qu.: 674.5 Max. :18.100 Max. :128.00 Max. :654.0 Max. :1839.0 elev dist om ffreq soil lime Min. : 5.180 Min. :0.00000 Min. : 1.000 1:84 1:97 0:111 1st Qu.: 7.546 1st Qu.:0.07569 1st Qu.: 5.300 2:48 2:46 1: 44 Median : 8.180 Median :0.21184 Median : 6.900 3:23 3:12 Mean : 8.165 Mean :0.24002 Mean : 7.478 3rd Qu.: 8.955 3rd Qu.:0.36407 3rd Qu.: 9.000 Max. :10.520 Max. :0.88039 Max. :17.000 NA's :2 landuse dist.m W :50 Min. : 10.0 Ah :39 1st Qu.: 80.0 Am :22 Median : 270.0 Fw :10 Mean : 290.3 Ab : 8 3rd Qu.: 450.0 (Other):25 Max. :1000.0 NA's : 1 > coordinates(x) xcoord ycoord 1 181072 333611 2 181025 333558 3 181165 333537 4 181298 333484 5 181307 333330 6 181390 333260 7 181165 333370 8 181027 333363 9 181060 333231 10 181232 333168 11 181191 333115 12 181032 333031 13 180874 333339 14 180969 333252 15 181011 333161 16 180830 333246 17 180763 333104 18 180694 332972 19 180625 332847 20 180555 332707 21 180642 332708 22 180704 332717 23 180704 332664 24 181153 332925 25 181147 332823 26 181167 332778 27 181008 332777 28 180973 332687 29 180916 332753 30 181352 332946 31 181133 332570 32 180878 332489 33 180829 332450 34 180954 332399 35 180956 332318 37 180710 332330 38 180632 332445 39 180530 332538 40 180478 332578 41 180383 332476 42 180494 332330 43 180561 332193 44 180451 332175 45 180410 332031 46 180355 332299 47 180292 332157 48 180283 332014 49 180282 331861 50 180270 331707 51 180199 331591 52 180135 331552 53 180237 332351 54 180103 332297 55 179973 332255 56 179826 332217 57 179687 332161 58 179792 332035 59 179902 332113 60 180100 332213 61 179604 332059 62 179526 331936 63 179495 331770 64 179489 331633 65 179414 331494 66 179334 331366 67 179255 331264 69 179470 331125 75 179692 330933 76 179852 330801 79 179140 330955 80 179128 330867 81 179065 330864 82 179007 330727 83 179110 330758 84 179032 330645 85 179095 330636 86 179058 330510 87 178810 330666 88 178912 330779 89 178981 330924 90 179076 331005 123 180151 330353 160 179211 331175 163 181118 333214 70 179474 331304 71 179559 331423 91 179022 330873 92 178953 330742 93 178875 330516 94 178803 330349 95 179029 330394 96 178605 330406 97 178701 330557 98 179547 330245 99 179301 330179 100 179405 330567 101 179462 330766 102 179293 330797 103 179180 330710 104 179206 330398 105 179618 330458 106 179782 330540 108 179980 330773 109 180067 331185 110 180162 331387 111 180451 331473 112 180328 331158 113 180276 330963 114 180114 330803 115 179881 330912 116 179774 330921 117 179657 331150 118 179731 331245 119 179717 331441 120 179446 331422 121 179524 331565 122 179644 331730 124 180321 330366 125 180162 331837 126 180029 331720 127 179797 331919 128 179642 331955 129 179849 332142 130 180265 332297 131 180107 332101 132 180462 331947 133 180478 331822 134 180347 331700 135 180862 333116 136 180700 332882 161 180201 331160 162 180173 331923 137 180923 332874 138 180467 331694 140 179917 331325 141 179822 331242 142 179991 331069 143 179120 330578 144 179034 330561 145 179085 330433 146 179236 330046 147 179456 330072 148 179550 329940 149 179445 329807 150 179337 329870 151 179245 329714 152 179024 329733 153 178786 329822 154 179135 329890 155 179030 330082 156 179184 330182 157 179085 330292 158 178875 330311 159 179466 330381 164 180627 330190 > > x <- as.data.frame(x) > class(x) [1] "data.frame" > > x[1:10, c("xcoord", "ycoord")] xcoord ycoord 1 181072 333611 2 181025 333558 3 181165 333537 4 181298 333484 5 181307 333330 6 181390 333260 7 181165 333370 8 181027 333363 9 181060 333231 10 181232 333168 > > x = meuse[1:4,] > coordinates(x) = c(1,2) > # row 1,2; cols 1:10 > x[1:2,1:10] coordinates cadmium copper lead zinc elev dist om ffreq soil 1 (181072, 333611) 11.7 85 299 1022 7.909 0.00135803 13.6 1 1 2 (181025, 333558) 8.6 81 277 1141 6.983 0.01222430 14.0 1 1 lime 1 1 2 1 > # row 2, coord+col 9,10 > x[2,9:10] coordinates soil lime 2 (181025, 333558) 1 1 > # coordinates, col 9+10 > x[,9:10] coordinates soil lime 1 (181072, 333611) 1 1 2 (181025, 333558) 1 1 3 (181165, 333537) 1 1 4 (181298, 333484) 2 0 > # coordinates + col 9: > x[,9] coordinates soil 1 (181072, 333611) 1 2 (181025, 333558) 1 3 (181165, 333537) 1 4 (181298, 333484) 2 > # coordinates + zinc column: > x["zinc"] coordinates zinc 1 (181072, 333611) 1022 2 (181025, 333558) 1141 3 (181165, 333537) 640 4 (181298, 333484) 257 > # second row, coordinates + zinc > x[2,"zinc"] coordinates zinc 2 (181025, 333558) 1141 > # select; re-orders: > x[c("zinc","copper")] coordinates zinc copper 1 (181072, 333611) 1022 85 2 (181025, 333558) 1141 81 3 (181165, 333537) 640 68 4 (181298, 333484) 257 81 > # back as data.frame > as.data.frame(x)[1:3, c("zinc","copper","x", "y")] zinc copper x y 1 1022 85 181072 333611 2 1141 81 181025 333558 3 640 68 181165 333537 > > proc.time() user system elapsed 0.460 0.052 0.506 sp/tests/spDists.Rout.save0000644000175100001440000000237311635334426015331 0ustar hornikusers R version 2.10.0 (2009-10-26) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(sp) > data(meuse) > data(meuse.grid) > coordinates(meuse) = ~x+y > coordinates(meuse.grid) = ~x+y > x = coordinates(meuse) > y = coordinates(meuse.grid) > out = spDists(meuse,meuse.grid) > out2 = as.matrix(dist(rbind(coordinates(meuse),coordinates(meuse.grid)))) > out2 = out2[1:155,155+1:nrow(y)] > # should be equal: > sum(out2 - out) [1] 0 > summary(as.vector(out2 - out)) Min. 1st Qu. Median Mean 3rd Qu. Max. 0 0 0 0 0 0 > > out = spDists(meuse.grid,meuse) > sum(out2 - t(out)) [1] 0 > summary(as.vector(out2 - t(out))) Min. 1st Qu. Median Mean 3rd Qu. Max. 0 0 0 0 0 0 > sp/tests/grid.R0000644000175100001440000000233611635414454013137 0ustar hornikuserslibrary(sp) data(meuse.grid) x = meuse.grid coordinates(x) = c("x", "y") gridded(x) = TRUE gridded(x) image(x["dist"]) fullgrid(x) = TRUE fullgrid(x) summary(x) gridparameters(x) class(as(x, "matrix")) fullgrid(x) = FALSE fullgrid(x) summary(x) class(as(x, "matrix")) gridparameters(x) df = data.frame(z = c(1:6,NA,8,9), xc = c(1,1,1,2,2,2,3,3,3), yc = c(rep(c(0, 1.5, 3),3))) coordinates(df) = ~xc+yc gridded(df) = TRUE gridparameters(df) as(df, "matrix") # get grid topology: grd = points2grid(as(df, "SpatialPoints"), 1e-31) grd getGridIndex(coordinates(df), grd) g = SpatialGrid(grid = grd) fullgrid(g) fullgrid(g) = TRUE class(g) # the next one has to fail: fullgrid(g) <- FALSE class(g) print(summary(df)) image(df["z"]) as.image.SpatialGridDataFrame(df) as.image.SpatialGridDataFrame(df["z"]) coordinatevalues(getGridTopology(df)) as.data.frame(df) fullgrid(df) = TRUE as.data.frame(df) fullgrid(df) = FALSE as.data.frame(df) fullgrid(df) = TRUE fullgrid(df) = FALSE as.data.frame(df) df = as.data.frame(df) set.seed(133331) df$xc = df$xc + rep(.001*rnorm(3), 3)[1:8] df.sp = SpatialPoints(df[c("xc", "yc")]) df.grd = SpatialPixels(df.sp, tolerance = .01) df.grd[1:4,,tolerance=.01,drop=TRUE] df.grd[1:4,,tolerance=.01] sp/tests/sp1.R0000644000175100001440000000141011635334426012705 0ustar hornikuserslibrary(sp) data(meuse) x = meuse nm <- names(meuse) # rename to non-default names: nm[1] <- "xcoord" nm[2] <- "ycoord" names(x) <- nm # change column order x = x[ , c(3:14,2,1)] coordinates(x) <- c("xcoord", "ycoord") # columns named xcoord and ycoord coordinates(x)[1:10,] meuse[1:10,] class(x) sum = summary(x) print(sum) coordinates(x) x <- as.data.frame(x) class(x) x[1:10, c("xcoord", "ycoord")] x = meuse[1:4,] coordinates(x) = c(1,2) # row 1,2; cols 1:10 x[1:2,1:10] # row 2, coord+col 9,10 x[2,9:10] # coordinates, col 9+10 x[,9:10] # coordinates + col 9: x[,9] # coordinates + zinc column: x["zinc"] # second row, coordinates + zinc x[2,"zinc"] # select; re-orders: x[c("zinc","copper")] # back as data.frame as.data.frame(x)[1:3, c("zinc","copper","x", "y")] sp/tests/spplot.R0000644000175100001440000000045511635334426013533 0ustar hornikuserslibrary(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/sel.R0000644000175100001440000000336511635334426013000 0ustar hornikuserslibrary(sp) x = c(0.5, 1.5, 0.5, 1.5, 1.6) y = c(1.5, 1.5, 0.5, 0.5, 0.5) xy = cbind(x,y) dimnames(xy)[[1]] = c("a", "b", "c", "d", "e") pts = SpatialPoints(xy) z = data.frame(z1 = 1:5, z2=5:1, f = c("a", "a", "b", "b", "b")) row.names(z) = c("a", "b", "c", "d", "e") ptsdf = SpatialPointsDataFrame(pts, z) xpol = c(0,1,1,0,0) ypol = c(0,0,1,1,0) pol = SpatialPolygons(list( Polygons(list(Polygon(cbind(xpol-1,ypol))), ID="x9"), Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"), Polygons(list(Polygon(cbind(xpol,ypol-1))), ID="x3"), Polygons(list(Polygon(cbind(xpol+1,ypol))), ID="x4") )) z = data.frame(z = c(10, 15, 25, 3), zz = 1:4, f = c("z", "q", "r", "z"), row.names = c("x9", "x2", "x3", "x4")) poldf = SpatialPolygonsDataFrame(pol, z) plot(pol, xlim = c(-1.5, 2)) points(pts, col='red') over(pts, pol) over(pts, poldf) over(pts, poldf[1:2], fn = mean) #rbind(poldf, over(pts, poldf[1:2], fn = mean)) over(pol, pts) over(pol, ptsdf) over(pol, ptsdf[1:2], fn = mean) pts[pol] points(pts[pol], col='green', pch=16, cex=.8) summary(pol[pts]) plot(pol[pts], border='blue', add=TRUE) gt = GridTopology(c(.5,.5), c(1,1), c(3,2)) sg = SpatialGrid(gt) df6 = data.frame(z = 6:1, f = c("a", "a", "b", "b", "c", "c")) sgdf = SpatialGridDataFrame(gt, df6) over(sg, pol) over(sg, poldf) over(sg, poldf[1:2]) spix = as(sg, "SpatialPixels") spixdf = as(sgdf, "SpatialPixelsDataFrame") over(spix, pol) over(spix, poldf) over(spix, poldf[1:2]) over(pol, sg) over(pol, sgdf) over(pol, sgdf[1], fn = mean) over(pol, spix) over(pol, spixdf) over(pol, spixdf[1], fn = mean) over(pts, sg) over(pts, spix) over(pts, sgdf) over(pts, spixdf) #over(pts, sg, returnList=TRUE) #over(pts, spix, returnList=TRUE) #over(pts, sgdf, returnList=TRUE) #over(pts, spixdf, returnList=TRUE) sp/src/0000755000175100001440000000000012321302443011473 5ustar hornikuserssp/src/pip2.c0000644000175100001440000000464612321302443012523 0ustar hornikusers# 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(SEXP lb, SEXP px, SEXP py); SEXP tList(SEXP nl, SEXP m); SEXP tList(SEXP nl, SEXP m0) { int n=length(nl), m=INTEGER_POINTER(m0)[0], i, ii, j, jj, *k, pc=0; SEXP res; PROTECT(res = NEW_LIST(m)); pc++; k = (int *) R_alloc((size_t) m, sizeof(int)); for (j=0; j 0) { for (j=0; j= m) error("invalid indices"); k[jj]++; } } } for (j=0; j 0) { for (j=0; j= low && x <= up) return(1); else return(0); } int pipbb(double pt1, double pt2, double *bbs) { if ((between(pt1, bbs[0], bbs[2]) == 1) && (between(pt2, bbs[1], bbs[3]) == 1)) return(1); else return(0); } sp/src/sp.h0000644000175100001440000000607212321302443012273 0ustar hornikusers#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 */ #include #ifdef USING_R #include /* RSB 091203 */ #include #define R_OFFSET 1 /* */ #include #include #else # if (!defined(SPLUS_VERSION) || SPLUS_VERSION < 6000) # error("no SPLUS_VERSION >= 6.0") # endif # define SEXP s_object * # define PROTECT(x) x # define UNPROTECT(x) # define R_UNIFORM unif_rand(S_evaluator) # define R_NORMAL norm_rand(S_evaluator) # define RANDIN seed_in((long *) NULL, S_evaluator) # define RANDOUT seed_out((long *) NULL, S_evaluator) # define Rprintf printf #endif /* 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_lengths(double *u, double *v, int *n, double *lengths, int *lonlat); SEXP sp_zerodist(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat); SEXP sp_duplicates(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat); 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)( tPointd a, tPointd b, tPointd c ); void SP_PREFIX(FindCG)( int n, tPointd *P, tPointd CG, double *Areasum2 ); void SP_PREFIX(Centroid3)( tPointd p1, tPointd p2, tPointd p3, tPointd c ); void SP_PREFIX(spRFindCG_c)( SEXP n, 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)(SEXP coords, SEXP n, SEXP hole); SEXP SP_PREFIX(Polygons_c)(SEXP pls, SEXP ID); SEXP SP_PREFIX(SpatialPolygons_c)(SEXP pls, SEXP pO, SEXP p4s); SEXP SP_PREFIX(bboxCalcR_c)(SEXP pls); SEXP SP_PREFIX(Polygon_validate_c)(SEXP obj); SEXP SP_PREFIX(Polygons_validate_c)(SEXP obj); SEXP SP_PREFIX(SpatialPolygons_validate_c)(SEXP obj); SEXP SP_PREFIX(SpatialPolygons_getIDs_c)(SEXP obj); SEXP SP_PREFIX(SpatialPolygons_plotOrder_c)(SEXP pls); SEXP SP_PREFIX(comment2comm)(SEXP obj); #endif /* remember to touch local_stubs.c */ sp/src/gcdist.c0000644000175100001440000000505012321302443013114 0ustar hornikusers#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 2) { xc = (NUMERIC_POINTER(coords)[0] + NUMERIC_POINTER(coords)[(nn-1)])/2.0; yc = (NUMERIC_POINTER(coords)[nn] + NUMERIC_POINTER(coords)[nn+(nn-1)])/2.0; } } } PROTECT(SPans = NEW_OBJECT(MAKE_CLASS("Polygon"))); pc++; PROTECT(ringDir = NEW_INTEGER(1)); pc++; INTEGER_POINTER(ringDir)[0] = (area > 0.0) ? -1 : 1; // -1 cw hole, 1 ccw not-hole /* RSB 100126 fixing hole assumption thanks to Javier Munoz for report */ if (INTEGER_POINTER(ihole)[0] == NA_INTEGER) { // trust ring direction if (INTEGER_POINTER(ringDir)[0] == 1) { INTEGER_POINTER(ihole)[0] = 0; } else if (INTEGER_POINTER(ringDir)[0] == -1) { INTEGER_POINTER(ihole)[0] = 1; } } else { // trust hole if (INTEGER_POINTER(ihole)[0] == 1 && INTEGER_POINTER(ringDir)[0] == 1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = -1; } if (INTEGER_POINTER(ihole)[0] == 0 && INTEGER_POINTER(ringDir)[0] == -1) { rev = TRUE; INTEGER_POINTER(ringDir)[0] = 1; } } PROTECT(hole = NEW_LOGICAL(1)); pc++; if (INTEGER_POINTER(ihole)[0] == 1) LOGICAL_POINTER(hole)[0] = TRUE; else LOGICAL_POINTER(hole)[0] = FALSE; if (rev) { x = (double *) R_alloc((size_t) nn, sizeof(double)); y = (double *) R_alloc((size_t) nn, sizeof(double)); for (i=0; i 1) { for (i=0; i UX) UX = x; if (y > UY) UY = y; if (x < LX) LX = x; if (y < LY) LY = y; } } } PROTECT(ans = NEW_NUMERIC(4)); pc++; NUMERIC_POINTER(ans)[0] = LX; NUMERIC_POINTER(ans)[1] = LY; NUMERIC_POINTER(ans)[2] = UX; NUMERIC_POINTER(ans)[3] = UY; PROTECT(dim = NEW_INTEGER(2)); pc++; INTEGER_POINTER(dim)[0] = 2; INTEGER_POINTER(dim)[1] = 2; setAttrib(ans, R_DimSymbol, dim); PROTECT(dimnames = NEW_LIST(2)); pc++; SET_VECTOR_ELT(dimnames, 0, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 0, COPY_TO_USER_STRING("x")); SET_STRING_ELT(VECTOR_ELT(dimnames, 0), 1, COPY_TO_USER_STRING("y")); SET_VECTOR_ELT(dimnames, 1, NEW_CHARACTER(2)); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 0, COPY_TO_USER_STRING("min")); SET_STRING_ELT(VECTOR_ELT(dimnames, 1), 1, COPY_TO_USER_STRING("max")); setAttrib(ans, R_DimNamesSymbol, dimnames); UNPROTECT(pc); return(ans); } void SP_PREFIX(spRFindCG_c)( SEXP n, SEXP coords, double *xc, double *yc, double *area ) { int i, nn; tPointd *P; tPointd CG; double Areasum2; nn = INTEGER_POINTER(n)[0]; P = (tPointd *) R_alloc((size_t) nn, sizeof(tPointd)); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[0], (size_t) nss[0]); s[nss[0]] = '\0'; c[0] = atoi(s); for (i=0; i 15) error("comment2comm: buffer overflow"); strncpy(s, &buf[(nss[i]+1)], (size_t) k); s[k] = '\0'; c[i+1] = atoi(s); } for (i=0, k=0; i<(ns+1); i++) if (c[i] == 0) k++; PROTECT(ans = NEW_LIST((k))); pc++; co = (int *) R_alloc((size_t) k, sizeof(int)); coo = (int *) R_alloc((size_t) k, sizeof(int)); for (i=0; i 1) { for (j=0; j<(ns+1); j++) if (c[j] == coo[i]) INTEGER_POINTER(VECTOR_ELT(ans, i))[jj++] = j + R_OFFSET; } } UNPROTECT(pc); return(ans); } void SP_PREFIX(comm2comment)(char *buf, int bufsiz, int *comm, int nps) { char cbuf[15]; int i, nc, nc1; nc = (int) (ceil(log10(nps)+1.0)+1.0); nc1 = (nc*nps)+1; if (bufsiz < nc1) error("comm2comment: buffer overflow"); sprintf(buf, "%d", comm[0]); for (i=1; i= bufsiz) error("comm2comment: buffer overflow"); strcat(buf, cbuf); } strcat(buf, "\0"); return; } /* remember to touch local_stubs.c */ sp/src/init.c0000644000175100001440000000350112321302443012601 0ustar hornikusers#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_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, 4}, {"sp_duplicates", (DL_FUNC) &sp_duplicates, 4}, {"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}, {NULL, NULL, 0} }; void #ifdef HAVE_VISIBILITY_ATTRIBUTE __attribute__ ((visibility ("default"))) #endif R_init_sp(DllInfo *dll) { R_registerRoutines(dll, CEntries, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } sp/src/zerodist.c0000644000175100001440000000565512321302443013515 0ustar hornikusers#define USING_R 1 #include "S.h" #ifdef USING_R # include # include # define S_EVALUATOR #endif #include "sp.h" SEXP sp_zerodist(SEXP pp, SEXP pncol, SEXP zero, SEXP lonlat) { unsigned int i, j, k, ncol, nrow, nzero = 0, *which = NULL, ll; double **x, *xi, *xj, d, dist, zerodist2; SEXP ret = NULL; S_EVALUATOR ncol = INTEGER_POINTER(pncol)[0]; ll = INTEGER_POINTER(lonlat)[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++) { xi = x[i]; for (j = 0; j < i; j++) { xj = x[j]; 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; } } if (dist <= zerodist2) { 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) { unsigned int i, j, k, ncol, nrow, ll, next; double **x, *xi, *xj, d, dist, zerodist2; SEXP ret = NULL; S_EVALUATOR ncol = INTEGER_POINTER(pncol)[0]; ll = INTEGER_POINTER(lonlat)[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++) { xi = x[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 */ xj = x[j]; 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; } } if (dist <= zerodist2) { /* match! */ INTEGER_POINTER(ret)[i] = j; next = 1; /* break for loop */ } } } /* for j */ R_CheckUserInterrupt(); } free(x); UNPROTECT(1); return(ret); } sp/src/pip.c0000644000175100001440000001227412321302443012435 0ustar hornikusers#define USING_R 1 #include "S.h" #ifdef USING_R # include # include /* # include */ # define R_UNIFORM unif_rand() # define R_NORMAL norm_rand() # define RANDIN seed_in((long *) NULL) # define RANDOUT seed_out((long *) NULL) # define S_EVALUATOR #endif #include "sp.h" SEXP R_point_in_polygon_sp(SEXP px, SEXP py, SEXP polx, SEXP poly) { int i; PLOT_POINT p; POLYGON pol; SEXP ret; S_EVALUATOR 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))); 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(1); return(ret); } void setup_poly_minmax(POLYGON *pl) { int i, n=pl->lines; double minx,maxx,miny,maxy; minx=miny=DBL_MAX; maxx=maxy=-DBL_MAX; for (i=0;ip[i].x); miny = MIN(miny, pl->p[i].y); maxx = MAX(maxx, pl->p[i].x); maxy = MAX(maxy, pl->p[i].y); } pl->mbr.min.x = minx; pl->mbr.min.y = miny; pl->mbr.max.x = maxx; pl->mbr.max.y = maxy; } /* This code is described in "Computational Geometry in C" (Second Edition), Chapter 7. It is not written to be comprehensible without the explanation in that book. For each query point q, InPoly returns one of four char's: i : q is strictly interior to P o : q is strictly exterior to P v : q is a vertex of P e : q lies on the relative interior of an edge of P These represent mutually exclusive categories. For an explanation of the code, see Chapter 7 of "Computational Geometry in C (Second Edition)." Written by Joseph O'Rourke, contributions by Min Xu, June 1997. Questions to orourke@cs.smith.edu. -------------------------------------------------------------------- This code is Copyright 1998 by Joseph O'Rourke. It may be freely redistributed in its entirety provided that this copyright notice is not removed. -------------------------------------------------------------------- */ /* InPoly returns a char in {i,o,v,e}. See above for definitions. */ char InPoly(PLOT_POINT q, POLYGON *Poly) { int n = Poly->lines; PLOT_POINT *P=Poly->p; int i, i1; /* point index; i1 = i-1 mod n */ double x; /* x intersection of e with ray */ double xx=q.x, yy=q.y; int Rcross = 0; /* number of right edge/ray crossings */ int Lcross = 0; /* number of left edge/ray crossings */ /* For each edge e=(i-1,i), see if crosses ray. */ for( i = 0; i < n; i++ ) { /* First see if q=(0,0) is a vertex. */ if (( P[i].x - xx )==0 &&( P[i].y - yy )==0 ) return 'v'; i1 = ( i + n - 1 ) % n; /* printf("e=(%d,%d)\t", i1, i); */ /* if e "straddles" the x-axis... */ /* The commented-out statement is logically equivalent to the one following. */ /* if( ( ( P[i].y > 0 ) && ( P[i1].y <= 0 ) ) || ( ( P[i1].y > 0 ) && ( P[i] .y <= 0 ) ) ) { }*/ if( (( P[i].y - yy ) > 0 ) != (( P[i1].y - yy ) > 0 ) ) { /* e straddles ray, so compute intersection with ray. */ x = (( P[i].x - xx) *( P[i1].y - yy ) -( P[i1].x - xx ) *( P[i].y - yy )) / (P[i1].y - P[i].y ); /* printf("straddles: x = %g\t", x); */ /* crosses ray if strictly positive intersection. */ if (x > 0) Rcross++; } /* printf("Right cross=%d\t", Rcross); */ /* if e straddles the x-axis when reversed... */ /* if( ( ( P[i] .y < 0 ) && ( P[i1].y >= 0 ) ) || ( ( P[i1].y < 0 ) && ( P[i] .y >= 0 ) ) ) { }*/ if ( (( P[i].y - yy ) < 0 ) != (( P[i1].y - yy ) < 0 ) ) { /* e straddles ray, so compute intersection with ray. */ x = (( P[i].x - xx) *( P[i1].y - yy ) -( P[i1].x - xx ) *( P[i].y - yy )) / (P[i1].y - P[i].y); /* printf("straddles: x = %g\t", x); */ /* crosses ray if strictly positive intersection. */ if (x < 0) Lcross++; } /* printf("Left cross=%d\n", Lcross); */ } /* q on the edge if left and right cross are not the same parity. */ if( ( Rcross % 2 ) != (Lcross % 2 ) ) return 'e'; /* q inside iff an odd number of crossings. */ if( (Rcross % 2) == 1 ) return 'i'; else return 'o'; } sp/src/surfaceArea.c0000644000175100001440000000446112321302443014065 0ustar hornikusers#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/NAMESPACE0000644000175100001440000001616612271535065012151 0ustar hornikusersuseDynLib(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 ) import(methods) importFrom(graphics, plot, hist) importFrom(stats, aggregate) import(utils) # stack, to be changed later (2.5.0?) into import(lattice) importFrom(grid, grid.polygon, grid.path, grid.rect, polygonGrob, gpar, grid.layout, unit, frameGrob, placeGrob, rectGrob, grid.locator, grid.raster) 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, coordinatevalues, dimensions, Spatial, SpatialPoints, SpatialPointsDataFrame, Line, Lines, SpatialLines, SpatialLinesDataFrame, as.SpatialLines.SLDF, gridat, LineLength, LinesLength, SpatialLinesLengths, layout.scale.bar, layout.north.arrow, sp.theme, mapLegendGrob, spplot.key, panel.gridplot, panel.polygonsplot, panel.pointsplot, sp.polygons, sp.text, sp.points, sp.lines, sp.grid, SpatialPolygonsRescale, spplot.locator, sp.panel.layout, degreeLabelsEW, degreeLabelsNS, longlat.scales, bbexpand, as.image.SpatialGridDataFrame, image2Grid, imageScale, gridparameters, SpatialPixels, SpatialPixelsDataFrame, SpatialGrid, SpatialGridDataFrame, GridTopology, getGridTopology, areaSpatialGrid, gridlines, gridat, gridIndex2nb, getSLlinesSlot, getLinesLinesSlot, getLinesIDSlot, getSLLinesIDSlots, nowrapSpatialLines, 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, rbind.SpatialPoints, rbind.SpatialPointsDataFrame, 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, SpatialPolygons, SpatialPolygonsDataFrame, # spatstat classes: ppp, im, owin, psp ) exportMethods( "[", "[[", "$", "$<-", addAttrToGeom, bbox, coerce, coordinates, "coordinates<-", coordnames, "coordnames<-", dimensions, disaggregate, fullgrid, "fullgrid<-", geometry, gridded, "gridded<-", is.projected, merge, over, overlay, plot, polygons, "polygons<-", proj4string, "proj4string<-", recenter, show, spChFIDs, "spChFIDs<-", split, spplot, spsample, summary, surfaceArea, spTransform ) S3method(as.array, SpatialGridDataFrame) S3method(as.character, DMS) S3method(as.data.frame, SpatialPoints) S3method(as.data.frame, SpatialPixels) S3method(as.data.frame, SpatialGrid) S3method(as.data.frame, SpatialPointsDataFrame) 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, SpatialGridDataFrame) S3method(contour, SpatialPixelsDataFrame) S3method(contour, SpatialGridDataFrame) S3method(dim, SpatialPointsDataFrame) S3method(dim, SpatialLinesDataFrame) S3method(dim, SpatialPolygonsDataFrame) S3method(dim, SpatialPixelsDataFrame) S3method(dim, SpatialGridDataFrame) S3method(image, SpatialPixelsDataFrame) S3method(image, SpatialPixels) S3method(image, SpatialGridDataFrame) S3method(length, SpatialGrid) S3method(length, SpatialLines) S3method(length, SpatialPixels) S3method(length, SpatialPoints) S3method(length, SpatialPolygons) S3method(length, SpatialGridDataFrame) S3method(length, SpatialLinesDataFrame) S3method(length, SpatialPixelsDataFrame) S3method(length, SpatialPointsDataFrame) S3method(length, SpatialPolygonsDataFrame) S3method(lines, Line) S3method(lines, Lines) S3method(lines, SpatialLines) S3method(lines, SpatialLinesDataFrame) S3method(names, SpatialPointsDataFrame) S3method(names, SpatialPixelsDataFrame) S3method(names, SpatialGridDataFrame) S3method(names, SpatialLinesDataFrame) S3method(names, SpatialPolygonsDataFrame) S3method(names, SpatialLines) S3method(names, SpatialPolygons) S3method("names<-", SpatialPointsDataFrame) S3method("names<-", SpatialPolygonsDataFrame) S3method("names<-", SpatialLinesDataFrame) S3method("names<-", SpatialPixelsDataFrame) S3method("names<-", SpatialGridDataFrame) S3method(row.names, SpatialPoints) 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<-", SpatialPointsDataFrame) S3method("row.names<-", SpatialPolygons) S3method("row.names<-", SpatialPolygonsDataFrame) S3method("row.names<-", SpatialLines) S3method("row.names<-", SpatialLinesDataFrame) S3method(points, SpatialPoints) S3method(points, SpatialPointsDataFrame) S3method(print, CRS) S3method(print, DMS) S3method(print, GridTopology) S3method(print, SpatialPoints) S3method(print, SpatialPixels) S3method(print, SpatialLines) S3method(print, SpatialPointsDataFrame) S3method(print, SpatialPixelsDataFrame) S3method(print, SpatialLinesDataFrame) S3method(print, summary.Spatial) S3method(print, summary.GridTopology) S3method(stack, SpatialPointsDataFrame) S3method(stack, SpatialPixelsDataFrame) S3method(stack, SpatialGridDataFrame) S3method(subset, Spatial) S3method(text, SpatialPointsDataFrame) sp/demo/0000755000175100001440000000000012321302443011630 5ustar hornikuserssp/demo/depend.R0000644000175100001440000000257512210647145013233 0ustar hornikusersrequire(tools) packages_to_check <- function(dep, which = c("Depends", "Imports", "LinkingTo", "Suggests"), recursive = FALSE){ download.file("http://cran.R-project.org/web/packages/packages.rds", "packages.rds", mode="wb") x <- readRDS("packages.rds") x <- x[!duplicated(x[,1]),] packages <- x[,1] rdeps <- package_dependencies(packages = dep, x, which = which, recursive = recursive, reverse = TRUE) paste(apply(x[x[,1] %in% rdeps[[1]], 1:2], 1, paste, collapse="_"), ".tar.gz", sep="") } #RCheck = function(x, URL = "http://ftp5.gwdg.de/pub/misc/cran/src/contrib/") { RCheck = function(x, URL = "http://cran.r-project.org/src/contrib/") { if (!file.exists(x)) download.file(paste(URL, x, sep=""), x) cmd = paste("R CMD check --as-cran ", x, " > ", x, ".log", sep = "") print(cmd) ret = system(cmd) print(ret) ret } result <- packages_to_check("sp") result = result[-grep("surveill", result)] result sel = TRUE library(parallel) ncores_to_use = 2 cl <- makeCluster(getOption("cl.cores", ncores_to_use)) clusterExport(cl, c("RCheck", "sel", "result")) out = parLapply(cl, result[sel], function(x) RCheck(x)) succ = unlist(out) x = which(succ != 0) result[x] bla = lapply(result[x], function(y) { cat(paste(y, ":\n")) system(paste("tail -20 ",y,".log", sep="")) } ) #result <- packages_to_check("sp", recursive=TRUE) sp/demo/meuse.R0000644000175100001440000000104412117352475013105 0ustar hornikusersrequire(sp) 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") 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 sp/demo/00Index0000644000175100001440000000043512117352731012774 0ustar hornikusersgallery 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 and converts the objects into sp classes sp/demo/gallery.R0000644000175100001440000004140512077571034013432 0ustar hornikuserslibrary(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(), .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(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/fib.R0000644000175100001440000000110011635334416012517 0ustar hornikusersxy = expand.grid(x = seq(5,355,by=10),y=seq(-85,85,by=10)) xyp = SpatialPoints(xy, CRS("+proj=longlat")) gridded(xyp)=T gridparameters(xyp) xyf = spsample(xyp, 1000, type="Fibonacci") plot(xyf, axes=TRUE) if (require(rgdal)) { xy = expand.grid(x = seq(-85,85,by=10),y=seq(-85,85,by=10)) xyp = SpatialPoints(xy, CRS("+proj=longlat")) gridded(xyp) = TRUE tocrs = CRS("+proj=ortho +lat_0=0 +lon_0=0 +x0=0 +y0=0") plot(spTransform(xyp, tocrs), pch=16,cex=.7) xyf = spsample(xyp, 1000, type="Fibonacci") plot(spTransform(xyf, tocrs), pch=16,cex=.7) dim(coordinates(xyf)) } sp/data/0000755000175100001440000000000012321302443011615 5ustar hornikuserssp/data/meuse.grid_ll.rda0000644000175100001440000016073012061417151015051 0ustar hornikusersl<ۛYeUJ)#P(EF)2JV@RQ4BP4R*߲>^q=-ױ?Fˆi/3' FN"a_o\w302G us_Joiz {m<ɿ^fgøǿ{ .5ljîG%fǵ=Y'̵zœV;++Vj2ۙi ,'\N`]BoVuߚض~҉MO#J\<=~.ceU˲DnYy50m@O;KD0e ʮYz̓XqKY^uo%=WKMT.7FOgSΝ|'}+3_[$&6r2oolKfX]o-68q8Hwkq \OxbWmt˜E މ\l hdlpuBs:ݤL/܁ q-=dQ+q)~Wxy\wɯĻ~=?z86-CzsDZE,Kn&X'Gbҫ7Sxtz].MKZ#z¼/ &pӘ!U]fW_ %i(A;sø.%tϫ8Xu}nObeUs䙎q̕t }- $WmTʄ Ė]-+ˏH؍XYs̕♕[L^'Ǧ<~Nݳw[Hn^ܟGm=Wjo1bN޺ fW buWh9jKY=gW=_V>Z<'̷I~3kS3$t.5#*w'>$wm#;oZr)_2l6p^ӂƄdϰ\?F[wsĄ"kyߛS~NʜfQS~pm<),Aس13Y$' $a-33K=Y\|-k.oߋ"UFaD̀ٳۗCXQ!}v-=G:j=LvD4*JcE-eZ=qn&n<q/ `ʡ=dj tb+njװK`Xo`xa,^9agSFaKɕM7a[ꁃZG3>uOfvI=yG*$Wa/DmZxVMZX>y4y']{^ؘɧ.uX\N}c{[Te}2=)^7䬢R]cyB~/4B-dC|Q{A3@ -?aچ4FȆä7??6Nz=}D+꣤ % > ;.]zDElyJgoع].9& ] ة8:68߮ >GxWyFǨ2>#LvzD'N7}Ti?L V컬)&yԜ$;LEiSQ*o~ʫ-CvjedgX&,ҟ)Jc927Gu;5noE5ϔ׾T9{[kO-q^Q4v4~LO#n];ヴS]S;v.jA}I^b5홀 qNYdsRAָ/ЧW(_Xzf&gSc?v.k<}JO_ ع|2b}2Sp!y׉q [N:RGQةtM7SVp} 1AY>عt M,}S2sN1O '9iiKh[g7 ڔmv)_[CPaBt?^eeds4g0ezsO9=C='cOB uXdRCOl3ATɮ{(?9B,G1 oпC̼ҁå!is+Raw;ط*J^МzŒ!hcz\2 ;10[9XPeQB}S+җāgg}OsbgcXg3ڭĮ$ðs>wж?Ό/1*1Ps}=^UBvzsv.>/=ݗTBYEka2"Ά}ި>dCh,5B쓯nuRU}T9NyhwK1:';iNUp>E\i /V>n)/ b訖<{Iw1 z=N3t>AK_\<_|ޭ b_YwFcO[FSطoLN츱#%i7֝#_]Dµ׮4طB7\#Htщö5aaM'LOnNCu0'Jrp%qx{b-o3| ;5>&|^7Bv s9ND$SL{7e;ܗb<+:{ð{l/x,wyL+`0缬vA8S!pim|鷞cc-Md'}`a1/{5!v7 [x~14'0Ӟx;  [jo1&<=|8'Os:1⇴>@d7:Ok3;wc ι7:ߖ9Eڶ"y[ kj1<'fGOh|I1s/it-O-&-9S'ps_@=TDӹ]IN#>WI-|}W>{ _ _X&҃;?x*2H&ƍy4w2W'U"QBz^K[w8*쥭(|D}Tw8yRX'4|Ǵv1NX4J[~8vRn"Xǒbr!Y!,ۃ}dﱓPFKg@Eq|:LTw7O{nt1nOL2hGQ%}>|JO-[}M(ǥ"f˓.zLӹ&d%]Z[@OA^&罀>}囈.Jυ'I-\ƭ6ey6˯}gM;L!оȔq b%[ҁu[YF[`e.:za ٤oP\t^}4^ܦ2ǷYбFa ƈIoNN>'Vz\EyQxeM:]#}RU9CLIf˖@'t$Wi_Fag]+HZ#'6"~ ^\CaO#$j_R|1q?[ <9Ygߧ\ò{ a,#Wrul$C'u4o:.]璍oO -t ,ss}9:IzBnO?؍ ȶ!Wc瓒sKX6AS?vXk:IN[>\)󷔬N#JvV7%}v'/"w[B'rYeM?On6I³fCԧ}zL[{tia^sm:eBz#;q]CY#>N#R=s&7漬wNLSqgy 4 'Z &}: Saظv{+w^{b+87qӼÔՑIἾ6xZw,CriOlv?Ӽ4GG1QJl aKufnB'k>. }S܏,~6ncB1qϗSI ]o\\V2ߎkN6[P NOF~G${ʚ8ut /zx }]+4RNg__O@'Mq³I[3s.jͫDNǁp\Љxz)#T"uR04ON+sҾx-{b3thžWhasAbSإcK`I$x~9n1׃\aGG5_E@IHӨK/2ϏT:}؞FƟX9a;k?;+C5 (O -yGU}YvnѼ0c'0CpZFl4G-b^E|B)d\S8sSp}f әW%mOGCv1,SIsMC=;^xނࠉV7?Ӵ)yUfCuF4 ߊLYU' :Ia?Apt 79:16s/WF?[wD1n:VTj艊u BMdFtYwc7p+sΛ\X@' ڃ]i^fhx$9|NaTfL7:褴Ԕ;ǟЉ72YdLjhL-9sȯE~SmX~H&gAY4tpޣ9{'ըC+$o;\>jdhn=[A-lHyt.{ϳ_ 2.vӞcـk~zqr⍯ͳߡϴ3u+ϡ!aZ1F:5[Gq&v{vPn{4 },*Ȏ!30맋Ebes9k} ŦS;{Y%qgnq'DRA*H~}r[n?sZS?Y@t7ÿW19,lRԈ8a0yhn `僣O#tQwfM(Onx9s zCԷ[Dx|Ț<]n:KpD%3Y hQ袿^v߅_]d:<(&d~>}e?sJHkѷ‰ܵriGso{3m [/#;{r>!zKsÖ'A40jS|,.N|9jjCy8[s9tY|s3OkӞ0a8bQ]G.7c`?]eޱ7bi~`ػɪe?r:z*D~},_^ߨ38C6+21[Lߤ}).-5M?A>HyzSn@Mu)ć!3T +Qg/JsБ+fKIq[ GJW:9je t ȧ=cJUʳq̦Ĭkig>bõ91EܖT δrv ɽh^1}0D|Fl}E 1~]iYs406IOz0EmYAc@j,9A䈺/μoU4>I̪{X(pXz:t~[ ӀR4zyD鑒ɛ>Can3bow,4+CFnB彤qo|BN> 4'N+0Cu{Sݘ!3ՒC uA3sYꡛIѨ'c}_=bCc1$D*CE2+l1X-e,;O d9۠M)w xv?Jp"=~I$0RQH WkRhK~C㙡=_}?}iݑ}6b5AfC=M:޷!qW/B﹌`Yqok׮YfC[.1~:tPLe__zA!1U9b`A5O}Ok~4J)!0Sl_ưtqz:wV衡Nĸ)ggTԕ*B2ԏ'ȠEo7m\4{衴ɅqOBj6_k/KgGzD7r;rAkDCO}#J;+;=7HC3u%eGIJC@sm_7M# w~=W\z G;w'\? z|4`5jR~L|i9|M9o/Gt{!vW. H΋K>}T=+Q|ϥdsus^o'\/6!~h)A)kC)ңә߆2m =?7/_+@s9&wSo$b^O{|1=3юRVInSCaM8܉uMRBeڗ&]<=9%.t4tttՃ9d̶Ϸ@%!TfIǽ5+i~fbmuG|^zm[}vw;&\<) z$1%I:=H!WUfٔUW)u-z=Vs&J^=vx,r͸@|7iY1[^j=D">*Ovꚉ(i.r zH0_p%YP֊-.ٙ=t!tOQ]`A](}[Mм8s؈ҁrbMxngw9[m?AYAu GSSi~7=/L2󄩏0G-Ρ|L8D|y'8鲵cmG2;g]qn~ TIM 0|yX:]ߩT{f4ln[FX^C?jo}$\2 pj*ڃz Æ|C*[Vn }x.8S?yͷ[~@]4CAMYhD 5ћ?_\ICGBۼl/2I4Lh=g}-ޖ9 ЇAt9=ls.ETN&p&}.y{MԞqUHOAi:_I," &ɔչFeCRTJN|wP _q#277.#/,dNrkKaOx yIMߡ{;Zg\}SC@8i#@0e> I7Sf,<Ӟ<Ӝ[`* p9pJ[ i]̃>r9{{J:@q⯹wY2r/~&oC^zPe#7<ܹyY6|[gyMCGim~ߝT~ }/PO92ڃ'V> >+@8ﴩ@}-?@ԥ˖ˠi:H63^Og&UKCygs|g} ݭfɂ>viď;ejNv}N‹uhϹB:]cJ}wY[˃I9П{O8''f[g'G){Q~*ONgSr%XC}h"1eU>H+|>nSniSJ8߹yʹSЉ?l!w~$}n]ˠ}qrH"$w饇RL?r -89pn3wzYͩsw=0̠-!k#P.$t;;<''*=HK`gW~;h?3/_}BsOE~I~[+(}Dl%~tH ]24.n}T.KU<(z7eF޳D?8oU\|nn͍nPݝ!A#aMD뭧O/y|܁J0>M 4o >+@/۬ppsw>~_#UGj4t;=Ƈq0AT_. |{^qp?״.j9/ߪVAes j}}n>+cGz,yqmH\Xt 1 37p-gZԿ轣lByT&JuxocƟS}|3-= ʿEq2cvη7\>^OHs[K'璯:ѥUHKU6>zKHȳ.yo}q_%]l+8wL_qG*>xg)Ft/WC5VN(|5|Koa f>&Wf>dPG$Y(F-*z1/?Qob}DMux<9IL]>Zϡa\tqϕP}=fvS9((m.ɫ>;{4^UA/4Q{,+bS] [{v(Nf w6~ss `Guc 9[oԇD^N{44Zpz6"5 1xisY%C;feϳ3oIgOEA?('*FN{}42Szi~R<9%_V^2R73mU9{S渾,xLgz z'x΄Rt&Wܷ nқ{C;ori?vCԏ&?C7݉:|sO+tZ]7&uuեA71_sw?1;Whj )jGQOR؃lh9OTK~,%V"7mj /uP=k݄Ofl7CMG9:]2QfQ'[w.us]wQQxE*]7r-xhR-`=k)3jaNJ%7Bzh*ρǞdyKI0Ls v_|Ni{O~>[ 2xTmͳT'ލot>9|TTDi~YǮYBMԏg6^zzw;{;!s.ҖޞӾzDuIQ2Lg5 ]jm&4)9h?9jnLsRg4WJo0 RtrG?g_c7ȶà:nb 1J4%QpS]{F#M G?z'dU;3K4ύnLE5+$ CLGWOTit 1earM)!NJct=mxs <6mq둙3阳gk5ݷ}!{.BGNiLGkPQ}ԙ{%՗n؃3$L?ٚz+y@7.5bZe9 9&qhܛ:Rpf|i)FMAIWc޵0Α?0CsѵMQo '*NHn%"ʿCGάkIpϡT/FyOj*}!S5諿lRzR~<y1:m=lBXsbyP)]O4O5 Xe(,S5NrI`O}hhcb55 6cdGәTҠ޹XJ t﷟{'ϯNYx׵:1C] C{|Cַ0i+PzKiG`_w ^-/#9)nӜ5%8/ez>%ay3(>FO20COAQrϣ?LBOГFʯ[iXU9j%NGvivӃ˩s_e1/y=f9[~]y?S&G|:2t6ƝAiee ]E(/M/3W}%/tq}c6v :WۃTv;˲>a\}'}&fْځ~Sƭgr4o=stǛ/Di(d\R?7}|Fˋ{ԸTt(;i}o~b5ev7i믥{j䏓}9hv?Ox>iXZz'2x5M}Ӗ:k:N=yYu櫮U>]e'|n\]9:B: ȔӻХ1{N :}9!+oά^a:ʈ}a \x uO,x>{EGĪas1mb|̣=tJ=p]K䗉7T &{C:IQ\D[jLvAgce 6#ݻy 沁G[*jy үe%c\T]\x-ZU^]~9s/轮AΛuV+토Q5=~s4E:7bxc)oZN ^ƪw?pe}=}Cl<%wJoBzƇۚϡ;_g o-bh}jVs[;\QlC;Qiʟ>OB/ E}m?olNz:x;?tʘOsޒ#d;C46&(@wfcG B0ŵAwysY&J:6GhnR^H9(œʌAJG aJ[1=J]rFBO%+-w\~=q-j>YR_l=y;M,4N>Ad7?lhה{J0x?٥bW΀,on%ޡmA܍t9{峤h4>]! }}O5q%%}òvtK^6C6mҌ_ç,i?r$3ihU;YDqn^,µ3){P(y4LvLVȣMziO)3 >ǜWKά{Xst47LqЬOu3l VU1/'v؄+ݽnlԟ{N?Y"]Y}W}Y"%dWងkKosѸ#RT~(Bz e]{ ?TѠfB Gx[3ʻoOVCw5uoH -_#:Uqb4NvW^3-47ϑ35~iO|}OCJZ QfP|E{{䇦'>t^d3Zl>u봞z4z|=]CuvgiNhXqkBs%. 4(mYݓ{aOǝE4f7I{A^ }} #v/c)VJм9pAY̕J;D1록'U9uwpȄw6.n$D}1oTcD~k14F:x싲t ɡKd6g;6]/}ڒ_NM%yvy!}=&!guO Ә3t8~N7&R[f\P&{B?-6RmK/k c(Bs][V)glS_9kڇ:y'Ӥ{WIh+/w R(zCc%g*&6I~Э/%~c xTmhGq;9C I\@(>;atS5(>P,2e?z">'0K~~Va I,{(Zw^s)Ѽ0~yhydsv>9xyg?*x(@Oq{QŞVI8ݿ)n;#S%[tЫ!. ׬z ?^HGIoQ;iNp4?ҒVϔ.ǀ9S<}3u_(zB.xۑ>JLOoVQo9553*'~ٜŠ\ ?q}tm'B}sTL*wqv['NUu}TϴRPs+0GIcLd ^z'^Yl ?Id`S'ϲm UσXdB'g~4_|9muֵdc ~oGl^O%O 7=43ML.c7]O8mVj --r ?tZ怖;a(ZCt~%eyH~|A_=]'o'r/n ?)l:-6Dq׽.ѓ%To{Nئ 97Ö>]/}nh`ر+ρ֔ uK0&Bfz[b@wOv_WVlO?2^? 39sԇǣ#m)'䫒]ۏ7}Ɏ6S^}9f?먿ά ;LmYY(ʕ}>`kgH~Z^&N bfm3XlJl91'Y1M!ؑۚ!bOeSwt ~VYϣjʅϗ:W-bz+5'wvQe|fǾ#4(`@-XT~Y}5xn"aNbh}[Di>iQ 钤Dғ L˷y/CoSu=af =$G{`[sS*Cọtm.7lЛ)3X:NLz6ޥ+0kzk%םX;ee\b53pkz!B1yжFu}vIwPƢr+# :N6@o>kQ;HњW6&YS|`FZғ;v쾳o>!], _N/CV;qlrzH,L7s+7T(eHk@maeu gr _er Qy =_ќwO&蠴nf9Wx7]iolޠ5j-oQwt5(n۫-o#;;_Jx혪*gDq<#ea$aW-C*({ӧ9S 1ҭO_P :(s:l2妦A.͗/i[Jj:'/,Cthlo)h7νz-4dާ6[V%\>'FG].?sqnWyU-o׋O+Bpnmto/,_::j).r8<^G}?@u~g'b?έs2m3^x~Oڇ̛n¹ߙ9aׅ6](f ˾so {ZE}9Kj2df |tϗmvGz|pn$ʯI>ﲚPw-k<بs/K춰Q)їQ9w k:1As\ď%fKڒrtKO\>U|ޯ؏:`t;?:~VI⼒Jw2v ^/oꤹŢ5w^w}o:缰7hkK)OyҾvn>Ϋ#|ʁc٦ ;/^еLϙ^:mZך{Y4]iZOnk7}Fq^^8og5Q,PHop6͏8?{[|.CEyYGCvbkmJo=qS, ve/xP?hx~{Ner]S8p$Χ[,I{{(dܻe@:\˛׎zvfp, }vQs鷍8iY{ Ա%_DF'߇̊[`טK;tcZ:/ryd)IЮy{ChfGPr 7q"i5 R&K#I|LѽEO";=ǟEo韷bv:fig}Uw+{ ;Ҟ0pqɾA+烹ul)IswZ?,Nj 52|~?M4u'|1vl3Ց΋ lӃ4u噷mv^XR&M̰دB|K+>'L/=+$`]T7GRHA{~Py޸ҾՖ];1r/r=Y?ɡU!]eG4O41??' {Mg*SJz'Z~3ˏK94/'3g %-.50h=%?'?[jh:~E9.8y&x[|_z(q7vKփzkLLC١`Ǯs`/ۏw]\_]_l0|'WK}j,JOb9j- 4X4|Uw7 #Xv>00L6I|?T:EdF#@;iu(gmOE <MNf13|5xbxQ ltTn{?µ\TRQpbf WAQ'{ ́Ϳ ZROೊ|XsmJ&!"=6T`&^1[u?ʗVba@nJ婹 I5kMq~(u׿H50E|wQO{{ŸgNOùxI͌Z Z=}qk{vg X}2}Xbz9sx y<8[z2cv75.g#EW4!93^jM.\v^ۃ8?cvtګ>2}IXvtU{&W<{:{{RYU;B6k鞬M`)֞K='W x.:e] Ztmc>{Ty2=KUgLQ4[ V%.p^k-pyd1n n_{\_~Gn/]F~lw4~o{ؿ}ׁlƷwsR9 z03xt7?|QGxT^WjSiVv#u4ca46-ӫD=uOOUSĉz,IOC7{*\W#u.Eյv{ss#tS|@9.+~ vrlg:XDUÁ裪kd2EQ?Un>TٽPVD?Z1 %ubkU/0; *Cne#"/VyVsn2Y7}je5 K.c|%#QNv=}L:-  v|CH젰&1a5렢 pQԏDљ傰_&^s !q"#|M%ϣ="MU>> ]>'"l|TbKb(DR% :絵ωq3rzŧO$(d|ck~;UmC_?st}ץ;AVgDQ}`OӷN"!0?s=_L79 yQF=drw=[@sL>* $[yZʇ7nWނvfwA- M$xp^mȐ8'Ā<k~pKgSZ_1>-^X0/w~fh&v=>quZ<<UM Z;jA-ALf9(ƛtq 'vN v˵~2~,A|l L\^~DwPז/`0&,Tu3eKu8w>zW2dW;kӍ@|guN^i:M>ձ/+N;/ >:]ò\` ]5m-^W[VT]ٵ Gc k-ZæٝHP Tnh%|&y,Ċ,FkI]Ԗ)~A~l2V߆`57'Y^>.|rf(ֲ ~,?szw*O]&*߱{)렂eХJ_ܧF?PC%-Ne>; /$NQoA9Щ@D#c{ ?è7.pmy^gl9l 7b <zMeq=N\C$Ľz:?0jxU 2.w<}qz^OhPêNHy'}7`K>y튩c-;5xG7WV 6@5Hݽ F3cuV"ȋw /*Q/.f=//A_Zp߱d:2E  CS=< 8 iy_H|Vy!$ ^~WF'siTpݐ]JQ8(u&u6(u2qv3`/&kW;}1F];q"nuP:ԓc# P74D𝽫}t?}K^#V__}KDQw|e}SsjvW,x-Ei8͑ GߵmƠ͏Eoz.[{Z}߭RVp0n[Bf <ĉ[7/S]Ľ> s0/m8s~uS]Et9uݍ/:zڵ uaĿ2YAī|ϮWvע~ ;{ ܶډnhvVg@[E#(6` !v3 "N8\|:~-:XŌ/xt|=~×րG|6?z@8껖>:V?*p~GV7O_#G܅QC>c ҹႸ"A>km+z-{M(|W{!xWo|K!_xc۶E69Vu}F?$ZՎbޱ\ kE~X1 x:~ig1ZƏzgf([)+!>0YiA'+r]9P"^s<MJ.Y=%[v]S:MYWMFYvqo 8I`0[D΅&Wl&!w30gx βj8ib|1ꉉFA7Iyi"Ƽvp_Wec4YoSӦ}n\0xMן|1 }]/;BWM?TQwg,z2(:#u6FE]YtX1Gl2Bk[nbA?Ү0XEFs~ȃO+wÜr} `[=!PIJ3aJ>G@/]eWڱ&C+1/ C]Q J\:_:2wN* 'T8HexW*+E>NHTs7k1+>+3+NCe֍(K>K>GUϢqn: ӢTQ7D,J0o4@^|I^E|7.Dn7ΉDZ;:%1.-bua9꾈ừ$RDv#:=PE8$`pggC _ewya[E}/lj+nT7 {H Nl_WQW7(<(|8(;w9ѷxw\ݲ4]x>|UԔ1?/yVoEy'0_9v}ysUyQs'P?y;"y7Cy<%7UWNcY}G!ZGƠwk߾${q^ZG}3y} 7;Ho}dA ׈7nQ܏5#)^]ƣ͘adyEFEeQ^Ÿ|v؁HSFfd3g ̇ ^af1RK"4Ծ_b42fa?b}\O\]&io3VnW _$K [10<[Osb@JL$R{ Xi <3 ޛ^Vظah ~IX0o$&5^}FYt@@Yᓂ'ڼw@YP87@d䤺8Of#jQ~0@Lo^ <$D.i!}寠(!P>r`-(gnrۧQ ֚zZPvܿz׋}?Fנe4hy_qQ4I'Pgω m?Xm ,Y|*2;扸/ˁe%UZCbЧ,y+[RI^]q+!Ub"cZkmO8r=؞"~oG G޼-أx}uQLxu*ކ^SA'uf/pMԟt[9[s3Ϳo&;oGoF?xb{m?[_tRXV>F\^1ƹ_yG};^ݸ pU Aݳ u:}<ߩ?Q 5$12+y_tȿ)Oeo~ 7ZF+p UV%|%AUv+YpIoC_>Ruu2xԯG 2΀͞`J/@?,@]Tl@/xy-CyBoÍ/A =ԓJs//D1k*V}֟`- 'Fh̑>D}%D3zV3ìlRY/Y,ϬO[h vh;-_p-?_?8= 4'wYw_=$_ߝvC;;3uoT?TJj[DWw8>wBZH^bmGw}_h$Y^<ľxk}#yA}/y;8 J~5[wONx ͩ׳+8*;pMuB{z2za;ՅHW\#) IYț Wׄ`p:4ߕ ;C_11JV Ama%? ߧ0_E+y|[5x[>-9|&yl}P zfx W>:/U^C;q|J*y\:um#NqC}9YӀyŝ8ɗG~Y" XPN^aG ώ:z+椳:p=iO1pQ{#퍑n_d~aᄐsGü|)؛ly%xc^gkhs&>o7|>;>vLVosQ[`c먗p[|oH,̩oO8^D̃Vg1oyA?5ǐ޲No [7մzMc>GjH Ve=n^SY^)+1 ؋f >&^F;x`)摃Cw4.fσ;M߀GП.G=ȷ} hh#na?P; qy@na^[ī8@}OQ#Ŋm3t:Mqu`IqXQvb?_56s!-2ujE^=!]U1a_ r}A}2qyd{EZv;\MP_,Lhbpb V'^[ԑ d/1_5+e6,rƼgn l4{~I?Sc嚰ݣ#rEзFq_Fk_<ޏx4:qtA|Y|C^ua^4R.ݷH0}XKvh!̻\eΡO׺<1|1u0*uܘK9}ȉ`"gڽ">n3_5j;p5֊^wεiN_˸ uX=sfWOo)."a86M`m̟5C ?]ɴ4{ƐjFv-`ue-ܥx55ĩr}N\4u7xr6\O@]/K?U#8)ʻOaP<^xW6Xx"e:^¶2G14):Z9Ufg:O1oS엩Jɓ0W)][ ;X8SES2yg2X1%-G#nCT] Ì#Z IKQOp\+=ă%ݻ"y }Y|.(=FN|Nz_̙{#C/iw>5F;i {Є9GZOeꆴ`I2i6AFNjlC=$|RTVYTV-TBJ86sԩяJ9*`>·Jmwþ&Qy)p- ZraJY* @5./!Y{B%q~!Qs;x__ ?c[Xly|~0e'|a̋ ] wo' f'/N-T1>P*B[س2F^+loRk5тa|ns`z s7zw c'\sW7׽K`'ul\:['.-fk.O\<\WpmDp- /\B5PrN$ {4Ophw>n nQu}<+ڟR[7Af>}\o`a<ؒ' |c a+LZE0S4c0K )jn\=ga卌AM@۵WI%㡌8wój;fm]UQ/ʁs޵ k Ț=ul_/⬵#|&V L{G߀I.um@_pUڬ)1޿V%sw^P<` z2, hTF|Mmk ZrsW [o> Z"N $>LrKo7$p٘g{ݱgo_Acˆ]A71.y) _xmXp~j`Q>H=ނ5uﷻ>_~B^ LYx"P @^afY ]h.~]=g rC^rF>|6h?L@~/>̈qY2u03 s sqAͲx#]9 yE 0iϹ*><]7R#o>X α Ig=r*(=8? N[V#?~z}};Y|P%{>F?>s׀L~^ Gc;AÇ_e/eO9^}ء|;:K+|1Tdw~r%Y/#J_r¯g_Q?K߳ن/DQJ<]"KC\'.v\s4Ԓq*&3/ŅmA?kԕ%_8ow{PwKwY% Jwyo['A ={%Ҝ<#Pux;pQx<ĵyNӇA{Vjs숏]oS{}`oP/bÂ\H_l4U3X'y,>S#_x9EÿyVjԟFȡ?Wq@˝1d9r{/:6~Qʾ%[lZ^[)sc\?V5s;ɩyYu2ܡzd[fdf~y[d.xexz<tf}*T$)f*/?M ݋s+}^댋mP2 ?'nA~$m@JX[&üx?xx6P ơ$:1BMg"U%gK~3ˈxwȿ b?п":9Ap/')j}&¨^̇>bm>1oJ@!+1|gyR#ָsr8gxnJ}xڦk~~3v7A"[T!{_ᖏ*ѧ 1OIAp!M\}٪qU0,ԽaUv.Kfyu̷WoG<( BS[q+0D.s0?ގ9sV=\C݇9eYnݻw.mK&Ν-Z?*EWjk.'j=3g/yįƌ95ZJ/j>Sgz8Ӝ7Sx5s9iWռZعHK ֮lGGם$]Q/vG}s}~1et{.vn`%.]:vrAKۮ&n_Y׶a-Vq|gM?Wn^ub=q xH%N[䱭IٿTlWY.PVа{-c1,`{--6/ʃ'6xaUg>nh+v;6!#'l*jN@k0q6zx.ca sr/fa#Rzj<~f>*}߼}/?c7 <*]oL"$ka4Nn>C1܃~l en177|f9|d3/C7_x3g݅yc˄p {K[-?CQ7|Tf˫n'#'m'wd0o9r5qUeWY[̔,1lѽe*l?Hm-& :_f^ZAo,fF3.kQn6c5d}c-=vj33Cj>CYdž+8Q  6?F0dqfFB}0hME}Aq`m9JO'Fu [ 1?~kr67XW ]{o ؄wu;0U#7E"I[QRG?yIՄzO` =ӏ;=Zj zks2cOWc¾/:<þϠԋzb{ ^mE)Ϋ?񨗻u+BzqF0El߄]z }_ûl `7 #46FjlE=XЇECm3ف꣇ݧ1w}HJ]}LHv?Փ\~YK[ mE=fVC]wuURqNui ~CVg6ȇE(?soDV{愹RLuKZ·sԮh?FV 5sa f}5j j?ǩwǟwk5=S/F wk>+D^) G[ uݼ v޸ތyA(6yM-`XRE2@qsE.̇lLG:6w IĻV\vWdB+2cPhy}[:G"ċBݸ#$ءTjb gv`SmD(XUU\BA v((waP< ɣq+?:}Se z3tXx @~?qvR~!)"1^ď{=ħc2?o uk9>,},\5U7Q*#^%C0I6EO`.{udyLKbEd<#yeUH#O%kbQY $7I o%JJ |&~d>$=#jGZu""Q s{OS?K. ?$>V_Q MP$B`1|z.ݸ]F9SB&#1/! c<#>ph-ToNOBooFb.Ͻ o{+1gNaNwDw0 ;010CWUYU|' {w,Qϋ[Y0 on|"( oj\N+fmS`BBZ .B.@r!A%!u๐@(+]^;C? hoCPb$@_Iˠ \ȋ-y< *fn  {ՂL% nG^p ԛ/}NiSwZ{D|+`1̕ 2%{v#l:z{%?J 'L")ZE<?ށ(!4.f3c٭0ZcWف}{W[96C.\ǡW::qN@|s0psNyv؛`.ae ?a`3f0_vsJCvo@K7wƜnnص_+#py0ײ3@SZЙY,ײ\QQٞg|@:eX8dϏϣ؂7!_<~`d۫lVxkӨQݱ+qZa/V7(Syx 7A @#m' lFP~E>yɏSs /`S(XIKnzSKOMS~O@h:,24Qn5? @ p9i? '.qkoƟ.s:5x_'^|<f/o} Fhn"W$W/ !=M`|iBTZ zԯ~ ָs70(_ v/S BuĿob-8Us5q=n,qDɃϜo8Fz|N}',=sc?ZOӜg{@g@l_,w`w/WY7pg)`:,Ms$_5B2ހr6T|ȕA\6M~ n\ oZ6qWӚw㈇&58ߟiOo1|p5cR(]x8鑄 сo1 V?\K;o$_/CY;@5ڲ^?jTwۅ<_'^,};6 [ok0A^|+͕90̷8 w[D[Z l~AAWA}0hTʄ^X _VC|zU5ZDɠnU5-CVUȋ7JUqe8gR[Y q87|j~Lcsgz?<,gAs_8ӳUgi ѫ dyo B?i`lf2a/N+cx\xwK%cz* w!lԵt1|? u&]5 u=}rP&d_LLB]IZ}"1N{=nwC_ݠ ]oX +~'@%uw@ ~RݜWCepqt{㻈۫ܶKPo @߽ 5>qv##a!ؠӭv'׿Hh uꦑ&.+Uq[J/~W WYEGרx}ԏ`wTU U‡FeנDw&6Uh"H@Y{l TTK!6P(R4HPD`g"RqO8s{^ߵ^Z~ٻϡ6sq]M[]Hasbwcy3~S*_{WuUb?Wbֱweu3c3w}j1Nt}];%6Oz⷇i~v<bQDe.2?nr캐qgbyyb1Wf:\;g?;ˏ3/ƿ+="we51>u^yqccO;O|'QR(E)JQR(E)JQR(E)JQR(E)JQR(E)JQRӁY!JQR(E)JQR(E)JQR(E)JEHߑ.EKVp~Nb)=ɂS{N=Ew.jvQReOCIm=%]tKZv+iUgOףϞ.Im=]ޒN{%%OtJZty<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣ<ʣdyiLݸ?V羽*_Zm{¯K_~{vf=poӪU:.xg |~T_v?4g<ּ'cy>z"?䊵 W}ev˴ǛSh#'l ڊM:e~cWGYKoR9vY7qvk6vOoqZG=ׯ{QwOo=6qh3%NRe{w{{UY:ʷ?w<a~U^twy)]Ia`}+pcO|h;>C}֯-SslgWW^L T~uTs>u|c>Ou\q3 _ms;~k߯s~n籞{w{m蒺A[/.77͚Stk Xkͽ/c^sד*O_OkM5:_6yۣikx6/8rގ>Wy_k"9 ԉ/~)?t9a9_ft8~Ԕ:+g>^'3n&z`ߠ0ּ1vsB. }Q3YA;^w_x~6I+Rxxvɹz֪+G>r'\\c~u?~vcJ^3qqvuxfFЎgro^]s͓RCL>N:ϩ\<#<~^݅n?}Ϝxyy՘G=y؉)pJyLp~/T~F.u͌χשJ*S==Me&}qҭͮ|g*=8~WG{1djΤc o;7i7;vJ8o\TNl>3 %֝2OÅu_r;GWo/ݼaO|y7ur0'm)~2ppq_^~ç>s9:3S_zmƽ?Ԕ=wjl>s^'\67dLl3UoGA~8?zyC~9jgw{EӮGgGY7NAqZW]'/9w)g1`tv⇦OZߍ}{Orc`!ůSvnGk{m>5]~h}ׯH<1/n9'-U׭_Y՞HO9jjQo zM΃>YϘ~߼ܭOO:OKZb]gN}˗nvݙvاJl՗E'_z4b`SyIgb=}zxݻ[:活 ׁmܰ~ĺJaK/pd|jjGA}RsH;<`}F^p}C7#zr[2>my{n}\OXWyQjZ}yp}p}FЏ_3ۧW*/9z4ox3㱿߷GH;rO y~cp,VӃC:e=Ob};=z*>RGp\X~fye&>9SտK#Rrg@'7_ΌCwPm]'|\!rOS~bAwҵ4_2v3z[d2.YDŽvXM?ȋפc'0ˑ4nUp@xs/~Cz~Cb>_)W~v#>DҾ?zz.p<4XoPqGT[pH0N~Iit F\p?BTӂ9:}ūͻY͟-Oui~'.uNR|#y4OM/׭8Y_9o'O2F1k`9OroqG8s|S)XuzOnz -8K/]\V鬼?lNUƤoIڧI_o|=S&~ z%ÂwxMaңzAӯ_/ܤO/-KYWv诇41};Išzod>_Wȃd_qW̸~FP߻QOz_wAMV;K~W3_-;ᝠw[__;M<=pطvIޗO'n4dy>Th =>8k2wP˰g&^úWhy=_:s~)nYnSǠy >Lf:t;է]KgZhҋ5^}2o}\}V}ĸOǿvk4y'oZ2oG:nMp,_s3wlo;O:p:rOX ͛#W1_1}m\~˘jp]AӌW<~?c2TʾX}w2ޓyg]=˽u[ Y6qJu7]63u?&ߐ?&SսZҰmsճKy}3ݟK'kzdf=_?JW~}ƺNU_MN/ o|ua#k@~=, A97Ue-5)87XAPa?yA=X3ආfϵf3o͘~zON{2#/R%ߓ=:}Tb]27UדdGe73𺰼ق&'@U]/y>{{Pwk実m mk^6qYw =\Q_\⇏K;N9SI>n{ ȗ^ºGt0<W-#QxY6 Lv\Iww\NyD}Megk{E5z=pgu'7Kpc}o7=R߂}"'?NxΙG"urfFRѕcb{7MJ޹jubթM덅!X{ِ cҚt5X3__nWy_߫FT7TK7\߬C9K\2O>1|]G_sЅSFo4[6dūG;𺱺WC<8E8Nϭh+A1c m:e9A.)uO7eQE,\ry^,? ?w?o;L>}z|,q'lyM /Cůē}xsϭVn˼boTo`8e~q}Ž*ُ:e|m΅uipKV)ǫz@߀5~֭uk`<]39Xä ڗߘGnq L]R=&Ms,rYeŀ7\tK{n=d| }нv=畭cjgza¨_Ԗ z-Xgw_q}bk`:cXnwF8뙕;.}uϗ˖7nq.k_ۯJ7.riȸϯ!]R(NY$uL,nHoV7w&hgnX}{n~7௶jViu㷚Rׂc t?J&>|>eS>]sb"e]v>?_gl4|Ҍѵ _,p?_~ٲuzA__1󒹤~Ūn_zf+r췇U"/tM_[dkR-/o(> cz]߯OR41yo{p9 VU;pw/:oM~)>d;KEi:_Oy/1~yctΨ-/9A90SrYV=(_6%R7\@~>kj_xtIk ;mZ\A~V1 j_zቷ'w yZ9{;v?){5%R:9\}?+WuUkǺ{`}xػ_\vuioynA?M1>}?e~]8ksf n˃cC8YCej-/11?'1.{(܇~Zô`}pi3{>w6ΰW K9My鵶ǩ}c[ǹ*\/~cej?.=%H'+8*'_H{btY_mA+Ӽ?˼kW= 5}80r^㏏=^%wJx$?WssOz,\^k_FO|~f *xeu{y`ǟ:hӂc:Uۧϫ?1s8oxݽurާϸs[)Ub@wuLxzqϥC{%+|ոß/_h9샽o{?e? 6MN!O|OgMg*ߗx,ߊKv~IuAp$|Cy9gWy Uwl>ymo>~~y{8}Y{swҶ>>澾c%gg4g4];A=4kT!KGI,e#}G+Yz{.8}ˢ ٷ>n"N#$~I}˴ubެs'7| _HL^9M~|&Ͳq{1~g21`Լ ר-9|@Ͽx|[o Ixx|OC^s=Iqӛ -i.J{E?v#q^yM^zyd!z_G?GkY':O~>-Hc;sK{܏Ͽ绒Y~Oʳ88޹'|~s^zz_S{Y?_ѳzjzvي_A)붴Ue:̹qsz~yUVSu^rs sgyٓ3޷bκ~?ӚL{1K=_q~W/}}YRS󉙞oǦܼtnoz̔bt=}!#̼GXY:繉Mr?]?4;|A'6'^e1gseוFrygyܳ]qC9>2*>NEc9tJ= Ӷk~]̫~>vzC3~̓uL|^5٪+UkwM ҭSeb3|>0i#_L^V>if;n'wv>[~׏D?IiL-yjyeu%9ٮƌ+Ns}θ?{H>tKI_lR,xtURAxYA[?QXϤ]ѰyQ?yL?4/~mcwzz&W=޲]߅M\_|< %Iކoz|帎HGz.1}/}Kw~꿾>uﱧ|T?n_O>/ze${=pe_!w<:>oOG>#{>A\uy=mS P%K )>>g(WJ>Z$?9OOH7y{yy{JtU=^AML6{w|OkOOgQxE-_}:Už꘻E=殎]\Υx%-?-KI,ϞQJVYJ+LyɲDS))e%,{ 22r;d2r1Zr쮲d.;$h(O6cm6e'˓\L)JYr)Oe*I)jY s+neU\Te+*ie+|>˗\l>Wޮ˚˘)Lu\f[P *oI)srzXR_>{ZOԩ$\㊻^%]/եԞ.[JYKjJbW^ѫ2kAOwh!xW>/Fߖ27*ŝ9Vy>@&:>x={!zWQ7KoW˭[˴Ll,AyڒMrl'Ort˽ln.ɟ{eql뻫TAQ1ӝ]kWv/]\XS̖On.Â[f M_/rvWrʜ<溤Kl괫s^x-¾ nsMYeUaʘ!ʒkW<)0'];t̢']5FqrKٖ)WQYP9OO2'S [t$] *O6u*$ٴcQ˓w}(eIׇ-vΦ-Zwvw9r*G(J(LYlXMt=*j ˣrt,>^AmV2mQ6ҷkr%^O=q܆m1)}ׁb\e_y5=u_?[`w:A\Ρu|+=~}ϠB}ߨuu7h@.v]D.#oP`A3$>#?=!ĥB Lh|3~~t>\q}to)Gn8׵iYVA. ' y T{xLiC~4!?~r%/BEuw`1݈WH*~380cP臟}wcq } Ǯ^M@? ;G"򞈼uF6u_P/<#N ˎ|;qCH S;^;b=~ux6WG;%`}t{{&#]7;R xّ; $v.qułzF}=ގ:N;?-XD#wD]8Aۆ8D{ -u"휘o͸?fu>?mc 0gϊNǕr[C.Abd-7<.s9{N <3Qq E.l`] ;o#h>( Qhu; HH[#-H"Inl_ɮ`u0]KqpJ]W/i!%'gqǧrP$L >XOtncݔAo'b].@ȏA Hc(ӟG#*{AX? Ox+g%n"0~\67V3,1㤸U9X1A. ~dR;`y*!`uSXɰ3Q3`o 3aOT̀?0>z)}MyX? }G~ΧJ)߿x~@BzNR!=w !CFu3XKxQåut3ϱR(c14*ηŨ祻Hp~B4S/i`| |2江s9{:G?䥺񉰿Bر#gGSHS/ⴂ?p٪M+{@n"\{?b|nKϒ%Y!/7y\;`<ĵbơ)._;c9>K ̓οL_3,)㙵}JF3spdJ9Jϵ|o|j}Rfa~LB3B>J.3PE r ? r3G<@]-(#z^Qf }$η1ۧRӕa6}3/E}3ϼ1,n{d㽙 ʶ2#^3=Ĭ#[>Y›??ق^3M?ҟTI),[7潲OJf/{ȵ{v/-RR%YBf7/Yonl*UY/BF#Ù5`uYWcĸ96cf-IN;Yѱ>z/]gV_:̢Ue#VhzC9lef5Y]b f[\?7{pmq%yzGSRo~gf\4/df2 ,qxwy^- QGx>h܄u}#-{b%Q/ޝ"yp8Duz-k̰/m>Mu6-Xf0kڄ-U̼ =ڬdYW~i߲N˼`UEo4ar,;ˆ23}=Ϋb6s^["[ُ:zWL>62zfz,ywuU^bb"Qwpb.gAm|T%}Y:,M;Bz'cvF mOFB']7"QԼ61i%oוLh?2cvSV-R9ly]8SvLZa̋8 ҟR>Es꩑^5+R/=zC/)_^{x󻳇*5)ZD9ƺ&(;skV(;|ʁ[Vm]|9KJƜ~v9nj (n4#Uc׬W>zi*V@+O/lT>n#*描T/5O)z^9iS U#{gjWN|lxk+vo,sAzpe7-f}_&~S6jgaOg*B v|0rR]2+a!UVZ99BD¯$Cʄ"=6cƇ\!ޟG\>J%-HW-{lqO]o>K-@^Ч8ӽW86w; r #:zAH߻\߅f}= '<ݣ}EGt;^_ dGS7=1WC.S<{KzEV>ŵ[S~ ~+޵%鞽()4n{tm!$-NI=3ŃL$:G&~T0ia=ŋsX'Aܴo.ZO@twa_)/孉T&Ar~R|lT'>~GA|9"aszb=~/㯀 rrV$~԰S!R=+/ m2J ֍[Զ6u67}#^ϘE|FuFki3WCXcI>A73ބf/_ߌ>x<.Xw‡@d1> ˲=6lh{W9G-ՔL+ZEkhSS0{L}Ŋ4ߏ8=h~xu;8 ~ E)TgfoH7}t3I7E_ eH7lא~q@7?,ܸU,`j9)L\7%/J _{ {K7~)/Z. >t:?,z=9I1R]~' ؛qC9YNiheef! 0ljOϝE%sK@. =qrHqAnPCyO4j/RT0/+[pRE 75F2Y Ze-h9E%ZnJ-h      pppBShv N)4;f;Sp8KpKpKpKpKp[p[p[p[p[hNrIB.IzGzGzG}yG2q$r Htk{Iœ$aN%°daX0,Y, KN ZӮ55{Zӥ5Zӣ55D"QH(5D"QH(NV[f f]kv®Q5 F(Csȡ9464}4h684S[Ԗ95bFԈSpPhn46\Kcsil.ͥ4670;$Ӹg#ÍCsp/data/Rlogo.rda0000644000175100001440000005411011674137630013406 0ustar hornikuserst ==9 bc` H ()tҵ4H))ݠ`J5;^| zffgC/;۝==gocUYf?:W ' x/[^\"h>ߩ;x/gex ދp>?|8cu4wUlm-16Z>=v>/Bp}Dp7")Pl}[Z[+ckYl-57f!kI555ִZlw'ON=V 0R9mDCV=%89E5?ʁ1]4T{qXSy[}3% G~*ɍ]“O@Գ=y)^90XYa-g}Ng|/gk 7lMDvLM7_^w [b+ {9 &!eyvE Ϣ!ţ|7GoxF_ B' Mr=~!N̺V[b#w\{;|h6eL[w;Kj[ b+f *flUrU>ʰJ9Uڱ^ln(hfml#GBlhg7n'6ȋOvߟ@G5ӄs㚏9aGU-^cz8[wuGl[-<9?u/)[Vz>* 1am{KprG4Q@(NL _ʁ~ gMnQY#M/B}>r9ű;ok\Il]䬫c:`w*o71rkA31z2]OxZ8>Lj2Π.ur]Tb:r׾Bv,>G{Eedj9p;rz x,^#s׳-*pYAmDm Y+~zȡ˛bzq+ANy S^ܙnk]_'nm|xNԁ.*Ȓy`7k0ʹU2p5tww._XmP)ʂndŀK \rdSsc';y-EgȲkhj" lJb7UG'ڇFGЫbocoGK\!d&袔Yt/;x ygCf:~:>zn+dst &Bdbб;x.a-֟ɲG<毚)1ɰG=NsoZp5Cb\ٜBdH i҂2q噜:d*(Ks|oKUpfT;k] Dop8hmʲ/$_tNlijULG&1- i 4~{<4_«-'=TA-&( _~]$ر?K;IFuxUsmB-fpOz#Ր7kCaa)[,=:uIQ]9bl)N/2ߕ<5&gį\r S#;f+5q'qՐUC!) } (1]`:$slOʃgё KG2)6BmΜI}k2or6OO1!8ЇLB~w5 ~֑XmEXfY]' }B/^؃4xÇU͖8֜M|޾ m/Njy6쥼v8Htd` g[:N%r )ݠ1EsVBa\b{o'$ֻoyx(`|`w]gG/6k-~;g// [2<~8՞nZzf}8 >^.g| O5}#a)>:xg^{'[xq`J+]p;4db 7Я)p#_%v^oLgHuɇ9װ'vq:0iB'-x{=>_~x9=R>:G'~'-[>y==$~~~X ZWH @`b3C\NB|ZWBϑNx0WsY7?{g`z[h@|fu]S?D`ig7 v@Z]>D#tIc^KF?2@:ZC}&ÕokDho@ v7bZ-= .9,`?#,63X@E8r]-F'R x]D8Mtȏ_xg+~jһ^ďGg |^#GXz +/Ft^_nF٦ɻs]"{zA}c8Ѕ[Z|q !a9!0ʙ4Ŏ)Ppnd^M#i.pԑwumRSe< < LweԳis m 1EW^m}OJ6un/~bk ɓkKAxW;ѡC׸~ :1.ǽı։(Ol;xf/ 8:\䗟u;7/d S:#7z7r>thyӀ(pʠGr+zx0&01àW}MS$85>ϱ§c}}[>"W+ WYVӰZx0+Pxivդ'>qh" ֏ tTl_=/bUc[\$h'$p40yty ܈l]mUf^^K]/塅W62{_[^ S8G+GnYkվ@uӻ9w(asNY=1 ҃![r{Jky$m*jd'c?<rBNbg7“"<ȴf߄A~UG9ߪ pNd*%l2:"qjW=:p[5,"f-Y!^W F k~&r.]5L9o!SEG)˹FVhdv?[itNy ]9W绺 2Y'tہ;R|;8\_HщSCH$|W,>[M7xՀX8`|oyyOno/G `30L/+-9bף']rRp >N="ߗp^~Kct)[Mee-#{"SNJ]-DH:}YU'';:S|*%y]8Okά:HlDpAM#ŝ~;ՅV(y{ȑAЎ&.K=6bs'Z(0[DL6.v9"5ASZ9y(8:"9ã.wlkkxS? pi%qm%75`rys%<8|&6w-(sfi=c/e%v>ӓN^W׵֊=7k1㺋߽m9%j{0LN.#w7MibC帏7cVlF |jjx^=rr"*>!:t:* \£<RFyZ9Y`Ԛ3\I$Q|)>QIԬ7sR?RXpK~]dH3p!xYx'0Ņ,ѡ3I 9t1R\7|+ӫŁI9.O;/;~ X ͘<2Mh Wy72=r=1=6&/x)2^j~e3IF`l9ѧ[7#~K 2Eε x-?<*|I²]f|3Ne.Z:gqjܣP*-q+wO/Y.u9R.迨BzgOeG7?9\C7[ c[j ]Cy._y0bs ͵A+`ao' 0< 5g˰OтAk#W#. '_tI'L'ѐ|0swr f:? \;~~N^sv^/yI 'Fi\ɓ9]>ɣr0Q<]"zt~q f ˌN ◍x8=JCe fOð_M'w7>S_'$~)vN<^I"qbqo=rʐ7S*$Lᇞs>+`.ؼdAL !Srv`SZi q!laxEN ‫y\<}ܳI?5bDzlNTX߀ ׉kK3yq} 6t Lycݯ~=jŵ^{V879`NEXrJRc0Zqk1X|f1 u/bm\k@m`>ksk!a z#>6wЗB|}C&4b3m*F`©陚q'Ϫpy`ȹpAw^3e=}[ yLc@6/u0'|3=Yea3׸`6*k`OHg0-{sCg0w\OȈS?{g0l/o񣯹 * . RgsIU\/[sbk.5ĭ9Bk<8{HnF3AZ؇-\\6$ӵs[,w3u6MW̟`J9^O9gn3.si~cOf.rz½zM-l1`6u*3[\07KdF'xoCb3x9!hfFܺ4G!7_߀>f0ODY+6::y{h3%$SQw3Y.oϒ\y`3o{V Xc^3O6kNxG=} :oId4Uwٌ2J/n)D9N5[8|RGVCRQ?Y4Fd; Ur_ٿOC^Z[wK}eXnaDީ!}bƇ\6E#MA;O˫![B#6{=,̇Y3y?vx}Ev; ;G]^Qoz#I\,q)$&ebsW/ \l| Zw3ro3+`~4/g2sضLgYvSޚ^G&`{qR vWz.|]a;+){NeҮ<_ wp+$eq[(-|C[K[w,\ |s$i19;Ț7 z(y^uBi|Ta3'W?y ` 3Y+~y`SdK<#]rL|c=c#kpV<&{J b`y7j}!C -jX2poZu!X&|3bƝ fRu;7{FV䭖<"gK"> BQF6|y OIl6!M32YdpwV?+u-^p ZAlWǦ zU(ي6_J HMwj3.K1^.'&A`U-uϯpAx#\0bIG6uA\ g#))׭.,_3{`;J'AeahW@#;9Fխ* vA^gWJ{Q5m+4bf`~7p?3/зO즋GL>r峥v/ĽLM8q^=9,y-E(BiS?|l,|+̕[=ٙ h2$KFے]0ߡWF>ᕈ܀0)n-$Bfعl:sC`&#*G4ya3śܕ{++|<34 &ݹIpC8= HpwsO`f逝.:Xd[ X޻,v:@ / l#.Dy^t u=⓽rwnD\x_T6`lgLFyFo%`?\e.ϧ=jt.?ף x0.=JrB|޹CK ^.p COF\v:ƣR!f0mŽ3pBNLNqd|[^)0<UG)XV|0mͷk}'"Dl_;lX`.llÞVJRxȣOxZ{IJ'Okr;|,;$O7{o3%FN|4ԟ<:i_WA=!/^y2ȃ^ySrbMokfLJ\hQz% Z|:鄿hʲ:f0χ:¿^oÎ>.&6s{tAЇ]9a2=]o)F *ֿC8f!d>=al}aǼ=ٜ De<|Qv:ш'[b“ C$r'"H:LV,#<+úp7N??b?΅͉{,'*O">g fރ]p>$,,tgX}깭vAO־.V0&lәL LIpd zɃ茵9G_dz2j-KtZHO|Inb蟗9KLNF~3-F==,\x-ya G'6cu/?@?6[]뻧aY,_q6d}[~pAt dI= q9yp܃I6p'f0wA^ [+՝ $Qtm@o{|8z7}e6̗7o5cט}3zHΝ$#7.趇wZЯ?9*:ryu,`41xB>νtTX:i/RdH{ $N"Js %gqZg 𩳀/y`X4;$){h } nmV0b:pI$ːf0k.[ l]#t&b3l6[}+`a X~@[/% ȵ| RU=yn66sb햚2ٲ}\0jKVk|vN!xo;"-Ȃ.mn0L-}V;-ܿGǙ\ u,lea~v'g3 t>+3UR𯛑ٷB//[- 1o'`Pt.3zmO3?3qOz*y V`3IVf߇]^f&}Yd C^܌Lͫ·7J~3vV"\0[7ŝ?c?6#1`u./4^E򤺹`s|lGɍ@4DHA,܃ͪ,OW6|_cy? џz8>I3Օk Gww17qܠx0'C,lmXտ?X̖~^}4)`SIsG?Ջ$K| ?`*dGW?5+%O?.6s7ilˣWr5 fś\x~+v@XӞXa"01?1L;x~,f r`({4}K"l̇0絀~.B:5ֽ葏@?/Z}$>}`oGca0Q: ּ=y V7^~,񀎒:|cǧCُ5$c F^\K,X ycpZ%.轺rh fփe2z޲C|:tg0 OGs0ApqtcBbz/?yr2~ z71{v孿h6IL9Ͻ<̳ؔQ' ^X]83{᣺] i&<撌FO7s7=|z]M ݾ=7Vj@7]fo`W-=_6y9gQ}4f0_oF0RJHnd` &rʁÏ×>⧼s+#H^\WXV2{k"tU$"p9`W~yt2 A {Fzq^.y!;[l6ş,? ݽM}C.wo3`3mb$lMɡ"9SbGͯ/o]33<W.~gl+~e`ߏ9tf0w,w/r`Lp9](l/W6WM?^O{ݦϕˁLX"r7HtJU>ӝKL59"]|M3>lˣ3]l]83FcOzײ_׃䒘ezaGG^~Rv,z͆a9oÐ+\У oE #>ַ ,1PQr8A_\r'`otYqy_g <^Fz}ƽDϐZS- 85֋^gKGEu?*{/w~):ƭ3޸?auGS[;A&/Ƀ5qNmOw{ ~.KozW{?9uYO7rlFy.wAf?aݟً}߶cW(ҎS\5׆8 {ek;z8 [ u)Y Y? lF_ W 79}OJ}g#!}$Nv:K0zhgy>K]RMڎ,>!Å( y7.wLy_`V=Fޤ{Yr캭vJuej$L ]B|oǽf}Hl.]n}Hmn.\Ǜl1_֐sg"ǙLY,&G=nul6zc=Sa?pqR#E$9RrQgŸ+mm͙Y6ctЅcW7AE, |^cC[= yCYV(9"f0k0lrau3]0wW[[ϐy.`}u{iUYT=?_߇g0|C~6̒|+T7(>lp0-4O<1^8^򖬖/Ϟ`~c'ޗ}3Ox~L}&N.7m*WvlIĿ.:n?KocܷM8Zī:3u[а>d\* }W繠wX􍷾Ig".kmֺ1(m.6[8 p`9ƒIg>I~+=L&vǤ2lTĝFfCkSy\#Θ}vZŷ ˝{J~ő^d=oz%zz%bW6{ԝ.23۝A[5Kb蟃Y]0k쏅y_낞q %em݄b{_g{9킙WKMl5o} A;]dגxLG9CvS;J.3٦jπ鹳W[Ss8O'%=߅ɶu1^6*."97I}. \"ہ7]0'Ӧ8zQ/r!5)y{Y u6d#]޻A;rN|s CK= Zb_y3|+5yx̕R1칽 zQfMASv l>mf̐,0X| E.-^R$3˝<:ۓB;}m6d]. >UکB6sY kl+Ȳ9Qgd➋JSqU5:;20Z*09&H\Sb=rd~Q*@}>-LBVM]]`)8G<٘Qaqɱk?Őyh*Xur$"S}=,ş=jX :$qQL; ]EKĈQc)o(<sAv9^k%<7=d .# 8:GY1m6htu>|3c}O͹ ^ߟ:n khu/m>q#A+4~/O`ȕlMwNcO+$8x$t8z܄o\лnZ1a{5b}.?c?_ۃ.wr.{mU{Gl7w`l5z䩖D_nx8ጳ$<i\w Kj@E/=o?I.ۧr5y.^,p_ 6Ʒ f8_#:ruU}$r*˳wov{*Kn q݃tf0<"'wAϳar5,Z<>1=ƿ) 7`ny_-~U/.0es<x77 |A,y`` fX?k pAa"g;.>Csw&Hl`ׅsn -r_ίx.T d:t~w)?";|8] `.h.r z /bV'y zCc5ݎ\(ua o]7jࠝN]z?fؐ:qgZ=[_}_!%~ߝ r6s6{#3rWAV#rC.fXʼnoO#3x,G,aL~aݐ֧0uw1ϫy -׭.ĉ&w?=:x\_;_1װs~-~nK LAu)T̵}_tG+y[~m1wLJA_jBǾp3͜0Oףk&? \߄TCFV~'x|o>5Kr "~s%SXN!l)k|Bo `?+V:+ǯ9sL&˸xdYpN*!|ᐗ}& < ulvkp .? ?ܩ] zLS&OCM9eVK 񙠓!t2 yb.v7d?IR%nb?'B7[(拀_uыMXo^cBLzR8%n&>d\g0Plx,_r tR#M}Xh#Ma}H`vHB3$L&ۍɽudxRtbxH6Gp/Ŭq%6w)b7LV?"dCɓ^CcFB?}Rlo.]y'$~(6]< 39vj1>:As1ߢknqgf҉)ȏ$u뇐aǼ8q$GeiM Z1Fd:tbl^Dy=fL_3(O>⬭`2^鐜gVs3}Wcdx`{;{'p,6-ou;='Ao!iR1 {B[eÇttc0Y*0 Xj]φ|vHnaIu v%S;ntdJއ0g3neg4;bX>L|\0_Zr>ɋ- htF`bD6v'0|-Wީ3sTkELvM?Z.Z؜IogQr60dAw>N] z z>RGG \] b*>S|OۍЃ3-פpϭA'삹5(ϚNVi%]~˿u;X;O ϯ7SL"B3]\c.vuȽċ2%R$λ &;C yGǴB7gO N?F+o?3z2xTd+k(-9;y=b6n=##rshR VFO' ޺%u -G:^w+3 ~dyfvu`_r_{9钇3'|Om A j~VB}zo߰GOfp9=o1QuHޔJ:ō{>^ݢ>H&Aw7<")uLX>>_V{=crF.{ƾ!`$77g3~`-fU</"?|`;DNlf\0s a?{Rk%)Z`GbF7-o=["q&f{9f0~`$͞?+{#[j@clSAb73;2z<C97ˆb"> >cΡ<%|x3`Qix2ڰZe:91t<\bQ;"G@{bSܿu¿Π3ϧاjw 2Ykf )O{|ZB3}DKÑ-whN4ی ķb>EخuA-;8xZy2I ؍YA38^pt;H ;Wry>WCaK;t)tfg:W~ Y 8OWrvV ys}_~`]X/e_#`Oxاx\=$UCV5 ;pmGЃqoM3xE6e?\V_o%%Whͧ{WNߛ=si{k 'V' :Aexy3λ2o/0 S];q Z[ &>j9oDŽI|5>@rčnL)0k2M399UllO6dOV\Ɯӳx3Ha9[bţO?-lwronSLvA?e b}?_,oo[&z:w5x5HGg͝ix<C\0sq\AS |<٩%,ڮ%mr~6%Οc`ڮ]=`0~g~Klv`:'<aRZ}3;u zNCT߇ER`yK%r"x`8:939y#q.v;s5=3頋ȓbt0^hiS\Чx>>  5=,B#-ѭ|]?T_oF}̬\_.p*d5ū1=up8ϒЀAՐ-Ox.0]ٿgH\hD=NǼ:~~]S r w,ދo%rɟ&{rl %~>V]~W7(3@>/ ]NZ [?dD+7w.fVf2N p~ hVFs/"yP[FB󠹍R=f??V?`.)%2y:tdU tXxgp{xSoMOb0ž5j^ޑ懀`kHM=-> a5AȑIud*xw.wNȃEZ rûs .Y=?S@B?1vZ$fG282|uQ~asC7&V~/ x0^w Jdm%=+g H5te&D^5 ze䠎|g>-L|M'GY06zuuBb89~>?Zɭޭ$q 軼:-P=lfiLGWI=k>Zy>oJ}sE63h,MK/7K]x,>`э[ƒw,r;[#R\Y?Y]ljKG|.V8 -;]gVDBr|^JbA?z7nPkƁI' x4 |38 =LyFv/m1=l_ۃ=2 k9 =r4]\j9lż븧DB􎬐.5`bunyl.aws~ȵz\ 6D$lɎ0;xj[5Z['}a6S]۪{a--Gq3]g0NOoOsg\qю:''YMb_=wٕHRW?.r5msp/data/meuse.grid.rda0000644000175100001440000004653212061417051014364 0ustar hornikusers USǯ&tIxT2u~km("I!B)Ce̘HEdL*^dh'  9{{9[ޟ콾{8a+TiU%//\^= W!tp}G_޵cU#/oNtuɕj Gjc6E^_P}}۔,ضVk߫n|)ۼ{-uV;ʱ U֎Ѿo vF;w4ڹ[\o߮9\o_ogoomvvVc‚X.flNvW3犛?o n^?j↠?kp|;]OT\էTT*^)STqШNQJ\>i2SQuէ8T\Q+KTuգzT\ GTzT\:4GTzT\&cq.T Du). F)>G)>:U>i3'SQuէ88;O6wQWY^-}&_I73cTDzc :FY/k<67㶪A۪SEm])Q,*6"c~3 Dx(fDxJA'by' b1?.Q,,8- (nǯb(n b~cD;- XXt XXG%6Gb(B(F1Qb(F1Qb(F1Qb(/꭬ۑ1Vʵn+ut+vz}nwGoe\8r.z+ɵz$ne}|ZqZ=VǛk[Yw!q+:Z=ա-G[T·EoQ=ޢdEul'-OE[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[e?(FD[E[E[E[E[E[E[E[E[E[E[E[[?EoHeEKV}[[=EoIEGZ}߷ ߢ걣e{#WRVuպur.e}ܹV>\KY_ե+SǑ)jʺ^ngT[Y+bVb(F1Qb(F1Qb(F1Qb(F1Qb(F1Qb(vK?m{Nr+ٚF>9k9f??e!MWؤ~_ګRߦg}}-QOzr_ӆ7mϻ{eI^^7yg7Il}[L@3M:/o{+omva=Zo|z m|Yrg_dto*nGuV޿dqM>ބvN̗zS`)'yn6F޳>95=p>~ Kʓ~ozz/5V{_֪oOy=;awOy ɿV~YNaH]>Mp7ŲE'/<.oFu]ͼo}f96_e _?Kyj`r^}AY]ٶ{ߜ?fiϏu ޸=_]m=69wTr`/~_yn?YvIn _4i}W}}n97{j㟇W]c !{tkě1_Vk#/ݜԎoF\3ow} z}{m?o鸇oO[i_.W3CwOCogݬ7+rE'闞|»?t[I/NͰU_//3n/]M^RvŽxڛ?̶x`GU9$흞S.f֟|M5:Orٵuo߇|ӿWr6?[vmi3G εmtʺ_YK%oO_Vz+xᎂz߾Owy Kd̩q{|49o7u6ξ}݇U]>r9[/ګv&~oZ:M|zo5~Wm8?{֛\N O[gPeP>}w|^7nyw5Ot}GcAbbx͝-8\fͺYcx?Oŀߌ(OT 4-W}X3!:q㸚i?^}?-GO^ET<>7>=[gV!1G{pQKu-;"}/-[n2'c_ 2NHMpgƯij0a};p\Ez|lu[?n޵NW:Y#NrХk̔L^ m#{|~}Qߡ%oa?|>XԳR2o9_]E8\p.+{hI{>2^?*|r^89p7 I{%lA@s]wϑ鑩留WչdXҤǣǫz&\7 +%>wq1?==)O_w/c8Zoz]HַEp?(q>&>VnY,_Щ)W}IY{W}]z_ϙ= | xhj[yW>OOI 2|}~6I9ł5yo_,:Ͽ΃q^7yДi^;}fy*W=2ez8-k&5 -޿sg}]6C=j=O/m1p^`ȑ 7M''|.>=ex'oކju#>pE/>&i==J~8rκwaKp?MΚ;oF}.We|ԄE/7_uG뒲N+9__N]3`P̿jrxϓz| J}G?1\ 6IfO9ա.͛V{U?jTp~(#:6j l_:#;zP48_Lg7?yFsDauc%,׍.eM/6MX/O<},oz%v~?{Ec)| g^+qd]5U[cUa4ot3.zz˼>gڧҮi~Sϑ8̯~1}鱽 Mzp3J;:^kKݥl~7幃z2<駃"`Z=IUS7}h4=(e? 5gt?]_:u;Io^lpp>~)m:W{ɚamrBg5?ٯ,zrC}ܵqscl=MxK=2䵯 뒸.MvyMXgzҤuI њyqDC{_{x^&inGx_eq3M>ܡ~mYM{KZ=|Eǟ_=qdĴIxK}﫫T?Vy5Wg}g){\ <>9j?6:誆c'kmx˛J$S'i9]=ߙEgnn1O&%=KX\^o858ɷ\U7ݧ -zθ[󢛿l?3zǮx=tܼܟ? ־>dE)^^OlTV"_y ެ7ÓӒ%<<`I~9>6#2<1ޚ֮8w-[ 3GZ-^[1申6>ފy-{roeWwtɌ`!qu/eGz=;/}_/$%=g 8Ce^TIkz2<S]^4Gbe0Xm;[Ypm~U^˿z~M|.q<oD(|;[~5͛SJZ/ +/y}a˫֛5k͕uPvY%m.% oiwr{T<8X58voğ;,oՆG_>ou-`Z^$=K'ztz++s`^2Η:7UsϬtK#CkCx_Xn^~ yx?up]-rꔇyުIU.Uouq/[?оNy׏W?SL}Τq{ϧ=cmzs`>2}Ə=[0wn gɸbU&~wP_QC.ae4үǀag>ac#&}}pcM/ފ"m=ߢ}$"'MXw±"y*fB׽\--o^>aԻorêSG4|buWs<ۯUK?}jA=ޚ*?|~߬׽5&5~Yuu]}ؤ{Ϩ9ks[/|d77?vꔝ_^'vK^Y#ᣫrxXYm y_uo5ٓv=9G_zSץ9[W5[wNyN'/N'xzcaA<񼞧,>տ/~%+u}][U~򪦷~:ono- Ƒ>flYKZdh9ɧIGuE5lymp|-ͦj3x]eRpi{5lysg6~߯?Ym8[Cn5ߚvS'y/vCYS;ZÏmޚW}ejOӮuҪKqMfe[V >vOq q?=ǭ~?wZxUNj>~;tV*y&K'됥U+ :Yx%# j掇w>}w^㴪/o֌CVV-ޥuw'%y~YZuIDzΐ4o2e9U c˛]'WV~/|[iVr6/ѡoѧl{[\1s$(g̫suRS:]s4z<}-c"ǟ7,9uWou%{ARyz'cZzŊ!_9Ӻ55 |W ~2V}×k-Wm;UIu }>i&OX*/9I~)-iOs!-u-5>am~b n"_Rsϓ>{q%w$E|V_)`'}ϟuu}ӫyGz-ms}=a~q}EgIӁbx%Go8Kuuy:k[qޢ9iޢ5w:wkx\[i~ݫǿN],~_IxlR'yxRY}`˽??o/]-Էn+{~{#q~2ˑԏR#~2^ܗվ[|]*cϫyc ^;h |NeO63\g~԰T~pe*7k~<碕Kyc?li6i|}9㷫{NQ/cej?.=pu J z=,9w6ɛJ3GEU9f~mbOaoNTy 3{ڜ?ƏS{;%R<^{!+7чI/'>M|=Var?xɛk6?ܳQ~n*U}; +{KӮek//Vw>OO=>s^sY?3^f۫ϏO^xr ZS',b>NJv].cX}ϒ#OtKj΋9_;U:~?Gyo돟ό=~- i27s )9X=~ 63[]y9g}`^YD`?zmj}Iٮ{=dA7 ʼyLk8GO߭x"SlplMiv}G> O#$yIu˔u0n|ϺFO_/|_|O5򽽉C>zwvG>E=T Q3iKʷ ר-Y`<_?k[y~'^E ޗq|K}cz(aPϛ}NE|DEC4^ϙ>i1ii>4Z=jYou}yT[;'^OL|l~>u&S}?N}V9]=ǚϚٞ= ꛲i?'|̢>=Я?71fĮ^3˿_kr?ڧ~]5%W i=~W~-z5U(e]S]9oyHҸJ+5}8sɝoH=<]5_7xyk3.Oj|]1pRg2\z[{|yjܡT>י^ןN\g?ϐk=iHL>D~h~Gp$%?yyJ簓f::iW0NqN|}{H|~N9ṗgq'/37gߦztϟ$< ߇_Ox~?w'u? 3<~|4<`\&>W/v~7끺Lu?t~?D"4'{OQxx ɟNB~>WdD{s^j}.*pq:iUxy<^ QqL' 9w, 㤿qyc }p>OIsuۛPN/C=L>.7~ __}NӮ~zIbOXOH7y}yyw;O৤ÿ=o[Kb_e>mq>J:X+i3i_iڗK=j{%ga.}nvgsm|[սmյ)ڒ}8ٖmSɕ[ڑKm)kǿ ۫lk2]r۫۫-ܩmd~4RɤuIe{ە=%iK6ɴMԞ8竴fۖt ѿړMJm9_ֶڗwۙ+ⴱ$?ݾ;j;wf2v(ڛ+mNlK?sp Hw,){8\Ǖqdz#KQcn[ھ\lSD?O ~*Ǯ*R7tv)_@P oخSn}.kk6m:D?sRqWܫ8*j. .cf6Qdƒ3㿒3/ZKlcd3-vWu|T竰}L[%qkŽ9kJcf3W,jELS\ŝ_nwqct /8ɓ1v΋/3e}뺸?Eq79Ȥ-8mLǐTmɶM+yK՞TY'U ;gIړF%͑lL۔OIYP)윧Nҵ']ۦT$UۊjO&TȊ3cIۓ{S^IڒδI-Jږww;JjGZ(N[^#65m(.Y~JzEլ$mȶ(Kk\X;ˍ\hOIٶVmʤeۦlnOIKٴi{')>ME{N}ԨZj[Q#n&]bT6eZ?u3ic7]ژy+\}XԹ.l6fs=-?]%mkm̤LrmvdRlrn6glkms'Ӻ'އs{X ko&"1;)鱤;G}lE7JzesLq\3~=T{YysKIE]kٞ[ܶjoi3ɦ}ũc&L*]۪M5ݺDIjCxu[];E/>mK3w*f[67giwi*Ksߙ^_W(B-y~B??\ݶsn]wХmn?]Bݮӯ]ӱeupmB]hʹAEM/L/l/EXU,| _+3|e s ́0s ́0s ́0 s0 s0 s0 s0 s00Fsa#a900f sa3a900f sXa+a90V sXa+a90vsa;a90pN s8a'90pn sa790pn941y y!/MyiK[^:R$[L$[L$[L$[L$[LAAAAAAAAAA)ɦ$lJ)ɦ$lJ)ɦ$! fH6C͐ld3$! fJ6S͔ld3%)LfJ6SY͒ld$%,fI6KY͒ld%-lfK6[ْ͖ld%#H6G9͑lds$#J6W͕lds%+\J6a %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa %@Xa(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%CXbK a!,1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa),1%SXb KLa%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%XKXb K,a%,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla-,%[Xb Kla#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%8GXKa#,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX K\a+,q%WX Kܐ%b Bl}נ׊^ڤC)o(o(o(o(o(/(/(/(/(/(/(/(/(/(/(*ʫ(*ʫ(נ5(Ay kP^נ&5)IyMkR^פ&5)Ey-kQ^Zע(Ey-kS^ڔצ6)MymkS^:סu(CyP^:ס.u)Ky]R^ץ.%^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^ňW1Ux#^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^xW ^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^)"^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe A2W ^+xe I2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^+xeLI2W&$^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,EW"^Y+xe,MW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^+xelMW6&^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xCrW!^9+xKrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.%^+x\KrW.vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vA~;o ䷃vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+vE~"]߮oW+jߞW\^^-Ҿumk?m3sp/data/meuse.riv.rda0000644000175100001440000000245411674137630014245 0ustar hornikusers]{PUǗOy $1@ j*s +  LjYLah =Și̜ql1Ĉ O9s{v=b0ۿFۯ7_ω^`W8dYʭg,к`aO~l&I/MYi1/'?.y&=!o$o"'Qn>Զ~>vQbϫ N=Ziz9Lܩ9? Qk:]ݵ,-B[oa\AZgm2s8 jk3ms:HiRoUqNľ_.^V.L:&-'>s?w#t_).zɻ|umU/پ*bj3}S2oHzUP}u3]>|QQ.| OBd'y=Nކ>nY7^@9RW*HyR_rxz$ya_#Tl=qbϑ9\%/Sw6a߸z7@/2f·!uTR2O2* ˷`8 8?Xq_ sp/R/0000755000175100001440000000000012321302443011105 5ustar hornikuserssp/R/SpatialPointsDataFrame-methods.R0000644000175100001440000001434012314046747017250 0ustar hornikusers"SpatialPointsDataFrame" = function(coords, data, coords.nrs = numeric(0), proj4string = CRS(as.character(NA)), match.ID = TRUE, bbox=NULL) { if (is.character(match.ID)) { row.names(data) = data[, match.ID[1]] match.ID = TRUE } if (!is(coords, "SpatialPoints")) coords = coordinates(coords) cc.ID = dimnames(coords)[[1]] if (is.null(cc.ID)) match.ID = FALSE # nothing to match to! else if (match.ID && length(unique(cc.ID)) != nrow(data)) stop("nr of unique coords ID's (rownames) not equal to nr of data records") if (match.ID) { if (!is.null(cc.ID) && is(data, "data.frame")) { # match ID: data.ID = row.names(data) mtch = match(cc.ID, data.ID) 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) # 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(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.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] x@bbox = .bboxCoords(x@coords) x@data = x@data[i, j, ..., drop = FALSE] x }) setMethod("split", "SpatialPointsDataFrame", split.data.frame) setMethod("geometry", "SpatialPointsDataFrame", function(obj) as(obj, "SpatialPoints")) length.SpatialPointsDataFrame = function(x) { nrow(x@coords) } sp/R/surfaceArea.R0000644000175100001440000000223711635334422013466 0ustar hornikuserssurfaceArea.matrix <- function(m,cellx=1,celly=1,byCell=FALSE){ if(byCell){ mout = matrix(NA,nrow=nrow(m),ncol=ncol(m)) }else{ mout = NA } m=cbind(m[,1],m,m[,ncol(m)]) m=rbind(m[1,],m,m[nrow(m),]) storage.mode(m) <- "double" ret = .C("sarea", m, as.integer(nrow(m)), as.integer(ncol(m)), as.double(cellx), as.double(celly), sa=as.double(mout), bycell=as.integer(byCell), NAOK=TRUE) if(!byCell){ return(ret$sa) }else{ return(matrix(ret$sa,ncol=ncol(mout),nrow=nrow(mout))) } } setMethod("surfaceArea", signature("matrix"), surfaceArea.matrix) surfaceArea.SpatialGridDataFrame <- function(m,cellx=1,celly=1,byCell=FALSE){ cs = gridparameters(m)$cellsize ret = surfaceArea(as.matrix(m), cs[1], cs[2], byCell = byCell) if (is.matrix(ret)) { m[[1]] = as.vector(ret) m } else ret } setMethod("surfaceArea", signature("SpatialGridDataFrame"), surfaceArea.SpatialGridDataFrame) surfaceArea.SpatialPixelsDataFrame <- function(m, byCell=FALSE) surfaceArea(as(m, "SpatialGridDataFrame"), byCell = byCell) setMethod("surfaceArea", signature("SpatialPixelsDataFrame"), surfaceArea.SpatialPixelsDataFrame) sp/R/flipSGDF.R0000644000175100001440000000124211635334422012636 0ustar hornikusersflipHorizontal <- function(x) { if (!inherits(x, "SpatialGridDataFrame")) stop("x must be a SpatialGridDataFrame") grd <- getGridTopology(x) idx = 1:prod(grd@cells.dim[1:2]) m = matrix(idx, grd@cells.dim[2], grd@cells.dim[1], byrow = TRUE)[,grd@cells.dim[1]:1] idx = as.vector(t(m)) x@data <- x@data[idx, TRUE, drop = FALSE] x } flipVertical <- function(x) { if (!inherits(x, "SpatialGridDataFrame")) stop("x must be a SpatialGridDataFrame") grd <- getGridTopology(x) idx = 1:prod(grd@cells.dim[1:2]) m = matrix(idx, grd@cells.dim[2], grd@cells.dim[1], byrow = TRUE)[grd@cells.dim[2]:1, ] idx = as.vector(t(m)) x@data <- x@data[idx, TRUE, drop = FALSE] x } sp/R/subset.R0000644000175100001440000000131611773415527012560 0ustar hornikusers# taken from subset.data.frame: subset.Spatial = function(x, subset, select, drop = FALSE, ...) { 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 evaluate to logical") r <- r & !is.na(r) } if (missing(select)) vars <- TRUE else { nl <- as.list(seq_along(x@data)) names(nl) <- names(x@data) vars <- eval(substitute(select), nl, parent.frame()) } x[r, vars, drop = drop] } sp/R/Spatial-methods.R0000644000175100001440000002210412316777304014305 0ustar hornikusersSpatial <- 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("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("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("ANY", "CRS"), function(x, CRSobj, ...) stop("load package rgdal for spTransform methods") ) setMethod("spTransform", signature("ANY", "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)) if (ncol(object@data) > 1) obj[["data"]] = summary(object@data) else obj[["data"]] = summary(object@data[[1]]) 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)) #} plot.Spatial <- function(x, xlim=NULL, ylim=NULL, asp = NA, axes = FALSE, bg = par("bg"), ..., setParUsrBB=FALSE) { bbox <- bbox(x) if (is.null(xlim)) xlim <- bbox[1,] if (is.null(ylim)) ylim <- bbox[2,] if (is.na(asp)) asp <- ifelse(is.na(proj4string(x)) || is.projected(x), 1.0, 1/cos((mean(ylim) * pi)/180)) frame() # S-Plus compatible version of plot.new() if (is.R()) { plot.window(xlim = xlim, ylim = ylim, asp = asp, ...) if (setParUsrBB) par(usr=c(xlim, ylim)) } else { plot.default(x = bbox[1,], y = bbox[2,], type = "n", xlim = xlim, ylim = ylim, asp = asp, ann=FALSE, axes=FALSE, ...) 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() isp = is.projected(x) if (!is.na(isp) && !isp) { degAxis(1, ...) degAxis(2, ...) } else { axis(1, ...) axis(2, ...) } # axis(3, labels = FALSE, ...) # axis(4, labels = 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 (!("data" %in% slotNames(x))) stop("no $<- method for object without attributes") if (name %in% coordnames(x)) stop(paste(name, "is a coordinate name, please choose another name")) 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("[", 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 } ) sp/R/point.in.polygon.R0000644000175100001440000000613612067122657014500 0ustar hornikuserspoint.in.polygon = function(point.x, point.y, pol.x, pol.y, mode.checked=FALSE) { if (mode.checked) res <- .Call(R_point_in_polygon_sp, point.x, point.y, pol.x, pol.y) else res <- .Call(R_point_in_polygon_sp, as.numeric(point.x), as.numeric(point.y), as.numeric(pol.x), as.numeric(pol.y)) res } pointsInPolygon = function(pts, Polygon, mode.checked=FALSE) { pts = coordinates(pts) cc = slot(Polygon, "coords") point.in.polygon(pts[,1], pts[,2], cc[,1], cc[,2], mode.checked=mode.checked) } pointsInPolygons = function(pts, Polygons, #which = FALSE, mode.checked=FALSE) { rings = slot(Polygons, "Polygons") res = matrix(unlist(lapply(rings, function(x, pts) pointsInPolygon(pts, x, mode.checked=mode.checked), pts = pts)), ncol=length(rings)) res <- res > 0 # holes <- sapply(rings, function(y) slot(y, "hole")) # areas <- sapply(rings, function(x) slot(x, "area")) # if (any(holes) && any(res[,holes])) { # holerows <- which(res[,holes,drop=FALSE], arr.ind=TRUE)[,1] # odd <- rowSums(res[holerows,,drop=FALSE])%%2 != 0 # for (i in seq(along = holerows)) { # in_p <- which.min(areas[res[holerows[i],,drop=FALSE]]) # res[holerows[i],] <- FALSE # if (odd[i]) res[holerows[i], in_p] <- TRUE # } # res[,holes] <- FALSE # } # revised 100716 ret <- rowSums(res) %% 2 != 0 # ret <- apply(res, 1, any) # if (which) { # reta <- integer(length(ret)) # for (i in seq(along = ret)) { # if (ret[i]) reta[i] <- which(res[i,]) # else reta[i] <- as.integer(NA) # } # ret <- reta # } ret } pointsInSpatialPolygons0 = function(pts, SpPolygons) { sr = slot(SpPolygons, "polygons") res = lapply(sr, function(x, pts) pointsInPolygons(pts, x), pts = pts) #ret = rep(as.numeric(NA), nrow(coordinates(pts))) #for (i in seq(along = res)) # ret[res[[i]] > 0] = i #apply(do.call(rbind, res), 2, which) do.call(rbind, res) } pointsInSpatialPolygons = function(pts, SpPolygons, returnList = FALSE) { pls = slot(SpPolygons, "polygons") lb <- lapply(pls, function(x) as.double(bbox(x))) cpts <- coordinates(pts) storage.mode(cpts) <- "double" mode.checked <- storage.mode(cpts) == "double" cand <- .Call(tList, .Call(pointsInBox, lb, cpts[,1], cpts[,2]), as.integer(length(pls))) # rm(cand0) # gc(verbose=FALSE) res <- pointsInPolys2(pls, cand, cpts, mode.checked=mode.checked, returnList = returnList) res } pointsInPolys2 <- function(pls, cand, pts, mode.checked=FALSE, returnList = FALSE) { n <- nrow(pts) if (returnList) res = sapply(1:length(pls), function(x) integer(0)) else res <- rep(as.integer(NA), n) # print(cand) for (i in seq(along=cand)) { candi <- cand[[i]] if (length(candi) > 0) { ptsi <- pts[candi,,drop=FALSE] ret <- pointsInPolygons(ptsi, pls[[i]], mode.checked=mode.checked) #for (j in seq(along=candi)) { # jj <- candi[j] # if (is.na(res[jj])) # res[jj] <- ifelse(ret[j], i, as.integer(NA)) #} if (returnList) res[[i]] = candi[ret] else res[candi[ret]] = i } } res } sp/R/chfids.R0000644000175100001440000000355712067122516012512 0ustar hornikuserschFIDsSpatialLines <- function(obj, x) { nl <- length(slot(obj, "lines")) if (length(x) != nl) stop("lengths differ") if (length(x) > length(unique(x))) stop("duplicate IDs") # for (i in 1:nl) slot(slot(obj, "lines")[[i]], "ID") <- x[i] lns <- slot(obj, "lines") lns1 <- vector(mode="list", length=nl) for (i in 1:nl) { lni <- lns[[i]] slot(lni, "ID") <- x[i] lns1[[i]] <- lni } slot(obj, "lines") <- lns1 obj } setMethod("spChFIDs", signature(obj="SpatialLines", x="character"), chFIDsSpatialLines) chFIDsSpatialLinesDataFrame <- function(obj, x) { SL <- as(obj, "SpatialLines") SLx <- spChFIDs(SL, x) df <- as(obj, "data.frame") row.names(df) <- sapply(slot(SLx, "lines"), function(x) slot(x, "ID")) SpatialLinesDataFrame(SLx, data=df) } setMethod("spChFIDs", signature(obj="SpatialLinesDataFrame", x="character"), chFIDsSpatialLinesDataFrame) chFIDsSpatialPolygons <- function(obj, x) { np <- length(slot(obj, "polygons")) if (length(x) != np) stop("lengths differ") if (isTRUE(anyDuplicated(x))) stop("duplicate IDs") # for (i in 1:np) slot(slot(obj, "polygons")[[i]], "ID") <- x[i] pls <- slot(obj, "polygons") pls1 <- vector(mode="list", length=np) for (i in 1:np) { pli <- pls[[i]] slot(pli, "ID") <- x[i] pls1[[i]] <- pli } slot(obj, "polygons") <- pls1 obj } setMethod("spChFIDs", signature(obj="SpatialPolygons", x="character"), chFIDsSpatialPolygons) chFIDsSpatialPolygonsDataFrame <- function(obj, x) { SP <- as(obj, "SpatialPolygons") SPx <- spChFIDs(SP, x) df <- as(obj, "data.frame") row.names(df) <- .Call(SpatialPolygons_getIDs_c, SPx) SpatialPolygonsDataFrame(SPx, data=df) } setMethod("spChFIDs", signature(obj="SpatialPolygonsDataFrame", x="character"), chFIDsSpatialPolygonsDataFrame) sp/R/CRS-methods.R0000644000175100001440000000437712304402612013333 0ustar hornikusers# Copyright (c) 2003-8 by Barry Rowlingson and Roger Bivand if (!is.R()) { strsplit <- function(a,b) { if (a == as.character(NA)) return(as.character(NA)) else list(unlist(unpaste(a, b))) } } "CRS" <- function(projargs) { if (missing(projargs)) projargs <- as.character(NA) if (nchar(projargs) == 0) projargs <- as.character(NA) # condition added 140301 stopifnot(is.character(projargs)) if (!is.na(projargs)) { if (length(grep("^[ ]*\\+", projargs)) == 0) stop(paste("PROJ4 argument-value pairs must begin with +:", projargs)) } if (!is.na(projargs)) { if (length(grep("latlon", projargs)) != 0) stop("northings must follow eastings: ", projargs) if (length(grep("lonlat", projargs)) != 0) { projargs <- sub("lon", "long", projargs) warning("'lonlat' changed to 'longlat': ", projargs) } } if (is.na(projargs)) uprojargs <- projargs else uprojargs <- paste(unique(unlist(strsplit(projargs, " "))), collapse=" ") if (length(grep("= ", uprojargs)) != 0) stop(paste("No spaces permitted in PROJ4 argument-value pairs:", uprojargs)) if (length(grep(" [:alnum:]", uprojargs)) != 0) stop(paste("PROJ4 argument-value pairs must begin with +:", uprojargs)) # if (length(grep("rgdal", search()) > 0) && # (sessionInfo()$otherPkgs$rgdal$Version > "0.4-2")) { # sessionInfo()/read.dcf() problem in loop 080307 if (!is.na(uprojargs) && "rgdal" %in% .packages()) { res <- checkCRSArgs(uprojargs) if (!res[[1]]) stop(res[[2]]) uprojargs <- res[[2]] } res <- new("CRS", projargs=uprojargs) res } "print.CRS" <- function(x, ...) { pst <- paste(strwrap(x@projargs), collapse="\n") if (nchar(pst) < 40) cat(paste("CRS arguments:", pst, "\n")) else cat(paste("CRS arguments:\n", pst, "\n")) invisible(pst) } setMethod("show", "CRS", function(object) print.CRS(object)) identicalCRS = function(x, y) { if (! missing(y)) identical(CRS(proj4string(x)), CRS(proj4string(y))) else { # x has to be list: stopifnot(is.list(x)) if (length(x) > 1) { p1 = CRS(proj4string(x[[1]])) !any(!sapply(x[-1], function(p2) identical(CRS(proj4string(p2)), p1))) } else TRUE } } sp/R/SpatialGridDataFrame-methods.R0000644000175100001440000002522012172000766016651 0ustar hornikusersSpatialPixelsDataFrame = 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, "SpatialPoints")) points = SpatialPoints(points, proj4string = proj4string) points = SpatialPixels(points, tolerance = tolerance, round = round, grid = grid) new("SpatialPixelsDataFrame", points, data = data) } SpatialGridDataFrame = function(grid, data, proj4string = CRS(as.character(NA))) { if (!is(grid, "SpatialGrid")) grid = SpatialGrid(grid, proj4string) new("SpatialGridDataFrame", grid, data = data) } setMethod("addAttrToGeom", signature(x = "SpatialPixels", y = "data.frame"), function(x, y, match.ID, ...) SpatialPixelsDataFrame(geometry(x), y, ...) ) setMethod("addAttrToGeom", signature(x = "SpatialGrid", y = "data.frame"), function(x, y, match.ID, ...) SpatialGridDataFrame(geometry(x), y, ...) ) as.SPixDF.SGDF = function(from) { data = list() n = .NumberOfCells(from@grid) for (i in seq(along = from@data)) { v = vector(mode(from@data[[i]]), n) if (is.factor(from@data[[i]])) v = factor(rep(NA, n), levels = levels(from@data[[i]])) else v[-from@grid.index] = NA v[from@grid.index] = from@data[[i]] data[[i]] = v } data = data.frame(data, stringsAsFactors = FALSE) names(data) = names(from@data) SpatialGridDataFrame(from@grid, data, CRS(proj4string(from))) } #setAs("SpatialPixelsDataFrame", "SpatialGridDataFrame", as.SPixDF.SGDF) # Jon Skoien, Apr 18, 2013: # Version where from@data is first added to data, then the columns with # factors are correctly added in a second step. By far the fastest when # there are few factor columns. pix2grid = function(from) { n = .NumberOfCells(from@grid) data = data.frame(matrix(nrow = n, ncol = ncol(from@data))) data[from@grid.index,] = from@data # takes care of character columns names(data) = names(from@data) # Which columns have factors fids = which(sapply(from@data, is.factor)) if (length(fids) > 0) { for (fi in fids) { v = vector(mode(from@data[[fi]]), n) v = factor(rep(NA, n), levels = levels(from@data[[fi]])) v[from@grid.index] = from@data[[fi]] data[,fi] = v } } SpatialGridDataFrame(from@grid, data, CRS(proj4string(from))) } setAs("SpatialPixelsDataFrame", "SpatialGridDataFrame", pix2grid) as.SGDF.SPixDF = function(from) { # find rows with only NA's in attribute table: sel = apply(sapply(from@data, is.na), 1, function(x) !all(x)) #sel = TRUE if (!any(sel)) { warning("complete map seems to be NA's -- no selection was made") sel = rep(TRUE, length(sel)) } #SpatialPixelsDataFrame(points = coordinates(from)[sel,], # data = from@data[sel,,drop=FALSE], proj4string = CRS(proj4string(from))) new("SpatialPixelsDataFrame", new("SpatialPixels", new("SpatialPoints", coords = coordinates(from)[sel,], 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(x, "matrix", ...) } 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)) as.matrix.SpatialGridDataFrame = function(x, ..., byrow = FALSE) { if (ncol(x@data) > 1) warning( "as.matrix.SpatialPixelsDataFrame uses first column;\n pass subset or [] for other columns") # try, at some stage also: # matrix(x@data[[1]], x@grid@cells.dim[2], x@grid@cells.dim[1], byrow=TRUE) 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] 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") pts = SpatialPoints(coordinates(x)[idx,,drop=FALSE], CRS(proj4string(x))) if (length(idx) == 1) SpatialPointsDataFrame(pts, x@data[idx, k, drop = FALSE]) else { res = SpatialPixelsDataFrame(SpatialPixels(pts), x@data[idx, k, drop = FALSE]) as(res, "SpatialGridDataFrame") } } setMethod("[", "SpatialGridDataFrame", subs.SpatialGridDataFrame) cbind.SpatialGridDataFrame = function(...) { stop.ifnot.equal = function(a, b) { res = all.equal(getGridTopology(a), getGridTopology(b)) if (!is.logical(res) || !res) stop("topology is not equal") } grds = list(...) ngrds = length(grds) if (ngrds < 1) stop("no arguments supplied") if (ngrds == 1) return(grds[[1]]) # verify matching topology: sapply(grds[2:ngrds], function(x) stop.ifnot.equal(x, grds[[1]])) gr = grds[[1]] gr@data = do.call(cbind, lapply(grds, function(x) x@data)) #for (i in 2:ngrds) # gr@data = cbind(gr@data, grds[[i]]@data) proj4string(gr) = CRS(proj4string(grds[[1]])) gr } print.SpatialPixelsDataFrame = function(x, ...) { cat("Object of class SpatialPixelsDataFrame\n") print(as(x, "SpatialPixels")) 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", "SpatialPixelsDataFrame", function(object) print.SpatialPixelsDataFrame(object)) print.SpatialGridDataFrame = function(x, ...) { cat("Object of class SpatialGridDataFrame\n") print(as(x, "SpatialGrid")) 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) } sp/R/zerodist.R0000644000175100001440000000260012270774262013110 0ustar hornikuserszerodist <- function(obj, zero = 0.0, unique.ID = FALSE) { 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) if (unique.ID) .Call(sp_duplicates, as.vector(t(cc)), ncol(cc), zero, lonlat) + 1 else matrix(.Call(sp_zerodist, as.vector(t(cc)), ncol(cc), zero, lonlat), ncol = 2, byrow = TRUE) + 1 } zerodist2 <- function (obj1, obj2, zero = 0) { 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)) 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), 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) { if (! remove.second) obj = obj[length(obj):1,] zd = zerodist(obj, zero, unique.ID = TRUE) 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/compassRose.R0000644000175100001440000000131111635334422013533 0ustar hornikuserscompassRose<-function(x,y,rot=0,cex=1) { oldcex<-par(cex=cex) mheight<-strheight("M") xylim<-par("usr") plotdim<-par("pin") xmult<-(xylim[2]-xylim[1])/(xylim[4]-xylim[3])*plotdim[2]/plotdim[1] point.angles<-seq(0,2*pi,by=pi/4)+pi*rot/180 crspans<-rep(c(mheight*3,mheight/2),length.out=9) xpoints<-cos(point.angles)*crspans*xmult+x ypoints<-sin(point.angles)*crspans+y for(point in 1:8) { pcol<-ifelse(point%%2,"black","white") polygon(c(xpoints[c(point,point+1)],x),c(ypoints[c(point,point+1)],y),col=pcol) } txtxpoints<-cos(point.angles[c(1,3,5,7)])*1.2*crspans[1]*xmult+x txtypoints<-sin(point.angles[c(1,3,5,7)])*1.2*crspans[1]+y text(txtxpoints,txtypoints,c("E","N","W","S")) par(oldcex) } sp/R/Class-CRS.R0000644000175100001440000000055612211631117012731 0ustar hornikusers# Copyright (c) 2003-7 by Barry Rowlingson and Roger Bivand setClass("CRS", # slots = c(projargs = "character"), representation(projargs = "character"), prototype = list(projargs = character(1)), validity = function(object) { if (length(object@projargs) != 1) return("projargs must be of length 1") }) sp/R/Class-SpatialPointsDataFrame.R0000644000175100001440000000162312262362131016640 0ustar hornikuserssetClass("SpatialPointsDataFrame", contains = "SpatialPoints", #slots = c(data = "data.frame", coords.nrs = "numeric"), representation(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 (nrow(object@coords) < 1) stop("no points set: too few rows") if (ncol(object@coords) <= 1) stop("no points set: too few columns") 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)) stop("number of rows in data.frame and SpatialPoints don't match") n = length(object@coords.nrs) if (n > 0 && n != ncol(object@coords)) stop("inconsistent coords.nrs slot") return(TRUE) } ) sp/R/Class-SpatialLinesDataFrame.R0000644000175100001440000000071512211631407016436 0ustar hornikuserssetClass("SpatialLinesDataFrame", contains = "SpatialLines", #slots = c(data = "data.frame"), representation(data = "data.frame"), validity = function(object) { if (!inherits(object@data, "data.frame")) stop("data should be of class data.frame") if (nrow(object@data) != length(object@lines)) stop("number of rows in data.frame and SpatialLines don't match") return(TRUE) } ) as.SpatialLines.SLDF <- function(SLDF) SpatialLines(SLDF@lines) sp/R/SpatialPolygonsDataFrame-methods.R0000644000175100001440000001111712067122730017575 0ustar hornikusersSpatialPolygonsDataFrame <- function(Sr, data, match.ID = TRUE) { # Barry comment 110610 stopifnot(length(Sr@polygons) == nrow(data)) if (is.character(match.ID)) { row.names(data) = data[, match.ID[1]] match.ID = TRUE } if (match.ID) { # Sr_IDs <- sapply(slot(Sr, "polygons"), # function(i) slot(i, "ID")) Sr_IDs <- .Call(SpatialPolygons_getIDs_c, Sr) data_IDs <- row.names(data) mtch <- match(Sr_IDs, data_IDs) if (!identical(Sr_IDs, data_IDs)) { if (any(is.na(mtch))) stop("row.names of data and Polygons IDs do not match") if (length(unique(mtch)) != length(Sr_IDs)) stop("row.names of data and Polygons IDs do not match") data <- data[mtch, , drop = FALSE] } } res <- new("SpatialPolygonsDataFrame") res@bbox <- Sr@bbox res@proj4string <- Sr@proj4string res@plotOrder <- Sr@plotOrder res@data <- data res@polygons <- Sr@polygons # 120416 add top-level comment to reduce comment checking cSr <- comment(Sr) if (is.null(cSr)) comment(res) <- as.character(any(sapply(slot(res, "polygons"), function(x) !is.null(comment(x))), na.rm=TRUE)) else { if (!is.character(cSr) || is.na(cSr) || length(cSr) != 1) cSr <- as.character(any(sapply(slot(res, "polygons"), function(x) !is.null(comment(x))), na.rm=TRUE)) comment(res) <- cSr } res } setReplaceMethod("polygons", signature(object = "data.frame", value = "SpatialPolygons"), function(object, value) SpatialPolygonsDataFrame(value, object)) setMethod("polygons", signature(obj = "SpatialPolygons"), function(obj) as(obj, "SpatialPolygons")) setMethod("addAttrToGeom", signature(x = "SpatialPolygons", y = "data.frame"), function(x, y, match.ID, ...) SpatialPolygonsDataFrame(x, y, match.ID = match.ID, ...) ) names.SpatialPolygonsDataFrame = function(x) names(x@data) "names<-.SpatialPolygonsDataFrame" = function(x,value) { checkNames(value); names(x@data) = value; x } as.data.frame.SpatialPolygonsDataFrame = function(x, row.names, optional, ...) x@data setAs("SpatialPolygonsDataFrame", "data.frame", function(from) as.data.frame.SpatialPolygonsDataFrame(from)) row.names.SpatialPolygonsDataFrame <- function(x) { .Call(SpatialPolygons_getIDs_c, x) } "row.names<-.SpatialPolygonsDataFrame" <- function(x, value) { spChFIDs(x, value) } setMethod("[", "SpatialPolygonsDataFrame", function(x, i, j, ... , drop = TRUE) { missing.i = missing(i) missing.j = missing(j) nargs = nargs() # e.g., a[3,] gives 2 for nargs, a[3] gives 1. if (missing.i && missing.j) { i = TRUE j = TRUE } else if (missing.j && !missing.i) { if (nargs == 2) { j = i i = TRUE } else { j = TRUE } } else if (missing.i && !missing.j) i = TRUE if (is.matrix(i)) stop("matrix argument not supported in SpatialPolygonsDataFrame selection") if (is(i, "Spatial")) i = !is.na(over(x, geometry(i))) if (any(is.na(i))) stop("NAs not permitted in row index") #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] 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)) } y@polygons = x@polygons[i] # x@bbox <- .bboxCalcR(x@polygons) y@bbox <- .Call(bboxCalcR_c, y@polygons) if (is.numeric(i) && i < 0) { # area <- sapply(x@polygons, function(y) y@area) # x@plotOrder <- as.integer(order(area, decreasing=TRUE)) y@plotOrder <- .Call(SpatialPolygons_plotOrder_c, y@polygons) } else { y@plotOrder = order(match(i, x@plotOrder)) } 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) } sp/R/sp_spat1.R0000644000175100001440000000433112167024317012774 0ustar hornikusers# sp functions: if (!isClass("ppp")) setOldClass("ppp") if (!isClass("psp")) setOldClass("psp") if (!isClass("owin")) setOldClass("owin") if (!isClass("im")) setOldClass("im") 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) { #require(spatstat) 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) sp/R/recenter.R0000644000175100001440000001077211635334422013057 0ustar hornikusersif (!isGeneric("recenter")) setGeneric("recenter", function(obj) standardGeneric("recenter")) recenter.SpatialPolygons <- function(obj) { proj <- is.projected(obj) if (is.na(proj)) stop("unknown coordinate reference system") if (proj) stop("cannot recenter projected coordinate reference system") projargs <- CRS(proj4string(obj)) pls <- slot(obj, "polygons") Srl <- lapply(pls, recenter.Polygons) res <- SpatialPolygons(Srl, proj4string=projargs) res } setMethod("recenter", "SpatialPolygons", recenter.SpatialPolygons) recenter.Polygons <- function(obj) { ID <- slot(obj, "ID") rings <- slot(obj, "Polygons") srl <- lapply(rings, recenter.Polygon) res <- Polygons(srl, ID=ID) res } recenter.Polygon <- function(obj) { crds <- slot(obj, "coords") hole <- slot(obj, "hole") inout <- (crds[,1] < 0) if (all(inout)) { crds[,1] <- crds[,1]+360 } else { if (any(inout)) { crds[,1] <- ifelse(inout, crds[,1]+360, crds[,1]) } } res <- Polygon(crds, hole) res } recenter.SpatialLines <- function(obj) { proj <- is.projected(obj) if (is.na(proj)) stop("unknown coordinate reference system") if (proj) stop("cannot recenter projected coordinate reference system") projargs <- CRS(proj4string(obj)) lns <- slot(obj, "lines") Sll <- lapply(lns, recenter.Lines) res <- SpatialLines(Sll, projargs) res } setMethod("recenter", "SpatialLines", recenter.SpatialLines) recenter.Lines <- function(obj) { ID <- slot(obj, "ID") lines <- slot(obj, "Lines") sll <- lapply(lines, recenter.Line) res <- Lines(sll, ID=ID) res } recenter.Line <- function(obj) { crds <- coordinates(obj) inout <- (crds[,1] < 0) if (all(inout)) { crds[,1] <- crds[,1]+360 } else { if (any(inout)) { crds[,1] <- ifelse(inout, crds[,1]+360, crds[,1]) } } res <- Line(crds) res } nowrapSpatialLines <- function(obj, offset=0, eps=rep(.Machine$double.eps, 2)) { if (!is(obj, "SpatialLines")) stop("obj not a SpatialLines object") proj <- is.projected(obj) if (is.na(proj)) stop("unknown coordinate reference system") if (proj) stop("cannot recenter projected coordinate reference system") proj4CRS <- CRS(proj4string(obj)) bblong <- bbox(obj)[1,] inout <- bblong[1] < offset && bblong[2] >= offset if (inout) { pls <- slot(obj, "lines") Srl <- lapply(pls, .nowrapLines, offset=offset, eps=eps) res <- SpatialLines(Srl, proj4CRS) } else res <- obj res } .nowrapLines <- function(obj, offset=0, eps=rep(.Machine$double.eps, 2)) { bbo <- range(sapply(obj@Lines, function(x) range(x@coords[,1]))) inout <- bbo[1] < offset && bbo[2] >= offset if (inout) { lines <- slot(obj, "Lines") ID <- slot(obj, "ID") sll <- list() for (i in 1:length(lines)) { sll <- c(sll, .nowrapLine(lines[[i]], offset=offset, eps=eps)) } res <- Lines(sll, ID=ID) } else res <- obj res } .nowrapLine <- function(obj, offset=0, eps=rep(.Machine$double.eps, 2)) { bbo <- range(obj@coords[,1]) inout <- bbo[1] < offset && bbo[2] >= offset if (inout) { crds <- coordinates(obj) # zoffset <- as.logical(sapply(crds[,1], function(x) # all.equal(x, offset, tolerance = .Machine$double.eps))) zoffset <- as.logical(sapply(crds[,1], function(x) abs(x - offset) < eps[1])) if (any(zoffset)) { brks <- which(zoffset) n <- length(brks) for (i in 1:n) { ib <- brks[i] if (crds[(ib-1),1] < offset) crds[ib,1] <- crds[ib,1] - eps[1] else crds[ib,1] <- crds[ib,1] + eps[1] } } inout <- (crds[,1] <= offset) rle_io <- rle(as.integer(inout)) brks <- cumsum(rle_io$lengths) n <- length(brks) res <- list() if (n == 0) { if (all(crds[,1] < offset)) crds[,1] <- crds[,1] - eps[1] else crds[,1] <- crds[,1] + eps[2] res <- c(res, list(Line(crds))) } else { for (i in 1:n) { if (i == n) outcrds <- crds else { ib <- brks[i] pt1 <- crds[ib,] pt2 <- crds[(ib+1),] dpts <- pt1 - pt2 if (pt1[1] <= offset) { x1 <- offset - eps[1] x2 <- offset + eps[2] y1 <- pt1[2] + abs(pt1[1]-eps[1])* (dpts[2] / dpts[1]) y2 <- pt1[2] + abs(pt1[1]+eps[2])* (dpts[2] / dpts[1]) } else { x1 <- offset + eps[1] x2 <- offset - eps[2] y1 <- pt1[2] - abs(pt1[1]-eps[1])* (dpts[2] / dpts[1]) y2 <- pt1[2] - abs(pt1[1]+eps[2])* (dpts[2] / dpts[1]) } outcrds <- rbind(crds[1:ib,], c(x1, y1)) brks <- brks - nrow(outcrds) + 2 crds <- rbind(c(x2, y2), crds[-(1:ib),]) } res <- c(res, list(Line(outcrds#, proj4CRS ))) } } } else res <- list(obj) res } sp/R/Class-SpatialGridDataFrame.R0000644000175100001440000000143012211631643016246 0ustar hornikuserssetClass("SpatialPixelsDataFrame", contains = c("SpatialPixels", "SpatialPointsDataFrame"), #slots = c(data = "data.frame", coords.nrs = "numeric"), representation(data = "data.frame", coords.nrs = "numeric"), validity = function(object) { if (length(object@grid.index) != nrow(object@data)) stop("grid.index should have length equal to data slot") if (nrow(object@coords) != nrow(object@data)) stop("unequal number of objects in points and data.frame") return(TRUE) } ) setClass("SpatialGridDataFrame", contains = "SpatialGrid", #slots = c(data = "data.frame"), representation(data = "data.frame"), validity = function(object) { if (.NumberOfCells(object@grid) != nrow(object@data)) stop("unequal number of objects in full grid and data slot") return(TRUE) } ) sp/R/gridlines.R0000644000175100001440000000355512141175455013233 0ustar hornikusersdegreeLabelsNS = function(x) { pos = sign(x) + 2 dir = c("*S", "", "*N") paste(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") paste(abs(x), "*degree", dir[pos]) } gridlines = function(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), ndiscr = 20) { bb = bbox(x) 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, "NS"), Lines(eastlist, "EW")), CRS(proj4string(x))) } gridat <- function(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), offset=0.5, side="WS") { isp = is.projected(x) if (is.na(isp) || isp) stop("x must not be projected") bb = bbox(x) ac <- ifelse (side == "WS", 1L, 2L) easts <- easts[easts > bb[1,1] & easts < bb[1,2]] norths <- norths[norths > bb[2,1] & norths < bb[2,2]] a1 <- cbind(easts, rep(bb[2,ac], length(easts))) a1lab <- degreeLabelsEW(a1[,1]) a2 <- cbind(rep(bb[1,ac], length(norths)), norths) a2lab <- degreeLabelsNS(a2[,2]) as <- SpatialPoints(rbind(a1, a2), CRS(proj4string(x))) res <- SpatialPointsDataFrame(as, data.frame(labels = c(a1lab, a2lab), pos = c(rep(1L+((ac-1)*2), length(easts)), rep(2L+((ac-1)*2), length(norths))), offset = rep(offset, length(easts)+length(norths)), stringsAsFactors = FALSE ) ) res } sp/R/select.spatial.R0000644000175100001440000000110611635334422014152 0ustar hornikusers"select.spatial" <- function(data, digitize = TRUE, pch = "+", rownames = FALSE) { if (!is(data, "SpatialPoints")) stop("data should be of, or extend, class SpatialPoints") x = coordinates(data)[, 1] y = coordinates(data)[, 2] plot(x, y, pch = pch, asp = 1) if (rownames && is(data, "SpatialPointsDataFrame")) labels = row.names(as.data.frame(data)) else labels = 1:length(x) if (digitize) { pol = locator(n = 512, type = "o") sel = 1:length(x) sel = sel[point.in.polygon(x, y, pol$x, pol$y) > 0] } else sel = identify(x, y, labels = labels) labels[sel] } sp/R/Class-SpatialPolygons.R0000644000175100001440000001107112211631556015433 0ustar hornikuserssetClass("Polygon", contains = "Line", #slots = c(labpt = "numeric", area = "numeric", hole = "logical", # ringDir = "integer"), representation(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"), representation(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"), representation(polygons = "list", plotOrder = "integer"), prototype = list( bbox = matrix(rep(NA, 4), 2, 2, dimnames = list(NULL, c("min","max"))), proj4string = CRS(as.character(NA)), polygons = list(), plotOrder = integer(0)), validity = function(object) { # if (length(object@polygons) != length(object@plotOrder)) # return("length mismatch") # if (any(unlist(lapply(object@polygons, function(x) # !is(x, "Polygons"))))) # return("polygons not Polygons objects") # pls <- slot(object, "polygons") # IDs <- sapply(pls, slot, "ID") IDs <- .Call(SpatialPolygons_getIDs_c, object) if (anyDuplicated(IDs)) return("non-unique Polygons ID slot values") res <- .Call(SpatialPolygons_validate_c, object) res # if (length(object@polygons) != # length(unique(sapply(slot(object, "polygons"), # function(i) slot(i, "ID"))))) # return("non-unique Polygons ID slot values") # return(TRUE) } ) getPolygonCoordsSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@coords } getPolygonLabptSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@labpt } getPolygonAreaSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@area } getPolygonHoleSlot <- function(Polygon) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygon@hole } getPolygonsPolygonsSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@Polygons } getPolygonsplotOrderSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@plotOrder } getPolygonsLabptSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@labpt } getPolygonsIDSlot <- function(Polygons) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") Polygons@ID } getSpPpolygonsSlot <- function(SpP) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") SpP@polygons } getSpPplotOrderSlot <- function(SpP) { .Deprecated("slot", msg="use *apply and slot directly", package = "sp") SpP@plotOrder } getSpPPolygonsLabptSlots <- function(SpP) { .Deprecated("coordinates", msg="use coordinates method", package = "sp") Srs <- slot(SpP, "polygons") t(sapply(Srs, function(i) slot(i, "labpt"))) } getSpPPolygonsIDSlots <- function(SpP) { .Deprecated("coordinates", msg="use *apply and slot directly", package = "sp") Srs <- slot(SpP, "polygons") sapply(Srs, function(i) slot(i, "ID")) } getSpPnParts <- function(SpP) { .Deprecated("coordinates", msg="use *apply and slot directly", package = "sp") Srs <- slot(SpP, "polygons") sapply(Srs, function(x) length(slot(x, "Polygons"))) } getSpPnHoles <- function(SpP) { .Deprecated("coordinates", msg="use *apply and slot directly", package = "sp") Srs <- slot(SpP, "polygons") sapply(Srs, function(x) sapply(slot(x, "Polygons"), function(y) slot(y, "hole"))) } sp/R/Class-Spatial.R0000644000175100001440000000364612211631572013707 0ustar hornikusers# Lancaster, Thu Nov 4 14:44:00 GMT 2004, fresh start from icelfloe setClass("Spatial", #slots = c(bbox = "matrix", proj4string = "CRS"), representation(bbox = "matrix", proj4string = "CRS"), prototype = list(bbox = matrix(rep(NA, 6), 3, 2, dimnames = list(NULL, c("min","max"))), proj4string = CRS(as.character(NA))), # prototype should not pass validity validity = function(object) { # print("Entering validation: Spatial") 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") if (!is(object@proj4string, "CRS")) return("proj4string slot should be of class CRS") p4str <- object@proj4string@projargs if (!is.na(p4str) && nchar(p4str) > 0) { res <- grep("longlat", p4str, fixed=TRUE) if (length(res) != 0) {# unprojected, ll_sanity_res <- .ll_sanity(bb) if (!ll_sanity_res) { lst <- sapply(attr(ll_sanity_res, "details"), attr, "out") out <- paste(format(unlist(lst), digits=12), collapse=" ") mess <- paste("Geographical CRS given to", "non-conformant data:", out) if (get_ll_warn()) warning(mess) else stop(mess) } } # split out from proj4string<- and Spatial validity to cover numerical fuzz # RSB 070216 # && any(bb[1,1] < -180 || bb[1,2] > 360 || # bb[2,1] < -90 || bb[2,2] > 90)) # return("Geographical CRS given to non-conformant data") } # validate proj4string here? -- no, that's rdgal's business return(TRUE) } ) sp/R/dms.R0000644000175100001440000000555512211632017012026 0ustar hornikuserssetClass("DMS", #slots = c(WS="logical", deg="numeric", min="numeric", sec="numeric", NS="logical"), representation(WS="logical", deg="numeric", min="numeric", sec="numeric", NS="logical"), validity = function(object) { if (object@NS) { if (any(abs(object@deg) > 90)) return("abs(degree) > 90") } else { if (any(abs(object@deg) > 360)) return("abs(degree) > 360") else if (any(object@WS & (object@deg > 180))) return("degree < -180") else return(TRUE) } } ) "dd2dms" <- function(dd, NS=FALSE) { sdd <- sign(dd) WS <- ifelse(sdd < 0, TRUE, FALSE) dd <- abs(dd) deg <- as(floor(dd), "integer") dd <- (dd - deg)*60 mins <- as(floor(dd), "integer") sec <- (dd - mins)*60 tst <- abs(sec - 60.0) > sqrt(.Machine$double.eps) sec <- ifelse(tst, sec, 0.0) mins <- ifelse(tst, mins, mins+1) tst <- mins < 60 mins <- ifelse(tst, mins, 0) deg <- ifelse(tst, deg, deg+1) dms <- new("DMS", WS=WS, deg=deg, min=mins, sec=sec, NS=NS) tst <- validObject(dms) if (is.logical(tst) & tst) return(dms) else stop(tst) dms } as.double.DMS <- function(x, ...) { dd <- x@deg + x@min/60 + x@sec/3600 dd <- ifelse(x@WS, -dd, dd) dd } as.numeric.DMS <- function(x, ...) { if (!inherits(x, "DMS")) stop("not a DMS object") as.double.DMS(x) } setAs("DMS", "numeric", function(from) as.numeric.DMS(from)) as.character.DMS <- function(x, ...) { if (!inherits(x, "DMS")) stop("not a DMS object") if (!x@NS) tag <- c("W", "E") else tag <- c("S", "N") res <- ifelse(x@WS, tag[1], tag[2]) res <- paste(ifelse(round(x@sec, digits=3) != "0", paste(round(x@sec, digits=3), '\"', sep=""), ""), res, sep="") res <- paste(ifelse(((x@min != 0) | (round(x@sec, digits=3) != "0")), paste("d", x@min, "\'", sep=""), ""), res, sep="") res <- paste(x@deg, res, sep="") invisible(res) } setAs("DMS", "character", function(from) as.character.DMS(from)) "print.DMS" <- function(x, ...) { res <- as(x, "character") print(res, quote=FALSE) invisible(res) } setMethod("show", "DMS", function(object) print.DMS(object)) "char2dms" <- function(from, chd="d", chm="'", chs='"') { x <- substr(from, nchar(from), nchar(from)) NS <- any(x == "N" | x == "S") y <- substr(from, 1, nchar(from)-1) ndeg <- regexpr(chd, y) nmin <- regexpr(chm, y) nsec <- regexpr(chs, y) deg <- as(substr(y, 1, ndeg-1), "integer") smin <- substr(y, ndeg+1, nmin-1) dotmin <- regexpr("\\.", smin) ifelse (dotmin < 0, { mins <- as(ifelse(nmin < 1, 0, smin), "integer") sec <- as(ifelse(nsec < 1, 0, substr(y, nmin+1, nsec-1)), "numeric") }, { mins <- as(ifelse(nmin < 1, 0, smin), "integer") sec <- (as(smin, "numeric") - mins) * 60 }) WS <- ifelse(x == "W" | x == "S", TRUE, FALSE) dms <- new("DMS", WS=WS, deg=deg, min=mins, sec=sec, NS=NS) tst <- validObject(dms) if (is.logical(tst) & tst) return(dms) else stop(tst) dms } sp/R/SpatialPolygons-internals.R0000644000175100001440000001114311635334422016366 0ustar hornikusers .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/overlay.R0000644000175100001440000000713712120054415012721 0ustar hornikusersoverlayPointsWithPolygons = function(x, y, fn = NULL) { if (interactive()) .Deprecated("over", package = "sp") # x = pts, y = rings, return ring with f(grid) items y = as(y, "SpatialPolygons") id = pointsInSpatialPolygons(x, y) if (!is.null(fn)) ## WAS: data.frame(t(data.frame(lapply(split(df, id), fn)))) ## calls fn on complete data.frame; the following calls fn ## on each column: do.call(rbind, lapply(split(x@data, id), function(x) sapply(x, fn))) else id } setMethod("overlay", signature(x = "SpatialPointsDataFrame", y = "SpatialPolygons"), overlayPointsWithPolygons) setMethod("overlay", # added signature(x = "SpatialGridDataFrame", y = "SpatialPolygons"), function(x, y, ...) overlayPointsWithPolygons(as(x, "SpatialPoints"), y, ...)) setMethod("overlay", signature(x = "SpatialPoints", y = "SpatialPolygons"), function(x, y, ...) overlayPointsWithPolygons(x, y)) # no fn argument! setMethod("overlay", # added signature(x = "SpatialGrid", y = "SpatialPolygons"), function(x, y, ...) overlayPointsWithPolygons(as(x, "SpatialPoints"), y)) # no fn argument! overlayPolygonsWithPoints = function(x, y, ...) { .Deprecated("over", package = "sp") # x = rings, y = pts; return pts with ring values (or id) at grid point ypts = as(y, "SpatialPoints") sr = as(x, "SpatialPolygons") id = pointsInSpatialPolygons(ypts, sr) if (is(x, "SpatialPolygonsDataFrame")) { ret = x@data[id, , drop = FALSE] if (is(y, "SpatialPointsDataFrame")) row.names(ret) = row.names(as(y, "data.frame")) return(ret) } else return(id) # } setMethod("overlay", signature("SpatialPolygons", "SpatialPoints"), overlayPolygonsWithPoints) setMethod("overlay", signature("SpatialPolygons", "SpatialGrid"), # added function(x,y,...) overlayPolygonsWithPoints(x, as(y, "SpatialPoints"), ...)) #overlayGridWithPoints = function(x, y, fn = NULL) { # cc = coordinates(y) # idx = getGridIndex(cc, x@grid, all.inside = FALSE) # if (!fullgrid(x)) # idx = match(idx, x@grid.index) # if (is(x, "SpatialGridDataFrame")) { # data = as.data.frame(x@data[idx, ]) ## make sure we return a data frame # names(data) = names(x@data) # SpatialPointsDataFrame(cc, data, proj4string = CRS(proj4string(x))) # } # else # return(idx) #} overlayGridWithPoints = function(x, y, fn = NULL) { .Deprecated("over", package = "sp") cc = coordinates(y) idx = getGridIndex(cc, x@grid, all.inside = FALSE) if (!fullgrid(x)) idx = match(idx, x@grid.index) if (is(x, "SpatialGridDataFrame")) { # Rainer Krug 090331 rownames problem in maptools shapefile import cc <- SpatialPoints(cc, proj4string = CRS(proj4string(x))) SpatialPointsDataFrame(cc, x@data[idx, , drop=FALSE]) } else return(idx) } setMethod("overlay", signature("SpatialGridDataFrame", "SpatialPoints"), overlayGridWithPoints) setMethod("overlay", signature("SpatialGrid", "SpatialPoints"), overlayGridWithPoints) setMethod("overlay", signature("SpatialPixelsDataFrame", "SpatialPoints"), overlayGridWithPoints) setMethod("overlay", signature("SpatialPixels", "SpatialPoints"), overlayGridWithPoints) #overlayPointsWithGrid = function(x, y, fn = NULL) { # cc = coordinates(x) # idx = getGridIndex(cc, y@grid, all.inside = FALSE) # if (!fullgrid(x)) # idx = match(idx, x@grid.index) # if (is(x, "SpatialGridDataFrame")) # SpatialPointsDataFrame(cc, x@data[idx, ], proj4string = CRS(proj4string(x))) # else # return(idx) #} # #setMethod("overlay", signature("SpatialPointsDataFrame", "SpatialGrid"), # overlayPointsWithGrid) #setMethod("overlay", signature("SpatialPoints", "SpatialGrid"), # overlayPointsWithGrid) sp/R/SpatialLines-methods.R0000644000175100001440000002171312231420606015267 0ustar hornikusersLine <- 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(nchar(ID) > 0) 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") Sp <- new("Spatial", bbox = .bboxSls(LinesList), proj4string=proj4string) res <- new("SpatialLines", Sp, 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) { # 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 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] x@bbox = .bboxSls(x@lines) x } ) setMethod("coordnames", signature(x = "SpatialLines"), function(x) coordnames(x@lines[[1]]) ) setMethod("coordnames", signature(x = "Lines"), function(x) coordnames(x@Lines[[1]]) ) setMethod("coordnames", signature(x = "Line"), function(x) dimnames(coordinates(x))[[2]] ) setReplaceMethod("coordnames", signature(x = "SpatialLines", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value for (i in seq(along = x@lines)) coordnames(x@lines[[i]]) = value x } ) setReplaceMethod("coordnames", signature(x = "Lines", value = "character"), function(x, value) { for (i in seq(along = x@Lines)) coordnames(x@Lines[[i]]) = value x } ) setReplaceMethod("coordnames", signature(x = "Line", value = "character"), function(x, value) { dimnames(x@coords)[[2]] = value x } ) getSpatialLinesMidPoints = function(SL) { ret = lapply(SL@lines, function(x) sapply(x@Lines, function(X) apply(X@coords, 2, mean) ) ) ret = t(sapply(ret, function(x) apply(x, 1, mean))) SpatialPoints(ret, CRS(proj4string(SL))) } LinesLength = function(Ls, longlat=FALSE) sum(sapply(Ls@Lines, LineLength, longlat)) SpatialLinesLengths = function(SL, longlat) { if (missing(longlat)) { proj <- is.projected(SL) if (is.na(proj)) { longlat <- FALSE } else { longlat <- !proj } } if (!is.logical(longlat)) stop("longlat should be logical") sapply(SL@lines, LinesLength, longlat=longlat) } setAs("Lines", "SpatialPoints", function(from) { SpatialPoints(do.call(rbind, coordinates(from))) } ) setAs("SpatialLines", "SpatialPoints", function(from) { SpatialPoints( do.call(rbind, lapply(from@lines, function(x) as(x, "SpatialPoints"))), CRS(proj4string(from)) ) } ) SpatialLines2SpatialPointsDataFrame = function(from) { spp = as(as(from, "SpatialLines"), "SpatialPoints") L = lapply(from@lines, function(x) {rep(1:length(x@Lines), times = sapply(x@Lines, function(x) nrow(x@coords)))}) IDs = sapply(from@lines, function(x) x@ID) L2 = rep(IDs, times = sapply(L, length)) L3 = rep(1:length(from@lines), times = sapply(L, length)) L = unlist(L) SpatialPointsDataFrame(spp, data.frame(Lines.NR = L3, Lines.ID=L2, Line.NR=L), proj4string=CRS(proj4string(from))) } setAs("SpatialLines", "SpatialPointsDataFrame", function(from) SpatialLines2SpatialPointsDataFrame(from) ) setAs("SpatialPoints", "Line", function(from) Line(coordinates(from)) ) setAs("SpatialPoints", "Lines", function(from) Lines(as(from, "Line"), "ID") ) setAs("SpatialPoints", "SpatialLines", function(from) SpatialLines(list(as(from, "Lines")), from@proj4string) ) asWKTSpatialLines = function(x, digits = getOption("digits")) { ids = sapply(x@lines, function(x)slot(x,"ID")) df = data.frame(geometry = paste("MULTILINESTRING((", apply( signif(sapply(coordinates(x), function(x) x[[1]][1,]),digits=digits), 2, paste, collapse=" ")," ...))",sep="")) row.names(df) = ids df } print.SpatialLines = function(x, ..., digits = getOption("digits"), asWKT=FALSE) { cat("SpatialLines:\n") if (asWKT) print(asWKTSpatialLines(x, digits)) else show(x) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") } #setMethod("show", "SpatialLines", function(object) print.SpatialLines(object)) length.SpatialLines = function(x) { length(x@lines) } names.SpatialLines = function(x) { unlist(lapply(x@lines, function(X) X@ID)) } sp/R/spsample.R0000644000175100001440000003545512302143543013073 0ustar hornikusersmakegrid = function(x, n = 10000, nsig = 2, cellsize, offset = rep(0.5, nrow(bb))) { 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: nsig = max(ceiling(log10(bb[1,] / cellsize))) min.coords = signif(bb[,1] + offset * cellsize, nsig) 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] SpatialPoints(xy, CRS(proj4string(x))) } setMethod("spsample", signature(x = "Spatial"), sample.Spatial) sample.Line = function(x, n, type, offset = runif(1), proj4string = CRS(as.character(NA)), ...) { offset = offset[1] if (missing(n)) n <- as.integer(NA) if (!is.finite(n) || n < 1) return(NULL) cc = coordinates(x) lengths = LineLength(cc, longlat=FALSE, sum=FALSE) if (any(abs(lengths) < .Machine$double.eps)) { wl <- which(abs(lengths) < .Machine$double.eps) cc <- cc[-(wl),] lengths <- lengths[-(wl)] } csl = c(0, cumsum(lengths)) maxl = csl[length(csl)] if (type == "random") pts = runif(n) * maxl else if (type == "stratified") pts = ((1:n) - runif(n))/n * maxl else if (type == "regular") pts = ((1:n) - (1-offset))/n * maxl else stop(paste("type", type, "not available for Line")) # find coordinates: int = findInterval(pts, csl, all.inside = TRUE) where = (pts - csl[int])/diff(csl)[int] xy = cc[int, , drop=FALSE] + where * (cc[int+1, , drop=FALSE] - cc[int, , drop=FALSE]) if (nrow(xy) < 1) return(NULL) SpatialPoints(xy, proj4string) } setMethod("spsample", signature(x = "Line"), sample.Line) sample.Lines = function(x, n, type, offset = runif(1), ...) { L = x@Lines lengths = sapply(L, function(x) LineLength(x@coords)) if (sum(lengths) < .Machine$double.eps) stop("Lines object of no length") nrs = round(lengths / sum(lengths) * n) ret = vector("list", sum(nrs > 0)) j = 1 for (i in 1:length(L)) { if (nrs[i] > 0) { ret[[j]] = sample.Line(L[[i]], nrs[i], type = type, offset = offset, ...) j = j+1 } } do.call(rbind, ret) } setMethod("spsample", signature(x = "Lines"), sample.Lines) sample.SpatialLines = function(x, n, type, offset = runif(1), ...) { lengths = SpatialLinesLengths(x, longlat=FALSE) if (sum(lengths) < .Machine$double.eps) stop("SpatialLines object of no length") nrs = round(lengths / sum(lengths) * n) if (sum(nrs) == 0) warning("n too small, increase n and sample from output") ret = vector("list", sum(nrs > 0)) j = 1 for (i in 1:length(lengths)) { if (nrs[i] > 0) { ret[[j]] = sample.Lines(x@lines[[i]], nrs[i], type = type, offset = offset, ...) j = j+1 } } ret = do.call(rbind, ret) if (!is.null(ret)) proj4string(ret) = CRS(proj4string(x)) ret } setMethod("spsample", signature(x = "SpatialLines"), sample.SpatialLines) sample.Polygon = function(x, n, type = "random", bb = bbox(x), offset = runif(2), proj4string=CRS(as.character(NA)), iter=4, ...) { if (missing(n)) n <- as.integer(NA) #cat("n in sample.Polygon", n, "\n") area = slot(x, "area") if (area == 0.0) spsample(Line(slot(x, "coords")), n, type, offset = offset[1], proj4string=proj4string) #CRS(proj4string(x))), n, type, offset = offset[1]) else { res <- NULL its <- 0 n_now <- 0 bb.area = prod(apply(bb, 1, function(x) diff(range(x)))) bb.area <- bb.area + bb.area*its*0.1 xSP <- new("Spatial", bbox=bbox(x), proj4string=proj4string) if (type == "random") { brks <- c(1,3,6,10,20,100) reps <- c(5,4,3,2,1.5) n_is <- round(n * reps[findInterval(n, brks, all.inside=TRUE)] * bb.area/area) } else n_is <- round(n * bb.area/area) while (is.null(res) && its < iter && n_is > 0 && ifelse(type == "random", (n_now < n), TRUE)) { pts = sample.Spatial(xSP, n_is, type=type, offset = offset, ...) id = over(pts, SpatialPolygons(list(Polygons(list(x), "xx")), proj4string=proj4string)) Not_NAs <- !is.na(id) if (!any(Not_NAs)) res <- NULL else res <- pts[which(Not_NAs)] if (!is.null(res)) n_now <- nrow(res@coords) its <- its+1 } if (type == "random") if (!is.null(res) && n < nrow(res@coords)) res <- res[sample(nrow(res@coords), n)] res } } setMethod("spsample", signature(x = "Polygon"), sample.Polygon) sample.Polygons = function(x, n, type = "random", bb = bbox(x), offset = runif(2), proj4string=CRS(as.character(NA)), iter=4, ...) { if (missing(n)) n <- as.integer(NA) area = sapply(slot(x, "Polygons"), function(i) slot(i, "area")) # also available for Polygons! if (sum(area) == 0.0) # distribute n over the lines, according to their length? stop("sampling over multiple lines not functioning yet...") res <- NULL its <- 0 holes <- sapply(slot(x, "Polygons"), function(y) slot(y, "hole")) pls <- slot(x, "Polygons") smple <- rep(TRUE, length(pls)) if (length(pls) > 1) { # for (i in seq(along=pls)) { # bbi <- .bbox2SPts(bbox(pls[[i]]), proj4string=proj4string) # bb_in <- lapply(pls[-i], function(x, pts) # pointsInPolygon(pts, x), pts = bbi) # added condition 100716 # zzz <- do.call("rbind", bb_in) # if (holes[i] || (any(unlist(bb_in) == 1) && # !(sum(zzz[i,]) %% 2) == 0)) smple[i] <- FALSE # was [,i], changed to [i,] 110307 Aman Verma # } smple <- !holes # all heuristics removed, hole slots must be correctly defined 110308 } sum_area <- sum(area[smple]) while (is.null(res) && its < iter) { ptsres <- vector(mode="list", length=length(area)) for (i in seq(along=ptsres)) { if (smple[i]) { nnow <- ceiling(n*(area[i]/sum_area)) ptsres[[i]] <- sample.Polygon(x=pls[[i]], n=nnow, type = type, offset = offset, iter=iter) } } crds <- do.call(rbind, lapply(ptsres, function(x) if (!is.null(x)) coordinates(x))) if (is.null(crds)) res <- NULL else { pts <- SpatialPoints(crds, proj4string=proj4string) id = over(pts, SpatialPolygons(list(x), proj4string=proj4string)) Not_NAs <- !is.na(id) if (!any(Not_NAs)) res <- NULL else res <- pts[which(Not_NAs)] # Patrick Girardoux 080217 # if (type == "random" && nrow(res@coords) < n) res <- NULL if(!is.null(res)) if (type == "random" && nrow(res@coords) < n) res <- NULL } its <- its+1 } if (type == "random") if (!is.null(res) && n < nrow(res@coords)) res <- res[sample(nrow(res@coords), n)] res } setMethod("spsample", signature(x = "Polygons"), sample.Polygons) sample.SpatialPolygons = function(x, n, type = "random", bb = bbox(x), offset = runif(2), iter=4, ...) { #stop("not functioning yet...") if (missing(n)) n <- as.integer(NA) #cat("n in sample.SpatialPolygons", n, "\n") # EJP, 12/6/07: replaced area calculation with negative areas for holes... #area = sum(unlist(lapply(slot(x, "polygons"), function(x) slot(x, "area")))) getArea = function(x) { getAreaPolygons = function(x) { holes = unlist(lapply(x@Polygons, function(x) x@hole)) areas = unlist(lapply(x@Polygons, function(x) x@area)) area = ifelse(holes, -1, 1) * areas area } sum(unlist(lapply(x@polygons, getAreaPolygons))) } area = getArea(x) if (area <= 0.0) stop("cannot sample in zero-area polygons") res <- NULL its <- 0 bb.area = prod(apply(bb, 1, function(x) diff(range(x)))) n_tot = round(n * bb.area/area) while (is.null(res) && its < iter) { # enlarge n each iteration: pts = sample.Spatial(as(x, "Spatial"), n_tot * (1 + its * 0.1), type=type, offset = offset, ...) Over_pts_x <- over(pts, geometry(x)) Not_NAs <- !is.na(Over_pts_x) if (!any(Not_NAs)) res <- NULL else res <- pts[Not_NAs] # Patrick Girardoux 080217 # if (type == "random" && nrow(res@coords) < n) res <- NULL if(!is.null(res)) if (type == "random" && nrow(res@coords) < n) res <- NULL its <- its+1 } if (type == "random") if (!is.null(res) && n < nrow(res@coords)) res <- res[sample(nrow(res@coords), n)] if (is.null(res)) stop("iteration did not converge; try enlarging argument iter") proj4string(res) = CRS(proj4string(x)) res } setMethod("spsample", signature(x = "SpatialPolygons"), sample.SpatialPolygons) sample.Sgrid = function(x, n, type = "random", bb = bbox(x), offset = runif(nrow(bb)), ...) { if (missing(n)) n <- as.integer(NA) #cat("n in sample.Sgrid", n, "\n") area = areaSpatialGrid(x) if (area == 0.0) stop("cannot sample from grid with zero area") pts = spsample(as(x, "Spatial"), n, type, offset = offset, ...) pts[!is.na(over(pts, geometry(x)))] } setMethod("spsample", signature(x = "SpatialGrid"), sample.Sgrid) sample.Spixels = function(x, n, type = "random", bb = bbox(x), offset = runif(nrow(bb)), ...) { if (missing(n)) n <- as.integer(NA) #cat("n in sample.Spixels", n, "\n") area = areaSpatialGrid(x) if (area == 0.0) stop("cannot sample from grid with zero area") bb.area = prod(apply(bb, 1, function(x) diff(range(x)))) pts = spsample(as(x, "Spatial"), round(n * bb.area/area), type, offset = offset, ...) pts[!is.na(over(pts, geometry(x)))] } setMethod("spsample", signature(x = "SpatialPixels"), sample.Spixels) hexGrid = function(bb, n, offset, cellsize) { if (missing(cellsize)) { if (missing(n)) stop("need either cellsize or n") area = prod(apply(bb, 1, diff))/n # dx = area / (sqrt(3)/2) # suggested by Don MacQueen, macq@llnl.gov, Fri Mar 14 16:00:07 CET 2008 dx = sqrt(area)/(sqrt(3)/2) } else dx = cellsize xy = genHexGrid(dx, bb[,1], bb[,2]) # also suggested by Don MacQueen, macq@llnl.gov, Fri Mar 14 16:00:07 CET 2008: xy[,1] <- xy[,1] + offset[1] * dx xy[,2] <- xy[,2] + offset[2] * dx * sqrt(3)/2 attr(xy, "cellsize") = dx xy } # THK, posted to r-sig-geo, 03/03/2007: genHexGrid <- function(dx, ll = c(0, 0), ur = c(1, 1)) { dy <- sqrt(3) * dx / 2 x <- seq(ll[1], ur[1] - dx / 2, dx) y <- seq(ll[2], ur[2], dy) y <- rep(y, each = length(x)) x <- rep(c(x, x + dx / 2), length.out = length(y)) x <- x + (ur[1] - max(x)) / 2 y <- y + (ur[2] - max(y)) / 2 data.frame(x = x, y = y) } genPolyList <- function(hexGrid, dx) { # EJP; changed: # how to figure out dx from a grid? THK suggested: #dx <- hexGrid$x[2] - hexGrid$x[1] # and the following will also not allways work: if (missing(dx)) dx = 2 * min(diff(sort(unique(hexGrid$x)))) dy <- dx / sqrt(3) x.offset <- c(-dx / 2, 0, dx / 2, dx / 2, 0, -dx / 2, -dx / 2) y.offset <- c(dy / 2, dy, dy / 2, -dy / 2, -dy, -dy / 2, dy / 2) f <- function(i) list(x = hexGrid$x[i] + x.offset, y = hexGrid$y[i] + y.offset) ret = lapply(1:length(hexGrid$x), f) } # EJP, added: HexPoints2SpatialPolygons = function(hex, dx) { ret = genPolyList(data.frame(coordinates(hex)), dx = dx) npoly = length(ret) Srl <- vector(mode="list", length=npoly) IDS = paste("ID", 1:npoly, sep="") for (i in 1:npoly) Srl[[i]] = Polygons(list(Polygon(ret[[i]])), IDS[i]) res <- SpatialPolygons(Srl, proj4string=CRS(proj4string(hex))) res } fiboGrid <- function(N, xlim = c(-180,180), ylim = c(-90,90)) { if (max(xlim) <= 180) subtr = 180 else subtr = 0 phi = (1 + sqrt(5))/2 i = seq(-N, N) P = 2 * N + 1 lat = asin(2*i / P) * 180 / pi lon = ((2 * pi * i / phi) %% pi) * 360 / pi - subtr sel = lon <= xlim[2] & lon >= xlim[1] & lat <= ylim[2] & lat >= ylim[1] cbind(lon, lat)[sel, ] } sp/R/asciigrid.R0000644000175100001440000000613711635334422013206 0ustar hornikusersread.asciigrid <- function(fname, as.image = FALSE, plot.image = FALSE, colname=fname, proj4string = CRS(as.character(NA))) { t = file(fname, "r") l5 = readLines(t, n = 6) # instead of: # l5s = strsplit(l5, " ") # Michael Summer, mdsumner@utas.edu.au suggested: l5s = strsplit(l5, "\\s+", perl = T) xllcenter = yllcenter = xllcorner = yllcorner = as.numeric(NA) for (i in 1:6) { fieldname = casefold(l5s[[i]][1]) if (length(grep("ncols", fieldname))) ncols = as.numeric(l5s[[i]][2]) if (length(grep("nrows", fieldname))) nrows = as.numeric(l5s[[i]][2]) if (length(grep("xllcorner", fieldname))) xllcorner = as.numeric(l5s[[i]][2]) if (length(grep("yllcorner", fieldname))) yllcorner = as.numeric(l5s[[i]][2]) if (length(grep("xllcenter", fieldname))) xllcenter = as.numeric(l5s[[i]][2]) if (length(grep("yllcenter", fieldname))) yllcenter = as.numeric(l5s[[i]][2]) if (length(grep("cellsize", fieldname))) cellsize = as.numeric(l5s[[i]][2]) if (length(grep("nodata_value", fieldname))) nodata.value = as.numeric(l5s[[i]][2]) } if (is.na(xllcorner) && !is.na(xllcenter)) xllcorner = xllcenter - 0.5 * cellsize else xllcenter = xllcorner + 0.5 * cellsize if (is.na(yllcorner) && !is.na(yllcenter)) yllcorner = yllcenter - 0.5 * cellsize else yllcenter = yllcorner + 0.5 * cellsize map = scan(t, as.numeric(0), quiet = TRUE) close(t) if (length(as.vector(map)) != nrows * ncols) stop("dimensions of map do not match that of header") map[map == nodata.value] = NA if (as.image) { img = matrix(map, ncols, nrows)[,nrows:1] img = list(z = img, x = xllcorner + cellsize * ((1:ncols) - 0.5), y = yllcorner + cellsize * ((1:nrows) - 0.5)) if (plot.image) { image(img, asp = 1) return(invisible(img)) } else return(img) } df = data.frame(map) names(df) = colname grid = GridTopology(c(xllcenter,yllcenter), rep(cellsize,2), c(ncols,nrows)) SpatialGridDataFrame(grid, data = df, proj4string=proj4string) } write.asciigrid <- function(x, fname, attr = 1, na.value = -9999, ...) { # R> gridparameters(meuse.grid) # cellcentre.offset cellsize cells.dim # x 178460 40 78 # y 329620 40 104 #NCOLS 80 #NROWS 115 #XLLCORNER 178400.000000 #YLLCORNER 329400.000000 #CELLSIZE 40.000000 #NODATA_VALUE 1e31 if (!gridded(x)) stop("can only write SpatialGridDataFrame objects to asciigrid") x = as(x, "SpatialGridDataFrame") gp = gridparameters(x) if (length(gp$cells.dim) != 2) stop("asciigrid only supports 2D grids") if (gp$cellsize[1] != gp$cellsize[2]) stop("Asciigrid does not support grids with non-square cells") f = file(fname, open = "w") writeLines(c( paste("NCOLS", gp$cells.dim[1]), paste("NROWS", gp$cells.dim[2]), paste("XLLCORNER", gp$cellcentre.offset[1] - 0.5 * gp$cellsize[1]), paste("YLLCORNER", gp$cellcentre.offset[2] - 0.5 * gp$cellsize[2]), paste("CELLSIZE", gp$cellsize[1]), paste("NODATA_VALUE", na.value) ), f) z = x@data[[attr]] z[is.na(z)] = na.value write.table(t(matrix(z, gp$cells.dim[1], gp$cells.dim[2])), file = f, row.names = FALSE, col.names = FALSE, ...) close(f) } sp/R/disaggregate.R0000644000175100001440000000647612263176533013711 0ustar hornikusers # copied from raster: if (!isGeneric("disaggregate")) { setGeneric("disaggregate", function(x, ...) standardGeneric("disaggregate")) } # Robert Hijmans: explodePolygons <- function(x, ignoreholes=FALSE, ...) { 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 { if (!require(rgeos)) { stop('package rgeos is needed to relate holes to their corresponding polygons') } cmt <- as.integer(unlist(strsplit(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) proj4string(p) <- crs if (.hasSlot(x, 'data')) { np <- rep(1:npols, np) x <- x@data[np, , drop = FALSE] #rownames(x) <- 1:nrow(x) rownames(x) <- NULL SpatialPolygonsDataFrame(p, x, FALSE) } else { p } } setMethod("disaggregate", "SpatialPolygons", function(x,...) explodePolygons(x, ...)) setMethod("disaggregate", "SpatialPolygonsDataFrame", function(x,...) explodePolygons(x, ...)) explodeLines <- function(x, ...) { nlins <- length(x@lines) crs <- x@proj4string count <- 0 p <- NULL nl <- vector(length=nlins) for (i in 1:nlins) { parts <- x@lines[[i]]@Lines nl[i] <- length(parts) p <- c(p, sapply(1:nl[i], function(x) Lines(parts[x], count + x))) count <- count + nl[i] } p <- SpatialLines(p) proj4string(p) <- crs if (.hasSlot(x, 'data')) { nl <- rep(1:nlins, nl) x <- x@data[nl, , drop = FALSE] rownames(x) <- 1:nrow(x) SpatialLinesDataFrame(p, x, FALSE) } else p } setMethod("disaggregate", "SpatialLines", function(x,...) explodeLines(x, ...)) setMethod("disaggregate", "SpatialLinesDataFrame", function(x,...) explodeLines(x, ...)) # Roger, claims Barry wrote it first: unfoldLines = function(x) { crds <- coordinates(x) nobjs <- sum(sapply(crds, length)) out <- vector(mode="list", length=nobjs) i <- 1 for (j in seq(along=crds)) { jcrds <- crds[[j]] for (k in seq(along=jcrds)) { out[[i]] <- Lines(list(Line(jcrds[k])), as.character(i)) i <- i + 1 } } SLout <- SpatialLines(out) length(SLout) } sp/R/bubble.R0000644000175100001440000000316211635334422012476 0ustar hornikusers"bubble" <- function (obj, zcol = 1, ..., fill = TRUE, maxsize = 3, do.sqrt = TRUE, pch, col = c(2, 3), 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) { 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)) 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()) panel.xyplot(x, y, ...) } sp/R/bpy.colors.R0000644000175100001440000000104611635334422013334 0ustar hornikusers"bpy.colors" <- function (n = 100, cutoff.tails = 0.1, alpha = 1) { n <- as.integer(n[1]) if (n <= 0) return(character(0)) if (cutoff.tails >= 1 || cutoff.tails < 0) stop("cutoff.tails should be in [0, 1]") i = seq(0.5 * cutoff.tails, 1 - 0.5 * cutoff.tails, length = n) r = ifelse(i < .25, 0, ifelse(i < .57, i / .32 - .78125, 1)) g = ifelse(i < .42, 0, ifelse(i < .92, 2 * i - .84, 1)) b = ifelse(i < .25, 4 * i, ifelse(i < .42, 1, ifelse(i < .92, -2 * i + 1.84, i / .08 - 11.5))) rgb(r, g, b, alpha) } sp/R/Class-SpatialLines.R0000644000175100001440000000372212211631452014672 0ustar hornikuserssetClass("Line", #slots = c(coords = "matrix"), representation(coords = "matrix"), prototype = list(coords = matrix(0)), 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"), representation(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"), representation(lines = "list"), prototype = list(bbox = matrix(rep(NA, 2), 2, 2, dimnames = list(NULL, c("min","max"))), proj4string = CRS(as.character(NA)), 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/GridTopology-methods.R0000644000175100001440000001320312172000655015316 0ustar hornikusersGridTopology = 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))) { 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) Srl[[i]] <- Polygons(list(Polygon(coords=cbind(x, y) #, proj4string=proj4string )), ID=IDs[i]) } res <- SpatialPolygons(Srl, proj4string=proj4string) 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.R0000644000175100001440000001371512120054432016027 0ustar hornikusersSpatialPolygons <- 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 stopifnot(length(Srl) > 0) stopifnot(is(proj4string, "CRS")) res <- .Call(SpatialPolygons_c, Srl, pO, proj4string) validObject(res) # 120416 add top-level comment to reduce comment checking cSr <- as.character(any(sapply(slot(res, "polygons"), function(x) !is.null(comment(x))), na.rm=TRUE)) comment(res) <- cSr res } Polygon <- function(coords, hole=as.logical(NA)) { coords <- coordinates(coords) ## if (!is.matrix(coords)) stop("coords must be a two-column matrix") if (ncol(coords) != 2) stop("coords must be a two-column matrix") # RSB 091203 n <- dim(coords)[1] 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(nchar(ID) > 0) # 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") xx <- SpatialPolygons(x@polygons[i], proj4string=CRS(proj4string(x))) xx # 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 } ) setReplaceMethod("coordnames", signature(x = "Polygons", value = "character"), function(x, value) { for (i in seq(along = x@Polygons)) coordnames(x@Polygons[[i]]) = value x } ) setReplaceMethod("coordnames", signature(x = "Polygon", value = "character"), function(x, value) { dimnames(x@coords)[[2]] = value x } ) setMethod("coordinates", "SpatialPolygons", function(obj) { ret = t(sapply(slot(obj, "polygons"), function(i) slot(i, "labpt"))) dimnames(ret) = list(sapply(slot(obj, "polygons"), function(i) slot(i, "ID")), NULL) ret } ) getSpatialPolygonsLabelPoints = function(SP) { .Deprecated("slot", package = "sp", msg="use *apply and slot directly, or coordinates method") ret = t(sapply(slot(SP, "polygons"), function(x) slot(x, "labpt"))) SpatialPoints(ret, CRS(proj4string(SP))) } as.Lines.Polygons = function(from) { lst = lapply(from@Polygons, function(x) as(x, "Line")) Lines(lst, from@ID) } setAs("Polygons", "Lines", as.Lines.Polygons) as.SpatialLines.SpatialPolygons = function(from) SpatialLines(lapply(from@polygons, function(x) as(x, "Lines")), CRS(proj4string(from))) setAs("SpatialPolygons", "SpatialLines", as.SpatialLines.SpatialPolygons) as.SpatialPolygonsDataFrame.SpatialPolygons = function(from) { IDs <- sapply(slot(from, "polygons"), function(x) slot(x, "ID")) df <- data.frame(dummy = rep(0, length(IDs)), row.names=IDs) SpatialPolygonsDataFrame(from, df) } setAs("SpatialPolygons", "SpatialPolygonsDataFrame", as.SpatialPolygonsDataFrame.SpatialPolygons) length.SpatialPolygons = function(x) { length(x@polygons) } names.SpatialPolygons = function(x) { unlist(lapply(x@polygons, function(X) X@ID)) } sp/R/Class-SpatialGrid.R0000644000175100001440000000130012211631373014475 0ustar hornikuserssetClass("SpatialPixels", contains = "SpatialPoints", #slots = c(grid = "GridTopology", grid.index = "integer"), representation(grid = "GridTopology", grid.index = "integer"), validity = function(object) { if (nrow(object@coords) != length(object@grid.index)) stop("grid.index should have length equal to nrow(coords)") if (max(object@grid.index) > .NumberOfCells(object@grid)) stop("grid.index max value too large") if (min(object@grid.index) < 1) stop("grid.index min value too small") return(TRUE) } ) setClass("SpatialGrid", contains = "Spatial", #slots = c(grid = "GridTopology"), representation(grid = "GridTopology"), validity = function(object) { return(TRUE) } ) sp/R/image.R0000644000175100001440000002004112271532614012320 0ustar hornikusers# first argument of image generic _needs_ to be x! image.SpatialPixelsDataFrame = function(x, ...) image(as(x, "SpatialGridDataFrame"), ...) image.SpatialPixels = function(x, ...) { x <- SpatialPixelsDataFrame(x, data=data.frame(rep(1, dim(coordinates(x))[1]))) image(x, ...) } image.SpatialGridDataFrame = function(x, attr = 1, xcol = 1, ycol = 2, col = heat.colors(12), red=NULL, green=NULL, blue=NULL, axes = FALSE, xlim = NULL, ylim = NULL, add = FALSE, ..., asp = NA, setParUsrBB=FALSE, interpolate = FALSE, angle = 0, useRasterImage=(!.isSDI() && missing(breaks)), breaks, zlim = range(as.numeric(x[[attr]])[is.finite(x[[attr]])])) { if (!add) suppressWarnings(plot(as(x, "Spatial"), xlim = xlim, ylim = ylim, axes = axes, asp = asp, ..., setParUsrBB=setParUsrBB)) if (exists("rasterImage") && useRasterImage) { if (.isSDI()) warning("Bug in SDI raster handling - your R graphics window may stop displaying output") bb <- bbox(x) scl <- function(xx, zlim) { xx = matrix(as.numeric(xx), nrow(xx), ncol(xx)) #dr <- diff(range(x, na.rm = TRUE)) dr = diff(zlim) #mx <- min(x, na.rm = TRUE) mx = zlim[1] xx[xx < zlim[1] | xx > zlim[2]] = NA if (abs(dr) < .Machine$double.eps) res <- ifelse(is.na(xx), xx, 0.5) else res <- (xx - mx) / dr res } } if (is.null(red)) { if (exists("rasterImage") && useRasterImage) { if (!missing(breaks)) warning("set useRasterImage to FALSE when using breaks") #x <- x[attr] # NAs <- is.na(x[[1]]) m <- scl(t(matrix(x[attr][[1]], x@grid@cells.dim[1], x@grid@cells.dim[2])), zlim) m <- matrix(col[as.vector(m) * (length(col)-1) + 1], nrow(m), ncol(m)) ## if missing, set to transparent # m[is.na(m)] <- rgb(1, 1, 1, 0) rasterImage(m, bb[1,1], bb[2,1], bb[1,2], bb[2,2], interpolate = interpolate, angle = angle) } else { if (is.factor(x[[attr]])) x[[attr]] = as.numeric(x[[attr]]) image(as.image.SpatialGridDataFrame(x[attr], xcol, ycol), add = TRUE, col = col, zlim = zlim, breaks = breaks, ...) } } else { if (is.null(green) || is.null(blue)) stop("all colour bands must be given") # modified to handle NAs in input (typical for coercion of Spatial Pixels # to Spatial Grid) if (exists("rasterImage") && useRasterImage) { if (!missing(breaks)) warning("set useRasterImage to FALSE when using breaks") xd <- x@data[, c(red, green, blue)] NAs <- is.na(xd[, 1]) | is.na(xd[, 2]) | is.na(xd[, 3]) if (any(NAs)) xd <- xd[!NAs, ] ## create RGBs (using alpha=1 by default) RGBs <- rgb(xd, maxColorValue = 255) if (any(NAs)) { z <- rep(NA, length(NAs)) z[!NAs] <- RGBs RGBs <- z } cv <- coordinatevalues(getGridTopology(x)) m <- t(matrix(RGBs, x@grid@cells.dim[1], x@grid@cells.dim[2], byrow = FALSE)) rasterImage(m, bb[1,1], bb[2,1], bb[1,2], bb[2,2], interpolate = interpolate, angle = angle) } else { xd <- x@data[,c(red, green, blue)] NAs <- is.na(xd[,1]) | is.na(xd[,2]) | is.na(xd[,3]) if (any(NAs)) xd <- xd[!NAs,] RGBs <- rgb(xd, maxColorValue = 255) if (any(NAs)) { z <- rep(NA, length(NAs)) z[!NAs] <- RGBs RGBs <- z } fcols <- factor(RGBs) cv <- coordinatevalues(getGridTopology(x)) m <- matrix(as.integer(fcols), x@grid@cells.dim[1], x@grid@cells.dim[2], byrow=FALSE) res <- list(x=cv[[xcol]], y=sort(cv[[ycol]]), z=m[,ncol(m):1,drop=FALSE]) image(res, col=levels(fcols), add = TRUE, breaks = breaks, ...) } } } contour.SpatialGridDataFrame = function(x, attr = 1, xcol = 1, ycol = 2, col = 1, add = FALSE, xlim = NULL, ylim = NULL, axes = FALSE, ..., setParUsrBB = FALSE) { if (!add) plot(as(x, "Spatial"), xlim = xlim, ylim = ylim, axes = axes, ..., setParUsrBB=setParUsrBB) contour(as.image.SpatialGridDataFrame(x[attr], xcol, ycol), col = col, add = TRUE, ...) } contour.SpatialPixelsDataFrame = function(x, ...) contour(as(x, "SpatialGridDataFrame"), ...) as.image.SpatialGridDataFrame = function(x, xcol = 1, ycol = 2, attr = 1) { cv = coordinatevalues(getGridTopology(x)) m = as(x[attr], "matrix") list(x = cv[[xcol]], y = sort(cv[[ycol]]), z = m[,ncol(m):1,drop=FALSE]) } # contributed by Michael Sumner 24 Oct 2007 image2Grid <- function (im, p4 = as.character(NA), digits=10) { if (!all(c("x", "y", "z") %in% names(im))) stop("image must have components x, y, and z") # RSB reversed test order lux <- length(unique(signif(diff(im$x), digits=digits))) luy <- length(unique(signif(diff(im$y), digits=digits))) if (lux > 1 || luy > 1) stop("x or y not equally spaced") # RSB check for equal spacing cells.dim <- dim(im$z) xx <- im$x yy <- im$y lx <- length(xx) ly <- length(yy) if (all(c(lx, ly) == (cells.dim + 1))) { ##print("corners") if (!(lx == nrow(im$z) + 1 && ly == ncol(im$z) + 1 ) ) stop("dimensions of z are not length(x)(-1) times length(y)(-1)") xx <- xx[-1] - diff(xx[1:2])/2 yy <- yy[-1] - diff(yy[1:2])/2 } else { if (!(lx == nrow(im$z) && ly == ncol(im$z))) stop("dimensions of z are not length(x) times length(y)") } SpatialGridDataFrame(GridTopology(c(xx[1], yy[1]), c(diff(xx[1:2]), diff(yy[1:2])), cells.dim), data.frame(z = as.vector(im$z[, ncol(im$z):1])), proj4string = CRS(p4)) } # copied from the svMisc package, copyright Philippe Grosjean, # Romain Francois & Kamil Barton ".isSDI" <- function() { # This function is specific to Windows, but it is defined everywhere # so that we don't have to test the platform before use! # Check if Rgui was started in SDI mode (needed by some GUI clients) # 1) First is it Rgui? if (!.Platform$GUI[1] == "Rgui") return(FALSE) # This is not Rgui # RGui SDI mode: returns "R Console", in MDI mode: returns "RGui" if (getIdentification() == "R Console") return(TRUE) else return(FALSE) } # menugget, # from https://gist.github.com/menugget/7689145/raw/dac746aa322ca4160a5fe66c70fec16ebe26faf9/image.scale.2.r #This function creates a color scale for use with the image() #function. Input parameters should be consistent with those #used in the corresponding image plot. The "axis.pos" argument #defines the side of the axis. The "add.axis" argument defines #whether the axis is added (default: TRUE)or not (FALSE). imageScale <- function(z, zlim, col = heat.colors(12), breaks, axis.pos = 1, add.axis = TRUE, ...) { if (!missing(breaks)) if(length(breaks) != (length(col)+1)){stop("must have one more break than colour")} if (missing(breaks) & !missing(zlim)) breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) if (missing(breaks) & missing(zlim)) { zlim <- range(z, na.rm=TRUE) zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) } poly <- vector(mode="list", length(col)) for (i in seq(poly)) poly[[i]] <- c(breaks[i], breaks[i+1], breaks[i+1], breaks[i]) if (axis.pos %in% c(1,3)){ ylim<-c(0,1) xlim<-range(breaks) } if (axis.pos %in% c(2,4)) { ylim<-range(breaks) xlim<-c(0,1) } plot(1,1,t="n",ylim=ylim, xlim=xlim, axes=FALSE, xlab="", ylab="", xaxs="i", yaxs="i", ...) for (i in seq(poly)) { if(axis.pos %in% c(1,3)) polygon(poly[[i]], c(0,0,1,1), col=col[i], border=NA) if(axis.pos %in% c(2,4)) polygon(c(0,0,1,1), poly[[i]], col=col[i], border=NA) } box() if (add.axis) axis(axis.pos) } sp/R/SpatialGrid-methods.R0000644000175100001440000002143212262361331015103 0ustar hornikusersSpatialPixels = function(points, tolerance = sqrt(.Machine$double.eps), proj4string = CRS(as.character(NA)), round = NULL, grid = NULL) { if (!is(points, "SpatialPoints")) stop("points should be of class or extending SpatialPoints") is.gridded = gridded(points) if (is.na(proj4string(points))) proj4string(points) = proj4string if (is.null(grid)) grid = points2grid(points, tolerance, round) if (!is.gridded) { points@bbox[,1] = points@bbox[,1] - 0.5 * grid@cellsize points@bbox[,2] = points@bbox[,2] + 0.5 * grid@cellsize } new("SpatialPixels", points, grid = grid, grid.index = getGridIndex(coordinates(points), grid)) } SpatialGrid = function(grid, proj4string = CRS(as.character(NA))) { stopifnot(is(grid, "GridTopology")) if (is.character(proj4string)) proj4string = CRS(proj4string) cc = rbind(grid@cellcentre.offset - 0.5 * grid@cellsize, grid@cellcentre.offset + (grid@cells.dim - 0.5) * grid@cellsize) bb = .bboxCoords(cc) new("SpatialGrid", grid = grid, bbox = bb, proj4string = proj4string) } setAs("SpatialGrid", "SpatialPixels", function(from) { pts = as(from, "SpatialPoints") new("SpatialPixels", pts, grid = from@grid, grid.index = 1:length(pts)) } ) setAs("SpatialGrid", "SpatialPoints", function(from) SpatialPoints(coordinates(from), from@proj4string)) setMethod("coordinates", "SpatialPixels", function(obj) obj@coords) row.names.SpatialPixels <- function(x) { ret = dimnames(slot(x, "coords"))[[1]] if (is.null(ret)) ret = seq_len(nrow(x@coords)) ret } row.names.SpatialGrid <- function(x) 1:prod(x@grid@cells.dim) setMethod("coordinates", "SpatialGrid", function(obj) coordinates(obj@grid)) setMethod("plot", signature(x = "SpatialGrid", y = "missing"), function(x,y,...) 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) { obj = as(obj, "SpatialPixels") gi = obj@grid.index grid = obj@grid stopifnot(ncol(coordinates(obj)) == 2) xi = (gi %% 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,], CRS(proj4string(x)))) cc = as(cc, "SpatialGrid") cc } ) setAs("SpatialPixels", "SpatialGrid", function(from) SpatialGrid(from@grid, from@proj4string)) #setAs("SpatialGrid", "SpatialPixels", # function(from) { # pts = new("SpatialPoints", coords = coordinates(from), # bbox = from@bbox, proj4string = from@proj4string) # new("SpatialPixels", pts, grid = from@grid, grid.index = 1:NROW(cc)) #}) as.data.frame.SpatialPixels = function(x, row.names, optional, ...) as.data.frame(coordinates(x)) as.data.frame.SpatialGrid = as.data.frame.SpatialPixels setAs("SpatialPixels", "data.frame", function(from) as.data.frame.SpatialPixels(from)) setAs("SpatialGrid", "data.frame", function(from) as.data.frame.SpatialGrid(from)) print.SpatialPixels = function(x, ...) { cat("Object of class SpatialPixels\n") print(summary(x@grid)) cat("SpatialPoints:\n") print(coordinates(x)) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") invisible(x) } setMethod("show", "SpatialPixels", function(object) print.SpatialPixels(object)) print.SpatialGrid = function(x, ...) { cat("Object of class SpatialGrid\n") print(summary(x@grid)) cat("SpatialPoints:\n") print(coordinates(x)) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") invisible(x) } setMethod("show", "SpatialGrid", function(object) print.SpatialGrid(object)) # make a SpatialPolygons from a SpatialPixels - Kohris Sahlen workshop as.SpatialPolygons.SpatialPixels <- function(obj) { obj_crds <- coordinates(obj) IDs <- IDvaluesSpatialPixels(obj) nPolygons <- nrow(obj_crds) cS <- slot(slot(obj, "grid"), "cellsize") cS2 <- cS/2 cS2x <- cS2[1] cS2y <- cS2[2] Srl <- vector(mode="list", length=nPolygons) for (i in 1:nPolygons) { xi <- obj_crds[i,1] yi <- obj_crds[i,2] x <- c(xi-cS2x, xi-cS2x, xi+cS2x, xi+cS2x, xi-cS2x) y <- c(yi-cS2y, yi+cS2y, yi+cS2y, yi-cS2y, yi-cS2y) Srl[[i]] <- Polygons(list(Polygon(coords=cbind(x, y))), ID=IDs[i]) } res <- SpatialPolygons(Srl, proj4string=CRS(proj4string(obj))) res } setAs("SpatialPixels", "SpatialPolygons", function(from) as.SpatialPolygons.SpatialPixels(from)) IDvaluesSpatialPixels <- function(obj) { if (!is(obj, "SpatialPixels")) stop("function only works for objects of class or extending SpatialPixels") cc <- slot(obj, "grid.index") res <- as.matrix(sapply(cc, as.integer)) paste("g", res, sep="") } length.SpatialPixels = function(x) { nrow(x@coords) } length.SpatialGrid = function(x) { .NumberOfCells(x@grid) } setAs("SpatialGrid", "SpatialPolygons", function(from) { ret = as.SpatialPolygons.GridTopology(from@grid) proj4string(ret) = proj4string(from) ret } ) setMethod("coordnames", signature(x = "SpatialGrid"), function(x) dimnames(bbox(x))[[1]]) setReplaceMethod("coordnames", signature(x = "SpatialGrid", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value coordnames(x@grid) = value x } ) setAs("SpatialGrid", "GridTopology", function(from) getGridTopology(from)) setAs("SpatialPixels", "GridTopology", function(from) getGridTopology(from)) sp/R/loadmeuse.R0000644000175100001440000000225212117372557013227 0ustar hornikusers# loadMeuse = function(gridded = TRUE, river = FALSE) { # crs = CRS("+init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs") # meuse = NULL # meuse.grid = NULL # meuse.riv = NULL # data("meuse", envir = environment()) # coordinates(meuse) <- ~x+y # proj4string(meuse) <- crs # assign("meuse", meuse, envir = .GlobalEnv) # # data("meuse.grid", envir = environment()) # if (gridded) { # gridded(meuse.grid) <- ~x+y # } else # coordinates(meuse.grid) <- ~x+y # proj4string(meuse.grid) <- crs # assign("meuse.grid", meuse.grid, envir = .GlobalEnv) # # if (river) { # rm(meuse.riv) # data("meuse.riv", envir = environment()) # meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) # proj4string(meuse.riv) <- crs # assign("meuse.riv", meuse.riv, envir = .GlobalEnv) # } # invisible(NULL) # } loadMeuse = function() { #.Deprecated("demo(meuse)") warning("please run demo(meuse) to load the meuse data set") demo("meuse") } sp/R/gridded.R0000644000175100001440000000527711711731146012655 0ustar hornikuserssetMethod("gridded", "Spatial", function(obj) { is(obj, "SpatialPixels") || is(obj, "SpatialGrid") }) # grid -> points: setReplaceMethod("gridded", c("SpatialGridDataFrame", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPointsDataFrame"); obj }) setReplaceMethod("gridded", c("SpatialPixelsDataFrame", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPointsDataFrame"); obj }) setReplaceMethod("gridded", c("SpatialGrid", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPoints"); obj }) setReplaceMethod("gridded", c("SpatialPixels", "logical"), function(obj, value) { if (!value) obj = as(obj, "SpatialPoints"); obj }) # points -> grid: setReplaceMethod("gridded", c("SpatialPointsDataFrame", "logical"), function(obj, value) { if (value) obj = as(obj, "SpatialPixelsDataFrame"); obj }) setReplaceMethod("gridded", c("SpatialPoints", "logical"), function(obj, value) { if (value) obj = as(obj, "SpatialPixels"); obj }) # points -> grid, with grid specified as list(value, grid): setReplaceMethod("gridded", c("SpatialPointsDataFrame", "list"), function(obj, value) { if (value[[1]]) obj = SpatialPixelsDataFrame(obj, obj@data, grid = value[[2]]); obj }) setReplaceMethod("gridded", c("SpatialPoints", "list"), function(obj, value) { if (value[[1]]) obj = SpatialPixels(obj, grid = value[[2]]); obj }) # data.frame -> gridded: setReplaceMethod("gridded", c("data.frame", "formula"), function(obj, value) { coordinates(obj) = value; gridded(obj) = TRUE; obj }) setReplaceMethod("gridded", c("data.frame", "character"), function(obj, value) { coordinates(obj) = value; gridded(obj) = TRUE; obj }) # data.frame -> gridded, grid specified: setReplaceMethod("gridded", c("data.frame", "GridTopology"), function(obj, value) SpatialGridDataFrame(grid = SpatialGrid(grid = value), data.frame(obj))) setAs("SpatialPoints", "SpatialPixels", function(from) { SpatialPixels(from, grid = NULL) }) setAs("SpatialPointsDataFrame", "SpatialPixelsDataFrame", function(from) { SpatialPixelsDataFrame(from, from@data, grid = NULL) }) setMethod("fullgrid", c("Spatial"), function(obj) is(obj, "SpatialGrid")) setReplaceMethod("fullgrid", c("SpatialPixels", "logical"), function(obj, value) { if(value) obj = as(obj, "SpatialGrid"); obj }) setReplaceMethod("fullgrid", c("SpatialGrid", "logical"), function(obj, value) { if(!value) obj = as(obj, "SpatialPixels"); obj }) setReplaceMethod("fullgrid", c("SpatialPixelsDataFrame", "logical"), function(obj, value) { if(value) obj = as(obj, "SpatialGridDataFrame"); obj }) setReplaceMethod("fullgrid", c("SpatialGridDataFrame", "logical"), function(obj, value) { if(!value) obj = as(obj, "SpatialPixelsDataFrame"); obj }) sp/R/SpatialPoints-methods.R0000644000175100001440000001005012262362101015460 0ustar hornikusers"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) { bbox = t(apply(coords, 2, range)) dimnames(bbox)[[2]] = c("min", "max") as.matrix(bbox) } .checkNumericCoerce2double = function(obj) { if (any(!unlist(lapply(obj, is.numeric)))) stop("cannot retrieve coordinates from non-numeric elements") fin_check <- sapply(obj, function(x) all(is.finite(x))) if (!all(fin_check)) stop("non-finite coordinates") lapply(obj, as.double) } setMethod("coordinates", "list", function(obj) do.call(cbind, .checkNumericCoerce2double(as.data.frame(obj)))) setMethod("coordinates", "data.frame", function(obj) do.call(cbind, .checkNumericCoerce2double(obj))) setMethod("coordinates", "matrix", function(obj) { if (!is.numeric(obj)) stop("cannot derive coordinates from non-numeric matrix") if (any(!is.finite(obj))) stop("non-finite coordinates") dn = dimnames(obj) dd = dim(obj) storage.mode(obj) <- "double" dim(obj) = dd dimnames(obj) = dn obj } ) asWKTSpatialPoints = function(x, digits = getOption("digits")) { data.frame(geometry = paste("POINT(",unlist(lapply(data.frame( t(signif(coordinates(x),digits = digits))), paste, collapse=" ")),")",sep="")) } "print.SpatialPoints" <- function(x, ..., digits = getOption("digits"), asWKT = .asWKT) { cat("SpatialPoints:\n") if (asWKT) print(asWKTSpatialPoints(x, digits)) else print(x@coords) pst <- paste(strwrap(paste( "Coordinate Reference System (CRS) arguments:", proj4string(x))), collapse="\n") cat(pst, "\n") } setMethod("show", "SpatialPoints", function(object) print.SpatialPoints(object)) plot.SpatialPoints = function(x, pch = 3, axes = FALSE, add = FALSE, xlim = NULL, ylim = NULL, ..., setParUsrBB=FALSE, cex = 1, col = 1, lwd = 1, bg = 1) { if (! add) plot(as(x, "Spatial"), axes = axes, xlim = xlim, ylim = ylim, ..., setParUsrBB=setParUsrBB) cc = coordinates(x) points(cc[,1], cc[,2], pch = pch, cex = cex, col = col, lwd = lwd, bg = bg) } setMethod("plot", signature(x = "SpatialPoints", y = "missing"), function(x,y,...) plot.SpatialPoints(x,...)) points.SpatialPoints = function(x, y = NULL, ...) points(coordinates(x), ...) setMethod("coordinates", "SpatialPoints", function(obj) obj@coords) as.data.frame.SpatialPoints = function(x, row.names, optional, ...) data.frame(x@coords) setAs("SpatialPoints", "data.frame", function(from) as.data.frame(from)) row.names.SpatialPoints <- function(x) { ret = dimnames(slot(x, "coords"))[[1]] if (is.null(ret)) ret = seq_len(nrow(slot(x, "coords"))) 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) x@bbox = .bboxCoords(x@coords) x }) setMethod("coordnames", signature(x = "SpatialPoints"), function(x) dimnames(x@coords)[[2]]) setReplaceMethod("coordnames", signature(x = "SpatialPoints", value = "character"), function(x, value) { dimnames(x@bbox)[[1]] = value dimnames(x@coords)[[2]] = value x } ) length.SpatialPoints = function(x) { nrow(x@coords) } setMethod("$", "SpatialPoints", function(x, name) { if (name %in% coordnames(x)) return(x@coords[,name]) if (!("data" %in% slotNames(x))) stop("no $ method for object without attributes") x@data[[name]] } ) sp/R/projected.R0000644000175100001440000000511511742756307013233 0ustar hornikuserssetMethod("proj4string", signature(obj = "Spatial"), function(obj) as.character(obj@proj4string@projargs) ) ReplProj4string = function(obj, value) { p4str <- value@projargs ll <- FALSE if (!is.na(p4str)) { res <- grep("longlat", p4str, fixed=TRUE) if (length(res) != 0) ll <- TRUE } if (ll) { bb <- bbox(obj) ll_sanity_res <- .ll_sanity(bb) if (!ll_sanity_res) { lst <- sapply(attr(ll_sanity_res, "details"), attr, "out") out <- paste(format(unlist(lst), digits=12), collapse=" ") mess <- paste("Geographical CRS given to", "non-conformant data:", out) if (get_ll_warn()) warning(mess) else stop(mess) } } if (!is.na(is.projected(obj)) && !is.na(p4str)) { p4s <- proj4string(obj) if (p4s != p4str) { mess <- paste("A new CRS was assigned to an object with an existing CRS:\n", p4s, "\nwithout reprojecting.\nFor reprojection, use function spTransform in package rgdal", sep="") if (get_ReplCRS_warn()) warning(mess) } } obj@proj4string = value; obj } setReplaceMethod("proj4string", c("Spatial", "character"), function(obj, value) ReplProj4string(obj, CRS(value))) setReplaceMethod("proj4string", c("Spatial", "CRS"), ReplProj4string) # split out from proj4string<- and Spatial validity to cover numerical fuzz # RSB 070216 .ll_sanity <- function(bb) { TOL <- get_ll_TOL() tol <- .Machine$double.eps ^ TOL W <- bb[1,1] < -180 && !isTRUE(all.equal((bb[1, 1] - -180), 0, tolerance = tol)) if (W) attr(W, "out") <- bb[1,1] E <- bb[1,2] > 360 && !isTRUE(all.equal((bb[1, 2] - 360), 0, tolerance = tol)) if (E) attr(E, "out") <- bb[1,2] S<- bb[2,1] < -90 && !isTRUE(all.equal((bb[2, 1] - -90), 0, tolerance = tol)) if (S) attr(S, "out") <- bb[2,1] N <- bb[2,2] > 90 && !isTRUE(all.equal((bb[2, 2] - 90), 0, tolerance = tol)) if (N) attr(N, "out") <- bb[2,2] res <- !(any(W || E || S || N)) attr(res, "details") <- list(W, E, S, N) res } setMethod("is.projected", signature(obj = "Spatial"), function(obj) { p4str <- proj4string(obj) #ifdef R if (is.na(p4str) || nchar(p4str) == 0) #else #S if (p4str == "NA") # bloody S-Plus! #endif return(as.logical(NA)) else { #ifdef R res <- grep("longlat", p4str, fixed=TRUE) #else #S res <- grep("longlat", p4str) #endif if (length(res) == 0) return(TRUE) else return(FALSE) } } ) sp/R/merge.R0000644000175100001440000000306512256542610012344 0ustar hornikusers# Author: Robert J. Hijmans # Date : November 2011 # Version 1.0 # Licence GPL v3 if (!isGeneric("merge")) { setGeneric("merge", function(x, y, ...) standardGeneric("merge")) } 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, ...) { if (!('data' %in% slotNames(x))) stop('x has no attributes') d <- x@data d$donotusethisvariablename976 <- 1:nrow(d) y <- unique(y) # email, RJH, 12/24/13, replace: # i <- apply(y[, by.y, drop=FALSE], 1, paste) %in% # apply(x@data[, by.x, drop=FALSE], 1, paste) # by the following block: i <- apply(y[, by.y, drop=FALSE], 1, function(x) paste(x, collapse='_')) %in% apply(x@data[, by.x, drop=FALSE], 1, function(x) paste(x, collapse='_')) if (all(!i)) warning("none of the records in y can be matched to x") else if (sum(!i) > 0) warning(paste(sum(!i), "records in y cannot be matched to x")) y <- y[i, ,drop=FALSE] if (isTRUE(any(table(y[, by.y]) > 1))) stop("'y' has multiple records for one or more 'by.y' key(s)") if (!all.x) y$donotusethisvariablename679 <- 1 d <- merge(d, y, by=by, by.x=by.x, by.y=by.y, suffixes=suffixes, incomparables=incomparables, all.x=TRUE, all.y=FALSE) d <- d[order(d$donotusethisvariablename976), ] d$donotusethisvariablename976 <- NULL rownames(d) <- row.names(x) x@data <- d if (! all.x) { x <- x[!is.na(x@data$donotusethisvariablename679), ,drop=FALSE] x@data$donotusethisvariablename679 <- NULL } x } ) sp/R/stack.R0000644000175100001440000000401311635334422012344 0ustar hornikusers"spmap.to.lev" <- function (data, zcol = 1:n, n = 2, names.attr) { if (!(is(data, "SpatialPointsDataFrame") || (is(data, "SpatialGridDataFrame")))) stop("data is not of a class that extends SpatialPointsDataFrame") if (dimensions(data) > 2) { warning("spmap.to.lev ignores spatial dimensions beyond the first 2") cc = coordinates(data)[,1:2] data = as(data, "data.frame") coordinates(data) = cc } coord.names = dimnames(data@coords)[[2]] if (missing(names.attr)) { if (is.character(zcol)) names.attr = zcol else { names.attr = names(data)[zcol] zcol = names.attr } } else { if (length(names.attr) != length(zcol)) stop("length names.attr should match length of zcol") if (!is.character(zcol)) zcol = names(data)[zcol] } data = stack(as(data, "SpatialPointsDataFrame"), zcol) # replace with data.frame #data$ind = factor(as.character(data$ind), levels = zcol, labels = names.attr) # Arien Lam suggested: #data$ind = factor(data$ind, levels = unique(data$ind), labels = names.attr) # better (as it avoids unique()) is: data$ind = factor(data$ind, levels = zcol, labels = names.attr) names(data) = c(coord.names, "z", "name") data } stack.SpatialPointsDataFrame = function (x, select, ...) { lev = NULL xd = x@data cc = coordinates(x) cc.names = dimnames(cc)[[2]] if (!missing(select)) xd = xd[select] if (is.factor(xd[[1]])) { lev = levels(xd[[1]]) if (length(xd) > 1) for (i in 2:length(xd)) if (!identical(lev, levels(xd[[i]]))) stop("all factors should have identical levels") } nc = ncol(xd) xd = stack(data.frame(lapply(xd, as.numeric))) if (!is.null(lev)) xd[[1]] = factor(lev[xd[[1]]], levels = lev) ccr = data.frame(rep(cc[,1], nc)) for (i in 2:ncol(cc)) ccr = data.frame(ccr, rep(cc[,i], nc)) names(ccr) = cc.names data.frame(ccr, xd) } stack.SpatialGridDataFrame = function (x, select, ...) stack(as(x, "SpatialPointsDataFrame"), select, ...) stack.SpatialPixelsDataFrame = function (x, select, ...) stack(as(x, "SpatialPointsDataFrame"), select, ...) sp/R/mapasp.R0000644000175100001440000000073511635334422012527 0ustar hornikusersmapasp <- function(data, xlim = bbox(data)[1,], ylim = bbox(data)[2,]) { # calculates aspect ratio for levelplot of geographic data, # using proportial units (compare eqscplot) if (!is(data, "Spatial")) stop("cannot extract coordinates bounding box from data") if (!(is.na(proj4string(data)) || is.projected(data))) return( (diff(ylim)/diff(xlim)) / cos((mean(ylim) * pi)/180)) if (is.R() && version$major >= 2) return("iso") else return(diff(ylim)/diff(xlim)) } sp/R/rbind.R0000644000175100001440000000456212270775542012356 0ustar hornikusersmakeUniqueIDs <- 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)) SpatialPoints(do.call(rbind, lapply(list(...), coordinates)), CRS(proj4string(dots[[1]]))) } 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) } rbind.SpatialPixels = function(...) { dots = list(...) names(dots) <- NULL sp = do.call(rbind, lapply(dots, function(x) as(x, "SpatialPoints"))) gridded(sp) = T sp } rbind.SpatialPixelsDataFrame = function(...) { dots = list(...) names(dots) <- NULL sp = do.call(rbind, lapply(dots, function(x) as(x, "SpatialPointsDataFrame"))) gridded(sp) = T sp } rbind.SpatialPolygons = function(..., makeUniqueIDs = FALSE) { dots = list(...) names(dots) <- NULL stopifnot(identicalCRS(dots)) # checkIDSclash(dots) pl = do.call(c, lapply(dots, function(x) slot(x, "polygons"))) if (makeUniqueIDs) pl = makeUniqueIDs(pl) SpatialPolygons(pl, proj4string = CRS(proj4string(dots[[1]]))) } rbind.SpatialPolygonsDataFrame <- function(..., makeUniqueIDs = FALSE) { 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) } rbind.SpatialLines = function(..., makeUniqueIDs = FALSE) { dots = list(...) names(dots) <- NULL stopifnot(identicalCRS(dots)) ll = do.call(c, lapply(dots, function(x) slot(x, "lines"))) if (makeUniqueIDs) ll = makeUniqueIDs(ll) SpatialLines(ll, proj4string = CRS(proj4string(dots[[1]]))) } rbind.SpatialLinesDataFrame <- function(...) { dots = list(...) names(dots) <- NULL # bugfix Clement Calenge 100417 ll = do.call(rbind, lapply(dots, function(x) as(x, "SpatialLines"))) df = do.call(rbind, lapply(dots, function(x) x@data)) SpatialLinesDataFrame(ll, df) } sp/R/spOptions.R0000644000175100001440000000261112262362756013247 0ustar hornikusersget_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() } sp/R/spdists.R0000644000175100001440000000342612162756706012750 0ustar hornikusersspDistsN1 <- 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) { if (is(x, "Spatial")) { stopifnot(identical(proj4string(x), proj4string(y))) if (missing(longlat)) longlat = !is.na(is.projected(x)) && !is.projected(x) x = coordinates(x) y = coordinates(y) } stopifnot(ncol(x) == ncol(y)) if (ncol(x) != 2) { if (longlat) stop("cannot compute spherical distances for longlat data in more than 2 dimensions") d = outer(x[,1], y[,1], "-") ^ 2 if (ncol(x) > 2) for (i in 2:ncol(x)) d = d + outer(x[,i], y[,i], "-") ^ 2 matrix(sqrt(d), nrow(x), nrow(y)) } else { spDiN1 = function(x, y, ll) spDistsN1(y, x, ll) if (nrow(x) < nrow(y)) matrix(t(apply(x, 1, spDiN1, y = y, ll = longlat)), nrow(x), nrow(y)) else matrix(apply(y, 1, spDiN1, y = x, ll = longlat), nrow(x), nrow(y)) } } sp/R/Class-GridTopology.R0000644000175100001440000000117012211631223014713 0ustar hornikuserssetClass("GridTopology", #slots = c(cellcentre.offset = "numeric", # cellsize = "numeric", # cells.dim = "integer"), representation(cellcentre.offset = "numeric", cellsize = "numeric", cells.dim = "integer"), prototype = list( # not so relevant what this does cellcentre.offset = numeric(0), cellsize = numeric(0), cells.dim = integer(0)), validity = function(object) { n = length(na.omit(object@cellcentre.offset)) if (length(na.omit(object@cellsize)) != n) return("cellsize has incorrect dimension") if (sum(object@cells.dim > 0) != n) return("cells.dim has incorrect dimension") return(TRUE) } ) sp/R/Class-SpatialPoints.R0000644000175100001440000000117312262362151015075 0ustar hornikuserssetClass("SpatialPoints", contains = "Spatial", #slots = c(coords = "matrix"), representation(coords = "matrix"), prototype = list(bbox=matrix(NA), proj4string = CRS(as.character(NA)), coords = matrix(0)), validity = function(object) { if (!is.matrix(object@coords)) stop("coords slot is not a matrix") if (length(object@coords) == 0) stop("coords cannot have zero length") if (nrow(object@coords) < 1) stop("no points set: too few rows") if (ncol(object@coords) < 2) stop("no points set: too few columns") if (!is.double(object@coords[,1])) stop("coordinates should be double") return(TRUE) } ) sp/R/spplot.R0000644000175100001440000006206412222570734012573 0ustar hornikuserssp.polygons = 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], ...) } } } sp.lines = function(obj, col = 1, ...) { if (is.character(obj)) obj = get(obj) sp.lines3 = function(x, col, ...) panel.lines(coordinates(x), col = col, ...) sp.lines2 = function(x, col, ...) lapply(x@Lines, sp.lines3, col = col, ...) if (is(obj, "SpatialLines")) lapply(obj@lines, sp.lines2, col = col, ...) else if (is(obj, "Lines")) lapply(obj@Lines, sp.lines3, col = col, ...) else if (is(obj, "Line")) panel.lines(coordinates(obj), col = col, ...) else stop(paste("obj of class Line, Lines or SpatialLines expected, got", class(obj))) } sp.points = function(obj, pch = 3, ...) { if (is.character(obj)) obj = get(obj) xy = coordinates(obj) panel.points(xy[,1], xy[,2], pch = pch, ...) } sp.grid = function(obj, col = 1, alpha = 1, ..., at = pretty(obj[[1]]), col.regions = col) { if (is.character(obj)) obj = get(obj) 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)) } sp.text = function(loc, txt, ...) { if (!is.numeric(loc)) stop("loc should be numeric") 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") #panel.text(loc[[1]], loc[[2]], txt, ...) } sp.panel.layout = function(lst, p.number, ...) { sp.panel0 = function(x, first = FALSE, ...) { if (is.character(x)) # obj = get(x) x = get(x) if (!is.null(x$which) && is.na(match(p.number, x$which))) return() if (inherits(x, "list")) { # 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)]) } else if (is(x, "SpatialLines") || is(x, "Lines") || is(x, "Line")) sp.lines(x, ...) else if (is(x, "SpatialPoints")) sp.points(as(x, "SpatialPoints"), ...) else if (is(x, "SpatialPolygons")) sp.polygons(x, ...) else if (is(x, "SpatialPixels") || is(x, "SpatialGrid")) sp.grid(x, ...) else stop(paste("cannot plot object of class", class(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))) } 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) { 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), 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,]) { 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), 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) { 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), 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) 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) { # set first = TRUE defaults for polygons objects in sp.layout: if (!missing(sp.layout) && inherits(sp.layout, "list")) { if (inherits(sp.layout[[1]], "list")) { for (i in seq(along = sp.layout)) { if (inherits(sp.layout[[i]], "list")) { sp.i = sp.layout[[i]] if (is.null(sp.i$first) && sp.i[[1]] == "sp.polygons") sp.layout[[i]]$first = TRUE } } } else if (is.null(sp.layout$first) && sp.layout[[1]] == "sp.polygons") sp.layout$first = TRUE } # print(sp.layout) sp.panel.layout(sp.layout, panel.number(), first = TRUE) panel.levelplot(x, y, z, subscripts, ...) sp.panel.layout(sp.layout, panel.number()) } panel.polygonsplot = function (x, y, z, subscripts, at = pretty(z), shrink, labels = NULL, label.style = c("mixed", "flat", "align"), contour = FALSE, region = TRUE, col = add.line$col, lty = add.line$lty, lwd = add.line$lwd, cex = add.text$cex, font = add.text$font, fontfamily = add.text$fontfamily, fontface = add.text$fontface, col.text = add.text$col, ..., col.regions = regions$col, alpha.regions = regions$alpha, grid.polygons, sp.layout) { regions <- trellis.par.get("regions") add.line <- trellis.par.get("add.line") add.text <- trellis.par.get("add.text") numcol <- length(at) - 1 numcol.r <- length(col.regions) col.regions <- if (numcol.r <= numcol) rep(col.regions, length = numcol) else col.regions[floor(1 + (1:numcol - 1) * (numcol.r - 1)/(numcol - 1))] zcol <- rep(NA, length(z)) for (i in seq(along = col.regions)) zcol[!is.na(x) & !is.na(y) & !is.na(z) & z >= at[i] & z < at[i + 1]] <- i label.style <- match.arg(label.style) x <- as.numeric(x[subscripts]) y <- as.numeric(y[subscripts]) z <- as.numeric(z[subscripts]) zcol <- as.numeric(zcol[subscripts]) #EJP,2010-10-8: #if (is(grid.polygons, "SpatialLines")) # sp.panel.layout(sp.layout, panel.number()) sp.panel.layout(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") 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, 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) } } } } } # EJP, 2010-10-8 #if (!is(grid.polygons, "SpatialLines")) # sp.panel.layout(sp.layout, panel.number()) sp.panel.layout(sp.layout, panel.number()) } panel.pointsplot = function(sp.layout, x, y, subscripts, groups, col, cex, pch, ...) { sp.panel.layout(sp.layout, panel.number()) #panel.superpose(x, y, subscripts, col = col, ...) lpoints(x, y, fill = groups[subscripts], col = col[subscripts], cex = cex[subscripts], pch = pch[subscripts], ...) #panel.xyplot(x, y, pch = 21, fill = fill, ...) } SpatialPolygons2Grob = function(obj, fill) { if (!is(obj, "SpatialPolygons")) stop("object is not of class SpatialPolygons") x = numeric(0) y = numeric(0) id = integer(0) pls = slot(obj, "polygons") pO <- slot(obj, "plotOrder") n = 0 for (i in pO) { Srs <- slot(pls[[i]], "Polygons") pOi <- slot(pls[[i]], "plotOrder") for (j in pOi) { n = n + 1 cc = slot(Srs[[j]], "coords") x = c(x, cc[,1]) y = c(y, cc[,2]) id = c(id, rep(n, nrow(cc))) } } polygonGrob(x=x, y=y, id=id, gp = gpar(fill = fill)) } SpatialPolygonsRescale = function(obj, offset, scale = 1, fill = "black", col = "black", plot.grid = TRUE, ...) { if (!is(obj, "SpatialPolygons")) stop("object is not of class SpatialPolygons") if (length(offset) != 2) stop("offset should have length 2") if (is.list(offset)) offset = c(offset[[1]], offset[[2]]) if (length(scale) == 1) scale = rep(scale,2) pls = slot(obj, "polygons") pO = slot(obj, "plotOrder") fill = rep(fill, length = length(pls)) for (i in pO) { Srs <- slot(pls[[i]], "Polygons") pOi <- slot(pls[[i]], "plotOrder") for (j in pOi) { cc = slot(Srs[[j]], "coords") x = offset[1] + (cc[,1] * scale[1]) y = offset[2] + (cc[,2] * scale[2]) if (plot.grid) { grid.polygon(x, y, default.units = "native", gp = gpar(col = col, fill = fill[i], ...)) } else { polygon(x, y, col = fill[i]) lines(x, y, col = col) } } } } mapLegendGrob <- function(obj, widths = unit(1, "cm"), heights = unit(1, "cm"), fill = "black", just = "right") { grb = SpatialPolygons2Grob(obj, fill) key.layout <- grid.layout(nrow = 1, ncol = 1, widths = widths, heights = heights, respect = TRUE, just = just) key.gf <- frameGrob(layout = key.layout) key.gf <- placeGrob(key.gf, rectGrob(gp = gpar(fill = "transparent", col = NULL)), row = NULL, col = NULL) key.gf <- placeGrob(key.gf, grb, row = 1, col = 1) key.gf } layout.north.arrow = function(type = 1) { if (type == 1) { x1 = c(0.1653, 0.2241, 0.2241, 0.2830, 0.1947, 0.1065, 0.1653, 0.1653) x2 = c(0, 0.0967, 0.0967, 0.2928, 0.3908, 0.3908, 0.2928, 0.2928, 0.1032, 0, 0) y1 = c(0, 0, 0.8823, 0.8235, 1, 0.8235, 0.8823, 0) y2 = c(0.2352, 0.2352, 0.5686, 0.2352, 0.2352, 0.7189, 0.7189, 0.3986, 0.7189, 0.7189, 0.2352 ) return(SpatialPolygons(list(Polygons(list(Polygon(cbind(x1,y1)), Polygon(cbind(rev(x2),rev(y2)))), ID="north")))) } if (type == 2) { x = c(0.143,0.143,0.0143,0.207,0.400,0.271,0.271,0.143) y = c(0,0.707,0.707,0.964,0.707,0.707,0.00,0.0) return(SpatialPolygons(list(Polygons(list(Polygon(cbind(x,y))), ID="north")))) } stop("unknown value for type") } layout.scale.bar = function(height = 0.05) { x1 = c(0, 0.5, 0.5, 0, 0) y1 = c(0, 0, height, height, 0) x2 = x1 + 0.5 y2 = y1 SpatialPolygons(list(Polygons(list(Polygon(cbind(x1,y1))), ID="left"), Polygons(list(Polygon(cbind(rev(x2),rev(y2)))), ID="right"))) } # scale.bar = .scale.bar() sp.theme = function(set = FALSE, regions = list(col = bpy.colors(100)), ...) { lst = list(regions = regions, ...) if (set) trellis.par.set(lst) else lst } spplot.key = function(sp.layout, rows = 1, cols = 1) { for (i in seq(along=rows)) { for (j in seq(along=cols)) { trellis.focus("panel", cols[j], rows[i], highlight = FALSE) sp.panel.layout(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] 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(colorkey, 100, 5), col.regions = trellis.par.get("regions")$col, legendEntries = "", pch, cex = 1, do.fill = TRUE, do.log = FALSE, key.space = ifelse(colorkey, "right", "bottom"), cex.key, edge.col, colorkey) { dots = list(...) if (is.numeric(z)) { if (length(cuts) > 1) ncuts = length(cuts) - 1 else ncuts = cuts if (ncuts != length(col.regions)) { cols = round(1 + (length(col.regions) - 1) * (0:(ncuts - 1))/(ncuts - 1)) fill = col.regions[cols] } else fill = col.regions valid = !is.na(z) if (length(cuts) == 1) { if (do.log) { lz = log(z) cuts = c(min(z[valid]), exp(seq(min(lz[valid]), max(lz[valid]), length = cuts + 1))[2:(cuts)], max(z[valid])) } else cuts = seq(min(z[valid]), max(z[valid]), length = cuts + 1) } groups = cut(as.matrix(z), cuts, dig.lab = 4, include.lowest = TRUE) } else if (is.factor(z)) { if (length(col.regions) == 1) col.regions = rep(col.regions, nlevels(z)) if (length(col.regions) < nlevels(z)) stop("number of colors smaller than number of factor levels") if (length(col.regions) > nlevels(z)) { ncuts = nlevels(z) cols = round(1 + (length(col.regions) - 1) * (0:(ncuts - 1))/(ncuts - 1)) col.regions = col.regions[cols] } if (!missing(cuts)) stop("ncuts cannot be set for factor variable") groups = z fill = col.regions } else stop("dependent of not-supported class") n = nlevels(groups) # deal with col: lst$groups = fill[groups] #print(lst$col) # deal with pch: if (edge.col != "transparent") { # WITH border: use fill if (missing(pch)) pch = rep(ifelse(do.fill, 21, 1), n) lst$col = rep(edge.col, length.out = length(groups)) } else { # no border: use col instead of fill if (missing(pch)) pch = rep(ifelse(do.fill, 16, 1), n) lst$col = lst$groups } if (length(pch) == 1) pch = rep(pch, n) lst$pch = pch[groups] # deal with cex: if (missing(cex)) cex = rep(1, n) if (length(cex) == 1) cex = rep(cex, n) if (length(cex) == n) { cex.key = cex lst$cex = cex[groups] } else if (missing(cex.key)) cex.key = mean(cex, na.rm = TRUE) # do key: if (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) } sp/R/SpatialPolygons-displayMethods.R0000644000175100001440000000700212172001024017341 0ustar hornikusers# 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) { 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) n <- length(slot(x, "polygons")) if (length(border) != n) border <- rep(border, n, n) polys <- slot(x, "polygons") pO <- slot(x, "plotOrder") if (!is.null(density)) { if (missing(col)) col <- par("fg") if (length(col) != n) col <- rep(col, n, n) if (length(density) != n) density <- rep(density, n, n) if (length(angle) != n) angle <- rep(angle, n, n) for (j in pO) .polygonRingHoles(polys[[j]], border = border[j], xpd = xpd, density = density[j], angle = angle[j], col = col[j], pbg = pbg, lty=lty, ...) } else { if (missing(col)) col <- NA if (length(col) != n) col <- rep(col, n, n) for (j in pO) .polygonRingHoles(polys[[j]], col=col[j], border=border[j], xpd = xpd, pbg = pbg, lty=lty, ..., usePolypath=usePolypath, rule=rule) } } setMethod("plot", signature(x = "SpatialPolygons", y = "missing"), function(x, y, ...) plot.SpatialPolygons(x, ...)) .polygonRingHoles <- function(Sr, col=NA, border=NULL, xpd=NULL, density=NULL, angle=45, pbg, lty = par("lty"), ..., usePolypath=NULL, rule=NULL) { if (!is(Sr, "Polygons")) stop("Not an Polygons object") if (is.null(usePolypath)) usePolypath <- get_Polypath() if (is.null(rule)) rule <- get_PolypathRule() if (!is.null(density)) hatch <- TRUE else hatch <- FALSE pO <- slot(Sr, "plotOrder") polys <- slot(Sr, "Polygons") if (hatch) { for (i in pO) { if (!slot(polys[[i]], "hole")) .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, density = density, angle = angle, col=col, hatch=TRUE, lty=lty, ...) else .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, col=pbg, density = NULL, lty=lty, ...) } } else if (exists("polypath") && usePolypath) { Srl <- as(Sr, "Lines") crds <- coordinates(Srl) if (length(crds) == 1) mcrds <- crds[[1]] else { NAr <- as.double(c(NA, NA)) crds1 <- lapply(crds, function(x) rbind(x, NAr)) mcrds <- do.call(rbind, crds1) mcrds <- mcrds[-nrow(mcrds),] rownames(mcrds) <- NULL } polypath(x=mcrds[,1], y=mcrds[,2], border=border, col=col, lty=lty, rule=rule, xpd=xpd, ...) } else { for (i in pO) { if (!slot(polys[[i]], "hole")) .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, col=col, lty=lty, ...) else .polygon(slot(polys[[i]], "coords"), border = border, xpd = xpd, col=pbg, lty=lty, ...) } } } .polygon = function(x, y = NULL, density = NULL, angle = 45, border = NULL, col = NA, lty = NULL, xpd = NULL, hatch=NA, ...) { if (is.na(hatch)) polygon(x = x, y = y, border = border, col = col, lty = lty, xpd = xpd, ...) else polygon(x = x, y = y, density = density, angle = angle, border = border, lty = lty, xpd = xpd, col=col, ...) } sp/R/AAA.R0000644000175100001440000000062512030012562011612 0ustar hornikusers#.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) .onUnload <- function(libpath) library.dynam.unload("sp", libpath) sp/R/Class-SpatialPolygonsDataFrame.R0000644000175100001440000000116012211631510017164 0ustar hornikuserssetClass("SpatialPolygonsDataFrame", contains = "SpatialPolygons", #slots = c(data = "data.frame"), representation(data = "data.frame"), prototype = list( bbox = matrix(rep(NA, 6), 3, 2, dimnames = list(NULL, c("min","max"))), proj4string = CRS(as.character(NA)), polygons = list(), plotOrder = integer(0), data = data.frame()), validity = function(object) { if (!inherits(object@data, "data.frame")) stop("data should be of class data.frame") if (nrow(object@data) != length(object@polygons)) stop("number of rows in data.frame and polygons in SpatialPolygons don't match") return(TRUE) } ) sp/R/over.R0000644000175100001440000001517512210142673012220 0ustar hornikusers.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 only # 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, ...) { stopifnot(identicalCRS(x, y)) r = over(x, geometry(y), returnList = TRUE) ret = .overDF(r, y@data, length(x), returnList, fn, ...) if (! returnList) 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] } 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)) 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]) 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) .index2list(idx, returnList) } ) 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) .index2list(idx, returnList) } ) 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) } ) .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 } aggregate.Spatial = function(x, by, FUN = mean, ...) { by0 = by if (gridded(by)) by = as(by, "SpatialPolygons") df = over(by, x, fn = FUN, ...) addAttrToGeom(by0, df, match.ID = FALSE) } sp/R/SpatialLinesDataFrame-methods.R0000644000175100001440000000635212314047037017043 0ustar hornikusersSpatialLinesDataFrame = 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", "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 x@bbox = .bboxSls(x@lines) x }) lines.SpatialLinesDataFrame = function(x, y = NULL, ...) lines(as(x, "SpatialLines"), ...) setAs("SpatialLinesDataFrame", "SpatialPointsDataFrame", function(from) { spp = as(as(from, "SpatialLines"), "SpatialPointsDataFrame") dfl = from@data[spp$Lines.NR, , drop = FALSE] spp@data = cbind(dfl, spp@data) spp } ) dim.SpatialLinesDataFrame = function(x) dim(x@data) setMethod("split", "SpatialLinesDataFrame", split.data.frame) print.SpatialLinesDataFrame = function(x, ..., digits = getOption("digits"), asWKT = .asWKT) print(data.frame(asWKTSpatialLines(x, digits), x@data),..., digits = digits) setMethod("geometry", "SpatialLinesDataFrame", function(obj) as(obj, "SpatialLines")) length.SpatialLinesDataFrame = function(x) { length(x@lines) } sp/vignettes/0000755000175100001440000000000012321302443012714 5ustar hornikuserssp/vignettes/over.Rnw0000644000175100001440000003122012164030757014370 0ustar hornikusers% 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} \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.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") )) @ and shown in figure \ref{fig:toy}. \begin{figure}[htb] <>= plot(pol, xlim = c(-1.1, 2.1), ylim = c(-1.1, 1.6), border=2:6, axes=TRUE) points(pts, col='red') 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")) 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} fall in two overlapping polygons, we can retrieve the complete information as a list: <<>>= over(pts, pol, returnList = TRUE) @ and the appropriate points falling in 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]) @ \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 with {\tt rgeos}} Package \code{sp} provides many of the \code{over} methods, but not all. Package \code{rgeos} provides functions to compute geometry intersections, i.e. for any set of (points, lines, polygons) to determine whether they have one ore more points in common. The \code{over} methods not provided by package \code{sp} can thus be completed; it involves {\em any} \code{over} methods where a \code{SpatialLines} object is involved (either as \code{x} or \code{y}), and the method 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. } \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{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) @ 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:line} are <<>>= sl.agg = aggregate(meuse.grid, sl) 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}. \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, 47-65. \url{http://dx.doi.org/10.1016/S0016-7061(98)00077-9} \item Pebesma, E., 2012. Spatio-temporal overlay and aggregation. Package vignette for package spacetime, \url{http://cran.r-project.org/web/packages/spacetime/vignettes/sto.pdf} \end{itemize} \end{document} sp/vignettes/csdacm.Rnw0000644000175100001440000011635212165517206014661 0ustar hornikusers%% $Id: csdacm.Rnw,v 1.44 2008-04-06 20:47:04 roger Exp $ % -*- mode: noweb; noweb-default-code-mode: R-mode; -*- % merge all depth coefficients!! % Customising spatial data analysis classes and methods %\SweaveOpts{echo=TRUE} %*Intro and plan* %motivate spatial data handling \documentclass{article} % \VignetteIndexEntry{Customising spatial data classes and methods} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{color} \usepackage{Sweave} \SweaveOpts{keep.source=FALSE} \usepackage{natbib} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong \newcommand\code{\bgroup\@codex} \def\@codex#1{\small {\normalfont\ttfamily\hyphenchar\font=45 #1}\egroup} \usepackage{xspace} \def\RR{\textsf{R}\xspace} \def\SP{\texttt{S-PLUS}\texttrademark\xspace} \def\SS{\texttt{S}\xspace} \def\SIII{\texttt{S3}\xspace} \def\SIV{\texttt{S4}\xspace} \title{{\bf Customising spatial data classes and methods}\footnote{This vignette formed pp. 127--148 of the first edition of Bivand, R. S., Pebesma, E. and G\'{o}mez-Rubio V. (2008) Applied Spatial Data Analysis with R, Springer-Verlag, New York. It was retired from the second edition (2013) to accommodate material on other topics, and is made available in this form with the understanding of the publishers. It has been updated to the 2013 state of the software, e.g. using \code{over}.} } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt edzer.pebesma@uni-muenster.de}}} \date{Feb 2008} \begin{document} \maketitle \tableofcontents <>= owidth <- getOption("width") options("width"=90) .PngNo <- 0 @ <>= .iwidth <- 5 .iheight <- 6 .ipointsize <- 12 @ <>= <> @ <>= .PngNo <- .PngNo + 1; file <- paste("Fig-bitmap-", .PngNo, ".pdf", sep="") pdf(file=file, width = .iwidth, height = .iheight, pointsize = .ipointsize) opar <- par(mar=c(3,3,1,1)+0.1) @ <>= dev.null <- dev.off() cat("\\includegraphics[width=0.95\\textwidth]{", file, "}\n\n", sep="") @ Although the classes defined in the \pkg{sp} package cover many needs, they do not go far beyond the most typical GIS data models. In applied research, it often happens that customised classes would suit the actual data coming from the instruments better. Since \SIV classes have mechanisms for inheritance, it may be attractive to build on the \pkg{sp} classes, so as to utilise their methods where appropriate. Here, we will demonstrate a range of different settings in which \pkg{sp} classes can be extended. Naturally, this is only useful for researchers with specific and clear needs, so our goal is to show how (relatively) easy it may be to prototype classes extending \pkg{sp} classes for specific purposes. \section{Programming with classes and methods} \label{sect:cls} This section will explain the elementary basics of programming with classes and methods in \RR. The \SS language (implemented in \RR and \SP) contains two mechanisms for creating classes and methods: the traditional \SIII system and the more recent \SIV system (see Section 2.2 in \cite{bivand}, in which classes were described for the use{\RR} --- here they are described for the develope{\RR}). This chapter is not a full introduction to \RR programming \citep[see][for more details]{braun+murdoch:07}, but it will try to give some feel of how the \code{Spatial} classes in package \pkg{sp} can be extended to be used for wider classes of problems. For full details, the interested reader is referred to e.g.\ \cite{R:Venables+Ripley:2000} and \cite{R:Chambers:1998}, the latter being a reference for new-style \SIV classes and methods. Example code is for example found in the source code for package \pkg{sp}, available from CRAN. Suppose we define myfun as \begin{footnotesize} << >>= myfun <- function(x) { x + 2 } @ \end{footnotesize} then, calling it with the numbers 1, 2 and 3 results in \begin{footnotesize} << >>= myfun(1:3) @ \end{footnotesize} or alternatively using a named argument: \begin{footnotesize} << >>= myfun(x=1:3) @ \end{footnotesize} The return value of the function is the last expression evaluated. Often, we want to wrap existing functions, such as a plot function: \begin{footnotesize} << >>= plotXplus2Yminus3 <- function(x, y, ...) { plot(x = x + 2, y = y - 3, ...) } @ \end{footnotesize} In this case, the \code{...} is used to pass information to the \code{plot} function without explicitly anticipating what it will be: named arguments \code{x} and \code{y}, or the first two arguments if they are unnamed are processed, remaining arguments are passed on. The plot function is a generic method, with an instance that depends on the class of its first (\SIII) or first $n$ arguments (\SIV). The available instances of \code{plot} are shown for \SIII-type methods by \begin{footnotesize} << >>= methods("plot") @ \end{footnotesize} and for \SIV-type methods by \begin{footnotesize} << >>= library(sp) showMethods("plot") @ \end{footnotesize} where we first loaded \pkg{sp} to make sure there are some \SIV plot methods to show. \subsection{\SIII-style classes and methods} Building \SIII-style classes is simple. Suppose we want to build an object of class \code{foo}: \begin{footnotesize} << >>= x <- rnorm(10) class(x) <- "foo" x @ \end{footnotesize} If we plot this object, e.g., by \code{plot(x)} we get the same plot as when we would not have set the class to \code{foo}. If we know, however, that objects of class \code{foo} need to be plotted without symbols but with connected lines, we can write a plot method for this class: \begin{footnotesize} << >>= plot.foo <- function(x, y, ...) { plot.default(x, type = 'l', ...) } @ \end{footnotesize} after which \code{plot(x)} will call this particular method, rather than a default plot method. Class inheritance is obtained in \SIII when an object is given multiple classes, as in \begin{footnotesize} << >>= class(x) <- c("foo", "bar") @ <>= plot(x) @ \end{footnotesize} For this plot, first function \code{plot.foo} will be looked for, and if not found the second option \code{plot.bar} will be looked for. If none of them is found, the default \code{plot.default} will be used. The \SIII class mechanism is simple and powerful. Much of \RR works with it, including key functions such as \code{lm}. \begin{footnotesize} << >>= data(meuse) class(meuse) class(lm(log(zinc)~sqrt(dist), meuse)) @ \end{footnotesize} There is, however, no checking that a class with a particular name does indeed contain the elements that a certain method for it expects. It also has design flaws, as method specification by dot separation is ambiguous in case of names such as \code{as.data.frame}, where one cannot tell whether it means that the method \code{as.data} acts on objects of class \code{frame}, or the method \code{as} acts on objects of class \code{data.frame}, or none of them (the answer is: none). For such reasons, \SIV-style classes and methods were designed. \subsection{\SIV-style classes and methods} \SIV-style classes are formally defined, using \code{setClass}. As an example, somewhat simplified versions of classes \code{CRS} and \code{Spatial} in \pkg{sp} are \begin{footnotesize} <>= options("width"=60) @ <>= setClass("CRS", representation(projargs = "character")) setClass("Spatial", representation(bbox = "matrix", proj4string = "CRS"), # NOT TOO WIDE validity <- function(object) { bb <- bbox(object) if (!is.matrix(bb)) return("bbox should be a matrix") n <- dimensions(object) if (n < 2) return("spatial.dimension should be 2 or more") if (any(is.na(bb))) return("bbox should never contain NA values") if (any(!is.finite(bb))) return("bbox should never contain infinite values") if (any(bb[,"max"] < bb[,"min"])) return("invalid bbox: max < min") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} The command \code{setClass} defines a class name as a formal class, gives the names of the class elements (called slots), and their type---type checking will happen upon construction of an instance of the class. Further checking, e.g., on valid dimensions and data ranges can be done in the \code{validity} function. Here, the validity function retrieves the bounding box using the generic \code{bbox} method. Generics, if not defined in the base R system, e.g., \begin{footnotesize} << >>= isGeneric("show") @ \end{footnotesize} can be defined with \code{setGeneric}. Defining a specific instance of a generic is done by \code{setMethod}: \begin{footnotesize} <>= setGeneric("bbox", function(obj) standardGeneric("bbox")) setMethod("bbox", signature = "Spatial", function(obj) obj@bbox) @ \end{footnotesize} where the signature tells the class of the first (or first $n$) arguments. Here, the \code{@} operator is used to access the \code{bbox} slot in an \SIV object, not to be confused with the \code{\$} operator to access list elements. We will now illustrate this mechanism by providing a few examples of classes, building on those available in package \pkg{sp}. \section{Animal track data in package \pkg{trip}} CRAN Package \pkg{trip}, written by Michael Sumner \citep{kirkwood06,page06}, provides a class for animal tracking data. Animal tracking data consist of sets of ($x,y,t$) stamps, grouped by an identifier pointing to an individual animal, sensor or perhaps isolated period of monitoring. A strategy for this (slightly simplified from that of \pkg{trip}) is to extend the {\tt SpatialPointsDataFrame} class by a length 2 character vector carrying the names of the time column and the trip identifier column in the {\tt SpatialPointsDataFrame} attribute table. Package \pkg{trip} does a lot of work to read and analyse tracking data from data formats typical for tracking data (Argos DAT), removing duplicate observations and validating the objects, e.g., checking that time stamps increase and movement speeds are realistic. We ignore this and stick to the bare bones. We now define a class called \code{trip} that extends \code{SpatialPointsDataFrame}: \begin{footnotesize} << >>= library(sp) setClass("trip", representation("SpatialPointsDataFrame", TOR.columns = "character"), validity <- function(object) { if (length(object@TOR.columns) != 2) stop("Time/id column names must be of length 2") if (!all(object@TOR.columns %in% names(object@data))) stop("Time/id columns must be present in attribute table") TRUE } ) showClass("trip") @ \end{footnotesize} that checks, upon creation of objects, that indeed two variable names are passed and that these names refer to variables present in the attribute table. \subsection{Generic and constructor functions} It would be nice to have a constructor function, just like \code{data.frame} or \code{SpatialPoints}, so we now create it and set it as the generic function to be called in case the first argument is of class \code{SpatialPointsDataFrame}. \begin{footnotesize} << >>= trip.default <- function(obj, TORnames) { if (!is(obj, "SpatialPointsDataFrame")) stop("trip only supports SpatialPointsDataFrame") if (is.numeric(TORnames)) TORnames <- names(obj)[TORnames] new("trip", obj, TOR.columns = TORnames) } if (!isGeneric("trip")) setGeneric("trip", function(obj, TORnames) standardGeneric("trip")) setMethod("trip", signature(obj = "SpatialPointsDataFrame", TORnames = "ANY"), trip.default) @ \end{footnotesize} We can now try it out, with turtle data: \begin{footnotesize} << >>= turtle <- read.csv(system.file("external/seamap105_mod.csv", package="sp")) @ << >>= timestamp <- as.POSIXlt(strptime(as.character(turtle$obs_date), "%m/%d/%Y %H:%M:%S"), "GMT") turtle <- data.frame(turtle, timestamp = timestamp) turtle$lon <- ifelse(turtle$lon < 0, turtle$lon+360, turtle$lon) turtle <- turtle[order(turtle$timestamp),] coordinates(turtle) <- c("lon", "lat") proj4string(turtle) <- CRS("+proj=longlat +ellps=WGS84") turtle$id <- c(rep(1, 200), rep(2, nrow(coordinates(turtle)) - 200)) turtle_trip <- trip(turtle, c("timestamp", "id")) summary(turtle_trip) @ \end{footnotesize} \subsection{Methods for trip objects} The summary method here is not defined for \code{trip}, but is the default summary inherited from class \code{Spatial}. As can be seen, nothing special about the trip features is mentioned, such as what the time points are and what the identifiers. We could alter this by writing a class-specific summary method \begin{footnotesize} << >>= summary.trip <- function(object, ...) { cat("Object of class \"trip\"\nTime column: ") print(object@TOR.columns[1]) cat("Identifier column: ") print(object@TOR.columns[2]) print(summary(as(object, "Spatial"))) print(summary(object@data)) } setMethod("summary", "trip", summary.trip) summary(turtle_trip) @ \end{footnotesize} As \code{trip} extends \code{SpatialPointsDataFrame}, subsetting using {\small \verb+"["+} and column selection or replacement using {\small \verb+"[["+} or {\small \verb+"$"+} all work, as these are inherited. Creating invalid trip objects can be prohibited by adding checks to the validity function in the class definition, e.g., %<>= %x <- turtle_trip[1] %@ will not work because the time and/or id column are not present any more. A custom plot method for trip could be written, for example using colour to denote a change in identifier: \begin{footnotesize} << >>= setGeneric("lines", function(x, ...) standardGeneric("lines")) setMethod("lines", signature(x = "trip"), function(x, ..., col = NULL) { # NOT TOO WIDE tor <- x@TOR.columns if (is.null(col)) { l <- length(unique(x[[tor[2]]])) col <- hsv(seq(0, 0.5, length = l)) } coords <- coordinates(x) lx <- split(1:nrow(coords), x[[tor[2]]]) for (i in 1:length(lx)) lines(coords[lx[[i]], ], col = col[i], ...) } ) @ \end{footnotesize} Here, the \code{col} argument is added to the function header so that a reasonable default can be overridden, e.g., for black/white plotting. \section{Multi-point data: \texttt{SpatialMultiPoints}} One of the feature types of the OpenGeospatial Consortium (OGC) simple feature specification that has not been implemented in \pkg{sp} is the \code{MultiPoint} object. In a \code{MultiPoint} object, each feature refers to a {\em set of} points. The \pkg{sp} classes \code{SpatialPointsDataFrame} only provide reference to a single point. Instead of building a new class up from scratch, we'll try to re-use code and build a class \code{SpatialMultiPoint} from the {\tt SpatialLines} class. After all, lines are just sets of ordered points. In fact, the \code{SpatialLines} class implements the \code{MultiLineString} simple feature, where each feature can refer to multiple lines. A special case is formed if each feature only has a single line: \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialMultiPoints", representation("SpatialLines"), validity <- function(object) { if (any(unlist(lapply(object@lines, function(x) length(x@Lines))) != 1)) # NOT TOO WIDE stop("Only Lines objects with one Line element") TRUE } ) SpatialMultiPoints <- function(object) new("SpatialMultiPoints", object) @ <>= options("width"=70) @ \end{footnotesize} As an example, we can create an instance of this class for two MultiPoint features each having three locations: \begin{footnotesize} << >>= n <- 5 set.seed(1) x1 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x2 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) x3 <- cbind(rnorm(n),rnorm(n, 0, 0.25)) L1 <- Lines(list(Line(x1)), ID="mp1") L2 <- Lines(list(Line(x2)), ID="mp2") L3 <- Lines(list(Line(x3)), ID="mp3") s <- SpatialLines(list(L1,L2,L3)) smp <- SpatialMultiPoints(s) @ \end{footnotesize} If we now plot object \code{smp}, we get the same plot as when we plot \code{s}, showing the two lines. The \code{plot} method for a \code{SpatialLines} object is not suitable, so we write a new one: \begin{footnotesize} << >>= plot.SpatialMultiPoints <- function(x, ..., pch = 1:length(x@lines), col = 1, cex = 1) { n <- length(x@lines) if (length(pch) < n) pch <- rep(pch, length.out = n) if (length(col) < n) col <- rep(col, length.out = n) if (length(cex) < n) cex <- rep(cex, length.out = n) plot(as(x, "Spatial"), ...) for (i in 1:n) points(x@lines[[i]]@Lines[[1]]@coords, pch = pch[i], col = col[i], cex = cex[i]) } setMethod("plot", signature(x = "SpatialMultiPoints", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) @ \end{footnotesize} Here we chose to pass any named \code{...} arguments to the plot method for a \code{Spatial} object. This function sets up the axes and controls the margins, aspect ratio, etc. All arguments that need to be passed to \code{points} (\code{pch} for symbol type, \code{cex} for symbol size and \code{col} for symbol colour) need explicit naming and sensible defaults, as they are passed explicitly to the consecutive calls to \code{points}. According to the documentation of \code{points}, in addition to \code{pch}, \code{cex} and \code{col}, the arguments \code{bg} and \code{lwd} (symbol fill colour and symbol line width) would need a similar treatment to make this plot method completely transparent with the base \code{plot} method---something an end user would hope for. Having \code{pch}, \code{cex} and \code{col} arrays the length of the number of \code{MultiPoints} {\em sets} rather than the number of points to be plotted is useful for two reasons. First, the whole point of {\tt MultiPoints} object is to distinguish {\em sets} of points. Second, when we extend this class to \code{SpatialMultiPointsDataFrame}, e.g., by \begin{footnotesize} << >>= cName <- "SpatialMultiPointsDataFrame" setClass(cName, representation("SpatialLinesDataFrame"), validity <- function(object) { lst <- lapply(object@lines, function(x) length(x@Lines)) if (any(unlist(lst) != 1)) stop("Only Lines objects with single Line") TRUE } ) SpatialMultiPointsDataFrame <- function(object) { new("SpatialMultiPointsDataFrame", object) } @ \end{footnotesize} then we can pass symbol characteristics by (functions of) columns in the attribute table: \begin{footnotesize} <>= df <- data.frame(x1 = 1:3, x2 = c(1,4,2), row.names = c("mp1", "mp2", "mp3")) smp_df <- SpatialMultiPointsDataFrame(SpatialLinesDataFrame(smp, df)) setMethod("plot", signature(x = "SpatialMultiPointsDataFrame", y = "missing"), function(x, y, ...) plot.SpatialMultiPoints(x, ...)) grys <- c("grey10", "grey40", "grey80") @ <>= plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) @ \end{footnotesize} for which the plot is shown in Figure \ref{fig:smpdf}. \begin{figure} %<>= <>= .iwidth <- 6 .iheight <- 2.5 .ipointsize <- 10 <> plot(smp_df, col = grys[smp_df[["x1"]]], pch = smp_df[["x2"]], cex = 2, axes = TRUE) <> <> @ \caption{Plot of the \code{SpatialMultiPointsDataFrame} object.} \label{fig:smpdf} \end{figure} Hexagonal grids are like square grids, where grid points are centres of matching hexagons, rather than squares. Package \pkg{sp} has no classes for hexagonal grids, but does have some useful functions for generating and plotting them. This could be used to build a class. Much of this code in \pkg{sp} is based on postings to the R-sig-geo mailing list by Tim Keitt, used with permission. The spatial sampling method \code{spsample} has a method for sampling points on a hexagonal grid: \begin{footnotesize} <<>>= data(meuse.grid) gridded(meuse.grid)=~x+y xx <- spsample(meuse.grid, type="hexagonal", cellsize=200) class(xx) @ \end{footnotesize} gives the points shown in the left side of Figure \ref{fig:hex}. Note that an alternative hexagonal representation is obtained by rotating this grid 90 degrees; we will not further consider that here. \begin{footnotesize} <>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) @ <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", HexPts, col = 1)) @ <>= HexPols <- HexPoints2SpatialPolygons(HexPts) df <- over(HexPols, meuse.grid) HexPolsDf <- SpatialPolygonsDataFrame(HexPols, df, match.ID = FALSE) @ <>= spplot(HexPolsDf["dist"]) @ \end{footnotesize} for which the plots are shown in Figure \ref{fig:hex}. \begin{figure} <>= .iwidth <- 6 .iheight <- 4 <> library(lattice) # RSB quietening greys grys <- grey.colors(11, 0.95, 0.55, 2.2) print(spplot(meuse.grid["dist"], cuts=10, col.regions=grys, sp.layout = list("sp.points", HexPts, col = 1)), split = c(1, 1, 2, 1), more = TRUE) print(spplot(HexPolsDf["dist"], cuts=10, col.regions=grys), split = c(2, 1, 2, 1), more = FALSE) <> <> @ \caption{Hexagonal points (left) and polygons (right).} \label{fig:hex} \end{figure} We can now generate and plot hexagonal grids, but need to deal with two representations: as points and as polygons, and both representations do not tell by themselves that they represent a hexagonal grid. For designing a hexagonal grid class we will extend \code{SpatialPoints}, assuming that computation of the polygons can be done when needed without a prohibitive overhead. \begin{footnotesize} << >>= setClass("SpatialHexGrid", representation("SpatialPoints", dx = "numeric"), validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=40) @ << >>= setClass("SpatialHexGridDataFrame", representation("SpatialPointsDataFrame", dx = "numeric"), # NOT TOO WIDE validity <- function(object) { if (object@dx <= 0) stop("dx should be positive") TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Note that these class definitions do not check that instances actually do form valid hexagonal grids; a more robust implementation could provide a test that distances between points with equal $y$ coordinate are separated by a multiple of \code{dx}, that the $y$-separations are correct and so on. It might make sense to adapt the generic \code{spsample} method in package \pkg{sp} to return \code{SpatialHexGrid} objects; we can also add \code{plot} and \code{spsample} methods for them. Method \code{over} should work with a \code{SpatialHexGrid} as its first argument, by inheriting from \code{SpatialPoints}. Let us first see how to create the new classes. Without a constructor function we can use \begin{footnotesize} << >>= HexPts <- spsample(meuse.grid, type="hexagonal", cellsize=200) Hex <- new("SpatialHexGrid", HexPts, dx = 200) df <- over(Hex, meuse.grid) spdf <- SpatialPointsDataFrame(HexPts, df) HexDf <- new("SpatialHexGridDataFrame", spdf, dx = 200) @ \end{footnotesize} Because of the route taken to define both HexGrid classes, it is not obvious that the second extends the first. We can tell the \SIV system this by \code{setIs}: \begin{footnotesize} << >>= is(HexDf, "SpatialHexGrid") setIs("SpatialHexGridDataFrame", "SpatialHexGrid") is(HexDf, "SpatialHexGrid") @ \end{footnotesize} to make sure that methods for \code{SpatialHexGrid} objects work as well for objects of class \code{SpatialHexGridDataFrame}. When adding methods, several of them will need conversion to the polygon representation, so it makes sense to add the conversion function such that e.g. \code{as(x, "SpatialPolygons")} will work: \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setAs("SpatialHexGrid", "SpatialPolygons", function(from) HexPoints2SpatialPolygons(from, from@dx) ) setAs("SpatialHexGridDataFrame", "SpatialPolygonsDataFrame", function(from) SpatialPolygonsDataFrame(as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE) ) @ <>= options("width"=70) @ \end{footnotesize} We can now add \code{plot}, \code{spplot}, \code{spsample} and \code{over} methods for these classes: \begin{footnotesize} << >>= setMethod("plot", signature(x = "SpatialHexGrid", y = "missing"), function(x, y, ...) plot(as(x, "SpatialPolygons"), ...) ) setMethod("spplot", signature(obj = "SpatialHexGridDataFrame"), function(obj, ...) spplot(SpatialPolygonsDataFrame( as(obj, "SpatialPolygons"), obj@data, match.ID = FALSE), ...) ) setMethod("spsample", "SpatialHexGrid", function(x, n, type, ...) spsample(as(x, "SpatialPolygons"), n = n, type = type, ...) ) setMethod("over", c("SpatialHexGrid", "SpatialPoints"), function(x, y, ...) over(as(x, "SpatialPolygons"), y) ) @ \end{footnotesize} After this, the following will work: \begin{footnotesize} <>= spplot(meuse.grid["dist"], sp.layout = list("sp.points", Hex, col = 1)) spplot(HexDf["dist"]) @ \end{footnotesize} Coercion to a data frame is done by \begin{footnotesize} <>= as(HexDf, "data.frame") @ \end{footnotesize} Another detail not mentioned is that the bounding box of the hexgrid objects only match the grid centre points, not the hexgrid cells: \begin{footnotesize} << >>= bbox(Hex) bbox(as(Hex, "SpatialPolygons")) @ \end{footnotesize} One solution for this is to correct for this in a constructor function, and check for it in the validity test. Explicit coercion functions to the points representation would have to set the bounding box back to the points ranges. Another solution is to write a bbox method for the hexgrid classes, taking the risk that someone still looks at the incorrect bbox slot. \section{Spatio-temporal grids} Spatio-temporal data can be represented in different ways. One simple option is when observations (or model-results, or predictions) are given on a regular space-time grid. Objects of class or extending \code{SpatialPoints}, \code{SpatialPixels} and \code{SpatialGrid} do not have the constraint that they represent a two-dimensional space; they may have arbitrary dimension; an example for a three-dimensional grid is \begin{footnotesize} << >>= n <- 10 x <- data.frame(expand.grid(x1 = 1:n, x2 = 1:n, x3 = 1:n), z = rnorm(n^3)) coordinates(x) <- ~x1+x2+x3 gridded(x) <- TRUE fullgrid(x) <- TRUE summary(x) @ \end{footnotesize} We might assume here that the third dimension, \code{x3}, represents time. If we are happy with time somehow represented by a real number (in double precision), then we are done. A simple representation is that of decimal year, with e.g. 1980.5 meaning the 183rd day of 1980, or e.g. relative time in seconds after the start of some event. When we want to use the \code{POSIXct} or \code{POSIXlt} representations, we need to do some more work to see the readable version. We will now devise a simple three-dimensional space-time grid with the \code{POSIXct} representation. \begin{footnotesize} <>= options("width"=50) @ << >>= # NOT TOO WIDE setClass("SpatialTimeGrid", "SpatialGrid", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) @ <>= options("width"=70) @ \end{footnotesize} Along the same line, we can extend the \code{SpatialGridDataFrame} for space-time: \begin{footnotesize} << >>= setClass("SpatialTimeGridDataFrame", "SpatialGridDataFrame", validity <- function(object) { stopifnot(dimensions(object) == 3) TRUE } ) setIs("SpatialTimeGridDataFrame", "SpatialTimeGrid") x <- new("SpatialTimeGridDataFrame", x) @ \end{footnotesize} A crude summary for this class could be written along these lines: \begin{footnotesize} << >>= summary.SpatialTimeGridDataFrame <- function(object, ...) { cat("Object of class SpatialTimeGridDataFrame\n") x <- gridparameters(object) t0 <- ISOdate(1970,1,1,0,0,0) t1 <- t0 + x[3,1] cat(paste("first time step:", t1, "\n")) t2 <- t0 + x[3,1] + (x[3,3] - 1) * x[3,2] cat(paste("last time step: ", t2, "\n")) cat(paste("time step: ", x[3,2], "\n")) summary(as(object, "SpatialGridDataFrame")) } @ <>= options("width"=50) @ << >>= # NOT TOO WIDE setMethod("summary", "SpatialTimeGridDataFrame", summary.SpatialTimeGridDataFrame) summary(x) @ <>= options("width"=70) @ \end{footnotesize} Next, suppose we need a subsetting method that selects on the time. When the first subset argument is allowed to be a time range, this is done by \begin{footnotesize} << >>= subs.SpatialTimeGridDataFrame <- function(x, i, j, ..., drop=FALSE) { t <- coordinates(x)[,3] + ISOdate(1970,1,1,0,0,0) if (missing(j)) j <- TRUE sel <- t %in% i if (! any(sel)) stop("selection results in empty set") fullgrid(x) <- FALSE if (length(i) > 1) { x <- x[i = sel, j = j,...] fullgrid(x) <- TRUE as(x, "SpatialTimeGridDataFrame") } else { gridded(x) <- FALSE x <- x[i = sel, j = j,...] cc <- coordinates(x)[,1:2] p4s <- CRS(proj4string(x)) # NOT TOO WIDE SpatialPixelsDataFrame(cc, x@data, proj4string = p4s) } } setMethod("[", c("SpatialTimeGridDataFrame", "POSIXct", "ANY"), subs.SpatialTimeGridDataFrame) t1 <- as.POSIXct("1970-01-01 0:00:03", tz = "GMT") t2 <- as.POSIXct("1970-01-01 0:00:05", tz = "GMT") summary(x[c(t1,t2)]) summary(x[t1]) @ \end{footnotesize} The reason to only convert back to \code{SpatialTimeGridDataFrame} when multiple time steps are present is that the time step (``cell size'' in time direction) cannot be found when there is only a single step. In that case, the current selection method returns an object of class \code{SpatialPixelsDataFrame} for that time slice. Plotting a set of slices could be done using levelplot, or writing another \code{spplot} method: \begin{footnotesize} << >>= spplot.stgdf <- function(obj, zcol = 1, ..., format = NULL) { # NOT TOO WIDE if (length(zcol) != 1) stop("can only plot a single attribute") if (is.null(format)) format <- "%Y-%m-%d %H:%M:%S" cc <- coordinates(obj) df <- unstack(data.frame(obj[[zcol]], cc[,3])) ns <- as.character(coordinatevalues(getGridTopology(obj))[[3]] + ISOdate(1970,1,1,0,0,0), format = format) cc2d <- cc[cc[,3] == min(cc[,3]), 1:2] obj <- SpatialPixelsDataFrame(cc2d, df) spplot(obj, names.attr = ns,...) } setMethod("spplot", "SpatialTimeGridDataFrame", spplot.stgdf) @ \end{footnotesize} \begin{figure} \begin{center} <>= .iwidth <- 6 .iheight <- 4 <> print(spplot(x, format = "%H:%M:%S", as.table=TRUE)) <> <> @ \end{center} \caption{ \code{spplot} for an object of class \code{SpatialTimeGridDataFrame}, filled with random numbers.} \label{fig:stgdf} \end{figure} Now, the result of \begin{footnotesize} <>= library(lattice) trellis.par.set(canonical.theme(color = FALSE)) spplot(x, format = "%H:%M:%S", as.table=TRUE, cuts=6, col.regions=grey.colors(7, 0.55, 0.95, 2.2)) # RSB quietening greys @ \end{footnotesize} is shown in Figure \ref{fig:stgdf}. The format argument passed controls the way time is printed; one can refer to the help of \begin{footnotesize} <>= ?as.character.POSIXt @ \end{footnotesize} for more details about the \code{format} argument. \section{Analysing spatial Monte Carlo simulations} \label{sec:simquant} Quite often, spatial statistical analysis results in a large number of spatial realisations or a random field, using some Monte Carlo simulation approach. Regardless whether individual values refer to points, lines, polygons or grid cells, we would like to write some methods or functions that aggregate over these simulations, to get summary statistics such as the mean value, quantiles, or cumulative distributions values. Such aggregation can take place in two ways. Either we aggregate over the probability space, and compute summary statistics for each geographical feature over the set of realisations (i.e., the rows of the attribute table), or for each realisation we aggregate over the complete geographical layer or a subset of it (i.e., aggregate over the columns of the attribute table). Let us first generate, as an example, a set of 100 conditional Gaussian simulations for the zinc variable in the meuse data set: \begin{footnotesize} <>= library(gstat) data(meuse) coordinates(meuse) <- ~x+y v <- vgm(.5, "Sph", 800, .05) sim <- krige(log(zinc)~1, meuse, meuse.grid, v, nsim=100, nmax=30) sim@data <- exp(sim@data) @ \end{footnotesize} where the last statement back-transforms the simulations from the log scale to the observation scale. A quantile method for Spatial object attributes can be written as \begin{footnotesize} << >>= quantile.Spatial <- function(x, ..., byLayer = FALSE) { stopifnot("data" %in% slotNames(x)) apply(x@data, ifelse(byLayer, 2, 1), quantile, ...) } @ \end{footnotesize} after which we can find the sample lower and upper 95\% confidence limits by \begin{footnotesize} << >>= sim$lower <- quantile.Spatial(sim[1:100], probs = 0.025) sim$upper <- quantile.Spatial(sim[1:100], probs = 0.975) @ \end{footnotesize} To get the sample distribution of the areal median, we can aggregate over layers: \begin{footnotesize} << >>= medians <- quantile.Spatial(sim[1:100], probs = 0.5, byLayer = TRUE) @ <>= hist(medians) @ \end{footnotesize} It should be noted that in these particular cases, the quantities computed by simulations could have been obtained faster and exact by working analytically with ordinary (block) kriging and the normal distribution (Section 8.7.2 in \cite{bivand}). A statistic that cannot be obtained analytically is the sample distribution of the area fraction that exceeds a threshold. Suppose that 500 is a crucial threshold, and we want to summarise the sampling distribution of the area fraction where 500 is exceeded: \begin{footnotesize} <>= options("width"=50) @ << >>= fractionBelow <- function(x, q, byLayer = FALSE) { stopifnot(is(x, "Spatial") || !("data" %in% slotNames(x))) apply(x@data < q, ifelse(byLayer, 2, 1), function(r) sum(r)/length(r)) # NOT TOO WIDE } @ <>= options("width"=70) @ << >>= over500 <- 1 - fractionBelow(sim[1:100], 200, byLayer = TRUE) summary(over500) quantile(over500, c(0.025, 0.975)) @ \end{footnotesize} For space-time data, we could write methods that aggregate over space, over time or over space and time. \section{Processing massive grids} Up to now we have made the assumption that gridded data can be completely read, and are kept by \RR in memory. In some cases, however, we need to process grids that exceed the memory capacity of the computers available. A method for analysing grids without fully loading them into memory then seems useful. Note that package \pkg{rgdal} allows for partial reading of grids, e.g., \begin{footnotesize} <<>>= fn <- system.file("pictures/erdas_spnad83.tif", package = "rgdal")[1] @ <>= x <- readGDAL(fn, output.dim = c(120, 132)) x$band1[x$band1 <= 0] <- NA spplot(x, col.regions=bpy.colors()) @ \end{footnotesize} reads a downsized grid, where 1\% of the grid cells remained. Another option is reading certain rectangular sections of a grid, starting at some offset. Yet another approach is to use the low-level opening routines and then subset: \begin{footnotesize} << >>= library(rgdal) x <- GDAL.open(fn) class(x) x.subs <- x[1:100, 1:100, 1] class(x.subs) gridparameters(x.subs) @ \end{footnotesize} An object of class \code{GDALReadOnlyDataset} only contains a file handle. The subset method {\small \verb+"["+} for it does not, as it quite often does, return an object of the same class but actually reads the data requested, with arguments interpreted as {\em rows}, {\em columns} and raster {\em bands}, and returns a \code{SpatialGridDataFrame}. We will now extend this approach to allow partial writing through {\small \verb+"["+} as well. As the actual code is rather lengthy and involves a lot of administration, it will not all be shown and details can be found in the \pkg{rgdal} source code. We will define two classes, \begin{footnotesize} <>= options("width"=50) @ << >>= setClass("SpatialGDAL", representation("Spatial", grid = "GridTopology", grod = "GDALReadOnlyDataset", # NOT TOO WIDE name = "character")) setClass("SpatialGDALWrite", "SpatialGDAL") @ <>= options("width"=70) @ \end{footnotesize} that derive from \code{Spatial}, contain a \code{GridTopology} and a file handle in the \code{grod} slot. Next, we can define a function \code{open.SpatialGDAL} to open a raster file, returning a \code{SpatialGDAL} object and a function \code{copy.SpatialGDAL} that returns a writable copy of the opened raster. Note that some GDAL drivers only allow copying, some only writing and some both. \begin{footnotesize} <>= x <- open.SpatialGDAL(fn) nrows <- GDALinfo(fn)["rows"] ncols <- GDALinfo(fn)["columns"] xout <- copy.SpatialGDAL(x, "erdas_spnad83_out.tif") bls <- 20 for (i in 1:(nrows/bls - 1)) { r <- 1+(i-1)*bls for (j in 1:(ncols/bls - 1)) { c <- 1+(j-1)*bls x.in <- x[r:(r+bls),c:(c+bls)] xout[r:(r+bls),c:(c+bls)] <- x.in$band1 + 10 #$ } cat(paste("row-block", i, "\n")) } close(x) close(xout) @ \end{footnotesize} This requires the functions {\small \verb+"["+} and {\small \verb+"[<-"+} to be present. They are set by \begin{footnotesize} <>= setMethod("[", "SpatialGDAL", function(x, i, j, ... , drop = FALSE) x@grod[i = i, j = j, ...] ) setReplaceMethod("[", "SpatialGDALWrite", function(x, i, j, ..., value) { ... }) @ \end{footnotesize} where, for the latter, the implementation details are here omitted. It should be noted that single rows or columns cannot be read this way, as they cannot be converted sensibly to a grid. It should be noted that flat binary representations such as the Arc/Info Binary Grid allow much faster random access than ASCII representations or compressed formats such as jpeg varieties. Also, certain drivers in the GDAL library suggest an optimal block size for partial access (e.g., typically a single row), which is not used here\footnote{An attempt to use this block size is, at time of writing, found in the \code{blockApply} code, found in the THK branch of the \pkg{rgdal} project on R-forge.}. This chapter has sketched developments beyond the base \pkg{sp} classes and methods used otherwise in this book. Although we think that the base classes cater for many standard kinds of spatial data analysis, it is clear that specific research problems will call for specific solutions, and that the \RR environment provides the high-level abstractions needed to help busy researchers get their work done. <>= options("width"=owidth) @ \begin{thebibliography}{} \bibitem[Bivand et al., 2008]{bivand} Roger S. Bivand, Edzer J. Pebesma and Virgilio Gomez-Rubio (2008). \newblock {\em Applied spatial data analysis with {\RR}} \newblock Springer, NY \bibitem[Braun and Murdoch, 2007]{braun+murdoch:07} Braun, W.~J. and Murdoch, D.~J. (2007). \newblock {\em A first course in statistical programming with {\RR}}. \newblock Cambridge University Press, Cambridge. \bibitem[Chambers, 1998]{R:Chambers:1998} Chambers, J.M. (1998). \newblock {\em Programming with Data}. \newblock Springer, New York. \bibitem[Kirkwood et al., 2006]{kirkwood06} Kirkwood, R., Lynch, M., Gales, N., Dann, P., and Sumner, M. (2006). \newblock At-sea movements and habitat use of adult male {A}ustralian fur seals ({A}rctocephalus pusillus doriferus). \newblock {\em Canadian Journal of Zoology}, 84:1781--1788. \bibitem[Page et al., 2006]{page06} Page, B., McKenzie, J., Sumner, M., Coyne, M., and Goldsworthy, S. (2006). \newblock Spatial separation of foraging habitats among {N}ew {Z}ealand fur seals. \newblock {\em Marine Ecology Progress Series}, 323:263--279. \bibitem[Venables and Ripley, 2000]{R:Venables+Ripley:2000} Venables, W. N. and Ripley, B. D. (2000). \newblock {\em {\SS} Programming}. \newblock Springer, New York. \end{thebibliography} \end{document} sp/vignettes/intro_sp.Rnw0000644000175100001440000004641112164030757015262 0ustar hornikusers% 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 \title{ S Classes and Methods for Spatial Data:\\ the {\tt sp} Package } \author{Edzer Pebesma\footnote{Institute for Geoinformatics, University of Muenster, Weseler Strasse 253, 48151 M\"{u}nster, Germany. {\tt 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; {\tt Roger.Bivand@nhh.no}}} \date{Feb 2005} \begin{document} \maketitle \tableofcontents \section{Introduction} The {\tt sp} package provides classes and methods for dealing with spatial data in S (R and S-Plus\footnote{our primary efforts target R; depending on the needs, we will address S-Plus as well}). 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. 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 R will become a more coherent tool for analyzing different types of spatial data. The package is available, or will be available soon on CRAN. From the package home page, \url{http://r-spatial.sourceforge.net/}, a graph gallery with R code, and the development source tree are available. This vignette describes the classes, methods and functions provided by sp. Instead of manipulating the class slots (components) directly, we provide methods and functions to create the classes from elementary types such as matrices, data.frames or lists and to convert them back to any of these types. Also, coercion (type casting) from one class to the other is provided, where relevant. Package {\tt 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 {\tt sp} provides classes for the spatial-only information (the topology), e.g. {\tt SpatialPoints}, and extensions for the case where we attribute information stored in a {\tt data.frame} is available for each spatial entity (e.g. for points, the {\tt SpatialPointsDataFrame}). The available data classes are: \begin{center} \begin{tabular}{lllll} data type & class & attributes & contains \\ \hline points & {\tt SpatialPoints} & No &{\tt Spatial}* \\ points & {\tt SpatialPointsDataFrame} & {\tt data.frame} &{\tt SpatialPoints}* \\ pixels & {\tt SpatialPixels} & No &{\tt SpatialPoints}* \\ pixels & {\tt SpatialPixelsDataFrame} & {\tt data.frame} &{\tt SpatialPixels}* \\ & & &{\tt SpatialPointsDataFrame}** \\ full grid & {\tt SpatialGrid } & No &{\tt SpatialPixels}* \\ full grid & {\tt SpatialGridDataFrame} & {\tt data.frame} &{\tt SpatialGrid}* \\ line & {\tt Line} & No & \\ lines & {\tt Lines} & No & {\tt Line} list \\ lines & {\tt SpatialLines} & No & {\tt Spatial}*, {\tt Lines} list \\ lines & {\tt SpatialLinesDataFrame} & {\tt data.frame} &{\tt SpatialLines}* \\ rings & {\tt Polygon} & No &{\tt Line}* \\ rings & {\tt Polygons} & No &{\tt Polygon} list \\ rings & {\tt SpatialPolygons} & No &{\tt Spatial}*, {\tt Polygons} list \\ rings & {\tt SpatialPolygonsDataFrame} & {\tt data.frame} &{\tt SpatialPolygons}* \\ \end{tabular} \end{center} * by direct extension; ** by setIs() relationship; The class {\tt Spatial} does never hold actual data, it only provides the information common to all derived classes: the spatial coordinates bounding box and information about the coordinate reference system (geographic projection information). In the following sections we will show how we can create objects of these classes from scratch or from other classes, and which methods and functions are available for them. \section{Manipulating spatial objects} Although entries in spatial objects are in principle accessible through their slot name, e.g. {\tt x@coords} contains the coordinates of an object of class or extending {\tt 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" (items) and/or columns in the data attribute table; e.g. {\tt meuse[1:2, "zinc"]} returns a {\tt SpatialPointsDataFrame} with the first two points and an attribute table with only variable "zinc". \item \verb|[[| select a column from the data attribute table \item \verb|[[<-| assign or replace values to a column in the data attribute table. \end{itemize} Other methods available are: {\tt plot}, {\tt summary}, {\tt print}, {\tt dim} and {\tt names} (operate on the data.frame part), {\tt as.data.frame}, {\tt as.matrix} and {\tt image} (for gridded data), {\tt lines} (for line data), {\tt points} (for point data), {\tt subset} (points and grids), {\tt stack} (point and grid data.frames), and {\tt length} (number of features). \subsection{Spatial methods} A number of spatial methods are available for the classes in {\tt sp}: \begin{itemize} \item {\tt dimensions(x)} returns number of spatial dimensions \item {\tt y = spTransform(x, CRS("+proj=longlat +datum=WGS84"))} transform from one coordinate reference system (geographic projection) to another (requires package rgdal) \item {\tt bbox(x)} returns a matrix with the coordinates bounding box; the dimensions form rows, min/max form the columns \item {\tt coordinates(x)} returns a matrix with the spatial coordinates %\item {\tt rings(x)} retrieve the spatial rings (polygons) of an %object deriving from {\tt SpatialPolygons} % \item {\tt method to retrieve lines? --> Lines()? \item {\tt gridded(x)} tells whether {\tt x} derives from SpatialPixels \item {\tt spplot(x)} plot attributes, possibly in combination with other types of data (points, lines, grids, polygons), and possibly in as a conditioning plot for multiple attributes \item {\tt overlay(x, y)} combine two spatial layers of different type, e.g. retrieve the polygon or grid indexes on a set of points. \item {\tt spsample(x)} sampling of spatial points in continuous space within a polygon, a gridded area, or on a spatial line. Subsetting and {\tt sample} can be used to subsample full spatial entities. \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 {\tt 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 {\tt SpatialPoints} object; aspect ratio of x and y axis units is 1} \label{fig:points} \end{figure} We can retrieve the coordinates from {\tt 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 {\tt SpatialPointsDataFrame} object is by building it from a a {\tt 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 {\tt data.frame}s, but coordinates are always sticky and allways a {\tt SpatialPointsDataFrame} is returned; {\tt drop=FALSE} is not allowed. If coordinates should be dropped, use the {\tt as.data.frame} method and select the non-coordinate data, or use \verb|[[| to select a single attribute column (example below). {\tt 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, {\tt coordinates} by setting (specifying) the coordinates promotes its argument, an object of class {\tt data.frame} to an object of class {\tt SpatialPointsDataFrame}. The method {\tt as.data.frame} coerces back to the original {\tt data.frame}. When used on a right-hand side of an equation, {\tt 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 {\tt spplot} to colour symbols, or {\tt 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 {\tt SpatialPointsDataFrame} object, using symbol size ({\tt bubble}, top) or colour ({\tt spplot}, bottom) } \label{fig:spdf} \end{figure} \section{Grids} Package {\tt sp} has two classes for grid topology: {\tt SpatialPixels} and {\tt SpatialGrid}. The pixels form stores coordinates and is for partial grids, or unordered points; the {\tt SpatialGrid} form does not store coordinates but holds full grids (i.e., {\tt 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 {\tt 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) @ \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 {\tt as(x, "Class")}, or by using the function {\tt 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 do not have to be stored; also, no ordering of grid cells is required. For plotting by a grid with {\tt levelplot}, this form is required and {\tt spplot} (for grids a front-end to {\tt levelplot}) will convert grids that are not in this form. In contrast, {\tt 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 {\tt print}, {\tt summary}, {\tt plot}, objects of class {\tt SpatialGridDataFrame} have methods for \begin{itemize} \item \verb|[| select rows (points) or columns (variables) \item \verb|[[| retrieve a column from the attribute table (data.frame part) \item \verb|[[<-| assign or replace a column in the attribute table (data.frame part) \item {\tt coordinates} retrieve the coordinates of grid cells \item {\tt as.matrix} retrieve the data as a matrix. The first index (rows) is the x-column, the second index (columns) the y-coordinate. Row index 1 is the smallest x-coordinate; column index 1 is the larges y-coordinate (top-to-bottom). \item {\tt as} coercion methods for {\tt data.frame}, {\tt SpatialPointsDataFrame} \item{\tt image} plot an image of the grid \end{itemize} Finally, {\tt spplot}, a front-end to {\tt 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 {\tt 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 {\tt SpatialLines} from scratch. Note that the {\tt Lines} objects have to be given character ID values, and that these values must be unique for {\tt Lines} objects combined in a {\tt 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 {\tt 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 {\tt 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 {\tt Sr4} has the opposite direction (anti-clockwise) as the other three (clockwise); it is meant to represent a hole in the {\tt Sr3} polygon. The default value for the hole colour {\tt pbg} is {\tt "transparent}, which will not show, but which often does not matter, because another polygon fills the hole --- here it is set to {\tt "white"}. Note that the {\tt Polygons} objects have to be given character ID values, and that these values must be unique for {\tt Polygons} objects combined in a {\tt 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 {\tt SpatialPolygonsDataFrame}, are built from the {\tt SpatialPolygons} object (topology) and the attributes (data.frame). The {\tt row.names} of the attributes data frame are matched with the ID slots of the {\tt 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 {\tt 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/MD50000644000175100001440000002367512321321642011233 0ustar hornikusers24aa622acaee6a3a6e2958cd765aa86e *ChangeLog e1217cb767c48f1e353ae9a54913cdc7 *DESCRIPTION 6b0450c5da7ca97fa6ffd030c4c57e00 *NAMESPACE 739befafa689d4a7a522277139b024ce *R/AAA.R 288c25ad4c5dfd9a6de96f94f214d1ea *R/CRS-methods.R c8ec1e1ac1404e1d5fd1d26e70202692 *R/Class-CRS.R 45fb8f52bf10fde55b893a7116d0f62d *R/Class-GridTopology.R 41130fdb4696941544a87a1aa331b887 *R/Class-Spatial.R e9a209940d3602b239e1883d3ec866d7 *R/Class-SpatialGrid.R fdcee3243406fe0a56e3be3597c64c05 *R/Class-SpatialGridDataFrame.R 43254c94cf03dc237e5dda4b3c1dd338 *R/Class-SpatialLines.R 225168c1bbf1f3e3601005756dac490f *R/Class-SpatialLinesDataFrame.R 615a68f7e05e34ee76f562dd3eccd1a4 *R/Class-SpatialPoints.R f1bbaf8d56b874461aea4c6e3a7a0715 *R/Class-SpatialPointsDataFrame.R d79b2b920afde6368b49e27bdd38b85e *R/Class-SpatialPolygons.R 650411b1ca0c73264ec22966d2459d58 *R/Class-SpatialPolygonsDataFrame.R cc1e81cbf1289b3b0154bc6270e7e0f9 *R/GridTopology-methods.R 0d9312dc33b478b7d9929c01eedd4760 *R/Spatial-methods.R c04a01e38de3a32b3c244af5c2228f44 *R/SpatialGrid-methods.R 5038b503ff5c2bdef4fad6c422ba5282 *R/SpatialGridDataFrame-methods.R 6e8a7701e845abadfb7d2a8e76e975a9 *R/SpatialLines-methods.R 21982e52a9d6865237422bfadaccce5a *R/SpatialLinesDataFrame-methods.R fc3c5b826d910b86fc8c4d9140c52120 *R/SpatialPoints-methods.R 327ba1b18deb4362416c5385dae88740 *R/SpatialPointsDataFrame-methods.R beda5e1efea333938c24b81405ef7cbb *R/SpatialPolygons-displayMethods.R 0d9a5bd10833af81e4532b1dd6be6f50 *R/SpatialPolygons-internals.R 07c1f06e9f3b6fbc3a26df28a5975e83 *R/SpatialPolygons-methods.R 1d867bf232911fde95fd9cb774c36826 *R/SpatialPolygonsDataFrame-methods.R bde15617ef63b08ac721f7f9d869f614 *R/asciigrid.R 409e1e7fbf65fe54299489cbef589015 *R/bpy.colors.R 4df08a5b28b0949369eea06de02e3d15 *R/bubble.R 1aa592addc9edd46c912bf5957984c93 *R/chfids.R 65a220347a38a916e839be41c7b11de0 *R/compassRose.R ac739a16815614408b8863680865a7aa *R/disaggregate.R 1eb6be26e5a9de56a67bc8e5c496b9e5 *R/dms.R 80028a8aeb01f6d8e930d5a928f776a9 *R/flipSGDF.R 65578bd14f0d356a7858a4a7f3c5a243 *R/gridded.R d6ea46f7951cd52bb5a2fcc07d678e51 *R/gridlines.R 4a063059162aa84c4b6430e26b57bbc0 *R/image.R d5ccdeeeabffc927e3120fadac6128bd *R/loadmeuse.R 227082b122be9fea35ecdf94ea6fb01d *R/mapasp.R 3204ee88295f62693fcd4965d41271bb *R/merge.R 35adfbbaf096f01c3bc0fa50f12719c0 *R/over.R 578ee9ebca197d287e3bcb962d541cdb *R/overlay.R 6766016266625ca1971291263fec4b22 *R/point.in.polygon.R fde1930b5281a327d329e06707ca31c0 *R/projected.R 12790cf50570025120f4ec36a614290c *R/rbind.R 059f2337b83c1ce6f2e5f0708511f235 *R/recenter.R d87dfe785fe09899b2e69a68da95e786 *R/select.spatial.R 4a5610ad7a73f111114b7e19d91a7205 *R/spOptions.R 8e6c26b7e28894fab7b4885297ac471c *R/sp_spat1.R 99bafd2631bf608925c715bad8001861 *R/spdists.R 6dcdc9a5b502771f1467cebd3a679483 *R/spplot.R 052adf472ba7b558bced9fc3a557d935 *R/spsample.R 24a1fcc357498b36a232d2368a534f17 *R/stack.R ca1582f2517e4003400af59d68990bf3 *R/subset.R 1bf89e559504db11dd0379dbc071083f *R/surfaceArea.R 79b5596f97f1cba7661096c9f09ef94e *R/zerodist.R 0ad8a423b67cfbe70b0264d9c9118871 *build/vignette.rds 72487cc74a945f4fc4b24fffd0131844 *data/Rlogo.rda 74625a0d7da3999356f25f54a1a0b44e *data/meuse.grid.rda a07f5780a03c0ffa5a5d8728319fb473 *data/meuse.grid_ll.rda 10f130592d778244fe3cb22b1ef0e641 *data/meuse.rda 0cb67fca70ee8760ce5505941c191451 *data/meuse.riv.rda 7c5809cb61bb7b8ac6460a1ef28757ff *demo/00Index 4fa4c3a9d5fe296202d4b8bb656bcae1 *demo/depend.R 037cb395027d0d8a2091648a740ae842 *demo/fib.R 168ae38b256ba6d1ea6e17db6b15fcd0 *demo/gallery.R b469f1dc1c13bb5e7c7f4064a163723c *demo/meuse.R e9cb60dbf23da03f6a01dfef1a6b9fb1 *inst/CITATION 24aa622acaee6a3a6e2958cd765aa86e *inst/ChangeLog 6ea05e88d7f4afaf0e6da1220c8884fb *inst/doc/csdacm.R 40c9c96c12943eab808dce21393af046 *inst/doc/csdacm.Rnw 807342dbcc585a6d84f7837a364ab74c *inst/doc/csdacm.pdf bcf232454073d3f45a0ad8976fca6e6b *inst/doc/intro_sp.R b5d5045d7ea4b5966f4692767c874117 *inst/doc/intro_sp.Rnw 3f2411020ad5448f7de60ded3db2163b *inst/doc/intro_sp.pdf f76309afa8e129bb1b18aaed01a7bbd1 *inst/doc/over.R 3fcabe74c57ec005fff79a5a200b259a *inst/doc/over.Rnw d8d4fe8234cd063fe3629670cbbebfca *inst/doc/over.pdf 1d14390f7c198db1b4f3fa00ae91cf14 *inst/external/seamap105_mod.csv ef247b6c335e75e48f81da7ef7554fa6 *inst/external/simple.ag 15c2101eb916ea116f400d560f73dd7c *inst/external/test.ag 511e67709259a7c6b2e2d3aaf77a4647 *inst/include/sp.h e8e96db0cc872e8ffab7c2d09152fe02 *inst/include/sp_xports.c a47da7fc5909b3a231b9df0e056b31cc *man/00sp.Rd 3b577080797ede49e220ebc47e5a6732 *man/CRS-class.Rd 5c196729fe648dbf5d5ee3aeeeb2569c *man/DMS-class.Rd 848e4fa7d85383b9a10f5eec3bb798b6 *man/GridTopology-class.Rd 613de6f8c7e25da7dff1842d5107341e *man/Line-class.Rd 5d809f7ce16e60d28894655dd23c7bf2 *man/Line.Rd 50c887eafc899f7978ef6a07d09c4442 *man/Lines-class.Rd 57d7ea3fda9d6ef1b179c0d6730bdffd *man/Polygon-class.Rd f9397832758ad0bc1417c4f2e8af0e63 *man/Polygons-class.Rd c92dc2e2c0e4a5cde949d34987083d76 *man/Rlogo.Rd e30cc923a4c893e63fe80cda0d776733 *man/Spatial-class.Rd 83b4e150736961ce00a897871a6850f5 *man/SpatialGrid-class.Rd efec013d74b265a1fe0ad2167e91d0c0 *man/SpatialGrid.Rd 91437349b3ceefc25ab5287608e86a15 *man/SpatialGridDataFrame-class.Rd cf0e9d73973efa3269e6a65bada1754a *man/SpatialGridDataFrame.Rd 6db9df4d6f03fdea41286d4c4bf2093a *man/SpatialLines-class.Rd 231de8901473c05e08e791f702f38ef0 *man/SpatialLines.Rd afc3fe482522b532eb50979c68e334d7 *man/SpatialLinesDataFrame-class.Rd 807722952acb66d365b2ef5c895bb70e *man/SpatialPixels-class.Rd b5058ed86ce6382ad33c9ead1052e59e *man/SpatialPixelsDataFrame-class.Rd 51df8dc1b2c3f07130c265445c5ffc95 *man/SpatialPoints-class.Rd 50aa15c5c3a025a0691fe4ccfb70ec0f *man/SpatialPoints.Rd a751fcaa7e398339498c59d5ad9e8e52 *man/SpatialPointsDataFrame-class.Rd 61d2393bdeed133a9a74ee45d30bd1c9 *man/SpatialPolygons-class.Rd 86a6d3989699334fa5cf64cee806bec0 *man/SpatialPolygons.Rd 986829583cb978e96a0eafec472b84a1 *man/SpatialPolygonsDataFrame-class.Rd 33f41dd1b00826f4b520d9ebbdcfd3c4 *man/addattr.Rd 3bfbb7c2c5872fb0bdbd9fa9b78ecf9e *man/as.SpatialPolygons.GridTopology.Rd 66b4322a9ddcf43ccc9b7034d594e55e *man/as.SpatialPolygons.PolygonsList.Rd ec7752d4129e1c0adc387f6eaf6bf23d *man/asciigrid.Rd 245640af308834eb00230929a7e0bf24 *man/bbox.Rd 48c06136fdfdbb0a3d18599d6dce97e2 *man/bpy.colors.Rd a8f602dc1d3e76c573f63c86a82d6e5f *man/bubble.Rd 8f74058e28aa073681f63952f96a4a32 *man/char2dms.Rd 00ccd189bee51220e3b6deca3cc81da3 *man/compassRose.Rd 1e3f81bb39409e5fa650eb23d4aa2cc2 *man/coordinates-methods.Rd 91828b1582e869eea6dd71273ed67a65 *man/coordinates.Rd f6317829b278feb4f468feffdc3cfe45 *man/coordnames-methods.Rd 938e5da63c62c82d98a0ed2747f2a864 *man/degaxis.Rd 7816213f9c3212422441326b5323a42f *man/dimensions.Rd b1bce8cf252d07c8d654e0228cdbe513 *man/disaggregate.Rd fd50e71d1b89b6697d733ff7ec0160df *man/flip.Rd 07eef35922488d7aba086a741302271d *man/geometry-methods.Rd 946863d5de28dc1c30dbb60d2e6b65ae *man/gridded-methods.Rd e69b17e91071d5ca729ec06c2226e9f1 *man/gridindex2nb.Rd d20bbb995e8dbfd8b9b3bf66af000b41 *man/gridlines.Rd 59c5c2c18df9a8116ebdfc34c32b0f60 *man/image.Rd 01b87912ec2972abaa98e78bfefc5edc *man/is.projected.Rd d21143983ecd66ecb4bd0751d99579f5 *man/loadmeuse.Rd 907a8e354d75f5d080476783f9c54166 *man/mapasp.Rd 9aebd23819ba822c71718ed2bce6897d *man/merge.Rd d6d7c55075b7110c89cd218a9c5e9920 *man/meuse.Rd f17ead2fc674b4334dbdfe667d35f247 *man/meuse.grid.Rd 67f42a0f50ed052b8cf481dc7f5c19ed *man/meuse.grid_ll.Rd 166cc6d0721fbe141451baaefe216a65 *man/meuse.riv.Rd d3ad699a5795577ad6cbf3e043c56180 *man/nowrapSpatialLines.Rd 9f7e44f48cec320ec3a8bbf2823806d7 *man/over.Rd 084072aa0b82642194f10d2f40808f1c *man/panel.Rd 711ce4aa4329db10a14e35b417483bbc *man/point.in.polygon.Rd 28647044030f08a19d5d40982f1cb797 *man/polygons-methods.Rd ba9488d7aef328e7c40d1ca0f9168f0c *man/polygons.Rd b1401b9236986cbd3f94e628a72da78b *man/recenter-methods.Rd fb2d7d3cc0396cb00f9032516394da91 *man/select.spatial.Rd e5649b2a60732e30bc485e74423d2c69 *man/sp-deprecated.Rd 586721930ea6d6ac5743f9774a5cd81e *man/spChFIDs-methods.Rd 6ee039a7347cae567fd3cb94982225e0 *man/spDistsN1.Rd c6278dad3b854dc35f1a689a04e903a1 *man/spTransform.Rd a775bd11b6b7b89cd0ea44ba9bedb28c *man/spplot.Rd 5c703990784bd602c507d740d34bf852 *man/spsample.Rd b0a89e8c8f714d9c3be05773e23f4f5d *man/stack.Rd 2d10c7a98bbe0333f1f97e671a67d9ec *man/surfaceArea.Rd c349b0aa947bfed54a918cc0a38f0e55 *man/zerodist.Rd b1efa15042518ac8f870d15e2fe27d06 *src/Rcentroid.c e292e342762b540c04f59032698ad67d *src/gcdist.c 99a05bdbb4a3dcb23120642b6bfabecc *src/init.c 97d12d281a3261dfaba5a84364c66817 *src/pip.c 85630f3e6855823c603c84f0073b42e8 *src/pip2.c 6e730b0f804cdf0f65e08b8164dd0418 *src/sp.h e8e96db0cc872e8ffab7c2d09152fe02 *src/sp_xports.c 69af476fca6ecdc9d23bd31caa086283 *src/surfaceArea.c 26b63961eda2a05169671e9d2eea1b5f *src/zerodist.c fa6535954c1aae80289ee005a440e287 *tests/base.R 6e8e8a677eb7c18b602b8fe588053817 *tests/base.Rout.save d2cb61c328139edc80961a004de4b8d4 *tests/fail1.R 78349e0bb38b9748e7de1cb03e9db8b0 *tests/fail1.Rout.save e5f924e7615edeb9cb94f62b24de91f5 *tests/grid.R 67c29fd59eb7f30bfa71dc96e110e08c *tests/grid.Rout.save 1e0ef03882f25e548a00a02d2f515ce3 *tests/nc.Rout.save ebc6e08347984f2e0c93c72906e638cc *tests/over.Rout.save eabc364f08e96a443e3cd6282e807627 *tests/pass1.R aaff17af48df094c6427ad083dd2169e *tests/pass1.Rout.save f7754a48738a34642132763a216d00b0 *tests/point.in.polygon.R a515e869a5324a8790ea0d5ff6a41b2b *tests/point.in.polygon.Rout.save c5b0bdc5dbc743b4b7f5fddc1af1e72b *tests/sel.R 84d6b3a6fd6fb18639aafc8cdb86f766 *tests/sel.Rout.save 2c7dc2ace08e457f31d93d94def62b74 *tests/sp1.R 275aa91e91b4e5eb49eb252b52156d4e *tests/sp1.Rout.save 928e025b83c00e48b2487482cae86a3f *tests/spDists.R b34be8182d809cfded157e46bfa04677 *tests/spDists.Rout.save 36b73fa6efec515710fc661a71bbafa5 *tests/spplot.R 411d63bfdd4c74c3ecc979b1876e6616 *tests/spplot.Rout.save b8c37af31f973f318932063774a3fb8e *tests/zerodist.R 69df785bd3fd2a25c7347291a410a991 *tests/zerodist.Rout.save 40c9c96c12943eab808dce21393af046 *vignettes/csdacm.Rnw b5d5045d7ea4b5966f4692767c874117 *vignettes/intro_sp.Rnw 3fcabe74c57ec005fff79a5a200b259a *vignettes/over.Rnw sp/build/0000755000175100001440000000000012321302443012003 5ustar hornikuserssp/build/vignette.rds0000644000175100001440000000043712321302443014346 0ustar hornikusersR=O0u$,;V.,1!+vRK Q78sbr|ワ q6F7^Ir$dg^ge[<3RY_eM7w`u+ABǬd 2Z6 @eV؝5knO]JY]xVFt5̑qx*B"bz2F'i ~l7^{m -Pha<@MʠOA|^sp/DESCRIPTION0000644000175100001440000000451312321321641012416 0ustar hornikusersPackage: sp Version: 1.0-15 Date: 2014-04-01 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")) Depends: R (>= 2.14.0) Imports: methods, graphics, utils, lattice, grid Suggests: RColorBrewer, rgdal (>= 0.8-7), rgeos (>= 0.2-20), gstat Description: A package that provides 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://r-forge.r-project.org/projects/rspatial/ http://rspatial.r-forge.r-project.org/ Collate: 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-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 bpy.colors.R bubble.R mapasp.R select.spatial.R gridded.R asciigrid.R spplot.R over.R overlay.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 Packaged: 2014-04-09 17:36:35 UTC; edzer Author: Edzer Pebesma [aut, cre], Roger Bivand [aut], Barry Rowlingson [ctb], Virgilio Gomez-Rubio [ctb] Maintainer: Edzer Pebesma NeedsCompilation: yes Repository: CRAN Date/Publication: 2014-04-09 21:46:41 sp/ChangeLog0000644000175100001440000026551712317223156012506 0ustar hornikusers2014-04-02 12:15 edzer * DESCRIPTION, R/Spatial-methods.R: pass on ... to print() calls 2014-03-24 15:27 edzer * R/SpatialLinesDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R: print methods: pass on digits argument to print.data.frame 2014-03-01 15:49 rsbivand * R/CRS-methods.R: tightening CRS NA 2014-03-01 15:07 edzer * R/CRS-methods.R: simplified CRS(), now accepting CRS(as.logical(NA)), reported by Robert Hijmans 2014-02-22 15:56 edzer * R/spsample.R: quick hack to regular sampling bug reported by Robert, not finished. 2014-02-16 17:45 edzer * R/spsample.R: take right cellsize for correcting min.coords 2014-01-27 20:01 edzer * NAMESPACE, R/image.R, man/image.Rd: add imageScale (from image.scale, r-bloggers) 2014-01-27 16:46 edzer * R/spsample.R, man/spsample.Rd: repair makegrid when cellsize is given, modify docs 2014-01-25 19:23 edzer * R/rbind.R, R/zerodist.R, man/as.SpatialPolygons.GridTopology.Rd, src/zerodist.c, tests/Examples/sp-Ex.Rout.save, tests/zerodist.Rout.save: move example to \dontrun{}, took too long; optimize zerodist(..., match.ID=TRUE) further; remove warning in rbind 2014-01-25 17:40 edzer * DESCRIPTION, NAMESPACE, R/rbind.R, R/zerodist.R, man/zerodist.Rd, src/init.c, src/sp.h, src/zerodist.c: zerodist(..., unique.ID=TRUE) is now efficient and will no longer create all identical pairs. 2014-01-09 16:51 edzer * R/disaggregate.R, R/rbind.R: added makeUniqueIDs to rbind.SpatialPolygonsDataFrame disaggregate.R: patch from Robert Hijmans 2014-01-05 23:08 edzer * R/Class-SpatialPoints.R, R/Class-SpatialPointsDataFrame.R, R/SpatialPoints-methods.R, R/SpatialPointsDataFrame-methods.R: remove useless, outdated and wrong comments 2014-01-05 22:59 edzer * R/SpatialGrid-methods.R: remove historic, useless and wrong comments 2013-12-25 11:55 edzer * R/merge.R: improvement/bug fix of merge, email Robert Hijmans 24/12/13 2013-12-17 17:49 edzer * DESCRIPTION, R/SpatialGrid-methods.R, man/GridTopology-class.Rd, man/coordinates.Rd: version update add coerce methods from SpatialGrid/SpatialPixels to GridTopology 2013-10-23 11:04 edzer * inst/ChangeLog: update for release 2013-10-22 07:12 edzer * R/SpatialLines-methods.R, R/SpatialLinesDataFrame-methods.R, R/SpatialPoints-methods.R, R/SpatialPointsDataFrame-methods.R: change defaults digit=6 into digits=getOption("digits") 2013-10-15 16:35 edzer * DESCRIPTION, R/CRS-methods.R, R/rbind.R, man/CRS-class.Rd: merge checkCRSequal into identicalCRS, this now deals with object lists 2013-10-02 15:53 edzer * inst/include/sp.h, src/sp.h: synchronized inst/include/sp.h with src/sp.h removed non-existing function declaration 2013-10-01 16:04 edzer * R/spplot.R: added check draw=TRUE before creating axes labels 2013-09-30 21:38 edzer * NAMESPACE, man/panel.Rd: now exporting bbexpand (needed by spacetime) 2013-09-28 10:30 edzer * DESCRIPTION, NAMESPACE, man/panel.Rd: exporting longlat.scales (for spacetime). 2013-09-27 12:22 edzer * src/gcdist.c: indent 2013-09-26 12:51 edzer * src/pip.c, src/pip2.c, src/zerodist.c: changed Rdefines.h into Rinternals.h 2013-09-18 07:40 edzer * R/SpatialPointsDataFrame-methods.R: removed constraint that attr(data, "row.names") has to be of mode character before matching IDs in SpatialPointsDataFrame() 2013-09-11 09:12 edzer * R/SpatialLines-methods.R, man/SpatialPoints-class.Rd, tests/Examples/sp-Ex.Rout.save: added coerce from SpatialPoints to Line, Lines and SpatialLines 2013-09-05 07:50 edzer * DESCRIPTION: updated version; removed Maintainer and Author fields. 2013-09-04 13:33 edzer * DESCRIPTION, R/Class-CRS.R, R/Class-GridTopology.R, R/Class-Spatial.R, R/Class-SpatialGrid.R, R/Class-SpatialGridDataFrame.R, R/Class-SpatialLines.R, R/Class-SpatialLinesDataFrame.R, R/Class-SpatialPoints.R, R/Class-SpatialPointsDataFrame.R, R/Class-SpatialPolygons.R, R/Class-SpatialPolygonsDataFrame.R, R/dms.R: version bump, R dependency downgrade; reverted to pre-3.0.0 representation() instead of slots = definitions in setClass() 2013-09-04 10:30 edzer * DESCRIPTION: dependency on R 3.0.0 2013-09-02 10:35 edzer * R/SpatialPointsDataFrame-methods.R, oChangeLog, svn2cl.xsl, tests/fail1.Rout.save: reworked the SpatialPointsDataFrame construction checks. 2013-09-02 09:49 rsbivand * ChangeLog, inst/ChangeLog: tidy 2013-09-02 09:47 rsbivand * tests/fail1.Rout.save: test output fail 2013-09-02 09:13 rsbivand * .Rbuildignore, man/merge.Rd: .Rbuildignore, merge line length 2013-09-02 08:27 edzer * demo/depend.R: tidy 2013-09-01 14:06 edzer * R/SpatialPointsDataFrame-methods.R: added one more check before ID's are matched (row.names need be character) 2013-09-01 10:12 rsbivand * DESCRIPTION: revert to Author/Maintainer in DESC; change rgeos suggested version 2013-08-30 16:54 edzer * DESCRIPTION, NAMESPACE, R/over.R, man/over.Rd, tests/Examples/sp-Ex.Rout.save: export overDF_for_rgeos, for rgeos; define this function in over.R 2013-08-29 21:33 edzer * DESCRIPTION: removed lattice from Suggests: field, to address CRAN note. 2013-08-13 19:04 edzer * man/Spatial-class.Rd: tidy \alias in doc 2013-08-13 18:50 edzer * R/Spatial-methods.R, R/SpatialPointsDataFrame-methods.R, man/Spatial-class.Rd, tests/sp1.Rout.save: [<- method for Spatial*DataFrame objects suggestions from Sebastian Meyer: - SpatialPoints inherit row.names from SpatialPointsDataFrame - selection using [ of SpatialPointsDataFrame using row names (character) 2013-07-22 08:13 edzer * src/zerodist.c: zerodist() for longlat data was computed falsely; see https://stat.ethz.ch/pipermail/r-sig-geo/2013-July/018930.html 2013-07-18 15:00 edzer * R/GridTopology-methods.R, R/SpatialGridDataFrame-methods.R, R/SpatialLines-methods.R, R/SpatialPoints-methods.R, R/SpatialPolygons-displayMethods.R, R/rbind.R, R/spplot.R, inst/ChangeLog: tidy (un-quote first argument of do.call) 2013-07-18 10:29 rsbivand * man/SpatialPolygons-class.Rd, man/SpatialPolygons.Rd: comment documentation for SpatialPolygons 2013-07-09 15:28 edzer * R/sp_spat1.R: changed setClass to setOldClass, for registring S3 classes. 2013-07-09 15:00 edzer * R/Class-CRS.R, R/Class-GridTopology.R, R/Class-Spatial.R, R/Class-SpatialGrid.R, R/Class-SpatialGridDataFrame.R, R/Class-SpatialLines.R, R/Class-SpatialLinesDataFrame.R, R/Class-SpatialPoints.R, R/Class-SpatialPointsDataFrame.R, R/Class-SpatialPolygons.R, R/Class-SpatialPolygonsDataFrame.R, R/dms.R, tests/Examples/sp-Ex.Rout.save: replaced "representation" by "slots" and "contains", as the documention of setClass suggests is needed by R 3.0.0 2013-07-09 08:52 edzer * man/disaggregate.Rd, man/merge.Rd: tidy docs 2013-07-05 10:23 edzer * vignettes/csdacm.Rnw: mention that csdacm was updated after retirement from asdar. 2013-07-05 10:21 edzer * NAMESPACE: exportMethods(merge); this needs raster > 2.1-41 for raster to pass check. 2013-07-03 17:36 edzer * DESCRIPTION, NAMESPACE, R/Spatial-methods.R, R/merge.R, man/merge.Rd: added merge method for Spatial objects added an error when an attribute is added or replaced with the same name as one of the coordinates. 2013-07-01 07:27 edzer * inst/CITATION: name fix 2013-07-01 07:18 edzer * inst/CITATION: mention second edition of ASDAR 2013-06-30 13:30 edzer * inst/ChangeLog, inst/doc, vignettes, vignettes/csdacm.Rnw, vignettes/intro_sp.Rnw, vignettes/over.Rnw: moved vignettes to vignette directory 2013-06-30 12:43 edzer * R/disaggregate.R, inst/doc/csdacm.Rnw, man/disaggregate.Rd, tests/Examples/sp-Ex.Rout.save: corrected disaggregate; added disaggregate examples updated csdacm vignette to use over() instead of deprecated overlay() 2013-06-28 09:04 edzer * man/Spatial-class.Rd, man/disaggregate.Rd: added documentation for disaggregate and aliases for spatstat S4 classes 2013-06-28 05:46 edzer * NAMESPACE: export method disaggregate 2013-06-27 20:51 edzer * NAMESPACE: exporting spatstat Classes ppp, im, psp, owin 2013-06-27 20:45 edzer * R/sp_spat1.R: removed class tess (which is used, nor exported) 2013-06-27 06:54 edzer * R/spdists.R, R/zerodist.R, man/zerodist.Rd, src/init.c, src/sp.h, src/zerodist.c: zerodist and zerodist2 now handle longlat data, using sp_gcdist tidied spdists.R 2013-06-25 19:08 edzer * R/SpatialLines-methods.R, R/spdists.R, man/SpatialGridDataFrame-class.Rd, man/SpatialPoints-class.Rd, man/SpatialPointsDataFrame-class.Rd, man/spDistsN1.Rd, src/gcdist.c, src/sp.h, tests/Examples/sp-Ex.Rout.save: tidy; added $ method for SpatialPoints, such that meuse$x is found even if x is a coordinate. added methods to convert from spatstat (im, ppp) to Spatial objects 2013-06-25 17:13 rsbivand * inst/doc/csdacm.Rnw, inst/doc/csdacm.pdf: adding footnote 2013-06-25 14:09 rsbivand * DESCRIPTION: add vignette; fix line length issues 2013-06-25 14:03 rsbivand * DESCRIPTION, inst/doc/csdacm.Rnw, inst/doc/csdacm.pdf, inst/doc/intro_sp.pdf, inst/doc/over.pdf, inst/external/seamap105_mod.csv, man/CRS-class.Rd, man/SpatialPolygons-class.Rd, man/SpatialPolygonsDataFrame-class.Rd, man/as.SpatialPolygons.GridTopology.Rd, man/gridlines.Rd, man/nowrapSpatialLines.Rd, man/polygons.Rd, man/recenter-methods.Rd, man/spplot.Rd, tests/Examples/sp-Ex.Rout.save: add vignette; fix line length issues 2013-06-24 21:09 edzer * R/SpatialPoints-methods.R, R/disaggregate.R, R/sp_spat1.R, R/unfold.R: added disaggregate functions (not yet exported); added $ method for SpatialPoints that also catches coordinates, as meuse$x sp_spat1 has the conversion from spatstat classes ppp and im to Spatial objects 2013-06-21 14:11 rsbivand * R/CRS-methods.R, man/CRS-class.Rd, man/is.projected.Rd, tests/fail1.R, tests/fail1.Rout.save: checks on latlon and lonlat 2013-05-23 19:29 edzer * R/Spatial-methods.R, man/spTransform.Rd: added spTransform(ANY) methods that will stop and point to rgdal. 2013-05-07 09:12 rsbivand * R/SpatialPoints-methods.R: guard against non-finite coordinates 2013-05-07 07:54 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: guard against non-finite polygon coordinates 2013-04-26 08:54 edzer * DESCRIPTION, R/SpatialGridDataFrame-methods.R, R/unfold.R: scaffold for unfold - nothing exported; improved coercion function for SpatialPixelsDataFrame to SpatialGridDataFrame, thanks to Jon Skoien. 2013-04-24 07:05 rsbivand * ChangeLog, inst/ChangeLog: closeAllConnections in readRAST6 replaced by counted closure 2013-04-22 19:48 edzer * DESCRIPTION: version update 2013-04-22 14:49 edzer * demo/depend.R: tidy 2013-04-22 14:24 edzer * demo/depend.R: better depend script 2013-04-22 09:34 edzer * demo/depend.R, man/spTransform.Rd, tests/Examples/sp-Ex.Rout.save, tests/fail1.Rout.save: added spTransform doc, updated checks, depend now uses two cores. 2013-04-19 15:52 edzer * DESCRIPTION: increased the rgdal version dependency 2013-04-19 13:16 edzer * NAMESPACE, R/Spatial-methods.R: defines generic, and exports method spTransform. 2013-04-12 22:11 mdsumner * R/gridlines.R: stringsAsFactors = FALSE for gridat labels, otherwise the factors returned are unusable without conversion to character 2013-03-30 13:36 edzer * DESCRIPTION: version bump 2013-03-30 13:33 edzer * R/spplot.R: lwd and lty now work on spplot()'ing SpatialPolygonsDataFrame objects; email today on r-sig-geo. 2013-03-29 10:00 rsbivand * ChangeLog, inst/ChangeLog: tidy 2013-03-29 09:57 rsbivand * inst/include/sp_xports.c: removing clang warnings 2013-03-29 09:56 rsbivand * DESCRIPTION, src/Rcentroid.c, src/pip.c, src/pip2.c, src/sp_xports.c, src/zerodist.c: removing clang warnings 2013-03-13 12:34 edzer * DESCRIPTION, R/Class-SpatialLines.R, R/Class-SpatialPolygons.R, R/SpatialPolygons-methods.R, R/overlay.R, man/Lines-class.Rd, man/SpatialLines.Rd, man/SpatialPolygonsDataFrame-class.Rd, man/overlay-methods.Rd, man/overlay.Rd, man/sp-deprecated.Rd, tests/Examples/sp-Ex.Rout.save: cleaned up deprecated functions, moved docs to sp-deprecated.Rd added package = "sp" to all .Deprecated calls version bump 2013-03-11 15:27 edzer * R/loadmeuse.R, demo/00Index, demo/meuse.R, man/loadmeuse.Rd: moved the functionality from loadMeuse() to demo("meuse") 2013-03-11 11:21 edzer * inst/ChangeLog: added ChangeLog 2013-03-11 11:21 edzer * R/loadmeuse.R, man/loadmeuse.Rd: loadMeuse() now avoids data() without setting envir to local environment(), and uses assign to assign to .GlobalEnv 2013-03-11 10:42 edzer * ChangeLog: submitted 1.0-6 to CRAN; then updated ChangeLog (after sp submission!) 2013-03-02 11:27 edzer * man/SpatialPixels-class.Rd, tests/Examples/sp-Ex.Rout.save: corrected documentation about drop=FALSE default argument in [ 2013-02-22 16:33 edzer * inst/doc/over.Rnw: synchronized with code in sp and rgeos 2013-02-22 14:08 edzer * R/over.R: make sure aggregate returns NA for empty sets, and not e.g. -Inf and a warning when fn is max 2013-02-22 11:03 edzer * R/over.R, man/over.Rd, tests/Examples/sp-Ex.Rout.save: added some missing over() methods. 2013-02-09 22:31 edzer * R/spplot.R: typo. 2013-02-09 17:30 edzer * R/spplot.R: added more flexibility in keeping auto.key options. 2013-02-06 11:14 edzer * R/spplot.R: addressed the problem raised by David Rossiter in https://stat.ethz.ch/pipermail/r-sig-geo/2013-February/017351.html 2013-02-04 14:51 edzer * DESCRIPTION: updated date 2013-02-04 14:51 edzer * man/spsample.Rd: updated docs; 2013-01-30 16:59 edzer * NAMESPACE, man/mapasp.Rd, man/spsample.Rd: export (and document) degreeAxisLabelsNS|EW 2013-01-22 20:10 edzer * demo/gallery.R: use coordinates() for deprecated function 2013-01-22 18:33 edzer * tests/Examples/sp-Ex.Rout.save: test outputs now reflect the full CRS of meuse[.grid] 2013-01-22 18:10 edzer * DESCRIPTION, R/spplot.R, man/spplot.Rd: update to spplot, suggested in https://stat.ethz.ch/pipermail/r-sig-geo/2013-January/017243.html ; try: library(sp) loadMeuse() spplot(meuse[c("lead", "zinc")], edge.col=1, colorkey=T, cuts=c(10,100,200,500,1000,2000)) 2013-01-19 12:22 edzer * R/spplot.R: longlat scales for spplot.points were ignored, reported by Oscar Perpiñán Lamigueiro 2013-01-12 13:14 edzer * R/loadmeuse.R: changed crs to full CRS, as libproj would fill it in 2013-01-11 11:34 edzer * NAMESPACE, R/CRS-methods.R, R/over.R, man/CRS-class.Rd, tests/Examples/sp-Ex.Rout.save: added identicalCRS() function, and used it in all over() methods. 2012-12-28 15:09 edzer * DESCRIPTION, R/overlay.R, man/as.SpatialPolygons.GridTopology.Rd, man/overlay-methods.Rd, man/overlay.Rd, tests/Examples/sp-Ex.Rout.save: .Deprecated() overlay; removed them from examples 2012-12-27 19:51 edzer * NAMESPACE, R/CRS-methods.R, R/Class-SpatialPolygons.R, R/SpatialPolygons-methods.R, R/SpatialPolygonsDataFrame-methods.R, R/chfids.R, R/point.in.polygon.R, R/zerodist.R: changed .Call("foo",x,package="sp") into .Call(foo,x); NAMESPACE to export symbols accordingly. 2012-12-21 19:48 edzer * DESCRIPTION, R/image.R, man/image.Rd, tests/fail1.Rout.save: image() with factor attr now works; updated docs; version bump after CRAN release; tests output update. 2012-12-21 13:42 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-12-21 13:42 rsbivand * ChangeLog, R/image.R, inst/ChangeLog, man/image.Rd: tidy 2012-12-21 13:27 edzer * R/image.R: factor data are now converted to numeric by image.SpatialGridDataFrame 2012-12-20 23:27 edzer * man/SpatialGridDataFrame-class.Rd, tests/Examples/sp-Ex.Rout.save: more tests 2012-12-20 23:15 edzer * tests/Examples/sp-Ex.Rout.save: updated test 2012-12-20 21:49 edzer * NAMESPACE, R/SpatialGridDataFrame-methods.R, man/SpatialGridDataFrame-class.Rd: added as.array and as(x, "array") methods for SpatialGridDataFrame. 2012-12-18 13:57 edzer * DESCRIPTION: version bump. 2012-12-18 08:48 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-12-18 08:47 rsbivand * DESCRIPTION, inst/include/sp_xports.c, src/sp_xports.c: catch empty comment string 2012-12-10 17:49 edzer * data/meuse.grid.rda, data/meuse.grid_ll.rda, tests/Examples/sp-Ex.Rout.save, tests/grid.Rout.save: changed meuse.grid$soil and meuse.grid_ll$soil into a factor; updated test outputs. 2012-12-05 08:08 rsbivand * src/gcdist.c: update link to Javascript GC distance code 2012-11-24 18:46 edzer * R/spplot.R: tidy 2012-11-24 15:45 edzer * man/char2dms.Rd: typo 2012-11-19 15:49 edzer * DESCRIPTION, NAMESPACE: added Barry and Virgilio as ctb 2012-11-15 16:59 edzer * NAMESPACE, R/SpatialPointsDataFrame-methods.R, R/spplot.R, man/SpatialPolygons-class.Rd, man/SpatialPolygonsDataFrame-class.Rd, tests/Examples/sp-Ex.Rout.save: removed some sample.Polygon(s) from examples; tidied NAMESPACE 2012-11-13 15:59 edzer * DESCRIPTION, NAMESPACE, R/CRS-methods.R, man/image.Rd, tests/Examples, tests/Examples/sp-Ex.Rout.save: moved Depends: to Imports: ; updated to new rgdal CRS interface; added examples output, and changed some (removed system.time(), to get consistent outputs) 2012-10-31 17:58 edzer * DESCRIPTION, R/CRS-methods.R, inst/ChangeLog: version increase; rgdal dependency on 0.7-21 (svn); now calls R wrapper for checkCRSArgs in rgdal. 2012-10-31 15:13 edzer * NAMESPACE, inst/ChangeLog, tests/fail1.Rout.save: NAMESPACE: tidy; ChangeLog: update; fail1 test: sync with R 2.15.2 2012-10-28 13:25 rsbivand * R/SpatialPolygons-methods.R: tess/Polygons crash prevention 2012-10-21 20:25 edzer * inst/doc/over.Rnw: added reference to spatio-temporal overlay/aggregation vignette. 2012-10-19 19:41 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: adding comment about ringDir 2012-10-12 21:05 edzer * man/bpy.colors.Rd: removed dead link 2012-10-10 16:27 edzer * ChangeLog, DESCRIPTION: version update 2012-10-09 21:00 edzer * R/spsample.R: forgot ,,drop=FALSE in sample.Spatial, which broke surveillance. 2012-10-07 15:30 edzer * R/SpatialGridDataFrame-methods.R, R/SpatialLines-methods.R: SpatialLines: cosmetics; SpatialGridDataFrame: data.frame() no longer converts character into factor. 2012-10-06 16:05 edzer * R/spplot.R: repaired sp.polygons, after report on r-sig-geo 2012-10-05 15:00 edzer * R/SpatialGridDataFrame-methods.R, R/SpatialLinesDataFrame-methods.R, R/SpatialPolygonsDataFrame-methods.R: buglet in [.SpatialPixelsDataFrame, is.na(i) was called before over() 2012-10-03 14:31 edzer * DESCRIPTION, R/CRS-methods.R, R/over.R, man/over.Rd: reverted back rgdal calling issue; DESCRIPTION: took out rgdal version requirement over: no changes, but (hopefully) more clear documentation. 2012-09-30 18:59 edzer * DESCRIPTION, R/CRS-methods.R: version update; use R function call to rgdal instead of .Call'ing a rgdal routine, for checking CRS (depends on rgdal >= 0.7-20). 2012-09-29 12:11 edzer * R/image.R: image for constant valued SpatialPixelsDataFrame would plot full bbox 2012-09-28 22:09 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-09-28 18:53 edzer * TODO: cleanup 2012-09-28 18:52 edzer * scripts: cleanup 2012-09-28 18:34 edzer * DESCRIPTION: version number change. 2012-09-28 12:08 edzer * man/panel.Rd: updated docs of sp.grid 2012-09-28 11:18 edzer * NAMESPACE, R/spplot.R: further support for grid.path, and grid.rect & colors in sp.grid; see r-sig-geo post. 2012-09-28 10:27 edzer * R/spplot.R: support polygons with holes as plotting object, and have another feature shine through; modified sp.grid such that it does something useful with colors. 2012-09-28 09:28 edzer * R/SpatialPolygons-methods.R, R/spplot.R: corrected bug in coordinates method for SpatialPolygons; support for polygons with holes in spplot, when in sp.layout argument 2012-09-27 20:12 edzer * inst/doc/intro_sp.Rnw: added length() generic. 2012-09-27 20:11 edzer * R/spsample.R: moved all overlay() into over(); deselect points outside bbox when global longlat coverage caused an error. 2012-08-29 14:31 edzer * R/loadmeuse.R, man/loadmeuse.Rd: added (optional) loading of the meuse river data, as SpatialPolygons object 2012-08-10 20:10 rsbivand * NAMESPACE: added usePolypath option 2012-08-10 20:04 rsbivand * DESCRIPTION, R/AAA.R, R/SpatialPolygons-displayMethods.R, R/spOptions.R, man/SpatialPolygons-class.Rd: added usePolypath option 2012-06-30 11:22 edzer * R/subset.R: bug fix, suggested by Sebastian Meyer, 6/26/2012 2012-06-23 15:56 edzer * man/00sp.Rd: updated \url{}s 2012-06-23 14:02 edzer * R/loadmeuse.R: added CRS to meuse and meuse.grid when loaded with loadMeuse() 2012-06-18 20:59 edzer * man/spChFIDs-methods.Rd: added spChFID<- docs 2012-06-18 19:50 edzer * NAMESPACE, R/Spatial-methods.R, R/SpatialPolygons-methods.R, R/SpatialPolygonsDataFrame-methods.R: added spChFIDs<- method; (row.names<- already did this, too) coordinates() methods for SpatialPolygons[DF] get IDs as row.names 2012-05-10 07:25 edzer * DESCRIPTION: version update 2012-04-27 13:25 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-04-27 13:25 rsbivand * man/SpatialPolygons-class.Rd: polypath default TRUE 2012-04-27 12:59 rsbivand * R/SpatialPolygons-displayMethods.R: polypath default TRUE 2012-04-20 18:03 edzer * NAMESPACE, man/panel.Rd: export, and document sp.panel.layout(), as might be required by ade4 2012-04-16 13:12 rsbivand * DESCRIPTION: adding top-level comment to SpatialPolygons for all member Polygons commented with OGC SFS kludge 2012-04-16 13:09 rsbivand * R/SpatialPolygons-methods.R, R/SpatialPolygonsDataFrame-methods.R: adding top-level comment to SpatialPolygons for all member Polygons commented with OGC SFS kludge 2012-04-16 08:48 edzer * man/over.Rd: added comment about left outer join. 2012-04-09 18:16 rsbivand * ChangeLog, inst/ChangeLog: update hole in Polygons documentation 2012-04-09 18:15 rsbivand * man/Polygons-class.Rd: update hole in Polygons documentation 2012-04-04 18:03 edzer * DESCRIPTION: DESCRIPTION depends on R >= 2.14.0 2012-04-03 20:11 edzer * DESCRIPTION, R/spplot.R: updated DESCRIPTION (removed author/maintainer fields); addressed spplot issue today on r-sig-geo 2012-04-03 13:29 edzer * R/gridlines.R, tests/grid.Rout.save, tests/pass1.Rout.save, tests/sp1.Rout.save, tests/zerodist.Rout.save: aligned test output with R 2.15.0 2012-03-30 07:39 rsbivand * R/projected.R: fix condition in replace CRS method 2012-03-28 10:28 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-03-28 10:26 rsbivand * NAMESPACE, R/AAA.R, R/projected.R, R/spOptions.R, man/is.projected.Rd: option warn replace CRS 2012-03-27 12:13 edzer * DESCRIPTION, demo/depend.R: version increase; --as-cran added to dependency script 2012-03-27 11:16 edzer * demo/depend.R: parallel package checking. 2012-03-26 20:54 edzer * R/spplot.R: resolved cex issue. 2012-03-26 11:55 edzer * DESCRIPTION, R/spplot.R, inst/ChangeLog, inst/doc/intro_sp.Rnw, inst/doc/sp.Rnw: renamed sp vignette (for right order on CRAN page); version increase; added cex.key argument for spplot.points method. 2012-03-22 21:53 edzer * inst/doc/over.Rnw: improvements, sent by John Baumgartner. 2012-03-16 14:01 edzer * R/SpatialGrid-methods.R: allow character proj4string in SpatialGrid() 2012-03-09 22:55 edzer * DESCRIPTION, NAMESPACE, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/SpatialPoints-methods.R, R/SpatialPointsDataFrame-methods.R, R/subset.R, man/Spatial-class.Rd, tests/zerodist.Rout.save: removed existing subset method, and replaced them with a single S3 subset that works for all Spatial objects that have a [ method (using the syntax, and the example of subset.data.frame). 2012-03-05 13:39 edzer * DESCRIPTION: version / date update 2012-03-05 08:36 edzer * DESCRIPTION, R/spplot.R: spplot for SpatialPointsDataFrames used data value order, rather than data record order, as noted in: https://stat.ethz.ch/pipermail/r-sig-geo/2012-March/014399.html this has now been changed. 2012-03-01 18:56 edzer * man/SpatialPolygons-class.Rd, man/SpatialPolygonsDataFrame-class.Rd: added vignette examples from scratch to SpatialPolygons man pages 2012-03-01 06:49 edzer * R/over.R, inst/ChangeLog: speed issue with %over%, reported on r-sig-geo 2012-02-15 11:31 edzer * DESCRIPTION, R/SpatialGridDataFrame-methods.R, R/SpatialLinesDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R, R/SpatialPolygonsDataFrame-methods.R: added checkNames, that checks names<- gets syntactically valid names set. 2012-02-13 22:09 edzer * DESCRIPTION, R/SpatialGrid-methods.R, man/SpatialGrid-class.Rd: date; added coordnames method for SpatialGrid objects 2012-02-06 16:51 edzer * demo/00Index, demo/depend.R: added script that runs R CMD check on packages depeding on sp 2012-02-01 23:00 edzer * DESCRIPTION, NAMESPACE, R/SpatialGrid-methods.R, man/gridindex2nb.Rd: version bump; tidied gridIndex2nb function + docs, exported it in NAMESPACE 2012-02-01 12:00 edzer * R/overlay.R, inst/ChangeLog: overlay() for SpatialGridDataFrame,SpatialPolygons again falls back on SpatialPoints,SpatialPolygons 2012-01-31 21:48 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-01-31 21:46 rsbivand * ChangeLog, inst/ChangeLog: tidy 2012-01-31 19:09 edzer * R/gridded.R: removed unneeded testing code / cleanup. 2012-01-27 16:14 edzer * R/SpatialGrid-methods.R: cleaned up construction of SpatialGrid (bbox) 2012-01-25 08:20 edzer * R/Class-SpatialGrid.R: added more checks to SpatialPixels validity function. 2012-01-23 18:25 edzer * R/overlay.R, man/overlay-methods.Rd: added overlay methods for SpatialGrid* 2012-01-23 15:51 edzer * R/Class-SpatialGrid.R, R/Class-SpatialGridDataFrame.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/over.R, man/SpatialGrid-class.Rd, man/SpatialGridDataFrame-class.Rd, man/over.Rd, tests/grid.Rout.save: SpatialGrid no longer subclasses SpatialPixels (by setIs); only explicit coercion brings one into the other. 2012-01-22 20:44 rsbivand * R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R: timings 2011-12-23 10:17 edzer * man/00sp.Rd: removed references to Cell (Pixels) or Gridded (Grid) 2011-12-22 14:49 edzer * R/SpatialGridDataFrame-methods.R: allow selection of single cell in SpatialGridDataFrame object. 2011-12-21 17:48 edzer * tests/fail1.R, tests/fail1.Rout.save: some more tests for image() 2011-12-21 17:03 edzer * R/image.R, tests/fail1.R, tests/fail1.Rout.save: zlim did not work with useRasterImage = TRUE; added image() tests to fail1.R (better late than never!) 2011-12-21 15:43 edzer * DESCRIPTION: version increase. 2011-12-20 17:02 edzer * DESCRIPTION, R/image.R: version bump; corrected error in image(x,2), which broke other CRAN packages 2011-12-19 21:50 edzer * R/image.R, man/image.Rd: breaks in image() did not work if useRasterImage was TRUE; fixed. 2011-12-19 09:08 rsbivand * data/Rlogo.R, data/Rlogo.rda, data/meuse.R, data/meuse.grid.R, data/meuse.grid.rda, data/meuse.rda, data/meuse.riv.R, data/meuse.riv.rda: convert data R to rda 2011-12-19 07:20 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-12-19 07:14 rsbivand * DESCRIPTION: tidy 2011-12-18 19:05 edzer * R/image.R, inst/ChangeLog, makefile, man/image.Rd, tests/fail1.Rout.save: added zlim argument to image and documentation; 2011-12-17 15:19 rsbivand * DESCRIPTION, NAMESPACE, R/AAA.R, R/Class-Spatial.R, R/projected.R, R/spOptions.R, man/Spatial-class.Rd, man/is.projected.Rd: adding tolerance and warning options to ll sanity check 2011-11-23 20:32 edzer * DESCRIPTION, NAMESPACE: added graphics to Depends: ; cleaned NAMESPACE file 2011-11-23 08:28 edzer * ChangeLog, DESCRIPTION: added Import: graphics to DESCRIPTION 2011-11-14 12:43 edzer * inst/doc/over.Rnw: added abstract. 2011-10-25 16:37 edzer * R/SpatialGrid-methods.R: as.SpatialPolygons.SpatialGrid now keeps proj4string 2011-10-21 14:47 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-10-19 19:21 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: add space character for safety in comment 2011-10-19 18:47 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-10-19 18:46 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: fix comment string length 2011-10-19 18:01 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-10-19 18:00 rsbivand * inst/include/sp_xports.c, src/sp_xports.c: add \0 to comment string 2011-10-18 19:30 edzer * DESCRIPTION, man/over.Rd: extended over examples, after email on r-sig-geo; version update 2011-10-17 13:19 edzer * DESCRIPTION, R/over.R, R/overlay.R: version update; functions are now applied column-wise to data.frame attribute tables in overlay() and over() 2011-10-07 16:25 edzer * tests/spplot.Rout.save: updated test, now without warning 2011-10-07 16:24 edzer * R/spplot.R: added row.names to xy, to avoid warning from addNAemptyRowsCols. 2011-10-07 12:04 barryrowlingson * man/00sp.Rd, man/Spatial-class.Rd: Corrected spelling of Rowlingson 2011-09-30 07:29 edzer * R/point.in.polygon.R: removed gc() call, and the need for a temporary object, because it resulted in a large performance overhead. 2011-09-24 15:50 edzer * R/image.R: meuse.grid -> x in image.SpatialPixels 2011-09-24 15:44 edzer * R/SpatialGridDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R: SpatialPointsDataFrame.R: no changes SpatialGridDataFrame: constructor function passes only geometry as arg x 2011-09-19 08:51 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-09-19 08:47 rsbivand * NAMESPACE, R/image.R, man/image.Rd: adding image.SpatialPixels 2011-09-19 08:27 rsbivand * R/image.R: change to suppressWarnings() in image() 2011-09-18 18:02 edzer * NAMESPACE, R/projected.R: cosmetic / cleaned up files. 2011-09-18 17:48 edzer * DESCRIPTION, R/AAA.R, R/Class-SpatialGrid.R, R/Spatial-methods.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/gridded.R, R/projected.R, man/gridded-methods.Rd, tests/fail1.R, tests/fail1.Rout.save, tests/grid.R, tests/grid.Rout.save: version update; proj4string, proj4string<-, gridded, gridded<-, is.projected<- are now all S4 methods; SpatialGrid no longer inherits SpatialPixels directly but Spatial; it is made SpatialPixels by a call to setIs(), which sets the right coercion function (the previous setAs() failed to do this, see https://stat.ethz.ch/pipermail/r-devel/2011-September/062037.html .onLoad outcommented (warnings on CRAN); updated and checked test results; updated manuals. 2011-09-17 19:24 rsbivand * R/image.R: supress warning when plotting window in image 2011-09-14 10:22 rsbivand * ChangeLog, inst/ChangeLog: Changelog update 2011-09-14 10:20 edzer * src/pip.c: replaced Calloc/Free with call to R_alloc. 2011-09-14 09:26 edzer * DESCRIPTION, src/pip.c, src/zerodist.c: version update; PROTECT/UNPROTECT in pip.c. 2011-09-14 05:51 edzer * DESCRIPTION, NAMESPACE, R/Spatial-methods.R, R/gridded.R, R/projected.R: changed proj4string, is.projected and gridded back from S4 to S3. 2011-09-13 14:30 edzer * DESCRIPTION, NAMESPACE: removed authors@R field; export subset.SpatialPixels[DataFrame] in NAMESPACE 2011-09-12 13:06 edzer * DESCRIPTION, R/SpatialPointsDataFrame-methods.R: version update; row.names.SpatialPointsDataFrame now returns @data row.names if coordinates do not have row.names specified. 2011-09-11 17:04 edzer * DESCRIPTION, NAMESPACE, R/AAA.R, R/Class-SpatialGridDataFrame.R, R/Spatial-methods.R, R/SpatialGridDataFrame-methods.R, R/gridded.R, R/projected.R: removed .onLoad("methods") in AAA.R; moved proj4string<- (again!) to S4; tried to have fullgrid and fullgrid<- as S4, but failed; added contains="SpatialPointsDataFrame" to SpatialPixelsDataFrame so that the setIs() could be removed (read ?setIs for reasons why); 2011-08-25 11:06 edzer * DESCRIPTION, man/gridlines.Rd: updated Authors@R field in DESCRIPTION; gridlines edits 2011-08-05 08:45 rsbivand * man/Polygon-class.Rd, man/Polygons-class.Rd: clarifying polygon areas 2011-07-25 16:45 edzer * R/SpatialLinesDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R, R/SpatialPolygonsDataFrame-methods.R: match.ID = "name" in constructor functions did not work properly (anymore?). 2011-07-10 13:58 edzer * DESCRIPTION, R/GridTopology-methods.R: updated package date; improved points2grid to handle differences in unique coordinates, VERY close to zero (e.g., along one column, the x coordinates differ very little). 2011-07-09 21:53 edzer * NAMESPACE, R/Spatial-methods.R, R/SpatialGrid-methods.R, R/projected.R: 1. moved proj4string<- from S4 to S3; added an 2. as("SpatialGrid", "SpatialPoints") method. (for some reason, 2 needed 1) 2011-07-08 08:59 rsbivand * inst/ChangeLog: adding side to gridat 2011-07-08 08:59 rsbivand * ChangeLog: adding side to gridat 2011-07-08 08:58 rsbivand * DESCRIPTION, R/gridlines.R, man/gridlines.Rd: adding side to gridat 2011-07-06 13:41 edzer * R/SpatialGrid-methods.R, man/gridlines.Rd: added two (non-exported) functions to figure out neighbourhoods from grid indexes; gridlines now refers to llgridlines in rgdal. 2011-07-05 14:33 edzer * man/gridlines.Rd: added projected LL lines to example section. 2011-07-04 19:11 edzer * R/AAA.R: remove some unnecessary things from AAA.R 2011-06-29 08:25 edzer * R/SpatialGrid-methods.R: reverted previous commit, which did not make sense. 2011-06-29 08:10 edzer * R/SpatialGrid-methods.R: added a _ separator to create IDs from SpatialPixel grid.index values 2011-06-21 19:33 edzer * DESCRIPTION, R/over.R: version bump; no changes to over.R 2011-06-14 20:55 edzer * R/spplot.R: layout (no changes) 2011-06-12 20:22 edzer * man/over.Rd: added some examples to `over' documentation 2011-06-12 20:08 edzer * DESCRIPTION, man/over.Rd, man/overlay.Rd, tests/spplot.Rout.save: updated the rgeos version in Suggest: field; improved over docs; added to overlay that there is now a better (?) overlay in over. 2011-06-10 22:21 rsbivand * ChangeLog, inst/ChangeLog: SPDF sizes sanity check 2011-06-10 22:20 rsbivand * R/SpatialPolygonsDataFrame-methods.R: SPDF sizes sanity check 2011-06-10 22:05 rsbivand * ChangeLog, inst/ChangeLog: sp comment buffer overflow fix 2011-06-10 22:03 rsbivand * DESCRIPTION, inst/include/sp.h, inst/include/sp_xports.c, src/init.c, src/sp.h, src/sp_xports.c: sp comment buffer overflow fix 2011-05-31 12:13 edzer * R/over.R: is.nan -> is.na (causes check error in R c56002) 2011-05-30 20:31 edzer * NAMESPACE, inst/doc/over.Rnw, man/geometry-methods.Rd: removed kmeans from namespace; allow returnList=TRUE option to all over() methods. 2011-05-30 13:06 edzer * R/over.R: added comment 2011-05-30 06:58 edzer * R/over.R, inst/doc/over.Rnw: now allow returnList for all over() methods 2011-05-26 19:09 edzer * inst/doc/over.Rnw: some improvements. 2011-05-25 12:39 edzer * DESCRIPTION, R/SpatialGrid-methods.R, man/point.in.polygon.Rd: added Author@R in DESCRIPTION; removed gstat reference to InPoly() 2011-05-24 10:08 edzer * R/GridTopology-methods.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/gridded.R, man/SpatialGrid.Rd, man/SpatialGridDataFrame.Rd, tests/grid.Rout.save, tests/spplot.Rout.save: see my message at http://lists.r-forge.r-project.org/pipermail/rspatial-devel/2011-May/000001.html restructuring of the behaviour of SpatialPixels and SpatialPixelsDataFrame, and how selection on them works. 2011-05-23 13:48 edzer * man/spplot.Rd: added docs on first item in sp.layout list. 2011-05-11 20:33 edzer * tests/over.Rout.save: added over.R tests results 2011-05-11 20:17 edzer * DESCRIPTION: rgeos version dependence; URL to r-forge. 2011-05-11 12:52 edzer * inst/doc/over.Rnw: completed table 2011-05-11 12:49 edzer * inst/doc/over.Rnw: added example of line overlay over pixels. 2011-05-09 19:59 edzer * DESCRIPTION, R/over.R, inst/doc/over.Rnw: version bump; added rgeos examples to over vignette; added rgeos to suggests field in DESCRIPTION 2011-05-09 13:02 edzer * DESCRIPTION: version bump 2011-05-09 13:02 edzer * R/spsample.R: Ben Graeler's bug fix for clustered sampling 2011-04-13 02:44 edzer * NAMESPACE: removed as.SGDF.SPixDF 2011-04-13 00:40 edzer * DESCRIPTION: date update 2011-04-04 21:03 edzer * NAMESPACE, R/SpatialGridDataFrame-methods.R, R/SpatialPointsDataFrame-methods.R: row.names(x)<- now also changes @data row.names, for SpatialPointsDataFrame (spTransform would complain, otherwise) 2011-03-14 16:23 edzer * DESCRIPTION, R/GridTopology-methods.R, man/gridded-methods.Rd, tests/fail1.Rout.save: version bump; print err2 with 6 signif, man page correction 2011-03-14 08:49 rsbivand * ChangeLog, inst/ChangeLog: TRUE to value in usage in gridded-methods.Rd 2011-03-14 08:48 rsbivand * man/gridded-methods.Rd: TRUE to value in usage in gridded-methods.Rd 2011-03-13 20:10 rsbivand * INDEX: remove INDEX 2011-03-13 20:03 rsbivand * ChangeLog, inst/ChangeLog: hypot for pythag in C code 2011-03-13 20:01 rsbivand * src/gcdist.c: hypot for pythag in C code 2011-03-08 13:40 rsbivand * R/spsample.R, man/spsample.Rd: sample.Polygons index fix - hole heuristic removed - holes must be correctly defined if need be 2011-03-07 20:52 rsbivand * R/spsample.R: sample.Polygons index fix 2011-02-28 20:21 rsbivand * R/SpatialPoints-methods.R: SpatialPoints [ bounding box bug (since 993) 2011-02-28 10:21 edzer * NAMESPACE, R/over.R, inst/doc/over.Rnw: improved aggregate examples in "over" vignette. 2011-02-23 18:41 edzer * DESCRIPTION: version number increase 2011-02-23 18:24 rsbivand * R/CRS-methods.R, man/CRS-class.Rd: adding checks in CRS() and details in help page 2011-02-23 07:08 edzer * man/CRS-class.Rd: updated URL of proj 2011-02-22 20:35 edzer * DESCRIPTION, NAMESPACE, R/GridTopology-methods.R, R/SpatialGrid-methods.R, R/SpatialGridDataFrame-methods.R, R/SpatialPolygons-methods.R, man/SpatialGrid.Rd, man/SpatialGridDataFrame.Rd, man/SpatialPolygons-class.Rd, tests/fail1.R, tests/fail1.Rout.save, tests/grid.Rout.save, tests/spplot.Rout.save: version update; added patch coerce from SpatialPolygons to SpatialPolygonsDataFrame (with dummy data.frame, to allow export to shapefile), removed fuzz.tol argument and code that guessed grid layouts, modified tests accordingly. 2011-02-22 17:55 edzer * man/GridTopology-class.Rd, man/SpatialGrid-class.Rd, man/SpatialPixels-class.Rd, man/SpatialPixelsDataFrame-class.Rd, man/SpatialPoints-class.Rd: removed the ~~~ from doc files 2011-02-22 16:37 rsbivand * ChangeLog, inst/ChangeLog: tidy 2011-02-22 16:24 rsbivand * oChangeLog, svn2cl.xsl: tidy 2011-02-22 16:18 rsbivand * .: tidy 2011-02-15 16:24 edzer * improved readability remove.duplicates. 2011-02-12 12:58 edzer * version bump 2011-02-11 20:14 edzer * changed "overlay" into "over" for selection methods; corrected %over% printing in docs. 2011-01-16 12:55 rsbivand * clarify longlat in spDistsN1.Rd 2010-12-19 12:09 edzer * added example 2010-12-18 16:19 edzer * made over pass R < 2.12 2010-12-18 16:06 edzer * version bump 2010-12-18 16:06 edzer * added length method for Spatial*DataFrame objects 2010-12-18 15:51 edzer * changed max = 255 into maxColorValue = 255, avoiding partial argument matching 2010-12-15 17:10 edzer * patch to r-sig-geo of Dylan Beaudette, 15 dec 2011 2010-12-13 21:09 edzer * removed restriction to non-overlapping polygons from docs. 2010-12-12 21:52 edzer * version update; take aggregate from stats namespace; spatial objects in selections like points[polygon,] now also work for Spatial*DataFrame as selection criterion (taking the geometry of it); removed the returnList=TRUE option for those "over" methods that do not (yet) support it (triggers error). Changed vignette and tests accordingly. 2010-11-29 19:11 edzer * corrected inportFrom into importFrom 2010-11-22 20:47 edzer * small mistakes in code/docs to make sp pass check; 2010-11-22 20:23 edzer * added aggregate method; added coercion from SpatialGrid* to SpatialPolygon*; version bump; added second vignette 2010-11-22 11:38 edzer * added addAttrToGeom method to create a SpatialXxxDataFrame from a SpatialXxx object and a data.frame, with instances for each SpatialXxx. 2010-11-18 21:36 edzer * removed the full matrix need in .invert 2010-11-15 22:53 edzer * modified some of the over and pointInPol functions to catch the case where more than one polygon coves a point (think package cshapes) 2010-11-13 19:43 edzer * forgot to add & commit the docs for the geometry method, mentioned in the previous commit. 2010-11-13 19:37 edzer * match.ID in SpatialXxxDataFrame() now can be character, in which case the corresponding column in the data.frame is used; A generic geometry() converts a SpatialXxxDataFrame into a SpatialXxx. A generic over() provides a better overlay then overlay -- it is consistent in that over(x,y) provides characteristics of y on spatial locations of x -- I didn't modify overlay() as too many instances (including the book) rely on its inconsistency. Selection of objects can now be done by spatial objects: x[y] returns the polygons x covered by points y, or the points x inside polygons y, etc. Related to this: x[x$dist < 30,] would work for SpatialPixelsDataFrame but fail for SpatialGridDataFrame -- it now works; any i-selector (first, with ,) longer than the number of rows selects the cells. Selecting cells means essentially that de-selected cells get assigned NA (!). a names methods for SpatialPolygons was added. 2010-11-08 21:26 edzer * reverted overlay changes back to 0.9-72 state. 2010-11-08 17:27 edzer * added a geometry generic and method, that returns the coercion to a Spatial* object from a Spatial*DataFrame object. 2010-11-08 12:56 edzer * docs pass check 2010-11-08 12:34 edzer * modified (corrected?) overlay methods; see post on r-spatial-devel; added selection with Spatial object to SpatialPolygons objects. 2010-11-06 10:40 edzer * extended "[" method for these classes to allow the first argument that is of class "Spatial"; in that case, the selection will be those items that do not result in an NA when overlaied with the object. for SpatialGridDataFrame, I now allow the first index to be of length nrow(x@data), meaning that cell-by-cell selection takes place instead of row-based. 2010-10-31 13:01 edzer * added ,drop=FALSE to as.image function, for the case of single row or col grids 2010-10-25 18:29 rsbivand * added extra check to points2grid 2010-10-19 10:08 edzer * version update; changed comment 2010-10-15 18:25 edzer * spDists now returns always matrix, also in case of dim 1 x 1 2010-10-11 08:46 edzer * version update; added import(lattice) to decrease R version depency to 2.10.0 2010-10-11 08:37 edzer * version update; gallery update 2010-10-08 15:09 edzer * update sp.layout in spplot of polygons, to work just as with grids. 2010-10-04 18:21 edzer * version update; expanded Suggest: field with rgdal and lattice 2010-09-28 19:29 edzer * corrected help for cuts argument 2010-09-20 14:12 edzer * updated version 2010-09-20 14:12 edzer * updated date 2010-09-20 06:24 rsbivand * test save 2010-09-20 06:24 rsbivand * test save 2010-09-19 19:16 edzer * row.names no longer returns NULL for points and pixels. is.projected, proj4string and proj4string<- are now S4 generics 2010-09-16 20:13 edzer * added row.names methods for SpatialGrid and SpatialGridDataFrame; cleaned up levelplot panel and opan stuff; zerodist was not touched afaics 2010-08-28 14:25 rsbivand * as.double to storage.mode 2010-08-04 13:51 rsbivand * rasterImage SDI detection 2010-08-03 12:13 rsbivand * rasterImage fix for transparency and single unique value rasters 2010-08-02 16:39 rsbivand * rasterImage fix for transparency and single unique value rasters 2010-07-28 22:30 edzer * extended ID documentation; added examples; suggestion Michael Friendly on r-sig-geo 2010-07-19 19:07 rsbivand * including polypath from graphics if available, and panel.levelplot.raster 2010-07-16 14:08 rsbivand * two changes: pointsInPolygons and sample.Polygons hole logic 2010-07-14 14:31 rsbivand * coerce ID to character in Lines 2010-07-12 19:59 rsbivand * tidy 2010-07-07 21:41 edzer * increased version number. 2010-07-07 21:40 edzer * added length() S3 methods 2010-07-07 21:39 edzer * added length() methods for Spatial objects; small improvements to the asWKT printing. 2010-07-07 14:02 mdsumner * more consistent handling of lwd and lty arguments passed to lines() by plotSpatialLines - multiple values for each are now recycled as necessary also added arguments lend, ljoin and lmitre for lines() 2010-07-06 16:06 edzer * changed the col recycling in plot.SpatialLines; suggestion by Michael Sumner on r-spatial-devel mailing list 2010-06-23 12:25 rsbivand * tidy 2010-06-23 11:45 edzer * solved the spplot factor key issue mentioned in https://stat.ethz.ch/pipermail/r-sig-geo/2010-June/008586.html 2010-06-22 06:52 edzer * spplot(meuse, scales = list(x = list(draw = TRUE))) now works. 2010-06-21 07:32 rsbivand * checks in image2Grid 2010-06-12 04:19 rsbivand * warning in spplot for points 2010-06-07 11:06 edzer * removed the setAs("SpatialGrid", "SpatialPoints", ...) coercion, as it breaks csdacm.R of the ASDAR book. 2010-06-05 16:11 rsbivand * r1/2 to x/y in SL bbox 2010-06-05 16:04 rsbivand * r1/2 to x/y in SL bbox 2010-05-27 13:23 edzer * added (optional) printing using WKT encodings; added coercion from SpatialGrid to SpatialPoints. 2010-05-27 12:48 edzer * added x@ in "[.SpatialPointDataFrame", such that coords.nrs get properly reset by column selection 2010-05-17 10:42 rsbivand * use rasterImage where available 2010-05-06 14:19 rsbivand * adding rasterImage support 2010-04-26 10:30 edzer * remove.duplicates now returns the complete object if no duplicates were found; suggested in https://stat.ethz.ch/pipermail/r-sig-geo/2010-April/008121.html. 2010-04-26 08:34 rsbivand * tidy 2010-04-19 06:19 edzer * "[" for SpatialPixelsDataFrame is now copied from SpatialPointsDataFrame; this was needed to get split.data.frame working for SpatialPixelsDataFrame. 2010-04-18 17:35 edzer * allow usin gdrop argument in [, as split.data.frame will pass it. 2010-04-17 21:53 edzer * added split (S4) methods for SpatialXxxDataFrame objects (except SpatialGridDataFrame). Suggested by Michael Sumner, r-sig-geo, Apr 17 2010 2010-04-17 19:38 rsbivand * ringDir bug 2010-04-17 19:11 rsbivand * ringDir bug 2010-04-17 12:39 edzer * set names of arguments to NULL; but report by Clement Calenge 2010-04-16 13:29 edzer * added surfaceArea method, R and C function and docs, contributed by Barry Rowlingson 2010-03-09 07:19 rsbivand * anyDuplicated requires R >= 2.9.1 2010-02-14 20:05 rsbivand * modified instantiation of SpatialPolygonsDataFrame objects 2010-02-13 21:49 edzer * two small typos 2010-02-13 21:44 edzer * description improvements by David Rossiter 2010-02-11 07:21 rsbivand * bug fix for spDistsN1 for 0 latitude, longat=TRUE 2010-02-04 10:53 edzer * added compass rose from Jim Lemon (see r-sig-geo) 2010-02-03 16:02 edzer * added panel.identify link to seealso in spplot doc 2010-02-03 15:32 edzer * spplot.locator gave a bug when a single point was clicked 2010-02-01 15:17 edzer * functions that loads meuse and meuse.grid to the global env, and converts them to the appropriate Spatial* structures. 2010-01-27 20:01 rsbivand * more hole fixing 2010-01-27 19:34 rsbivand * more hole fixing 2010-01-26 19:54 rsbivand * change non-ASCII hyphen in man file 2010-01-26 18:04 rsbivand * hole logic fix; thanks to Javier Munoz for report 2010-01-26 08:36 edzer * corrected bug in spplot for points, when zcol was a numeric array; bug reported by Robert Hijmans. 2010-01-17 16:22 edzer * more middle initials removed from author name 2010-01-17 16:21 edzer * removed middle initial in author name 2010-01-17 16:14 edzer * added Fibonacci sampling on a sphere; see reference in spsample documentation. 2010-01-17 16:08 edzer * added demo script for Fibonacci sampling on the sphere 2010-01-14 13:45 rsbivand * 0/360 longlat GC distance 2010-01-13 21:38 edzer * consequence of earlier typo correction 2010-01-12 12:09 edzer * mostly cosmetic updates. 2010-01-09 10:22 rsbivand * SpatialPolygonsDataFrame [ speedup 2010-01-08 13:38 rsbivand * identical points fix for sp_lengths 2010-01-07 18:08 rsbivand * added centroid protection 2010-01-07 12:08 rsbivand * added centroid protection 2009-12-18 21:53 rsbivand * rbind documentation improvements 2009-12-18 09:34 rsbivand * handling infinite label point for defect polygons 2009-12-17 19:14 rsbivand * adding C API files for *Polygon* classes 2009-12-17 17:40 rsbivand * adding C API files for *Polygon* classes 2009-12-14 08:41 edzer * added test on reversed arguments 2009-12-14 08:31 edzer * spDists test output 2009-12-11 16:30 edzer * version bump 2009-12-11 16:21 edzer * added the spDists function that wraps (for 2D data) spDistsN1, and returns the distance matrix between two sets of coordinates. 2009-12-06 11:01 rsbivand * S4 tidying 2009-12-04 17:44 rsbivand * signature of S4 methods compliance 2009-12-04 17:33 edzer * change to $ and $<- signatures; should not break functionality needed to pass check on R base svn r50609 2009-12-03 12:16 rsbivand * spChFIDs speed-up in R 2009-11-20 09:43 edzer * date update 2009-11-19 20:09 rsbivand * docs linkage problems from maptools 2009-11-19 13:25 edzer * added ... to arguments of coordinates method; request from torleif.lunde@cih.uib.no on r-sig-geo, Nov 19, 2009. 2009-11-05 16:34 edzer * version update; added row.names<- methods for points, lines and polygons; moved all the spChFIDs methods, functions and docs from maptools to sp for this. 2009-11-03 08:29 edzer * added flipHorizontal/flipVertical contributions on r-sig-geo from Michael Sumner 2009-11-03 08:21 edzer * removed more wrong references to SpatialDataFrame 2009-11-03 08:20 edzer * removed reference to SpatialDataFrame 2009-10-22 09:17 rsbivand * allow negative integer selection of SPolDF 2009-09-30 14:46 edzer * added asdar book as citation. 2009-09-24 10:59 rsbivand * bug fix image2Grid 2009-09-22 16:03 rsbivand * adding auto.key to fill.call.groups() 2009-09-17 08:36 rsbivand * fix documentation links 2009-08-24 13:23 edzer * changed project into spTransform and made the example more realistic; removed spproj reference. 2009-08-24 13:13 edzer * updated affiliation Edzer; removed any references to AttributeLists. 2009-07-19 13:23 rsbivand * RD2 2.10.0 tidy 2009-07-19 13:22 rsbivand * RD2 2.10.0 tidy 2009-07-09 21:08 rsbivand * change defunct spproj references to rgdal 2009-07-09 12:03 rsbivand * adding SpatialPoints* to spDistsN1 2009-07-08 10:38 rsbivand * added row.names methods and [ on character 2009-07-08 10:33 rsbivand * added row.names methods and [ on character 2009-07-07 10:02 rsbivand * sample for line objects fixes 2009-07-06 13:48 rsbivand * sample for line objects fixes 2009-07-06 13:45 rsbivand * sample for line objects fixes 2009-07-05 13:35 rsbivand * zero length line issue in spsample 2009-05-28 13:00 edzer * added attr=1 argument to as.image.SpatialGridDataFrame 2009-05-28 06:10 edzer * version update; minor test output changes 2009-05-27 20:39 edzer * change request by BDR, involving named arguments in [.data.frame 2009-04-29 11:39 rsbivand * typos in spDistsN1 messages 2009-04-23 11:07 rsbivand * adding dim for remaining Spatial*DataFrame classes 2009-04-23 10:57 rsbivand * adding dim for remaining Spatial*DataFrame classes 2009-03-31 12:13 rsbivand * overlay points on grid rownames problem 2009-03-05 09:54 edzer * missing bracket 2009-02-26 17:03 rsbivand * spsample and gridded polygons 2009-02-26 16:33 rsbivand * spsample and gridded polygons 2009-02-26 11:59 rsbivand * spsample and gridded polygons 2009-02-20 11:03 edzer * zerodist test includes unique.ID argument 2009-02-20 10:08 edzer * added the unique.ID argument to zerodist 2009-02-19 14:02 edzer * spplot of logical variables did not work 2009-02-19 13:21 edzer * added user interrup checking in outer loop 2009-02-19 13:19 rsbivand * non finite label points 2009-02-19 08:47 edzer * allowed for boolean variables 2009-02-16 09:14 rsbivand * dimension dropping in single cell grids 2009-01-22 15:50 edzer * corrected description of overlay. 2009-01-04 15:01 edzer * version update 2009-01-04 15:01 edzer * 0.9-29 commit, as accepted 2009-01-04 14:26 edzer * corrected typos 2009-01-04 14:06 edzer * docs typos 2009-01-04 13:59 edzer * {z} replaced with \code{z} 2009-01-04 13:58 edzer * removed reference to spproj 2009-01-03 15:02 edzer * version update 2009-01-03 15:01 edzer * examples for factor variables 2009-01-03 14:08 edzer * further checking on length of col.regions when plotting a factor 2009-01-03 13:48 edzer * version update; spplot and stack: better deal with factor dependent variables 2008-12-28 11:12 edzer * SpatialPoints() now preserves rownames of coordinates, if they are present 2008-10-30 15:47 rsbivand * NAMESPACE 2008-10-30 14:23 edzer * removed export(.__C__*) things; they're no longer needed 2008-10-29 22:16 edzer * version update 2008-10-29 22:02 edzer * typo 2008-10-29 21:56 edzer * added coerce.SpatialPixelsDataFrame.SpatialPolygonsDataFrame; version increase 2008-10-27 09:24 edzer * allowed for e.g. proj4string(x)="+proj=longlat" in addition to proj4string(x)=CRS("+proj=longlat") 2008-10-03 07:29 rsbivand * missing bbox in [ for SLDF 2008-10-02 14:59 rsbivand * fill polygons 2008-09-25 10:50 edzer * added comment on factor usage in spplot; updated email address everywhere 2008-09-25 10:26 edzer * removed debug code 2008-09-25 10:14 edzer * fixed bug with multiple panels of factor variables; now derives legend from first panel only. 2008-08-20 12:55 edzer * no change performed. 2008-08-12 20:22 edzer * fill argument is now accepted by sp.polygons, and accepts one color for each polygon. 2008-07-06 18:18 rsbivand * more attempts to handle fuzz in points2grid 2008-07-04 18:29 rsbivand * blocking slack fuzz handling in points2grid 2008-07-04 14:12 edzer * made IDs clash removal in rbind optional, documentation is still lacking 2008-07-03 11:08 edzer * simplified check on unique IDS in SpatialLines and SpatialPolygons constructors; allowed duplicate IDS in rbind methods for these two; corrected argument order in spsample documentation 2008-07-02 10:06 edzer * added "clustered" as sampling strategy (still experimental) 2008-07-01 18:18 rsbivand * release 0.9-26 2008-07-01 17:34 rsbivand * release 0.9-26 2008-05-03 10:29 rsbivand * added fuzz to points2grid 2008-05-02 10:05 rsbivand * fixed rgb() for NAs in image methods 2008-05-02 10:03 rsbivand * fixed rgb() for NAs in image methods 2008-04-08 06:33 edzer * data update 2008-04-06 20:59 edzer * modified overlay for polygons and points, if fn is given; r-sig-geo report by Andrew Hoskins, 04/03/2008 2008-04-03 17:57 rsbivand * col for hatching 2008-03-19 09:16 edzer * email change of maintainer 2008-03-14 16:11 edzer * date 2008-03-14 16:10 edzer * offset to hexGrid sampling 2008-03-14 15:07 edzer * repaired bug in computing dx in hexGrid, found by Don MacQueen 2008-03-07 11:26 edzer * added zerodist2 function, to find common points among two objects 2008-03-07 08:49 rsbivand * CRS 2008-02-19 08:21 rsbivand * tidy empty sections 2008-02-18 20:10 rsbivand * final sample.Spatial and empty help sections 2008-02-17 20:28 rsbivand * spsample polygon 2008-02-17 18:34 rsbivand * spsample polygon 2008-02-17 18:31 rsbivand * spsample polygon 2008-01-29 08:08 rsbivand * SP bbox 2008-01-21 19:14 rsbivand * gridded 2008-01-20 20:39 rsbivand * summary 2008-01-20 20:10 rsbivand * coerce 2007-12-21 13:03 rsbivand * release 2007-12-20 12:06 edzer * overlay doc warning on r-devel; description was missing 2007-12-17 11:56 rsbivand * bbox in p-in-p 2007-11-11 18:17 rsbivand * Spatial 2007-11-11 12:43 edzer * allowing an n x 2 matrix to be passed to sp.text, plotting multiple labels at once. 2007-11-04 20:30 rsbivand * single variable summary 2007-11-03 20:41 rsbivand * tidy 2007-10-31 14:42 rsbivand * thingy to slot 2007-10-15 13:15 edzer * conform the R 2.6.0 changed error message structure 2007-10-09 07:58 rsbivand * docType 2007-10-06 21:46 rsbivand * new() mess in SpatialGrid 2007-06-28 08:23 edzer * Class-SpatialLines.R: removed check that a line needs at least 2 points, otherwise, map2SpatialLines in maptools would need modification; spsample.R: added correct area computation, subtracting holes to get better estimate of sampling density. 2007-06-04 12:45 edzer * added link to r-sig-geo mail for image legend 2007-06-04 12:24 edzer * version update; cbind for SGDF now keeps proj4string (but does not check equality); typo in Rd 2007-06-04 09:47 rsbivand * Changelog 2007-06-04 08:28 rsbivand * image col= 2007-05-31 20:26 rsbivand * proj4string retention in SpatialPixel 2007-05-25 15:46 edzer * xx 2007-05-24 08:13 edzer * matching braces 2007-05-21 14:08 edzer * [ with logical row selection didn't work 2007-05-21 11:31 edzer * remove comment 2007-05-20 19:50 rsbivand * $<- no print 2007-05-16 13:19 edzer * xx 2007-05-16 11:59 edzer * hex stuff 2007-05-16 07:49 edzer * added tests $ $<- [[ [[<- 2007-05-15 20:21 edzer * removed $<- for SpatialPoints and SpatialPixels; inheritance screwed things up 2007-05-14 10:08 edzer * moved several S4 methods, [[, $, [[<-, $<-, summary to top level (Spatial) class; modified docs for that 2007-05-11 10:07 edzer * thinner version of [, many without the constructor function call 2007-05-10 12:21 edzer * same thing.. 2007-05-10 12:04 edzer * [[, [[<-, $ and $<- now use S4 mechanism. 2007-04-26 08:58 edzer * remove coords.nrs in case of column selection 2007-04-13 07:45 edzer * resolve as.numeric.DMS warning for R prerel 2007-04-10 09:09 edzer * xx 2007-04-10 09:03 edzer * xx 2007-04-10 08:54 edzer * small bug 2007-04-10 07:41 edzer * more lines -> SPointsDF coercion; added tests to pass1.R 2007-04-09 21:29 edzer * coerce methods Polygons -> Lines -> Points 2007-04-06 20:19 edzer * as.SpatialLines.SpatialPolygons 2007-04-06 11:16 edzer * better CRS check in rbind; R -> C implementation of zerodist(); 2007-03-20 12:41 edzer * NAs in row index; spplot method setting for points. 2007-03-20 08:42 rsbivand * banning NAs in row indices 2007-03-19 21:10 rsbivand * banning NAs in row indices 2007-03-14 12:18 edzer * version update 2007-03-14 10:51 edzer * xx 2007-03-14 10:00 edzer * docs 2007-03-14 09:22 edzer * line sampling 2007-03-14 00:02 edzer * bugs 2007-03-13 23:44 edzer * spsample along SpatialLines objects 2007-03-13 20:54 edzer * added getSpatialLinesMidPoints and getSpatialPolygonsLabelPoints, both returning a SpatialPoints object with correct CRS; small but in spplot with points, zcol not specified. 2007-03-12 10:50 edzer * name change of Hex stuff (now HexPoints2SpatialPolygons); [ method for SPolDF has match.ID = FALSE; version 2007-03-12 09:43 edzer * pass test 2007-03-12 07:55 edzer * doc typo 2007-03-07 10:33 edzer * contour now better behaves like image 2007-03-07 08:52 edzer * docs update; remove proj4string argument in as.SpatialPolygons.SpatialPixels, as it should inherit from the object passed. 2007-03-06 21:46 edzer * mostly hexagonal sampling & polygons stuff 2007-02-27 20:28 edzer * version, and gridded(x)=TRUE removed the proj4string. 2007-02-16 16:01 edzer * don't use subset in remove.duplicates, it copies coordinates 2007-02-16 09:29 rsbivand * .ll_sanity split out; numeric fuzz permitted 2007-02-12 16:52 edzer * rbind, test and docs 2007-02-12 15:31 edzer * rbind stuff + test 2007-02-12 15:20 edzer * bubble extension; version update 2007-02-10 21:00 edzer * xx 2007-02-10 20:56 edzer * from SGDF to SPixDF is now more efficient, does not recalculate index twice; in spplot I solved the problem with empty rows/col, I believe 2007-02-07 10:25 edzer * solved bug in spplot.points when NA's are present in attributes 2007-02-07 09:24 edzer * version update 2007-02-07 09:24 edzer * zerodist issue 2007-02-01 10:47 rsbivand * \pkg in sp.Rnw 2007-01-22 14:41 edzer * same thing. 2007-01-22 14:39 edzer * fullgrid(x)=F for x SpatialGrid now works using simply as(x,"SpatialGrid"), thanks to Roger's commit 2007-01-22 09:22 rsbivand * Spatial Grid/Pixels: changed new() call in SpatialGrid() to match class declaration 2007-01-21 15:24 edzer * fullgrid(x)=F if x is SpatialGrid now results in correct SpatialPixels. GridTopology now does not add non-existing names. as.character.DMS and as.matrix.* corrections, given warnings on auto checks on CRAN. 2007-01-21 10:49 rsbivand * GE_PNG additions 2007-01-20 21:33 rsbivand * setParUsrBB 2007-01-19 19:43 rsbivand * setParUsrBB hack 2007-01-09 07:49 rsbivand * ChangeLog 2006-12-12 20:51 edzer * added \method{}{} construct; added contour doc 2006-12-12 20:49 edzer * removed transform method 2006-11-30 09:52 edzer * coordnames<- did not set bbox row names, and failed largely for the gridded formats; added methods, modified the bbox issue. 2006-11-30 08:57 rsbivand * tidy CRS print 2006-11-30 08:35 rsbivand * tidy CRS print 2006-11-28 21:01 rsbivand * print formats 2006-11-28 08:31 rsbivand * Imp/exp 2006-10-22 13:17 rsbivand * image & spsample 2006-10-22 13:09 rsbivand * image & spsample 2006-10-17 15:37 edzer * got rid of the as.character hack 2006-10-17 11:00 edzer * names.attr bug 2006-10-07 14:42 rsbivand * as() for as.data.frame() 2006-10-05 07:11 edzer * removed references to require(spproj) and transform; modified manual references where necessary accordingly. 2006-10-05 06:42 edzer * removed transform references 2006-10-04 11:12 edzer * S and S/src empty generated warning; version update corrected manual for layout.north.arrow() and sp.theme() try() response in fail excercises 2006-09-19 08:24 rsbivand * tidying 2006-09-19 07:27 edzer * 2.4.0: removed AttributeList, spplot/lattice compatibility 2006-09-15 08:19 edzer * utils import, for r-devel stack method issue 2006-08-24 13:52 edzer * removed a show; version 2006-08-24 06:55 edzer * version update 2006-08-23 15:57 edzer * check against 2.4.0-devel 2006-08-20 18:41 edzer * email address 2006-08-20 18:38 edzer * solves the lwd and lty issues in spplot() 2006-08-08 18:54 rsbivand * S4 type object.size() update 2006-08-08 17:13 rsbivand * S4 type object.size() failure 2006-07-10 07:12 edzer * nw version, show correction GridTopology 2006-06-26 10:05 edzer * used legend entries as well to determine maximum size 2006-05-22 11:14 edzer * as.data.frame with ... 2006-05-20 21:02 rsbivand * more validity 2006-05-20 19:43 rsbivand * as.data.frame 2006-05-19 10:18 rsbivand * CRS checking against rgdal 2006-04-20 06:50 rsbivand * infinite points 2006-04-10 19:06 rsbivand * bbox default for splancs 2006-03-28 09:16 edzer * version update. 2006-03-15 09:59 edzer * spplot.polygons: data.frame() changed into as.data.frame(), to prevent make.names() being called 2006-02-20 20:35 rsbivand * codetools 2006-02-20 15:56 rsbivand * transform 2006-02-20 15:53 rsbivand * transform 2006-02-17 18:23 rsbivand * trapping empty proj4strings 2006-02-06 12:25 edzer * almost right. 2006-02-06 07:52 edzer * xx 2006-01-30 16:29 edzer * forced coordinates to be(come) double, even if passed as integer 2006-01-29 20:06 edzer * as.data.frame methods for SpatialGrid and SpatialPixels 2006-01-20 19:42 edzer * xx 2006-01-20 19:40 edzer * date update 2006-01-20 19:38 edzer * Kurt's email 2006-01-09 14:47 edzer * allow missing values in spplot of points 2006-01-08 18:32 rsbivand * spdists changed to trap NaN for zero GC distance 2005-12-19 15:32 edzer * version update 2005-12-15 13:32 edzer * locator; grid 2005-12-14 09:59 edzer * names for SGDF added 2005-12-14 09:53 edzer * error message typo 2005-12-12 19:55 rsbivand * polygon things 2005-12-06 10:13 edzer * added emtpy row/col test spplot 2005-11-29 21:04 edzer * added $<- for SpatialGrid and SpatialPixels, promote to *DataFrame muddled with points2grid; deal with empty rows in spplot (add NA values for these row/columns by default--overhead!?) 2005-11-28 08:52 rsbivand * SpatialPixel to polygons 2005-11-23 22:46 edzer * coordinates<- may now yield a SpatialPoints, too 2005-11-23 20:25 edzer * grid related stuff (points2grid; no change really, but better documentation and testing) 2005-11-15 11:35 edzer * data 2005-11-15 11:24 rsbivand * DMS stuff 2005-11-15 11:10 edzer * sampling of 3 or higher dimensional grids; [ with drop=FALSE keeps parent grid topology 2005-11-10 17:45 rsbivand * older things 2005-10-24 16:46 rsbivand * plot bg= argument 2005-10-19 21:11 rsbivand * degrees over 180 2005-10-14 18:08 rsbivand * ring direction fix 2005-10-13 10:09 edzer * set back version to 0.8-4; gcdist unchanged 2005-10-12 12:21 edzer * [ for SPol and SpLines now passes CRS 2005-10-11 19:24 rsbivand * longlat scale in spDistsN1.Rd 2005-10-11 16:04 edzer * plotting aspect defaults for unprojected objects 2005-10-10 17:03 edzer * spplot.locator 2005-10-09 20:36 edzer * for lines, plot sp.layout elements before lines are drawn. 2005-10-06 21:42 edzer * lab -> labels in gridat() and text.SPDF cleaned up ll validity check in Spatial 2005-10-06 19:15 rsbivand * fixing geographical CRS 2005-10-05 21:30 edzer * degreeLabelsNS/EW to replace duplicate code to generate degree labels; text method for things that come out of gridat() gridat documentation bug; 2005-10-04 11:56 rsbivand * gridat 2005-10-03 21:41 edzer * 0*degree bug in spplot 2005-10-03 16:58 rsbivand * gridat 2005-10-03 08:09 edzer * error message changed in 2.2.0 2005-09-23 20:26 rsbivand * more sample.Polygon 2005-09-23 19:39 rsbivand * more sample.Polygon 2005-09-22 10:33 edzer * removed ppp 2005-09-22 10:32 edzer * moved ppp stuff to spspatstat interface package 2005-09-22 09:02 rsbivand * spdists 2005-09-14 20:36 edzer * coerce from ppp to SpatialGridDataFrame (the mask window) 2005-09-14 14:29 edzer * added coercion to SpatialPoints[DataFrame] from ppp (spatstat) objects; spplot: removed named first argument to xyplot and levelplot (was "formula", is now "x") 2005-09-14 10:28 edzer * changed error message 2005-09-14 10:20 edzer * clean up of code; Michael's image bug report; bubble plot now correct in pass1.R 2005-09-13 14:38 rsbivand * lots of holes 2005-09-13 12:55 rsbivand * lots of holes 2005-09-12 13:02 edzer * merged some manual pages. 2005-09-12 08:15 rsbivand * SpatialPointsDataFrame CRS(as.character(NA)) 2005-09-11 21:07 edzer * add = FALSE default argument; add = TRUE now works again 2005-09-11 20:18 edzer * request from Deepayan Sarkar--panel.counter -> panel.number 2005-09-10 19:55 rsbivand * hole fixed in pip 2005-09-10 18:01 rsbivand * hole fixed in pip 2005-09-09 10:00 edzer * Rings -> Polygons variable name changes 2005-09-09 08:33 edzer * function to draw SN and EW lines in a box 2005-09-08 20:20 rsbivand * fixing point in polygon and spsample for small n 2005-09-07 12:24 edzer * lines starting with #S will now be visible for S-Plus 2005-09-07 12:12 edzer * S-Plus compatibility modifications 2005-09-07 09:48 edzer * latlong -> longlat in gallery; removed debug print() statements in degAxis(); upgraded version 2005-09-06 11:21 edzer * sp.polygon -> sp.polygons 2005-09-06 07:06 rsbivand * Kurt's remarks 2005-09-06 06:58 rsbivand * Kurt's remarks 2005-09-06 06:52 rsbivand * Kurt's remarks 2005-09-05 13:05 edzer * drop! 2005-09-05 11:42 edzer * plot things. 2005-09-05 08:44 edzer * read_ShapeXxx -> readShapeXxx 2005-09-05 07:49 edzer * latlong -> longlat 2005-09-05 07:47 edzer * added CRS-methods.R 2005-09-05 07:44 edzer * plot.Spatial now uses is.projected(); split CRS class and method file 2005-09-03 16:19 rsbivand * added ... to degAxis() 2005-09-03 09:40 rsbivand * setting drop=TRUE in [ methods 2005-09-03 08:57 rsbivand * latlong to longlat 2005-09-02 12:56 edzer * nothing 2005-09-02 11:13 edzer * more setMethod issues for plot and show 2005-09-02 10:00 edzer * removed require(grid)/require(lattice) commands; added is.R() if it's not present (S-Plus) added ncol/nrow methods for S-Plus AttributeList changed plot.new() into frame() for S-Plus compat. removed nc.test contents (nc is now in maptools) added y argument to some plot methods--they should be there, according to the generic! 2005-09-02 08:55 rsbivand * drop SpatialPoints and *gallery/maptools* 2005-09-01 12:32 rsbivand * removing shps etc. 2005-09-01 12:23 edzer * updated some prototypes() to pass import (source()) in S-Plus 6.2.1; no further checks done 2005-09-01 08:11 edzer * axes in bubble; xlab/ylab in spplot 2005-09-01 08:10 edzer * names 2005-08-30 18:19 rsbivand * RGB image for grid 2005-08-30 13:13 rsbivand * subsetting SpatialPolygons 2005-08-30 11:37 edzer * changed references to rings into polygons. 2005-08-30 11:05 edzer * [ method now accepts length-one TRUE 2005-08-30 09:40 edzer * clean up 2005-08-30 09:40 rsbivand * drop=FALSE in SPointsDF 2005-08-30 08:33 edzer * plot and summary from S3 -> S4; cleaned up 2005-08-26 18:23 rsbivand * more Polygons 2005-08-26 14:51 edzer * factor plotting in spplot for grids&polygons 2005-08-26 14:41 rsbivand * more Polygons 2005-08-25 21:44 edzer * map.to.lev is no spmap.to.lev degrees N/S/E/W axes if proj4string() contains latlong 2005-08-25 15:08 rsbivand * changing vector class names 2005-08-25 14:32 rsbivand * changing vector class names 2005-08-24 20:38 edzer * default plotting without axes for all classes; all now start with plot.new() which makes it impossible to pass xlab/ylab. scale bar/north arrow now work for traditional graphics as well. Updated tests. 2005-08-20 22:55 edzer * bug. 2005-08-19 20:05 edzer * bug fix--sampling of line with only 2 points. 2005-08-19 15:31 edzer * methods to get the AttributeList, or its component without slot access spplot with grids as background 2005-08-17 12:45 rsbivand * added as.SpatialRings.GridTopology 2005-08-17 12:34 rsbivand * added as.SpatialRings.GridTopology 2005-06-23 07:57 edzer * version update 2005-06-18 19:11 rsbivand * rest of 0.7-10 2005-06-17 11:50 edzer * allow factors to be set in AttributeList; probibit vectors of mode raw or list 2005-06-17 11:35 edzer * these changes are already in sp 0.7-9 on CRAN; removed all double quotes from \alias and \link entries. 2005-06-16 17:15 rsbivand * small SpatialLines fix 2005-06-15 19:20 edzer * removed " in \alias of Rd files 2005-06-14 10:22 edzer * spplot: polygons behind grid; order of panels now that specified; first = TRUE argument optional to plot polygons over grids. SGDF: corrected bug if attribute was factor (now ffreq in meuse.grid is); stack: order of levels changed, not alphabetical anymore; 2005-06-08 14:02 rsbivand * pre 0.7-8 2005-05-28 20:03 rsbivand * most of 0.7-8 2005-05-27 10:49 edzer * formula argument added to spplot methods 2005-05-25 15:09 edzer * attempted to save memory when going from SPixDF to SGDF 2005-05-25 08:40 edzer * added names, names<-, coordnames and coordnames<- methods to all classes; replaced coordinates<- with the S4 mechanism (setReplaceMethod). 2005-05-22 21:39 edzer * needed. 2005-05-22 21:38 edzer * added names and names<- to all *DataFrame classes, now operating on all *DataFrame classes (only on the data slot). 2005-05-21 18:47 rsbivand * ID checks for Srings etc 2005-05-20 23:38 edzer * ID checking for SpatialPointsDataFrame; rownames removal for SpatialPoints; tests/fail stuff. 2005-05-20 13:57 edzer * version upgrade 2005-05-20 11:19 edzer * The Valencia session: changed the data slot in SpatialPixelDataFrame, SpatialGridDataFrame and SpatialPointsDataFrame from class data.frame to class AttributeList, thereby removing the row.names issue (which costed too much time and memory). 2005-05-12 20:53 edzer * michael's edits 2005-05-11 08:40 edzer * version up; spsample/overlay methods for SpatialPixels* 2005-05-10 12:11 edzer * bug in overlay if single column were selected (added drop=FALSE) 2005-05-03 20:31 rsbivand * nowrapSpatialLines 2005-05-02 11:24 rsbivand * adding recenter method 2005-04-30 14:12 rsbivand * hole in vignette 2005-04-28 20:35 rsbivand * cleaning details 2005-04-28 09:26 edzer * removed second URL 2005-04-28 08:52 edzer * version update; URL added 2005-04-28 08:46 edzer * wrong URL 2005-04-27 15:02 edzer * cbind.SpatialGridDataFrame 2005-04-27 14:02 rsbivand * added arguments to asciigrid 2005-04-27 12:27 rsbivand * splitting out GDAL 2005-04-27 11:03 edzer * removed S-plus related stuff 2005-04-27 11:00 edzer * moved to S-Plus area 2005-04-27 10:43 rsbivand * removed commented-out Rings code 2005-04-27 10:35 rsbivand * removed commented-out Rings code 2005-04-26 19:48 rsbivand * check holes 2005-04-22 15:26 edzer * .. 2005-04-22 15:23 edzer * $ and $<- stuff 2005-04-22 11:36 edzer * spplot method for SpatialPixelsDataFrame, and a new one for SpatialGridDataFrame 2005-04-22 06:28 edzer * cleaned up some if (drop == TRUE) stuff 2005-04-20 16:04 edzer * Splitted SpatialGrid* into SpatialPixels* and SpatialGrid* for pixels vs full grids 2005-04-18 12:45 edzer * bug noted by Tom Short in [.SpatialLines 2005-04-18 07:34 edzer * SaveImage: yes does what install.R first did the recommended way (TM) 2005-04-18 07:33 edzer * SaveImage: yes now in DESCRIPTION; methods loaded by default 2005-04-13 09:34 edzer * version update spsample for SpatialRings containing multiple Srings spsample docs update 2.1.0-beta tests output 2005-04-12 20:53 edzer * xx 2005-04-08 21:41 edzer * panel stuff 2005-04-08 20:57 edzer * added gallery demo; spplot panel stuff 2005-04-08 14:48 edzer * holes. 2005-04-08 07:34 edzer * more variables in meuse.grid; some work on vignette 2005-04-07 08:14 rsbivand * merging older changes 2005-04-06 11:19 edzer * unaligned -> nonaligned 2005-04-06 09:47 edzer * spsample and overlay now work on grids; added areaSpatialGrid and SlineLength function (1st doc'd, 2nd not) email change in Rd files 2005-04-05 09:46 edzer * spsample method 2005-04-02 21:51 edzer * made spplot a generic 2005-04-01 14:15 edzer * xx 2005-03-30 09:56 edzer * first attempt for an "overlay" method. 2005-03-29 20:02 edzer * Points and grids can now have more than 3 spatial dimensions, although the plotting methods are not of much use for them. 2005-03-25 16:35 edzer * sp.layout stuff 2005-03-23 21:40 edzer * added meuse river fragment 2005-03-23 21:00 edzer * comments 2005-03-22 15:22 edzer * back in. 2005-03-22 15:14 edzer * cosmetic changes 2005-03-22 10:35 edzer * getting the transform generic right...? 2005-03-22 08:10 rsbivand * removed transform-method 2005-03-21 17:24 edzer * error-version to catch transform attempts if spproj is not available 2005-03-21 16:38 edzer * transform method; rings docs 2005-03-21 11:04 edzer * plotting order in subset [ 2005-03-21 10:02 edzer * xx 2005-03-21 09:33 edzer * now all in spplot 2005-03-21 09:32 edzer * docs clean-ups 2005-03-21 08:20 edzer * cleaned up cplot/gridplot/lplot; vignette, docs; "[" now works for lines and rings incl *DataFrame stuff. 2005-03-20 21:52 edzer * added rings() and rings<- ; cleaned up \email{} in .Rd's, removed cplot (now spplot); removed arcs generic. 2005-03-18 16:30 rsbivand * proj4string as.character() 2005-03-17 21:30 rsbivand * extended Shapes import 2005-03-17 09:04 rsbivand * small fixes for spproj 2005-03-16 21:10 rsbivand * more SRings 2005-03-16 18:31 rsbivand * more SRings 2005-03-16 15:49 rsbivand * more SRings 2005-03-16 14:11 rsbivand * more SRings 2005-03-16 13:29 edzer * ... 2005-03-15 20:58 rsbivand * not very much on Rings 2005-03-15 10:06 edzer * gallery works again 2005-03-12 15:26 edzer * spplot for SpatialLinesDataFrame's 2005-03-11 21:54 edzer * the manual page (under constr.). 2005-03-11 21:51 edzer * mainly spplot stuff 2005-03-10 20:02 edzer * dev... 2005-03-10 13:27 edzer * spplot dev 2005-03-09 16:48 edzer * ... 2005-03-09 10:10 edzer * data -> Rlogo 2005-03-09 10:10 edzer * made R CMD check work again; Rlogo: renamed data to Rlogo 2005-03-08 22:32 edzer * x 2005-03-08 22:23 edzer * map marks: north arrow, scale bar 2005-03-08 22:20 edzer * spplot() function; first attempt 2005-03-04 20:42 edzer * added [ [[ [[<- and as.data.frame() methods; many \alias{}'s added to docs 2005-03-04 17:52 rsbivand * pO = 1:length(Srl) 2005-03-04 09:14 edzer * added points() and lines() methods to xPointsXx and xLinesXx classes 2005-03-03 20:44 rsbivand * changed example for read.gdal 2005-03-03 18:45 rsbivand * document lines examples 2005-03-03 13:24 edzer * removed makefile 2005-03-03 10:21 rsbivand * sorted out Slines examples 2005-03-02 11:04 edzer * clean up; added docs; 2005-03-01 23:08 edzer * ... all preliminary versions of course... 2005-03-01 23:07 edzer * documentation of some classes and methods; replaced some obsolete stuff like getSlineCoordsSlot() with coordinates(), bbox.R4 with bbox() added Slines class; now parallel with Sring/Srings stuff. Updated all test output; summary now starts with the class name. 2005-03-01 20:58 edzer * ... 2005-02-28 22:30 edzer * wip 2005-02-28 14:24 edzer * maintainance; vignette stuff 2005-02-28 09:13 edzer * vignette; grid maintainance 2005-02-25 16:30 edzer * vignette stuff 2005-02-25 08:44 edzer * return() 2005-02-24 23:28 edzer * xx 2005-02-24 18:13 edzer * xx 2005-02-24 18:06 edzer * nothing special 2005-02-24 17:58 edzer * sp vignette; work in progress. 2005-02-22 15:46 edzer * ... 2005-01-26 15:43 edzer * added importFrom() in NAMESPACE, and Imports: to DESCRIPTION, and removed the require(lattice) stuff. 2005-01-25 20:29 edzer * forgot this one. 2005-01-25 20:27 edzer * making R CMD check work again 2005-01-23 21:09 edzer * lplot update -- functions are now gridplot and ringplot 2005-01-21 15:33 edzer * work on lplot; now called gridplot and ringplot (names to be changed) 2005-01-19 16:36 edzer * fixed identify in lattice points plot 2005-01-19 16:03 edzer * new file; moved stuff from Class-Spatial.R 2005-01-19 16:02 edzer * more on the generics as(x, "yy") stuff 2005-01-19 15:01 edzer * uncommented .noGenerics = TRUE in AAA.R; restored a couple of (now working) setAs and setMethod things. Somehow, I still cannot get setMethod("[[",...) working. 2005-01-17 12:50 edzer * more change 2005-01-13 09:39 edzer * moving Spatial[Gridded|Cell] into new SpatialGrid[DataFrame], removed a lot of setAs/setIs troubles in Points/Grids; extended grid tests. 2005-01-13 09:37 edzer * moved Spatial[Cell/Gridded] stuff into a single class, SpatialGrid and SpatialGridDataFrame added GridTopology class, which holds grid topology (offset, dim, cellsize) 2005-01-07 00:42 edzer * three layer raster rgdal read now works; more setIs/setAs mess and coercion from SPDF to data.frame if coords are not in the data.frame (as when coming from a SpatialGriddedDataFrame). 2005-01-06 19:41 rsbivand * chane in NAMESPACE for spproj 2005-01-06 19:16 edzer * messing with setAs's... 2005-01-06 18:14 edzer * added read.gdal stuff 2005-01-06 15:25 edzer * 00sp.Rd is meant as an introductory text. 2005-01-06 15:24 edzer * changed missing value to -1; added 3 x 4 simple asciigrid map 2005-01-06 15:22 edzer * mostly work on gridded stuff; nothing on Rings. 2005-01-05 19:55 rsbivand * Spatial Lines/Rings redone 2004-12-24 08:47 edzer * checks on coordinates needing to be numeric; this will stop coordinates(meuse) to work when meuse is a data.frame. 2004-12-24 08:01 edzer * error on coordinates() with non-numeric elements (data.frame, matrix, list) 2004-12-17 20:33 edzer * large file split 2004-12-17 11:02 edzer * SpatialGridded[DataFrame], mainly, and coercion, [, [[, [[<-, image, tests, etc. 2004-12-15 21:47 rsbivand * adding line data 2004-12-15 14:57 rsbivand * SpatialLines 2004-12-14 22:01 edzer * further clean up; [.SpatialCellDataFrame 2004-12-14 20:07 edzer * implemented the Gridded (full grids); cleaning up double stuff 2004-12-02 06:39 rsbivand * uncommenting .__C__* 2004-12-01 21:54 edzer * reverted back the .__C__* stuff 2004-12-01 20:37 edzer * as(SP, "matrix") and as.matrix(SP) now work. 2004-12-01 13:46 edzer * cleaned up NAMESPACE; tried on SP, as(x, "matrix") but gave up 2004-12-01 12:44 edzer * export S3method as.data.frame.SpatialPointsDataFrame; went back to the old versions where S3 calls S4, and coordinates get back in place 2004-11-30 21:09 rsbivand * getting as() working 2004-11-26 15:37 rsbivand * resolved subset.matrix and fail1 2004-11-26 09:35 rsbivand * revised tests/*.Rout.save 2004-11-26 08:47 rsbivand * more NAMESPACE and R_init_sp 2004-11-24 17:22 rsbivand * adding NAMESPACE 2004-11-23 19:44 rsbivand * before NAMESPACE 2004-11-23 10:35 edzer * got rid of R CMD check "coordinates<-" message; added SpatialLines (mostly empty); 2004-11-10 21:39 edzer * allow plotting of factor attribute columns 2004-11-10 15:58 edzer * doc err 2004-11-10 15:57 edzer * xx 2004-11-10 15:56 edzer * cplot addition 2004-11-10 15:55 edzer * docs check 2004-11-10 11:01 edzer * put old stuff in. 2004-11-09 20:45 edzer * more stuff 2004-11-09 20:37 edzer * added plotting utils; worked on SpatialPoint + deriv classes 2004-11-08 21:52 edzer * coordinates are now merged in place. 2004-11-06 19:51 edzer * added stripping of coordinates from data.frame in SpatialPointsDataFrame, when set by e.g. > coordinates(x) <- c("x", "y") when coerced back to data.frame, coordinates are glued back to the data (although perhaps in a different position -- they're first then) 2004-11-05 20:02 edzer * plot stuff 2004-11-05 19:24 rsbivand * first commit of SRDF 2004-11-05 19:20 edzer * to.image stuff for Cell 2004-11-05 19:17 rsbivand * first commit of SRDF 2004-11-05 18:54 edzer * tests stuff... 2004-11-05 17:12 rsbivand * Rings display methods 2004-11-05 16:47 edzer * xx 2004-11-05 16:47 edzer * tests still fail... 2004-11-05 16:38 edzer * update 2004-11-05 16:30 edzer * sp 0.6 is an almost complete rewrite 2004-11-05 16:14 edzer * sp 0.6 is an almost complete rewrite. 2004-11-05 10:25 edzer * version update 2004-11-01 12:33 edzer * Class-SpatialData.q: an attempt for "[[" and "[[<-", which does not work (outcommented); others: use "iso" for map aspect in trellis plots 2004-10-07 21:14 edzer * 2.0.0 compat stuff 2004-09-28 18:46 rsbivand * density in .polygon() 2004-09-28 12:52 edzer * expand argument 2004-09-28 12:36 edzer * lplot port to R 2.0.0; fail1.R/fail1.Rout.save update to R 2.0.0 2004-09-25 18:24 rsbivand * end of sept 2004-09-24 22:38 edzer * made panel.lplot local, to avoid having to document the beast... 2004-09-24 22:33 edzer * lplot + panel function stuff; added lplot example to S...class.Rd 2004-09-24 22:25 edzer * added plotting of SpatialDataFramePolygons with lplot (+ panel.lplot function) 2004-09-15 08:30 edzer * changes made at Philly airport; trying to make lplot work; coordinates(x, "names") etc 2004-06-29 12:14 rsbivand * file names 2.0.0 2004-06-18 20:28 rsbivand * backoff on ring directions 2004-06-18 14:59 rsbivand * backing out of too brave ring direction assumption 2004-06-08 10:16 rsbivand * allow P4 without pO 2004-06-08 10:07 rsbivand * allow P4 without pO 2004-06-03 14:46 edzer * Guys, sp still works under R 1.8. As do I. 2004-06-01 19:08 rsbivand * more work on insiders using Barry's p-in-p idea 2004-05-26 07:13 edzer * plotting of SpatialDataFrameGrid returned par() settings; now invisible 2004-05-24 12:18 edzer * S-Plus compatibility issues 2004-05-19 06:56 rsbivand * added mild ring direction checking to Map2Poly4 2004-05-14 14:17 edzer * polygon S-Plus portability issues 2004-05-14 09:27 edzer * S-Plus compatibility issues. 2004-05-14 07:44 rsbivand * holepolys example 2004-05-13 18:25 rsbivand * added plot order and ring-direction to Polygon4/Polylist4 2004-05-13 15:25 edzer * this file is generated from S/src/pip.c, and should be modified there 2004-05-13 15:22 edzer * removed all files in sp/R: they are created automatically from the .q sources in sp/S by typing `make' in the sp directory. This was necessary to create a single S-Plus/R source. Removing them hopefully decreases the chances of changes to .R files, being overwritten. 2004-05-13 10:24 edzer * map2Poly4; tests out files 2004-05-11 19:40 edzer * ported tests to S-Plus; see makefile 2004-05-11 19:38 edzer * wip 2004-05-11 19:32 edzer * wip 2004-05-11 07:27 edzer * see CHANGES 2004-04-22 13:29 edzer * I messed up the "[" on SDFGrids; works again, I hope! 2004-04-21 19:50 edzer * time for 0.5-0. 2004-04-21 19:48 edzer * further S-Plus portability issues, like grep(), par("col")/par("fg") 2004-04-21 13:16 edzer * moved main sorce from R (R-code) to S (single code for R and S-Plus); this requires a single make in the sp directory to create the R sources from S. So, no longer modifying in the R directory; use the S (*.q) code instead!! `make' also creates .Rbuildignore, with all the files that an R build should ignore. 2004-04-21 13:09 edzer * S-Plus portability scripts 2004-04-21 06:19 rsbivand * fix plot for SDFPolygons 2004-04-20 20:55 edzer * uniforming file name extensions 2004-04-17 22:15 edzer * max argument in plot.SpatialDataFrame -- for S-Plus, R doesn't like it 2004-04-17 21:57 edzer * mostly S-Plus compatability issues. 2004-04-17 21:56 edzer * xx 2004-04-17 21:43 edzer * set back required version to 1.8 -- should be as low as possible? 2004-04-16 07:24 rsbivand * add coerse for SDFPolygons 2004-04-08 19:53 edzer * test asciigrid file. Ahumm, ... not generated by ArcGrid. 2004-04-08 12:58 rsbivand * cleaned SpatialDataFramePolygons 2004-04-08 12:48 rsbivand * cleaning SpatialDataFramePolygons 2004-04-07 14:22 edzer * still need do do examples 2004-04-07 11:40 rsbivand * added SpatialDataFramePolygons 2004-04-07 09:07 rsbivand * added SpatialDataFramePolygons 2004-04-05 20:52 edzer * work in progress. 2004-04-02 18:25 rsbivand * switched data back to ASCII 2004-04-02 12:29 edzer * S-Plus portability issues 2004-03-31 14:40 edzer * minor mods 2004-03-29 15:18 edzer * extensions to SDFGrid, see gridparameters() function 2004-03-27 19:53 rsbivand * INDEX update 2004-03-20 05:11 rsbivand * upload sp without proj 2004-03-20 05:02 rsbivand * upload sp without proj 2004-03-14 20:16 edzer * cosmetic. 2004-03-14 19:58 edzer * Initial revision 1999-12-15 10:41 * New repository initialized by cvs2svn. sp/man/0000755000175100001440000000000012321302443011457 5ustar hornikuserssp/man/SpatialPixels-class.Rd0000644000175100001440000000422112114176720015641 0ustar hornikusers\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{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) } \keyword{classes} sp/man/disaggregate.Rd0000644000175100001440000000313712166747447014430 0ustar hornikusers\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 } \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))) 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") sp = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) length(sp) length(disaggregate(sp)) l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") sl = SpatialLines(list(S1,S2)) length(sl) length(disaggregate(sl)) } \keyword{methods} sp/man/sp-deprecated.Rd0000644000175100001440000000354412120055347014501 0ustar hornikusers\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: overlay, getSpP*, getPolygon*, getLines* getSL* } \usage{ overlay(x, y, ...) } \arguments{ \item{x}{first layer} \item{y}{second layer, put on top of x} \item{...}{ optional arguments; see example below } } \value{ a numerical array of indices of \code{x} on locations of \code{y}, or a data.frame with (possibly aggregate) properties of \code{x} in units of \code{y}. (Note that overlay is highly inconsistent, hence its deprecation) } \note{ For \code{overlay} the new implementation is found in the \link{over} method, and works somewhat different (because consistent). } \keyword{manip} sp/man/SpatialGrid-class.Rd0000644000175100001440000000355111716241462015272 0ustar hornikusers\name{SpatialGrid-class} \docType{class} \alias{SpatialGrid-class} \alias{[,SpatialGrid-method} \alias{print.summary.SpatialGrid} \alias{as.data.frame.SpatialGrid} \alias{summary,SpatialGrid-method} \alias{coerce,SpatialGrid,data.frame-method} \alias{coerce,SpatialGrid,SpatialPixels-method} \alias{coerce,SpatialGrid,SpatialPoints-method} \alias{coerce,SpatialGrid,SpatialPolygons-method} \alias{show,SpatialGrid-method} \alias{plot,SpatialGrid,missing-method} \alias{coordnames,SpatialGrid-method} \title{Class "SpatialGrid" } \description{ class for defining a full, rectangular grid of arbitrary dimension } \section{Objects from the Class}{ Objects are created by using e.g. SpatialGrid(grid) with grid of class \link{GridTopology-class} } \section{Slots}{ \describe{ \item{\code{grid}}{ object of class \link{GridTopology-class}, defining the grid topology (offset, cellsize, dim) } \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box } \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection } } } \section{Extends}{ Class \code{"SpatialPoints"} directly; Class \code{"Spatial"}, by class \code{"SpatialPoints"}. } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(x = "SpatialGrid")}: calculates coordinates for each point on the grid; coordinates are not stored in objects of class SpatialGrid} \item{summary}{\code{signature(object = "SpatialGrid")}: summarize object} \item{plot}{\code{signature(x = "SpatialGrid")}: plots cell centers } \item{"["}{\code{signature(x = "SpatialGrid")}: select rows and columns } } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialGridDataFrame-class}}, \code{\link{SpatialGrid}} } \examples{ x = GridTopology(c(0,0), c(1,1), c(5,5)) class(x) x summary(x) coordinates(x) y = SpatialGrid(grid = x) class(y) y } \keyword{classes} sp/man/bubble.Rd0000644000175100001440000000515311635334430013215 0ustar hornikusers\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(2,3), 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) } \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. } \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}} } \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/nowrapSpatialLines.Rd0000644000175100001440000000230512162333243015572 0ustar hornikusers\name{nowrapSpatialLines} \alias{nowrapSpatialLines} %- Also NEED an '\alias' for EACH other topic documented here. \title{Split SpatialLines components at offset} \description{ When recentering a world map, most often from the "Atlantic" view with longitudes with range -180 to 180, to the "pacific" view with longitudes with range 0 to 360, lines crossing the offset (0 for this conversion) get stretched horizonally. This function breaks Line objects at the offset (usually Greenwich), inserting a very small gap, and reassembling the Line objects created as Lines. A similar function for polygons is found in the \pkg{spgpc} package. } \usage{ nowrapSpatialLines(obj, offset = 0, eps = rep(.Machine$double.eps, 2)) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{obj}{A Spatial Lines object} \item{offset}{default 0, untried for other values} \item{eps}{vector of two fuzz values, both default double.eps} } \value{ A Spatial Lines object } \author{Roger Bivand} \examples{ Sl <- SpatialLines(list(Lines(list(Line(cbind(sin(seq(-4,4,0.4)), seq(1,21,1)))), "1")), proj4string=CRS("+proj=longlat")) summary(Sl) nwSL <- nowrapSpatialLines(Sl) summary(nwSL) } \keyword{spatial} sp/man/SpatialGridDataFrame.Rd0000644000175100001440000000351411635334430015731 0ustar hornikusers\name{SpatialPixelsDataFrame} \alias{SpatialPixelsDataFrame} \alias{SpatialGridDataFrame} \title{ define spatial grid with attribute data } \description{ defines spatial grid by offset, cell size and dimensions } \usage{ SpatialPixelsDataFrame(points, data, tolerance = sqrt(.Machine$double.eps), proj4string = CRS(as.character(NA)), round = NULL, grid = NULL) SpatialGridDataFrame(grid, data, proj4string = CRS(as.character(NA))) } \arguments{ \item{points}{ coordinates, either as numeric matrix or as object of class \link{SpatialPoints-class} } \item{grid}{ grid topology; object of class \link{GridTopology-class}; for calls to \code{SpatialPixelsDataFrame} a value of NULL implies that this will be derived from the point coordinates } \item{data}{ data.frame; contains the attribute (actual grid) data } \item{tolerance}{ precision up to which extent points should be exactly on a grid } \item{round}{default NULL, otherwise a value passed to as the digits argument to \code{round} for setting cell size} \item{proj4string}{object of class \link{CRS-class} in the first form only used when \code{points} does not inherit from \link{Spatial-class}} } \value{ SpatialPixelsDataFrame returns an object of class \link{SpatialPixelsDataFrame-class}; SpatialGridDataFrame returns an object of class \link{SpatialGridDataFrame-class}. } \note{ SpatialPixels stores grid topology and coordinates of the actual points, which may be in the form of a subset (set of pixels) of a full grid. To find out or change this, see \link{fullgrid} and \link{SpatialGrid-class}. } \author{ Edzer Pebesma } \seealso{ \link{gridded}, \link{gridded<-}, \link{SpatialGrid}, \link{SpatialGrid-class} } \examples{ data(meuse.grid) m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data = meuse.grid) class(m) summary(m) } \keyword{spatial} sp/man/compassRose.Rd0000644000175100001440000000132511635334430014255 0ustar hornikusers\name{compassRose} \alias{compassRose} \title{Display a compass rose.} \description{Displays a basic compass rose, usually to orient a map.} \usage{ compassRose(x,y,rot=0,cex=1) } \arguments{ \item{x,y}{The position of the center of the compass rose in user units.} \item{rot}{Rotation for the compass rose in degrees. See Details.} \item{cex}{The character expansion to use in the display.} } \details{ \samp{compassRose} displays a conventional compass rose at the position requested. The size of the compass rose is determined by the character expansion, as the central "rose" is calculated relative to the character size. Rotation is in degrees counterclockwise. } \value{nil} \author{Jim Lemon} \keyword{misc} sp/man/select.spatial.Rd0000644000175100001440000000237111635334430014674 0ustar hornikusers\name{select.spatial} \alias{select.spatial} \title{ select points spatially } \description{ select a number of points by digitizing the area they fall in } \usage{ select.spatial(data, digitize = TRUE, pch = "+", rownames = FALSE) } \arguments{ \item{data}{data object of class, or extending \code{SpatialPoints}; this object knows about its x and y coordinate } \item{digitize}{ logical; if TRUE, points in a digitized polygon are selected; if FALSE, points identified by mouse clicks are selected } \item{pch}{plotting character used for points} \item{rownames}{logical; if FALSE, row (coordinate) numbers are returned; if TRUE and data contains a data.frame part, row.names for selected points in the data.frame are returned. } } \value{ if rownames == FALSE, array with either indexes (row numbers) of points inside the digitized polygon; if rownames == TRUE, character array with corresponding row names in the data.frame part } \seealso{\link{point.in.polygon}, \link{locator}, \link{SpatialPoints-class}, \link{SpatialPointsDataFrame-class} } \examples{ data(meuse) ## the following command requires user interaction: left mouse ## selects points, right mouse ends digitizing data(meuse) coordinates(meuse) = c("x", "y") # select.spatial(meuse) } \keyword{models} sp/man/Polygons-class.Rd0000644000175100001440000000351111742756307014705 0ustar hornikusers\name{Polygons-class} \docType{class} \alias{Polygons-class} \title{Class "Polygons"} \description{ Collection of objects of class \code{"Polygon"} } \section{Objects from the Class}{ Objects can be created by calls to the function \code{Polygons} } \section{Slots}{ \describe{ \item{\code{Polygons}:}{Object of class \code{"list"}; list with objects of class \link{Polygon-class} } \item{\code{plotOrder}:}{Object of class \code{"integer"}; order in which the Polygon objects should be plotted, currently by order of decreasing size } \item{\code{labpt}:}{Object of class \code{"numeric"}; pair of x, y coordinates giving a label point, the label point of the largest polygon component } \item{\code{ID}:}{Object of class \code{"character"}; unique identifier string } \item{\code{area}:}{Object of class \code{"numeric"}; the gross total planar area of the Polygon list but not double-counting holes (changed from 0.9-58 - islands are summed, holes are ignored rather than subtracted); these values are used to make sure that polygons of a smaller area are plotted after polygons of a larger area, does not respect projection as objects of this class have no projection defined } } } \section{Methods}{ No methods defined with class "Polygons" in the signature. } \author{ Roger Bivand } \note{ By default, single polygons (where Polygons is a list of length one) are not expected to be holes, but in multiple polygons, hole definitions for member polygons can be set. Polygon objects belonging to an Polygons object should either not overlap one-other, or should be fully included (as lakes or islands in lakes). They should not be self-intersecting. Checking of hole FALSE/TRUE status for Polygons objects is included in the maptools package using functions in the rgeos package, function checkPolygonsHoles(). } \keyword{classes} sp/man/SpatialPoints.Rd0000644000175100001440000000403511635334430014552 0ustar hornikusers\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 = TRUE, 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; if TRUE AND coords has rownames (i.e., coerced to a matrix, \code{dimnames(coords)[[2]]} is not NULL), AND 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. If character: indicates the column in \code{data} with coordinates IDs to match} } \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} } \keyword{manip} sp/man/spsample.Rd0000644000175100001440000001432612271500761013607 0ustar hornikusers\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))) } \arguments{ \item{x}{Spatial object; \code{spsample(x,...)} is a generic method for the existing \code{sample.Xxx} fumctions} \item{...}{ optional arguments, passed to the appropriate \code{sample.Xxx} functions; see NOTES for \code{nclusters} and \code{iter}} \item{n}{ (approximate) sample size } \item{type}{ character; \code{"random"} for completely spatial random; \code{"regular"} for regular (systematically aligned) sampling; \code{"stratified"} for stratified random (one single random location in each "cell"); \code{"nonaligned"} for nonaligned systematic sampling (nx random y coordinates, ny random x coordinates); \code{"hexagonal"} for sampling on a hexagonal lattice; \code{"clustered"} for clustered sampling; \code{"Fibonacci"} for Fibonacci sampling on the sphere (see references).} \item{bb}{ bounding box of the sampled domain; setting this to a smaller value leads to sub-region sampling } \item{offset}{ for regular sampling only: 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 } } \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 \link{overlay} may be necessary to select 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{overlay-methods}, \link{point.in.polygon}, \link{sample}} \examples{ data(meuse.riv) meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)), "x"))) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "regular"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "random"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "stratified"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr, n = 1000, "nonaligned"), pch = 3) plot(meuse.sr) points(spsample(meuse.sr@polygons[[1]], n = 100, "stratified"), pch = 3, cex=.5) data(meuse.grid) gridded(meuse.grid) = ~x+y image(meuse.grid) points(spsample(meuse.grid,n=1000,type="random"), pch=3, cex=.5) image(meuse.grid) points(spsample(meuse.grid,n=1000,type="stratified"), pch=3, cex=.5) image(meuse.grid) points(spsample(meuse.grid,n=1000,type="regular"), pch=3, cex=.5) image(meuse.grid) points(spsample(meuse.grid,n=1000,type="nonaligned"), pch=3, cex=.5) fullgrid(meuse.grid) = TRUE image(meuse.grid) points(spsample(meuse.grid,n=1000,type="stratified"), pch=3,cex=.5) } \keyword{manip} \keyword{methods} sp/man/mapasp.Rd0000644000175100001440000000213712102247155013237 0ustar hornikusers\name{mapasp} \alias{mapasp} \alias{degreeLabelsEW} \alias{degreeLabelsNS} \title{ Calculate aspect ratio for plotting geographic maps; create nice degree axis labels } \description{ Calculate aspect ratio for plotting geographic maps; create nice degree axis labels } \usage{ mapasp(data, xlim, ylim) degreeLabelsEW(x) degreeLabelsNS(x) } \arguments{ \item{data}{ object of class or extending \code{Spatial}} \item{xlim}{ the xlim argument passed (or derived from bounding box) } \item{ylim}{ the ylim argument passed (or derived from bounding box) } \item{x}{ numeric; values at which tics and marks will be generated } } \value{ \code{mapasp} is used for the aspect argument in lattice plots and spplot; let x = dy/dx, with dy and dx the y- and x-size of the map. let s = 1/cos((My * pi)/180) with My the y coordinate of the middle of the map (the mean of ylim) for latlong (longlat) data, \code{mapasp} returns s * x. for other data, mapasp returns "iso". } \note{the values for \code{x} are typically obtained from \link{axTicks}} \seealso{ \link{levelplot} in package \code{lattice}} \keyword{dplot} sp/man/spChFIDs-methods.Rd0000644000175100001440000000307211767713100015025 0ustar hornikusers\name{spChFIDs-methods} \docType{methods} \alias{spChFIDs-methods} \alias{spChFIDs<-} \alias{spChFIDs<-,Spatial-method} \alias{spChFIDs,SpatialLines,character-method} \alias{spChFIDs,SpatialLinesDataFrame,character-method} \alias{spChFIDs,SpatialPolygons,character-method} \alias{spChFIDs,SpatialPolygonsDataFrame,character-method} \title{change feature IDs in spatial objects} \alias{spChFIDs} \description{ When the feature IDs need to be changed in SpatialLines* or SpatialPolygons* objects, these methods may be used. The new IDs should be a character vector of unique IDs of the correct length. } \section{Methods}{ \describe{ \item{obj = "SpatialLines", x = "character"}{replace IDs in a SpatialLines object} \item{obj = "SpatialLinesDataFrame", x = "character"}{replace IDs in a SpatialLinesDataFrame object} \item{obj = "SpatialPolygons", x = "character"}{replace IDs in a SpatialPolygons object} \item{obj = "SpatialPolygonsDataFrame", x = "character"}{replace IDs in a SpatialPolygonsDataFrame object} }} \note{It is usually sensible to keep a copy of the original feature IDs in the object, but this should be done by the user.} \author{Roger Bivand} \seealso{\code{\link[maptools]{spCbind-methods}}, \code{\link[maptools]{spRbind-methods}}} \examples{ \dontrun{ require(maptools) xx <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66")) row.names(as(xx, "data.frame")) xx1 <- spChFIDs(xx, as.character(xx$CNTY_ID)) row.names(as(xx1, "data.frame")) } } \keyword{methods} \keyword{spatial} sp/man/SpatialPolygonsDataFrame-class.Rd0000644000175100001440000000733512162333243017763 0ustar hornikusers\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{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") %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"))) %ncSpPDF <- SpatialPolygonsDataFrame(nc1, df) %names(as(ncSpPDF, "data.frame")) %identical(rownames(as(ncSpPDF, "data.frame")), sapply(slot(ncSpPDF, "polygons"), function(i) slot(i, "ID"))) %rrt <- as(ncSpPDF, "data.frame")$SID74/as(ncSpPDF, "data.frame")$BIR74 %brks <- quantile(rrt, seq(0,1,1/7)) %cols <- grey((length(brks):2)/length(brks)) %dens <- (2:length(brks))*3 %plot(ncSpPDF, col=cols[findInterval(rrt, brks, all.inside=TRUE)]) %plot(ncSpPDF, density=dens[findInterval(rrt, brks, all.inside=TRUE)]) grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as(grd, "SpatialPolygons") centroids <- coordinates(polys) x <- centroids[,1] y <- centroids[,2] z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x ex_1.7 <- SpatialPolygonsDataFrame(polys, data=data.frame(x=x, y=y, z=z, row.names=row.names(polys))) brks <- quantile(z, seq(0,1,1/7)) cols <- grey((length(brks):2)/length(brks)) dens <- (2:length(brks))*3 plot(ex_1.7, col=cols[findInterval(z, brks, all.inside=TRUE)]) plot(ex_1.7, density=dens[findInterval(z, brks, all.inside=TRUE)]) } \keyword{classes} sp/man/SpatialPixelsDataFrame-class.Rd0000644000175100001440000000644511635334430017421 0ustar hornikusers\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{as.data.frame.SpatialPixelsDataFrame} \alias{rbind.SpatialPixelsDataFrame} \alias{dim.SpatialPixelsDataFrame} \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 } } } \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/00sp.Rd0000644000175100001440000000772611771363476012571 0ustar hornikusers\name{sp} \alias{sp} \title{A package providing classes and methods for spatial data: points, lines, polygons and grids } \description{ This package provides S4 classes for importing, manipulating and exporting spatial data in R, and for methods including print/show, plot, subset, \code{[}, \code{[[}, \code{\$}, names, dim, summary, and a number of methods specific to spatial data handling. }%description \section{Introduction}{ Several spatial statistical packages have been around for a long while, but no organized set of classes for spatial data has yet been devised. Many of the spatial packages make their own assumptions, or use their own class definitions for spatial data, making it inconvenient to move from one package to another. This package tries to provide a solid set of classes for many different types of spatial data. The idea is that spatial statistical packages will either support these classes (i.e., directly read and write them) or will provide conversion to them, so that we have a base class set with which any package can exchange. This way, many-to-many conversions can be replace with one-to-many conversions, provided either in this package or the spatial packages. Wherever possible conversion (coercion) functions are automatic, or provided by sp. External packages that depend on sp will provide importing and exporting from and to external GIS formats, e.g. through GDAL, OGR or shapelib. In addition, this package tries to provide convenient methods to print, summarize and plot such spatial data. }%section{Introduction} \section{Dimensions}{ In principal, geographical data are two-dimensional, on a flat surface (a map) or on a sphere (the earth). This package provides space for dealing with higher dimensional data where possible; this is e.g. very simple for points and grids, but hard to do for polygons. Plotting functions are devised primarily for two-dimensional data, or two-dimensional projections of higher dimensional data. }%section{Dimensions} \section{Coordinate reference systems}{ Central to spatial data is that they have a coordinate reference system, which is coded in object of CRS class. Central to operations on different spatial data sets is that their coordinate reference system is compatible (i.e., identical). This CRS can be a character string describing a reference system in a way understood by the PROJ.4 projection library, or a (character) missing value. An interface to the PROJ.4 library is available only if the R package rgdal is present. } \section{Class structure}{ All spatial classes derive from a basic class \code{Spatial}, which only provides a bounding box and a CRS. This class has no useful instances, but useful derived classes. SpatialPoints extends Spatial and has coordinates. The method \link{coordinates} extracts the numeric matrix with coordinates from an object of class SpatialPoints, or from other (possibly derived) classes that have points. Objects of class SpatialGrid points on a regular grid. Either a full grid is stored or a partial grid (i.e., only the non-missing valued cells); calling \link{coordinates} on them will give the coordinates for the grid cells. SpatialPoints, SpatialPixels and SpatialGrid can be of arbitray dimension, although most of the effort is in making them work for two dimensional data. SpatialLines provides lines, and SpatialPolygons provides polygons, i.e., lines that end where they start and do not intersect with itself. SpatialLines and SpatialPolygons only have two-dimensional data. SpatialPointsDataFrame extends SpatialPoints with a data slot, having a data.frame with attribute data. Similarly, SpatialPixelsDataFrame, SpatialLinesDataFrame, SpatialPolygonsDataFrame extend the primary spatial information with attribute data. } \section{References}{ PROJ.4: \url{http://trac.osgeo.org/proj/} GDAL and OGR: \url{http://www.gdal.org/}. } \section{Authors}{ sp is a collaborative effort of Edzer Pebesma, Roger Bivand, Barry Rowlingson and Virgilo G\'omez-Rubio. } \keyword{spatial} sp/man/SpatialPolygons.Rd0000644000175100001440000000770512172001331015103 0ustar hornikusers\name{SpatialPolygons} \alias{SpatialPolygons} \alias{SpatialPolygonsDataFrame} \alias{Polygon} \alias{Polygons} \alias{getSpatialPolygonsLabelPoints} \title{ create objects of class SpatialPolygons or SpatialPolygonsDataFrame} \description{ create objects of class \code{SpatialPolygons} or \code{SpatialPolygonsDataFrame} from lists of \code{Polygons} objects and \code{data.frame}s} \usage{ Polygon(coords, hole=as.logical(NA)) Polygons(srl, ID) SpatialPolygons(Srl, pO, proj4string=CRS(as.character(NA))) SpatialPolygonsDataFrame(Sr, data, match.ID = TRUE) getSpatialPolygonsLabelPoints(SP) } \arguments{ \item{coords}{2-column numeric matrix with coordinates; first point (row) should equal last coordinates (row); if the hole argument is not given, the status of the polygon as a hole or an island will be taken from the ring direction, with clockwise meaning island, and counter-clockwise meaning hole} \item{hole}{logical value for setting polygon as hole or not; if the hole argument is not given, the status of the polygon as a hole or an island will be taken from the ring direction, with clockwise meaning island, and counter-clockwise meaning hole} \item{proj4string}{ projection string of class \link{CRS-class}} \item{srl}{list with \link{Polygon-class} objects} \item{ID}{character vector of length one with identifier} \item{Srl}{ list with objects of class \link{Polygons-class}} \item{pO}{ integer vector; plotting order; if missing in reverse order of Polygons area } \item{Sr}{ object of class \link{SpatialPolygons-class}} \item{data}{ object of class \code{data.frame}; the number of rows in \code{data} should equal the number of \link{Polygons-class} objects in \code{Sr}} \item{match.ID}{logical: (default TRUE): match SpatialPolygons member Polygons ID slot values with data frame row names, and re-order the data frame rows if necessary. If character: indicates the column in \code{data} with Polygons IDs to match} \item{SP}{object of class \link{SpatialPolygons-class}} } \details{ In \code{Polygon}, if the hole argument is not given, the status of the polygon as a hole or an island will be taken from the ring direction, with clockwise meaning island, and counter-clockwise meaning hole. In \code{Polygons}, if all of the member Polygon objects are holes, the largest by area will be converted to island status. Until 2010-04-17, version 0.9-61, the area of this converted object was erroneously left at its hole value of zero. Thanks to Patrick Giraudoux for spotting the bug. The class definitions used for polygons in \pkg{sp} do not accord with those of the simple features specification of the Open Geospatial Consortium. The \pkg{rgeos} package, an interface to Geometry Engine -- Open Source (GEOS), uses this specification, in which each hole (interior ring) must be associated with its containing exterior ring. In order to avoid introducing incompatible changes into the class definition of Polygons objects, a comment has been added as a single character string to each such object. Here we can trust the data source to assign the hole status correctly, and use the simple function \code{\link[rgeos]{createSPComment}} to add such comments to each Polygons member of the polygons slot of this SpatialPolygons object. Exterior rings are coded zero, while interior rings are coded with the 1-based index of the exterior ring to which they belong. SpatialPolygons objects created by reading using \code{\link[rgdal]{readOGR}} from \pkg{rgdal} have the comments set on input, as OGR also uses SFS. } \value{ \code{Polygon} returns an object of class \code{Polygon}; \code{Polygons} returns an object of class \code{Polygons}; \code{SpatialPolygons} returns object of class \code{SpatialPolygons}; \code{SpatialPolygonsDataFrame} returns object of class \code{SpatialPolygonsDataFrame} \code{getSpatialPolygonsLabelPoints} returns an object of class \code{SpatialPoints} with label points. } \seealso{ \link{SpatialPolygons-class}, \link{SpatialPolygonsDataFrame-class} } \keyword{manip} sp/man/surfaceArea.Rd0000644000175100001440000000461611635334430014206 0ustar hornikusers\name{surfaceArea} \alias{surfaceArea} \alias{surfaceArea.matrix} \alias{surfaceArea,SpatialPixelsDataFrame-method} \alias{surfaceArea,SpatialGridDataFrame-method} \alias{surfaceArea,matrix-method} \title{ Compute surface area of a digital elevation model. } \description{ It is often said that if Wales was flattened out it would have an area bigger than England. This function computes the surface area of a grid of heights taking into account the sloping nature of the surface. } \usage{ surfaceArea(m, ...) surfaceArea.matrix(m, cellx = 1, celly = 1, byCell = FALSE) } \arguments{ \item{m}{ a matrix of height values, or an object of class \link{SpatialPixelsDataFrame} or \link{SpatialGridDataFrame}. } \item{cellx}{ the size of the grid cells in the x-direction, in the same units as the height values. } \item{celly}{ the size of the grid cells in the y-direction, in the same units as the height values. } \item{byCell}{ return single value or matrix of values } \item{...}{ignored} } \value{ Either a single value of the total area if byCell=FALSE, or a matrix the same shape as m of individual cell surface areas if byCell=TRUE. In this case, the sum of the returned matrix should be the same value as that which is returned if byCell=FALSE. Missing values (NA) in the input matrix are allowed. They will produce an NA in the output matrix for byCell=TRUE, and contribute zero to the total area. They also have an effect on adjacent cells - see code comments for details. } \section{Methods}{ \describe{ \item{obj = "matrix"}{ takes a matrix as input, requires cellx and celly to be set } \item{obj = "SpatialGridDataFrame"}{ takes an object of class \link{SpatialGridDataFrame} as input, and retrieves cellx and celly from this } \item{obj = "SpatialPixelsDataFrame"}{ takes an object of class \link{SpatialPixelsDataFrame} as input, and retrieves cellx and celly from this } }} \references{ Calculating Landscape Surface Area from Digital Elevation Models, Jeff S. Jenness Wildlife Society Bulletin, Vol. 32, No. 3 (Autumn, 2004), pp. 829-839 } \author{ Barry Rowlingson , integration in sp Edzer Pebesma. } \examples{ surfaceArea(volcano) image(surfaceArea(volcano,byCell=TRUE)) data(meuse.grid) gridded(meuse.grid) = ~x+y image(surfaceArea(meuse.grid["dist"], byCell=TRUE)) surfaceArea(meuse.grid["dist"]) } \keyword{spatial} sp/man/asciigrid.Rd0000644000175100001440000000304311635334430013714 0ustar hornikusers\name{read.asciigrid} \alias{read.asciigrid} \alias{write.asciigrid} \title{ read/write to/from (ESRI) asciigrid format } \description{ read/write to/from ESRI asciigrid format } \usage{ read.asciigrid(fname, as.image = FALSE, plot.image = FALSE, colname = fname, proj4string = CRS(as.character(NA))) write.asciigrid(x, fname, attr = 1, na.value = -9999, ...) } \arguments{ \item{fname}{ file name } \item{as.image}{logical; if FALSE, a list is returned, ready to be shown with the \code{image} command; if FALSE an object of class \link{SpatialGridDataFrame-class} is returned } \item{plot.image}{logical; if TRUE, an image of the map is plotted} \item{colname}{alternative name for data column if not file name} \item{proj4string}{A CRS object setting the projection arguments of the Spatial Grid returned} \item{x}{ object of class \link{SpatialGridDataFrame}} \item{attr}{attribute column; if missing, the first column is taken; a name or a column number may be given} \item{na.value}{numeric; value given to missing valued cells in the resulting map} \item{...}{ arguments passed to \link{write.table}, which is used to write the numeric data } } \value{ \code{read.asciigrid} returns the grid map read; either as an object of class \link{SpatialGridDataFrame-class} or, if as.image is TRUE, as list with components \code{x}, \code{y} and \code{z}. } \seealso{ \link{as.image.SpatialGridDataFrame}, \link{image} } \author{Edzer Pebesma} \examples{ x <- read.asciigrid(system.file("external/test.ag", package="sp")[1]) class(x) image(x) } \keyword{programming} sp/man/Lines-class.Rd0000644000175100001440000000156312120055225014130 0ustar hornikusers\name{Lines-class} \docType{class} \alias{Lines-class} % \alias{coordinates,Lines-method} \title{Class "Lines" } \description{ class for sets of line objects } \section{Objects from the Class}{ Objects can be created by calls to the function \link{Line} } \section{Slots}{ \describe{ \item{\code{Lines}:}{Object of class \code{"list"}, containing elements of class \link{Line-class}} \item{\code{ID}:}{\code{"character"} vector of lenght one, with unique identifier string} } } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(obj = "Line")}: retrieve coordinates from lines; returns list with matrices } \item{lines}{\code{signature(x = "Line")}: add lines to a plot} } } \arguments{ \item{SL, Lines}{an Lines object} } \author{ Roger Bivand, Edzer Pebesma } \seealso{ \link{Lines-class}, \link{SpatialLines-class} } \keyword{classes} sp/man/zerodist.Rd0000644000175100001440000000467112270773264013641 0ustar hornikusers\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) zerodist2(obj1, obj2, zero = 0.0) remove.duplicates(obj, zero = 0.0, remove.second = TRUE) } \arguments{ \item{obj}{ object of, or extending, class \link{SpatialPoints} } \item{obj1}{ object of, or extending, class \link{SpatialPoints} } \item{obj2}{ object of, or extending, class \link{SpatialPoints} } \item{zero}{ distance values less than or equal to this threshold value are considered to have zero distance (default 0.0); units are those of the coordinates for projected data or unknown projection, or km if coordinates are defined to be longitute/latitude } \item{unique.ID}{logical; if TRUE, return an ID (integer) for each point that is different only when two points do not share the same location } \item{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, sp 1.0-14 returned the highest index, sp 1.0-15 and later return the lowest index. } \examples{ data(meuse) summary(meuse) # pick 10 rows n <- 10 ran10 <- sample(nrow(meuse), size = n, replace = TRUE) meusedup <- rbind(meuse, meuse[ran10, ]) coordinates(meusedup) <- c("x", "y") zd <- zerodist(meusedup) sum(abs(zd[1:n,1] - sort(ran10))) # 0! # remove the duplicate rows: meusedup2 <- meusedup[-zd[,2], ] summary(meusedup2) meusedup3 <- subset(meusedup, !(1:nrow(meusedup) \%in\% zd[,2])) summary(meusedup3) coordinates(meuse) <- c("x", "y") zerodist2(meuse, meuse[c(10:33,1,10),]) } \keyword{dplot} sp/man/degaxis.Rd0000644000175100001440000000157711635334430013414 0ustar hornikusers\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")),xlim=c(-1,1),ylim=c(-1,1)) degAxis(1) degAxis(2, at = c(-1,-0.5,0,0.5,1)) # } \keyword{dplot} sp/man/SpatialGrid.Rd0000644000175100001440000001075611635334430014172 0ustar hornikusers\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 coordinates for each dimension} \item{cellsize}{numeric; vector with the cell size in each dimension} \item{cells.dim}{integer; vector with number of cells in each dimension} \item{points}{ coordinates, object of class \link{SpatialPoints-class} } \item{grid}{ grid topology; object of class \link{GridTopology-class}; for calls to \code{SpatialPixels}, a value of NULL implies that this will be derived from the point coordinates } \item{tolerance}{ precision, used to which extent points are exactly on a grid} \item{round}{default NULL, otherwise a value passed to as the digits argument to \code{round} for setting cell size} \item{proj4string}{ object of class \link{CRS-class}} \item{obj}{object of class or deriving from \link{SpatialGrid-class}} \item{cc}{ numeric matrix with coordinates } \item{all.inside}{ logical; if TRUE and \code{cc} points fall outside the grid area, an error message is generated; if FALSE, NA values are generated for such points } } \value{ GridTopology returns a value of class \link{GridTopology-class}; SpatialGrid returns an object of class \link{SpatialGrid-class} \code{coordinatevalues} returns a list with the unique x-coordinates, the unique y-coordinate, etc. instead of the \link{coordinates} of all grid cells SpatialGrid returns an object of class \link{SpatialGrid-class}. points2grid returns the \link{GridTopology-class} from a set of points. getGridIndex finds the index of a set of point coordinates in a given grid topology, and depending on \code{all.inside} setting, generates NA or an error message if points are outside the grid domain. getGridTopology returns the slot of class \link{GridTopology-class} from obj. areaSpatialGrid returns the spatial area of (the non-missing valued cells of) the grid. For objects of class \link{SpatialGridDataFrame-class} the area refers to cells where any (one or more) of the attribute columns are non-missing valued. } \note{ SpatialGrid stores grid topology and may or may not store the coordinates of the actual points, which may form a subset of the full grid. To find out or change this, see \link{fullgrid}. points2grid tries to figure out the grid topology from points. It succees only if points on a grid line have constant y column, and points on a grid column have constant x coordinate, etc. In other cases, use signif on the raw coordinate matrices to make sure this is the case. } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \seealso{ \link{SpatialGrid-class}, \link{SpatialGridDataFrame-class}, } \examples{ x = GridTopology(c(0,0), c(1,1), c(5,4)) class(x) x summary(x) coordinates(x) coordinates(GridTopology(c(0,0), c(1,1), c(5,4))) coordinatevalues(x) data(meuse.grid) coordinates(meuse.grid) <- c("x", "y") points2grid(meuse.grid) data(meuse.grid) set.seed(1) meuse.grid$x <- meuse.grid$x + rnorm(length(meuse.grid$x), 0, 0.002) meuse.grid$y <- meuse.grid$y + rnorm(length(meuse.grid$y), 0, 0.002) coordinates(meuse.grid) <- c("x", "y") #EJP # points2grid(meuse.grid, tolerance=0.76, round=1) data(meuse.grid) a <- which(meuse.grid$x == 180140) b <- which(meuse.grid$x == 180180) c <- which(meuse.grid$x == 179260) d <- which(meuse.grid$y == 332460) e <- which(meuse.grid$y == 332420) f <- which(meuse.grid$y == 330740) meuse.grid <- meuse.grid[-c(a, b, c, d, e, f),] coordinates(meuse.grid) <- c("x", "y") points2grid(meuse.grid) data(meuse.grid) set.seed(1) meuse.grid$x <- meuse.grid$x + rnorm(length(meuse.grid$x), 0, 0.002) meuse.grid$y <- meuse.grid$y + rnorm(length(meuse.grid$y), 0, 0.002) meuse.grid <- meuse.grid[-c(a, b, c, d, e, f),] coordinates(meuse.grid) <- c("x", "y") # EJP # points2grid(meuse.grid, tolerance=0.69, round=1) } \keyword{spatial} sp/man/meuse.Rd0000644000175100001440000000706211635334430013101 0ustar hornikusers\name{meuse} \alias{meuse} \docType{data} \title{Meuse river data set} \description{ This data set gives locations and topsoil heavy metal concentrations, along with a number of soil and landscape variablesat the observation locations, collected in a flood plain of the river Meuse, near the village of Stein (NL). Heavy metal concentrations are from composite samples of an area of approximately 15 m x 15 m. } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; Easting (m) in Rijksdriehoek (RDH) (Netherlands topographical) map coordinates } \item{y}{a numeric vector; Northing (m) in RDH coordinates } \item{cadmium}{topsoil cadmium concentration, mg kg-1 soil ("ppm"); zero cadmium values in the original data set have been shifted to 0.2 (half the lowest non-zero value) } \item{copper}{topsoil copper concentration, mg kg-1 soil ("ppm") } \item{lead}{topsoil lead concentration, mg kg-1 soil ("ppm") } \item{zinc}{topsoil zinc concentration, mg kg-1 soil ("ppm") } \item{elev}{relative elevation above local river bed, m } \item{dist}{distance to the Meuse; obtained from the nearest cell in \link{meuse.grid}, which in turn was derived by a spread (spatial distance) GIS operation, horizontal precision 20 metres; then normalized to $[0,1]$ } \item{om}{organic matter, kg (100 kg)-1 soil (percent)} \item{ffreq}{flooding frequency class: 1 = once in two years; 2 = once in ten years; 3 = one in 50 years} \item{soil}{soil type according to the 1:50 000 soil map of the Netherlands. 1 = Rd10A (Calcareous weakly-developed meadow soils, light sandy clay); 2 = Rd90C/VII (Non-calcareous weakly-developed meadow soils, heavy sandy clay to light clay); 3 = Bkd26/VII (Red Brick soil, fine-sandy, silty light clay)} \item{lime}{lime class: 0 = absent, 1 = present by field test with 5\% HCl} \item{landuse}{landuse class: Aa Agriculture/unspecified = , Ab = Agr/sugar beetsm, Ag = Agr/small grains, Ah = Agr/??, Am = Agr/maize, B = woods, Bw = trees in pasture, DEN = ??, Fh = tall fruit trees, Fl = low fruit trees; Fw = fruit trees in pasture, Ga = home gardens, SPO = sport field, STA = stable yard, Tv = ?? , W = pasture} \item{dist.m}{distance to river Meuse in metres, as obtained during the field survey} } } \usage{ data(meuse) } \note{row.names refer to the original sample number. Soil units were mapped with a minimum delination width of 150 m, and so somewhat generalize the landscape. Approximate equivalent World Reference Base 2002 for Soil Resources names are: Rd10A Gleyic Fluvisols; Rd90C Haplic Fluvisols; Bkd26 Haplic Luvisols. Units Rd90C and Bkd26 have winter groundwater > 80cm, summer > 120cm depth. } \author{Field data were collected by Ruud van Rijn and Mathieu Rikken; compiled for R by Edzer Pebesma; description extended by David Rossiter } \references{ M G J Rikken and R P G Van Rijn, 1993. Soil pollution with heavy metals - an inquiry into spatial variation, cost of mapping and the risk evaluation of copper, cadmium, lead and zinc in the floodplains of the Meuse west of Stein, the Netherlands. Doctoraalveldwerkverslag, Dept. of Physical Geography, Utrecht University P.A. Burrough, R.A. McDonnell, 1998. Principles of Geographical Information Systems. Oxford University Press. Stichting voor Bodemkartering (STIBOKA), 1970. Bodemkaart van Nederland : Blad 59 Peer, Blad 60 West en 60 Oost Sittard: schaal 1 : 50 000. Wageningen, STIBOKA. \url{http:/www.gstat.org/} } \keyword{datasets} \examples{ data(meuse) summary(meuse) coordinates(meuse) <- ~x+y proj4string(meuse) <- CRS("+init=epsg:28992") } sp/man/addattr.Rd0000644000175100001440000000254211635334430013404 0ustar hornikusers\name{addAttrToGeom-methods} \docType{methods} \alias{addAttrToGeom} \alias{addAttrToGeom-methods} \alias{addAttrToGeom,SpatialPoints,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{overlay}, \link{point.in.polygon}} \keyword{methods} sp/man/Line-class.Rd0000644000175100001440000000135611635334430013755 0ustar hornikusers\name{Line-class} \docType{class} \alias{Line-class} % \alias{coordinates,Line-method} \title{Class "Line" } \description{ class for line objects } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Line", ...)}, or (preferred) by calls to the function \link{Line} } \section{Slots}{ \describe{ \item{\code{coords}:}{Object of class \code{"matrix"}, containing the line coordinates } } } \section{Methods}{ \describe{ \item{coordinates}{\code{signature(obj = "Line")}: retrieve coordinates from line } \item{lines}{\code{signature(x = "Line")}: add lines to a plot } } } \author{ Roger Bivand, Edzer Pebesma } \seealso{ \link{Lines-class}, \link{SpatialLines-class} } \keyword{classes} sp/man/coordinates-methods.Rd0000644000175100001440000000464211635334430015737 0ustar hornikusers\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,SpatialPointsDataFrame-method} \alias{coordinates,SpatialPolygons-method} \alias{coordinates,SpatialPolygonsDataFrame-method} \alias{coordinates,Line-method} \alias{coordinates,Lines-method} \alias{coordinates,SpatialLines-method} \alias{coordinates,GridTopology-method} \alias{coordinates,SpatialPixels-method} \alias{coordinates,SpatialPixelsDataFrame-method} \alias{coordinates,SpatialGrid-method} \alias{coordinates,SpatialGridDataFrame-method} \alias{coordinates<-,data.frame-method} \title{ retrieve (or set) spatial coordinates } \description{ retrieve (or set) spatial coordinates from (for) spatial data } \section{Methods}{ \describe{ \item{obj = "list"}{ list with (at least) two numeric components of equal length } \item{obj = "data.frame"}{ data.frame with at least two numeric components } \item{obj = "matrix"}{ numeric matrix with at least two columns } \item{obj = "SpatialPoints"}{ object of, or deriving from, SpatialPoints } \item{obj = "SpatialPointsDataFrame"}{ object of, or deriving from, SpatialPointsDataFrame } \item{obj = "SpatialPolygons"}{ object of, or deriving from, SpatialPolygons } \item{obj = "SpatialPolygonsDataFrame"}{ object of, or deriving from, SpatialPolygonsDataFrame } \item{obj = "Line"}{ object of class Line; returned value is matrix } \item{obj = "Lines"}{ object of class Lines; returned value is list of matrices } \item{obj = "SpatialLines"}{ object of, or deriving from, SpatialLines; returned value is list of lists of matrices } \item{obj = "GridTopology"}{ object of, or deriving from, GridTopology } \item{obj = "GridTopology"}{ object of, or deriving from, GridTopology } \item{obj = "SpatialPixels"}{ object of, or deriving from, SpatialPixels } \item{obj = "SpatialPixelsDataFrame"}{ object of, or deriving from, SpatialPixelsDataFrame } \item{obj = "SpatialGrid"}{ object of, or deriving from, SpatialGrid } \item{obj = "SpatialGridDataFrame"}{ object of, or deriving from, SpatialGridDataFrame } }} \section{Methods for "coordinates<-"}{ \describe{ \item{object = "data.frame", value="ANY"}{ promote data.frame to object of class \link{SpatialPointsDataFrame-class}, by specifying coordinates; see \link{coordinates}} }} \keyword{methods} sp/man/DMS-class.Rd0000644000175100001440000000277711635334430013521 0ustar hornikusers\name{DMS-class} \docType{class} \alias{DMS-class} \alias{print.DMS} \alias{show,DMS-method} \alias{coerce,DMS-method} \alias{as.double.DMS} \alias{as.numeric.DMS} \title{Class "DMS" for degree, minute, decimal second values} \description{The class provides a container for coordinates stored as degree, minute, decimal second values.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("DMS", ...)}, converted from decimal degrees using \code{dd2dms()}, or converted from character strings using \code{char2dms()}. } \section{Slots}{ \describe{ \item{\code{WS}:}{Object of class \code{"logical"} TRUE if input value negative} \item{\code{deg}:}{Object of class \code{"numeric"} degrees} \item{\code{min}:}{Object of class \code{"numeric"} minutes} \item{\code{sec}:}{Object of class \code{"numeric"} decimal seconds} \item{\code{NS}:}{Object of class \code{"logical"} TRUE if input value is a Northing} } } \section{Methods}{ \describe{ \item{coerce}{\code{signature(from = "DMS", to = "numeric")}: convert to decimal degrees } \item{show}{\code{signature(object = "DMS")}: print data values } } } \author{Roger Bivand \email{Roger.Bivand@nhh.no} } \seealso{\code{\link{char2dms}}, \code{\link{dd2dms}}} \examples{ data(state) dd2dms(state.center$x) dd2dms(state.center$y, NS=TRUE) as.numeric(dd2dms(state.center$y)) as(dd2dms(state.center$y, NS=TRUE), "numeric") as.numeric.DMS(dd2dms(state.center$y)) state.center$y } \keyword{classes} \keyword{spatial} sp/man/polygons.Rd0000644000175100001440000000165512162333243013634 0ustar hornikusers\name{polygons} \alias{polygons<-} \alias{polygons} \title{ sets spatial coordinates to create spatial data, or retrieves spatial coordinates } \description{ sets spatial coordinates to create spatial data, or retrieves spatial coordinates } \usage{ polygons(obj) polygons(object) <- value } \arguments{ \item{obj}{ object of class "SpatialPolygons" or "SpatialPolygonsDataFrame" } \item{object}{ object of class "data.frame" } \item{value}{ object of class "SpatialPolygons" } } \value{ polygons returns the SpatialPolygons of obj; polygons<- promotes a data.frame to a SpatialPolygonsDataFrame object } \examples{ grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as.SpatialPolygons.GridTopology(grd) centroids <- coordinates(polys) x <- centroids[,1] y <- centroids[,2] z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x df <- data.frame(x=x, y=y, z=z, row.names=row.names(polys)) polygons(df) <- polys class(df) summary(df) } \keyword{manip} sp/man/stack.Rd0000644000175100001440000000451712135200517013064 0ustar hornikusers\name{stack} \alias{spmap.to.lev} \alias{stack.SpatialPointsDataFrame} \alias{stack.SpatialGridDataFrame} \title{ rearrange data in SpatialPointsDataFrame or SpatialGridDataFrame for plotting with spplot (levelplot/xyplot wrapper) } \description{ rearrange SpatialPointsDataFrame for plotting with spplot or levelplot } \usage{ spmap.to.lev(data, zcol = 1:n, n = 2, names.attr) \method{stack}{SpatialPointsDataFrame}(x, select, ...) \method{stack}{SpatialGridDataFrame}(x, select, ...) } \arguments{ \item{data}{ object of class (or extending) SpatialPointsDataFrame or SpatialGridDataFrame } \item{zcol}{ z-coordinate column name(s), or a column number (range) (after removing the spatial coordinate columns: 1 refers to the first non-coordinate column, etc. ) } \item{names.attr}{names of the set of z-columns (these names will appear in the plot); if omitted, column names of \code{zcol} } \item{n}{ number of columns to be stacked } \item{x}{ same as \code{data}} \item{select}{ same as \code{zcol}} \item{...}{ ignored } } \value{ \code{spmap.to.lev} returns a data frame with the following elements: \item{x}{ x-coordinate for each row} \item{y}{ y-coordinate for each row} \item{z}{ column vector with each of the elements in columns \code{zcol} of \code{data} stacked } \item{name}{ factor; name of each of the stacked \code{z} columns } \code{stack} is an S3 method: it return a data.frame with a column \code{values} that has the stacked coordinates and attributes, and a column \code{ind} that indicates the variable stacked; it also replicates the coordinates. } \seealso{ \link{spplot}, \link{levelplot} in package \code{lattice}, and \link{stack}} \examples{ library(lattice) data(meuse.grid) # data frame coordinates(meuse.grid) = c("x", "y") # promotes to SpatialPointsDataFrame meuse.grid[["idist"]] = 1 - meuse.grid[["dist"]] # add variable # the following is made much easier by spplot: levelplot(z~x+y|name, spmap.to.lev(meuse.grid, z=c("dist","idist"), names.attr = c("distance", "inverse of distance")), aspect = "iso") levelplot(values~x+y|ind, as.data.frame(stack(meuse.grid)),aspect = "iso") gridded(meuse.grid) = TRUE levelplot(z~x+y|name, spmap.to.lev(meuse.grid, z=c("dist","idist"), names.attr = c("distance", "inverse of distance")), aspect = "iso") levelplot(values~x+y|ind, as.data.frame(stack(meuse.grid)), asp = "iso") } \keyword{dplot} sp/man/merge.Rd0000644000175100001440000000233512211055166013055 0ustar hornikusers\name{merge} \docType{methods} \alias{merge} \alias{merge,Spatial,data.frame-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, ...) } \arguments{ \item{x}{object deriving from \link{Spatial}} \item{y}{ojbect of class \code{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{...}{arguments to be passed to or from methods.} } \value{ a Spatial* object } \author{Robert J. Hijmans} \seealso{ \code{\link[base]{merge}} } \keyword{methods} \keyword{spatial} sp/man/meuse.grid.Rd0000644000175100001440000000271411635334430014024 0ustar hornikusers\name{meuse.grid} \alias{meuse.grid} \docType{data} \title{ Prediction Grid for Meuse Data Set } \usage{data(meuse.grid)} \description{ The \code{meuse.grid} data frame has 3103 rows and 7 columns; a grid with 40 m x 40 m spacing that covers the Meuse study area (see \link{meuse}) } \format{ This data frame contains the following columns: \describe{ \item{x}{a numeric vector; x-coordinate (see \link{meuse}) } \item{y}{a numeric vector; y-coordinate (see \link{meuse}) } \item{dist}{distance to the Meuse river; obtained by a spread (spatial distance) GIS operation, from border of river; normalized to $[0,1]$ } \item{ffreq}{flooding frequency class, for definitions see this item in \link{meuse}; it is not known how this map was generated} \item{part.a}{arbitrary division of the area in two areas, a and b} \item{part.b}{see \code{part.a}} \item{soil}{soil type, for definitions see this item in \link{meuse}; it is questionable whether these data come from a real soil map, they do not match the published 1:50 000 map} } } \details{ \code{x} and \code{y} are in RD New, the Dutch topographical map coordinate system. Roger Bivand projected this to UTM in the R-Grass interface package. } \source{ \url{http://www.gstat.org/} } \references{ See the \link{meuse} documentation } \examples{ data(meuse.grid) coordinates(meuse.grid) = ~x+y proj4string(meuse.grid) <- CRS("+init=epsg:28992") gridded(meuse.grid) = TRUE spplot(meuse.grid) } \keyword{datasets} sp/man/bpy.colors.Rd0000644000175100001440000000250012036102757014046 0ustar hornikusers\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/SpatialLinesDataFrame-class.Rd0000644000175100001440000000422311635334430017217 0ustar hornikusers\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{dim.SpatialLinesDataFrame} \alias{row.names.SpatialLinesDataFrame} \title{a class for spatial lines with attributes } \description{ this class holds data consisting of (sets of lines), where each set of lines relates to an attribute row in a data.frame } \section{Objects from the Class}{ can be created by the function \link{SpatialLinesDataFrame} } \section{Slots}{ \describe{ \item{\code{data}:}{Object of class \link{data.frame} containing the attribute table } \item{\code{lines}:}{Object of class \code{"list"}; see \link{SpatialLines-class}} \item{\code{bbox}:}{Object of class \code{"matrix"}; see \link{Spatial-class} } \item{\code{proj4string}:}{Object of class \code{"CRS"}; see \link{CRS-class}} } } \section{Extends}{ Class \code{"SpatialLines"}, directly. Class \code{"Spatial"}, by class \code{"SpatialLines"}. } \section{Methods}{ Methods defined with class "SpatialLinesDataFrame" in the signature: \describe{ \item{[}{\code{signature(x = "SpatialLinesDataFrame")}: subset rows or columns; in case of row subsetting, the line sets are also subsetted; NAs are not permitted in the row index } \item{coordinates}{\code{signature(obj = "SpatialLinesDataFrame")}: retrieves a list with lists of coordinate matrices } \item{show}{\code{signature(object = "SpatialLinesDataFrame")}: print method } \item{plot}{\code{signature(x = "SpatialLinesDataFrame")}: plot points} \item{lines}{\code{signature(object = "SpatialLinesDataFrame")}: add lines to plot} \item{rbind}{\code{signature(object = "SpatialLinesDataFrame")}: rbind-like method} } } \note{ \code{rbind} for \code{SpatialLinesDataFrame} is only possible for objects with unique IDs. If you want to \code{rbind} objects with duplicated IDs, see\code{\link{spChFIDs}}. } \author{ Roger Bivand; Edzer Pebesma } \seealso{ \link{SpatialLines-class} } \keyword{classes} sp/man/SpatialGridDataFrame-class.Rd0000644000175100001440000000756412162361140017037 0ustar hornikusers\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} \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} } } \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 } } \examples{ data(meuse.grid) # only the non-missing valued cells coordinates(meuse.grid) = c("x", "y") # promote to SpatialPointsDataFrame gridded(meuse.grid) <- TRUE # promote to SpatialPixelsDataFrame x = as(meuse.grid, "SpatialGridDataFrame") # creates the full grid x[["idist"]] = 1 - x[["dist"]] # assigns new attribute image(x["idist"]) # note the single [ for attribute selection # toy example: df = data.frame(z = c(1:6,NA,8,9), xc = c(1,1,1,2,2,2,3,3,3), yc = c(rep(c(0, 1.5, 3),3))) coordinates(df) = ~xc+yc gridded(df) = TRUE df = as(df, "SpatialGridDataFrame") # to full grid image(df["z"]) # draw labels to verify: cc = coordinates(df) z=df[["z"]] zc=as.character(z) zc[is.na(zc)]="NA" text(cc[,1],cc[,2],zc) # the following is weird, but illustrates the concept of row/col selection: fullgrid(meuse.grid) = TRUE image(meuse.grid) image(meuse.grid[20:70, 10:70, "dist"], add = TRUE, col = bpy.colors()) # as.matrix, as.array sgdim = c(3,4) SG = SpatialGrid(GridTopology(rep(0,2), rep(10,2), sgdim)) SGDF = SpatialGridDataFrame(SG, data.frame(val = 1:12)) as.array(SGDF) as.matrix(SGDF) as(SGDF, "array") } \keyword{classes} sp/man/point.in.polygon.Rd0000644000175100001440000000227011635334430015203 0ustar hornikusers\name{point.in.polygon} \alias{point.in.polygon} \title{ do point(s) fall in a given polygon? } \description{ verifies for one or more points whether they fall in a given polygon } \usage{ point.in.polygon(point.x, point.y, pol.x, pol.y, mode.checked=FALSE) } \arguments{ \item{point.x}{numerical array of x-coordinates of points} \item{point.y}{numerical array of y-coordinates of points} \item{pol.x}{numerical array of x-coordinates of polygon} \item{pol.y}{numerical array of y-coordinates of polygon} \item{mode.checked}{default FALSE, used internally to save time when all the other argument are known to be of storage mode double} } \value{ integer array; values are: 0: point is strictly exterior to pol; 1: point is strictly interior to pol; 2: point lies on the relative interior of an edge of pol; 3: point is a vertex of pol. } \references{ Uses the C function InPoly(). InPoly is Copyright (c) 1998 by Joseph O'Rourke. It may be freely redistributed in its entirety provided that this copyright notice is not removed. } \examples{ # open polygon: point.in.polygon(1:10,1:10,c(3,5,5,3),c(3,3,5,5)) # closed polygon: point.in.polygon(1:10,rep(4,10),c(3,5,5,3,3),c(3,3,5,5,3)) } \keyword{manip} sp/man/spplot.Rd0000644000175100001440000002441012162333243013275 0ustar hornikusers\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} \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) 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, ]) 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) 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", ...) } \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}{ logical; if TRUE, use continuous, levelplot-like colorkey instead of symbol key} \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. } } \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. } \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}}{for the layout of panels} \item{\code{col.regions}}{to specify fill colours; in case the variable to be plotted is a factor, this vector should have length equal to the number of factor levels; when plotting points it may also have length one, using symbol type to distinguish classes } \item{\code{pretty}}{ for colour breaks at pretty numbers} \item{\code{at}}{to specify at which values colours change} \item{\code{as.table}}{to 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} and \link{levelplot}. 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 a list with its first argument 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. Plot order and prevalence of sp.layout items: for points and lines, sp.layout items are drawn before the points (to allow for grids and polygons); for grids and polygons sp.layout is drawn afterwards (so the item will not be overdrawn by the grid and/or polygon). Transparency may further help when combining things. Items of the \code{sp.layout} list, or its elements, can be: \describe{ \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) panels in which the layout item should be drawn. Without a \code{which} item, layout items are drawn in each panel.} \item{\code{first}}{logical; should the layout item be drawn before the main spplot object (TRUE), or after (FALSE)? This overrides the default order.} } \code{sp.theme} returns a lattice theme; use, after loading package \code{lattice}, the command \code{trellis.par.set(sp.theme())} after a device is opened or changed to make this work. Currently, this only sets the colors to \link{bpy.colors}. If the attributes to be plotted are of type factor, spplot tries to create a legend that reflects this. In this case, the color ramp passed needs to be of the same length as the number of factor levels. The factor levels are derived from the first map; subsequent factors with different factor levels result in an error. } \references{ \url{http://r-spatial.sourceforge.net/} } \seealso{\link[lattice]{xyplot}, \link[lattice]{levelplot}, \link[lattice]{panel.identify} to identify objects } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \examples{ library(lattice) trellis.par.set(sp.theme()) # sets bpy.colors() ramp data(meuse) coordinates(meuse) <- ~x+y 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")) } data(meuse.grid) gridded(meuse.grid)=~x+y 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")) spplot(meuse.grid, c("f","g"), col.regions=bpy.colors(10)) } \keyword{dplot} sp/man/spTransform.Rd0000644000175100001440000000133512147465552014307 0ustar hornikusers\name{spTransform} \alias{spTransform-methods} \alias{spTransform,ANY,ANY-method} \alias{spTransform,ANY,CRS-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}} \item{...}{further arguments} } \value{ object with coordinates transformed to the new coordinate reference system. } \note{ Package \code{sp} only provides the definition of the generic, methods doing actual transformation are found in package \code{rgdal}, see \link[rgdal]{spTransform} } \keyword{methods} \keyword{spatial} sp/man/is.projected.Rd0000644000175100001440000000461512162132256014353 0ustar hornikusers\name{is.projected} \alias{is.projected} \alias{proj4string} \alias{proj4string<-} \alias{is.projected,Spatial-method} \alias{proj4string,Spatial-method} \alias{proj4string<-,Spatial,CRS-method} \alias{proj4string<-,Spatial,character-method} \alias{get_ll_warn} \alias{get_ll_TOL} \alias{set_ll_warn} \alias{set_ll_TOL} \alias{get_ReplCRS_warn} \alias{set_ReplCRS_warn} \title{ Sets or retrieves projection attributes on classes extending SpatialData } \description{ Sets or retrieves projection attributes on classes extending SpatialData; set or retrieve option value for error or warning on exceedance of geographical coordinate range, set or retrieve option value for exceedance tolerance of geographical coordinate range. Note that only \dQuote{+proj=longlat} is accepted for geographical coordinates, which must be ordered (eastings, northings).} \usage{ is.projected(obj) proj4string(obj) proj4string(obj) <- value get_ll_warn() get_ll_TOL() get_ReplCRS_warn() set_ll_warn(value) set_ll_TOL(value) set_ReplCRS_warn(value) } \arguments{ \item{obj}{An object of class or extending \link{Spatial-class}} \item{value}{For \code{proj4string} CRS object, containing a valid proj4 string; attempts to assign an object containing \dQuote{longlat} to data extending beyond longitude [-180, 360] or lattitude [-90, 90] will be stopped. For \code{set_ll_warn} a single logical value, if FALSE (default) error on range exceedance, if TRUE, warning. For \code{set_ll_TOL} the value of the power of \code{.Machine$double.eps} (default 0.25) to use as tolerance in testing range exceedance. \code{set_ReplCRS_warn} may be used to turn off warnings issued when changing object CRS with the \code{proj4string} replacement method (by setting \code{value=FALSE}).} } \value{ \code{is.projected} returns a logical; \code{proj4string} returns a character vector of length 1; \code{spatial.dimension} returns the number of spatial dimensions (2 or 3). } \details{ proj4 strings are operative through CRAN package rgdal. For strings defined as \dQuote{longlat}, the minimum longitude should be -180, the maximum longitude 360, the minimum latitude -90, and the maximum latitude 90. Note that the \code{proj4string} replacement method does not project spatial data - for this use \code{spTransform} methods in the rgdal package.} \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \link{CRS} } %\examples{} \keyword{spatial} sp/man/dimensions.Rd0000644000175100001440000000150611635334430014130 0ustar hornikusers\name{dimensions-methods} \docType{methods} \alias{dimensions,Spatial-method} \alias{dimensions} \title{ retrieve spatial dimensions from spatial data} \description{ retrieves spatial dimensions box from spatial data } \usage{ dimensions(obj) } \arguments{ \item{obj}{ object deriving from class "Spatial" } } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ object deriviving from class "Spatial" } }} \value{ two-column matrix; the first column has the minimum, the second the maximum values; rows represent the spatial dimensions} \keyword{methods} \examples{ # just 9 points on a grid: x <- c(1,1,1,2,2,2,3,3,3) y <- c(1,2,3,1,2,3,1,2,3) xy <- cbind(x,y) S <- SpatialPoints(xy) dimensions(S) # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE dimensions(meuse.grid) } \keyword{methods} sp/man/Spatial-class.Rd0000644000175100001440000001012312202500651014442 0ustar hornikusers\name{Spatial-class} \docType{class} \alias{Spatial-class} \alias{Spatial} \alias{print.summary.Spatial} \alias{subset.Spatial} \alias{summary,Spatial-method} \alias{plot,Spatial,missing-method} \alias{getParUsrBB} \alias{setParUsrBB} \alias{coordinates<-,Spatial-method} \alias{[[<-,Spatial,ANY,missing-method} \alias{[<-,Spatial-method} \alias{[[,Spatial,ANY,missing-method} \alias{$<-,Spatial-method} \alias{$,Spatial-method} \alias{im-class} \alias{owin-class} \alias{ppp-class} \alias{psp-class} \title{Class "Spatial"} \description{ An abstract class from which useful spatial classes are derived } \section{Objects from the Class}{ are never to be generated; only derived classes can be meaningful } \section{Slots}{ \describe{ \item{\code{bbox}:}{Object of class \code{"matrix"}; 2-column matrix holding the minimum in first and maximum in second column for the x-coordinate (first row), y-coordinate (second row) and optionally, for points and grids only, further coordinates. The constructed Spatial object will be invalid if any bbox values are NA or infinite. The column names must be \code{c("min", "max")}} \item{\code{proj4string}:}{Object of class \code{"CRS"}; holding a valid proj4 string, which can be used for unprojecting or reprojecting coordinates; it is initialised to NA. Other strings are checked for validity in the rgdal package, but attempts to assign a string containing "longlat" to data extending beyond longitude [-180, 360] or lattitude [-90, 90] will be stopped or warned, use \code{\link{set_ll_warn}} to warn rather than stop, and \code{\link{set_ll_TOL}} to change the default tolerance for the range exceedance tests.} } } \section{Methods}{ \describe{ \item{bbox}{\code{signature(obj = "Spatial")}: retrieves the bbox element } \item{dimensions}{\code{signature(obj = "Spatial")}: retrieves the number of spatial dimensions spanned } \item{gridded}{\code{signature(obj = "Spatial")}: logical, tells whether the data is on a regular spatial grid } \item{plot}{\code{signature(x = "Spatial", y = "missing")}: plot method for spatial objects; does nothing but setting up a plotting region choosing a suitable aspect if not given(see below), colouring the plot background using either a bg= argument or par("bg"), and possibly drawing axes. } \item{summary}{\code{signature(object = "Spatial")}: summarize object} } } \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{...}{ignored} } \author{ r-spatial team; Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} Roger Bivand, Barry Rowlingson, Virgilio G\'omez-Rubio } \note{ The default aspect for map plots is 1; if however data are not projected (coordinates are longlat), the aspect is by default set to 1/cos(My * pi)/180) with My the y coordinate of the middle of the map (the mean of ylim, which defaults to the y range of bounding box). The argument \code{setParUsrBB} may be used to pass the logical value \code{TRUE} to functions within \code{plot.Spatial}. When set to \code{TRUE}, par(\dQuote{usr}) will be overwritten with \code{c(xlim, ylim)}, which defaults to the bounding box of the spatial object. This is only needed in the particular context of graphic output to a specified device with given width and height, to be matched to the spatial object, when using par(\dQuote{xaxs}) and par(\dQuote{yaxs}) in addition to \code{par(mar=c(0,0,0,0))}. } \section{Warning }{this class is not useful in itself, but all spatial classes in this package derive from it } \seealso{ \code{\link{SpatialPoints-class}}, \code{\link{SpatialGrid-class}}, % \code{\link{SpatialPolygons-class}}, % \code{\link{SpatialArcs-class}}, \code{\link{SpatialPointsDataFrame-class}}, \code{\link{SpatialGridDataFrame-class}} % \code{\link{SpatialPolygonsDataFrame-class}}, } %\examples{} \keyword{classes} sp/man/gridindex2nb.Rd0000644000175100001440000000237111712273546014346 0ustar hornikusers\name{gridIndex2nb} \alias{gridIndex2nb} \title{create neighbourhood (nb) object from grid geometry} \description{create neighbourhood (nb) object from grid geometry} \usage{ gridIndex2nb(obj, maxdist = sqrt(2), fullMat = TRUE, ...) } \arguments{ \item{obj}{object of class \link{SpatialGrid} or \link{SpatialPixels}} \item{maxdist}{ maximum distance to be considered (inclusive), expressed in number of grid cell (sqrt(2) results in queen neighbours) } \item{fullMat}{ use \link{dist} to compute distances from grid (row/col) indices; FALSE avoids forming the full distance matrix, at a large performance cost } \item{...}{ arguments passed on to \link{dist}} } \value{Object of class nb, which is a list. The nb object follows the convention of nb objects in package spdep; it is a list with each list element corresponding to a grid cell or pixel; the list element contains the indices of neighbours defined as cells less than maxdist away, measured in cell unit (N/S/E/W neighbour has distance 1). } \note{ Unequal grid cell size is ignored; grid cell row/col indices are taken to be the coordinates from which distances are computed. } \seealso{plot.nb in package spdep} \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } %\examples{} \keyword{manip} sp/man/Rlogo.Rd0000644000175100001440000000221611635334430013041 0ustar hornikusers\name{Rlogo} \alias{Rlogo} \alias{gt} \docType{data} \title{Rlogo jpeg image} \description{ Rlogo jpeg image data as imported by \code{getRasterData} in the rgdal package } \usage{data(Rlogo)} \format{ The format is: int [1:101, 1:77, 1:3] 255 255 255 255 255 255 255 255 255 255 ... } \examples{ \dontrun{ library(rgdal) logo <- system.file("pictures/Rlogo.jpg", package="rgdal")[1] x <- GDAL.open(logo) gt = .Call('RGDAL_GetGeoTransform', x, PACKAGE="rgdal") data <- getRasterData(x) GDAL.close(x) } data(Rlogo) d = dim(Rlogo) cellsize = abs(c(gt[2],gt[6])) cells.dim = c(d[1], d[2]) # c(d[2],d[1]) cellcentre.offset = c(x = gt[1] + 0.5 * cellsize[1], y = gt[4] - (d[2] - 0.5) * abs(cellsize[2])) grid = GridTopology(cellcentre.offset, cellsize, cells.dim) df = as.vector(Rlogo[,,1]) for (band in 2:d[3]) df = cbind(df, as.vector(Rlogo[,,band])) df = as.data.frame(df) names(df) = paste("band", 1:d[3], sep="") Rlogo <- SpatialGridDataFrame(grid = grid, data = df) summary(Rlogo) spplot(Rlogo, zcol=1:3, names.attr=c("red","green","blue"), col.regions=grey(0:100/100), main="example of three-layer (RGB) raster image", as.table=TRUE) } \keyword{datasets} sp/man/SpatialPointsDataFrame-class.Rd0000644000175100001440000000645512162361100017420 0ustar hornikusers\name{SpatialPointsDataFrame-class} \docType{class} \alias{SpatialPointsDataFrame-class} \alias{[,SpatialPointsDataFrame-method} \alias{coerce,SpatialPointsDataFrame,data.frame-method} \alias{coerce,SpatialPointsDataFrame,SpatialPoints-method} \alias{show,SpatialPointsDataFrame-method} \alias{points,SpatialPointsDataFrame-method} \alias{coordinates,SpatialPointsDataFrame-method} \alias{as.data.frame.SpatialPointsDataFrame} \alias{dim.SpatialPointsDataFrame} \alias{print.SpatialPointsDataFrame} \alias{ShowSpatialPointsDataFrame} \alias{as.SpatialPoints.SpatialPointsDataFrame} \alias{rbind.SpatialPointsDataFrame} \alias{row.names.SpatialPointsDataFrame} \alias{coerce,ppp,SpatialPointsDataFrame-method} \title{Class "SpatialPointsDataFrame" } \description{ Class for spatial attributes that have spatial point locations } \section{Objects from the Class}{ Objects can be created by calls of the form \code{coordinates(x) = c("x", "y") }. or of the form \code{coordinates(x) = xy}; see \link{coordinates}. } \section{Slots}{ \describe{ \item{\code{data}:}{Object of class data.frame containing the attribute data (may or may not contain the coordinates in its columns) } \item{\code{coords}:}{Object of class \code{"matrix"}; the coordinates matrix (points are rows in the matrix) } \item{\code{coords.nrs}}{Object of class logical; if TRUE, when the object was created the coordinates were retrieved from the data.frame, and hence stripped from it; after coercion to data.frame, e.g. by as.data.frame(x), coordinates will again be added (as first few columns) to the data.frame } \item{\code{bbox}:}{Object of class \code{"matrix"}; bounding box} \item{\code{proj4string}:}{Object of class \code{"CRS"}; projection string} } } \section{Extends}{ Class \code{"SpatialPoints"}, directly. Class \code{"Spatial"}, by class \code{"SpatialPoints"}. } \usage{ \S4method{[}{SpatialPointsDataFrame}(x, i, j, ..., drop = TRUE) \S4method{coerce}{SpatialPointsDataFrame,SpatialPoints}(from, to, strict=TRUE) \S4method{coerce}{SpatialPointsDataFrame,data.frame}(from, to, strict=TRUE) \S4method{coordinates}{SpatialPointsDataFrame}(obj) \S4method{show}{SpatialPointsDataFrame}(object) \S4method{points}{SpatialPointsDataFrame}(x) \method{rbind}{SpatialPointsDataFrame}(...) } \arguments{ \item{x,from,obj,object}{\code{SpatialPointsDataFrame} object} \item{to}{class to which to coerce} \item{strict}{see \code{\link[methods]{as}}} \item{i}{row indices} \item{j}{column indices} \item{drop}{see \code{\link[base]{Extract}}} \item{...}{indices passed through} } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{coordinates}}, \code{\link{SpatialPoints-class}} } \examples{ data(meuse) xy = meuse[c("x", "y")] # retrieve coordinates as data.frame class(meuse) data(meuse) # reload data.frame coordinates(meuse) = c("x", "y") # specify column names class(meuse) data(meuse) # reload data.frame coordinates(meuse) = c(1, 2) # specify column names class(meuse) data(meuse) # reload data.frame coordinates(meuse) = ~x+y # formula class(meuse) data(meuse) # reload data.frame coordinates(meuse) = xy # as data frame class(meuse) data(meuse) # reload data.frame coordinates(meuse) = as.matrix(xy) # as matrix meuse$log.zn = log(meuse$zinc) class(meuse) dim(meuse) } \keyword{classes} sp/man/recenter-methods.Rd0000644000175100001440000000414712162333243015231 0ustar hornikusers\name{recenter-methods} \docType{methods} \alias{recenter-methods} \alias{recenter} \alias{recenter,SpatialPolygons-method} \alias{recenter,Polygons-method} \alias{recenter,Polygon-method} \alias{recenter,SpatialLines-method} \alias{recenter,Lines-method} \alias{recenter,Line-method} \title{Methods for Function recenter in Package `sp'} \description{ Methods for function \code{recenter} in package \pkg{sp} to shift or re-center geographical coordinates for a Pacific view. All longitudes < 0 are added to 360, to avoid for instance parts of Alaska being represented on the far left and right of a plot because they have values straddling 180 degrees. In general, using a projected coordinate reference system is to be prefered, but this method permits a geographical coordinate reference system to be used. This idea was suggested by Greg Snow, and corresponds to the two world representations in the \pkg{maps} package. } \section{Methods}{ \describe{ \item{obj = "SpatialPolygons"}{recenter a SpatialPolygons object} \item{obj = "Polygons"}{recenter a Polygons object } \item{obj = "Polygon"}{recenter an Polygon object } \item{obj = "SpatialLines"}{recenter a SpatialLines object } \item{obj = "Lines"}{recenter a Lines object } \item{obj = "Line"}{recenter an Line object } }} \examples{ crds <- matrix(c(179, -179, -179, 179, 50, 50, 52, 52), ncol=2) SL <- SpatialLines(list(Lines(list(Line(crds)), "1")), CRS("+proj=longlat")) 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")) 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")) 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")) bbox(SpP) SpPr <- recenter(SpP) bbox(SpPr) opar <- par(mfrow=c(1,2)) plot(SpP) plot(SpPr) par(opar) } \keyword{methods} sp/man/as.SpatialPolygons.PolygonsList.Rd0000644000175100001440000000633411635334430020163 0ustar hornikusers\name{as.SpatialPolygons.PolygonsList} \alias{as.SpatialPolygons.PolygonsList} %\alias{as.SpatialPolygons.Shapes} %\alias{as.SpatialPolygons.map} %\alias{as.SpatialPolygons.pal} %- Also NEED an '\alias' for EACH other topic documented here. \title{Making SpatialPolygons objects} \description{ This function is used in making SpatialPolygons objects from other formats. } \usage{ as.SpatialPolygons.PolygonsList(Srl, proj4string=CRS(as.character(NA))) %as.SpatialPolygons.Shapes(shapes, IDs, proj4string=CRS(as.character(NA))) %as.SpatialPolygons.map(map, IDs, proj4string=CRS(as.character(NA))) %as.SpatialPolygons.pal(arc, pal, IDs, dropPoly1=TRUE, proj4string=CRS(as.character(NA))) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{Srl}{A list of Polygons objects} % \item{shapes}{The Shapes component of a Map object as read by \code{read.shape}} % \item{IDs}{Unique character ID values for each output Polygons object; the input IDs can be an integer or character vector with duplicates, where the duplicates will be combined as a single output Polygons object} \item{proj4string}{Object of class \code{"CRS"}; holding a valid proj4 string} % \item{map}{Object returned by \code{map} containing polygon boundaries} % \item{arc}{Object returned by \code{get.arcdata}} % \item{pal}{Object returned by \code{get.paldata}} % \item{dropPoly1}{Should the first polygon in the AVC or e00 data be dropped; the first polygon is typically the compound boundary of the whole dataset, and can be detected by looking at the relative lengths of the list components in the second component of pal, which are the numbers of arcs making up the boundary of each polygon} } \value{ The functions return a SpatialPolygons object } \author{ Roger Bivand } \examples{ %\dontrun{ %library(maptools) %nc.shp <- read.shape(system.file("shapes/sids.shp", package="maptools")[1]) %} %data(ncshp) %nc1 <- as.SpatialPolygons.Shapes(nc.shp$Shapes, as.character(nc.shp$att.data$FIPS)) %plot(nc1) %invisible(text(coordinates(nc1), labels=getSpPPolygonsIDSlots(nc1), cex=0.6)) %\dontrun{ %library(maps) %ncmap <- map("county", "north carolina", fill=TRUE, col="transparent", plot=FALSE) %} %data(ncmap) %IDs <- sapply(strsplit(ncmap$names, "[,:]"), function(x) x[2]) %nc2 <- as.SpatialPolygons.map(ncmap, IDs) %plot(nc2) %invisible(text(coordinates(nc2), labels=getSpPPolygonsIDSlots(nc2), cex=0.6)) %\dontrun{ %library(RArcInfo) %fl <- "http://www.census.gov/geo/cob/bdy/co/co90e00/co37_d90_e00.zip" %download.file(fl, "co37_d90_e00.zip") %e00 <- zip.file.extract("co37_d90.e00", "co37_d90_e00.zip") %e00toavc(e00, "nc") %arc <- get.arcdata(".", "nc") %pal <- get.paldata(".", "nc") %pat <- get.tabledata("info", "NC.PAT") %} %data(co37_d90_arc) %data(co37_d90_pal) %sapply(pal[[2]], function(x) length(x[[1]])) %data(co37_d90_pat) %IDs <- paste(pat$ST[-1], pat$CO[-1], sep="") %nc3 <- as.SpatialPolygons.pal(arc, pal, IDs=IDs) %plot(nc3) %invisible(text(coordinates(nc3), labels=sapply(slot(nc3, "polygons"), function(i) slot(i, "ID")), cex=0.6)) grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as.SpatialPolygons.GridTopology(grd) plot(polys) text(coordinates(polys), labels=sapply(slot(polys, "polygons"), function(i) slot(i, "ID")), cex=0.6) } \keyword{spatial} sp/man/bbox.Rd0000644000175100001440000000250211635334430012707 0ustar hornikusers\name{bbox-methods} \docType{methods} \alias{bbox,Spatial-method} \alias{bbox,ANY-method} \alias{bbox,Line-method} \alias{bbox,Lines-method} \alias{bbox,Polygon-method} \alias{bbox,Polygons-method} \alias{bbox} \title{ retrieve bbox from spatial data} \description{ retrieves spatial bounding box from spatial data } \usage{ bbox(obj) } \arguments{ \item{obj}{ object deriving from class "Spatial", or one of classes: "Line", "Lines", "Polygon" or "Polygons", or ANY, which requires obj to be an array with at least two columns } } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ object deriving from class "Spatial" } \item{obj = "ANY"}{ an array with at least two columns } \item{obj = "Line"}{ object deriving from class "Line" } \item{obj = "Lines"}{ object deriving from class "Lines" } \item{obj = "Polygon"}{ object deriving from class "Polygon" } \item{obj = "Polygons"}{ object deriving from class "Polygons" } }} \value{ two-column matrix; the first column has the minimum, the second the maximum values; rows represent the spatial dimensions} \keyword{methods} \examples{ # just 9 points on a grid: x <- c(1,1,1,2,2,2,3,3,3) y <- c(1,2,3,1,2,3,1,2,3) xy <- cbind(x,y) S <- SpatialPoints(xy) bbox(S) # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE bbox(meuse.grid) } \keyword{spatial} sp/man/coordinates.Rd0000644000175100001440000000264512235015055014273 0ustar hornikusers\name{coordinates} \alias{coordinates} \alias{coordinates<-} \title{ set spatial coordinates to create a Spatial object, or retrieve spatial coordinates from a Spatial object} \description{ set spatial coordinates to create a Spatial object, or retrieve spatial coordinates from a Spatial object} \usage{ coordinates(obj, ...) coordinates(object) <- value } \arguments{ \item{obj}{ object deriving from class "Spatial" } \item{object}{ object of class "data.frame" } \item{value}{ spatial coordinates; either a matrix, list, or data frame with numeric data, or column names, column number or a reference: a formula (in the form of e.g. \code{~x+y}), column numbers (e.g. \code{c(1,2)}) or column names (e.g. \code{c("x","y")}) specifying which columns in \code{object} are the spatial coordinates. If the coordinates are part of object, giving the reference does not duplicate them, giving their value does duplicate them in the resulting structure. } \item{...}{additional arguments that may be used by particular methods} } \value{ usually an object of class SpatialPointsDataFrame; if the coordinates set cover the full set of variables in object, an object of class SpatialPoints is returned } \examples{ # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE class(meuse.grid) bbox(meuse.grid) data(meuse) meuse.xy = meuse[c("x", "y")] coordinates(meuse.xy) <- ~x+y class(meuse.xy) } \keyword{manip} sp/man/SpatialPolygons-class.Rd0000644000175100001440000001250012172001331016173 0ustar hornikusers\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{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} } } \details{ The \code{plot} method for spatial polygons takes the following arguments: \describe{ \item{x}{a SpatialPolygons object} \item{col}{a vector of colour values} \item{border}{default \code{par("fg")}; the colour to draw the border} \item{add}{default FALSE; if TRUE, add to existing plot} \item{xlim, ylim}{default NULL; ranges for the plotted \sQuote{x} and \sQuote{y} values} \item{xpd}{default NULL; controls clipping, see \code{\link[graphics]{par}}} \item{density}{default NULL; the density of shading lines, in lines per inch, see \code{\link[graphics]{polygon}}} \item{angle}{default 45; the slope of shading lines, given as an angle in degrees (counter-clockwise), see \code{\link[graphics]{polygon}}} \item{pbg}{default NULL, set to \code{par("bg")} by default \dQuote{transparent}; the colour to paint holes} \item{axes}{default FALSE; draw axes} \item{lty}{default \code{par("lty")}; border line type} \item{...}{other arguments passed through} \item{setParUsrBB}{default FALSE; see \code{\link{Spatial-class}} for further details} \item{usePolypath}{default NULL to set from option value; use \code{\link[graphics]{polypath}} for hole-handling in plot} \item{rule}{default NULL to set from option value; character value specifying the path fill mode, see \code{\link[graphics]{polypath}}} } The options for \code{usePolypath} and \code{rule} may be retrieved with \code{get_Polypath} (default TRUE on package load) and \code{get_PolypathRule} (default \dQuote{winding} on package load), and set with \code{set_Polypath} and \code{set_PolypathRule} The class definitions used for polygons in \pkg{sp} do not accord with those of the simple features specification of the Open Geospatial Consortium. The \pkg{rgeos} package, an interface to Geometry Engine -- Open Source (GEOS), uses this specification, in which each hole (interior ring) must be associated with its containing exterior ring. In order to avoid introducing incompatible changes into the class definition of Polygons objects, a comment has been added as a single character string to each such object. Here we can trust the data source to assign the hole status correctly, and use the simple function \code{\link[rgeos]{createSPComment}} to add such comments to each Polygons member of the polygons slot of this SpatialPolygons object. Exterior rings are coded zero, while interior rings are coded with the 1-based index of the exterior ring to which they belong. SpatialPolygons objects created by reading using \code{\link[rgdal]{readOGR}} from \pkg{rgdal} have the comments set on input, as OGR also uses SFS. } \note{ \code{rbind} calls the function \code{\link{SpatialPolygons}}, where it is checked that all IDs are unique. If \code{rbind}-ing \code{SpatialPolygons} without unique IDs, it is possible to set the argument \code{makeUniqueIDs = TRUE}, although it is preferred to change these explicitly with \code{\link{spChFIDs}}. } \author{ Roger Bivand } \seealso{ \code{\link{SpatialPolygons}} } \examples{ # simple example, from vignette("sp"): Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) plot(SpP, col = 1:3, pbg="white") grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as(grd, "SpatialPolygons") plot(polys) text(coordinates(polys), labels=row.names(polys)) } \keyword{classes} sp/man/SpatialLines-class.Rd0000644000175100001440000000445711635334430015463 0ustar hornikusers\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{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}}. } \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)) 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")) } \keyword{classes} sp/man/polygons-methods.Rd0000644000175100001440000000143411635334430015273 0ustar hornikusers\name{polygons-methods} \docType{methods} \alias{polygons-methods} \alias{polygons,Spatial-method} \alias{polygons,SpatialPolygons-method} \alias{polygons<-,data.frame,SpatialPolygons-method} \title{ Retrieve polygons from SpatialPolygonsDataFrame object } \description{ Retrieve polygons from SpatialPolygonsDataFrame object } \section{Methods for polygons}{ \describe{ \item{obj = "SpatialPolygons"}{ object of, or deriving from, SpatialPolygons } \item{obj = "SpatialPolygonsDataFrame"}{ object of, or deriving from, SpatialPolygonsDataFrame } }} \section{Methods for "polygons<-"}{ \describe{ \item{object = "data.frame", value="SpatialPolygons"}{ promote data.frame to object of class \link{SpatialPolygonsDataFrame-class}, by specifying polygons } }} \keyword{methods} \keyword{spatial} sp/man/panel.Rd0000644000175100001440000000713312222367331013060 0ustar hornikusers\name{panel.spplot} \alias{panel.spplot} \alias{panel.gridplot} \alias{panel.pointsplot} \alias{panel.polygonsplot} \alias{spplot.key} % needs docs! \alias{SpatialPolygonsRescale} \alias{sp.lines} \alias{sp.points} \alias{sp.polygons} \alias{sp.text} \alias{sp.grid} \alias{sp.panel.layout} \alias{longlat.scales} \alias{bbexpand} \title{panel and panel utility functions for spplot} \description{panel functions for spplot functions, and functions that can be useful within these panel functions } \usage{ spplot.key(sp.layout, rows = 1, cols = 1) SpatialPolygonsRescale(obj, offset, scale = 1, fill = "black", col = "black", plot.grid = TRUE, ...) sp.lines(obj, col = 1, ...) sp.points(obj, pch = 3, ...) sp.polygons(obj, col = 1, fill = "transparent", ...) sp.grid(obj, col = 1, alpha = 1,..., at = pretty(obj[[1]]), col.regions = col) sp.text(loc, txt, ...) sp.panel.layout(lst, p.number, ...) bbexpand(x, fraction) } \arguments{ \item{sp.layout}{ list; see \link{spplot} for definition } \item{rows}{ integer; panel row(s) for which the layout should be drawn } \item{cols}{ integer; panel column(s) for which the layout should be drawn } \item{obj}{ object of class \link{SpatialPolygons-class} for \code{SpatialPolygonsRescale}; of class \link{SpatialLines-class}, \link{Lines-class} or \link{Line-class} for \code{sp.lines} of a class that has a \link{coordinates-methods} for \code{sp.points}; of class \link{SpatialPolygons-class} for \code{sp.polygons}. When obj is character, the actual object is retrieved by \code{get(obj)} before its class is evaluated. } \item{offset}{ offset for shifting a Polygons object } \item{scale}{ scale for rescaling } \item{fill}{ fill color } \item{col}{ line color } \item{plot.grid}{logical; plot through grid functions (TRUE), or through traditional graphics functions (FALSE)} \item{pch}{ plotting character } \item{at}{ numeric; values at which colour breaks should occur } \item{col.regions}{ colours to fill the grid cells, defaults to col } \item{loc}{ numeric vector of two elements } \item{txt}{ text to be plotted } \item{alpha}{ alpha (transparency) level } \item{lst}{ sp.layout argument, see \link{spplot}} \item{p.number}{ panel number; in a panel, panel.number() should be passed to this argument } \item{x}{length two numeric vector, containing a range} \item{fraction}{fraction to expand the range by} \item{...}{ arguments passed to the underlying panel, lattice or grid functions } } \note{ The panel functions of \link{spplot}, \code{panel.gridplot} for grids, \code{panel.pointsplot} for points, or \code{panel.polygonsplot} for lines or polygons can be called with arguments \code{(x,y,...)}. Customizing spplot plots can be done by extending the panel function, or by supplying an sp.layout argument; see the documentation for \link{spplot}. Inside these panel functions, \code{sp.panel.layout} is called to deal with plotting the items in a \code{sp.layout} object. \code{SpatialPolygonsRescale} scales and shifts an object of class \link{SpatialPolygons-class}; this is useful e.g. for scale bars, or other layout items. \code{sp.lines}, \code{sp.points}, \code{sp.polygons} and \code{sp.text} plot lines, points, polygons or text in a panel. \code{spplot.key} draws the \code{sp.layout} object at given rows/cols. \code{sp.pagefn} can be passed as a \code{page} argument, and will call function \code{spplot.key} for the last panel drawn on a page. } \references{ \url{http://r-spatial.sourceforge.net/} has a graph gallery with examples with R code. } \seealso{\link{spplot}, \link{spplot-methods}} \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } %\examples{} \keyword{dplot} sp/man/loadmeuse.Rd0000644000175100001440000000047312117371633013742 0ustar hornikusers\name{loadMeuse} \alias{loadMeuse} \title{ deprecated function to load the Meuse data set } \description{ deprecated function to load the Meuse data set } \usage{ loadMeuse() } \value{ none; it prints a warning to run demo(meuse) } \seealso{\link{meuse}, \link{meuse.grid}} \examples{ demo(meuse) } \keyword{dplot} sp/man/gridlines.Rd0000644000175100001440000000451212162333243013735 0ustar hornikusers\name{gridlines} \alias{gridlines} \alias{gridat} \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; \code{gridat} permits the construction of points and labels for non-projected grid annotation } \usage{ gridlines(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), ndiscr = 20) gridat(x, easts = pretty(bbox(x)[1,]), norths = pretty(bbox(x)[2,]), offset=0.5, side="WS") } \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{side}{default \dQuote{WS}, if \dQuote{EN} labels placed on the top and right borders} } \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} \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}, using example code of Roger Bivand. } \seealso{ \link[rgdal]{spTransform}; llgridlines in \code{rgdal} (recent versions) for plotting long-lat grid over projected data } \examples{ data(meuse) coordinates(meuse) = ~x+y plot(meuse) plot(gridlines(meuse), add=TRUE) title("default gridlines within Meuse bounding box") if (require(rgdal)) { proj4string(meuse) <- CRS("+init=epsg:28992") meuse_ll <- spTransform(meuse, CRS("+proj=longlat +datum=WGS84")) grd <- gridlines(meuse_ll) grd_x <- spTransform(grd, CRS("+init=epsg:28992")) plot(meuse) plot(grd_x, add=TRUE, lty=2) grdat_ll <- gridat(meuse_ll) grdat_x <- spTransform(grdat_ll, CRS("+init=epsg:28992")) text(coordinates(grdat_x), labels=parse(text=grdat_x$labels), pos=grdat_x$pos, offset=grdat_x$offset) 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(coordinates(grdat_x), labels=parse(text=grdat_x$labels), pos=grdat_x$pos, offset=grdat_x$offset) } } \keyword{spatial} sp/man/Polygon-class.Rd0000644000175100001440000000223111635334430014506 0ustar hornikusers\name{Polygon-class} \docType{class} \alias{Polygon-class} \title{Class "Polygon" } \description{ class for spatial polygon } \section{Objects from the Class}{ Objects can be created by calls to the function \code{Polygon} } \section{Slots}{ \describe{ \item{\code{ringDir}:}{Object of class \code{"integer"}; the ring direction of the ring (polygon) coordinates, holes are expected to be anti-clockwise } \item{\code{labpt}:}{Object of class \code{"numeric"}; an x, y coordinate pair forming the label point of the polygon } \item{\code{area}:}{Object of class \code{"numeric"}; the planar area of the polygon, does not respect projection as objects of this class have no projection defined } \item{\code{hole}:}{Object of class \code{"logical"}; does the polygon seem to be a hole } \item{\code{coords}:}{Object of class \code{"matrix"}; coordinates of the polygon; first point should equal the last point } } } \section{Extends}{ Class \code{"Line"}, directly. } \section{Methods}{ No methods defined with class "Polygon" in the signature. } \author{ Roger Bivand } \seealso{\link{Polygons-class}, \link{SpatialPolygons-class}} \keyword{classes} sp/man/meuse.grid_ll.Rd0000644000175100001440000000074611635334430014516 0ustar hornikusers\name{meuse.grid_ll} \alias{meuse.grid_ll} \docType{data} \title{Prediction Grid for Meuse Data Set, geographical coordinates} \description{ The object contains the meuse.grid data as a SpatialPointsDataFrame after transformation to WGS84 and geographical coordinates. } \usage{data(meuse.grid_ll)} \format{ The format is: Formal class 'SpatialPointsDataFrame' [package "sp"]. } \source{ See the \link{meuse} documentation } \examples{ data(meuse.grid_ll) } \keyword{datasets} sp/man/SpatialLines.Rd0000644000175100001440000000407312120055270014342 0ustar hornikusers\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}{default return scalar length of sum of segments in Line, if FALSE, return vector of segment lengths} } \value{ \code{SpatialLines} returns object of class \code{SpatialLines}; \code{SpatialLinesDataFrame} returns object of class \code{SpatialLinesDataFrame} \code{getSpatialLinesMidPoints} returns an object of class \code{SpatialPoints},each point containing the (weighted) mean of the lines elements; weighted in the sense that mean is called twice. } \seealso{ \link{SpatialLines-class} } \keyword{manip} sp/man/as.SpatialPolygons.GridTopology.Rd0000644000175100001440000000534212271005522020127 0ustar hornikusers\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{ df = as.data.frame(meuse.grid[xx,]) x = SpatialPolygonsDataFrame(xxpl, df, match.ID = FALSE) spplot(x, "dist") spplot(aggregate(meuse.grid[,1:3], xxpl), main = "aggregated meuse.grid") } } \keyword{spatial} sp/man/image.Rd0000644000175100001440000001352112271535162013044 0ustar hornikusers\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 gridded spatial data, or convert to format for image } \description{ Convert gridded data in SpatialGridDataFrame to image format; call image on data in SpatialGridDataFrame format. The aspect ratio is set as either 1 for projected data, or stretched by distance from Equator for geographical coordinates. } \usage{ \method{image}{SpatialGridDataFrame}(x, attr = 1, xcol = 1, ycol = 2, col = heat.colors(12), red=NULL, green=NULL, blue=NULL, axes = FALSE, xlim = NULL, ylim = NULL, add = FALSE, ..., asp = NA, setParUsrBB=FALSE, interpolate = FALSE, angle = 0, useRasterImage = (!.isSDI() && missing(breaks)), breaks, zlim = range(as.numeric(x[[attr]])[is.finite(x[[attr]])])) \method{image}{SpatialPixelsDataFrame}(x, ...) \method{image}{SpatialPixels}(x, ...) \method{contour}{SpatialGridDataFrame}(x, attr = 1, xcol = 1, ycol = 2, col = 1, add = FALSE, xlim = NULL, ylim = NULL, axes = FALSE, ..., setParUsrBB = FALSE) \method{contour}{SpatialPixelsDataFrame}(x, ...) as.image.SpatialGridDataFrame(x, xcol = 1, ycol = 2, attr = 1) image2Grid(im, p4 = as.character(NA), digits=10) } \arguments{ \item{x}{ object of class \link{SpatialGridDataFrame} } \item{attr}{ column of attribute variable; this may be the column name in the data.frame of \code{data} (as.data.frame(data)), or a column number } \item{xcol}{ column number of x-coordinate, in the coordinate matrix } \item{ycol}{ column number of y-coordinate, in the coordinate matrix } \item{col}{a vector of colors } \item{red,green,blue}{columns names or numbers given instead of the \code{attr} argument when the data represent an image encoded in three colour bands on the 0-255 integer scale; all three columns must be given in this case, and the attribute values will be constructed using function \code{rgb} } %\item{asp}{ aspect ratio of unit x and unit y axis } \item{axes}{ logical; should coordinate axes be drawn? } \item{xlim}{ x-axis limits } \item{ylim}{ y-axis limits } \item{zlim}{ data limits for plotting the (raster, attribute) values } \item{add}{ logical; if FALSE, the image is added to the plot layout setup by \code{plot(as(x, "Spatial"),axes=axes,xlim=xlim,ylim=ylim,asp=asp)} which sets up axes and plotting region; if TRUE, the image is added to the existing plot. } \item{...}{ arguments passed to \link{image}, see examples } \item{asp}{ aspect ratio to be used for plot } \item{setParUsrBB}{default FALSE, see \code{\link{Spatial-class}} for further details} \item{useRasterImage}{default \code{!.isSDI()} as a workaround for a problem with repeated use in Windows SDI installations; if TRUE, use \code{\link[graphics]{rasterImage}} to render the image if available; for legacy rendering set FALSE} \item{breaks}{class breaks for coloured values} \item{interpolate}{default FALSE, a logical vector (or scalar) indicating whether to apply linear interpolation to the image when drawing, see \code{\link[graphics]{rasterImage}}} \item{angle}{default 0, angle of rotation (in degrees, anti-clockwise from positive x-axis, about the bottom-left corner), see \code{\link[graphics]{rasterImage}}} \item{im}{list with components named x, y, and z, as used for \code{image}} \item{p4}{CRS object, proj4 string} \item{digits}{default 10, number of significant digits to use for checking equal row/column spacing} } \value{ \code{as.image.SpatialGridDataFrame} returns the list with elements \code{x} and \code{y}, containing the coordinates of the cell centres of a matrix \code{z}, containing the attribute values in matrix form as needed by \link{image}. } \note{ Providing \code{xcol} and \code{ycol} attributes seems obsolete, and it is for 2D data, but it may provide opportunities for plotting certain slices in 3D data. I haven't given this much thought yet. \link{filled.contour} seems to misinterpret the coordinate values, if we take the image.default manual page as the reference. } \author{ Edzer Pebesma } \seealso{ \link{image.default}, \link{SpatialGridDataFrame-class}, \link{levelplot} in package \code{lattice}. Function \link[fields]{image.plot} can be used to make a legend for an image, see an example in \url{https://stat.ethz.ch/pipermail/r-sig-geo/2007-June/002143.html} } \examples{ data(meuse.grid) coordinates(meuse.grid) = c("x", "y") # promote to SpatialPointsDataFrame gridded(meuse.grid) = TRUE # promote to SpatialGridDataFrame data(meuse) coordinates(meuse) = c("x", "y") image(meuse.grid["dist"], main = "Distance to river Meuse") points(coordinates(meuse), pch = "+") image(meuse.grid["dist"], main = "Distance to river Meuse", useRasterImage=TRUE) points(coordinates(meuse), pch = "+") # color scale: layout(cbind(1,2), c(4,1),1) image(meuse.grid["dist"]) imageScale(meuse.grid$dist, axis.pos=4, add.axis=FALSE) axis(4,at=c(0,.2,.4,.8), las=2) data(Rlogo) d = dim(Rlogo) cellsize = abs(c(gt[2],gt[6])) cells.dim = c(d[1], d[2]) # c(d[2],d[1]) cellcentre.offset = c(x = gt[1] + 0.5 * cellsize[1], y = gt[4] - (d[2] - 0.5) * abs(cellsize[2])) grid = GridTopology(cellcentre.offset, cellsize, cells.dim) df = as.vector(Rlogo[,,1]) for (band in 2:d[3]) df = cbind(df, as.vector(Rlogo[,,band])) df = as.data.frame(df) names(df) = paste("band", 1:d[3], sep="") Rlogo <- SpatialGridDataFrame(grid = grid, data = df) summary(Rlogo) image(Rlogo, red="band1", green="band2", blue="band3") image(Rlogo, red="band1", green="band2", blue="band3", useRasterImage=FALSE) is.na(Rlogo$band1) <- Rlogo$band1 == 255 is.na(Rlogo$band2) <- Rlogo$band2 == 255 is.na(Rlogo$band3) <- Rlogo$band3 == 255 Rlogo$i7 <- 7 image(Rlogo, "i7") image(Rlogo, red="band1", green="band2", blue="band3", add=TRUE) } \keyword{spatial} sp/man/geometry-methods.Rd0000644000175100001440000000175611635334430015263 0ustar hornikusers\name{geometry-methods} \docType{methods} \alias{geometry} \alias{geometry-methods} \alias{geometry,Spatial-method} \alias{geometry,SpatialPointsDataFrame-method} \alias{geometry,SpatialGridDataFrame-method} \alias{geometry,SpatialPixelsDataFrame-method} \alias{geometry,SpatialLinesDataFrame-method} \alias{geometry,SpatialPolygonsDataFrame-method} \title{ Methods for retrieving the geometry from a composite (geometry + attributes) object } \usage{ geometry(obj) } \arguments{ \item{obj}{object of class Spatial} } \description{ geometry retrieves the SpatialXxx object from a SpatialXxxDataFrame object, with Xxx Lines, Points, Polygons, Grid, or Pixels. } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ } \item{obj = "SpatialPointsDataFrame"}{ } \item{obj = "SpatialPolygonsDataFrame"}{ } \item{obj = "SpatialPixelsDataFrame"}{ } \item{obj = "SpatialGridDataFrame"}{ } \item{obj = "SpatialLinesDataFrame"}{ } } } \author{Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de}} \keyword{methods} sp/man/CRS-class.Rd0000644000175100001440000000765712227265271013533 0ustar hornikusers\name{CRS-class} \docType{class} \alias{CRS-class} \alias{CRS} \alias{CRSargs} \alias{identicalCRS} \alias{print.CRS} \alias{show,CRS-method} \title{Class "CRS" of coordinate reference system arguments} \description{Interface class to the PROJ.4 projection system. The class is defined as an empty stub accepting value NA in the sp package. If the rgdal package is available, then the class will permit spatial data to be associated with coordinate reference systems. The arguments must be entered exactly as in the PROJ.4 documentation, in particular there cannot be any white space in += strings, and successive such strings can only be separated by blanks. Note that only \dQuote{+proj=longlat} is accepted for geographical coordinates, which must be ordered (eastings, northings).} \section{Objects from the Class}{ Objects can be created by calls of the form \code{CRS("projargs")}, where "projargs" is a valid string of PROJ.4 arguments. The initiation function calls the PROJ.4 library to verify the argument set against those known in the library, returning error messages where necessary. The function \code{CRSargs()} can be used to show the expanded argument list used by the PROJ.4 library. } \section{Slots}{ \describe{ \item{\code{projargs}:}{Object of class \code{"character"}: projection arguments; the arguments must be entered exactly as in the PROJ.4 documentation, in particular there cannot be any white space in += strings, and successive such strings can only be separated by blanks. } } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "CRS")}: print projection arguments in object } } } \usage{ CRS(projargs) identicalCRS(x,y) } \arguments{ \item{projargs}{A character string of projection arguments; the arguments must be entered exactly as in the PROJ.4 documentation; if the projection is unknown, use \code{as.character(NA)}, it may be missing or an empty string of zero length and will then set to the missing value.} \item{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{http://trac.osgeo.org/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).} \examples{ CRS() CRS("") CRS(as.character(NA)) CRS("+proj=longlat +datum=WGS84") if (require(rgdal)) { print(CRSargs(CRS("+proj=longlat +datum=NAD27"))) print(CRSargs(CRS("+init=epsg:4267"))) print(CRSargs(CRS("+init=epsg:26978"))) print(CRSargs(CRS(paste("+proj=sterea +lat_0=52.15616055555555", "+lon_0=5.38763888888889 +k=0.999908 +x_0=155000 +y_0=463000 +ellps=bessel", " +towgs84=565.237,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +units=m")))) print(CRSargs(CRS("+init=epsg:28992"))) } # see http://trac.osgeo.org/gdal/ticket/1987 } \keyword{classes} \keyword{spatial} sp/man/coordnames-methods.Rd0000644000175100001440000000447611635334430015564 0ustar hornikusers\name{coordnames-methods} \docType{methods} \alias{coordnames} \alias{coordnames-methods} \alias{coordnames,SpatialPoints-method} \alias{coordnames,SpatialLines-method} \alias{coordnames,Lines-method} \alias{coordnames,Line-method} \alias{coordnames,SpatialPolygons-method} \alias{coordnames,Polygons-method} \alias{coordnames,Polygon-method} \alias{coordnames<-} \alias{coordnames<-,SpatialPoints,character-method} \alias{coordnames<-,SpatialLines,character-method} \alias{coordnames<-,Lines,character-method} \alias{coordnames<-,Line,character-method} \alias{coordnames<-,SpatialPolygons,character-method} \alias{coordnames<-,Polygons,character-method} \alias{coordnames<-,Polygon,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"}{ assigns coordinate names } \item{x = "SpatialLines", value = "character"}{ assigns coordinate names } \item{x = "Lines", value = "character"}{ assigns coordinate names } \item{x = "Line", value = "character"}{ assigns coordinate names } \item{x = "SpatialPolygons", value = "character"}{ assigns coordinate names } \item{x = "Polygons", value = "character"}{ assigns coordinate names } \item{x = "Polygon", value = "character"}{ assigns coordinate names } \item{x = "GridTopology", value = "character"}{ assigns coordinate names } \item{x = "SpatialGrid", value = "character"}{ assigns coordinate names } \item{x = "SpatialPixels", value = "character"}{ assigns coordinate names } }} \keyword{methods} sp/man/gridded-methods.Rd0000644000175100001440000000630511635410666015033 0ustar hornikusers\name{gridded-methods} \docType{methods} \alias{gridded-methods} \alias{gridparameters} \alias{fullgrid} \alias{fullgrid,Spatial-method} \alias{gridded} \alias{gridded,Spatial-method} \alias{fullgrid<-} \alias{gridded<-} \alias{fullgrid<-,Spatial,ANY-method} \alias{fullgrid<-,SpatialGrid,logical-method} \alias{fullgrid<-,SpatialGridDataFrame,logical-method} \alias{fullgrid<-,SpatialPixels,logical-method} \alias{fullgrid<-,SpatialPixelsDataFrame,logical-method} \alias{gridded<-,SpatialGrid,logical-method} \alias{gridded<-,SpatialGridDataFrame,logical-method} \alias{gridded<-,SpatialPixels,logical-method} \alias{gridded<-,SpatialPixelsDataFrame,logical-method} \alias{gridded<-,SpatialPoints,list-method} \alias{gridded<-,SpatialPoints,logical-method} \alias{gridded<-,SpatialPointsDataFrame,list-method} \alias{gridded<-,SpatialPointsDataFrame,logical-method} \alias{gridded<-,data.frame,GridTopology-method} \alias{gridded<-,data.frame,character-method} \alias{gridded<-,data.frame,formula-method} \title{ specify spatial data as being gridded, or find out whether they are } \description{ returns logical (TRUE or FALSE) telling whether the object is gridded or not; in assignment promotes a non-gridded structure to a gridded one, or demotes a gridded structure back to a non-structured one. } \usage{ gridded(obj) gridded(obj) <- value fullgrid(obj) fullgrid(obj) <- value gridparameters(obj) } \arguments{ \item{obj}{ object deriviving from class "Spatial" (for gridded), or object of class \link{SpatialGridDataFrame-class} (for fullgrid and gridparameters)} \item{value}{logical replacement values, TRUE or FALSE} } \section{Methods}{ \describe{ \item{obj = "Spatial"}{ object deriviving from class "Spatial" } }} \value{ if obj derives from class Spatial, gridded(object) will tell whether it is has topology on a regular grid; if assigned TRUE, if the object derives from SpatialPoints and has gridded topology, grid topology will be added to object, and the class of the object will be promoted to \link{SpatialGrid-class} or \link{SpatialGridDataFrame-class} \code{fullgrid} returns a logical, telling whether the grid is full and ordered (i.e., in full matrix form), or whether it is not full or unordered (i.e. a list of points that happen to lie on a grid. If assigned, the way the points are stored may be changed. Changing a set of points to full matrix form and back may change the original order of the points, and will remove duplicate points if they were present. \code{gridparameters} returns, if \code{obj} inherits from SpatialGridDataFrame its grid parameters, else it returns numeric(0). The returned value is a data.frame with three columns, named cellcentre.offset ("lower left cell centre coordinates"), cellsize, and cells.dim (cell dimension); the rows correspond to the spatial dimensions. } \keyword{methods} \examples{ # just 9 points on a grid: x <- c(1,1,1,2,2,2,3,3,3) y <- c(1,2,3,1,2,3,1,2,3) xy <- cbind(x,y) S <- SpatialPoints(xy) class(S) plot(S) gridded(S) <- TRUE gridded(S) class(S) summary(S) plot(S) gridded(S) <- FALSE gridded(S) class(S) # data.frame data(meuse.grid) coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE plot(meuse.grid) # not much good summary(meuse.grid) } \keyword{spatial} sp/man/Line.Rd0000644000175100001440000000157111635334430012651 0ustar hornikusers\name{Line} \alias{Line} \alias{Lines} \title{ create objects of class Line or Lines} \description{ create objects of class \code{Line} or \code{Lines} from coordinates} \usage{ Line(coords) Lines(slinelist, ID) } \arguments{ \item{coords}{ 2-column numeric matrix with coordinates for a single line } \item{slinelist}{ list with elements of class \link{Line-class}} \item{ID}{a single word unique character identifier, character vector of length one} } \value{ \code{Line} returns an object of class \link{Line-class}; \code{Lines} returns an object of class \link{Lines-class} } \seealso{ \link{SpatialLines-class} } \examples{ # from the sp vignette: l1 = cbind(c(1,2,3),c(3,2,2)) l1a = cbind(l1[,1]+.05,l1[,2]+.05) l2 = cbind(c(1,2,3),c(1,1.5,1)) Sl1 = Line(l1) Sl1a = Line(l1a) Sl2 = Line(l2) S1 = Lines(list(Sl1, Sl1a), ID="a") S2 = Lines(list(Sl2), ID="b") } \keyword{classes} sp/man/meuse.riv.Rd0000644000175100001440000000233511635334430013676 0ustar hornikusers\name{meuse.riv} \alias{meuse.riv} \docType{data} \title{ River Meuse outline } \usage{data(meuse.riv)} \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. } \format{ This data frame contains a 176 x 2 matrix with coordinates. } \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") ) } \keyword{datasets} sp/man/SpatialPoints-class.Rd0000644000175100001440000000622712214030574015656 0ustar hornikusers\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 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 } } } \author{ Edzer Pebesma, \email{edzer.pebesma@uni-muenster.de} } \seealso{ \code{\link{SpatialPointsDataFrame-class}} } \examples{ x = c(1,2,3,4,5) y = c(3,2,5,1,4) S <- SpatialPoints(cbind(x,y)) S <- SpatialPoints(list(x,y)) S <- SpatialPoints(data.frame(x,y)) S plot(S) } \keyword{classes} sp/man/flip.Rd0000644000175100001440000000150011635334430012704 0ustar hornikusers\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.Rd0000644000175100001440000000356112054165631013467 0ustar hornikusers\name{char2dms} \alias{char2dms} \alias{dd2dms} \alias{coerce,DMS,numeric-method} \alias{coerce,DMS,character-method} \alias{as.character.DMS} %- Also NEED an '\alias' for EACH other topic documented here. \title{Convert character vector to DMS-class object} \description{ These two helper functions convert character vectors and decimal degree vectors to the DMS-class representation of degrees, minutes, and decimal seconds. "DMS" objects cannot contain NAs. } \section{Methods}{\describe{ \item{from = "DMS", to = "numeric"}{coerce a \code{"DMS"} object to a \code{"numeric"} vector} \item{from = "DMS", to = "character"}{coerce a \code{"DMS"} object to a \code{"character"} vector (the \code{as.character.DMS} S3 method is also available)} }} \usage{ char2dms(from, chd = "d", chm = "'", chs = "\"") dd2dms(dd, NS = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{from}{character vector of degree, minute, decimal second data} \item{chd}{degree character terminator} \item{chm}{minute character terminator} \item{chs}{second character terminator} \item{dd}{numeric vector of decimal degrees} \item{NS}{logical, TRUE for north/south decimal degrees, FALSE for east/west decimal degrees} } \details{ In char2dms, the input data vector should use a regular format, such as that used in the PROJ.4 library, with a trailing capital (NSWE) indicating compass direction. } \value{ Both functions return a "DMS" object. } \author{Roger Bivand \email{Roger.Bivand@nhh.no} } \seealso{\code{\link{DMS-class}}} \examples{ data(state) str(state.center$y) stateN <- dd2dms(state.center$y, NS=TRUE) str(attributes(stateN)) ch.stateN <- as.character(stateN) str(ch.stateN) stateNa <- char2dms(ch.stateN) str(attributes(stateNa)) ch.stateN <- as(stateN, "character") str(ch.stateN) stateNa <- char2dms(ch.stateN) str(attributes(stateNa)) } \keyword{spatial} sp/man/over.Rd0000644000175100001440000001652112210143046012725 0ustar hornikusers\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{aggregate.Spatial} \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 \method{aggregate}{Spatial}(x, by, FUN = mean, \dots) } \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{by}{ geometry over which attributes in \code{x} are aggregated } \item{FUN}{aggregation function } \item{...}{arguments passed on to function fn or FUN} } \value{ If \code{y} is only geometry an object of length \code{length(x)}. If \code{returnList} is FALSE, a vector with the (first) index of \code{y} for each geometry (point, grid cell centre, polygon or lines) in \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}. Function aggregate.Spatial aggregates the attribute values of \code{x} over the geometry of \code{by}, using aggregation function FUN. } \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. over methods that involve \code{SpatialLines} objects, or pairs of \code{SpatialPolygons} are implemented in, package rgeos.} \seealso{\link{overlay}, \link{point.in.polygon}} \examples{ r1 = cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409, 180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676, 332618, 332413, 332349)) r2 = cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437, 179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683, 331133, 331623, 332152, 332357, 332373)) r3 = cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875, 179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110), c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004, 329783, 329665, 329720, 329933, 330478, 331062, 331086)) r4 = cbind(c(180304, 180403,179632,179420,180304), c(332791, 333204, 333635, 333058, 332791)) sr1=Polygons(list(Polygon(r1)),"r1") sr2=Polygons(list(Polygon(r2)),"r2") sr3=Polygons(list(Polygon(r3)),"r3") sr4=Polygons(list(Polygon(r4)),"r4") sr=SpatialPolygons(list(sr1,sr2,sr3,sr4)) srdf=SpatialPolygonsDataFrame(sr, data.frame(cbind(1:4,5:2), row.names=c("r1","r2","r3","r4"))) data(meuse) coordinates(meuse) = ~x+y plot(meuse) polygon(r1) polygon(r2) polygon(r3) polygon(r4) # retrieve mean heavy metal concentrations per polygon: over(sr, meuse[,1:4], fn = mean) # return the number of points in each polygon: sapply(over(sr, geometry(meuse), returnList = TRUE), length) data(meuse.grid) coordinates(meuse.grid) = ~x+y gridded(meuse.grid) = TRUE over(sr, geometry(meuse)) over(sr, meuse) over(sr, geometry(meuse), returnList = TRUE) over(sr, meuse, returnList = TRUE) over(meuse, sr) over(meuse, srdf) # same thing, with grid: over(sr, meuse.grid) over(sr, meuse.grid, fn = mean) over(sr, meuse.grid, returnList = TRUE) over(meuse.grid, sr) over(meuse.grid, srdf, fn = mean) over(as(meuse.grid, "SpatialPoints"), sr) over(as(meuse.grid, "SpatialPoints"), srdf) } \keyword{methods} sp/man/spDistsN1.Rd0000644000175100001440000000444712162360400013607 0ustar hornikusers\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) } %- 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 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 coordinates method} \item{longlat}{if FALSE, Euclidean distance, if TRUE Great Circle distance} } \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{\url{http://home.att.net/~srschmitt/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) } \keyword{spatial} sp/man/GridTopology-class.Rd0000644000175100001440000000325612254103357015511 0ustar hornikusers\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 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}