PHP 取得EXIF中GPS的經緯度

2011-02-12

在php4.2之後有一個函數可以取得EXIF的內容

exif_read_data()
只可以用在JPG跟TIFF的圖片
餵其他類型的會絡賽

首先當然就是先取得EXIF的內容
第一個欄位是檔案 第二個欄位是要取哪些項目(可以去文件看)的資訊
第三個是將各項目的值以array返回

$exif = exif_read_data('my.jpg', 0, true);
//緯度
$latitude = $exif['GPS']['GPSLatitude'];
//經度
$longitude = $exif['GPS']['GPSLongitude'];

都是各有三個元素的array 各代表度,分,秒
但是他們都長得怪怪的 會是分數的形式
所以需要再將他們解析
找到一篇解法
PHP extract GPS EXIF data
把兩個值丟進去就可以了

//Pass in GPS.GPSLatitude or GPS.GPSLongitude or something in that format
function getGps($exifCoord)
{
  $degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
  $minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
  $seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;

  //normalize
  $minutes += 60 * ($degrees - floor($degrees));
  $degrees = floor($degrees);

  $seconds += 60 * ($minutes - floor($minutes));
  $minutes = floor($minutes);

  //extra normalization, probably not necessary unless you get weird data
  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);
  }

  return array('degrees' => $degrees, 'minutes' => $minutes, 'seconds' => $seconds);
}

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]);
}

也就是這樣

$latitude = getGps($latitude);
$longitude = getGps($longitude);
/*
output:
緯度
度:$latitude['degrees']
分:$latitude['minutes']
秒:$latitude['seconds']
經度
度:$longitude['degrees']
分:$longitude['minutes']
秒:$longitude['seconds']
*/

就可以再做之後的應用啦
可以用google map確認一下對不對
http://maps.google.com.tw/?q=25 2 52.8,121 33 58.2

===update===
發現還要判斷南北半球 東西半球

//這會出現S或是N 也就是南北半球
$exif['GPS']['GPSLatitudeRef'];
//如果是S的話 緯度還要乘-1喔

//這會出現W或是E 也就是東西半球
$exif['GPS']['GPSLongitudeRef'];
//如果是W的話 經度還要乘-1喔

Posted by on 2011 年 02 月 12 日 in php, , ,