1. 程式人生 > >php解析獲取圖片經緯度定位資訊,拍攝時間,寬高(使用高德地圖介面)

php解析獲取圖片經緯度定位資訊,拍攝時間,寬高(使用高德地圖介面)

<?php
 function img_info(){
    /* 
    * 要獲取圖片的定位資訊前提,圖片本身攜帶了定位相關資訊;
    * 先解析計算出圖片的經緯度,然後根據經緯度使用高德地圖提供逆向地理編碼介面獲取定位資訊;
    * 需在高德申請key
    * 高德介面地址:http://lbs.amap.com/api/webservice/guide/api/georegeo
    */
    $img_url = "http://img.com/img_5807.jpg";
    $key = "7a18e3176c41f88";
    $imgHelper = new ImgHelper();
    $info = $imgHelper->get_img_info($img_url,$key);
    echo json_encode($info);exit;
}
/**
 * 輸出結果
    {img_time: "1970-01-01 08:00:00",
    latitude: 23.120341666667,
    longitude: 113.32146388889,
    address: "廣東省廣州市天河區冼村街道高德置地廣場寫字樓A座(高德置地廣場·春)通用電氣大廈",
    province: "廣東省",
    city: "廣州市",
    district: "天河區",
    township: "冼村街道",
    senic_spot: "通用電氣大廈",
    height: 3024,
    width: 4032
    }
 */

/**
 * $img_url圖片地址
 * $gaode_key高德地圖key
 * 返回值:圖片定位資訊,拍攝時間,寬高
 * 先解析出圖片的經緯度,然後根據經緯度使用高德地圖提供逆向地理編碼介面獲取定位資訊;
 * 需在高德申請key
 * 高德介面地址:http://lbs.amap.com/api/webservice/guide/api/georegeo
 */
class ImgHelper{
    public  function get_img_info($img_url,$gaode_key){
        $exif = exif_read_data($img_url, 0, true);
        if ($exif === false) {
            return false;
        } else {
            $latitude = $exif['GPS']['GPSLatitude'];   //緯度
            $longitude = $exif['GPS']['GPSLongitude']; //經度
            $GPSLatitudeRef = $exif['GPS']['GPSLatitudeRef']; //南半球 S 北半球 N
            $GPSLongitudeRef = $exif['GPS']['GPSLongitudeRef']; //東半球 S 西半球 N
            //計算經緯度資訊
            $latitude = self::get_gps($latitude, $GPSLatitudeRef);
            $longitude = self::get_gps($longitude, $GPSLongitudeRef);

            /**使用高德地圖提供逆向地理編碼介面獲取定位資訊;
             * 需在高德申請key
             * 高德介面地址:http://lbs.amap.com/api/webservice/guide/api/georegeo
             */

            $url = "http://restapi.amap.com/v3/geocode/regeo?key=$gaode_key&location=$longitude,$latitude&poitype=&radius=10000&extensions=all&batch=false&roadlevel=0";
            $res = file_get_contents($url);
            $res = json_decode($res, true);

            if ($res['status'] == 1) {
                $address = $res['regeocode']['formatted_address'];
                $province = $res['regeocode']['addressComponent']['province'];
                $district = $res['regeocode']['addressComponent']['district'];
                $township = $res['regeocode']['addressComponent']['township'];
                $city = $res['regeocode']['addressComponent']['city'];
                $senic_spot = $res['regeocode']['aois'][0]['name'];
            }

            //圖片拍攝時間
            $time = date("Y-m-d H:i:s", $exif['FILE']['FileDateTime']);

            //圖片寬高
            $imgsize = getimagesize($img_url);
            $width = $imgsize[0];
            $height = $imgsize[1];
            $data = array(
                'img_time' => $time,//圖片拍攝時間
                'latitude' => $latitude,//緯度
                'longitude' => $longitude,//經度
                'address' => $address,//詳細地址
                'province' => $province,//省份
                'city' => $city,//城市
                'district' => $district,//區
                'township' => $township,//街道
                'senic_spot'=>$senic_spot,//景點名稱
                'height'=>$height,
                'width'=>$width
            );

            return $data;
        }
    }


    //計算經緯度
    public function get_gps($exifCoord,$banqiu)
    {
        $degrees= count($exifCoord) > 0 ? self::gps2Num($exifCoord[0]) : 0;
        $minutes= count($exifCoord) > 1 ? self::gps2Num($exifCoord[1]) : 0;
        $seconds= count($exifCoord) > 2 ? self::gps2Num($exifCoord[2]) : 0;
        $minutes+= 60 * ($degrees- floor($degrees));
        $degrees= floor($degrees);
        $seconds+= 60 * ($minutes- floor($minutes));
        $minutes= floor($minutes);
        if($seconds>= 60)
        {
            $minutes+= floor($seconds/60.0);
            $seconds-= 60*floor($seconds/60.0);
        }
        if($minutes>= 60)
        {
            $degrees+= floor($minutes/60.0);
            $minutes-= 60*floor($minutes/60.0);
        }
        $lng_lat = $degrees + $minutes/60 + $seconds/60/60;
        if(strtoupper($banqiu) == 'W' || strtoupper($banqiu) == 'S'){
            //如果是南半球 或者 西半球 乘以-1
            $lng_lat = $lng_lat * -1;
        }
        return $lng_lat;
        //return array('degrees'=> $degrees, 'minutes'=> $minutes, 'seconds'=> $seconds);
    }

    /*
    取得EXIF的內容
    分數 轉 小數
    */
    public  function gps2Num($coordPart)
    {
        $parts= explode('/', $coordPart);
        if(count($parts) <= 0)
            return 0;
        if(count($parts) == 1)
            return $parts[0];
        return floatval($parts[0]) / floatval($parts[1]);
    }
}
?>