R에서 역 클리핑 (지우기)?


14

반대 클립은 다른 오브젝트 내부에 있는 부분을 ​​저장하는 일반 클립과 달리 다른 오브젝트의 경계 외부에 있는 공간 오브젝트의 일부만 저장 합니다.

ArcMap에서 리버스 클립을 수행합니까? ArcMap에서 수행하는 방법을 보여줍니다.

R에서 어떻게해야합니까?

재현 가능한 예 (Linux 시스템) :

system("wget 'https://github.com/Robinlovelace/Creating-maps-in-R/archive/master.zip' -P /tmp/")
unzip("/tmp/master.zip", exdir = "/tmp/master")
uk <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "ukbord")
lnd <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "LondonBoroughs")
plot(uk)
plot(lnd, add = T, col = "black")

내가 여기서하고 싶은 것은 런던을 제외한 모든 영국을 구하는 것입니다 . 시각적으로 결과 이미지의 검은 모양이 구멍이되기를 원합니다.

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

답변:


4

간단한 기능에 대한 답변 :

sf 패키지는 Geometry Engine 오픈 소스를 사용하므로 st_within 등과 같은 명령 목록에 액세스 할 수 있습니다.

st_difference 명령 중 하나가 작업을 수행합니다.

require(sf)

# make a square simple feature
s <- rbind(c(1,1), c(1,5), c(5,5), c(5,1), c(1,1))
s.sf <-st_sfc(st_polygon(list(s)))
s.pol = st_sf(ID = "sq", s.sf)

# make a smaller triangle simple feature
s2 <- rbind(c(2,2), c(3,4), c(4,2), c(2,2))
s2.sf <-st_sfc(st_polygon(list(s2)))
s2.pol = st_sf(ID = "tr", s2.sf)

# find the 'difference', i.e. reverse of st_intersection
t <- st_difference(s.pol,s2.pol)

plot(t)

# have a look at the new geometry, a well known text format with exterior followed by hole
st_geometry(t)[[1]]
POLYGON((1 1, 1 5, 5 5, 5 1, 1 1), (2 2, 4 2, 3 4, 2 2))

이 기사 의 하단을 참조하십시오

st_as_sf를 사용하여 Sp를 sf로 강제 변환하여 수행 할 수도 있습니다. 속성을 관리하기 까다로울 수 있으므로 경고에 유의하십시오!


12

패키지 gDifference에서 간단한 응용 프로그램으로 보입니다 rgeos.

> require(rgeos)
> ukhole = gDifference(uk, lnd)
Warning message:
In RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_difference") :
  spgeom1 and spgeom2 have different proj4 strings
> plot(ukhole)

투영 경고는 LondonBoroughsshapefile에 파일 이 없기 때문 .prj입니다.

구멍 또는 윤곽선이나 다른 솔리드 다각형이 아닌지 확인하십시오.

> gArea(lnd) + gArea(ukhole) - gArea(uk)
[1] 0

빠른 답변 감사합니다. 이러한 기능의 소스 코드를보고 관심이있는 부분을 살펴보고자합니다.
RobinLovelace

깊은 곳에서 지오메트리 함수의 C 코드 라이브러리 인 GEOS라고 부릅니다. trac.osgeo.org/geos
Spacedman

흥미롭고 왜 그것이 합리적으로 빠른지 설명하는 데 도움이됩니다. 이 페이지를 바탕으로 적극적으로 개발되지 않은 것 같습니다. svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace

1
확실히 개발되었습니다. 타임 라인 참조 trac.osgeo.org/geos/timeline 또는 메일 링리스트 아카이브 lists.osgeo.org/pipermail/geos-devel
user30184

5

파티에 늦었지만 'inverse'인수를 사용하여 마스크 로이 작업을 수행하는 간단한 방법이 있습니다.

ukhole <- mask(uk, lnd, inverse = TRUE)

래스터 패키지에서. 그리고 SF에서 어떤 아이디어가 있습니까?
RobinLovelace
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.