R - Как я могу нарисовать радиус вокруг точки и использовать этот результат для фильтрации других точек? - PullRequest
1 голос
/ 19 мая 2019

Я хочу нарисовать радиус вокруг длинной точки, а затем использовать этот буфер для фильтрации других точек, которые в нем находятся. Например:

#stores datasets
stores = data.frame(store_id = 1:3,
                    lat = c("40.7505","40.7502","40.6045"),
                    long = c("-73.8456","-73.8453","-73.8012")
                    )

#my location
me  = data.frame(lat = "40.7504", long = "-73.8456")

#draw a 100 meter radius around me 


#use the above result to check which points in dataset stores are within that buffer

Не уверен, как подойти к этому. Я работал с over, прежде чем пересекать точки и полигоны, но не уверен, как запустить аналогичный сценарий для одиночных точек.

1 Ответ

1 голос
/ 19 мая 2019

Можно гипотетически попытаться выполнить геометрические вычисления на поверхности сферы или эллипсоида, но обычно при выполнении операций с геометрической картой используется проекция карты, которая проецирует координаты Лон-широты на плоскую поверхность.

Вот как это можно сделать с помощью пакета 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

, который показывает, что первые две точки находятся в круге, а третья - нет.

Конечно, каждая проекция карты вносит некоторые искажения.Ваш выбор проекции будет зависеть от характера вашей проблемы.

...