Hợp nhất nhiều SpatialPolygonDataFrames thành 1 SPDF trong R?


22

Tôi đã tạo 2 đa giác trong QGIS. Sử dụng chúng trong R, đa giác sẽ tự động trở thành SpatialPolygonsDataFrame (SPDF). Tôi muốn hợp nhất chúng vào SPDF đơn (như siêu dễ dàng trong ArcGis bằng cách sử dụng Tool Merge ). Tôi chắc chắn rằng nên có cách đơn giản để hoàn thành nó trong R, nhưng tôi không thể tìm thấy cách nào. các hợp chức năng dường như hợp nhất chỉ data.frames, tổng hợp chức năng hòa tan nhiều đa giác thành một shp, gIntersect (bằng cách gõ chức năng tham gia) trả về giá trị hợp lý, không phải ở tất cả các SPDF.

nhập mô tả hình ảnh ở đây

dữ liệu có sẵn ở đây: 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
Xem? Rgeos :: gUnion và / hoặc? Raster :: union
mdsumner 21/07/2015

Câu trả lời:


21

Nếu bạn không cần hợp nhất cấu trúc liên kết, nhưng chỉ cần thêm đa giác mới, bạn chỉ cần sử dụng:

ab <- rbind(a,b)

Nếu bạn gặp lỗi "giá trị khe cắm ID đa giác không duy nhất", điều đó có nghĩa là tên của các đối tượng là như nhau. Để khắc phục điều này, bạn có thể sử dụng spChFID để thay đổi tên miền và các mối quan hệ vị trí liên quan. Vì các vị trí trong đối tượng sử dụng các tên gọi để liên kết đối tượng, bạn không thể thay đổi hàng.names trong vị trí @data.

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

Hàm union (union_sp) trong gói raster đang thực hiện điều này và gọi gIntersects từ rgeos, đằng sau hậu trường và là một hàm trợ giúp rất thuận tiện.

**** Chỉnh sửa 08-06-2018 Có một đối số không có giấy tờ có thể được sử dụng để bỏ qua vấn đề ID trùng lặp.

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

Xin chào, cảm ơn bạn, tôi đã thử cái này nhưng gặp lỗi: Lỗi trong validObject (res): class không hợp lệ của SpatialPolygons đối tượng: giá trị khe cắm ID Polygons không duy nhất. Làm thế nào tôi có thể đối phó với lỗi này?
maycca

3
Bạn có thể làm: ab <- bind(a, b) để tránh lỗi đó
Robert Hijmans

raster :: union hiện không hoạt động với spatialPOINTSdataframes
Mox

19

Giải pháp siêu dễ dàng được cung cấp bởi @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)

dẫn đến :

lớp (ab)

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

nhập mô tả hình ảnh ở đây


6
Giải pháp siêu dễ dàng được cung cấp bởi Robert Hijmans, tác giả của raster :)
mdsumner

'Union' không (hiện tại) hoạt động cho spatialpointsdataframes, mặc dù tôi được bảo là nó sẽ được phát hành tiếp theo. @RobertH đã đề xuất sử dụng rbind, mặc dù tôi không rõ chính xác về cách thức hoạt động của nó.
Mox


Có vẻ như nó raster::unionhoạt động cho lớp 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. 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.