埃菲尔铁塔的坐标是(经度:48.8584° N,纬度:2.2945° E)。我有兴趣随机生成位于埃菲尔铁塔 12 公里半径范围内的 100 个点。换句话说,我想随机生成位于埃菲尔铁塔 12 公里半径范围内的 100 对(经度、纬度)。
根据这里的问题(使用纬度/经度和公里距离进行简单计算?),可以使用以下公式将经度和纬度转换为公里:
因此,如果我想找出12公里的半径,对应的最大范围应该是:
使用这些信息,我尝试模拟点并绘制它们:
# for some reason, you have to call "long" as "lat" and vice versa - otherwise the points appear in the wrong locations all together
id = 1:100
long = 2.2945 + rnorm( 100, 0.1085246 , 1)
lat = 48.8584 + rnorm( 100, 0.009036273 , 1)
my_data = data.frame(id, lat, long)
library(leaflet)
my_data %>%
leaflet() %>%
addTiles() %>%
addMarkers(clusterOption=markerClusterOptions())
但是这些点并不出现在埃菲尔铁塔附近 - 其中一些甚至在比利时! :
我减少了方差,现在点看起来更接近:
# reduce variance
id = 1:100
long = 2.2945 + rnorm( 100, 0.1085246 , 0.01)
lat = 48.8584 + rnorm( 100, 0.009036273 , 0.01)
my_data = data.frame(id, lat, long)
library(leaflet)
my_data %>%
leaflet() %>%
addTiles() %>%
addMarkers(clusterOption=markerClusterOptions())
但这当然需要一些猜测和尝试 - 理想情况下,我想要一种更“数学的方法”。
一种选择是使用
sf
包。函数 st_buffer
将允许您围绕起点创建一个 12 公里的圆圈,而 st_sample
将允许您在该圆圈内随机选取 100 个点。
创建数据
library(sf)
library(dplyr)
pt_sf <- data.frame(long = 2.2945, lat = 48.8584) %>%
st_as_sf(coords = c("long", "lat"), crs = 4326)
buff <- pt_sf %>%
st_buffer(dist = units::as_units(12, 'km'))
buff_sample <- st_sample(buff, 100)
绘制它
library(leaflet)
leaflet(pt_sf) %>%
addTiles() %>%
addCircleMarkers(color = 'red') %>%
addPolygons(data = buff) %>%
addMarkers(data = buff_sample, clusterOption=markerClusterOptions())