R의 고아 홀 고정


18

두 개의 인접한 shapefile을 병합 한 후 공통 필드에서 통합을 수행하려고합니다. 쉐이프 파일은 그들 사이에 적어도 하나의 얇은 공간이 남게됩니다. 유니온을 시도하면 다음과 같은 고아 구멍 오류가 발생합니다.

createPolygonsComment (p) 오류 : rgeos_PolyCreateComment : 분리 된 구멍, 인덱스 17에서 구멍에 대한 다각형을 포함 할 수 없음

이 링크 에서 재현 가능한 예제를 Dropbox에 업로드했습니다 .

문제를 재현하는 코드는 다음과 같습니다.

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

보고:

createPolygonsComment (p) 오류 : rgeos_PolyCreateComment : 분리 된 구멍, 인덱스 17에서 구멍에 대한 다각형을 포함 할 수 없음

여기여기에 제안 된 수정을 시도 하십시오 .

slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)

이것은 통합 시도에서 발생하지만 색인 번호가 다른 동일한 오류를 리턴합니다.

rgeos_PolyCreateComment : 분리 된 구멍, 인덱스 30에서 구멍에 대한 다각형을 포함 할 수 없음

Roger Bivand의 유용한 튜토리얼 에서 제안 된 수정 시도

fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)

위와 같이 인덱스 30에서 동일한 오류를 반환합니다.

다른 사람들은 여기여기 에서이 문제를 일으켰으며 , 위에 나열된 솔루션이 일부 경우에는 작동하는 것처럼 보이지만 다른 경우에는 해결되지 않습니다. 한 사용자는 QGIS를 사용하여 문제를 해결했고 다른 사용자는 3 개 중 2 개 항목을 수정했지만 최종 항목에 대한 해결책은 없었습니다.

이 코드는 때때로 작동하지만 사람들은 계속 문제를 겪고있는 것으로 보입니다. 아무도 R 내에서 해결책을 찾았습니까?

ArcGIS에서 "지형 수리"도구를 수행했는데 문제가 해결되었지만 R에 수정이 필요한 것 같습니다.


데이터가 없으면 문제가 어디에 있는지 말하기가 어렵습니다.

@Pascal, 방금 10MB 압축 및 16MB 압축 풀기 다운 모양 파일로 드롭 박스 링크를 업로드하여 문제를 재현했습니다. 원본이 1.5GB이므로 데이터를 제공하는 방법을 모르겠지만 ArcGIS를 사용하여 문제를 더 작은 파일로 좁혔습니다. 관리 가능한 크기의 재현 가능한 예제를 작성하고 공유하기위한 좋은 프로토콜이 있습니까?
Luke Macaulay

R로 다른 접근법을 시도해도 효과가 없었습니다. 그리고 지오메트리를 확인할 때 Qgis가 멈추고 있습니다.

답변:


25

나는 첨부 된 데이터의 기하 문제를 분석했습니다, 그리고 그것은 단지이없는 것 orphaned holes도 있지만 geometry validity issues. 그것은 그 사실 orphaned hole어떻게 든 형상 유효성 문제이지만, rgeos은 고아 구멍에 관해서는, 오류가 대신 간단한 경고, 발생, 같은 방식으로 처리하지 않습니다. 알다시피, 다각형 구멍을 확인하는 힌트이지만 고아 구멍을 수정하기 위해 적용 할 때 항상 성공적인 것은 아닙니다.

자,

  1. 데이터 정리 (조합과 같은 지오 프로세싱을 수행하려는 경우 필요)

  2. 정리 된 데이터를 조합 프로세스와 함께 사용

