Konversi objek poligon spasial ke bingkai data menggunakan R

18

Tujuan saya adalah memodifikasi bentuk yang ada dengan menggabungkan poligon tertentu.

Setelah mengimpor shapefile dan menggunakan perintah UnionSpatialPolygons, saya mendapatkan garis besar poligon yang saya inginkan.

Namun, ini sekarang menjadi objek SpatialPolygons dan bukan SpatialPolygonsDataFrame, jadi saya tidak dapat mengekspornya ke shapefile menggunakan writeOGR.

Bagaimana saya bisa mengatasi masalah ini?

John
sumber
3
Jika jawaban di bawah ini berguna, Anda harus memilihnya sebagai yang benar dengan mengklik tanda centang di sebelah kiri teks jawaban.
SlowLearner

Jawaban:

20

Seperti namanya, SpatialPolygonsDataFrame pada dasarnya hanyalah objek SpatialPolygons dengan data yang dilampirkan (tabel atribut). Data harus memiliki paling tidak baris sebanyak fitur

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

---- EDIT ----

Jika Anda ingin mengonversi SpatialPolygonsDataFramepunggung Anda ke SpatialPolygonsobjek, Anda hanya perlu membahas struktur objek dalam R

ob <- SpatialPolygons(spp@polygons,proj4string=spp@proj4string)
Curlew
sumber
Yang pasti, @Curlew benar. Pastikan untuk menentukan IDsargumen dengan benar saat mengeksekusi UnionSpatialPolygons. Kalau tidak, Anda mungkin akan kesulitan menentukan dataargumen saat mengonversi kembali ke SpatialPolygonsDataFrame.
fdetsch
1
Tentu, cukup mudah. Saya mengedit jawaban asli untuk itu
Curlew
1
Saya baru-baru ini mulai bekerja dengan shapefile dan masih mencoba membiasakan diri dengan ini. Apa tepatnya yang harus diganti untuk data Anda data=as.data.frame("yourData")? Setelah melarutkan poligon dalam menggunakan unionSpatialPolygons(...), saya ingin menulis hasil sebagai shapefile baru
lightonphiri
Anda harus memiliki data.frame dengan jumlah baris yang sama dengan fitur di objek SpatialPolygons Anda. Lebih baik ajukan pertanyaan baru tentang unionmasalah Anda ..
Curlew
1
@Curlew Terima kasih, baru saja mengirim pertanyaan baru di sini gis.stackexchange.com/q/121405/40108
lightonphiri
9

Masalah:

1: hasil dari UnionSpatialPolygons adalah poligon spasial

2: mengubah hasilnya kembali menjadi bingkai data poligon spasial sangat menyebalkan

-Sebuah. Anda membutuhkan bingkai data yang sangat tepat untuk dilampirkan ke poligon spasial

-b. data yang Anda gunakan untuk UnionSpatialPolygons memiliki lebih banyak baris daripada output dan tidak diformat dengan cara yang diperlukan.

Solusi (jelek) saya:

### 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.
sumber
Kesalahan dalam jika (panjang (Sr @ poligon)! = Nrow (data)) berhenti (tempel ("Ketidakcocokan panjang objek: \ n",: argumen panjang nol Selain itu: pesan peringatan: 1: gunakan * terapkan dan slot langsung
Mox