如何将 GPS exif 转换为地理?

Posted

技术标签:

【中文标题】如何将 GPS exif 转换为地理?【英文标题】:How to convert GPS exif to geography? 【发布时间】:2018-04-24 07:49:02 【问题描述】:

我有附件表,其中每个附件都有 GPSLatitudeGPSLongitude 列。这是填充字段的遗留代码,其值如下所示:

GPSLatitude
50/1,5/1,1897/100

GPSLongitude
14/1,25/1,4221/100

我可以使用任何内置函数将它们转换为纬度和经度十进制值,如下所示:

Location Latitude   
41.5803 
Location Longitude
-83.9124

如果使用.net 也可以更轻松地完成此操作,我可以实现 SQL CLR 功能。

现在对我来说最困难的是理解这些值代表什么。遗留代码使用了一些 API,没有关于返回格式和如何阅读的文档。


以上值仅用于显示数据的格式。以下库用于获取值 - chestysoft 如下:

 IF Image.ExifValueByName("GPSLatitude") <> "" THEN GPSLatitude = Image.ExifValueByName("GPSLatitude") ELSE GPSLatitude = NULL END IF
 IF Image.ExifValueByName("GPSLongitude") <> "" THEN GPSLongitude = Image.ExifValueByName("GPSLongitude") ELSE GPSLongitude = NULL END IF

【问题讨论】:

这些旧值可能是“度、分和秒”格式的一些复杂变体吗? @Cool_Br33ze 我想是的。我正在搜索,它必须是 (1) degrees, (2) degrees and decimal minutes, or (3) degrees, minutes, and decimal seconds. - 我猜 , 正在分隔这些值。 50/1,5/1,1897/100 等于 41.5803 还是问题中的值只是为了显示格式? 如果您想将这些值转换为更常用的纬度/经度值,您有办法验证这些值吗? @MJH 只是格式化。我不知道这可以翻译成什么。 【参考方案1】:

我相当肯定你应该把它读成:

50/1: 50 Degrees
5/1: 5 Minutes
1897/100: 18.97 Seconds

这会将您提供的位置放在纽约(假设 N/W),这有意义吗?如果您无法验证输出,则很难提出任何其他建议...另请参阅here

在您提供的链接中,您可以上传图片以查看exif数据。在那里,您可以使用已知位置进行测试。很明显,在您提到的值中,GPSLatitudeRefGPSLongitudeRef 丢失了。您需要这些来将值更改为某个位置。你的表中有这些值吗?否则你将不得不做出(疯狂的)假设。

顺便说一下,standard EXIF 表示纬度/经度;我假设有很多很多工具可以转换它。

【讨论】:

这些是我在回答中使用的假设。 @MJH,不是真的。我的意思是,值中的/ 应该被理解为一个除法。所以你不应该除以60.0360000.0,而是分别除以1100 我将分钟除以 60 秒除以 3600 以将它们转换为度数,目的是将三个值相加以给出度数的答案。 @MJH,啊,是的,我仍在考虑分钟/秒而不是度数。我认为您仍然需要将秒数除以 100(并且将分钟数除以 1(在其他值中除以可能有不同的值))。 这是 OP 需要注意的事情。 :)【参考方案2】:

假设@Cool_Br33ze 是正确的,并且数据以度、分和秒为单位,您可以使用以下公式计算您需要的值:

declare @v varchar(30) = '50/1,5/1,1897/100'

select  @v Original_Value,
        convert(decimal(18,4), left(@v, charindex('/', @v) - 1)) [Degrees],
        convert(decimal(18,4), substring(
                                            @v, 
                                            charindex(',', @v) + 1, 
                                            charindex('/', @v, charindex(',', @v)) - (charindex(',', @v) + 1)
                                        ) / 60.0
        ) [Minutes],
        convert(decimal(18,4), substring(
                                            @v, 
                                            charindex(',', @v, (charindex(',', @v) + 1)) + 1, 
                                            charindex('/', @v, charindex(',', @v, (charindex(',', @v) + 1))) - (charindex(',', @v, (charindex(',', @v) + 1)) + 1)
                                        ) / 360000.0
        ) [Seconds]

它看起来有点乱,但它拆分了度数、分钟数和秒数(转换为DECIMAL(18,4)),您只需将这三个值相加即可得到以度数为单位的纬度/经度值。

不过,我会在实施之前对其进行彻底测试。

【讨论】:

以上是关于如何将 GPS exif 转换为地理?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 如何在 2015 年将地址转换为 GPS 坐标(地理编码)?

无法将 gps 位置写入 exif

如何将像素位置转换为 GPS 点?

Java获取照片的Exif信息,并解析GPS

如何把地理位置的经纬度坐标转换为unity3d的系统坐标

web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)