Operaciones geométricas con datos vectoriales

Dr. Francisco Zambrano

Contenidos

Operaciones geométricas con datos vectoriales:

  1. Simplificación
  2. Centroides
  3. Buffers
  4. Clipping (recortar)
  5. Union

1. Simplificación

La simplificación es un proceso de generalización de objetos vectoriales (líneas y polígonos) generalmente para su uso en mapas de menor escala.

geometria: linea

seine_simp = st_simplify(seine, dTolerance = 2000)  # 2000 m


plot(seine$geometry)

plot(seine_simp$geometry)

1. Simplificación

El objeto seine_simp resultante es una copia del seine original pero con menos vértices. Esto es evidente, siendo el resultado visualmente más simple y consumiendo menos memoria que el objeto original, como se verifica a continuación:

object.size(seine)
18096 bytes
object.size(seine_simp)
9112 bytes

1. Simplificación

La simplificación es un proceso de generalización de objetos vectoriales (líneas y polígonos) generalmente para su uso en mapas de menor escala.

geometria: polígono

us_states2163 = st_transform(us_states, "EPSG:2163")
us_states_simp1 = st_simplify(us_states2163, dTolerance = 100000)  # 100 km
plot(us_states2163$geometry)

object.size(us_states2163)
113576 bytes
plot(us_states_simp1$geometry)

object.size(us_states_simp1)
53096 bytes

2. Centroides

Las operaciones de centroide identifican el centro de los objetos geográficos.

La función st_centroid de {sf} permite calcular los centroides.

nz_centroid = st_centroid(nz)
seine_centroid = st_centroid(seine)

2. Centroides

Las operaciones de centroide identifican el centro de los objetos geográficos.

plot(nz$geom)
plot(nz_centroid$geom,add = TRUE,col='red')

2. Centroides

Las operaciones de centroide identifican el centro de los objetos geográficos.

plot(seine$geometry)
plot(seine_centroid$geom,add = TRUE,col = 'red')

2. Centroides

A veces, el centroide geográfico cae fuera de los límites de sus objetos principales (piense en una dona).

La función st_point_on_surface de {sf} asegura que los puntos caeran en el objeto.

nz_pos = st_point_on_surface(nz)
plot(nz$geom)
plot(nz_pos$geom,add = TRUE,col = 'red')

2. Centroides

A veces, el centroide geográfico cae fuera de los límites de sus objetos principales (piense en una dona).

La función st_point_on_surface de {sf} asegura que los puntos caeran en el objeto.

seine_pos = st_point_on_surface(seine)
plot(seine$geom)
plot(seine_pos$geom,add = TRUE,col = 'red')

3. Buffers

Los buffer (zonas de influencia) son polígonos que representan el área dentro de una distancia determinada de una entidad geométrica: independientemente de si la entrada es un punto, una línea o un polígono, la salida es un polígono.

seine_buff_5km = st_buffer(seine, dist = 5000)
plot(seine_buff_5km$geometry,col ='blue')
plot(seine$geometry,add = TRUE)

3. Buffers

Los buffer (zonas de influencia) son polígonos que representan el área dentro de una distancia determinada de una entidad geométrica: independientemente de si la entrada es un punto, una línea o un polígono, la salida es un polígono.

seine_buff_50km = st_buffer(seine, dist = 50000)
plot(seine_buff_50km$geometry,col ='blue')
plot(seine$geometry,add = TRUE)

4. Recortar (clipping)

El recorte espacial es una forma de creación de subconjuntos espaciales que implica cambios en las columnas de geometría de al menos algunas de las entidades afectadas.

4. Recortar (clipping)

Un ejemplo utilizando sf

library(sf)
b = st_sfc(st_point(c(0, 1)), st_point(c(1, 1))) # create 2 points
b = st_buffer(b, dist = 1) # convert points to circles
plot(b, border = "grey")
text(x = c(-0.5, 1.5), y = 1, labels = c("x", "y"), cex = 3) # add text

