_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"; } }