从图像文件中提取 GPS 数据:错误消息:运行时错误 '-2145320854 (8021006a)

问题描述 投票:0回答:1

我想从文件夹中的一组图像文件中提取 GPS 数据,并将数据粘贴到 Excel 表格中的行集合中。

我使用网上找到的帖子制作了此代码。

Sub ExtractPhotoData()

'Declare variables
Dim FSO As Object
Dim SourceFolder As Object
Dim FileItem As Object
Dim Image As Object
Dim RowCounter As Integer

RowCounter = 1

'Set up the file system object and source folder
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(Worksheets("Sheet2").Cells(2, 9).Value)

'Loop through each file in the source folder
For Each FileItem In SourceFolder.Files

    'Load the image
    Set Image = CreateObject("WIA.ImageFile")
    Image.LoadFile FileItem.Path
        
    'Extract the longitude, latitude, and altitude data
    Dim Longitude As Long
    Dim Latitude As Long
    Dim Altitude As Long
    Longitude = Image.Properties("GPS Longitude").Value
    Latitude = Image.Properties("GPS Latitude").Value
    Altitude = Image.Properties("GPS Altitude").Value
        
    'Paste the data into the worksheet
    RowCounter = RowCounter + 1
    Cells(RowCounter, 1).Value = FileItem.Name
    Cells(RowCounter, 2).Value = Longitude
    Cells(RowCounter, 3).Value = Latitude
    Cells(RowCounter, 4).Value = Altitude

Next FileItem

End Sub

代码在将属性值分配给变量时崩溃

Longitude = Image.Properties("GPS Longitude").Value
excel vba file properties geolocation
1个回答
2
投票

您收到的错误是“未找到名称”。当您尝试访问不存在的属性时,您会得到它。并非所有图像都存储了 GPS 信息,因此您应该做好准备。

此外,据我所知,GPS 属性名称不包含空格,您需要小心大小写。应该是

Image.Properties("GpsLongitude")
看这里

您可以使用

获取图像所有属性的列表
Dim p
For Each p In Image.Properties
    Debug.Print FileItem.Name, p.Name
Next

下一个问题是经度和纬度的属性不返回简单值。我检查了一个图像文件并获取了

IVector
类型的对象作为值,其中包含 3 个定义度、分和秒的单个值,并且您还需要属性“GpsLongitudeRef”来获取 N/S 和 E/W。

对于海拔高度,您可以将该值读取为

Long
,但是还有更多:该属性还包含例如单位(“m”),并且“GpsAltitudeRef”定义参考(“海平面”)。

我最终得到了一些示例代码

On Error Resume Next
Dim longitude As String
longitude = getLongLat(Image.Properties("GpsLongitude").Value, Image.Properties("GpsLongitudeRef").Value)
Dim latitude As String
latitude = getLongLat(Image.Properties("GpsLatitude").Value, Image.Properties("GpsLatitudeRef").Value)

Dim altitude As Long
altitude = Image.Properties("GpsAltitude").Value
On Error Resume Next

Debug.Print FileItem.Name, longitude, latitude, altitude

和辅助函数

Function getLongLat(vector As Object, ref As String)
    On Error Resume Next
    getLongLat = vector(1) & ":" & vector(2) & ":" & vector(3) & " " & ref
End Function

当然,由你来将经度和纬度转换为数字。

© www.soinside.com 2019 - 2024. All rights reserved.