R'deki uzamsal çokgen nesnelerinin listesini birleştir


16

Ben fonksiyonu ile inşa mekansal tamponlar (30000 tamponlar) bir listesi var lapply:

buff.pts <- lapply(1:nrow(pts.prj), FUN=function(l){
  buff <- gBuffer(pts.prj[l,], width=1000) ## 1km
  return(buff)
}))

> head(buff.pts)
[[1]]
class       : SpatialPolygons 
features    : 1 
extent      : 307941.8, 311941.8, 4994518, 4998518  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

[[2]]
class       : SpatialPolygons 
features    : 1 
extent      : 307226, 311226, 4991153, 4995153  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

Bu listeden, 30000 arabellekleriyle (veya özelliklerle) bir şekil dosyası elde etmek için tüm uzamsal arabellekleri nasıl birleştirebilirim? (Bu şekil dosyası, işlevde aggregateuzamsal çokgenleri özniteliklere göre toplama işlevinde kullanılacaktır .)

Bu kodu test ettim ama şu hata iletisini alıyorum:

test <- as.data.frame(do.call("rbind", buff.pts))
Error in as.data.frame(do.call("rbind", buff.pts)) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Error in validObject(res) : 
  invalid class SpatialPolygons object: non-unique Polygons ID slot values

3
Eğer ile tampon oluşturmak için gereken bir nedenin lapplykullanmak yerine gBuffersahip byid = TRUE?
cengel

Yanıtlar:


12

Bir SpatialPolygonsnesne listesi verildiğinde , orijinal SpatialPolygonsözellik başına bir özellik içeren bir uzamsal çokgenler veri çerçevesinin nasıl oluşturulacağı aşağıda açıklanmıştır .

Örnek veriler: spl12 SpatialPolygonsnesnenin bir listesidir - nesnenizin bununla aynı sonuçları verdiğinden emin olun ve 30.000 üzerinde çalıştırmadan önce küçük bir örnek üzerinde test edin:

> length(spl)
[1] 12
> class(spl)
[1] "list"
> class(spl[[1]])
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

Daha Spatial Polygonssonra bir Uzamsal Çokgenler Veri Çerçevesi oluşturmak için içindeki tüm özelliklere sahip tek bir nesne oluşturmak istiyorsunuz :

> joined = SpatialPolygons(lapply(spl, function(x){x@polygons[[1]]}))
> plot(joined)

Bu, ilk polygonsyuvayı nesneden alır (ve her liste öğesi şu anda tek bir özellik olduğundan yalnızca bir tane olmalıdır) ve sonra SpatialPolygonsçok özellikli hale getirmek için beslediğiniz çokgen nesnelerinin bir listesini oluşturur SpatialPolygons. Bunu çizin ve tüm özelliklerinizi görmelisiniz. Sonra, a olarak kaydetmek istiyorsanız shapefile, bazı veriler eklemeniz gerekir. Başka bir şeyin yokluğunda, basit bir 1 ila 12 kimlik sütunu oluşturuyorum:

> jdata = SpatialPolygonsDataFrame(Sr=joined, data=data.frame(i=1:12),FALSE)

FALSEBayrak sadece R kadar maç mekansal ve mekansal olmayan verilerin yeniden düzenlemek için çalışıyor durur. Arabellek boyutlarını veri çerçevesine veya başka bir şeye koymak isteyebilirsiniz.

İş bitmiş.


18

Uzamsal nesnelerin listesini birleştirmek için şunları yapabilirsiniz:

library(raster)
m <- do.call(bind, buff.pts) 

2

Çokgenleriniz benzersiz kimliklere sahip değilse rbind içindeki makeUniqueIDs bağımsız değişkenini kullanabilirsiniz.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
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.