Обратное отсечение (стирание) в 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")

Здесь я хочу спасти всю Великобританию, кроме Лондона. Визуально, я хочу, чтобы черная фигура в результирующем изображении была дырой.

введите описание изображения здесь

RobinLovelace
источник

Ответы:

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
Spacedman
источник
Ооочень просто, спасибо за быстрый ответ. Было бы интересно посмотреть на исходный код этих функций, чтобы увидеть, что происходит под капотом.
RobinLovelace
В глубине души они просто называют GEOS, которая является библиотекой геометрических функций на С-коде. Trac.osgeo.org/geos
Spacedman
Интересно - и помогает объяснить, почему это достаточно быстро, я думаю. Исходя из этой страницы, кажется, что она не разрабатывается активно, может кто-нибудь подтвердить / опровергнуть это? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace
1
Наверняка это разработано. Смотрите временную шкалу trac.osgeo.org/geos/timeline или архивы списков
user30184
5

Немного опоздал на вечеринку, но есть простой способ сделать это с помощью маски, используя аргумент «inverse»;

ukhole <- mask(uk, lnd, inverse = TRUE)
Coding4Biology
источник
Из растрового пакета. А у СФ какие-нибудь идеи?
RobinLovelace