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).


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).


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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.