Как обрезать шейп-файл многоугольника другим шейп-файлом многоугольника в R?

У меня есть два шейп-файла полигонов, и я хотел бы обрезать один за другим. Я ищу в google, но могу найти только отсечение по ограничительной рамке или точки отсечения по полигонам, а это не то, что мне нужно. Я также нахожу кое-что на других языках программирования, кроме R (http://rosettacode.org/wiki/Sutherland-Hodgman_polygon_clipping#Python). Не могли бы вы помочь мне?

Спасибо Тиаго.


person Tiago    schedule 26.08.2015    source источник
comment
Попробуйте rgeos::gIntersection() как показано в (например) принятом ответе на этот вопрос. В качестве альтернативы, raster::intersect() также должен помочь.   -  person Josh O'Brien    schedule 26.08.2015
comment
@ ДжошО'Брайен Спасибо за ваш ответ. Это помогает мне получить почти то, что я хочу. У меня осталась только одна маленькая проблема. Когда я делаю rgeos::gIntersection(), я теряю все строки, хранящиеся в таблице атрибутов. Есть ли способ, которым я могу сохранить его в соответствии с тем, что было пересечено?   -  person Tiago    schedule 27.08.2015
comment
Возможно, попробуйте raster::intersect(), который был специально разработан для сохранения связанных атрибутов data.frame. (И единственная причина, по которой я говорю, возможно, заключается в том, что иногда это работает не так хорошо, как rgeos::gIntersection(), как, например, с данными в ответе, на который я ссылался выше. Но обычно это работает довольно хорошо.) Надеюсь, это поможет!   -  person Josh O'Brien    schedule 27.08.2015
comment
«Вырезать» сложно — в ArcGIS это одно, а в R — два: одно для использования полигонов для подмножества точек, а другое для использования полигонов для подмножества полигонов.   -  person Mox    schedule 19.01.2020


Ответы (4)


Другой способ отсечения — сделать выделение, например "polygontoclip"["templatepolygon", ], найдено для точек (http://robinlovelace.net/r/2014/07/29/clipping-with-r.html), но также работает с полигонами.

person Debroize    schedule 07.04.2017
comment
«Вырезать» сложно — в ArcGIS это одно, а в R — два: одно для использования полигонов для подмножества точек, а другое для использования полигонов для подмножества полигонов. - person Mox; 19.01.2020

Это не отвечает на ваш вопрос, но, поскольку вы упоминаете отсечение по ограничительной рамке, этот пост появляется в строках поиска:

Из r-bloggers: вырезание по ограничивающей рамке

setwd("../")
library(rgdal)  
zones <- readOGR("data", "london_sport")

сделать ограничивающую рамку:

b <- bbox(zones)
b[1, ] <- (b[1, ] - mean(b[1, ])) * 0.5 + mean(b[1, ])
b[2, ] <- (b[2, ] - mean(b[2, ])) * 0.5 + mean(b[2, ])
b <- bbox(t(b))
plot(zones, xlim = b[1, ], ylim = b[2, ])

Использование пользовательской функции:

library(raster)
library(rgeos)
## rgeos version: 0.3-5, (SVN revision 447)
##  GEOS runtime version: 3.4.2-CAPI-1.8.2 r3921 
##  Polygon checking: TRUE 
gClip <- function(shp, bb){
  if(class(bb) == "matrix") b_poly <- as(extent(as.vector(t(bb))), "SpatialPolygons")
  else b_poly <- as(extent(bb), "SpatialPolygons")
  gIntersection(shp, b_poly, byid = T)
}
zones_clipped <- gClip(zones, b)
## Warning: spgeom1 and  spgeom2 have different proj4 strings
plot(zones_clipped)

Обратите внимание, что из-за операторов if в теле gClip он может обрабатывать практически любые пространственные данные и при этом работать.

westminster <- zones[grep("West", zones$name),]
zones_clipped_w <- gClip(zones, westminster)
## Warning: spgeom1 and spgeom2 have different proj4 strings
plot(zones_clipped_w); plot(westminster, col = "red", add = T)
person Mox    schedule 19.01.2020

Хотя вопрос очень старый, хороший ответ может помочь любому, кто в будущем попадет на эту страницу.

Я думаю, то, что вы пытаетесь сделать, прямолинейно. Для иллюстрации предположим, что меня интересует восточное побережье Саудовской Аравии (ЮА), и у меня есть шейп-файл, в котором есть восточное и западное побережье СА [SA[1] и еще один шейп-файл залива Gulf (видный водоем на восточном побережье ЮАР). Нам нужен пакет SF, чтобы обрезать два шейп-файла.

Загрузите пакет SF

library(sf)

Затем загрузите оба шейп-файла

    ksa <- st_read("cropping_shape_file/ksa/saudi_arabia_coastline.shp")
gulf <- st_read("cropping_shape_file/gulf/ihoPolygon.shp")%>%
  st_transform(st_crs(ksa)) # The st_transform added to this file ensure that both files have same CRS ssstem otherwise it will be impossible to crop. 

вы также можете проверить, совпадают ли их CRS

st_crs(ksa)==st_crs(gulf)

sf_read выводит информацию о шейп-файле в три поля, но нас интересует только геометрия.

ты сможешь

cropped<-st_crop( ksa$geometry, gulf$geometry)
plot(cropped)

У вас должно быть изображение вида обрезано

я предоставляю два шейп-файла здесь https://mega.nz/file/NnxHXajI#KOK_86gwQhtzGfjNs7X5EtvjNs7X2HOAtv a> обратите внимание, что шейп-файл состоит из четырех компонентов, которые необходимо хранить вместе (.shp, .prj, .shx, .dbf).

person Hammao    schedule 24.04.2020

Обрезать шейп-файл другим шейп-файлом

library(raster)
# library(rgdal) # if require
# library(rgeos) # if require

luxembourg <- shapefile(system.file("external/lux.shp", package="raster")) ### load a shape from raster package
plot(luxembourg) 

another_shape <- as(extent(6, 6.4, 49.75, 50), 'SpatialPolygons') ### draw a simple shape / load your own
plot(another_shape, add=T, border="red", lwd=3)

luxembourg_clip <- crop(luxembourg, another_shape) ### crop (SpatialPolygon) luxembourg with another_shape
plot(luxembourg_clip, add=T, col=4) ### plot on 
plot(luxembourg_clip, add=F, col=3) ### just plot

Посмотрите несколько изображений: Карта и Клип

Источник: https://rdrr.io/cran/raster/man/crop.html< /а>

person Yuri Gelsleichter    schedule 10.03.2021