【问题标题】:Calculate the radius around a lat/lon GPS point in PHP在 PHP 中计算纬度/经度 GPS 点周围的半径
【发布时间】: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,然后做你想做的事情
  • 正确。我找到了这段代码,我会试试看。更新的问题。

标签: php mysql gps coordinates haversine


【解决方案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!");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多