LocationHelper.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. namespace common\helpers;
  3. class LocationHelper
  4. {
  5. public $_geo_conf;
  6. public function __construct()
  7. {
  8. $this->_geo_conf = array(
  9. 'pi' => pi(),
  10. 'EARTH_RADIUS' => 6378.137,
  11. );
  12. }
  13. /**
  14. * 求两个地理位置之间的距离
  15. *
  16. * @param $longitude_a
  17. * @param $latitude_a
  18. * @param $longitude_b
  19. * @param $latitude_b
  20. * @return bool|float|int
  21. */
  22. public function getDistanceByGeo($latitude_a, $longitude_a, $latitude_b, $longitude_b)
  23. {
  24. if (!$latitude_a || !$longitude_a || !$latitude_b || !$longitude_b){
  25. return false;
  26. }
  27. $latitude_a_radian = $this->angleToRadian($latitude_a);
  28. $latitude_b_radian = $this->angleToRadian($latitude_b);
  29. $longitude_a_radian = $this->angleToRadian($longitude_a);
  30. $longitude_b_radian = $this->angleToRadian($longitude_b);
  31. $latitude_radian_diff = $latitude_a_radian - $latitude_b_radian;
  32. $longitude_radian_diff = $longitude_a_radian - $longitude_b_radian;
  33. return 2 * asin(sqrt(pow(sin($latitude_radian_diff / 2), 2) + cos($latitude_a_radian) * cos($latitude_b_radian) * pow(sin($longitude_radian_diff / 2), 2))) * $this->_geo_conf['EARTH_RADIUS'];
  34. }
  35. /**
  36. * 角度转弧度
  37. * @param $angle
  38. * @return float
  39. */
  40. private function angleToRadian($angle)
  41. {
  42. return $angle * $this->_geo_conf['pi'] / 180.0;
  43. }
  44. /**
  45. * 格式化距离
  46. * @param $distance
  47. * @return string
  48. */
  49. public static function formatDistance($distance)
  50. {
  51. $distance = bcmul($distance, 1000, 1);
  52. if ($distance < 1000) return "{$distance}m";
  53. return bcmul($distance, 0.001, 2) . "km";
  54. }
  55. }