1 votos

Unir dos SpatialPolygons manteniendo los polígonos que se solapan

La mejor manera de describir mi problema es que busco una unión interna izquierda para dos objetos espaciales.

Como puede ver a continuación, tengo dos objetos espaciales: (1) Estado de California [en azul] y (2) Polígonos de la cuadrícula [en rojo]. Estoy intentando fusionar ambos objetos pero sólo para los polígonos de la cuadrícula que "tocan" el objeto California. Por ejemplo, mantener los polígonos azules de la cuadrícula y cualquier polígono rojo de la cuadrícula que tenga azul.

Probé con "raster::intersect", pero esto recorta la costa/el límite. Aquí está mi código ....

library(rgdal)
library(raster)
library(rgeos)

# Download US shape information from data.gov
URL <- "http://www2.census.gov/geo/tiger/GENZ2016/shp/cb_2016_us_state_500k.zip"
td <- tempdir()
setwd(td)
temp <- tempfile(fileext = ".zip")
download.file(URL, temp)
unzip(temp)

# Get US shape file and filter states for just California
us_states <- raster::shapefile("cb_2016_us_state_500k.shp")
ca <- subset(us_states, STUSPS == "CA")

# Create a grid  
grid <- raster(extent(ca))
res(grid) <- c(1)
proj4string(grid) <- proj4string(ca)
gridpolygon <- rasterToPolygons(grid)

# Merge objects together
merged <- raster::intersect(ca, gridpolygon)

plot(gridpolygon, add=TRUE, col='red')
plot(merged, add=TRUE, col='blue')  # This clips the grids

California with grid polygons

1voto

obrl_soil Puntos 53

Deberías hacerte con los paquetes sf y tidyverse:

library(sf)
library(tidyverse)

cali_sf <- st_as_sf(ca)
grid_sf <- st_as_sf(gridpolygon)

# select all overlapping tiles
cal_grid <- st_intersects(grid_sf, cali_sf, sparse = F) %>%
  cbind(grid_sf, 'keep' = .) %>%
  filter(keep == TRUE)

# or, trimmed to state bdy
cal_grid_neat <- st_intersection(grid_sf, cali_sf)

Tenga en cuenta las advertencias, realmente debería trabajar en un crs proyectado cuando realice operaciones de superposición geométrica. st_transform y st_crs le ayudarán una vez que haya identificado un sistema apropiado.

3 votos

Esas tuberías y cbinds y filtros son una forma larga de hacer: cal_grid <- grid_sf[st_intersects(grid_sf, cali_sf, sparse = FALSE),] que no requiere la carga de ninguno de los tidyverse (que sólo se está utilizando para ejecutar filter aquí de todos modos) y no deja una redundancia keep en los datos. No es muy ordenado.

0 votos

Muy eficiente. Sin embargo, recorrer el proceso línea por línea puede ser útil para aprender, y select(-keep) es una simple adición.

4 votos

Hasta que un día estás analizando datos sobre castillos, y tienes una columna "torreón" que es una bandera para saber si el castillo tenía torreón o no, y entonces de repente tienes un error extraño. Es un error artificial, sí, pero la buena práctica general es no contaminar los marcos de datos de esta manera, ¡incluso si intentas aclararlo después!

1voto

Jack Puntos 28

Si aún no está preparado para dar el salto a la sf , investigue rgeos::gIntersects . Devolverá un vector booleano que puede utilizar para subdividir su marco de datos de polígonos. No recorta.

1 votos

Es una sola línea: gridpolygon2 = gridpolygon[gIntersects(gridpolygon, ca, byid=TRUE)[1,],] (después de library(rgeos) )

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X