首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的Rasterize :如何为单元格分配最大值?

R中的Rasterize :如何为单元格分配最大值?
EN

Stack Overflow用户
提问于 2022-07-28 10:25:24
回答 1查看 102关注 0票数 0

问题

我想要对空间线进行栅格化,并将所有接触/交叉栅格单元格的线条的最大值分配给该单元格。

我在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")函数似乎都不能正常工作。

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-02 14:50:31

我找到了一个有点麻烦的解决办法。正如评论中所建议的那样,我通过采样将这些线转换为点。

我用sf::st_line_sample()代替了rgeos::gInterpolate() --它更干净、更容易。然后,terra::rasterize()可以正确地处理这些点,并按预期的方式应用max乐趣。

被下面的情节所证实。

示例解

代码语言:javascript
复制
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")

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73151261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档