首页 > 解决方案 > 如何在 r 中的单独坐标列表中找到最近的位置?

问题描述

给定事件地点列表:

event.coords <- data.frame(
    event.id = letters[1:5],
    lats = c(43.155, 37.804, 26.71, 35.466, 40.783),
    lons = c(-77.616,-122.271, -80.064, -97.513, -73.966))

和地区的质心(恰好是邮政编码,但可能是州、国家等):

locale.centroids <-
  data.frame(
    locale.id = 1:5,
    lats = c(33.449, 41.482, 40.778, 43.59, 41.736),
    lons = c(-112.074, -81.67, -111.888, -70.335, -111.834))

我想计算每个区域中心距最近事件的距离。我的数据包含 100,000 个语言环境,所以我需要一些计算效率高的东西。

标签: rgeospatialsfsprgeo

解决方案


一个tidyverse策略。为了计算地理距离,我正在使用包geosphere

event.coords <- data.frame(
  event.id = letters[1:5],
  lats = c(43.155, 37.804, 26.71, 35.466, 40.783),
  lons = c(-77.616,-122.271, -80.064, -97.513, -73.966))

locale.centroids <-
  data.frame(
    locale.id = 1:5,
    lats = c(33.449, 41.482, 40.778, 43.59, 41.736),
    lons = c(-112.074, -81.67, -111.888, -70.335, -111.834))

library(tidyverse)
library(geosphere)

event.coords %>% rowwise() %>%
  mutate(new =  map(list(c(lons, lats)), ~ locale.centroids %>% rowwise() %>%
                      mutate(dist = distGeo((c(lons, lats)), .x)) %>%
                      ungroup %>%
                      filter(dist == min(dist)) %>%
                      select(locale.id, dist)))  %>%
  ungroup() %>% unnest_wider(new)

#> # A tibble: 5 x 5
#>   event.id  lats   lons locale.id     dist
#>   <chr>    <dbl>  <dbl>     <int>    <dbl>
#> 1 a         43.2  -77.6         2  382327.
#> 2 b         37.8 -122.          3  953915.
#> 3 c         26.7  -80.1         2 1645206.
#> 4 d         35.5  -97.5         1 1355234.
#> 5 e         40.8  -74.0         4  432562.

reprex 包于 2021-07-07 创建 (v2.0.0 )


推荐阅读