我希望在一个经点上绘制一个半径,然后使用该缓冲区过滤适合其中的其他点。例如:
#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
进行过交叉点和多边形的工作,但是不确定如何在单个点上运行类似的场景。
答案 0 :(得分:1)
假设可以尝试在球体或椭圆体的表面上进行几何计算,但是通常在执行几何地图操作时,人们会使用地图投影将lon-lat坐标投影到平面上。
以下是使用 sf 软件包的方法。首先,在经纬度坐标中创建点:
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
自变量指定lon-lat坐标系的EPSG代码。接下来,我们需要选择一个地图投影。在此示例中,我将使用UTM区域18,其中包含上述几点:
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
表明前两个点在圆中,第三个点不在圆中。
当然,每个地图投影都会产生一些变形。您选择哪种预测取决于您问题的性质。
答案 1 :(得分:0)
spatialrisk包中的points_in_circle()函数可以处理此问题。
例如,使用您的数据:
library(spatialrisk)
# Stores
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)
> spatialrisk::points_in_circle(stores, me$long[1], me$lat[1], radius = 100, lon = long)
# store_id lat long distance_m
# 1 40.7505 -73.8456 11.13195
# 2 40.7502 -73.8453 33.70076