现在的位置: 首页 > 综合 > 正文

Android-ExifInterface如何正确存取Double类型坐标

2013年10月21日 ⁄ 综合 ⁄ 共 1550字 ⁄ 字号 评论关闭

1、向图片中存储一些属性,可以使用ExifInterface,属性有很多,查看源码就能知道;


通过测试,发现不能存储除了该类定义外的其他属性信息。通过setAttribute(String tag,String value);然后需要saveAttributes()。

2、目前想存储Double类型坐标,但是通过getAttribute(String tag)取出来的内容形如:112/1,39/1,288172/3278,其实就是“度分秒”拆分后,分母除以1的结果。所以,存储的时候尝试存储这种格式,最后得到了正确结果。但是秒那一块的分子分母是怎么搞的,一直没弄明白。后来索性把得到的秒直接也除以1得了。

3、需要一个转换工具把Double类型转换为112/1,39/1,288172/3278字符串;

 

Java代码  收藏代码
  1. /** 
  2.      * 将小数度数转换为度分秒格式 
  3.      * @param numStr (主要用于图片中存储经纬度) 
  4.      * @return 
  5.      */  
  6.     public static String convertToSexagesimal(String numStr){  
  7.         double num = Double.parseDouble(numStr);  
  8.         int du=(int)Math.floor(Math.abs(num));    //获取整数部分  
  9.         double temp=getdPoint(Math.abs(num))*60;  
  10.         int fen=(int)Math.floor(temp); //获取整数部分  
  11.         double miao=getdPoint(temp)*60;  
  12.         if(num<0)  
  13.         return "-"+du+"/1,"+fen+"/1,"+miao+"/1";  
  14.       
  15.         return du+"/1,"+fen+"/1,"+miao+"/1";  
  16.   
  17.     }  
  18.     //获取小数部分  
  19.     private static double getdPoint(double num){  
  20.         double d = num;  
  21.         int fInt = (int) d;  
  22.         BigDecimal b1 = new BigDecimal(Double.toString(d));  
  23.         BigDecimal b2 = new BigDecimal(Integer.toString(fInt));  
  24.         double dPoint = b1.subtract(b2).floatValue();  
  25.         return dPoint;  
  26.     }  

 

4、获取Double类型字符串;不过ExifInterface提供的方法是获取float类型的

查看源码,发现有个private static float convertRationalLatLonToFloat(String rationalString, String ref),把112/1,39/1,288172/3278转换成float类型数值。


最后通过public boolean getLatLong(float output[]) 这个类获取经纬度数值,


存入float数组中,然后取出使用。需要注意的是TAG_GPS_LATITUDE_REF和TAG_GPS_LONGITUDE_REF必须有值他们的值为N(north),S(south),W(west),E(east)。

抱歉!评论已关闭.