导致不正确光栅化的神秘多边形问题
Cryptic polygon issue leading to incorrect rasterization
我有一些正在栅格化的空间多边形,使用 sf
和 raster
包。效果很好,除了这个案例,我 运行 没有关于如何解决问题的想法:
我有一个作为简单要素多边形的多边形和一个栅格模板。两者都已转换为等面积贝尔曼投影。多边形存在几何有效性问题,我使用 lwgeom
包中的 st_make_valid
修复了该问题。
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,但这也没有解决问题。
fasterize package apparently does not cause the same error. Fasterize will also be incorporated into the stars package (see this issue) 的 fasterize 函数应该很快就会在 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)
我有一些正在栅格化的空间多边形,使用 sf
和 raster
包。效果很好,除了这个案例,我 运行 没有关于如何解决问题的想法:
我有一个作为简单要素多边形的多边形和一个栅格模板。两者都已转换为等面积贝尔曼投影。多边形存在几何有效性问题,我使用 lwgeom
包中的 st_make_valid
修复了该问题。
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,但这也没有解决问题。
fasterize package apparently does not cause the same error. Fasterize will also be incorporated into the stars package (see this issue) 的 fasterize 函数应该很快就会在 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)