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

标签 php mysql gps coordinates haversine

我正在尝试制作一个 PHP 脚本,当 GPS 设备(跟踪器)进入具有预定义位置的“地理围栏”时,该脚本可以执行某些操作。我找到的大部分帮助都使用半正弦公式,但大多数都试图从一个点获得最近的位置。我非常需要相反​​的东西。
设备和“围栏位置”坐标在 MySQL 数据库中,我能够成功提取它们。现在我需要设置围栏位置中心周围的半径,从该点开始的任何方向都应该是 10 米。
每当设备进入这个 10m 半径范围内时,PHP 就会做一些事情。
所以点 A(lat,lon) 周围有 10m 的半径,设备 B 正在将其纬度、经度发送到 SQL 数据库中,只要 A 点和 B 点之间的距离在 10m 以内,就会发生一些事情。 我从哪说起呢? haversine 在我的情况下有用吗? 我认为 PHP 可以计算 A 和 B 的距离差,只要该距离小于 10 米,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;
}

最佳答案

因此,将其全部放入一个完整的答案中:

使用类似于@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 - 在PHP中计算纬度/经度GPS点周围的半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33696685/

相关文章:

php - Symfony 5 - 需要信号量扩展(sysvsem)

php - 在变量中使用破折号 (-) 时出现 PDO 错误

javascript - 更新标记列表的位置

linux - GPSD 和 UDP 组播提要

blackberry - 直接从usb接口(interface)从黑莓(珍珠)获取gps数据

php - 从 Kohana 2.x 的 URL 中删除 index.php

php - 如何拆分一个空格分隔的文件?

mysql - add_index 迁移失败,返回 "Argument out of range"

mysql - 如何在MySQL中设计这个DB结构?

php - 在表中插入一行并增加后面的自动增量值