埃菲尔铁塔的坐标为(经度: 48.8584°N,纬度: 2.2945°E)。我对随机产生100个点感兴趣,这些点位于埃菲尔铁塔半径12公里的范围内。换句话说,我想随机生成100对(经度,纬度),它们位于埃菲尔铁塔半径12公里的范围内。
根据这个问题(Simple calculations for working with lat/lon and km distance?),可以使用以下公式将经度和纬度转换为KM:
因此,如果我想找出半径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())
但这当然需要一些猜测工作和玩耍-理想情况下,我想要一个更“数学的方法”。
谢谢!
发布于 2022-07-25 17:59:40
一种选择是使用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())
https://stackoverflow.com/questions/73113132
复制相似问题