我想从文件夹中的一组图像文件中提取 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
您收到的错误是“未找到名称”。当您尝试访问不存在的属性时,您会得到它。并非所有图像都存储了 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
当然,由你来将经度和纬度转换为数字。