R में 1 SPDF में कई SpatialPolygonDataFrames को जोड़ना?


22

मैंने QGIS में 2 बहुभुज बनाए हैं। आर में उनका उपयोग करते हुए, बहुभुज स्वचालित रूप से SpatialPolygonsDataFrame (SPDF) बन जाते हैं। मैं उन्हें सिंगल एसपीडीएफ में विलय करना चाहता हूं (जैसा कि टूल मर्ज का उपयोग करके आर्कगिस में सुपर आसान है )। मुझे यकीन है कि आर में पूरा करने का सरल तरीका होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है कि कैसे। मर्ज समारोह, केवल 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 :: संघ
mdsumner

जवाबों:


21

यदि आपको टोपोलॉजी को मर्ज करने की आवश्यकता नहीं है, लेकिन सिर्फ नए बहुभुज जोड़ें, तो आप बस उपयोग कर सकते हैं:

ab <- rbind(a,b)

यदि आपको "गैर-अद्वितीय बहुभुज आईडी स्लॉट मान" त्रुटि मिलती है, तो इसका मतलब है कि वस्तुओं की पंक्तिबद्धता समान है। इसे ठीक करने के लिए आप पंक्तिबद्ध और संबद्ध स्लॉट संबंधों को बदलने के लिए spChFIDs का उपयोग कर सकते हैं। चूँकि ऑब्जेक्ट में स्लॉट्स ऑब्जेक्ट को संबद्ध करने के लिए रॉनेम्स का उपयोग करते हैं, आप @data स्लॉट में केवल row.names को नहीं बदल सकते।

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

रास्टर पैकेज में यूनियन (Union_sp) फ़ंक्शन यह कर रहा है, और rgeos से gIntersects को पर्दे के पीछे बुला रहा है और एक बहुत सुविधाजनक सहायक फ़ंक्शन है।

**** संपादित करें 08-06-2018 एक अवांछित तर्क है जिसका उपयोग डुप्लिकेट आईडी समस्या को छोड़ने के लिए किया जा सकता है।

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

नमस्ते, धन्यवाद, मैंने इसे एक कोशिश की, लेकिन एक त्रुटि मिली: मान्यओबजेक्ट (रेस) में त्रुटि: अमान्य वर्ग "स्पैटियलपॉलिगोन्स" ऑब्जेक्ट: गैर-अद्वितीय पॉलीगॉन आईडी स्लॉट मान। मैं इस त्रुटि से कैसे निपट सकता हूं?
मायाका जूल

3
आप ऐसा कर सकते हैं: ab <- bind(a, b) उस त्रुटि से बचने के लिए
रॉबर्ट हिजमैन

रेखापुंज :: संघ वर्तमान में स्थानिकPOINTSdataframes
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"

यहाँ छवि विवरण दर्ज करें



'यूनियन' स्पैटियल पॉइंट्सडॉटफ्रेम के लिए (वर्तमान में) काम नहीं करता है, हालांकि मुझे बताया गया है कि यह अगली रिलीज में होगा। @ रोबर्ट ने rbind के उपयोग का सुझाव दिया है, हालांकि मैं बिल्कुल स्पष्ट नहीं हूं कि यह कैसे काम करता है।
मोक्स

यहाँ विवरण: gis.stackexchange.com/questions/274609/…
Mox

यह raster::unionSpatialLinesDataFrame वर्ग के लिए भी काम करता है!
फिलिप्पेलैंडो

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. 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.