R converte o objeto sf novamente para SpatialPolygonsDataFrame

27

Como converter um objeto sf novamente em um SpatialPolygonsDataFrame?

Estou executando o R 3.4.0 e a versão 0.4.1 do sf. A documentação do sf menciona uma as_Spatialfunção, mas isso não está disponível na minha instalação (por algum motivo).

Simon
fonte
O método de coerção está disponível em sf 0.4-1, o que acontece quando você tenta chamar a função?
Jeffrey Evans
2
as (sf, "Spatial")
mdsumner 4/17/17
@Jeffrey Evans, a resposta de Kazuhito abaixo repetições o problema (e fornece um solition parcial)
Simon

Respostas:

38

eu usei

 as(nc, 'Spatial')

como parte 2 da vinheta de Edzer Pebesma indicada (role até o final da página).

andschar
fonte
vi isso. No entanto, eu descobri isso apenas recentemente e senti o desejo de colocá-lo em uma resposta adequada ao ver esta pergunta;)
andschar
E é importante que a resposta aceita não seja esquecida pelos futuros leitores.
Kazuhito
11
Para que isso realmente funciona como um SPDF, eu precisava fazer algo como: tmp <-as(nc, 'Spatial')e, em seguida tmpid <- sapply(slot(tmp, "polygons"), function(x) slot(x, "ID")), em seguida,row.names(tmp) <- tmpid
Simon
11
o que significa 'realmente funciona como um SPDF'? Não vejo nenhuma desvantagem criada pela conversão.
andschar
8

Eu tive que usar sf:::as_Spatial()como solução alternativa.

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
fonte
Existe uma maneira de manter o quadro de dados intacto?
Simon
Executando as(sf, "Spatial")por @mdsumner, confirmo que produz SpatialPolygonsDataFrame, o que é melhor para suas necessidades. Parece que as_Spatial()leva apenas sfc (isto é, geometria).
Kazuhito 4/17
11
Esta função é um método e deve ser chamada usando as (). Não é exportado como um objeto de função e é por isso que, para chamá-lo diretamente, você precisa de ":::".
Jeffrey Evans