php解析獲取圖片經緯度定位資訊,拍攝時間,寬高(使用高德地圖介面)
阿新 • • 發佈:2019-02-13
<?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]); } } ?>