R reconvertit l'objet sf en SpatialPolygonsDataFrame

27

Comment puis-je reconvertir un objet sf en un SpatialPolygonsDataFrame?

J'utilise R 3.4.0 et SF version 0.4.1. La documentation sf mentionne une as_Spatialfonction, mais elle n'est pas disponible dans mon installation (pour une raison quelconque).

Simon
la source
La méthode de coersion est disponible à sf 0.4-1, que se passe-t-il lorsque vous essayez d'appeler la fonction?
Jeffrey Evans
2
as (sf, "Spatial")
mdsumner
@Jeffrey Evans, la réponse de Kazuhito ci-dessous reproduit le problème (et fournit une solution partielle)
Simon

Réponses:

38

j'ai utilisé

 as(nc, 'Spatial')

comme indiqué dans la partie 2 de la vignette d'Edzer Pebesma (faites défiler vers le bas de la page).

andschar
la source
je l'ai vu. Cependant, je ne l'ai compris que récemment et j'ai ressenti le besoin de le mettre dans une bonne réponse en voyant cette question;)
andschar
Et il est important que la réponse acceptée ne soit pas négligée par les futurs lecteurs.
Kazuhito
1
Pour que cela fonctionne vraiment comme un SPDF, je devais faire quelque chose comme tmp <-as(nc, 'Spatial'):, tmpid <- sapply(slot(tmp, "polygons"), function(x) slot(x, "ID"))puisrow.names(tmp) <- tmpid
Simon
1
que signifie «vraiment fonctionner comme un SPDF»? Je ne vois aucun inconvénient créé par la conversion.
andschar
8

J'ai dû utiliser sf:::as_Spatial()comme solution de contournement.

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
la source
Existe-t-il un moyen de conserver la trame de données intacte?
Simon
Exécution as(sf, "Spatial")par @mdsumner, je confirme qu'il produit SpatialPolygonsDataFrame, ce qui est mieux pour vos besoins. Il semble ne as_Spatial()prendre que SFC (c'est-à-dire la géométrie).
Kazuhito
1
Cette fonction est une méthode et peut être appelée en utilisant as (). Il n'est pas exporté en tant qu'objet fonction, c'est pourquoi, pour l'appeler directement, vous avez besoin de ":::".
Jeffrey Evans