R에서 다각형 레이어를 사용하여 다각형 레이어의 진정한 GIS 클립을 수행하는 방법은 무엇입니까?


16

일련의 단일 경계 다각형을 사용하여 토양 다각형 R에서 실제 GIS 클립을 만들고 싶지만 제대로 수행하기위한 R 함수를 찾을 수 없습니다. clipESRI ArcMap 의 기능 과 동일하게 작동합니다. 패키지 에서 over방법을 시도했지만 sp폴리에 대한 폴리에 대해서는 작동하지 않는 것 같습니다.

한 가지 제안은을 사용하는 것이었다 gIntersectionrgeos다음 코드를 사용하여 클립으로 패키지 :

#------------------------------------
library(rgeos)
library(maptools)

#Read layers as SpatialPolygonsDataFrame (both the same Albers projection)
Soils_poly = readShapePoly("Soils_polygons")  #Note - Has 400 polygons
clipper_poly = readShapePoly("clipper_polygon")  #Note - Has 1 polygon

#Try gintersection as clip 
Clipped_polys = gIntersection(Clipper_Tile_poly, Soils_poly)

#-----------------------------------

실행하는 데 5 분이 소요되며 (너무 느리게) 다음과 같은 오류가 발생합니다.

RGEOSBinTopoFunc (spgeom1, spgeom2, byid, id, drop_not_poly, "rgeos_intersection")의 오류 : TopologyException : -721459.77681285271 2009506.5980877089에 발신 dirEdge가 없습니다.

또한이 코드를 사용하여 겹침을 확인했습니다.

gIntersects(Clipper_Tile_poly, Soils_poly)

결과는 참이었습니다. clipESRI ArcMap의 기능은이 데이터에 적합합니다.

공간 다각형을 사용하여 공간 다각형에서 클립을 올바르게 수행하는 R 함수를 아는 사람이 있습니까?


byid = TRUE로 gIntersection을 시도하십시오 (특정 클립에 매달려있는 토폴로지에 문제가 있고 때로는 도움이되는 경우가 있습니다), gUnarySTRtreeQuery () 또는 gBinarySTRtreeQuery ()의 속도 체크 아웃을 위해 다각형 쌍의 교차 경계 상자를 식별하고 그 쌍을 교차시킵니다. 이 모든 afaik를위한 쉬운 고급 래퍼는 없습니다
mdsumner

답변:


20

@mdsummer가 제공하는 힌트 byid=TRUE는 정확하게 작동합니다.

아래의 재현 가능한 예를 참조하십시오.

library(rgeos)
library(sp)

#Create SpatialPlygons objects
polygon1 <- readWKT("POLYGON((-190 -50, -200 -10, -110 20, -190 -50))") #polygon 1
polygon2 <- readWKT("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20))") #polygon 2

par(mfrow = c(1,2)) #in separate windows
plot(polygon1, main = "Polygon1") #window 1
plot(polygon2, main = "Polygon2") #window 2

나란히 다각형

polygon_set <- readWKT(paste("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20),",
                     "(-190 -50, -200 -10, -110 20, -190 -50))"))

par(mfrow = c(1,1)) #now, simultaneously
plot(polygon_set, main = "Polygon1 & Polygon2")

여기에 이미지 설명을 입력하십시오

clip <- gIntersection(polygon1, polygon2, byid = TRUE, drop_lower_td = TRUE) #clip polygon 2 with polygon 1
plot(clip, col = "lightblue")

여기에 이미지 설명을 입력하십시오

GT <- GridTopology(c(-175, -85), c(10, 10), c(36, 18))
gr <- as(as(SpatialGrid(GT), "SpatialPixels"), "SpatialPolygons")
plot(gr)

여기에 이미지 설명을 입력하십시오

clip2 <- gIntersection(clip, gr, byid = TRUE, drop_lower_td = TRUE)
plot(clip2, col = "pink")

여기에 이미지 설명을 입력하십시오


1
놀라 울 정도로 빠른 꿈을 꾸십시오. 이것을 사용하여 폴리 라인을 자릅니다. 영국 하천에 대한 셰이프 파일의 하위 집합을 만들고 싶었습니다. 작은 하위 데이터로 작업하는 것이 훨씬 빠르기 때문입니다.
CJB

1
@AndreSilva, 내가 가지고 있다고 생각했지만 내가하지 않았다고 생각합니다! Re : 커뮤니티, R GIS 개발자 커뮤니티가 좀 더 큰 TBH 였으면 좋겠습니다. 아마도 일부 디지털화와 GUI에서 빠른 다른 프로세스를 위해 ArcMap으로 돌아 가야 할 것입니다.
Rich Pauloo

3

래스터 패키지를 사용할 수도 있습니다 raster::intersect(spdf1, spdf2). SpatialPolygonsDataFrame이있는 경우 속성을 유지하는 이점이 있습니다.

library(sp); library(rgeos)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                               242), variable2 = c(235, 464), row.names = c("p1", "p2")))
coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                 55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                  variable2 = c(3), row.names = c("p1a")))

# works but drop the attributes
#gIntersection(spdf1, spdf2, byid=T)

#better to keep attributes
inter1=raster::intersect(spdf1, spdf2)

plot(spdf1, col="red")
plot(spdf2, col="yellow", add=T)
plot(inter1,col="blue", add=T)

여기에 이미지 설명을 입력하십시오

덕분에 이 질문 이 밖으로 포인팅 및 샘플 코드.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.