在Ruby中,如果我有一个特定的纬度和经度,我如何在给定半径或另一个点附近生成一个相对随机的点样本?
{ latitude: 37.7905576, longitude: -122.3989885 }
答案 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>";
}