先日ご紹介した、写真の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に位置情報が保存されていなければ取得できません。
その場合は、現在の位置情報を取得するなり、もしくは「位置情報を取得できませんでした」というメッセージを取得するなどの処理を追加するほうが良さそうですね。
このあたりはお好みで実装してください。