토폴로지 예외 가져 오기 : 입력 Geom 1이 유효하지 않습니다. 이는 R의 자체 교차로 인한 것입니까?


24

잘못된 다각형 도형에서 발생하는 'TopologyException : Input geom 1 is invalid'자체 교차 오류가 널리 논의되었습니다. 그러나 웹에서만 R 기능에만 의존하는 편리한 솔루션을 찾지 못했습니다.

예를 들어 map("state", ...)Josh O'Brien의 멋진 답변 을 다음과 같이 출력하여 'SpatialPolygons'객체를 만들었 습니다 .

library(maps)
library(maptools)

map_states = map("state", fill = TRUE, plot = FALSE)

IDs = sapply(strsplit(map_states$names, ":"), "[[", 1)
spydf_states = map2SpatialPolygons(map_states, IDs = IDs, proj4string = CRS("+init=epsg:4326"))

plot(spydf_states)

주

이 광범위하게 적용되는 데이터 세트의 문제점은 이제 자체 교차점이 아래 주어진 지점에서 발생한다는 것입니다.

rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
  Self-intersection at or near point -122.22023214285259 38.060546477866055

불행히도이 문제는 'spydf_states'를 더 이상 사용하지 못하게합니다 (예 :을 호출 할 때) rgeos::gIntersection. R 내에서이 문제를 어떻게 해결할 수 있습니까?


1
해당 지점을 확대 plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))하면 "겉보기"가 없다는 것을 알 수 있습니다. 자체 교차점이 있습니다.
Spacedman

답변:


39

폭이 0 인 버퍼를 사용하면 R의 많은 토폴로지 문제가 해결됩니다.

spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

그러나 투영되지 않은 위도 좌표로 작업하면 rgeos경고 가 발생할 수 있습니다 .

다음은 먼저 Albers 투영으로 다시 투영하는 확장 된 예입니다.

library(sp)
library(rgeos)

load("~/Dropbox/spydf_states.RData")

# many geos functions require projections and you're probably going to end
# up plotting this eventually so we convert it to albers before cleaning up
# the polygons since you should use that if you are plotting the US
spydf_states <- spTransform(spydf_states, 
                            CRS("+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96"))

# simplify the polgons a tad (tweak 0.00001 to your liking)
spydf_states <- gSimplify(spydf_states, tol = 0.00001)

# this is a well known R / GEOS hack (usually combined with the above) to 
# deal with "bad" polygons
spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

# any bad polys?
sum(gIsValid(spydf_states, byid=TRUE)==FALSE)

## [1] 0

plot(spydf_states)

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


4
gBuffer"핵"이 작동 하는 이유에 대한 추가 논평 / 독해 ?
MichaelChirico

data.frame을 분해하고 SPDF를 공간 폴리곤 객체로 변환 할 때 gSimplify를 사용 하시겠습니까?
wnursal

5
사용중인 경우 다음 sf을 사용할 수도 있습니다sf::st_buffer(x, dist = 0)
Phil

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