2012-12-30 58 views
1

好的,所以我在某个坐标上有一个目标,在另一个坐标上有一些“人物”,我想检查这些人的坐标是否在2km(2000m)距目标坐标的距离。检查坐标是否在距其他坐标的特定距离内

下面的代码只是为了说明我想要更清楚些什么,而问题当然是如何做到的?我真的很感谢这个解决方案,谢谢!

$person0 = Array('56.34342', '49.324523'); 
$person1 = Array('57.49544', '47.421524'); 
$person2 = Array('56.74612', '48.722323'); 

$target = Array('56.35343', '49.342343'); 

for (var $i = 0; $i < 4; i$++) { 
    CheckIfMatch($person + i$); 
} 

function CheckIfMatch($person) { 
    if($person is within 2km from target) { 
     echo 'Match!'; 
    } 
} 
+6

谷歌 “半正矢” 或 “Vincenty” –

+0

你试过[欧几里得](http://en.wikipedia.org/wiki/Euclidean_distance)距离? –

回答

2

你可以使用大圆算法来做到这一点。 http://en.wikipedia.org/wiki/Great-circle_distance

以下是如何找到距离。

编辑

这里是为你做了完整的代码!

<?php 
$persons = Array(); 

$persons[] = Array('52.00951','4.36052');//Delft is more than 2 km from den haag 
$persons[] = Array('52.03194','4.31769');//Rijswijk is less than 2 km from den haag 
$persons[] = Array('52.07097','4.29945');//A place near den Haag almost 2 streets from center and my favourite coffee shop 
$persons[] = Array('52.37022','4.89517');//Amsterdamn is about 60 km *DRIVING* from the hagues according to Gmaps 

$target = Array('52.07050', '4.30070');//Den Haag 
$i = 0; 
foreach($persons as $person){ 
    $i++; 
    $distance = calculate_distance($person, $target); 
    if($distance <= 2){ 
     echo "Person $i is within 2km with a distance to taget of $distance</br>"; 
    }else{ 
     echo "Person $i is <b>not</b> within 2km with a distance to taget of $distance</br>"; 
    } 

} 

function calculate_distance($person, $target){ 

    $lat1 = $person[0]; 
    $lng1 = $person[1]; 
    $lat2 = $target[0]; 
    $lng2 = $target[1]; 
    $pi = 3.14159; 
    $rad = doubleval($pi/180.0); 

    $lon1 = doubleval($lng1)*$rad; 
    $lat1 = doubleval($lat1)*$rad; 
    $lon2 = doubleval($lng2)*$rad; 
    $lat2 = doubleval($lat2)*$rad; 
    $theta = $lng2 - $lng1; 

    $dist = acos(sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($theta)); 

    if ($dist < 0) 
     $dist += $pi; 


    $miles = doubleval($dist * 69.1); 
    $inches = doubleval($miles * 63360); 
    $km = doubleval($dist * 115.1666667); 

    $dist = sprintf("%.2f",$dist); 
    $miles = sprintf("%.2f",$miles); 
    $inches = sprintf("%.2f",$inches); 
    $km = sprintf("%.2f",$km); 
    //Here you can return whatever you please 
    return $km; 
} 

?> 

过程和结果:

Person 1 is not within 2km with a distance to taget of 4.24 
Person 2 is within 2km with a distance to taget of 1.21 
Person 3 is within 2km with a distance to taget of 0.09 
Person 4 is not within 2km with a distance to taget of 41.56 
+0

非常感谢您的回答!我不明白这个因素,你能解释一下吗? – holyredbeard

+0

如果您正在使用里程,则将替换系数替换为69.1,如果是公里,则替换为115.1666667。这只是为了转换易用性 –

+0

啊,当然。谢谢。将尝试一下。 – holyredbeard

0

使用毕达哥拉斯发现反过来目标和每个人之间的距离,并检查它是否是不到2公里。如果x,y是目标的坐标,并且p,q其中一个人的坐标是两者之间的距离: ((xp)^ 2 +(yq)^ 2)^(1/2) ^符号的意思是“提高到”的力量。

+1

如果它们是飞机中的点,那么它就可以工作,但如果它们是地理坐标(球体上的点),则需要使用Haversine函数。 –

3

我有这个功能,它计算点1和2之间的差异。该函数返回里程,所以我乘以1.609344将其转换为km。

<?php 
function lat_long_dist($lat1, $long1, $lat2, $long2){ 
    $pi = pi(); 
    $x = sin($lat1 * $pi/180) * 
      sin($lat2 * $pi/180) + 
      cos($lat1 * $pi/180) * 
      cos($lat2 * $pi/180) * 
      cos(($long2 * $pi/180) - ($long1 * $pi/180)); 
    $x = atan((sqrt(1 - pow($x, 2)))/$x); 
    return (1.852 * 60.0 * (($x/$pi) * 180))/1.609344; 
} 

$people = array(); 
$people[] = array(56.34342, 49.324523); 
$people[] = array(57.49544, 47.421524); 
$people[] = array(56.74612, 48.722323); 

foreach($people as $person){ 
    $lat1 = $person[0]; 
    $lon1 = $person[1]; 
    $distance = lat_long_dist($lat1, $lon1, 56.35343, 49.342343) * 1.609344; 
    if($distance <= 2){ 
     echo "$i is within 2km!\n"; 
    } 
} 
+1

非常感谢您分享您的代码!将立即尝试。 – holyredbeard