| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- <?php
- namespace common\helpers;
- class LocationHelper
- {
- public $_geo_conf;
- public function __construct()
- {
- $this->_geo_conf = array(
- 'pi' => pi(),
- 'EARTH_RADIUS' => 6378.137,
- );
- }
- /**
- * 求两个地理位置之间的距离
- *
- * @param $longitude_a
- * @param $latitude_a
- * @param $longitude_b
- * @param $latitude_b
- * @return bool|float|int
- */
- public function getDistanceByGeo($latitude_a, $longitude_a, $latitude_b, $longitude_b)
- {
- if (!$latitude_a || !$longitude_a || !$latitude_b || !$longitude_b){
- return false;
- }
- $latitude_a_radian = $this->angleToRadian($latitude_a);
- $latitude_b_radian = $this->angleToRadian($latitude_b);
- $longitude_a_radian = $this->angleToRadian($longitude_a);
- $longitude_b_radian = $this->angleToRadian($longitude_b);
- $latitude_radian_diff = $latitude_a_radian - $latitude_b_radian;
- $longitude_radian_diff = $longitude_a_radian - $longitude_b_radian;
- 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'];
-
- }
- /**
- * 角度转弧度
- * @param $angle
- * @return float
- */
- private function angleToRadian($angle)
- {
- return $angle * $this->_geo_conf['pi'] / 180.0;
- }
- /**
- * 格式化距离
- * @param $distance
- * @return string
- */
- public static function formatDistance($distance)
- {
- $distance = bcmul($distance, 1000, 1);
- if ($distance < 1000) return "{$distance}m";
- return bcmul($distance, 0.001, 2) . "km";
- }
- }
|