我的纬度,经度和半径为400m-1000m,形成一个spherical cap。我需要在该上限上找到一个随机点。这些点必须在该区域均匀分布。
还有一个有关找到random points in a circle的问题。我的第一个想法是将盖帽投影到笛卡尔平面上,并使用圆算法。半径足够小,不会出现重要的误差水平。
我不确定投影然后将点转换回lat / lng是最简单的解决方案,还是该问题有哪些其他可能的解决方案
答案 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
的值即可。因此,您可以从0
到theta
值中选择一个随机值(与上限有关),并通过解释的约束定义点。
答案 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;