Cómo convertir un polígono espacial a un SpatialPolygonsDataFrame y agregar una columna a la tabla atrribute

14
coast<-readShapeSpatial("coastline.shp")
landc<-readShapeSpatial("landcover.shp)
ro<-readShapeSpatial("roads.shp")
bc<-gBuffer(ro,width=100)
landc$ratings=1
landc$ratings[landc$LANDUSE_ID==4]=0 

Arriba, tomo cualquier categoría que tenga 4 y en la nueva columna la coloco como 0.

En este punto, quiero la columna denominada ratings también para el bc , donde tomará 0 si está dentro del búfer y 1 si está fuera. El problema es que el bc es SpatialPolygons y no contiene la tabla de atributos.

Obviamente, para agregar una columna a un objeto SpatialPolygon tienes que convertirla en un SpatialPolygonsDataFrame , pero no sé cómo.

He intentado esto:

buf_df<-as.data.frame(bc)
s_po<-SpatialPolygonsDataFrame(bc,buf_df)
s_po$ratings=0

da este error:

row.names of data and Polygons IDs do not match 
    
pregunta gsa 04.04.2015 - 15:30

3 respuestas

7

¿Qué tienen que ver los objetos "coast", "ro" y "bc" con su problema? El problema puede estar en que está utilizando "readShapeSpatial". ¿Has probado readOGR en rgdal? Si está leyendo un shapefile de polígono, readOGR generará un objeto SpatialPolygonsDataFrame.

Si, de hecho, tiene un objeto SpatialPolygons y desea forzar en SpatialPolygonsDataFrame, el marco de datos especificado tendrá que coincidir con los ID de polígono en la ranura de polígonos. Aquí hay un ejemplo rápido.

library(sp)

# create some SpatialPolygons with ID's "2" and "3"
( p <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "2"),
     Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "3"))) )
class(p)    

# Create a dataframe and display default rownames
( p.df <- data.frame( ID=1:length(p)) ) 
rownames(p.df)

# Try to coerce to SpatialPolygonsDataFrame (will throw error)
p <- SpatialPolygonsDataFrame(p, p.df) 

# Extract polygon ID's
( pid <- sapply(slot(p, "polygons"), function(x) slot(x, "ID")) )

# Create dataframe with correct rownames
( p.df <- data.frame( ID=1:length(p), row.names = pid) )    

# Try coersion again and check class
 p <- SpatialPolygonsDataFrame(p, p.df)
 class(p) 

# Now we can add a column
[email protected]$ratings <- 1:2 

# Or modify an existing one
p[p$ID < 2 ,] <- 5
    
respondido por el Jeffrey Evans 04.04.2015 - 17:53
7

Es bastante simple:

library("rgdal")
polygons <- readOGR('path_to/file.shp',
                      layer = 'file')
class(polygons)
>[1] "SpatialPolygonsDataFrame"
>attr(,"package")
>[1] "sp"

poly_df <- as.data.frame(polygons)
# do some staff with "poly_df" that doesn't support SpatialPolygonsDataFrame
# then convert it to SPDF back again
s_poly <- SpatialPolygonsDataFrame(polygons, poly_df)
# add new column to SPDF:
s_poly$new_column <- "some data" 

Cuando el error: "row.names of data and Polygons IDs no coincide" surge esto La solución parece ser útil: cambie el nombre de las ID del marco de datos para que coincidan con las ID de los polígonos:

newdata <- data.frame(whatever you want in here)
row.names(newdata) <- (however the new polygons are labeled)
polygons <- SpatialPolygonsDataFrame(polygons, newdata)
    
respondido por el SS_Rebelious 04.04.2015 - 16:06
5

Prueba:

#Code taken from the question:
s_po <- SpatialPolygonsDataFrame(bc, buf_df, match.ID = F) 

match.ID evita el requisito de rownames para la identificación de polígonos de coincidencia

    
respondido por el Fabián 03.01.2018 - 14:23

Lea otras preguntas en las etiquetas