求助:读取照片gps信息的精度问题

wojiaomtsa 2015-01-26 11:16:17
通过 Imageing.PropertyItems 读取照片GPS信息时,GPS经纬度的度分秒中,秒只能得到小数点后三位精度
但通过windows 属性查看照片GPS信息时,秒是精确到小数点后15位的
这个是怎么回事,VB.NET能实现精确到小数点后15位么

 Private Sub GetGPSTest()
Dim theImage As Image = New Bitmap("c:\test.jpg")
Dim propItems As PropertyItem() = theImage.PropertyItems '获取照片的PropertyItems
Dim propItem As PropertyItem
Dim value As Byte()
Dim d, m, s As Double
Dim Latitude As String
For Each propItem In propItems
If propItem.Id = &H2 Then '找到维度信息
value = propItem.Value '
d = BitConverter.ToUInt32(value, 0) / BitConverter.ToUInt32(value, 4) '读取度
m = BitConverter.ToUInt32(value, 8) / BitConverter.ToUInt32(value, 12) '读取分
s = BitConverter.ToUInt32(value, 16) / BitConverter.ToUInt32(value, 20) '读取秒
'结果为 31; 20; 20.706 其中秒只显示到小数点后三位
'但在windows中查看照片exif属性,能看到维度为31; 20; 20.706000000005673
'秒显示到小数点后15位,这个是怎么实现的
Latitude = String.Format("{0:#}; {1:#}; {2}", d, m, s)
End If
Next
End Sub
...全文
550 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-01-28
  • 打赏
  • 举报
回复
15位正好是一个Double类型的精度,猜测Windows图片查看器是把秒的整数和小数部分拆开存放的,Double有点误差不稀奇。
於黾 2015-01-27
  • 打赏
  • 举报
回复
类型换成decimal试试 double精度本身也才15位吧,加上小数点前2位,后面的不见了也可能是正常现象
zixingcheng_ 2015-01-27
  • 打赏
  • 举报
回复
看你代码和测试应该是这样取的, value  还有位数么?s 那个相除的地方你调试下,可能精度,手动变为double或计算器除下看看。
於黾 2015-01-27
  • 打赏
  • 举报
回复
Latitude = String.Format("{0:#}; {1:#}; {2}", d, m, s) 为什么是这样格式化字符串,你这个参数{2}相当于没有格式化,那不就跟s.ToString()的效果是一样的了 你先断点跟,确定到底是数值的问题还是转字符串的时候舍弃精度了
本拉灯 2015-01-27
  • 打赏
  • 举报
回复
s = BitConverter.ToUInt32(value, 16) / BitConverter.ToUInt32(value, 20) 你确定是这两个相除么?而不是 直接把这16-24的字节直接转换成double?
wojiaomtsa 2015-01-27
  • 打赏
  • 举报
回复
引用 9 楼 Z65443344 的回复:
[quote=引用 6 楼 wojiaomtsa 的回复:] 是数值的问题,数值计算出来就是小数点后三位的精度,不知道小数点后15位的精度是怎么计算出来的
也有可能是windows图片查看器本身使用的类型在二进制处理的时候就损失了精度,导致转10进制字符串的时候出现误差 就如8楼所说,精确到纳米级别根本毫无意义 能精确到小数点后3位已经足够了 GPS设备本身的误差可能就已经大于1米了[/quote]有可能,我也在想 是windows图片查看器二进制处理损失了精度,还是VB.NET采用imaging.propertyitems属性读取照片exif信息时二进制处理损失了精度
wojiaomtsa 2015-01-27
  • 打赏
  • 举报
回复
引用 4 楼 zixingcheng_ 的回复:
看你代码和测试应该是这样取的, value  还有位数么?s 那个相除的地方你调试下,可能精度,手动变为double或计算器除下看看。
是数值的问题,数值计算出来就是小数点后三位的精度,不知道小数点后15位的精度是怎么计算出来的 用计算器算也是20760/1000 因为读取propertyitems 得到的两个值就是20760 和1000 不知道 为什么照片属性中能显示到小数点后15位
wojiaomtsa 2015-01-27
  • 打赏
  • 举报
回复
引用 9 楼 Z65443344 的回复:
[quote=引用 6 楼 wojiaomtsa 的回复:] 是数值的问题,数值计算出来就是小数点后三位的精度,不知道小数点后15位的精度是怎么计算出来的
也有可能是windows图片查看器本身使用的类型在二进制处理的时候就损失了精度,导致转10进制字符串的时候出现误差 就如8楼所说,精确到纳米级别根本毫无意义 能精确到小数点后3位已经足够了 GPS设备本身的误差可能就已经大于1米了[/quote]我不是这个意思 我只是好奇为什么windows中查看照片属性GPS信息显示到小数点后15位,而我读取PropertyItems只能计算出小数点后三位,我只是想知道 这是什么歌情况
wojiaomtsa 2015-01-27
  • 打赏
  • 举报
回复
有木有大神知道为什么呀
求解答
於黾 2015-01-27
  • 打赏
  • 举报
回复
如果你使用差分式GPS机站,误差可以小于10cm 而如果用卫星定位,误差在1米也不奇怪
於黾 2015-01-27
  • 打赏
  • 举报
回复
引用 6 楼 wojiaomtsa 的回复:
是数值的问题,数值计算出来就是小数点后三位的精度,不知道小数点后15位的精度是怎么计算出来的
也有可能是windows图片查看器本身使用的类型在二进制处理的时候就损失了精度,导致转10进制字符串的时候出现误差 就如8楼所说,精确到纳米级别根本毫无意义 能精确到小数点后3位已经足够了 GPS设备本身的误差可能就已经大于1米了
Tiger_Zhao 2015-01-27
  • 打赏
  • 举报
回复
开玩笑!
就算按照1度110km算,1秒也只不过是30.5555555555556m,毫秒已经是cm级了,0.000000000005就是纳米级的精度,再低3位就毫纳米级。
你用的GPS精度真TMD强
wojiaomtsa 2015-01-27
  • 打赏
  • 举报
回复
是直接相除的
wojiaomtsa 2015-01-27
  • 打赏
  • 举报
回复
是数值的问题,数值计算出来就是小数点后三位的精度,不知道小数点后15位的精度是怎么计算出来的

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