R에서 여러 SpatialPolygonDataFrames를 1 개의 SPDF로 병합 하시겠습니까?


22

QGIS에 2 개의 다각형을 만들었습니다. R에서 다각형을 사용하면 다각형이 자동으로 SpatialPolygonsDataFrame (SPDF)이됩니다. 도구 병합을 사용하여 ArcGis에서 매우 쉽게 사용할 수 있도록 단일 SPDF로 병합하고 싶습니다 . 나는 R에서 그것을 완성하는 간단한 방법이 있어야한다고 확신하지만 어떻게 찾을 수는 없습니다. 병합 기능 만 data.frames을 병합 할 것 같다 집계 기능을 하나의 SHP,에 여러 개의 다각형을 용해 gIntersect 하지 모든 SPDF에서, 논리 값을 반환합니다 (입력 기능을 결합).

여기에 이미지 설명을 입력하십시오

데이터는 여기에 있습니다 : 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
? rgeos :: gUnion 및 / 또는? raster :: union
mdsumner를 참조하십시오

답변:


21

토폴로지를 병합 할 필요는 없지만 새 다각형을 추가하기 만하면됩니다.

ab <- rbind(a,b)

"고유하지 않은 다각형 ID 슬롯 값"오류가 발생하면 객체의 행 이름이 동일 함을 의미합니다. 이 문제를 해결하기 위해 spChFID를 사용하여 행 이름과 관련 슬롯 관계를 변경할 수 있습니다. 객체의 슬롯은 행 이름을 사용하여 객체를 연결하므로 @data 슬롯에서 row.names 만 변경할 수는 없습니다.

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

래스터 패키지의 공용체 (union_sp) 함수 가이 작업을 수행하고 있으며 rgeos에서 gIntersects를 호출하는 장면 뒤에서 매우 편리한 도우미 함수입니다.

**** 편집 08-06-2018 중복 ID 문제를 건너 뛸 수있는 문서화되지 않은 인수가 있습니다.

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

안녕하세요, 고맙습니다.이 시도했지만 오류가 발생했습니다. validObject (res) 오류 : 잘못된 클래스 "SpatialPolygons"개체 : 고유하지 않은 다각형 ID 슬롯 값. 이 오류를 어떻게 처리 할 수 ​​있습니까?
maycca

3
당신은 할 수 있습니다 : ab <- bind(a, b) 그 오류를 피하기 위해
Robert Hijmans

raster :: union은 현재 patialPOINTSdataframes와 작동하지 않습니다
Mox

19

@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)

결과 :

수업 (ab)

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

여기에 이미지 설명을 입력하십시오


6
래스터의 저자 인 Robert Hijmans가 제공 한 매우 쉬운 솔루션 :)
mdsumner

'Union'은 공간 포인트 데이터 프레임에 대해 (현재) 작동하지 않지만 다음 릴리스에서 제공 될 것이라고 들었습니다. @RobertH는 rbind의 사용을 제안했지만 그 작동 방식에 대해서는 명확하지 않습니다.
Mox

자세한 내용은 여기 : gis.stackexchange.com/questions/274609/…
Mox

raster::unionSpatialLinesDataFrame 클래스에서도 작동하는 것 같습니다 !
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. 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.