Convierta un objeto poligonal espacial en un marco de datos usando R

18

Mi objetivo es modificar un archivo de forma existente fusionando ciertos polígonos.

Después de importar el archivo de forma y usar el comando UnionSpatialPolygons, obtengo el contorno del polígono que quiero.

Sin embargo, ahora es un objeto SpatialPolygons y no un SpatialPolygonsDataFrame, por lo que no puedo exportarlo a un archivo de forma usando writeOGR.

¿Cómo puedo solucionar este problema?

John
fuente
3
Si la respuesta a continuación fue útil, debe seleccionarla como correcta haciendo clic en la marca de verificación a la izquierda del texto de respuesta.
SlowLearner

Respuestas:

20

Como su nombre lo 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

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

Si desea convertir su SpatialPolygonsDataFrameespalda a un SpatialPolygonsobjeto, solo necesita abordar la estructura del objeto dentro de R

ob <- SpatialPolygons(spp@polygons,proj4string=spp@proj4string)
Zarapito
fuente
Por supuesto, @Curlew tiene razón. Asegúrese de especificar el IDsargumento correctamente al ejecutar UnionSpatialPolygons. De lo contrario, podría tener problemas para especificar el dataargumento al volver a convertir a SpatialPolygonsDataFrame.
fdetsch
1
Claro, bastante fácil. Edité la respuesta original para eso
Curlew
1
Hace poco comencé a trabajar con shapefiles y todavía trato de familiarizarme con esto. ¿Qué exactamente se debe sustituir por youData in data=as.data.frame("yourData")? Después de disolver los polígonos internos usando unionSpatialPolygons(...), me gustaría escribir el resultado como un nuevo shapefile
lightonphiri
Debe tener un data.frame con el mismo número de filas que tiene características en su objeto SpatialPolygons. Mejor haga una nueva pregunta con respecto a su unionproblema ..
Curlew
1
@Curlew Gracias, acabo de publicar nuevas preguntas aquí gis.stackexchange.com/q/121405/40108
lightonphiri
9

Problemas:

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

2: convertir el resultado nuevamente en un marco de datos de polígono espacial es un verdadero dolor

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

-si. Los datos que usó para UnionSpatialPolygons tienen más filas que la salida y no están formateados de la manera que se necesita.

Mi solución (fea):

### 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.
fuente
Error en if (length (Sr @ polygons)! = Nrow (data)) stop (paste ("La longitud del objeto no coincide: \ n",: el argumento es de longitud cero Además: Mensajes de advertencia: 1: use * apply y slot directamente)
Mox