在 PHP 中计算纬度/经度 GPS 点周围的半径

Posted

技术标签:

【中文标题】在 PHP 中计算纬度/经度 GPS 点周围的半径【英文标题】:Calculate the radius around a lat/lon GPS point in PHP 【发布时间】:2015-11-13 15:52:58 【问题描述】:

我正在尝试制作一个 php 脚本,该脚本可以在 GPS 设备(跟踪器)进入具有预定义位置的“地理围栏”时执行某些操作。我发现的大多数帮助都使用了半正弦公式,但大多数帮助都试图从一个点获取最近的位置。我几乎需要相反的。 设备和“围栏位置”坐标位于 mysql 数据库中,我能够成功提取它们。现在我需要设置围栏位置中心周围的半径,从该点开始在任何方向上都应该是 10 米。 每当设备进入这 10m 半径内时,PHP 都会做一些事情。 所以 A(lat,lon) 点周围有 10m 的半径,设备 B 将其 lat,lon 发送到 SQL 数据库中,只要 A 点和 B 点彼此在 10m 范围内,就会发生一些事情。 我从哪里开始?在我的情况下,haversine 有用吗? 我认为 PHP 可以计算 A 和 B 的距离差,只要该距离低于 10m,PHP 就会有所作为。

我认为这可以完成这项工作。

function haversineGreatCircleDistance(
  $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)

  // convert from degrees to radians
  $latFrom = deg2rad($latitudeFrom);
  $lonFrom = deg2rad($longitudeFrom);
  $latTo = deg2rad($latitudeTo);
  $lonTo = deg2rad($longitudeTo);

  $latDelta = $latTo - $latFrom;
  $lonDelta = $lonTo - $lonFrom;

  $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
    cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  return $angle * $earthRadius;

【问题讨论】:

php 在服务器上运行。它究竟是如何知道这个 gps 设备在哪里以及它在做什么? A 和 B 坐标都存储在 SQL 数据库中。 A 始终是同一个坐标(它不移动),B 每隔 X 秒移动一次并将其位置更新到数据库中,因此最新的数据库条目是 B 的最新位置。我已经完成了所有这些工作。跨度> 所以当 php 更新数据库时,它会选择计算 A&B 之间的距离,例如if (dist($A, $B) < 10) do_something(); 所以你有一个中心坐标和设备坐标,使用this func计算距离并检查它是否小于10,然后做你想做的事情 正确。我找到了这段代码,我会试试看。更新的问题。 【参考方案1】:

所以,把它放在一个完整的答案中:

使用类似于@Gudz Daniel 链接的函数来计算到任何给定点的实际距离:https://www.geodatasource.com/developers/php。这会在该点周围绘制一个有效的“地理围栏”圆圈,因为您可以从任何入射角度测量您的距离。

function distance($lat1, $lon1, $lat2, $lon2, $unit) 

  $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 
    return $miles;
  

然后,您只需与您希望设备标记下一个进程的距离进行比较,正如@Mark B 指出的那样:

$distance = distance($lat1, $lon1, $lat2, $lon2, "M");

if ($distance <= 1) 
    // Now you know your truck/device is
    // within 1 mile of the center-point.

    send_alert("You've arrived!");

【讨论】:

以上是关于在 PHP 中计算纬度/经度 GPS 点周围的半径的主要内容,如果未能解决你的问题,请参考以下文章

从给定点和半径计算纬度和经度

给定 GPS 的地理位置,如何在给定的 x 米半径内找到纬度和经度

求助,GPS定位仪数据,求两点之间的距离,多少米?有经度、纬度数据。

使用java程序查找具有指定半径的给定纬度和经度(即位置)的周围纬度和纬度值

如何找到给定纬度/长度以北x km的纬度/经度?

python:使用纬度和经度查找提供位置半径内的位置的优雅方法