在球形帽上找到均匀分布的随机点

时间:2019-01-19 10:38:31

标签: algorithm math geo

我的纬度,经度和半径为400m-1000m,形成一个spherical cap。我需要在该上限上找到一个随机点。这些点必须在该区域均匀分布。

还有一个有关找到random points in a circle的问题。我的第一个想法是将盖帽投影到笛卡尔平面上,并使用圆算法。半径足够小,不会出现重要的误差水平。

我不确定投影然后将点转换回lat / lng是最简单的解决方案,还是该问题有哪些其他可能的解决方案

3 个答案:

答案 0 :(得分:1)

您可以生成范围为0..360的随机方位角和具有sqrt分布的随机距离以提供unifrom分布

d = maxR * Sqrt(random(0..1))
theta = random(0..1) * 2 * Pi

然后按照here (Destination point given distance and bearing from start point)

的说明使用方位角和距离获取地理坐标。
φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )

where   φ is latitude, λ is longitude, θ is the bearing
(clockwise from north), δ is the angular distance d/R; 
d being the distance travelled, R the earth’s radius

答案 1 :(得分:0)

如Wiki页面theta + phi = 90中所述,如果phi是纬度。另一方面,由于上限上所有点的r是固定的,因此我们只需要设置theta的值即可。因此,您可以从0theta值中选择一个随机值(与上限有关),并通过解释的约束定义点。

答案 2 :(得分:0)

对于一个比球体半径小得多的光盘,除非您非常靠近极点,否则拉长投影将仅近似为椭圆形。

首先计算给定纬度下的伸展度:

double k = cos(latitude * PI / 180);

然后以纬度计算圆盘半径

// A latitude arc-second is 30.87 meters
double R = radius / 30.87 / 3600 * PI / 180;

然后计算一个圆上的均匀随机点

double a = random() * 2 * PI;
double r = R * sqrt(random());

您在光盘中的随机点将是

double random_lat = (latitude*PI/180 + r*cos(a))/PI*180;
double random_longitude = (longitude*PI/180 + (r/k)*sin(a))/PI*180;