Converter um objeto de polígono espacial em quadro de dados usando R

18

Meu objetivo é modificar um arquivo de forma existente mesclando certos polígonos.

Depois de importar o shapefile e usar o comando UnionSpatialPolygons, recebo o contorno do polígono que desejo.

No entanto, agora este é um objeto SpatialPolygons e não um SpatialPolygonsDataFrame, portanto, não consigo exportá-lo para um shapefile usando o writeOGR.

Como posso contornar esse problema?

John
fonte
3
Se a resposta abaixo foi útil, você deve selecioná-la como a correta, clicando na marca de seleção à esquerda do texto da resposta.
SlowLearner

Respostas:

20

Como o nome diz, um SpatialPolygonsDataFrame é basicamente apenas um objeto SpatialPolygons com dados anexados (a tabela de atributos). Os dados devem ter pelo menos o número de linhas que houver recursos

library(rgdal)
ob <- SpatialPolygons(..)# Your SpatialPolygons Object
spp <-     SpatialPolygonsDataFrame(ob,data=as.data.frame("yourData"),proj4string=CRS("+proj=    aea > +ellps=GRS80 +datum=WGS84"))
writeOGR(spp,"shapes","testShape",driver="ESRI Shapefile",)

----EDITAR----

Se você deseja converter as SpatialPolygonsDataFramecostas para um SpatialPolygonsobjeto, basta abordar a estrutura do objeto em R

ob <- SpatialPolygons(spp@polygons,proj4string=spp@proj4string)
Maçarico
fonte
Com certeza, @Curlew está certo. Certifique-se de especificar o IDsargumento corretamente ao executar UnionSpatialPolygons. Caso contrário, você poderá ter problemas ao especificar o dataargumento ao converter novamente em SpatialPolygonsDataFrame.
Fdetsch
1
Claro, muito fácil. Eu editei a resposta original para que
Curlew
1
Só recentemente comecei a trabalhar com shapefiles e ainda tentando me familiarizar com isso. O que exatamente é deve ser substituído por youData em data=as.data.frame("yourData")? Depois de dissolver polígonos internos usando unionSpatialPolygons(...), eu gostaria de escrever resultado como novo shapefile
lightonphiri
Você precisa ter um data.frame com o mesmo número de linhas que possui recursos no seu objeto SpatialPolygons. Melhor fazer uma nova pergunta sobre você unionemitir ..
maçarico
1
@Curlew Obrigado, só postou novas perguntas aqui gis.stackexchange.com/q/121405/40108
lightonphiri
9

Problemas:

1: o resultado de UnionSpatialPolygons é um polígono espacial

2: converter o resultado novamente em um quadro de dados de polígonos espaciais é uma verdadeira dor

-uma. você precisa de um quadro de dados muito exato para anexar a um polígono espacial

-b. os dados que você usou para UnionSpatialPolygons têm mais linhas que a saída e não estão formatados da maneira necessária.

Minha (feia) solução:

### Coerce into spatial polygon data frame with id and row name of spatial polygon

# Make a data frame that meets the requirements above:

df<- data.frame(id = getSpPPolygonsIDSlots(your.spatialpolygon))
row.names(df) <- getSpPPolygonsIDSlots(your.spatialpolygon)

# Make spatial polygon data frame
spdf <- SpatialPolygonsDataFrame(your.spatialpolygon, data =df)

# Then don't forget to make sure the projection is correct
# XXXX is your SRID

proj4string(spdf) <- CRS("+init=epsg:XXXX");
spdf <- spTransform(spdf , CRS("+init=epsg:XXXX"));
K.
fonte
Erro em if (length (Sr @ polygons)! = Nrow (data)) stop (paste ("Incompatibilidade de comprimento do objeto: \ n",: argumento é de comprimento zero) Além disso: Mensagens de aviso: 1: use * apply e slot diretamente
Mox