Menggabungkan beberapa SpatialPolygonDataFrames menjadi 1 SPDF dalam R?

22

Saya telah membuat 2 poligon di QGIS. Dengan menggunakannya dalam R, poligon menjadi SpatialPolygonsDataFrame (SPDF) secara otomatis. Saya ingin menggabungkan mereka menjadi SPDF tunggal (seperti super mudah di ArcGis menggunakan Tool Merge ). Saya yakin bahwa harus ada cara sederhana untuk menyelesaikannya di R, tetapi saya tidak dapat menemukan caranya. yang menggabungkan fungsi tampaknya untuk menggabungkan hanya data.frames, agregat fungsi larut beberapa poligon menjadi satu shp, gIntersect (dengan mengetik bergabung fungsi) mengembalikan nilai logis, sama sekali tidak SPDF itu.

masukkan deskripsi gambar di sini

data tersedia di sini: 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??
maycca
sumber
2
Lihat? Rgeos :: gUnion dan / atau? Raster :: union
mdsumner

Jawaban:

21

Jika Anda tidak perlu menggabungkan topologi, tetapi cukup tambahkan poligon baru, Anda cukup menggunakan:

ab <- rbind(a,b)

Jika Anda mendapatkan kesalahan "nilai slot ID Poligon non-unik" itu berarti bahwa nama-nama ulang objek adalah sama. Untuk memperbaikinya, Anda dapat menggunakan spChFID untuk mengubah nama pengguna dan hubungan slot yang terkait. Karena slot di objek menggunakan rownames untuk mengaitkan objek, Anda tidak bisa hanya mengubah row.names di slot @data.

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

Fungsi union (union_sp) dalam paket raster melakukan hal ini, dan memanggil gIntersects dari rgeos, di belakang layar dan merupakan fungsi pembantu yang sangat nyaman.

**** Edit 08-06-2018 Ada argumen tidak berdokumen yang dapat digunakan untuk melewati masalah duplikat ID.

ab <- rbind(a, b, makeUniqueIDs = TRUE) 
Jeffrey Evans
sumber
Hai, terima kasih, saya mencoba yang ini tetapi mendapat kesalahan: Kesalahan pada validObject (res): objek "SpatialPolygons" kelas tidak valid: nilai slot ID Poligon non-unik. Bagaimana saya bisa mengatasi kesalahan ini?
maycca
3
Anda dapat melakukan: ab <- bind(a, b) untuk menghindari kesalahan itu
Robert Hijmans
raster :: union saat ini tidak bekerja dengan spatialPOINTSdataframe
Mox
19

Solusi super mudah yang disediakan oleh @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)

menghasilkan:

kelas (ab)

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

masukkan deskripsi gambar di sini

maycca
sumber
6
Solusi super mudah disediakan oleh Robert Hijmans, penulis raster :)
mdsumner
'Union' tidak (saat ini) bekerja untuk spatialpointsdataframe, meskipun saya diberitahu akan di rilis berikutnya. @ Robertt telah menyarankan penggunaan rbind, meskipun saya tidak begitu jelas tentang cara kerjanya.
Mox
Sepertinya raster::unionberfungsi untuk kelas SpatialLinesDataFrame juga!
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. 
Mox
sumber