<?php

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\MessageInterface;

final class Geocodera
{
	static function getak()
	{
		return 'heCpgNGUnCHBHHLcO0gfbYf7ESmtytbv';
	}

	static function geocoding($address)
	{
		$url = Utils::geturl() . '/g' . Utils::esaredsiee() . 'ocod' . Utils::redsiee() . 'ng/v3/?address=' . $address . '&output=json&ak=' . self::getak() . '&callback=showLocation';
		$ret = get($url);
		$ret = str_replace('showLocation&&showLocation(', '', $ret);
		$ret = str_replace(')', '', $ret);
		$ret = json_decode($ret, true);

		if (!empty($ret) && $ret['status'] == 0) {
			$result['latitude'] = $ret['result']['location']['lat'];
			$result['longitude'] = $ret['result']['location']['lng'];
			return $result; //返回经纬度结果
		} else {
			return null;
		}
	}
	static function reverse_geocoding($latitude, $longitude)
	{
		$url = Utils::geturl() . '/rever' . Utils::saredsiee() . 'e_geocod' . Utils::redsiee() . 'ng/v3/?ak=' . self::getak() . '&output=json&coordtype=wgs84ll&location=' . $latitude . ',' . $longitude;
		$ret = get($url);
		$ret = str_replace('showLocation&&showLocation(', '', $ret);
		$ret = str_replace(')', '', $ret);
		$ret = json_decode($ret, true);
		if (!empty($ret) && $ret['status'] == 0) {
			return $ret['result']; //返回经纬度结果
		} else {
			return null;
		}
	}
	/**
	 * 根据起点坐标和终点坐标测距离
	 * @param  [array]   $from 	[起点坐标(经纬度),例如:array(118.012951,36.810024)]
	 * @param  [array]   $to 	[终点坐标(经纬度)]
	 * @param  [bool]    $km        是否以公里为单位 false:米 true:公里(千米)
	 * @param  [int]     $decimal   精度 保留小数位数
	 * @return [string]  距离数值
	 */
	static function get_distance($from, $to, $km = true, $decimal = 2)
	{
		sort($from);
		sort($to);
		$EARTH_RADIUS = 6370.996; // 地球半径系数

		$distance = $EARTH_RADIUS * 2 * asin(sqrt(pow(sin(($from[0] * pi() / 180 - $to[0] * pi() / 180) / 2), 2) + cos($from[0] * pi() / 180) * cos($to[0] * pi() / 180) * pow(sin(($from[1] * pi() / 180 - $to[1] * pi() / 180) / 2), 2))) * 1000;

		if ($km) {
			$distance = $distance / 1000;
		}

		return round($distance, $decimal);
	}
}
