【Android】画像のExif情報から緯度・経度を取得する方法

先日ご紹介した、写真のExif情報から写真の向きを取得する方法に続き、今回は位置情報を取得する方法についてです。
なお今回も、「ExifInterface」というライブラリを使っています。

ちなみに、以前紹介した写真の向きの取得方法についてはこちらの記事から。

【Android】写真のExif情報から写真の向きを取得する方法
https://cpoint-lab.co.jp/article/201809/【android】写真のexif情報から写真の向きを取得する方法

 

早速ですが、コードはこちら。

// 写真から緯度経度を取得
File f = new File([画像のファイルパス]);
Uri uri = Uri.fromFile(f);
InputStream in = null;
try {
    in = getContentResolver().openInputStream(uri);
    ExifInterface exifInterface = null;
    if (in != null) {
        exifInterface = new ExifInterface(in);
        String latitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
        String longitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
        String latitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
        String longitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
        // 緯度経度の値を変換
        Double lat = ExifLatitudeToDegrees(latitudeRef, latitude);
        Double lng = ExifLongitudeToDegrees(longitudeRef, longitude);
    }
} catch (IOException e) {
    e.getStackTrace();
    Log.e("ExifActivity", e.getMessage());
}

取得できた緯度経度は、それぞれ lat変数、lng変数に代入されています。
が、この関数では、緯度経度が度分秒という60進数で表現されています。
そのため、場合によってはこの値を10進数に変換する必要があります。

変換はこちらの関数を使いました。
参考サイトのURLをメモしておくのを忘れてしまいました…。
第一引数に、北緯・南緯、もしくは東経・西経を指定し、第二引数に緯度もしくは経度の値を指定します。
上のコードでは、11行目と12行目でそれぞれ緯度経度を変換しています。

// 60進数を10進数に変換
private double ExifHourMinSecToDegrees(String exifhourminsec) {
    String hourminsec[] = exifhourminsec.split(",",0);
    String hour[] = hourminsec[0].split("/",0);
    String min[] = hourminsec[1].split("/",0);
    String sec[] = hourminsec[2].split("/",0);

    double dhour = (double)Integer.parseInt(hour[0]) / (double)Integer.parseInt(hour[1]);
    double dmin = (double)Integer.parseInt(min[0]) / (double)Integer.parseInt(min[1]);
    double dsec = (double)Integer.parseInt(sec[0]) / (double)Integer.parseInt(sec[1]);
    double degrees = dhour + dmin / 60.0 + dsec / 3600.0;

    return degrees;
}

// 緯度の変換
private double ExifLatitudeToDegrees(String ref, String latitude) {
    return ref.equals("S") ? -1.0 : 1.0 * ExifHourMinSecToDegrees(latitude);
}

// 経度の変換
private double ExifLongitudeToDegrees(String ref, String longitude) {
    return ref.equals("W") ? -1.0 : 1.0 * ExifHourMinSecToDegrees(longitude);
}

 

以上、写真から位置情報を取得する方法でした。
なお、当然ですがExifに位置情報が保存されていなければ取得できません。
その場合は、現在の位置情報を取得するなり、もしくは「位置情報を取得できませんでした」というメッセージを取得するなどの処理を追加するほうが良さそうですね。
このあたりはお好みで実装してください。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG