Análisis Espacial con R

Datos Espaciales en R

Dr. Francisco Zambrano Bigiarini

Hemera, Universidad Mayor

Contenidos

Datos Espaciales en R

  • Datos vectoriales
  • Datos raster

1. Datos espaciales en R

Tipos de dato espaciales

  • Discretos : datos vectoriales
  • Continuos : datos raster

Simple representación de datos espaciales

name <- LETTERS[1:10]
longitude <- c(-116.7, -120.4, -116.7, -113.5, -115.5,
               -120.8, -119.5, -113.7, -113.7, -110.7)
latitude <- c(45.3, 42.6, 38.9, 42.1, 35.7, 38.9,
              36.2, 39, 41.6, 36.9)
stations <- cbind(longitude, latitude)
# Simulated rainfall data
set.seed(0)
precip <- round((runif(length(latitude))*10)^3)

1. Datos espaciales

Simple representación de datos espaciales

psize <- 1 + precip/500
plot(stations, cex=psize, pch=20, col='red', main='Precipitation')
# add names to plot
text(stations, name, pos=4)
# add a legend
breaks <- c(100, 250, 500, 1000)
legend.psize <- 1+breaks/500
legend("topright", legend=breaks, pch=20, pt.cex=legend.psize, col='red', bg='gray')

1. Datos espaciales

Simple representación de datos espaciales

1. Datos espaciales

Simple representación de datos espaciales

1. Datos espaciales

Simple representación de datos espaciales

1. Datos espaciales

Simple representación de datos espaciales

Podemos almacenar datos espaciales en un data.frame

   longitude latitude name precip
1     -116.7     45.3    A    721
2     -120.4     42.6    B     19
3     -116.7     38.9    C     52
4     -113.5     42.1    D    188
5     -115.5     35.7    E    749
6     -120.8     38.9    F      8
7     -119.5     36.2    G    725
8     -113.7     39.0    H    843
9     -113.7     41.6    I    289
10    -110.7     36.9    J    249

2. Datos espaciales vectoriales

Simple Feature {sf}

  • Utilizaremos {sf}

  • Tener cuidado ya que el más utilizado por mucho tiempo fue {sp} (mas antiguo)

  • Muchos ejemplos o incluso usos que vean por ahí estarán con los tipos de datos definidos por {sp}

  • {sp} está siendo (o ya fue) reemplazado por {sf}

Simple Feature: se refiere a un estándar formal (ISO 19125-1: 2004) que describe cómo los objetos en el mundo real se pueden representar en computadoras, con énfasis en la geometría espacial de estos objetos.

https://github.com/r-spatial/sf/

2. Datos espaciales vectoriales

Simple Feature {sf}: Dimensiones

  • Todas las geometrias (puntos, lineas, polígonos) están formadas por puntos.
  • 2, 3, o 4 dimensiones
  • Todos los puntos en una geometría tienen la misma dimensión
  • Ademas de X e Y hay dos opciones
    • coordenada Z para altitud
    • coordenada M medición asociada con el punto (ej, tiempo en que fue medido)

2. Datos espaciales vectoriales

Simple Feature {sf}: Dimensiones

  • Cuatro casos posibles:
    • 2D (X,Y), (E, N), (Lon,Lat): XY
    • 3D : XYZ
    • 3D : XYM
    • 4D : XYZM

2. Datos espaciales vectoriales

Simple Feature {sf}: Tipos de geometrías

Tipo Descripción
POINT geometría dimensión cero, un punto
LINESTRING varios puntos, secuencia de puntos conectados por líneas rectas que no se intersecan; geometría unidimensional
POLYGON geometría con un área positiva (bidimensional); la secuencia de puntos forma un anillo cerrado que no se interseca
MULTIPOINT grupo de POINT
MULTILINESTRING grupo de LINESTRING
MULTIPOLYGON grupo de POLYGON
GEOMETRYCOLLECTION grupo de geometrías de cualquier tipo

2. Datos espaciales vectoriales

Simple Feature {sf}: Clases

Geometria -> list-column (tipo de dato)
Atributos -> data.frame

Como {sf} almacena las Simple Features.

Los tres tipos de datos utilizados para representarlos son:
- sf: la tabla (data.frame) con los atributos y geometría de la entidad , que contiene
- sfc : la list-colum con la geometría de cada entidad (registro), que está compuesto de
- sfg: la geometría de la entidad de cada simple feature individual

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sf

