好的,所以我在某些坐标上有一个目标,在其他坐标上有一些“人”,我想检查一下人的坐标是否在离目标坐标2公里(2000米)的范围内。
下面的代码只是为了说明我想要更清楚的内容,问题当然是如何做到的?我非常感谢这个解决方案,谢谢!
$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!';
}
}
答案 0 :(得分: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 :(得分:3)
您可以使用Great Circle算法执行此操作。 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
答案 2 :(得分:0)
使用毕达哥拉斯依次找到目标与每个人之间的距离,并检查它是否小于2公里。如果x,y是目标和p的坐标,则q是两个人之间距离的坐标: ((x-p)^ 2 +(y-q)^ 2)^(1/2) ^符号的意思是“提升到”的力量。