JpegのExifから緯度経度を取得する


Jpegファイルのパスを引数として指定すると、Exifデータから緯度経度を取得します。

classにするほどでもないし、毎回探すのも面倒なので、ここに公開しておきます。

function exif2geo( $jpeg ){
  if( !is_file($jpeg) ){
    return false;
  }

  if( $exif = exif_read_data( $jpeg ) ) {
    if( isset($exif['GPSLatitudeRef'])
        && isset($exif['GPSLatitude'])
          && isset($exif['GPSLongitudeRef'])
            && isset($exif['GPSLongitude']) ){
      $lat_r = ($exif['GPSLatitudeRef'] == 'N') ? 1: -1;
      $lat_1 = intval($exif['GPSLatitude'][0]);
      $lat_2 = intval($exif['GPSLatitude'][1])/60;
      $lat_3 = intval($exif['GPSLatitude'][2])/360000;
      $lat = $lat_r * ($lat_1+$lat_2+$lat_3);
      $lng_r = ($exif['GPSLongitudeRef'] == 'E') ? 1: -1;
      $lng_1 = intval($exif['GPSLongitude'][0]);
      $lng_2 = intval($exif['GPSLongitude'][1])/60;
      $lng_3 = intval($exif['GPSLongitude'][2])/360000;
      $lng = $lng_r * ($lng_1+$lng_2+$lng_3);
      return array( $lat, $lng );
    }
  }
  return false;
}

2 thoughts on “JpegのExifから緯度経度を取得する

  1. こんにちは。
    大変参考になりました。ありがとうございます。

    一つだけ補足ですが、Exifの緯度経度は”39/1″のような分数(?)ですが、この分母は固定ではないようです。
    なので、$exif['GPSLatitude'][2]や$exif['GPSLongitude'][2]を360000(60×60×100)で割っていますが、分母が100でない場合に結果が違ってしまいます。
    分子と分母に分けて、計算してあげる必要があるようです。

    $exif['GPSLatitude'][0]や$exif['GPSLatitude'][1]については、自分の手元にある写真は全て分母が1ですが、同様に分子と分母に分けて計算してあげた方が無難なのかもしれません。

    以上、ご参考まで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>