在R中相交-错过一个多边形

时间:2018-10-25 03:36:17

标签: r dataframe spatial intersect

1。问题

我正在尝试提取R中两个多边形形状的交点。第一个是分水岭多边形“ ws_polygon_2”,第二个是从excel工作表“ DATA.xlsx”构造的5个雨量计的voronoi多边形。 ”,两者都可以在这里找到:link

代码如下:

#[1] Montagem da tabela de coordenadas dos postos pluviométricos
library(sp)
library(readxl)
dados_precipitacao_1985 <- read_excel(path="C:/Users/.../DATA.xlsx") 
coordinates(dados_precipitacao_1985) <- ~ x + y 
proj4string(dados_precipitacao_1985) <- CRS("+proj=longlat +datum=WGS84") 
d_prec <- spTransform(dados_precipitacao_1985, CRSobj = "+init=epsg:3857") 

#[2] Coleta dos dados espaciais da bacia hidrográfica
library(rgdal)
bacia_Caio_Prado <- readOGR(dsn="C:/Users/...", layer="ws_polygon_2")
bacia_WGS <- spTransform(bacia_Caio_Prado, CRSobj = "+proj=longlat +datum=WGS84")
bacia_UTM <- spTransform(bacia_Caio_Prado, CRSobj = "+init=epsg:3857")

#[3] Poligonos de Thiessen - 1 INTERPOLAÇÃO
library(dismo)
library(rgeos)
library(raster)
library(mapview)
limits_voronoi_WGS <- c(-40.00,-38.90,-5.00,-4.50)
v_WGS <- voronoi(dados_precipitacao_1985, ext=limits_voronoi_WGS)
bc <- aggregate(bacia_WGS)
u_WGS_1 <- gIntersection(spgeom1 = v_WGS, spgeom2 = bc,byid=TRUE)
u_WGS_2 <- intersect(bc, v_WGS)

当我应用intersect函数时,返回的变量u_WGS_2是一个只有4个要素而不是5个要素的空间多边形数据框。voronoi对象v_WGS也具有5个要素

另一方面,当我使用gIntesection函数时,我得到5个功能。但是,u_WGS_1对象只是一个空间多边形,我丢失了降雨数据。

我想知道我是否犯了任何错误,或者是否有任何方法可以通过intersect函数将5个要素与空间多边形数据框中的降雨数据聚合在一起。

我的目标是稍后通过rasterize函数使用栅格中每个voronoi多边形的降雨数据转换此空间多边形数据框,以与其他插值结果和卫星数据进行比较。

查看这些结果。第一个是当我获得所需的SPDF(空间多边形数据框)但缺少5º功能时。第二个是我获得的所有我想要的功能,但是缺少降雨数据。 spplot(u_WGS_2, 'JAN') plot(u_WGS_1)

2。我尝试过的

  1. 我查看了ws_polygon_2形状,以寻找其他任何会污染该形状并指导该结果的不需要的多边形。 形状仅由一个多边形要素(正确的分水岭要素)组成。

  2. 如上所述,我尝试使用aggregate函数,并且在this教程中看到了。 但是我得到了相同的结果。

  3. 我尝试使用de u_WGS_1d_prec Spatial Point Data Frame对象创建SPDF。 实际上,我正在努力。如果这是解决问题的正确方法,请提供一些代码来帮助我。

谢谢!

2 个答案:

答案 0 :(得分:2)

使用 sf 中的st_intersection()时,这不是问题,它保留了两个数据集中的数据。请注意,dismo::voronoi()仅与 sp 对象兼容,因此降水数据需要以这种格式(至少是暂时可用)可用。如果您对 sf 不满意,并且希望在实际相交之后继续使用Spatial *对象,只需在输出的 sf 对象上调用as()方法如下所示。

library(sf)

#[1] Montagem da tabela de coordenadas dos postos pluviométricos
dados_precipitacao_1985 <- readxl::read_excel(path="data/DATA.xlsx") 
dados_precipitacao_1985 <- st_as_sf(dados_precipitacao_1985, coords = c("x", "y"), crs = 4326)
dados_precipitacao_1985_sp <- as(dados_precipitacao_1985, "Spatial")

#[2] Coleta dos dados espaciais da bacia hidrográfica
bacia_Caio_Prado <- st_read(dsn="data/SHAPE_CORRIGIDO", layer="ws_polygon_2")

#[3] Poligonos de Thiessen - 1 INTERPOLAÇÃO
limits_voronoi_WGS <- c(-40.00,-38.90,-5.00,-4.50)
v_WGS <- dismo::voronoi(dados_precipitacao_1985_sp, ext=limits_voronoi_WGS)
v_WGS_sf <- st_as_sf(v_WGS)

u_WGS_3 <- st_intersection(bacia_Caio_Prado, v_WGS_sf)
plot(u_WGS_3[, 6], key.pos = 1)

precip-january

答案 1 :(得分:1)

缺少的多边形被删除,因为它无效

library(raster)
bacia <- shapefile("SHAPE_CORRIGIDO/ws_polygon_2.shp")
rgeos::gIsValid(bacia)

#[1] FALSE
#Warning message:
#In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
#  Ring Self-intersection at or near point -39.070555560000003 -4.8419444399999998

自相交在这里:

zoom(bacia, ext=extent(-39.07828, -39.06074, -4.85128, -4.83396))
points(cbind( -39.070555560000003, -4.8419444399999998))

无效的多边形被删除,因为它们被假定是由相交产生的。在这种情况下,无效数据已经存在并且应该保留。我会看看是否可以解决。