Pau*_*ula 6 r tidy geolocation geospatial dplyr
我有以下数据框:
df <- tribble(~ id,       ~ lon,              ~ lat,
                 1, -56.2112038,         -34.8358207,
                 2, -55.96403429999999,  -34.7260945,
                 3, -56.155449,          -34.9030824,
                 4, -55.2711453,         -34.8665964,
                 5, -56.210083,          -34.865306,
                 6, -56.0575984,         -34.8775368,
                 7, -54.9485448,         -34.9260087,
                 8, -56.146228,          -34.907991,
                 9, -56.1953583,         -34.8643363,
                 10, -56.1821508,        -34.8697975,
                 11, -56.1498662,        -34.8849854,
                 12, -56.1469807,        -34.9119864,
                 13, -56.155763,         -34.9154153,
                 14, -56.09861610000001, -34.8896448,
                 15, -56.15526680000001, -34.9189892,
                 16, -56.0582918,        -34.8873091,
                 17, -54.9529404,        -34.9221666,
                 19, -106.6971588,       -35.1366719,
                 20, -56.1616095,        -34.8937622)
我想要实现的是添加一个新列,说明在彼此相距 250 米的半径/距离内有多少个 ID。这个想法是取一行,“查看”坐标,看看该点是否在其他 id 的 250 米半径内以及它们中有多少。
library(tidyverse)
library(sf)
您可能应该将坐标转换为31972(拉丁美洲,https://epsg.io/31972)
df_sf <- df %>% 
  st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
  st_transform(31972)
circle_df <- df_sf %>% st_buffer(250)
df[["close_id"]] <- st_within(df_sf, circle_df) %>% imap(setdiff)
df[["n"]] <- df[["close_id"]] %>% map_int(length)
您可以看到点之间的最小距离是:
st_distance(df_sf) %>% .[. > units::set_units(0, "meters")] %>% min()
413.7485 [m]