Як виконати справжній GIS-кліп багатошарового шару, використовуючи багатокутний шар у R?


16

Я хотів би зробити справжній GIS-кліп у R полігонів ґрунтів, використовуючи ряд одномежних багатокутників, але я не можу знайти функцію R, щоб правильно це зробити. Він повинен працювати так само, як clipфункція в ArcMap ESRI. Я спробував overметод у spпакеті, але він, схоже, не працює для полісів над полісами.

Одне з пропозицій було використовувати gIntersectionв rgeosпакеті як кліп , використовуючи наступний код:

#------------------------------------
library(rgeos)
library(maptools)

#Read layers as SpatialPolygonsDataFrame (both the same Albers projection)
Soils_poly = readShapePoly("Soils_polygons")  #Note - Has 400 polygons
clipper_poly = readShapePoly("clipper_polygon")  #Note - Has 1 polygon

#Try gintersection as clip 
Clipped_polys = gIntersection(Clipper_Tile_poly, Soils_poly)

#-----------------------------------

На це потрібно 5 хвилин (занадто повільно) та помилки з цим:

Помилка RGEOSBinTopoFunc (spgeom1, spgeom2, byid, id, drop_not_poly, "rgeos_intersection"): TopologyException: відсутні вихідні dirEdge знайдені в -721459.77681285271 2009506.5980877089

Я також спробував цей код, щоб перевірити наявність дублювання:

gIntersects(Clipper_Tile_poly, Soils_poly)

і результат був ІСТИНИЙ. clipФункція в ESRI ArcMap прекрасно працює для цих даних.

Хтось знає про функцію R, щоб правильно робити кліп на просторових багатокутниках, використовуючи просторові багатокутники?


Спробуйте gIntersection with byid = TRUE (я думаю, це проблема із звисаючими топологіями для певних кліпів, а іноді це робиться таким чином), для швидкої перевірки gUnarySTRtreeQuery () або gBinarySTRtreeQuery () для виявлення пересічних обмежувальних коробок пар многокутників і тільки перетинають ці пари. Немає легких
обгортків

Відповіді:


20

Підказка, яку надає @mdsummer про використання, byid=TRUEпрацює точно.

Дивіться відтворюваний приклад нижче:

library(rgeos)
library(sp)

#Create SpatialPlygons objects
polygon1 <- readWKT("POLYGON((-190 -50, -200 -10, -110 20, -190 -50))") #polygon 1
polygon2 <- readWKT("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20))") #polygon 2

par(mfrow = c(1,2)) #in separate windows
plot(polygon1, main = "Polygon1") #window 1
plot(polygon2, main = "Polygon2") #window 2

багатокутники поруч

polygon_set <- readWKT(paste("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20),",
                     "(-190 -50, -200 -10, -110 20, -190 -50))"))

par(mfrow = c(1,1)) #now, simultaneously
plot(polygon_set, main = "Polygon1 & Polygon2")

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

clip <- gIntersection(polygon1, polygon2, byid = TRUE, drop_lower_td = TRUE) #clip polygon 2 with polygon 1
plot(clip, col = "lightblue")

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

GT <- GridTopology(c(-175, -85), c(10, 10), c(36, 18))
gr <- as(as(SpatialGrid(GT), "SpatialPixels"), "SpatialPolygons")
plot(gr)

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

clip2 <- gIntersection(clip, gr, byid = TRUE, drop_lower_td = TRUE)
plot(clip2, col = "pink")

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


1
Працює мрія - неймовірно швидко. Я використовую це для відсікання поліліній. Я хотів зробити підмножини формфайлу для британських річок, тому що набагато швидше працювати з меншим підмножиною даних.
CJB

1
@AndreSilva, подумав, що маю, але здогадуюсь, я цього не зробив! Re: співтовариство, я б хотів, щоб спільнота розробників R GIS була трохи більшою TBH. Мені, мабуть, доведеться перенестись на ArcMap для деякої оцифрування та інших процесів, які швидкі в GUI.
Багатий Паулуо

3

Ви також можете використовувати растровий пакет raster::intersect(spdf1, spdf2). Він має перевагу у підтримці атрибутів у випадку, якщо у вас є SpatialPolygonsDataFrame.

library(sp); library(rgeos)

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")))
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")))

# works but drop the attributes
#gIntersection(spdf1, spdf2, byid=T)

#better to keep attributes
inter1=raster::intersect(spdf1, spdf2)

plot(spdf1, col="red")
plot(spdf2, col="yellow", add=T)
plot(inter1,col="blue", add=T)

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

Завдяки цьому питанню вказуємо на це та на зразок коду.

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