Scal listę przestrzennych obiektów wielokąta w R


16

Mam listę buforów przestrzennych (30000 buforów), które zbudowałem z funkcją 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 

Jak z tej listy mogę połączyć wszystkie bufory przestrzenne, aby uzyskać plik kształtu z 30000 buforami (lub funkcjami)? (Ten plik kształtu zostanie następnie użyty w funkcji aggregatedo agregacji wielokątów przestrzennych według atrybutów).

Przetestowałem ten kod, ale otrzymuję ten komunikat o błędzie:

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
Czy jest jakiś powód, dla którego musisz budować bufory lapplyzamiast używać gBufferz nimi byid = TRUE?
cengel

Odpowiedzi:


12

Biorąc pod uwagę listę SpatialPolygonsobiektów, oto jak zbudować ramkę danych wielokątów przestrzennych z jedną operacją na oryginalną SpatialPolygonsoperację.

Przykładowe dane: splto lista 12 SpatialPolygonsobiektów - upewnij się, że Twój obiekt daje takie same wyniki, jak to, i przetestuj na małej próbce przed uruchomieniem na 30 000:

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

Chcesz utworzyć pojedynczy Spatial Polygonsobiekt ze wszystkimi jego funkcjami, aby następnie utworzyć ramkę danych wielokątów przestrzennych:

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

To bierze pierwszą polygonsszczelinę z obiektu (i powinien być tylko jeden, ponieważ każdy element listy jest obecnie pojedynczą cechą), a następnie konstruuje listę obiektów wielokątów, które są tym, czym karmisz, SpatialPolygonsaby utworzyć funkcję wielofunkcyjną SpatialPolygons. Wykreśl to, a powinieneś zobaczyć wszystkie swoje funkcje. Następnie, jeśli chcesz zapisać jako shapefile, musisz dodać trochę danych. W przypadku braku czegokolwiek innego tworzę prostą kolumnę identyfikatora od 1 do 12:

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

FALSEFlag po prostu przestaje R próbuje zmienić dane przestrzenne i non-przestrzennych, aby dopasować się. Możesz chcieć umieścić rozmiary buforów w ramce danych lub coś takiego.

Zadanie wykonane.


18

Aby scalić listę obiektów przestrzennych, możesz:

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

2

Możesz użyć argumentu makeUniqueIDs w rbind, jeśli twoje wielokąty nie mają unikalnych identyfikatorów.

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.