R 围绕半径内的某个地理点(横向、纵向)生成均匀分布的地理点
在给定距离的起点周围,是否有更好的方法生成N个Lat/Long坐标?这是我的方法,但它不能创建统一的分布R 围绕半径内的某个地理点(横向、纵向)生成均匀分布的地理点,r,gis,r-raster,R,Gis,R Raster,在给定距离的起点周围,是否有更好的方法生成N个Lat/Long坐标?这是我的方法,但它不能创建统一的分布 generate_gps_coordinates_in_circle<-function(start_lat,start_lon,max_distance_in_m,min_distance_in_m){ lat <- (start_lat * pi / 180) #center of the circle lon <- (start_lon * pi / 1
generate_gps_coordinates_in_circle<-function(start_lat,start_lon,max_distance_in_m,min_distance_in_m){
lat <- (start_lat * pi / 180) #center of the circle
lon <- (start_lon * pi / 180) #center of the circle
earth_radius <- 6371000
distance <- sqrt(runif(1, 0, 1) * (max_distance_in_m ** 2 - min_distance_in_m ** 2) + min_distance_in_m ** 2) #max and min distance from the center
delta_lat = cos(runif(1) * pi) * distance / earth_radius
sign = runif(1, 0, 2) * 2 - 1
delta_lon = sign * acos(((cos(distance/earth_radius) - cos(delta_lat)) / (cos(lat) * cos(delta_lat + lat))) + 1)
result <- c(lon = (lon + delta_lon) * 180 / pi, lat =(lat + delta_lat) * 180 / pi)
return(result)
}
generate_gps_coordinates_in_circle您可以使用geosphere
软件包中的功能destPoint
获取给定点的坐标,该点是给定方位和距地球表面原点的距离。通过执行runif(1)*360
可以很简单地获得随机方位。但是,如果希望点周围的密度均匀,则需要将均匀随机变量的平方根作为距离
因此,我们可以使用destPoint
重写您的函数,还可以利用矢量化,以便返回n
点的数据帧:
在圆2 0.002891265 53.99959中生成gps坐标
#> 3 0.0021632655 54.00045
#> 4 -0.0006538438 53.99894
#> 5 0.0014026358 54.00087
#> 6 0.0005882192 54.00172
我们可以看到结果是令人满意的,在很小的距离内产生了一个圆:
绘图(df$lon,df$lat)
但在更大的距离上有一个适当扭曲的圆:
df您可以使用geosphere
软件包中的destPoint
功能来获取给定点的坐标,该点是给定方位和距地球表面原点的距离。通过执行runif(1)*360
可以很简单地获得随机方位。但是,如果希望点周围的密度均匀,则需要将均匀随机变量的平方根作为距离
因此,我们可以使用destPoint
重写您的函数,还可以利用矢量化,以便返回n
点的数据帧:
在圆2 0.002891265 53.99959中生成gps坐标
#> 3 0.0021632655 54.00045
#> 4 -0.0006538438 53.99894
#> 5 0.0014026358 54.00087
#> 6 0.0005882192 54.00172
我们可以看到结果是令人满意的,在很小的距离内产生了一个圆:
绘图(df$lon,df$lat)
但在更大的距离上有一个适当扭曲的圆:
df在一个正方形上创建一个均匀分布并排除距离你的起点大于r
的点会更容易吗?我认为这实际上是一个概率问题,而不是一个编程问题。困难在于球体上的圆与平面上的圆不同,例如,如果距离为地球周长的一半,则边界的长度为零;这只是球体另一侧的点。艾伦,这也行!你能举个例子吗?用户2554330可能是。我得到了一些关于这个解决方案的“拉伸”图。。ie点不是以“圆形”的形式分布的。请看以下帖子:CrossValidated。在一个正方形上创建一个均匀分布并排除距离你的起点大于r
的点会更容易吗?我认为这确实是一个概率问题,而不是一个编程问题。困难在于球体上的圆与平面上的圆不同,例如,如果距离为地球周长的一半,则边界的长度为零;这只是球体另一侧的点。艾伦,这也行!你能举个例子吗?用户2554330可能是。我得到了一些关于这个解决方案的“拉伸”图。。ie点不是以“圆形”的形式分布的。请看以下帖子:CrossValidated。这对最大距离<4e6
,效果很好,但此后地球的球形非常明显。对于更大的值,我会使用geosphere::RandomCoordinations(10*n)
,并拒绝geosphere::distGeo()
大于目标距离的任何点。非常感谢您这对max_distance_in_m<4e6
很有效,但此后地球的球形非常明显。对于更大的值,我将使用geosphere::randomcomations(10*n)
,并拒绝geosphere::distGeo()
大于目标距离的任何点。非常感谢