R'de bir çokgen katmanı kullanarak çokgenler katmanının gerçek bir CBS klibi nasıl yapılır?


16

Bir dizi tek sınır çokgen kullanarak toprak poligonlarının R'sinde gerçek bir CBS Klipsi yapmak istiyorum, ancak düzgün bir şekilde yapmak için bir R işlevi bulamıyorum. clipESRI'nin ArcMap'indeki gibi çalışır . Ben overyöntemi sppaketinde denedim ama polys üzerinde polys için çalışmıyor gibi görünüyor.

Bir öneri, aşağıdaki paketi kullanarak gIntersectionin rgeospaketini klip olarak kullanmaktı:

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

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

Bu işlemin çalışması 5 dakika (çok yavaş) ve bununla ilgili hatalar:

RGEOSBinTopoFunc'da hata (spgeom1, spgeom2, byid, id, drop_not_poly, "rgeos_intersection"): TopologyException: -721459.77681285271 2009506.5980877089 adresinde giden dirEdge bulunamadı

Ayrıca örtüşmeyi kontrol etmek için bu kodu denedim:

gIntersects(Clipper_Tile_poly, Soils_poly)

ve sonuç DOĞRU idi. clipESRI ArcMap içindeki işlev bu veriler için iyi çalışır.

Herkes uzamsal çokgenler kullanarak uzamsal çokgenler üzerinde düzgün bir klip yapmak için bir R işlevi biliyor mu?


Giderstation withid = TRUE (bazı klipler için sarkan topolojilerle ilgili bir sorun olduğunu ve bazen bu şekilde yardımcı olduğunu düşünüyorum), çokgen çiftlerinin kesişen sınırlayıcı kutularını tanımlamak için gUnarySTRtreeQuery () veya gBinarySTRtreeQuery () yöntemini deneyin bu çiftleri kesişir. Tüm bu afaik için kolay bir üst düzey sarmalayıcı yok
mdsumner

Yanıtlar:


20

@Mdsummer'in kullanma ipucu byid=TRUEdoğru çalışıyor.

Aşağıdaki tekrarlanabilir örneğe bakın:

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

çokgenler yan yana

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin


1
Rüya gibi çalışır - inanılmaz derecede hızlı. Bunu, çoklu çizgileri kırpmak için kullanıyorum. İngiliz nehirleri için şekil dosyasının alt kümelerini yapmak istedim, çünkü daha küçük bir veri alt kümesiyle çalışmak çok daha hızlı.
CJB

1
@AndreSilva, sahip olduğumu düşündüm, ama tahmin etmedim! Re: topluluk, keşke R GIS geliştirici topluluğu biraz daha büyük TBH olsaydı. Muhtemelen bazı sayısallaştırma ve GUI'de hızlı olan diğer işlemler için ArcMap'e geri dönmem gerekecek.
Rich Pauloo

3

Raster paketini de kullanabilirsiniz raster::intersect(spdf1, spdf2). SpatialPolygonsDataFrame'iniz olması durumunda öznitelikleri koruma avantajına sahiptir.

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)

resim açıklamasını buraya girin

Bu soruya işaret ve örnek kod için teşekkürler .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.