1# Author: Robert J. Hijmans
2# Date : October 2018
3# Version 1.0
4# License GPL v3
5
6
7setMethod("weighted.mean", signature(x="SpatRaster", w="numeric"),
8	function(x, w, na.rm=FALSE, filename="", ...) {
9		opt <- spatOptions(filename, ...)
10		x@ptr <- x@ptr$wmean_vect(w, na.rm, opt)
11		messages(x, "weighted.mean")
12	}
13)
14
15
16setMethod("weighted.mean", signature(x="SpatRaster", w="SpatRaster"),
17	function(x, w, na.rm=FALSE, filename="", ...) {
18		opt <- spatOptions(filename, ...)
19		x@ptr <-x@ptr$wmean_rast(w@ptr, na.rm, opt)
20		messages(x, "weighted.mean")
21	}
22)
23
24
25
26setMethod("patches", signature(x="SpatRaster"),
27	function(x, directions=4, zeroAsNA=FALSE, filename="", ...) {
28		opt <- spatOptions(filename, ...)
29		x@ptr <- x@ptr$patches(directions[1], zeroAsNA[1], opt)
30		messages(x, "patches")
31	}
32)
33
34
35setMethod("origin", signature(x="SpatRaster"),
36	function(x) {
37		x@ptr$origin
38	}
39)
40
41
42setMethod("origin<-", signature("SpatRaster"),
43	function(x, value) {
44		value <- rep(value, length.out=2)
45		dif <- value - origin(x)
46		res <- res(x)
47		dif[1] <- dif[1] %% res[1]
48		dif[2] <- dif[2] %% res[2]
49		for (i in 1:2) {
50			if (dif[i] < 0) {
51				if ((dif[i] + res[i]) < abs(dif[i])) {
52					dif[i] <- dif[i] + res[i]
53				}
54			} else {
55				if (abs(dif[i] - res[i]) < dif[i]) {
56					dif[i] <- dif[i] - res[i]
57				}
58			}
59		}
60		e <- as.vector(ext(x))
61		e["xmin"] <- e["xmin"] + dif[1]
62		e["xmax"] <- e["xmax"] + dif[1]
63		e["ymin"] <- e["ymin"] + dif[2]
64		e["ymax"] <- e["ymax"] + dif[2]
65		ext(x) <- e
66		return(x)
67	}
68)
69
70
71
72
73setMethod("align", signature(x="SpatExtent", y="SpatRaster"),
74	function(x, y, snap="near") {
75		x@ptr <- y@ptr$align(x@ptr, tolower(snap))
76		#messages(x, "align")
77		x
78	}
79)
80
81setMethod("align", signature(x="SpatExtent", y="numeric"),
82	function(x, y) {
83		x@ptr <- x@ptr$align(y, "")
84		x
85	}
86)
87
88setMethod("cellSize", signature(x="SpatRaster"),
89	function(x, mask=TRUE, unit="m", transform=TRUE, filename="", ...) {
90		opt <- spatOptions(filename, ...)
91		x@ptr <- x@ptr$rst_area(mask, unit, transform, opt)
92		messages(x, "cellSize")
93	}
94)
95
96
97
98setMethod ("expanse", "SpatRaster",
99	function(x, unit="m", transform=TRUE) {
100
101		byvalue = FALSE
102		opt <- spatOptions()
103		if (byvalue) {
104			v <- x@ptr$area_by_value(opt)
105			x <- messages(x, "expanse")
106			v <- lapply(1:length(v), function(i) cbind(i, matrix(v[[i]], ncol=2)))
107			v <- do.call(rbind, v)
108			colnames(v) <- c("layer", "value", "area")
109		} else {
110			v <- x@ptr$sum_area(unit, transform, opt)
111			x <- messages(x, "expanse")
112		}
113		return(v)
114	}
115)
116
117
118
119setMethod("atan2", signature(y="SpatRaster", x="SpatRaster"),
120	function(y, x) {
121		opt <- spatOptions(filename="", overwrite=TRUE)
122		y@ptr <- y@ptr$atan2(x@ptr, opt)
123		messages(y, "atan2")
124	}
125)
126
127
128setMethod("boundaries", signature(x="SpatRaster"),
129	function(x, classes=FALSE, inner=TRUE, directions=8, falseval=0, filename="", ...) {
130		opt <- spatOptions(filename, ...)
131		type <- ifelse(inner[1], "inner", "outer")
132		x@ptr <- x@ptr$boundaries(classes[1], type, directions[1], falseval[1], opt)
133		messages(x, "boundaries")
134	}
135)
136
137
138.collapseSources <- function(x) {
139	x@ptr <- x@ptr$collapse_sources()
140	messages(x, "tighten")
141}
142
143setMethod("copy", signature("SpatRaster"),
144	function(x) {
145		x@ptr <- x@ptr$deepcopy()
146		x
147	}
148)
149
150
151
152setMethod("split", signature(x="SpatRaster"),
153	function(x, f) {
154		stopifnot(length(f) == nlyr(x))
155		stopifnot(!any(is.na(f)))
156		u <- unique(f)
157		lapply(u, function(i) x[[f==i]])
158	}
159)
160
161
162setMethod("add<-", signature("SpatRaster", "SpatRaster"),
163	function(x, value) {
164		if (x@ptr$same(value@ptr)) {
165			x@ptr <- x@ptr$deepcopy()
166		}
167		x@ptr$addSource(value@ptr)
168		messages(x, "add")
169	}
170)
171
172setMethod("tighten", signature("SpatRaster"),
173	function(x) {
174		x@ptr <- x@ptr$collapse_sources()
175		messages(x, "tighten")
176	}
177)
178
179setMethod("tighten", signature("SpatRasterDataset"),
180	function(x) {
181		y <- new("SpatRaster")
182		y@ptr <- x@ptr$collapse()
183		messages(y, "tighten")
184	}
185)
186
187
188#setMethod("c", signature(x="SpatRaster"),
189#	function(x, ...) {
190#		s <- sds(list(x, ...))
191#		x@ptr <- s@ptr$collapse()
192#		x <- messages(x, "c")
193#		try( x@ptr <- x@ptr$collapse_sources() )
194#		messages(x, "c")
195#	}
196#)
197
198
199
200#cbind.SpatVector <- function(x, y, ...) {
201#	if (inherits(y, "SpatVector")) {
202#		y <- y@ptr$df
203#	} else {
204#		stopifnot(inherits(y, "data.frame"))
205#		y <- terra:::.makeSpatDF(y)
206#	}
207#	x@ptr <- x@ptr$cbind(y)
208#	messages(x, "cbind")
209#}
210
211cbind.SpatVector <- function(x, y, ...) {
212	dots <- list(y, ...)
213	for (y in dots) {
214		if (inherits(y, "SpatVector")) {
215			y <- y@ptr$df
216		} else {
217			stopifnot(inherits(y, "data.frame"))
218			y <- .makeSpatDF(y)
219		}
220		x@ptr <- x@ptr$cbind(y)
221		x <- messages(x, "cbind")
222	}
223	x
224}
225
226rbind.SpatVector <- function(x, y, ...) {
227	skipped <- FALSE
228	stopifnot(inherits(y, "SpatVector"))
229	x@ptr <- x@ptr$rbind(y@ptr, FALSE)
230	x <- messages(x, "rbind")
231	dots <- list(...)
232	if (!is.null(dots)) {
233		for (y in dots) {
234			stopifnot(inherits(y, "SpatVector"))
235			x@ptr <- x@ptr$rbind(y@ptr, FALSE)
236			x <- messages(x, "rbind")
237		}
238	}
239	x
240}
241
242
243setMethod("c", signature(x="SpatRaster"),
244	function(x, ...) {
245		skips <- 0
246		dots <- list(...)
247		for (i in dots) {
248			if (inherits(i, "SpatRaster")) {
249				x@ptr <- x@ptr$combineSources(i@ptr)
250				if (x@ptr$messages$has_error) {
251					messages(x, "c")
252					return()
253				}
254			} else {
255				skips = skips + 1
256			}
257		}
258		if (skips > 0) warn("c,SpatRaster", paste("skipped", skips, "object(s) that are not SpatRaster"))
259		messages(x, "c")
260	}
261)
262
263
264
265setMethod("rep", signature(x="SpatRaster"),
266	function(x, ...) {
267		i <- rep(1:nlyr(x), ...)
268		x[[i]]
269	}
270)
271
272
273setMethod("clamp", signature(x="SpatRaster"),
274	function(x, lower=-Inf, upper=Inf, values=TRUE, filename="", ...) {
275		opt <- spatOptions(filename, ...)
276		x@ptr <- x@ptr$clamp(lower, upper, values[1], opt)
277		messages(x, "clamp")
278	}
279)
280
281
282setMethod("clamp", signature(x="numeric"),
283function(x, lower=-Inf, upper=Inf, values=TRUE, ...) {
284	stopifnot(lower <= upper)
285	if (values) {
286		x[x < lower] <- lower
287		x[x > upper] <- upper
288	} else {
289		x[x < lower] <- NA
290		x[x > upper] <- NA
291	}
292	x
293}
294)
295
296setMethod("classify", signature(x="SpatRaster"),
297function(x, rcl, include.lowest=FALSE, right=TRUE, othersNA=FALSE, filename="", ...) {
298
299	bylayer = FALSE
300
301	if (is.data.frame(rcl)) {
302		rcl <- as.matrix(rcl)
303	}
304
305	right <- ifelse(is.na(right), 2, ifelse(right, 1, 0))
306	include.lowest <- as.logical(include.lowest[1])
307
308	opt <- spatOptions(filename, ...)
309    x@ptr <- x@ptr$classify(as.vector(rcl), NCOL(rcl), right[1], include.lowest[1], othersNA[1], bylayer[1], opt)
310	messages(x, "classify")
311}
312)
313
314setMethod("subst", signature(x="SpatRaster"),
315function(x, from, to, filename="", ...) {
316	opt <- spatOptions(filename, ...)
317	if (inherits(to, "data.frame")) {
318		to <- as.matrix(to)
319	}
320	if (inherits(to, "matrix")) {
321		opt$names = colnames(to)
322		x@ptr <- x@ptr$replaceValues(from, to, ncol(to), opt)
323	} else {
324		x@ptr <- x@ptr$replaceValues(from, to, -1, opt)
325	}
326	messages(x, "subst")
327}
328)
329
330
331.getExt <- function(x) {
332	return(x)
333}
334
335setMethod("crop", signature(x="SpatRaster", y="ANY"),
336	function(x, y, snap="near", filename="", ...) {
337		opt <- spatOptions(filename, ...)
338
339		if (!inherits(y, "SpatExtent")) {
340			e <- try(ext(y), silent=TRUE)
341			if (class(e) == "try-error") {
342				e <- try(ext(vect(y)), silent=TRUE)
343				if (class(e) == "try-error") {
344					error("crop", "cannot get a SpatExtent from y")
345				}
346			}
347			y <- e
348		}
349
350		x@ptr <- x@ptr$crop(y@ptr, snap[1], opt)
351		messages(x, "crop")
352	}
353)
354
355
356setMethod("selectRange", signature(x="SpatRaster"),
357	function(x, y, z=1, repint=0, filename="", ...) {
358		opt <- spatOptions(filename, ...)
359		x@ptr <- x@ptr$selRange(y@ptr, z, repint, opt)
360		messages(x, "selectRange")
361	}
362)
363
364setMethod("cover", signature(x="SpatRaster", y="SpatRaster"),
365	function(x, y, values=NA, filename="", ...) {
366		opt <- spatOptions(filename, ...)
367		x@ptr <- x@ptr$cover(y@ptr, values, opt)
368		messages(x, "cover")
369	}
370)
371
372
373setMethod("diff", signature(x="SpatRaster"),
374	function(x, lag=1, filename="", ...) {
375		n <- nlyr(x)
376		lag <- round(lag)
377		if ((lag < 1) | (lag >= n)) {
378			error("diff", "lag must be > 0 and < nlyr(x)")
379		}
380		y <- x[[-((n-lag+1):n)]]
381		x <- x[[-(1:lag)]]
382		opt <- spatOptions(filename, ...)
383		x@ptr <- x@ptr$arith_rast(y@ptr, "-", opt)
384		messages(x, "diff")
385	}
386)
387
388
389setMethod("disagg", signature(x="SpatRaster"),
390	function(x, fact, method="near", filename="", ...) {
391		stopifnot(method %in% c("near", "bilinear"))
392		if (method == "bilinear") {
393			y <- disagg(rast(x), fact)
394			r <- resample(x, y, "bilinear", filename=filename, ...)
395			return(r)
396		}
397		opt <- spatOptions(filename, ...)
398		x@ptr <- x@ptr$disaggregate(fact, opt)
399		messages(x, "disagg")
400	}
401)
402
403
404setMethod("flip", signature(x="SpatRaster"),
405	function(x, direction="vertical", filename="", ...) {
406		d <- match.arg(direction, c("vertical", "horizontal"))
407		opt <- spatOptions(filename, ...)
408		x@ptr <- x@ptr$flip(d == "vertical", opt)
409		messages(x, "flip")
410	}
411)
412
413
414setMethod("freq", signature(x="SpatRaster"),
415	function(x, digits=0, value=NULL, bylayer=TRUE, usenames=FALSE) {
416
417		opt <- spatOptions()
418		if (!bylayer) usenames <- FALSE
419
420		if (!is.null(value)) {
421			value <- unique(value)
422			if (length(value) > 1) {
423				error("freq", "value must have a length of one")
424			}
425			if (is.character(value)) {
426				value <- value[value != ""]
427				if (length(value) == 0) {
428					error("freq", "no valid value")
429				}
430				ff <- is.factor(x)
431				if (!any(ff)) {
432					error("freq", "a character value is only meaningful for categorical rasters")
433				}
434				f <- freq(x[[ff]])
435				if (usenames) {
436					f$layer <- names(x)[f$layer]
437				}
438				f <- f[f$label == value,]
439				return(f)
440			}
441
442			if (is.na(digits)) {
443				v <- x@ptr$count(value, bylayer[1], FALSE, 0, opt)
444			} else {
445				v <- x@ptr$count(value, bylayer[1], TRUE, digits, opt)
446				value <- round(value, digits)
447			}
448			if (bylayer) {
449				v <- cbind(layer=1:nlyr(x), value=value, count=v)
450			} else {
451				v <- cbind(value=value, count=v)
452			}
453		} else {
454			if (is.na(digits)) {
455				v <- x@ptr$freq(bylayer[1], FALSE, 0, opt)
456			} else {
457				v <- x@ptr$freq(bylayer[1], TRUE, digits, opt)
458			}
459			if (bylayer) {
460				v <- lapply(1:length(v), function(i) cbind(i, matrix(v[[i]], ncol=2)))
461				v <- do.call(rbind, v)
462				colnames(v) <- c("layer", "value", "count")
463			} else {
464				v <- matrix(v[[1]], ncol=2, dimnames=list(NULL, c("value", "count")))
465			}
466			ff <- is.factor(x)
467			if (any(ff)) {
468				if (bylayer) {
469					v <- data.frame(v)
470					v$label <- ""
471					f <- which(ff)
472					levs <- levels(x)
473					for (i in f) {
474						g <- levs[[i]]
475						k <- v$layer==i
476						v$label[k] <- g[v$value[k] + 1]
477					}
478				} else if (nlyr(x) == 1) {
479					v <- data.frame(v)
480					g <- levels(x)[[1]]
481					v$label <- g[v$value + 1]
482				}
483			}
484		}
485		if (usenames) {
486			v <- data.frame(v)
487			v$layer <- names(x)[v$layer]
488		}
489		v
490	}
491)
492
493
494
495setMethod("mask", signature(x="SpatRaster", mask="SpatRaster"),
496	function(x, mask, inverse=FALSE, maskvalues=NA, updatevalue=NA, filename="", ...) {
497		opt <- spatOptions(filename, ...)
498		x@ptr <- x@ptr$mask_raster(mask@ptr, inverse[1], maskvalues, updatevalue[1], opt)
499		messages(x, "mask")
500	}
501)
502
503setMethod("mask", signature(x="SpatRaster", mask="SpatVector"),
504	function(x, mask, inverse=FALSE, updatevalue=NA, touches=TRUE, filename="", ...) {
505		opt <- spatOptions(filename, ...)
506		x@ptr <- x@ptr$mask_vector(mask@ptr, inverse[1], updatevalue[1], touches[1], opt)
507		messages(x, "mask")
508	}
509)
510
511
512setMethod("project", signature(x="SpatRaster"),
513	function(x, y, method, mask=FALSE, align=FALSE, filename="", ...)  {
514
515		if (missing(method)) {
516			method <- ifelse(is.factor(x)[1], "near", "bilinear")
517		} else {
518			method <- method[1]
519		}
520		if (method == "ngb") {
521			method <- "near"
522			warn("project", "argument 'method=ngb' is deprecated, it should be 'method=near'")
523		}
524		opt <- spatOptions(filename, ...)
525		if (inherits(y, "SpatRaster")) {
526			x@ptr <- x@ptr$warp(y@ptr, "", method, mask[1], align[1], opt)
527		} else {
528			if (!is.character(y)) {
529				warn("project,SpatRaster", "crs should be a character value")
530				y <- as.character(crs(y))
531			}
532			#x@ptr <- x@ptr$warpcrs(y, method, opt)
533			x@ptr <- x@ptr$warp(SpatRaster$new(), y, method, mask, FALSE, opt)
534		}
535		messages(x, "project")
536	}
537)
538
539
540setMethod("project", signature(x="SpatVector"),
541	function(x, y)  {
542		if (!is.character(y)) {
543			y <- crs(y)
544		}
545		x@ptr <- x@ptr$project(y)
546		messages(x, "project")
547	}
548)
549
550
551setMethod("quantile", signature(x="SpatRaster"),
552	function(x, probs=seq(0, 1, 0.25), na.rm=FALSE, filename="", ...) {
553		opt <- spatOptions(filename, ...)
554		x@ptr <- x@ptr$quantile(probs, na.rm[1], opt)
555		messages(x, "quantile")
556	}
557)
558
559
560setMethod("quantile", signature(x="SpatVector"),
561	function(x, probs=seq(0, 1, 0.25), ...) {
562		x <- values(x)
563		cls <- sapply(x, class)
564		i <- cls != "character"
565		if (!any(i)) error("quantile", "no numeric variables")
566		x <- x[, i, drop=FALSE]
567		apply(x, 2, function(i) quantile(i, probs=probs, ...))
568	}
569)
570
571
572setMethod("rectify", signature(x="SpatRaster"),
573	function(x, method="bilinear", aoi=NULL, snap=TRUE, filename="", ...) {
574		opt <- spatOptions(filename, ...)
575		if (!is.null(aoi)) {
576			if (inherits(aoi, "SpatExtent")) {
577				aoi <- rast(aoi)
578				useaoi <- 1
579			} else if (inherits(aoi, "SpatRaster")) {
580				aoi <- rast(aoi)
581				useaoi <- 2
582			} else {
583				error("rectify", "ext must be a SpatExtent or SpatRaster")
584			}
585		} else {
586			aoi <- rast()
587			useaoi <- 0
588		}
589		snap <- as.logical(snap)
590		x@ptr <- x@ptr$rectify(method, aoi@ptr, useaoi, snap, opt)
591		messages(x, "rectify")
592	}
593)
594
595setMethod("resample", signature(x="SpatRaster", y="SpatRaster"),
596	function(x, y, method, filename="", ...)  {
597		if (missing(method)) {
598			method <- ifelse(is.factor(x)[1], "near", "bilinear")
599		}
600		if (method == "ngb") {
601			method <- "near"
602			warn("project", "argument 'method=ngb' is deprecated, it should be 'method=near'")
603		}
604		opt <- spatOptions(filename, ...)
605		x@ptr <- x@ptr$warp(y@ptr, "", method, FALSE, FALSE, opt)
606		messages(x, "resample")
607	}
608)
609
610
611
612setMethod("rev", signature(x="SpatRaster"),
613	function(x) {
614		opt <- spatOptions("", FALSE, list())
615		x@ptr <- x@ptr$reverse(opt)
616		messages(x, "rev")
617	}
618)
619
620setMethod("rotate", signature(x="SpatRaster"),
621	function(x, left=TRUE, filename="", ...) {
622		opt <- spatOptions(filename, ...)
623		x@ptr <- x@ptr$rotate(left, opt)
624		messages(x, "rotate")
625	}
626)
627
628
629setMethod("segregate", signature(x="SpatRaster"),
630	function(x, classes=NULL, keep=FALSE, other=0, filename="", ...) {
631		opt <- spatOptions(filename, ...)
632		if (is.null(classes)) classes <- 1[0]
633		x@ptr <- x@ptr$separate(classes, keep, other, opt)
634		messages(x, "segregate")
635	}
636)
637
638
639setMethod("shift", signature(x="SpatRaster"),
640	function(x, dx=0, dy=0, filename="", ...) {
641		opt <- spatOptions(filename, ...)
642		x@ptr <- x@ptr$shift(dx, dy, opt)
643		messages(x, "shift")
644	}
645)
646
647
648setMethod("shift", signature(x="SpatExtent"),
649	function(x, dx=0, dy=0) {
650		s <- c(dx[1], dx[1], dy[1], dy[1])
651		ext(as.vector(x) + s)
652	}
653)
654
655
656setMethod("shift", signature(x="SpatVector"),
657	function(x, dx=0, dy=0) {
658		x@ptr <- x@ptr$shift(dx, dy)
659		messages(x, "shift")
660	}
661)
662
663setMethod("rescale", signature(x="SpatRaster"),
664	function(x, fx=0.5, fy=fx, x0, y0) {
665		stopifnot(fx > 0)
666		stopifnot(fy > 0)
667		e <- as.vector(ext(x))
668		if (missing(x0)) {
669			x0 <- mean(e[1:2])
670		}
671		if (missing(y0)) {
672			y0 <- mean(e[3:4])
673		}
674		ex = x0 + fx * (e[1:2] - x0);
675		ey = y0 + fy * (e[3:4] - y0);
676		x@ptr <- x@ptr$deepcopy()
677		ext(x) <- ext(c(ex, ey))
678		messages(x, "rescale")
679	}
680)
681
682setMethod("rescale", signature(x="SpatVector"),
683	function(x, fx=0.5, fy=fx, x0, y0) {
684		stopifnot(fx > 0)
685		stopifnot(fy > 0)
686		e <- as.vector(ext(x))
687		if (missing(x0)) {
688			x0 <- mean(e[1:2])
689		}
690		if (missing(y0)) {
691			y0 <- mean(e[3:4])
692		}
693		x@ptr <- x@ptr$rescale(fx, fy, x0[1], y0[1])
694		messages(x, "rescale")
695	}
696)
697
698
699setMethod("scale", signature(x="SpatRaster"),
700	function(x, center=TRUE, scale=TRUE) {
701
702		opt <- spatOptions()
703
704		if (is.logical(center)) {
705			docenter = center[1];
706			center = 1[0]
707		} else {
708			docenter = TRUE
709		}
710		if (is.logical(scale)) {
711			doscale = scale[1]
712			scale = 1[0]
713		} else {
714			doscale = TRUE;
715		}
716		x@ptr <- x@ptr$scale(center, docenter, scale, doscale, opt)
717		messages(x, "scale")
718	}
719)
720
721
722
723setMethod("stretch", signature(x="SpatRaster"),
724	function(x, minv=0, maxv=255, minq=0, maxq=1, smin=NA, smax=NA, filename="", ...) {
725		opt <- spatOptions(filename, ...)
726		x@ptr <- x@ptr$stretch(minv, maxv, minq, maxq, smin, smax, opt)
727		messages(x, "stretch")
728	}
729)
730
731
732
733setMethod("summary", signature(object="SpatRaster"),
734	function(object, size=100000, warn=TRUE, ...)  {
735		if (!hasValues(object)) {
736			warn("summary", "SpatRaster has no values")
737			return(invisible())
738		}
739		if (warn && (ncell(object) > size)) {
740			warn("summary", "used a sample")
741		}
742		s <- spatSample(object, size, method="regular")
743		summary(s, ...)
744	}
745)
746
747
748setMethod("summary", signature(object="SpatVector"),
749	function(object, ...)  {
750		summary(as.data.frame(object), ...)
751	}
752)
753
754
755setMethod("t", signature(x="SpatRaster"),
756	function(x) {
757		opt <- spatOptions()
758		x@ptr <- x@ptr$transpose(opt)
759		messages(x, "t")
760	}
761)
762
763setMethod("t", signature(x="SpatVector"),
764	function(x) {
765		x@ptr <- x@ptr$transpose()
766		messages(x, "t")
767	}
768)
769
770
771setMethod("terrain", signature(x="SpatRaster"),
772	function(x, v="slope", neighbors=8, unit="degrees", filename="", ...) {
773		#v <- match.arg(unique(v), c("aspect", "flowdir", "roughness", "slope", "TPI", "TRI"), several.ok=TRUE)
774		unit <- match.arg(unit, c("degrees", "radians"))
775		opt <- spatOptions(filename, ...)
776		seed <- ifelse("flowdir" %in% v, .seed(), 0)
777		x@ptr <- x@ptr$terrain(v, neighbors[1], unit=="degrees", seed, opt)
778		messages(x, "terrain")
779	}
780)
781
782
783setMethod("trim", signature(x="SpatRaster"),
784	function(x, padding=0, value=NA, filename="", ...) {
785		opt <- spatOptions(filename, ...)
786		x@ptr <- x@ptr$trim(value[1], padding[1], opt)
787		messages(x, "trim")
788	}
789)
790
791setMethod("trans", signature(x="SpatRaster"),
792	function(x, filename="", ...) {
793		opt <- spatOptions(filename, ...)
794		x@ptr <- x@ptr$transpose(opt)
795		messages(x, "trans")
796	}
797)
798
799
800setMethod("unique", signature(x="SpatRaster", incomparables="ANY"),
801	function(x, incomparables=FALSE) {
802		opt <- spatOptions()
803		u <- x@ptr$unique(incomparables, opt)
804
805		isfact <- is.factor(x)
806		if (any(isfact)) {
807			ff <- which(isfact)
808			levs <- levels(x)
809			for (f in ff) {
810				lvs <- levs[[f]]
811				u[[f]] = factor(u[[f]], levels=(1:length(lvs))-1)
812				levels(u[[f]]) = levs[[f]]
813			}
814		}
815		if (!incomparables) {
816			if (!length(u)) return(u)
817			u <- do.call(data.frame, u)
818			colnames(u) <- names(x)
819		}
820		u
821	}
822)
823
824setMethod("unique", signature(x="SpatVector", incomparables="ANY"),
825	function(x, incomparables=FALSE, ...) {
826		u <- unique(as.data.frame(x, geom="WKT"), incomparables=incomparables, ...)
827		v <- vect(u, geom="geometry")
828		v$geometry <- NULL
829		crs(v) <- crs(x)
830		v
831	}
832)
833
834
835#setMethod("warp", signature(x="SpatRaster", y="SpatRaster"),
836#	function(x, y, method="bilinear", filename="", overwrite=FALSE, ...)  {
837#		opt <- spatOptions(filename, overwrite, ...)
838#		x@ptr <- x@ptr$warp(y@ptr, "", method, opt)
839#		messages(x, "warp")
840#	}
841#)
842
843