Android-ExifInterface如何正确存取Double类型坐标
2016-05-01 08:40
453 查看
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代码
/**
* 将小数度数转换为度分秒格式
* @param numStr (主要用于图片中存储经纬度)
* @return
*/
public static String convertToSexagesimal(String numStr){
double num = Double.parseDouble(numStr);
int du=(int)Math.floor(Math.abs(num)); //获取整数部分
double temp=getdPoint(Math.abs(num))*60;
int fen=(int)Math.floor(temp); //获取整数部分
double miao=getdPoint(temp)*60;
if(num<0)
return "-"+du+"/1,"+fen+"/1,"+miao+"/1";
return du+"/1,"+fen+"/1,"+miao+"/1";
}
//获取小数部分
private static double getdPoint(double num){
double d = num;
int fInt = (int) d;
BigDecimal b1 = new BigDecimal(Double.toString(d));
BigDecimal b2 = new BigDecimal(Integer.toString(fInt));
double dPoint = b1.subtract(b2).floatValue();
return dPoint;
}
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)。
通过测试,发现不能存储除了该类定义外的其他属性信息。通过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代码
/**
* 将小数度数转换为度分秒格式
* @param numStr (主要用于图片中存储经纬度)
* @return
*/
public static String convertToSexagesimal(String numStr){
double num = Double.parseDouble(numStr);
int du=(int)Math.floor(Math.abs(num)); //获取整数部分
double temp=getdPoint(Math.abs(num))*60;
int fen=(int)Math.floor(temp); //获取整数部分
double miao=getdPoint(temp)*60;
if(num<0)
return "-"+du+"/1,"+fen+"/1,"+miao+"/1";
return du+"/1,"+fen+"/1,"+miao+"/1";
}
//获取小数部分
private static double getdPoint(double num){
double d = num;
int fInt = (int) d;
BigDecimal b1 = new BigDecimal(Double.toString(d));
BigDecimal b2 = new BigDecimal(Integer.toString(fInt));
double dPoint = b1.subtract(b2).floatValue();
return dPoint;
}
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)。
相关文章推荐
- 20145326实验四 Android开发基础
- android文本框焦点简谈
- Synchronizing threads in Android/Java
- Android Studio 常用快捷键详解
- Android Design Support Library BottomSheetBehavior使用
- Android之sharepreference的使用
- Android触屏事件处理流程的最简整理及应用示例
- ViewPager一屏显示多个子页面
- 写一个Android日历控件
- 20145122《Android开发基础》实验四实验报告
- Android Studio Rest Client工具详解
- android源码解析(十八)-->Activity布局绘制流程
- Android自定义View(一)实现文字验证码
- 作业——在线学习Android课程之第九周(进程与服务)
- 监听应用的启动
- 编译可在Nexus5上运行的CyanogenMod13.0(基于Android6.0)ROM
- Android之内部存储读取数据
- android第一行代码-3.activity之间的调用跟数据传递
- Android学习之界面篇(六)ViewPager学习与Android引导界面的实现
- 去除Android活动中的标题和信息栏