问题
我想要对空间线进行栅格化,并将所有接触/交叉栅格单元格的线条的最大值分配给该单元格。。
我在terra中使用行作为SpatVect对象,因此我更喜欢terra::rasterize解决方案。我也会对使用stars::st_rasterize的解决方案感到满意(也请参阅this问题)。
到目前为止,documentation of terra::rasterize似乎表明它不支持正确的行--使用fun参数似乎仅限于点向量数据。尽管如此,我还是尝试过使用terra::rasterize,参见下面的示例。
我知道raster::rasterize,但它似乎有点过时,因为它仍然是基于sp对象的。或者这是ATM机唯一的方法?
示例
在这里您可以看到,当通过max进行栅格化时,mean函数和terra::rasterize(... fun = "max"/"mean")函数似乎都不能正常工作。
library("terra")
### Example data ###
f <- system.file("ex/lux.shp", package="terra")
v <- vect(f)
lns <- as.lines(v)
r <- rast(v, res=.2)
### Rasterize via terra::rasterize ###
x_max <- rasterize(lns, r, fun="max", field = "POP")
x_mean <- rasterize(lns, r, fun="mean", field = "POP")
### Plot results ###
fontsize <- 0.7
par(mfrow=c(1,3))
plot(lns, y = "POP", main = "Lines with original values")
text(lns, "POP", cex = fontsize)
plot(x_max, main = "Rasterized via fun 'max'")
text(x_max, cex = fontsize)
plot(lns, add = T)
plot(x_mean, main = "Rasterized via fun 'mean'")
text(x_mean, cex = fontsize)
plot(lns, add = T)

发布于 2022-08-02 14:50:31
我找到了一个有点麻烦的解决办法。正如评论中所建议的那样,我通过采样将这些线转换为点。
我用sf::st_line_sample()代替了rgeos::gInterpolate() --它更干净、更容易。然后,terra::rasterize()可以正确地处理这些点,并按预期的方式应用max乐趣。
被下面的情节所证实。
示例解
library("terra")
library("dplyr")
library("sf")
library("units")
### Example data ###
f <- system.file("ex/lux.shp", package="terra")
v <- vect(f)
lns <- as.lines(v)
r <- rast(v, res=.2)
### Turn SpatVector lines into sf object
lns_sf <- lns %>%
st_as_sf() %>%
st_transform(2169) # reprojection needed for st_line_sample
### Sample points along all lines every kilometer
pts_geometries <- lns_sf %>%
st_line_sample(density = units::set_units(1, 1/km))
### Add attributes and make MULTIPOINTs simple POINTS
pts_sf <- st_sf(lns_sf,
geometry = pts_geometries) %>%
st_cast("POINT") %>%
st_transform(crs(lns))
### Go back to terra: Turn sf into SpatVector object
pts <- pts_sf %>%
vect()
### Now rasterization works and "max" function is applied corretly
x_max <- rasterize(pts, r, fun="max", field = "POP")
fontsize <- 0.7
par(mfrow=c(1,3))
plot(lns, y = "POP", main = "Lines with original values")
text(lns, "POP", cex = fontsize)
plot(x_max, main = "Rasterized with fun 'max' using points generated from lines")
text(x_max, cex = fontsize)
plot(lns, add = T)
plot(pts, main = "Points used for rasterization")

https://stackoverflow.com/questions/73151261
复制相似问题