【问题标题】:How do I convert Exif long/lat to real values?如何将 Exif long/lat 转换为实际值?
【发布时间】:2011-03-11 05:52:38
【问题描述】:

我正在尝试从我的一些图片中获取 Exif 数据,这些是我收到的纬度和经度值。谁能帮我看看这些数字是什么意思?

DEBUG/lat = 30/1,12/1,34/1 (7588) : 纬度

DEBUG/long = 81/1,22/1,41/1 (7588) : 经度

提前致谢。

【问题讨论】:

    标签: java android geolocation latitude-longitude exif


    【解决方案1】:

    我打算为此写一个转换器,但结果是答案is already in this blog

    以防万一链接失效:

    public class geoDegree {
    private boolean valid = false;
    Double Latitude, Longitude; 
    geoDegree(ExifInterface exif) {
     String attrLATITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
     String attrLATITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
     String attrLONGITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
     String attrLONGITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
    
     if((attrLATITUDE !=null)
       && (attrLATITUDE_REF !=null)
       && (attrLONGITUDE != null)
       && (attrLONGITUDE_REF !=null))
     {
      valid = true;
    
      if(attrLATITUDE_REF.equals("N")){
       Latitude = convertToDegree(attrLATITUDE);
      }
      else{
       Latitude = 0 - convertToDegree(attrLATITUDE);
      }
    
      if(attrLONGITUDE_REF.equals("E")){
       Longitude = convertToDegree(attrLONGITUDE);
      }
      else{
       Longitude = 0 - convertToDegree(attrLONGITUDE);
      }
    
     }
    };
    
    private Float convertToDegree(String stringDMS){
     Float result = null;
     String[] DMS = stringDMS.split(",", 3);
    
     String[] stringD = DMS[0].split("/", 2);
        Double D0 = new Double(stringD[0]);
        Double D1 = new Double(stringD[1]);
        Double FloatD = D0/D1;
    
     String[] stringM = DMS[1].split("/", 2);
     Double M0 = new Double(stringM[0]);
     Double M1 = new Double(stringM[1]);
     Double FloatM = M0/M1;
    
     String[] stringS = DMS[2].split("/", 2);
     Double S0 = new Double(stringS[0]);
     Double S1 = new Double(stringS[1]);
     Double FloatS = S0/S1;
    
        result = new Float(FloatD + (FloatM/60) + (FloatS/3600));
    
     return result;
    
    
    };
    
    public boolean isValid()
    {
     return valid;
    }
    
    @Override
    public String toString() {
     // TODO Auto-generated method stub
     return (String.valueOf(Latitude)
       + ", "
       + String.valueOf(Longitude));
    }
    
    public int getLatitudeE6(){
     return (int)(Latitude*1000000);
    }
    
    public int getLongitudeE6(){
     return (int)(Longitude*1000000);
    }
    
    }
    

    【讨论】:

    • 我已经尝试过了,它可以转换,但结果似乎总是在我预期的西南 50 英尺处。有没有其他人发现这个?
    • @Craig - 原始代码使用 float(单精度)表示纬度和经度不够准确 - float 仅适用于大约 7 位数的精度。我修改为double
    • 是的,你应该把它改成双倍,加上 getLongitudeE6 也是错误的(如果我错了,请纠正我),如果你返回双倍而不是浮点数,你不应该将它乘以 1000000跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多