25 votos

¿Fusión de múltiples SpatialPolygonDataFrames en 1 SPDF en R?

He creado 2 polígonos en QGIS. Usándolos en R, los polígonos se convierten automáticamente en SpatialPolygonsDataFrame (SPDF). Me gustaría fusionarlos en un único SPDF (como es muy fácil en ArcGis utilizando la herramienta Fusión ). Estoy seguro de que debería haber una forma sencilla de completarlo en R, pero no encuentro cómo. el fusionar parece fusionar sólo data.frames, agregado disolver múltiples polígonos en un shp, gIntersect (tecleando la función join) devuelve un valor lógico, en absoluto el SPDF.

enter image description here

Los datos están disponibles aquí: http://ulozto.cz/xpoo5jfL/ab-zip

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

23voto

Dan Puntos 16

Si no necesita fusionar la topología, sino sólo añadir nuevos polígonos, puede utilizar simplemente:

ab <- rbind(a,b)

Si obtiene un error "valores de ranura de ID de polígonos no únicos" significa que los rownames de los objetos son los mismos. Para solucionarlo puede utilizar spChFIDs para cambiar los rownames y las relaciones de ranura asociadas. Dado que las ranuras del objeto utilizan los rownames 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) del paquete raster hace esto, y llama a gIntersects desde rgeos, entre bastidores y es una función de ayuda muy conveniente.

****Editar 08-06-2018 Hay un argumento no documentado que se puede utilizar para omitir el problema de ID duplicado.

ab <- rbind(a, b, makeUniqueIDs = TRUE)

21voto

danijels Puntos 1652

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"

enter image description here

1voto

pat Puntos 86
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(meuse@data)
#[1] "cadmium" "copper"  "lead"    "zinc"    "elev"    "dist"    "om"      "ffreq"   "soil"    "lime"   
#[11] "landuse" "dist.m"
meuse@data <- data.frame(ID=1:nrow(meuse), meuse@data) #adds an ID field
names(meuse@data)
#[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(meuse@data)
# 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.

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