R sf-Objekt zurück in SpatialPolygonsDataFrame konvertieren

27

Wie konvertiere ich ein sf-Objekt zurück in einen SpatialPolygonsDataFrame?

Ich verwende R 3.4.0 und sf Version 0.4.1. In der sf-Dokumentation wird eine as_SpatialFunktion erwähnt, die in meiner Installation jedoch nicht verfügbar ist (aus irgendeinem Grund).

Simon
quelle
Die Coversion-Methode ist ab sf 0.4-1 verfügbar. Was passiert, wenn Sie versuchen, die Funktion aufzurufen?
Jeffrey Evans
2
as (sf, "Spatial")
mdsumner
@ Jeffrey Evans, Kazuhito Antwort unten repliziert das Problem (und bietet eine teilweise Lösung)
Simon

Antworten:

38

ich benutzte

 as(nc, 'Spatial')

als Teil 2 der Vignette von Edzer Pebesma angegeben (Bildlauf nach unten).

andschar
quelle
sah es. Allerdings habe ich das erst kürzlich herausgefunden und ich hatte das Bedürfnis, es richtig zu beantworten, als ich diese Frage sah;)
andschar
Und es ist wichtig, dass die akzeptierte Antwort von zukünftigen Lesern nicht übersehen wird.
Kazuhito
1
Für diese wirklich wie ein SPDF- arbeiten, musste ich so etwas tun: tmp <-as(nc, 'Spatial'), dann tmpid <- sapply(slot(tmp, "polygons"), function(x) slot(x, "ID"))dannrow.names(tmp) <- tmpid
Simon
1
Was bedeutet "wirklich wie ein SPDF arbeiten"? Ich sehe keinen Nachteil durch die Umstellung.
Andschar
8

Ich musste sf:::as_Spatial()als Workaround verwenden.

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
quelle
Gibt es eine Möglichkeit, den Datenrahmen intakt zu halten?
Simon
Ausführen as(sf, "Spatial")von @mdsumner bestätige ich , es produziert SpatialPolygonsDataFrame, die für Ihre Anforderung besser ist. Es scheint, dass as_Spatial()nur sfc (dh Geometrie) benötigt wird.
Kazuhito
1
Diese Funktion ist eine Methode und soll mit as () aufgerufen werden. Es wird nicht als Funktionsobjekt exportiert. Um es direkt aufzurufen, benötigen Sie ":::".
Jeffrey Evans