ผสาน SpatialPolygonDataFrames หลาย ๆ ตัวเป็น 1 SPDF ใน R


22

ฉันสร้างรูปหลายเหลี่ยม 2 รูปใน QGIS การใช้รูปหลายเหลี่ยมใน R รูปหลายเหลี่ยมจะกลายเป็น SpatialPolygonsDataFrame (SPDF) โดยอัตโนมัติ ฉันต้องการรวมไว้ใน SPDF เดียว (เช่นเดียวกับใน ArcGis ที่ใช้ Tool Mergeง่ายมาก) ฉันแน่ใจว่าควรมีวิธีง่าย ๆ ในการทำให้สมบูรณ์ใน R แต่ฉันไม่สามารถหาได้ ผสานฟังก์ชั่นที่ดูเหมือนว่าจะผสาน data.frames เท่านั้นรวมฟังก์ชั่นละลายรูปหลายเหลี่ยมเป็นหนึ่งในหลายบรา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
See? rgeos :: gUnion และ / หรือ? raster :: union
mdsumner

ที่เกี่ยวข้อง: gis.stackexchange.com/questions/180682/…
Mox

คำตอบ:


21

หากคุณไม่จำเป็นต้องรวมโทโพโลยี แต่เพียงเพิ่มรูปหลายเหลี่ยมใหม่คุณสามารถใช้:

ab <- rbind(a,b)

หากคุณได้รับข้อผิดพลาด "ค่าช่องโพลิกอน ID ที่ไม่ซ้ำกัน" หมายความว่าชื่อแถวของวัตถุนั้นเหมือนกัน ในการแก้ไขปัญหานี้คุณสามารถใช้ spChFID เพื่อเปลี่ยนชื่อแถวและความสัมพันธ์ของช่องที่เกี่ยวข้อง เนื่องจากช่องในวัตถุใช้ rownames เพื่อเชื่อมโยงวัตถุคุณไม่สามารถเปลี่ยน row.names ในช่อง @data ได้

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

ฟังก์ชัน union (union_sp) ในแพ็คเกจแรสเตอร์ทำเช่นนี้และเรียก gIntersects จาก rgeos เบื้องหลังและเป็นฟังก์ชันผู้ช่วยที่สะดวกมาก

**** แก้ไข 08-06-2018 มีการโต้แย้งที่ไม่มีเอกสารที่สามารถใช้ในการข้ามปัญหา ID ที่ซ้ำกัน

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

สวัสดีขอขอบคุณฉันลองตัวนี้ แต่มีข้อผิดพลาด: ข้อผิดพลาดใน validObject (res): วัตถุ“ SpatialPolygons” คลาสที่ไม่ถูกต้อง: ค่าสล็อต Polygons ID ที่ไม่ซ้ำกัน ฉันจะจัดการกับข้อผิดพลาดนี้ได้อย่างไร
maycca

3
คุณสามารถทำได้: ab <- bind(a, b) เพื่อหลีกเลี่ยงข้อผิดพลาดนั้น
Robert Hijmans

raster :: union ไม่ทำงานกับ spatialPOINTS ดาต้าเฟรม
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' ไม่ทำงาน (ในปัจจุบัน) สำหรับ spatialpointsdataframes แม้ว่าฉันจะบอกว่ามันจะเปิดตัวในรุ่นถัดไป @ RobertH ได้แนะนำการใช้ rbind แม้ว่าฉันจะไม่ชัดเจนในการใช้งาน
Mox

รายละเอียดที่นี่: gis.stackexchange.com/questions/274609/…
Mox

ดูเหมือนว่าจะใช้raster::unionงานได้กับคลาส 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. 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.