8 votos

¿Calcular distancias entre dos columnas de geometría usando R?

Me gustaría calcular la distancia de pares entre dos geometry columnas. Es decir, quiero calcular la distancia entre varios pares de geometrías sin calcular la matriz de distancia completa entre cada par posible. He subido con una manera de hacerlo con purrr::map2_dbl , pero se siente sucio. ¿Hay un mejor enfoque?

library(sf)
library(purrr)
library(dplyr)

# Load sample data and project to EPSG:5070.
nc <- st_transform(crs = "+init=epsg:5070",
  st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE))

# Here's the full distance matrix. I don't want that.
nc_dist_mat <- st_distance(nc, nc)

# Define a function to calculate distances pairwise:
pairwise_distance <- purrr::partial(purrr::map2_dbl, .f = sf::st_distance)

# distance to self is always zero:
pairwise_distance(st_geometry(nc), st_geometry(nc))  
# distance to random county isn't always zero:
pairwise_distance(st_geometry(nc), st_geometry(dplyr::sample_frac(nc)))  

8voto

Jay Bazuzi Puntos 194

¿Lazo sobre cada geometría con mapply?

Para cualquier dos vectores columna de geometría:

> set.seed(1)
> g1 = st_geometry(nc); g2= st_geometry(dplyr::sample_frac(nc)) 

> mapply(st_distance, g1, g2)
  [1] 152687.52 390721.95 105485.92 363253.27 214961.38  66748.80 309538.72
  [8]  11825.65 213627.60 273758.95 198366.26      0.00  66634.13 331566.88
 [15] 251378.71  45416.83 602878.69  76128.17 361629.19 153484.84 240215.77
 [etc, 100 elements]

Creo que esto es esencialmente lo mismo que su solución pero sólo utiliza código BSR (Base, estable, R) (excepto el bit de dplyr he copiado de ti y el sf paquete por supuesto).

También, he planteado esto como una nueva solicitud de característica en el sf sitio de github.

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