R mengonversi objek sf kembali ke SpatialPolygonsDataFrame

27

Bagaimana cara mengubah objek sf kembali ke SpatialPolygonsDataFrame?

Saya menjalankan R 3.4.0 dan sf versi 0.4.1. The dokumentasi sf menyebutkan sebuah as_Spatialfungsi, tapi ini tidak tersedia di saya install (untuk beberapa alasan).

Simon
sumber
Metode koersi tersedia pada sf 0.4-1, apa yang terjadi ketika Anda mencoba memanggil fungsi?
Jeffrey Evans
2
as (sf, "Spatial")
mdsumner
@ Jeffrey Evans, jawaban Kazuhito di bawah ini mereplikasi masalah (dan memberikan solisi parsial)
Simon

Jawaban:

38

Saya menggunakan

 as(nc, 'Spatial')

sebagai bagian 2 dari sketsa yang ditunjukkan oleh Edzer Pebesma (Gulir ke bagian bawah halaman).

andschar
sumber
melihatnya. Namun saya menemukan ini hanya baru-baru ini dan saya merasakan dorongan untuk memasukkannya ke dalam jawaban yang tepat ketika melihat pertanyaan ini;)
andschar
Dan penting bahwa jawaban yang diterima tidak akan diabaikan oleh pembaca di masa depan.
Kazuhito
1
Untuk ini untuk benar-benar bekerja seperti SPDF, saya perlu melakukan sesuatu seperti: tmp <-as(nc, 'Spatial'), maka tmpid <- sapply(slot(tmp, "polygons"), function(x) slot(x, "ID"))kemudianrow.names(tmp) <- tmpid
Simon
1
apa arti 'benar-benar berfungsi seperti SPDF'? Saya melihat tidak ada kerugian yang dibuat oleh konversi.
andschar
8

Saya harus menggunakan sf:::as_Spatial()solusi.

library(sf)
nc <- st_read(system.file("shape/nc.shp", package="sf"))

# sf -> sp
nc_sp <- as_Spatial(nc$geom)      # Error: could not find function "as_Spatial"

nc_sp <- sf:::as_Spatial(nc$geom) # This works

library(sp)
plot(nc_sp)
Kazuhito
sumber
Apakah ada cara untuk menjaga frame data tetap utuh?
Simon
Dijalankan as(sf, "Spatial")oleh @mdsumner, saya mengonfirmasi ini menghasilkan SpatialPolygonsDataFrame, yang lebih baik untuk kebutuhan Anda. Tampaknya hanya as_Spatial()membutuhkan sfc (yaitu geometri).
Kazuhito
1
Fungsi ini adalah metode dan harus dipanggil menggunakan as (). Itu tidak diekspor sebagai objek fungsi yang mengapa, untuk memanggilnya langsung, Anda perlu ":::".
Jeffrey Evans