Birden fazla SpatialPolygonDataFrame'in R'de 1 SPDF'ye birleştirilmesi?


22

QGIS'te 2 çokgen yarattım. Bunları R'de kullanarak, çokgenler otomatik olarak SpatialPolygonsDataFrame (SPDF) olur. Onları tek bir SPDF olarak birleştirmek istiyorum (ArcGis'te Tool Merge kullanarak çok kolaydır ). Bunu R'de tamamlamanın basit bir yolu olması gerektiğine eminim, ama nasıl bulamıyorum. birleştirme fonksiyonu, sadece data.frames birleştirme görünmektedir toplama işlevi bir SHP, birden fazla çokgenler çözülür gIntersect tüm SPDF de, mantıksal değeri verir (yazma fonksiyonunu birleştirme).

görüntü tanımını buraya girin

Veriler burada bulunabilir: 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
Bakınız? Rgeos :: gUnion ve / veya? Raster :: union
mdsumner

Yanıtlar:


21

Topolojiyi birleştirmek zorunda değilsiniz, ancak sadece yeni çokgenler eklemeniz gerekiyorsa, şunları kullanabilirsiniz:

ab <- rbind(a,b)

"Benzersiz olmayan Çokgenler ID yuvası değerleri" hatası alırsanız, nesnelerin satır adlarının aynı olduğu anlamına gelir. Bunu düzeltmek için, satır adlarını ve ilişkili alan ilişkilerini değiştirmek için spChFID'leri kullanabilirsiniz. Nesnedeki yuvalar nesneyi ilişkilendirmek için satır adlarını kullandığından, yalnızca @ veri yuvasındaki row.names değiştiremezsiniz.

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

Tarama paketindeki union (union_sp) işlevi bunu yapıyor ve perdeleri rgeolardan kesiyor, sahnelerin ardında ve çok kullanışlı bir yardımcı işlev.

**** Düzenleme 08-06-2018 Yinelenen kimlik sorununu atlamak için kullanılabilecek belgelenmemiş bir tartışma var.

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

Merhaba, teşekkür ederim, bunu denedim ama bir hata aldım: validObject (res) 'da hata: geçersiz sınıf “SpatialPolygons” nesnesi: benzersiz olmayan Çokgenler ID yuvası değerleri. Bu hatayı nasıl çözebilirim?
maycca,

3
Yapabilirsiniz: ab <- bind(a, b) bu hatayı önlemek için
Robert Hijmans

raster :: union şu anda uzamsalPOINTSdataframes ile çalışmıyor
Mox

19

@Mdsumner tarafından sağlanan süper kolay çözüm:

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)

sonuçlandı :

Sınıf (ab)

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

görüntü tanımını buraya girin



'Birlik' (şu anda) mekansal puanlar veri çerçeveleri için çalışmıyor, ancak bir sonraki sürümde olacağı söylendi. @RobertH rbind kullanımını önerdi, ancak bunun nasıl çalıştığını tam olarak bilmiyorum.
Mox


Öyle görünüyor raster::unionsıra SpatialLinesDataFrame sınıf için işler!
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. 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.