4. Recortar (clipping)

Diferencia: st_difference

x = b[1]
y = b[2]
x_diff_y = st_difference(x, y)
plot(b, border = "grey")
plot(x_diff_y, col = "lightgrey", border = "grey", add = TRUE)

4. Recortar (clipping)

Diferencia: st_difference

y_diff_x = st_difference(y, x)
plot(b, border = "grey")
plot(y_diff_x, col = "lightgrey", border = "grey", add = TRUE)

4. Recortar (clipping)

Unión: st_union

y_union_x = st_union(y, x)
plot(b, border = "grey")
plot(y_union_x, col = "lightgrey", border = "grey", add = TRUE)

4. Recortar (clipping)

Intersección: st_intersection

x_and_y = st_intersection(x, y)
plot(b, border = "grey")
plot(x_and_y, col = "lightgrey", border = "grey", add = TRUE)

4. Recortar (clipping)

Diferencia simétrica: st_sym_difference

x = b[1]
y = b[2]
x_sym_y = st_sym_difference(x, y)
plot(b, border = "grey")
plot(x_sym_y, col = "lightgrey", border = "grey", add = TRUE)

5. Unión (clipping)

Une geometrias. Funciona de dos formas posibles:

disuelve

nc <- read_sf(system.file("shape/nc.shp", package="sf"))
plot(nc$geometry)

5. Unión (clipping)

Une geometrias. Funciona de dos formas posibles:

disuelve

plot(st_union(nc$geometry))

5. Unión (clipping)

Une geometrias. Funciona de dos formas posibles:

une

plot(c(nc$geometry[1],nc$geometry[10]))

5. Unión (clipping)

Une geometrias. Funciona de dos formas posibles:

une

plot(st_union(nc$geometry[1],nc$geometry[10]))

5. Unión (clipping)

¿Cuál es la diferencia?

c(nc$geometry[1],nc$geometry[10])
Geometry set for 2 features 
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.74107 ymin: 36.23436 xmax: -80.02406 ymax: 36.58965
Geodetic CRS:  NAD27
st_union(nc$geometry[1],nc$geometry[10])
Geometry set for 1 feature 
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.74107 ymin: 36.23436 xmax: -80.02406 ymax: 36.58965
Geodetic CRS:  NAD27

6. Transformación afín

  • La transformación afín es cualquier transformación que preserve las líneas y el paralelismo.

  • Sin embargo, los ángulos o la longitud no necesariamente se conservan.

  • Las transformaciones afines incluyen, entre otras, desplazamiento (traslación), escalado y rotación.

6. Transformación afín

Desplazamiento

nz_sfc = st_geometry(nz)
plot(nz_sfc)

6. Transformación afín

Desplazamiento

Mover la geometría 100.000 en el eje Y (Norte, longitud)

nz_shift = nz_sfc + c(0, 100000)

plot(nz_sfc)
plot(nz_shift,add = TRUE,col='red',alpha = .6)

6. Transformación afín

Escalado

nz_centroid_sfc = st_centroid(nz_sfc) 
nz_scale = (nz_sfc - nz_centroid_sfc) * 0.5 + nz_centroid_sfc
plot(nz_sfc)
plot(nz_scale,add = TRUE,col='red',alpha = .6)

6. Transformación afín

Rotación

Necesita una matriz de rotación

\[R =\begin{bmatrix} cos(\theta) & -\sin(\theta)\\ sin(\theta) & cos(\theta) \end{bmatrix}\]

6. Transformación afín

Rotación

Función de rotación

rotation = function(a){
  r = a * pi / 180 #grados a radianes
  matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
} 

6. Transformación afín

Rotación

nz_rotate = (nz_sfc - nz_centroid_sfc) * rotation(30) + nz_centroid_sfc
plot(nz_sfc)
plot(nz_rotate,add = TRUE,col='red',alpha = .6)