Можно гипотетически попытаться выполнить геометрические вычисления на поверхности сферы или эллипсоида, но обычно при выполнении операций с геометрической картой используется проекция карты, которая проецирует координаты Лон-широты на плоскую поверхность.
Вот как это можно сделать с помощью пакета sf .Сначала создайте точки в координатах lon-lat:
library(sf)
lat <- c(40.7505, 40.7502, 40.6045)
lon <- c(-73.8456, -73.8453, -73.8012)
stores <- st_sfc(st_multipoint(cbind(lon, lat)), crs = 4326)
me <- st_sfc(st_point(c(-73.8456, 40.7504)), crs = 4326)
Аргумент crs = 4326
указывает код EPSG для системы координат lon-lat.Далее нам нужно выбрать проект карты.В этом примере я буду использовать зону 18 UTM, которая содержит вышеуказанные точки:
stores_utm <- st_transform(stores, "+proj=utm +zone=18")
me_utm <- st_transform(me, "+proj=utm +zone=18")
Теперь мы можем буферизовать точку, представляющую себя на 100 метров, чтобы создать круг с радиусом 100 метров:
circle <- st_buffer(me_utm, 100)
Теперь мы почти готовы использовать геометрический предикат, чтобы проверить, какие точки находятся в круге.Однако stores_utm
в настоящее время является MULTIPOINT
, поэтому геометрические предикаты будут обрабатывать его как одну геометрическую сущность.Мы можем исправить это, применив stores_utm
как POINT
, что даст нам набор из трех отдельных точек:
stores_utm_column <- st_cast(stores_utm, "POINT")
stores_utm_column
# Geometry set for 3 features
# geometry type: POINT
# dimension: XY
# bbox: xmin: 597453 ymin: 4495545 xmax: 601422.3 ymax: 4511702
# epsg (SRID): 32618
# proj4string: +proj=utm +zone=18 +ellps=WGS84 +units=m +no_defs
# POINT (597453 4511702)
# POINT (597478.7 4511669)
# POINT (601422.3 4495545)
Теперь мы можем проверить, какие точки находятся в круге:
> st_contains(circle, stores_utm_column, sparse = FALSE)
# [,1] [,2] [,3]
# [1,] TRUE TRUE FALSE
, который показывает, что первые две точки находятся в круге, а третья - нет.
Конечно, каждая проекция карты вносит некоторые искажения.Ваш выбор проекции будет зависеть от характера вашей проблемы.