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


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.