我使用sf
和raster
软件包格式化了许多空间多边形。它已经很好了,除了这一个案例,我已经没有关于如何解决问题的想法:
我有一个多边形作为简单的特征多边形和一个栅格模板。两者都已转变为贝尔曼投影的等面积。多边形存在几何有效性问题,我使用st_make_valid
包中的lwgeom
进行了修复。
library(sf)
library(lwgeom)
library(raster)
spfile <- 'sp.rds'
rasterfile <- 'rasterTemplate_150km.tif'
sp <- readRDS(spfile)
rasterTemplate <- raster(rasterfile)
# are there any geometry validity issues? yes!
st_is_valid(sp)
[1] FALSE
Warning message:
In evalq((function (..., call. = TRUE, immediate. = FALSE, noBreaks. = FALSE, :
Ring Self-intersection at or near point 9947244.3466675151 1450099.5373749144
sp2 <- st_make_valid(sp)
st_is_valid(sp2)
[1] TRUE
plot(sp2, col='blue')
现在我光栅化它(我需要转换为SpatialPolygon以与栅格兼容):
sp3 <- as(sp2, 'Spatial')
cover <- rasterize(sp3, rasterTemplate, getCover=TRUE)
plot(cover, box=F, axes=F)
问题是澳大利亚有一家酒吧。
这是否意味着st_is_valid
未检测到该多边形仍存在几何有效性问题?如果是这样,那么这种类型的问题很难解决,因为它不容易被检测到,除了视觉......
回过头来,我可以确认as(sp, 'Spatial)
发生光栅化问题,因此st_make_valid
不会产生此问题。
如何解决此问题?
更新
以下建议使用st_cast
。我试过了sp4 <- as(st_cast(sp, "POLYGON"), 'Spatial')
。同样的光栅化问题仍然存在。
我还尝试使用sp5 <- as(st_buffer(sp, dist = 0), 'Spatial')
缓冲0,但这也无法解决问题。
答案 0 :(得分:1)
来自fasterize包的quickize函数显然不会导致相同的错误。 Fasterize也将合并到stars包(see this issue)中,该包应该很快就会出现在CRAN上。
也不需要st_cast或st_make_valid。
library(sf)
library(fasterize)
df <- readRDS('sp.rds') %>% st_sf(field = 1)
template <- raster('rasterTemplate_150km.tif')
r <- fasterize(df, template, field = 'field')
plot(r)