使用百度地图api根据经纬度获取位置

由于做微信公众平台的时候需要根据经纬度获取地址,所以才有这个,本来没什么好写的,可是由于没做过php解析json对象,所以还是吃了点小亏,写下来记录一下

百度地图地址解析

直接给出链接 http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-geocoding

在该例子中需要通过经纬度获取地址
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;
}