如何在另一个点的半径内生成随机纬度和经度?
Posted
技术标签:
【中文标题】如何在另一个点的半径内生成随机纬度和经度?【英文标题】:How do I generate a random latitude and longitude within the radius of another point? 【发布时间】:2014-05-13 09:54:44 【问题描述】:在 Ruby 中,如果我有特定的纬度和经度,如何在给定半径内或另一个点附近生成相对随机的点样本?
latitude: 37.7905576, longitude: -122.3989885
【问题讨论】:
我不了解 Ruby,但假设您只需要获取 0 和半径之间的随机航向和随机距离。然后有一个函数来计算与原始纬度/经度值的相对位置。 查看Movable Type Scripts 页面。如果我没有错,那么您的解决方案是给定距离和距起点的方位角的目标点。正如@Dr.Jukka 所说:您必须产生随机角度/航向和随机距离。 【参考方案1】:理论
赤道处的地球周长 = 40,076 公里。赤道被划分为 360 度经度,因此赤道处的每一度代表大约 111.32 公里。从赤道向极点移动,这个距离在极点处减小到零。
1 degree aproximates to 111.32 km at equator.
96.41km at 30 degrees N/S
78.71 km at 45 degrees N/S
55.66 km at 60 degrees N/S
28.82 km at 75 degrees N/S
因此,仅从坐标中添加或减去随机距离不会产生“圆”。为了避免这种情况,我们可以生成一系列点并通过使用半正弦、余弦球定律或等角投影来消除半径之外的点。
由于后者仅使用常见的三角函数 cos() 我将用它来说明。使用 php,因为我没有 Ruby
应用程序
function Equirectangular($lat1,$lng1,$lat2,$lng2)
$x = deg2rad($lng2-$lng1) * cos(deg2rad($lat1+$lat2)/2);
$y = deg2rad($lat1-$lat2);
$R = 6372.8; // gives d in km
$distance = sqrt($x*$x + $y*$y) * $R;
return $distance;
$centerLat = 37.7905576;
$centerLng = -122.3989885;
for ($i = 0; $i <= 200; $i++)
$lat = rand(0,40000)/2;//Random between 0 & 2 =radius +- 2 degrees 222.62 km
$lng = rand(0,40000)/2;
$lat2 = $centerLat+ ($lat/10000);
$lng2 = $centerLng+ ($lng/10000);
echo $lat2." ".$lng2."";
if (Equirectangular($centerLat,$centerLng,$lat2,$lng2)< 200)//200 km
echo " In";
else
echo " Out";
echo "<br>";
【讨论】:
大卫,我非常喜欢这种方法,很好的答案,这对我很有帮助。以上是关于如何在另一个点的半径内生成随机纬度和经度?的主要内容,如果未能解决你的问题,请参考以下文章