18 votos

Convertir un objeto poligonal espacial en un marco de datos utilizando R

Mi objetivo es modificar un shapefile existente fusionando ciertos polígonos.

Tras importar el shapefile y utilizar el comando UnionSpatialPolygons, obtengo el contorno de polígono que quiero.

Sin embargo, ahora es un objeto SpatialPolygons y no un SpatialPolygonsDataFrame, por lo que no puedo exportarlo a un shapefile utilizando writeOGR.

¿Cómo puedo evitar este problema?

21voto

Rihan Meij Puntos 362

Como su nombre indica, un SpatialPolygonsDataFrame es básicamente un objeto SpatialPolygons con datos adjuntos (la tabla de atributos). Los datos deben tener al menos tantas filas como características haya

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",)

----EDIT----

Si quiere convertir su SpatialPolygonsDataFrame de vuelta a un SpatialPolygons sólo tienes que dirigirte a la estructura del objeto dentro de R

ob <- SpatialPolygons(spp@polygons,proj4string=spp@proj4string)

10voto

user56231 Puntos 33

Problemas:

1: el resultado de UnionSpatialPolygons es un polígono espacial

2: convertir el resultado en un marco de datos de polígonos espaciales es un verdadero dolor

-a. se necesita un marco de datos muy exacto para adjuntar a un polígono espacial

-b. los datos que utilizó para UnionSpatialPolygons tienen más filas que la salida y no están formateados de la manera que se necesita.

Mi (fea) solución:

### 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"));

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X