$exifData = exif_read_data('img/test4.jpg');Exifデータを保持している写真

Exifデータから抽出したプロパティの例
| プロパティ | 値 |
|---|---|
| 更新日 | 2015-08-09 19:05:05 |
| 緯度 | 26.675758333333 |
| 経度 | 127.88569611111 |
Exifデータから抽出した緯度経度をGoogle Mapに表示する
<?php
$exifData = exif_read_data('img/test4.jpg');
// Exifデータから日付を抽出する。
$date1 = extrDateTimeFromExif($exifData);
$data['date1'] = $date1;
// Exifデータから緯度経度を取得する
$latlon = extrLatLonFromExif($exifData);
$data['lat'] = $latlon['lat'];
$data['lon'] = $latlon['lon'];
// Exifデータから日付を抽出する。
function extrDateTimeFromExif($exifData,$format='Y-m-d H:i:s'){
$date1 = null;
$keys = array(
'DateTimeOriginal',
'DateTimeDigitized',
'DateTime',
);
foreach($keys as $k){
if(!empty($exifData[$k])){
$date1 = $exifData[$k];
break;
}
}
if($date1 != null){
$date1 = date($format, strtotime($date1));
}
return $date1;
}
function extrLatLonFromExif($exifData){
$keys = array(
'lat'=>'GPSLatitude',
'lon'=>'GPSLongitude',
);
$res = array();
foreach($keys as $a => $key){
$p=null;
if(!empty($exifData[$key])){
$p = $exifData[$key];
if(is_array($p)){
// 分数表記を浮動小数点式に変換する
foreach($p as $i=>$v){
$p[$i] = fracToFloat($v);
}
}
// 度分秒表記を10進数表記に変換
$p = latlon60to10($p);
}
$res[$a] = $p;
}
return $res;
}
/**
* 分数表記を浮動小数点式に変換する
* @param string $str 分数表記の文字列 (例: 314/100)
* @return number 浮動小数値
*/
function fracToFloat($str){
// 「/」が文字列中に存在しなかったり、空であったりするなら、引数を返して処理を抜ける
if(!preg_match("/¥//", $str) || empty($str)){
return $str;
}
// 「/」で分割して配列を作り、チェックと数値加工を施す。
$ary=explode("/",$str);
foreach($ary as $i => $v){
$v = floatval ($v);
if(is_numeric($v)){
$ary[$i] = $v;
}else{
return $str;
}
}
// 分母が0でないなら除算をする。
if($ary[1]==0){
return $str;
}
$v = $ary[0] / $ary[1];
return $v;
}
/**
* 緯度経度を度分秒表記(60進数)から10進数に変換
* @param string or array $p 60進数緯度経度
* - 例
* - 26,40,32.73
* - 26度40分32.73秒
* - 26°40’32.73”
* - 26,40'32.73"
* - N26,40'32.73"
* - array(26,40,32.73)
* @return 10進数緯度経度
*/
function latlon60to10($p){
$res = null;
if(is_array($p)){
$ary = $p;
}else{
if(!is_numeric(mb_substr($p ,0 ,1))){
$p = mb_substr($p ,1 );
}
$ary = preg_split("/,|度|分|秒|°|’|”|'|\"/",$p);
if(count($ary) < 3){
return null;
}
}
$res = $ary[0] + $ary[1]/60 + $ary[2]/3600;
return $res;
}
?>