Unire più SpatialPolygonDataFrames in 1 SPDF in R?


22

Ho creato 2 poligoni in QGIS. Usandoli in R, i poligoni diventano automaticamente SpatialPolygonsDataFrame (SPDF). Vorrei unirli in un singolo SPDF (come è super facile in ArcGis usando Tool Merge ). Sono sicuro che dovrebbe esserci un modo semplice per completarlo in R, ma non riesco a trovare il modo. la funzione di unione sembra unire solo data.frames, la funzione aggregata dissolve più poligoni in un solo shp, gIntersect (digitando la funzione join) restituisce un valore logico, per niente SPDF.

inserisci qui la descrizione dell'immagine

i dati sono disponibili qui: 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??

2
Vedi? Rgeos :: gUnion e / o? Raster :: union
mdsumner

Risposte:


21

Se non è necessario unire la topologia, ma è sufficiente aggiungere nuovi poligoni, è possibile utilizzare semplicemente:

ab <- rbind(a,b)

Se viene visualizzato l'errore "Valori slot ID poligoni non univoci" significa che i nomi degli oggetti sono gli stessi. Per risolvere questo problema, puoi utilizzare spChFIDs per modificare i rowname e le relazioni di slot associate. Dato che gli slot nell'oggetto usano i rowname per associare l'oggetto, non puoi semplicemente cambiare row.names nello slot @data.

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

La funzione union (union_sp) nel pacchetto raster sta facendo questo, e chiama gIntersects da rgeos, dietro le quinte ed è una funzione di aiuto molto conveniente.

**** Modifica 08-06-2018 Esiste un argomento non documentato che può essere utilizzato per saltare il problema ID duplicato.

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

Ciao, grazie, ho provato questo ma ho ricevuto un errore: Errore nell'oggetto validObject (res): oggetto "SpatialPolygons" di classe non valido: valori slot ID poligoni non univoci. Come posso gestire questo errore?
Maycca,

3
Puoi fare: ab <- bind(a, b) per evitare
quell'errore

raster :: union attualmente non funziona con spatialPOINTSdataframes
Mox

19

Soluzione super facile fornita da @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)

provocato :

Classe (ab)

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

inserisci qui la descrizione dell'immagine


6
Soluzione super facile fornita da Robert Hijmans, l'autore di raster :)
mdsumner,

"Union" non funziona (attualmente) per i frame di dati spaziali, sebbene mi sia stato detto che lo farà nella prossima versione. @RobertH ha suggerito l'uso di rbind, anche se non sono esattamente chiaro su come funzioni.
Mox,


Sembra che raster::unionfunzioni anche per la classe SpatialLinesDataFrame!
philiporlando,

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(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. 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.