如何将 GPS exif 转换为地理信息?
How to convert GPS exif to geography?
我有附件 table,每个附件都有 GPSLatitude
和 GPSLongitude
列。它是填充字段的遗留代码,值如下所示:
GPSLatitude
50/1,5/1,1897/100
GPSLongitude
14/1,25/1,4221/100
是否有任何内置函数可用于将它们转换为纬度和经度十进制值,如下所示:
Location Latitude
41.5803
Location Longitude
-83.9124
我可以实现 SQL CLR 功能,如果这也可以通过 .net
更轻松地完成。
现在对我来说最困难的是理解这些值代表什么。遗留代码使用了一些 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是正确的,并且数据以度、分、秒为单位,您可以使用以下方法计算您需要的值:
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)
),你需要做的就是把三个值加在一起得到你的Lat/Long 以度为单位的值。
虽然我会在实施之前对其进行彻底测试。
我相当确定您应该将其解读为:
50/1: 50 Degrees
5/1: 5 Minutes
1897/100: 18.97 Seconds
这会将您提供的位置放在纽约(假设 N/W),这有意义吗?如果您无法验证输出,则很难提出任何其他建议...另请参阅 here
在您提供的link中,您可以上传图片查看exif数据。在那里您可以使用已知位置进行测试。同样明显的是,在您提到的值中,缺少 GPSLatitudeRef
和 GPSLongitudeRef
。您需要这些来将值更改为某个位置。您的 table 中有这些值吗?否则你将不得不做出(疯狂的)假设。
顺便说一句,这是 latitude/longitude 的 standard EXIF 表示法;我假设有很多很多工具可以转换它。
我有附件 table,每个附件都有 GPSLatitude
和 GPSLongitude
列。它是填充字段的遗留代码,值如下所示:
GPSLatitude
50/1,5/1,1897/100
GPSLongitude
14/1,25/1,4221/100
是否有任何内置函数可用于将它们转换为纬度和经度十进制值,如下所示:
Location Latitude
41.5803
Location Longitude
-83.9124
我可以实现 SQL CLR 功能,如果这也可以通过 .net
更轻松地完成。
现在对我来说最困难的是理解这些值代表什么。遗留代码使用了一些 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是正确的,并且数据以度、分、秒为单位,您可以使用以下方法计算您需要的值:
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)
),你需要做的就是把三个值加在一起得到你的Lat/Long 以度为单位的值。
虽然我会在实施之前对其进行彻底测试。
我相当确定您应该将其解读为:
50/1: 50 Degrees
5/1: 5 Minutes
1897/100: 18.97 Seconds
这会将您提供的位置放在纽约(假设 N/W),这有意义吗?如果您无法验证输出,则很难提出任何其他建议...另请参阅 here
在您提供的link中,您可以上传图片查看exif数据。在那里您可以使用已知位置进行测试。同样明显的是,在您提到的值中,缺少 GPSLatitudeRef
和 GPSLongitudeRef
。您需要这些来将值更改为某个位置。您的 table 中有这些值吗?否则你将不得不做出(疯狂的)假设。
顺便说一句,这是 latitude/longitude 的 standard EXIF 表示法;我假设有很多很多工具可以转换它。