1# Author: Robert J. Hijmans
2# Date :  June 2008
3# Version 1.0
4# Licence GPL v3
5
6
7setMethod("plot", signature(x='Raster', y='ANY'),
8	function(x, y, maxpixels=500000, col, alpha=NULL, colNA=NA, add=FALSE, ext=NULL, useRaster=TRUE, interpolate=FALSE, addfun=NULL, nc, nr, maxnl=16, main, npretty=0, ...)  {
9
10		hasNoCol <- missing(col)
11		if (hasNoCol) {
12			col <- rev(terrain.colors(255))
13		}
14
15		if (!is.null(alpha)) {
16			if (inherits(alpha, 'RasterLayer')) {
17				if (!compareRaster(x, alpha)) {
18					alpha <- NULL
19				}
20			} else {
21				alpha <- pmax(pmin(alpha, 1), 0)
22				if (length(alpha) == 1) {
23					alpha <- alpha * 255 + 1
24					a <- c(0:9, LETTERS[1:6])
25					alpha <- paste(rep(a, each=16), rep(a, times=16), sep='')[alpha]
26					col <- paste(substr(col, 1, 7), alpha, sep="")
27					alpha <- NULL
28				}
29			}
30		}
31
32		nl <- nlayers(x)
33		if (nl == 0) {
34			stop('Raster object has no cell values')
35		}
36
37		if (nl == 1) {
38			if (inherits(x, 'RasterStackBrick')) {
39				x <- raster(x, 1)
40			}
41			facvar <- 0
42			if (!missing(y)) {
43				if (is.factor(x)) {
44					facvar <- max(y, 0)
45				}
46			}
47
48
49			if ( (length(x@legend@colortable) > 0) & hasNoCol) {
50				.plotCT(x, maxpixels=maxpixels, ext=ext, interpolate=interpolate, main=main, add=add, addfun=addfun, ...)
51			} else if (! useRaster) {
52				.plotraster(x, col=col, maxpixels=maxpixels, add=add, ext=ext, main=main, addfun=addfun, ...)
53			} else {
54				.plotraster2(x, col=col, maxpixels=maxpixels, add=add, ext=ext, interpolate=interpolate, colNA=colNA, main=main, addfun=addfun, facvar=facvar, alpha=alpha, npretty=npretty, ...)
55				#.plot2(x, col=col, maxpixels=maxpixels, ...)
56			}
57			return(invisible(NULL))
58		}
59
60		if (missing(main)) {
61			main <- names(x)
62		}
63		if (missing(y)) {
64			y <- 1:nl
65			if (length(y) > maxnl) {
66				y <- 1:maxnl
67			}
68		} else {
69			if (is.character(y)) {
70				y <- match(y, names(x))
71			}
72			y <- unique(as.integer(round(y)))
73			y <- stats::na.omit(y)
74		}
75
76
77		if (length(y) == 1) {
78			x <- raster(x, y)
79			if ( (length(x@legend@colortable) > 0) & hasNoCol) {
80				.plotCT(x, maxpixels=maxpixels, ext=ext, interpolate=interpolate, main=main[y], addfun=addfun, ...)
81			} else if (useRaster) {
82				.plotraster2(x, col=col, colNA=colNA, maxpixels=maxpixels, main=main[y], ext=ext, interpolate=interpolate, addfun=addfun, , alpha=alpha, ...)
83			} else {
84				.plotraster(x, col=col, maxpixels=maxpixels, main=main[y], ext=ext, addfun=addfun, ...)
85			}
86
87		} else {
88
89			nl <- length(y)
90			if (missing(nc)) {
91				nc <- ceiling(sqrt(nl))
92			} else {
93				nc <- max(1, min(nl, round(nc)))
94			}
95			if (missing(nr)) {
96				nr <- ceiling(nl / nc)
97			} else {
98				nr <- max(1, min(nl, round(nr)))
99				nc <- ceiling(nl / nr)
100			}
101
102			old.par <- graphics::par(no.readonly = TRUE)
103			on.exit(graphics::par(old.par))
104			graphics::par(mfrow=c(nr, nc), mar=c(2, 2, 2, 4))
105			xa='n'
106			rown=1
107			coln=0
108			maxpixels=maxpixels/nl
109
110			if (missing(main)) {
111				main <- names(x)
112			}
113
114			for (i in 1:nl) {
115				coln = coln + 1
116				if (coln > nc) {
117					coln <- 1
118					rown = rown + 1
119				}
120				if (rown==nr) xa='s'
121				if (coln==1) ya='s' else ya='n'
122
123				obj <- raster(x, y[i])
124				if ((length(obj@legend@colortable) > 0) & hasNoCol) {
125					.plotCT(obj, maxpixels=maxpixels, ext=ext, interpolate=interpolate, main=main, addfun=addfun, ...)
126				} else if (useRaster) {
127					.plotraster2(obj, col=col, maxpixels=maxpixels, xaxt=xa, yaxt=ya, main=main[y[i]], ext=ext, interpolate=interpolate, colNA=colNA, addfun=addfun, alpha=alpha, ...)
128				} else {
129					.plotraster(obj, col=col, maxpixels=maxpixels, xaxt=xa, yaxt=ya, main=main[y[i]], ext=ext, interpolate=interpolate, addfun=addfun, ...)
130				}
131			}
132		}
133		return(invisible(NULL))
134	}
135)
136
137
138setMethod("lines", signature(x='RasterLayer'),
139function(x, ...) {
140	if(prod(dim(x)) < 50000) {
141		stop('too many lines')
142	}
143	x <- as(x, 'SpatialPolygons')
144	lines(x, ...)
145}
146)
147
148setMethod("lines", signature(x='Extent'),
149function(x, ...) {
150	plot(x, add=TRUE, ...)
151}
152)
153