PHP 百度地图地址返回经纬度或经纬度返回地址 并测2点之间的距离

首先引用文件Geocoding.class.php 内容如下:

[php] /** * 根据地理坐标获取国家、省份、城市,及周边数据类(利用百度Geocoding API实现)
* 百度密钥获取方法:lbsyun.baidu.com/apiconsole/key?application=key(需要先注册百度开发者账号)
* Date: 2015-11-18
* Author: sunyanan
* Ver: 1.0 *
* Func:
* Public getAddressComponent 根据地址获取国家、省份、城市及周边数据 * Private toCurl 使用curl调用百度Geocoding API
*/
class Geocoding {
// 百度Geocoding API
const API = ‘http://api.map.baidu.com/geocoder/v2/’;
// 不显示周边数据
const NO_POIS = 0;
// 显示周边数据
const POIS = 1;
/** * 根据地址获取国家、省份、城市及周边数据
* @param String $ak 百度ak(密钥)
* @param Decimal $longitude 经度
* @param Decimal $latitude 纬度
* @param Int $pois 是否显示周边数据
* @return Array
*/
public static function getAddressComponent($ak, $longitude, $latitude, $pois=self::NO_POIS){
$param = array( ‘ak’ => $ak, ‘location’ => implode(‘,’, array($latitude, $longitude)), ‘pois’ => $pois, ‘output’ => ‘json’ );
// 请求百度api
$response = self::toCurl(self::API, $param);
$result = array();
if($response){
$result = json_decode($response, true);
}
return $result;
}
public static function getCoordinate($ak, $address){
$param = array( ‘ak’ => $ak, ‘address’ => $address, ‘callback’ => ‘showLocation’, ‘output’ => ‘json’ );
// 请求百度api
$response = self::toCurl(self::API, $param);
$result = array();
if($response){
$result = json_decode($response, true);
}
return $result;
}
/**
* 使用curl调用百度Geocoding API
* @param String $url 请求的地址
* @param Array $param 请求的参数
* @return JSON
*/
private static function toCurl($url, $param=array()){
$ch = curl_init();
if(substr($url,0,5)==’https’){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
// 从证书中检查SSL加密算法是否存在
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));
$response = curl_exec($ch);
if($error=curl_error($ch)){
return false;
}
curl_close($ch);
return $response;
}
}
?> [/php]

根据地址获取经纬或根据经纬度获取地址代码如下:

[php]

require "Geocoding.class.php";

$ak = ‘您的AK’;
$longitude = 113.327782;
$latitude = 23.137202;
$address = "香港";

//$result = Geocoding::getAddressComponent($ak, $longitude, $latitude, Geocoding::NO_POIS);//根據經緯度獲取地址
$result = Geocoding::getCoordinate($ak, $address);//根據地址獲取經緯度

print_r($result);

echo $result["result"]["location"]["lng"].",".$result["result"]["location"]["lat"];
[/php]

根据物理两点计算距离

[php]

/**
* 计算两点地理坐标之间的距离
* @param Decimal $longitude1 起点经度
* @param Decimal $latitude1 起点纬度
* @param Decimal $longitude2 终点经度
* @param Decimal $latitude2 终点纬度
* @param Int $unit 单位 1:米 2:公里
* @param Int $decimal 精度 保留小数位数
* @return Decimal
*/
function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=2){

$EARTH_RADIUS = 6370.996; // 地球半径系数
$PI = 3.1415926;

$radLat1 = $latitude1 * $PI / 180.0;
$radLat2 = $latitude2 * $PI / 180.0;

$radLng1 = $longitude1 * $PI / 180.0;
$radLng2 = $longitude2 * $PI /180.0;

$a = $radLat1 – $radLat2;
$b = $radLng1 – $radLng2;

$distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
$distance = $distance * $EARTH_RADIUS * 1000;

if($unit==2){
$distance = $distance / 1000;
}

return round($distance, $decimal);

}

// 起点坐标
$longitude1 = 113.330405;
$latitude1 = 23.147255;

// 终点坐标
$longitude2 = 113.314271;
$latitude2 = 23.1323;

$distance = getDistance($longitude1, $latitude1, $longitude2, $latitude2, 1);
echo $distance.’m’; // 2342.38m

$distance = getDistance($longitude1, $latitude1, $longitude2, $latitude2, 2);
echo $distance.’km’; // 2.34km
[/php]

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注