天天看點

php 百度地圖根據經緯度擷取位址,使用百度地圖api根據經緯度擷取位置

由于做微信公衆平台的時候需要根據經緯度擷取位址,是以才有這個,本來沒什麼好寫的,可是由于沒做過php解析json對象,是以還是吃了點小虧,寫下來記錄一下

百度地圖位址解析

在該例子中需要通過經緯度擷取位址

api連結 http://api.map.baidu.com/geocoder/v2/?ak=百度應用&location=經度,緯度&output=json&pois=0;

不需要回調函數

通過該位址傳回的json資料如下

{

status: 0,

result: {

location: {

lng: 112.99999999488,

lat: 35.999999889577

},

formatted_address: “山西省長治市長治縣東師線”,

business: “”,

addressComponent: {

city: “長治市”,

country: “中國”,

direction: “”,

distance: “”,

district: “長治縣”,

province: “山西省”,

street: “東師線”,

street_number: “”,

country_code: 0

},

poiRegions: [ ],

sematic_description: “”,

cityCode: 356

}

}

php解析json對象

我看了阮一峰的一篇文章 http://www.ruanyifeng.com/blog/2011/01/json_in_php.html

由于傳回的是json文本,是以首先要将json文本轉換為php資料結構,利用json_decode($json),

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));

經過上述轉換,即可得到如下php對象

object(stdClass)#1 (5) {

["a"] => int(1)

["b"] => int(2)

["c"] => int(3)

["d"] => int(4)

["e"] => int(5)

}

是以擷取其中對象的時候,可利用如下方式

$json->{'a'}

附上實作代碼function getKm($lat1, $lng1, $lat2, $lng2)

{

if($lat1 == 0 && $lng1 == 0){

if($lat2 == 0 && $lng2 == 0){

return "0";

}else {

$url = "http://api.map.baidu.com/geocoder/v2/?ak=gGboNqlNjflXCNq0A6ewpSLB&location=" . $lat2 . "," . $lng2 . "&output=json&pois=0";

$json = file_get_contents($url);

$json = json_decode($json);

return $json->{'result'}->{'addressComponent'}->{'city'};

}

}else {

$dis = getKmnum($lat1,$lng1,$lat2,$lng2);

return $dis.'km';

}

}

同時附上經緯度計算距離的代碼function getKmnum($lat1, $lng1, $lat2, $lng2)

{

$earthRadius = 6367000; //approximate radius of earth in meters

$lat1 = ($lat1 * pi()) / 180;

$lng1 = ($lng1 * pi()) / 180;

$lat2 = ($lat2 * pi()) / 180;

$lng2 = ($lng2 * pi()) / 180;

$calcLongitude = $lng2 - $lng1;

$calcLatitude = $lat2 - $lat1;

$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);

$stepTwo = 2 * asin(min(1, sqrt($stepOne)));

$calculatedDistance = $earthRadius * $stepTwo;

$dis = ceil(round($calculatedDistance) / 1000);

return $dis;

}