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

时间:2014-05-13 09:54:44

标签: ruby geolocation

在Ruby中,如果我有一个特定的纬度和经度,我如何在给定半径或另一个点附近生成一个相对随机的点样本?

{ latitude: 37.7905576, longitude: -122.3989885 }

1 个答案:

答案 0 :(得分:2)

<强>理论

赤道地球的周长= 40,076公里。赤道被划分为360度经度,因此赤道处的每个度数大约为111.32 km。从赤道向极点移动,这个距离在极点处减小到零。

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

因此,仅从坐标添加或减去随机距离将不会产生“圆”。为了避免这种情况,我们可以使用Haversine,Spherical Law of Cosines或Equirectangular投影生成一系列点并消除半径以外的点。

由于后者仅使用常见的三角函数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>";  
}