Відсікайте багатокутник і зберігайте дані?


13

У мене є ці два багатокутники:

library(sp); library(rgeos); library(maptools)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                    55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                    55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                                   242), variable2 = c(235, 464), row.names = c("p1", "p2")))
proj4string(spdf1) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf1, col="red")

coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                     55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                      variable2 = c(3), row.names = c("p1a")))
proj4string(spdf2) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf2, col="yellow", add=T)

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

Я хочу вирізати частини spdf1, які перетинаються spdf2. Однак я хочу spdf1залишатися як SpatialPolygonsDataFrame та зберігати будь-яку інформацію, що міститься в ньому spdf1@data.

Я спробував gDifference наступним чином, який вирізає частини spdf1, які перетинаються spdf2, але потім перетворюється spdf1на SpatialPolygons (тобто відкидання інформації, що міститься в spdf1@data).

gDifference(spdf1, spdf2, byid=T)

Як я можу нарізають spdf1з , spdf2але зберігають містяться дані в spdf1@data? Я перевірив і спробував це подібне питання без того, як накласти багатокутник на SpatialPointsDataFrame та зберегти дані SPDF?

Відповіді:


9

Найпростіший підхід був би

  library(raster)
  x <- spdf1 - spdf2

  # or, more formally
  y <- erase(spdf1,  spdf2)

Див. "Растровий пакет" (розділ XIV) для отримання додаткових функцій, що стосуються накладання багатокутника. Ці функції використовують базові функції rgeos під кришкою, у функціях "user-level" (на відміну від "level-developer").


Що ви маєте на увазі під "на рівні користувача" (на відміну від "рівня розробника")?
luciano

rgeosнадає геометричні операції, але не стосується атрибутів даних. Таким чином, використання цих функцій вимагає великої роботи, щоб зберегти все разом. Растрові функції спрощують це і ведуть себе як подібні функції в програмному забезпеченні ГІС,
Роберт Хідманс

Так, але це може призвести до помилки в SpatialPolygonsDataFrame (part2, x @ data [match (row.names (part2),: row.names даних та полігони ID не відповідають)
jebyrnes

Це була б помилка. Чи можете ви навести приклад цього?
Роберт Хіджманс

4

Приблизним рішенням може бути повторне додавання атрибутів після створення кліпу, конвертування з SpatialPolygonsу SpatialPolygonsDataFrame.

sp3 <- gDifference(spdf1, spdf2, byid = TRUE)
row.names(sp3) <- row.names(spdf1)

spdf3 <- SpatialPolygonsDataFrame(sp3, data = spdf1@data)

spdf3@data

   variable1 variable2
p1       232       235
p2       242       464

plot(spdf3, col="red")

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


Це виглядає як проблема, яка у мене є, лише вихідний кліп у моєму конкретному екземплярі створює імена рядків з spdf1, яких не існує (як простий gsub, щоб позбутися 2-ої цифри в row.name, слід подбати про збіг імен рядків, ні? )
jebyrnes

Помилка в SpatialPolygonsDataFrame (кліп, дані = as.data.frame (all_spdfs_together @ дані)): Невідповідність довжини об'єкта: кліп має 1718 об'єктів полігонів, але as.data.frame (all_spdfs_together @ data) має 86 рядків
jebyrnes

Звичайно - у мене є купа полігонів речей в океані. Деякі неправильно розміщені на суші або перекриваються землею. Я хочу обрізати це, щоб у мене були лише райони, які знаходяться в океані. У мене є формальне зображення узбережжя для порівняння. Ось код - gist.github.com/jebyrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jebyrnes

1
nevermind - рішення про raster :: erase працює (раніше не було з якоїсь дивної причини)
jebyrnes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.