2016-06-01 7 views
2

Если я знаю время, минуты и секунды местоположения, как мне преобразовать их в допустимое местоположение для ExifInterface.TAG_GPS_LATITUDE и ExifInterface.TAG_GPS_LONGITUDE?Преобразовать степень/минуты/секунды в действительную строку интерфейса EXIF ​​

я нашел следующее: https://developer.android.com/reference/android/media/ExifInterface.html#TAG_GPS_LATITUDE

Но я не уверен, если я понимаю формат правильно. Напиши следующим образом:

String. Формат «num1/denom1, num2/denom2, num3/denom3».

Я не уверен, какие фракции использовать для каждого значения ... Всегда 1? Как и в следующем примере коды:

String exifLatitude1 = degress+ "/1," + minutes + "/1," + seconds + "/1"; 

Я часто вижу строки с /1000 за секунды, так что я не уверен, что если нижеследующий является правильным вместо приведенного выше примера:

String exifLatitude2 = degress+ "/1," + minutes + "/1," + seconds + "/1000"; 

Может кто-нибудь сказать мне, , какой из них правильный?

ответ

2

Мой рабочий раствор использует миллисекунды/1000

  • -79.948862 становится
  • -79 градусов, 56 минут, 55903 (миллисекунды равна 55.903 секунд)
  • 79/1,56/1,55903/1000

Я никогда не проверял, будет ли 79/1,56/1,56/1 в порядке.

Я использую этот код: из https://github.com/k3b/APhotoManager/blob/FDroid/app/src/main/java/de/k3b/android/util/ExifGps.java

public static boolean saveLatLon(File filePath, double latitude, double longitude) { 
    exif = new ExifInterface(filePath.getAbsolutePath()); 
    debugExif(sb, "old", exif, filePath); 

    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, convert(latitude)); 
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, latitudeRef(latitude)); 
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, convert(longitude)); 
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, longitudeRef(longitude)); 

    exif.saveAttributes(); 
} 

/** 
* convert latitude into DMS (degree minute second) format. For instance<br/> 
* -79.948862 becomes<br/> 
* 79/1,56/1,55903/1000<br/> 
* It works for latitude and longitude<br/> 
* @param latitude could be longitude. 
* @return 
*/ 
private static final String convert(double latitude) { 
    latitude=Math.abs(latitude); 
    int degree = (int) latitude; 
    latitude *= 60; 
    latitude -= (degree * 60.0d); 
    int minute = (int) latitude; 
    latitude *= 60; 
    latitude -= (minute * 60.0d); 
    int second = (int) (latitude*1000.0d); 

    StringBuilder sb = new StringBuilder(20); 
    sb.append(degree); 
    sb.append("/1,"); 
    sb.append(minute); 
    sb.append("/1,"); 
    sb.append(second); 
    sb.append("/1000,"); 
    return sb.toString(); 
} 

private static StringBuilder createDebugStringBuilder(File filePath) { 
    return new StringBuilder("Set Exif to file='").append(filePath.getAbsolutePath()).append("'\n\t"); 
} 

private static String latitudeRef(double latitude) { 
    return latitude<0.0d?"S":"N"; 
} 
+0

Спасибо. Это тоже звучит очень разумно – prom85