Clip poligono e conservare i dati?


13

Ho questi due poligoni:

library(sp); library(rgeos); library(maptools)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                    55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                    55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                                   242), variable2 = c(235, 464), row.names = c("p1", "p2")))
proj4string(spdf1) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf1, col="red")

coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                     55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                      variable2 = c(3), row.names = c("p1a")))
proj4string(spdf2) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf2, col="yellow", add=T)

inserisci qui la descrizione dell'immagine

Voglio ritagliarne parti spdf1intersecate spdf2. Tuttavia, voglio spdf1rimanere come SpatialPolygonsDataFrame e conservare tutte le informazioni contenute all'interno spdf1@data.

Ho provato gDifference come segue, che ritaglia parti di quelle spdf1che sono intersecate da spdf2, ma poi converte spdf1in SpatialPolygons (cioè scartando le informazioni contenute in spdf1@data).

gDifference(spdf1, spdf2, byid=T)

Come posso tagliare in spdf1con spdf2, ma conservare i dati contenuti in spdf1@data? Ho verificato e provato questa domanda simile senza come sovrapporre un poligono su SpatialPointsDataFrame e preservare i dati SPDF?

Risposte:


9

L'approccio più semplice sarebbe

  library(raster)
  x <- spdf1 - spdf2

  # or, more formally
  y <- erase(spdf1,  spdf2)

Vedi? 'Pacchetto raster' (sezione XIV) per ulteriori funzioni che si occupano della sovrapposizione di poligoni. Queste funzioni utilizzano le funzioni di base dei rgeos sotto il cofano, nelle funzioni "livello utente" (anziché "livello sviluppatore").


Che cosa intendi con "nelle funzioni" a livello di utente "(anziché" a livello di sviluppatore ")"?
luciano,

rgeosfornisce operazioni geometriche ma non si occupa degli attributi dei dati. Pertanto, l'utilizzo di queste funzioni richiede molto lavoro per tenere tutto insieme. Le funzioni raster semplificano questo e si comportano come funzioni simili nel software GIS,
Robert Hijmans,

Sì, ma questo può portare a Errore in SpatialPolygonsDataFrame (part2, x @ data [match (row.names (part2),: row.names di dati e ID poligoni non corrispondono
jebyrnes

Sarebbe un bug. Puoi fornirne un esempio?
Robert Hijmans,

4

Una soluzione alternativa sarebbe quella di aggiungere nuovamente gli attributi dopo aver eseguito la clip, durante la conversione da SpatialPolygonsa SpatialPolygonsDataFrame.

sp3 <- gDifference(spdf1, spdf2, byid = TRUE)
row.names(sp3) <- row.names(spdf1)

spdf3 <- SpatialPolygonsDataFrame(sp3, data = spdf1@data)

spdf3@data

   variable1 variable2
p1       232       235
p2       242       464

plot(spdf3, col="red")

inserisci qui la descrizione dell'immagine


Questo sembra un problema che ho, solo la clip di output nella mia istanza particolare produce rownames da spdf1 che non esistono (come un semplice gsub per sbarazzarsi della seconda cifra in row.names dovrebbe occuparsi della corrispondenza dei rownames, no? )
jebyrnes il

Errore in SpatialPolygonsDataFrame (clip, data = as.data.frame (all_spdfs_together @ data)): mancata corrispondenza della lunghezza dell'oggetto: la clip ha 1718 oggetti Polygons, ma as.data.frame (all_spdfs_together @ data) ha 86 righe
jebyrnes

Certo, ho un sacco di poligoni di cose nell'oceano. Alcuni sono posizionati in modo errato sulla terra o si sovrappongono alla terra. Voglio eliminarlo, quindi ho solo aree che si trovano nell'oceano. Ho uno shapefile della costa da confrontare. Ecco il codice - gist.github.com/jebyrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jebyrnes

1
nevermind - la soluzione raster :: erase funziona (non lo aveva mai fatto per qualche strana ragione)
jebyrnes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.