检查纬度和经度是否在PHP中的圆圈内

原始问题 Check if a latitude and longitude is within a circle

我想知道如何使用 PHP 来实现这一点。我有一组纬度和经度,并想将它们与另一个纬度/经度数组进行测试,以给出真/假场景

enter image description here

stack overflow Check if a latitude and longitude is within a circle in PHP
原文答案

接受的答案

我已经为您准备了示例代码片段。这对我来说效果很好。随意适应你自己的逻辑。

$lat1 = "10.5900627";
$lon1 = "77.1933317";

$lat2 = "10.6068507";
$lon2 = "77.117246";

function distance($lat1, $lon1, $lat2, $lon2, $unit) 
{
  if (($lat1 == $lat2) && ($lon1 == $lon2)) {
    return 0;
  }
  else {
    $theta = $lon1 - $lon2;
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    $unit = strtoupper($unit);

    if ($unit == "K") {
      return ($miles * 1.609344);
    } else if ($unit == "N") {
      return ($miles * 0.8684);
    } else {
      return $miles;
    }
  }
}

if(distance($lat1, $lon1, $lat2, $lon2, "K") < 10)
{
  echo "True";
}
else
{
  echo "False";
}

如果 'K' 的结果小于 10Km,那么您将得到结果为“True”。否则 'False' 将作为结果返回。


答案:

作者头像

我会这样做,首先我需要计算两点之间的距离(这是一种接近谷歌地图的方法: https://stackoverflow.com/a/53069194/7071905 ):

function computeDistance($lat1, $lng1, $lat2, $lng2, $radius)
{
    static $x = M_PI / 180;
    $lat1 *= $x; $lng1 *= $x;
    $lat2 *= $x; $lng2 *= $x;
    $distance = 2 * asin(sqrt(pow(sin(($lat1 - $lat2) / 2), 2) + cos($lat1) * cos($lat2) * pow(sin(($lng1 - $lng2) / 2), 2)));

    return $distance * $radius;
}

然后,当距离低于 10 公里 ($KM) 时,我需要一个带有基点(中心)的简单函数来返回 true:

function isWithinCircle($lat, $lng, $KM = 10): bool
{
    $baseLat = 0;
    $baseLng = 0;
    $radius  = 6378137;

    return computeDistance($baseLat, $baseLng, $lat, $lng, $radius) <= $KM;
}