Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 围绕半径内的某个地理点(横向、纵向)生成均匀分布的地理点_R_Gis_R Raster - Fatal编程技术网

R 围绕半径内的某个地理点(横向、纵向)生成均匀分布的地理点

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

在给定距离的起点周围,是否有更好的方法生成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 / 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()
大于目标距离的任何点。非常感谢