如何找到半径 250 米附近有多少个位置

问题描述

我有以下数据框:

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]