Зворотне відсікання (стирання) в 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))

також дивіться у нижній частині цієї статті

можна також виконати примушування Sp до sf з st_as_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)

Попередження про проекцію відбувається тому, що у LondonBoroughsформаті .prjфайлу немає файлу.

Просто щоб переконатися, що це отвір, а не контур чи інший суцільний багатокутник:

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

Настільки просто, дякую за швидку відповідь. Було б цікаво подивитися вихідний код цих функцій, щоб побачити, що відбувається під кришкою.
RobinLovelace

Глибоко вниз вони просто називають GEOS, що є бібліотекою C-коду геометричних функцій trac.osgeo.org/geos
Spacedman

Цікаво - і допомагає пояснити, чому я думаю, що це досить швидко. На основі цієї сторінки, здається, що це не активно розробляється, чи може хтось це підтвердити / спростувати? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace

1
Напевно він розроблений. Дивіться часові шкали trac.osgeo.org/geos/timeline або архіви списку розсилки списки.osgeo.org
pipermail/geos-

5

Трохи запізнюється на партію, але є простий спосіб зробити це за допомогою маски, використовуючи аргумент 'зворотний';

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

З растрового пакету. А від sf якісь ідеї?
RobinLovelace
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.