模拟埃菲尔铁塔周围的地理点

问题描述 投票:0回答:1

埃菲尔铁塔的坐标是(经度:48.8584° N,纬度:2.2945° E)。我有兴趣随机生成位于埃菲尔铁塔 12 公里半径范围内的 100 个点。换句话说,我想随机生成位于埃菲尔铁塔 12 公里半径范围内的 100 对(经度、纬度)。

根据这里的问题(使用纬度/经度和公里距离进行简单计算?),可以使用以下公式将经度和纬度转换为公里:

  • 纬度:1 度 = 110.574 公里
  • 经度:1 度 = 111.320*cos(纬度) km

因此,如果我想找出12公里的半径,对应的最大范围应该是:

  • 最大纬度范围:12 * (1/110.574) = 0.1085246
  • 最大经度范围:111.320*cos(0.1085246) = 110.6651 -> 1/110.6651 = 0.009036273

使用这些信息,我尝试模拟点并绘制它们:

# 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())

但是这些点并不出现在埃菲尔铁塔附近 - 其中一些甚至在比利时! :

enter image description here

我减少了方差,现在点看起来更接近:

# 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())

enter image description here

但这当然需要一些猜测和尝试 - 理想情况下,我想要一种更“数学的方法”。

  • 是否有一些标准公式可以用来确保无论我选择什么初始坐标(例如埃菲尔铁塔,自由女神像等),随机生成的点总是落在某个半径内?
r visualization geospatial r-leaflet
1个回答
3
投票

一种选择是使用

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())

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.