Mesclando SpatialPolygonDataFrames múltiplos em 1 SPDF em R?

22

Eu criei 2 polígonos no QGIS. Utilizando-os em R, os polígonos se tornam automaticamente SpatialPolygonsDataFrame (SPDF). Gostaria de mesclá-los em um único SPDF (como é super fácil no ArcGis usando a ferramenta Mesclar ). Estou certo de que deve haver uma maneira simples de concluir isso em R, mas não consigo encontrar como. a função de mesclagem parece mesclar apenas data.frames, a função agregada dissolve vários polígonos em um shp, gIntersect (digitando a função de junção) retorna o valor lógico, não o SPDF.

insira a descrição da imagem aqui

os dados estão disponíveis aqui: 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??
maycca
fonte
2
Veja? Rgeos :: gUnion e / ou?
Raster

Respostas:

21

Se você não precisar mesclar a topologia, mas apenas adicionar novos polígonos, poderá simplesmente usar:

ab <- rbind(a,b)

Se você receber um erro "Valores não exclusivos do slot de ID da Polygons", significa que os nomes de nomes de objetos dos mesmos são os mesmos. Para corrigir isso, você pode usar spChFIDs para alterar os nomes de nomes de domínio e os relacionamentos de slot associados. Como os slots no objeto usam os nomes de nomes para associá-lo, não é possível alterar row.names no slot @data.

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

A função union (union_sp) no pacote raster está fazendo isso e chamando gIntersects de rgeos, nos bastidores e é uma função auxiliar muito conveniente.

**** Edit 08-06-2018 Há um argumento não documentado que pode ser usado para ignorar o problema de identificação duplicada.

ab <- rbind(a, b, makeUniqueIDs = TRUE) 
Jeffrey Evans
fonte
Olá, obrigado, tentei este, mas recebi um erro: Erro no objeto validObject (res): classe inválida “SpatialPolygons” da classe: valores não exclusivos do slot de ID da Polygons. Como posso lidar com esse erro?
maycca
3
Você pode fazer: ab <- bind(a, b) para evitar esse erro
Robert Hijmans
raster :: união não funciona atualmente com spatialPOINTSdataframes
Mox
19

Solução super fácil fornecida por @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)

resultou em :

classe (ab)

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

insira a descrição da imagem aqui

maycca
fonte
6
Solução super fácil fornecido por Robert Hijmans, o autor de raster :)
mdsumner
'Union' (atualmente) não funciona para quadros de dados de pontos espaciais, embora me digam que sim no próximo lançamento. O @RobertH sugeriu o uso do rbind, embora não esteja exatamente claro como isso funciona.
Mox
Parece que também raster::unionfunciona para a classe 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. 
Mox
fonte