如何在另一个点的半径内生成随机纬度和经度?

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>";  
   

【讨论】:

大卫,我非常喜欢这种方法,很好的答案,这对我很有帮助。

以上是关于如何在另一个点的半径内生成随机纬度和经度?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算半径内的最大和最小纬度和经度值?

地理围栏算法

给定 GPS 的地理位置,如何在给定的 x 米半径内找到纬度和经度

在区域(国家/城市)内生成随机经纬度值

使用经度和纬度选择半径内的对象[重复]

在地图上围绕纬度/经度绘制时间半径