为啥在 iOS 上 EXIF GPS 坐标会被截断?
Posted
技术标签:
【中文标题】为啥在 iOS 上 EXIF GPS 坐标会被截断?【英文标题】:Why are the EXIF GPS Coordinates being Truncated on iOS?为什么在 iOS 上 EXIF GPS 坐标会被截断? 【发布时间】:2012-11-02 02:06:16 【问题描述】:我在 JPG 的 EXIF 标头中添加 GPS 坐标,并将它们保存到相机胶卷中。而且由于一些奇怪的原因,当我之后使用第三方应用查看 JPG EXIF 信息时,十进制纬度/经度坐标已被截断,并且我的位置精度丢失了。
示例:
[GPSDictionary setObject:[NSNumber numberWithDouble:12.34567890]
forKey:(NSString*)kCGImagePropertyGPSLatitude];
结果:
"GPS" =
Latitude = "12.3456789";
;
但这就是 实际上在 JPG 文件的 EXIF 标头中结束的内容:
Latitude = "12.34566667";
其他时候情况更糟。
iPhone GPS: Longitude = 79.78598345
EXIF GPS: Longitude = 79.786
如何防止 ios 破坏我的坐标位?
因为这会影响以后计算的准确性。
【问题讨论】:
带有 8 位小数的纬度或经度将位置精确到 1 毫米(或大约 1/16 英寸)以内。您真的需要这种级别的精度吗(我不相信您的输入数据如此准确)。此外,这看起来像是浮点十进制数不能用浮点二进制精确表示的问题。在这个问题上还有其他关于 SO 的帖子。见:***.com/q/1089018/558933 我缩短了我的纬度值之一,以便更准确地了解在 NSLog 期间打印的内容。而且我希望将完全相同的值字符串保存在 EXIF 标头中。因为我会尽量精确。 【参考方案1】:最可能的解释是,罪魁祸首是您用来写入 Exif 信息的应用程序,而不是您后来用来读取 Exif 信息的应用程序。
Exif v2.3 标准 (http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf) 规定 GPS 纬度和经度存储为 3 个 RATIONAL 类型的值,一个代表度,一个代表分钟,一个代表秒。 RATIONAL 类型的值表示两个无符号 32 位整数的比率。因此,十进制的纬度或经度必须转换为度、分和秒,并且每一个都必须表示为一个比率,这意味着必须为它们选择一个特定的分母。使用的最小单位的分母决定了分辨率,由编写 Exif 标头的应用程序的设计者选择。
您提到的经纬度截断与选择以弧分的 1/100 为单位表示坐标的选择是一致的。您的纬度 12.3456789 度对应于 12 度和 20.740734 角分,四舍五入为 12 度和 2074/100 角分,对应于您得到的 12.3456666... 度。您的经度 79.78598345 度对应于 79 度和 47.159007 角分,四舍五入为 79 度和 4716/100 角分,对应于您得到的 79.786 度。
如果您需要更高的分辨率,那么您应该查看您一直用于编写 Exif 标头的应用程序是否可以配置为使用更高的分辨率,或者使用不同的应用程序来编写使用更高分辨率的 Exif 信息.例如,如果我使用 exiftool (http://owl.phy.queensu.ca/~phil/exiftool/) 将原始 GPS 经纬度写入图像的 Exif 标头,然后再次使用 exiftool 提取并打印坐标,则分别得到 12.3456789000111 和 79.7859834499989 度,其中相对于原始坐标的差异意味着分辨率比您使用的应用程序提供的分辨率高约一百万倍。
【讨论】:
000111 和 99989 后缀看起来更像是四舍五入的“错误”,而不是实际的准确性。您必须与这些数字中有意义的数字进行往返比较,以证明您关于“分辨率高一百万倍”的说法 你是对的,根据给定的数字,改进可能只有大约 1667 倍(0.01 角分和 1e-7 度之间的比率)。 如果使用 exiftool 我将经度设置为 12.345678912345 然后使用 exiftool 打印经度然后我得到 12.34567891230000036273,所以 exiftool 使用 1e-10 度的分辨率。与 OP 的结果相比的改进是 0.01 角分和 1e-10 度的比率,大约是 170 万倍。以上是关于为啥在 iOS 上 EXIF GPS 坐标会被截断?的主要内容,如果未能解决你的问题,请参考以下文章