1. 지오메트리 청소 R의 고정 지오메트리는 때때로 어려울 수 있으므로 실험적 R 패키지 ( https://github.com/eblondel/cleangeo 참조 ) 를 만들려고 시도했습니다 sp. 다각형). 다음을 사용하여 패키지를 설치할 수 있습니다.

require(devtools)
install_github("eblondel/cleangeo")
require(cleangeo)

시작하려면 소스 데이터의 형상 문제가 무엇인지 확인하는 것이 좋습니다. 이를 위해 다음을 실행할 수 있습니다 (데이터가 커서 시간이 오래 걸릴 수 있습니다).

#get a report of geometry validity & issues for a sp spatial object
report <- clgeo_CollectionReport(sp)
summary <- clgeo_SummaryReport(report)
issues <- report[report$valid == FALSE,]

이와 함께, 당신은 당신의 데이터가 문제 2 종류가 있음을 볼 수 있습니다 : orphaned holesgeometry validity issues. 둘 다 (고아가 아닌 구멍뿐만 아니라) union프로세스가 실패 할 가능성이 있으므로 가능하면 자동으로 데이터를 미리 정리해야합니다. 빠른 재현을 위해 아래의 첫 번째 샘플 코드는 의심스러운 것으로 태그가 지정된 기능의 하위 집합 만 취합니다 (원래 데이터에서 색인 = 9002 인 최신 코드는 제외). 아래에서 내 노트를 참조하십시오.

#get suspicious features (indexes)
nv <- clgeo_SuspiciousFeatures(report)
mysp <- sp[nv[-14],]

#try to clean data
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

경우 clgeo_Clean일을 잘하지, 당신은 지금 모든 형상이 유효 얻어야한다. 이것을 완전한 데이터 세트에 적용 할 수 있습니다 (기능 색인 = 9002 제외)

#try to clean data
mysp <- sp[-9002,]
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

2. Union 프로세스 이제이 union데이터 세트 에서 작동하는지 살펴 보겠습니다 .

#Attempting a UnionSpatialPolygons based on the COUNTY field
mysp.df <- as(mysp, "data.frame")
countycol <- mysp.df$COUNTY
mysp.diss <- unionSpatialPolygons(mysp.clean, countycol)

참고 : 이전에 말했듯이 하나의 기능을 제거했습니다 (색인 = 9002) plot(sp[9002,]). 구멍을 확인하는 데 너무 많은 시간이 걸리기 때문에 샘플에서 제외했습니다. 데이터를 읽는 데 readShapePoly(에서 maptools)를 사용하여 동일한 문제가 발생하는지 확인하십시오 ...

3. 데이터 읽기를 위해 readShapePoly와 readOGR로 전환 (UPDATE)

readOGRshapefile을 읽을 수있는 유일한 기능은 아닙니다. 당신은 또한 사용할 수 있습니다 readShapePoly에서 maptools첫 번째보다 일반적으로 더 확대됨에, 패키지 :

require(maptools)
mysp <- readShapePoly("ReproducibleExample.shp")

더 빠르게 달리는 것 외에도 :

  • 를 기반으로 한 위의 코드를 사용하면 clgeo_CollectionReport구멍이 분리되지는 않지만 형상에는 문제가 있습니다.

  • 형상을 깨끗하게 청소 clgeo_Clean해도 이제는 기능 지수 9002에 얽매이지 않습니다.

  • 그리고 ... 노조 과정이 작동합니다.

플롯 결과 아래를 참조하십시오.

#plot the result
plot(mysp, border= "lightgray")
plot(mysp.diss, border="red", add = TRUE)

연합 결과

결론 : shapefile 데이터를 읽는 데 maptools 를 선호 하고 지오 프로세싱 전에 cleangeo 를 사용 하여 데이터를 정리 하는 것이 좋습니다 .


고마워 eblondel! 나는 이것을 시도 할 것이다. 패키지 개발에 감사드립니다!
Luke Macaulay

안녕 eblondel, 이것은 잘 작동했지만 형상을 수정할 때 복잡하고 복잡한 피처를 다룰 때 종종 매우 큰 다각형을 생성한다는 것을 알려 드리고자했습니다. 예를 들어 도로 네트워크는 기본적으로 네트워크 범위 인 큰 다각형으로 수정되었습니다. 그것이 얼마나 쉬운 지 잘 모르겠지만 알려 드리고 싶었습니다.
Luke Macaulay 2019

와. 매우 인상적인 패키지. 그것은 많은 작업이었을 것입니다.
nograpes

3
의견을 보내 주셔서 감사합니다. 이 문제가 게시 될 때이 패키지를 처음부터 새로 작성했습니다. 또한 지오메트리 청소가 항상 쉬운 작업이 아니기 때문입니다. 당신이 Github에 있다면, 나는 당신의 'star'를 환영합니다 :-), 나는 미래에 패키지를 더 개선하고 CRAN에서 그것을 릴리스하고 싶습니다.
eblondel

7
cleangeo가 CRAN ( cran.r-project.org/package=cleangeo ) 에 게시되어 있고이를 사용하는 모든 사람에게 Github의 개선 요청 또는 버그를보고 할 수 있음을 알려드립니다 .
eblondel

1

R에서 나를 위해 계속 일하는 편리한 솔루션은 너비가 0 인 버퍼적용하는 것입니다 .

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#project your data (I'm using California Albers here) and apply a zero-width buffer
example <- spTransform(example, CRS("+init=epsg:3310"))
example <- gBuffer(example, byid = T, width = 0)

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

unionSpatialPolygons는이 데이터 세트에 시간이 걸리지 만 제대로 작동하는 것 같습니다.

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