Konwertuj przestrzenny obiekt wielokąta na ramkę danych za pomocą R.

18

Moim celem jest zmodyfikowanie istniejącego pliku kształtu przez scalenie niektórych wielokątów.

Po zaimportowaniu pliku kształtu i użyciu polecenia UnionSpatialPolygons otrzymuję kontur wielokąta, który chcę.

Jednak jest to teraz obiekt SpatialPolygons, a nie SpatialPolygonsDataFrame, więc nie jestem w stanie wyeksportować go do pliku kształtu za pomocą writeOGR.

Jak mogę obejść ten problem?

Jan
źródło
3
Jeśli poniższa odpowiedź była przydatna, wybierz ją jako poprawną, klikając znacznik wyboru po lewej stronie tekstu odpowiedzi.
SlowLearner,

Odpowiedzi:

20

Jak sama nazwa wskazuje, SpatialPolygonsDataFrame jest w zasadzie tylko obiektem SpatialPolygons z dołączonymi danymi (tabela atrybutów). Dane muszą mieć co najmniej tyle wierszy, ile jest funkcji

library(rgdal)
ob <- SpatialPolygons(..)# Your SpatialPolygons Object
spp <-     SpatialPolygonsDataFrame(ob,data=as.data.frame("yourData"),proj4string=CRS("+proj=    aea > +ellps=GRS80 +datum=WGS84"))
writeOGR(spp,"shapes","testShape",driver="ESRI Shapefile",)

----EDYTOWAĆ----

Jeśli chcesz przekonwertować SpatialPolygonsDataFrameplecy na SpatialPolygonsobiekt, musisz po prostu zająć się strukturą obiektu w R.

ob <- SpatialPolygons(spp@polygons,proj4string=spp@proj4string)
Kulik
źródło
Na pewno @Curlew ma rację. Upewnij się, że IDspodczas wykonywania poprawnie podałeś argument UnionSpatialPolygons. W przeciwnym razie możesz mieć problem ze sprecyzowaniem dataargumentu podczas ponownej konwersji na SpatialPolygonsDataFrame.
fdetsch
1
Jasne, dość łatwe. Zredagowałem na to oryginalną odpowiedź
Curlew
1
Dopiero niedawno zacząłem pracować z plikami kształtu i nadal próbuję się z tym zapoznać. Jakie dokładnie dane należy zastąpić danymi data=as.data.frame("yourData")? Po rozpuszczeniu wewnętrznych wielokątów unionSpatialPolygons(...)chciałbym zapisać wynik jako nowy
plik kształtu
Musisz mieć ramkę data.frame z taką samą liczbą wierszy, jak w przypadku obiektów w obiekcie SpatialPolygons. Lepiej zadaj nowe pytanie dotyczące twojego unionproblemu.
Curlew
1
@ Curlew Dziękuję, właśnie opublikowałem nowe pytania tutaj gis.stackexchange.com/q/121405/40108
lightonphiri
9

Problemy:

1: wynikiem UnionSpatialPolygons jest wielokąt przestrzenny

2: przekształcenie wyniku z powrotem w ramkę danych wielokąta przestrzennego jest prawdziwym bólem

-za. potrzebujesz bardzo dokładnej ramki danych, aby dołączyć do wielokąta przestrzennego

-b. dane użyte w UnionSpatialPolygons zawierają więcej wierszy niż dane wyjściowe i nie są sformatowane w sposób, który jest potrzebny.

Moje (brzydkie) rozwiązanie:

### Coerce into spatial polygon data frame with id and row name of spatial polygon

# Make a data frame that meets the requirements above:

df<- data.frame(id = getSpPPolygonsIDSlots(your.spatialpolygon))
row.names(df) <- getSpPPolygonsIDSlots(your.spatialpolygon)

# Make spatial polygon data frame
spdf <- SpatialPolygonsDataFrame(your.spatialpolygon, data =df)

# Then don't forget to make sure the projection is correct
# XXXX is your SRID

proj4string(spdf) <- CRS("+init=epsg:XXXX");
spdf <- spTransform(spdf , CRS("+init=epsg:XXXX"));
K.
źródło
Błąd w if (długość (Sr @ wielokąty)! = Nrow (dane)) stop (wklej („Niedopasowanie długości obiektu: \ n”,: argument ma długość zero Dodatkowo: Komunikaty ostrzegawcze: 1: użyj * zastosuj i wstaw bezpośrednio)
Mox