¿Combinar múltiples SpatialPolygonDataFrames en 1 SPDF en R?

20

He creado 2 polígonos en QGIS. Usándolos en R, los polígonos se convierten automáticamente en SpatialPolygonsDataFrame (SPDF). Me gustaría combinarlos en un solo SPDF (como es muy fácil en ArcGis usando la herramienta Fusionar ). Estoy seguro de que debería haber una forma simple de completar eso en R, pero no puedo encontrar cómo. La función merge parece fusionar solo data.frames, la función aggregate disuelve múltiples polígonos en un shp, gIntersect (al escribir la función de unión) devuelve lógica valor, no en absoluto el SPDF.

Los

datosestándisponiblesaquí: enlace

library(sp)
library(raster)
library(rgeos)
library(spatstat)
library(rgdal)     
library(maptools)

setwd("C:/...")
a<-readOGR(dsn=getwd(), layer="pol.a")
b<- readOGR(dsn=getwd(), layer="pol.b")

ab<-merge(a, b)  # what tool if not "merge" to use??
    
pregunta maycca 22.07.2015 - 00:10

3 respuestas

16

Si no necesita combinar topología, sino simplemente agregar nuevos polígonos, simplemente puede usar:

ab <- rbind(a,b)

Si obtiene un error de "valores de ranura de ID de polígonos no únicos", significa que los nombres de los objetos son los mismos. Para solucionar este problema, puede usar spChFIDs para cambiar los nombres y las relaciones de ranura asociadas. Dado que las ranuras en el objeto usan los nombres para asociar el objeto, no puede simplemente cambiar row.names en la ranura @data.

b <- spChFIDs(b, paste("b", row.names(b), sep="."))

La función union (union_sp) en el paquete raster está haciendo esto, y llamar a gIntersects desde rgeos, detrás de la escena y es una función auxiliar muy conveniente.

**** Editar 08-06-2018 Existe un argumento no documentado que se puede usar para omitir el problema de la identificación duplicada.

ab <- rbind(a, b, makeUniqueIDs = TRUE) 
    
respondido por el Jeffrey Evans 22.07.2015 - 18:35
17

Solución súper fácil proporcionada por @mdsumner:

library(sp)
library(raster)
library(rgeos)
library(spatstat)
library(rgdal)     
library(maptools)

setwd("C:/...")
a<-readOGR(dsn=getwd(), layer="pol.a")
b<- readOGR(dsn=getwd(), layer="pol.b")

# use union in {raster} package ?raster::union
ab<-union(a, b)

resultó en:

  

clase (ab)

[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"

    
respondido por el maycca 22.07.2015 - 18:14
1
library(sp)
data(meuse)
plot(meuse)
slotNames(meuse) #".Data"     "names"     "row.names" ".S3Class" 
coordinates(meuse) <- ~x+y #Add "ID" column to "meuse"
slotNames(meuse) #[1] "data"        "coords.nrs"  "coords"      "bbox"        "proj4string"
class(meuse) #[1] "SpatialPointsDataFrame"
names([email protected])
#[1] "cadmium" "copper"  "lead"    "zinc"    "elev"    "dist"    "om"      "ffreq"   "soil"    "lime"   
#[11] "landuse" "dist.m"
[email protected] <- data.frame(ID=1:nrow(meuse), [email protected]) #adds an ID field
names([email protected])
#[1] "ID"      "cadmium" "copper"  "lead"    "zinc"    "elev"    "dist"    "om"      "ffreq"   "soil"   
#[11] "lime"    "landuse" "dist.m" 
#Create a data.frame "df.new" with "IDS" (note different name) and "y" columns.
meuse_table.df <- data.frame(IDS=1:nrow(meuse), y=runif(nrow(meuse)))
class(meuse_table.df) #"data.frame"
#Now we can merge "df.new" to "meuse" (@data slot)
meuse <- merge(meuse, meuse_table.df, by.x = "ID", by.y = "IDS")
#create a new file named meuse, consisting of a merge of:
#   the meuse spatial points (from the original)
#   the dataframe created from the original, using the data.frame command
#   BY the field "ID" in the spatialpointsdataframe
#   By the field "IDS" in the tabular dataframe (df.new) 
head([email protected])
# I think the source of unease is that adding an ID field to both files 
#is based on them having the same number of rows in the same order. 
#in ArcGIS, this would be an unreasonable and dangerous assumption.
#R seems to have some sort of 'innate' key field, based on the order read it. 
#This is all great when splitting one file, and merging it back together.
#but what about two files? 
#I think it can be done, but it's a three-step process. 
#First, merge the polygons. Add an ID field, as above.
#Second, merge the tables (as dataframes), and add ID's. as above. 
#Third, attach the merged tables to the merged polygons. 
#For it to work, the order of things in the merge (polgyons, dataframe) needs be identfical. 
    
respondido por el Mox 14.03.2018 - 00:20

Lea otras preguntas en las etiquetas