library(sf)
nc <- st_read(system.file("shape/nc.shp", package="sf"))
Reading layer `nc' from data source 
  `/home/francisco/R/x86_64-pc-linux-gnu-library/4.2/sf/shape/nc.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 100 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
Geodetic CRS:  NAD27

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sf

plot(nc[1])

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sf

class(nc)
[1] "sf"         "data.frame"

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sf

lapply(attributes(nc),'head')
$names
[1] "AREA"      "PERIMETER" "CNTY_"     "CNTY_ID"   "NAME"      "FIPS"     

$row.names
[1] 1 2 3 4 5 6

$class
[1] "sf"         "data.frame"

$sf_column
[1] "geometry"

$agr
     AREA PERIMETER     CNTY_   CNTY_ID      NAME      FIPS 
     <NA>      <NA>      <NA>      <NA>      <NA>      <NA> 
Levels: constant aggregate identity

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sf

print(nc[9:15], n = 3)
Simple feature collection with 100 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
Geodetic CRS:  NAD27
First 3 features:
  BIR74 SID74 NWBIR74 BIR79 SID79 NWBIR79                       geometry
1  1091     1      10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
2   487     0      10   542     3      12 MULTIPOLYGON (((-81.23989 3...
3  3188     5     208  3616     6     260 MULTIPOLYGON (((-80.45634 3...

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sf

VERDE: Simple Feature individual, atributos + geometría
AZUL: geometría (objeto de clase sfg)
ROJO: Simple Feature list-column (sfc)

2. Datos espaciales vectoriales

sfc (simple feature list-column)

Simple Feature {sf}: Clase sfc

(nc_geom <- st_geometry(nc))
Geometry set for 100 features 
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
Geodetic CRS:  NAD27
First 5 geometries:

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfc

class(nc_geom)
[1] "sfc_MULTIPOLYGON" "sfc"             
nc_geom[[1]]
class(nc_geom[[1]])
[1] "XY"           "MULTIPOLYGON" "sfg"         

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfc

plot(nc_geom[[1]])

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfc

names(attributes(nc_geom))
[1] "n_empty"   "crs"       "class"     "precision" "bbox"     
attr(nc_geom,'crs')
Coordinate Reference System:
  User input: NAD27 
  wkt:
GEOGCRS["NAD27",
    DATUM["North American Datum 1927",
        ELLIPSOID["Clarke 1866",6378206.4,294.978698213898,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["latitude",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["longitude",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4267]]

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

sfg (simple feature geometry) guarda la geometría de un a entidad individual, ej. un punto, una linea o polígono

Está implementada en en tipos de datos nativos de R (numeric, matrix, list), siguiendo la siguiente regla:

  1. un POINT es unj vector numérico
  2. un grupo de puntos, e.j. un LINESTRING o un anillo de un POLYGON es un matrix y cada fila de la matrix es un POINT
  3. cualquier otro grupo es un list

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

(x <- st_point(c(1,2)))
str(x)
 'XY' num [1:2] 1 2
(x <- st_point(c(1,2,3)))
str(x)
 'XYZ' num [1:3] 1 2 3

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

(x <- st_point(c(1,2,3), "XYM"))
str(x)
 'XYM' num [1:3] 1 2 3
(x <- st_point(c(1,2,3,4)))
str(x)
 'XYZM' num [1:4] 1 2 3 4

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

st_zm(x, drop = TRUE, what = "ZM")

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

p <- rbind(c(3.2,4), c(3,4.6), c(3.8,4.4), c(3.5,3.8), c(3.4,3.6), c(3.9,4.5))
(mp <- st_multipoint(p))
s1 <- rbind(c(0,3),c(0,4),c(1,5),c(2,5))
(ls <- st_linestring(s1))
s2 <- rbind(c(0.2,3), c(0.2,4), c(1,4.8), c(2,4.8))
s3 <- rbind(c(0,4.4), c(0.6,5))
(mls <- st_multilinestring(list(s1,s2,s3)))

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

p1 <- rbind(c(0,0), c(1,0), c(3,2), c(2,4), c(1,4), c(0,0))
p2 <- rbind(c(1,1), c(1,2), c(2,2), c(1,1))
pol <-st_polygon(list(p1,p2))
p3 <- rbind(c(3,0), c(4,0), c(4,1), c(3,1), c(3,0))
p4 <- rbind(c(3.3,0.3), c(3.8,0.3), c(3.8,0.8), c(3.3,0.8), c(3.3,0.3))[5:1,]
p5 <- rbind(c(3,3), c(4,2), c(4,3), c(3,3))
(mpol <- st_multipolygon(list(list(p1,p2), list(p3,p4), list(p5))))
(gc <- st_geometrycollection(list(mp, mpol, ls)))

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

par(mfrow=c(2,3))
plot(mp,col='red',main = 'MULTIPOINT')
plot(ls,col='red',main = 'LINESTRING')
plot(mls,col='red',main = 'MULTILINESTRING')
plot(pol,col = 'gray',border='red',main = 'POLIGON')
plot(mpol,col = 'gray',border='red',main = 'MULTIPOLIGON')
plot(gc,col = 'gray',border='red',main = 'GEOMETRY')

2. Datos espaciales vectoriales

Simple Feature {sf}: Clase sfg

3. Datos espaciales raster

  1. Vamos a utilizar el paquete {terra}
  2. {terra} está reemplazando a {raster}, ya que es más simple y rapido
  3. {terra} es nuevo, fue lanzado el 2020:
  • Ya hay documentación y ejemplos
  • Otros paquetes que utilizan datos espaciales se están actualizando para dar soporte a {terra}
  • El paso de {raster} a {terra} no es complicado
  • las funciones son muy similares a {raster}.

3. Datos espaciales raster

El paquete {terra} tiene funciones para crear, leer, manipular y guardar datos raster y vectoriales.

Las clases definidas por {terra} son:
- SpatRaster
- SpatVector

3. Datos espaciales raster

Tipos de datos: spatRaster

  • Representa bandas de información.
  • Guarda información número de columnas y filas, extensión espacial, el sistema de referencia de coordenadas, extensión.
library(terra)
(r <- rast(ncol=10, nrow=10, xmax=-80, xmin=-150, ymin=20, ymax=60))
class       : SpatRaster 
dimensions  : 10, 10, 1  (nrow, ncol, nlyr)
resolution  : 7, 4  (x, y)
extent      : -150, -80, 20, 60  (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 

3. Datos espaciales raster

Tipos de datos: spatRaster

El objeto r solo tiene el esqueleto del raster, pero aún no tiene valores

class       : SpatRaster 
dimensions  : 10, 10, 1  (nrow, ncol, nlyr)
resolution  : 7, 4  (x, y)
extent      : -150, -80, 20, 60  (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 
source(s)   : memory
name        : lyr.1 
min value   :     1 
max value   :   100 

3. Datos espaciales raster

Tipos de datos: spatRaster

plot(r)
text(r)

3. Datos espaciales raster

Tipos de datos:spatRaster multicapa

  • Puede trabajar con un archvivo raster de mutiples capas (Ej, imagen satelital)
  • Puede trabajar con datos raster desde diferentes archivos (Ej., series de tiempos guardados en archivos independientes.

3. Datos espaciales raster

Tipos de datos: spatRaster multicapa

r2 <- r * r
r3  <- sqrt(r)
(s <- c(r, r2, r3))
class       : SpatRaster 
dimensions  : 10, 10, 3  (nrow, ncol, nlyr)
resolution  : 7, 4  (x, y)
extent      : -150, -80, 20, 60  (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 
source(s)   : memory
names       : lyr.1, lyr.1, lyr.1 
min values  :     1,     1,     1 
max values  :   100, 10000,    10 

3. Datos espaciales raster

Tipos de datos: spatRaster multicapa

4. Manejo de CRS en R

  • Coordenadas geográficas: esféricas
  • Coordenadas proyectadas: cónica, cilíndrica y planas

Para manejar CRS R utiliza la librería PROJ

PROJ.4 fue usado por más de 30 años, luego mutó a \(PR \phi J\), dando paso a PROJ5, PROJ6 y ahora PROJ7. PROJ8 en 2021.

Así, hay tres formatos para manejar los CRS

  • proj.4
  • EPSG
  • Well-known Text (wkt)

{sf} usa wkt (well-known text) o EPSG

{terra} usa PROJ.4, wkt o EPSG

5. Datos vectoriales: {sf}

Versiones anteriores de {sf} (<0.9) ~

5. Datos vectoriales: {sf}

Ahora

st_crs(4326)
Coordinate Reference System:
  User input: EPSG:4326 
  wkt:
GEOGCRS["WGS 84",
    ENSEMBLE["World Geodetic System 1984 ensemble",
        MEMBER["World Geodetic System 1984 (Transit)"],
        MEMBER["World Geodetic System 1984 (G730)"],
        MEMBER["World Geodetic System 1984 (G873)"],
        MEMBER["World Geodetic System 1984 (G1150)"],
        MEMBER["World Geodetic System 1984 (G1674)"],
        MEMBER["World Geodetic System 1984 (G1762)"],
        MEMBER["World Geodetic System 1984 (G2139)"],
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]],
        ENSEMBLEACCURACY[2.0]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    USAGE[
        SCOPE["Horizontal component of 3D system."],
        AREA["World."],
        BBOX[-90,-180,90,180]],
    ID["EPSG",4326]]

5. Datos vectoriales: {sf}

Recomendación utilizar EPSG (European Petroleum Survey Group) y wkt para identificar el CRS, cuando sea posible. No se aconseja el uso de proj4.

Transformar de un CRS a otro con la función st_transform

st_geometry(nc)[[4]][[2]][[1]][1:3,]
          [,1]     [,2]
[1,] -76.02717 36.55672
[2,] -75.99866 36.55665
[3,] -75.91192 36.54253
nc.web_mercator <- st_transform(nc, 3857)
st_geometry(nc.web_mercator)[[4]][[2]][[1]][1:3,]
         [,1]    [,2]
[1,] -8463267 4377507
[2,] -8460094 4377498
[3,] -8450437 4375541

6. Datos raster: {terra}

Asignar un CRS a un raster. Utilce EPSG o wkt

crs(r) <- NA
crs(r)
[1] ""
(crs(r) <- crs("+init=epsg:4326")) |> cat()
GEOGCRS["WGS 84",
    ENSEMBLE["World Geodetic System 1984 ensemble",
        MEMBER["World Geodetic System 1984 (Transit)",
            ID["EPSG",1166]],
        MEMBER["World Geodetic System 1984 (G730)",
            ID["EPSG",1152]],
        MEMBER["World Geodetic System 1984 (G873)",
            ID["EPSG",1153]],
        MEMBER["World Geodetic System 1984 (G1150)",
            ID["EPSG",1154]],
        MEMBER["World Geodetic System 1984 (G1674)",
            ID["EPSG",1155]],
        MEMBER["World Geodetic System 1984 (G1762)",
            ID["EPSG",1156]],
        MEMBER["World Geodetic System 1984 (G2139)",
            ID["EPSG",1309]],
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1],
            ID["EPSG",7030]],
        ENSEMBLEACCURACY[2.0],
        ID["EPSG",6326]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433],
        ID["EPSG",8901]],
    CS[ellipsoidal,2],
        AXIS["longitude",east,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433,
                ID["EPSG",9122]]],
        AXIS["latitude",north,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433,
                ID["EPSG",9122]]],
    USAGE[
        SCOPE["unknown"],
        AREA["World."],
        BBOX[-90,-180,90,180]]]

6. Datos raster: {terra}

Reproyectar

r <- rast(xmin=-72, xmax=-71, ymin=-37, ymax=-36, ncols=40, nrows=40)
values(r) <- 1:ncell(r)
plot(r)

6. Datos raster: {terra}

Reproyectar

crs(r) <- crs('EPSG:4326')
(newr <- project(r,y=crs('EPSG:32719')))
class       : SpatRaster 
dimensions  : 45, 37, 1  (nrow, ncol, nlyr)
resolution  : 2521.73, 2521.73  (x, y)
extent      : 229578.6, 322882.7, 5900724, 6014202  (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / UTM zone 19S (EPSG:32719) 
source(s)   : memory
name        :      lyr.1 
min value   :    2.82134 
max value   : 1600.00000 

6. Datos raster: {terra}

Reproyectar

plot(newr)

6. Conversion entre CRS({terra}) y crs({sf})

De sf a terra

new_crs <- crs(st_crs(32719)$wkt)
class(new_crs)
[1] "character"

De terra a sf

new_crs2 <- st_crs(crs("EPSG:32719"))
class(new_crs2)
[1] "crs"

7. Algunas operaciones espaciales

Necesitamos para poder reproducir

library(sf)
library(spData) 

nz: geometria de Nueva Zelanda
nz_height : geometría de las mayores alturas en Nueva Zelanda

7. Operaciones espaciales con datos vectoriales

Filtrado espacial

nz
Simple feature collection with 16 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 1090144 ymin: 4748537 xmax: 2089533 ymax: 6191874
Projected CRS: NZGD2000 / New Zealand Transverse Mercator 2000
First 10 features:
                Name Island Land_area Population Median_income Sex_ratio
1          Northland  North 12500.561     175500         23400 0.9424532
2           Auckland  North  4941.573    1657200         29600 0.9442858
3            Waikato  North 23900.036     460100         27900 0.9520500
4      Bay of Plenty  North 12071.145     299900         26200 0.9280391
5           Gisborne  North  8385.827      48500         24400 0.9349734
6        Hawke's Bay  North 14137.524     164000         26100 0.9238375
7           Taranaki  North  7254.480     118000         29100 0.9569363
8  Manawatu-Wanganui  North 22220.608     234500         25000 0.9387734
9         Wellington  North  8048.553     513900         32700 0.9335524
10        West Coast  South 23245.456      32400         26900 1.0139072
                             geom
1  MULTIPOLYGON (((1745493 600...
2  MULTIPOLYGON (((1803822 590...
3  MULTIPOLYGON (((1860345 585...
4  MULTIPOLYGON (((2049387 583...
5  MULTIPOLYGON (((2024489 567...
6  MULTIPOLYGON (((2024489 567...
7  MULTIPOLYGON (((1740438 571...
8  MULTIPOLYGON (((1866732 566...
9  MULTIPOLYGON (((1881590 548...
10 MULTIPOLYGON (((1557042 531...

7. Operaciones espaciales con datos vectoriales

Filtrado espacial

str(nz)
Classes 'sf' and 'data.frame':  16 obs. of  7 variables:
 $ Name         : chr  "Northland" "Auckland" "Waikato" "Bay of Plenty" ...
 $ Island       : chr  "North" "North" "North" "North" ...
 $ Land_area    : num  12501 4942 23900 12071 8386 ...
 $ Population   : num  175500 1657200 460100 299900 48500 ...
 $ Median_income: int  23400 29600 27900 26200 24400 26100 29100 25000 32700 26900 ...
 $ Sex_ratio    : num  0.942 0.944 0.952 0.928 0.935 ...
 $ geom         :sfc_MULTIPOLYGON of length 16; first list element: List of 1
  ..$ :List of 1
  .. ..$ : num [1:68, 1:2] 1745493 1740539 1733165 1720197 1709110 ...
  ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
 - attr(*, "sf_column")= chr "geom"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA
  ..- attr(*, "names")= chr [1:6] "Name" "Island" "Land_area" "Population" ...

7. Operaciones espaciales con datos vectoriales

nz_height
Simple feature collection with 101 features and 2 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 1204143 ymin: 5048309 xmax: 1822492 ymax: 5650492
Projected CRS: NZGD2000 / New Zealand Transverse Mercator 2000
First 10 features:
   t50_fid elevation                geometry
1  2353944      2723 POINT (1204143 5049971)
2  2354404      2820 POINT (1234725 5048309)
3  2354405      2830 POINT (1235915 5048745)
4  2369113      3033 POINT (1259702 5076570)
5  2362630      2749 POINT (1378170 5158491)
6  2362814      2822 POINT (1389460 5168749)
7  2362817      2778 POINT (1390166 5169466)
8  2363991      3004 POINT (1372357 5172729)
9  2363993      3114 POINT (1372062 5173236)
10 2363994      2882 POINT (1372810 5173419)

7. Operaciones espaciales con datos vectoriales

Filtrado espacial

7. Operaciones espaciales con datos vectoriales

Filtrado espacial

Problema:Seleccionemos las máximas alturas en Canterbury

alternativa 1

rows_sel<- nz$Name == 'Canterbury'
canterbury <- nz[rows_sel,]
cant_height <- nz_height[canterbury,]

Otra alternativa: con operaciones geométricas

rows_sel<- nz$Name == 'Canterbury'
canterbury <- nz[rows_sel,]
cant_height <- st_intersection(nz_height,canterbury)

7. Operaciones espaciales en datos vectoriales

Filtrado espacial

7. Operaciones espaciales en datos vectoriales

Distancia

Problema: calcular la distancia entre el punto de mayor altura en Nueva Zelanda y el centroide da la región de Canterbury.

nz_highest <- nz_height[order(-nz_height$elevation),][1,]
canterbury_centroid = st_centroid(canterbury)

7. Operaciones espaciales en datos vectoriales

Distancia

(st_distance(nz_highest, canterbury_centroid))
Units: [m]
       [,1]
[1,] 115540

Dos cosas que hay que notar:
1. el resultado tiene unidades, indicando que es en metros, no kilometros, pies, etc.
2. el resultado se entrega en forma de matriz, aunque en este caso tiene un solo valor

st_distance devuelve una matriz de distancia. La función tiene la habilidad de calcular la distancia entre cualquier combinación de objetos.

7. Operaciones espaciales en datos vectoriales

Distancia

Problema: calcular la distancia entre las regiones de Canterbury y Otago con las tres primeras altura de nz_height

7. Operaciones espaciales en datos vectoriales

Distancia

(st_distance(nz_height[1:3, ], co))
Units: [m]
          [,1]     [,2]
[1,] 123537.16 15497.72
[2,]  94282.77     0.00
[3,]  93018.56     0.00

8. Operaciones espaciales en datos raster

Usaremos los datos: 1. elev : datos raster de elevación en metros. 2. grain : datos raster de granulométricos

elev = rast(system.file("raster/elev.tif", package = "spData"))
grain = rast(system.file("raster/grain.tif", package = "spData"))

8. Operaciones espaciales en datos raster

Subset espacial

Funciones {terra}: cellFromXY extract

Problema: extraer los valores de elevación que están a 0.1 unidades desde el origen.

id = cellFromXY(elev, xy = matrix(c(-0.1, -0.1),ncol=2))
elev[id]
  elev
1   21
terra::extract(elev, data.frame(x = -0.1, y = -0.1))
  ID elev
1  1   21

8. Operaciones espaciales en datos raster

Subset espacial

Se pueden realizar subset con otros datos raster.

clip <- rast(xmin = 0.9, xmax = 1.8, ymin = -0.45, ymax = 0.45,
              res = 0.3, vals = rep(1, 9))
elev[clip]
  elev
1   18
2   24

8. Operaciones espaciales en datos raster

Subset espacial

  • Hasta ahora los subset devuelven los valores numéricos.
  • Si queremos que el resultado sea entregado como objeto espacial¿?
s1 <- elev[1:2, drop = FALSE]
s2 <- elev[1, 1:2, drop = FALSE]
elev[clip, drop = FALSE]
class       : SpatRaster 
dimensions  : 2, 1, 1  (nrow, ncol, nlyr)
resolution  : 0.5, 0.5  (x, y)
extent      : 1, 1.5, -0.5, 0.5  (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326) 
source(s)   : memory
varname     : elev 
name        : elev 
min value   :   18 
max value   :   24 

8. Operaciones espaciales en datos raster

Subset espacial

Otro caso comun de subset espacial es utilizar una mascara lógica (con NA y 1).

rmask <- elev
values(rmask) <- sample(c(NA, 1), 36, replace = TRUE)
plot(rmask)

8. Operaciones espaciales en datos raster

Subset espacial

s4 <- elev[rmask, drop = FALSE]           # with [ operator
s5 <- mask(elev, rmask)                   # with mask()

par(mfrow=c(1,2))
plot(s4);plot(s5)

8. Operaciones espaciales en datos raster

Operaciones locales

Algebra raster

elev + elev
elev^2
log(elev)
elev > 5

Función app

elev4 <- c(elev, elev*0.2, elev*1.2,elev*1.5) #raster con 4 capas

res <- app(elev4, \(y){
  df <- data.frame(x=1:4,y=y)
  mod <- lm(y~x,df)
  summary(mod)$coefficients[2,1]
  })

# tendencia lineal (pendiente) para el ajuste entre 1:4 y los valores de los raster
plot(elev4)

Función app

plot(res);text(res)