GPS coordinate from jpeg file metadata

16 Ansichten (letzte 30 Tage)
Matteo Breda
Matteo Breda am 18 Mai 2015
Kommentiert: Adam Danz am 23 Mär. 2024
I'm working on a geo location progect and I need to plot some gps coordinate obtained from Jpeg pictures taken with a smartphone. Using info = imfinfo(filename) I get the information from the jpeg file but they are only ''visual'' information, so i would like to know if there's function to utilize the info i obtain from imfinfo to write a gps variable. To be clear:
imglatitude=0
info=imfinfo('file.jpg')
info =
scalar structure containing the fields:
Filename = C:\Users\...\file.jpg
FileModDate = 28-Apr-2015 17:20:16
FileSize = 3129532
Format = JPEG
GPSInfo =
scalar structure containing the fields:
GPSLatitudeRef = N
GPSLongitudeRef = E
GPSAltitude = 44
GPSLatitude =
xx.xxx
xx.xxx
xx.xxx
GPSLongitude =
xx.xxx
xx.xxx
xx.xxx
imglatitude=*GPSLatitude obtanined from imfinfo*
I've got no clue about how to get this gps info out from the imfinfo function! Thanks in advance for your help

Akzeptierte Antwort

Amy Haskins
Amy Haskins am 18 Mai 2015
The data returned from imfinfo is a structure and the fields can be accessed individually. If you have access to the Mapping Toolbox then with a little bit of effort you can use the wmmarker function display your image on a map.
Example: Use a sample image from the Image Processing Toolbox which contains geographic data.
handsInfo = imfinfo('hands1.jpg');
Display the GPS information
handsInfo.GPSInfo
ans =
GPSLatitudeRef: 'N'
GPSLatitude: [42 17 57.0600]
GPSLongitudeRef: 'W'
GPSLongitude: [71 21 5.8200]
GPSAltitudeRef: 0
GPSAltitude: 69.7069
GPSTimeStamp: [16 48 35]
GPSImgDirectionRef: 'T'
GPSImgDirection: 291.9459
GPSDateStamp: '2014:03:11'
Note that the latitude and longitude are given in Degrees, Minutes, and Seconds (DMS). We will need to convert them to decimal degrees.
lat = dms2degrees(handsInfo.GPSInfo.GPSLatitude);
lon = dms2degrees(handsInfo.GPSInfo.GPSLongitude);
The GPSLatitudeRef and GPSLongitudeRef fields determine if the lat and lon should be positive or negative.
if strcmp(handsInfo.GPSInfo.GPSLatitudeRef,'S')
lat = -1 * lat;
end
if strcmp(handsInfo.GPSInfo.GPSLongitudeRef,'W')
lon = -1 * lon;
end
Display the photo on a webmap to put it in context. This particualar image is small, but for a larger image you might want to use imresize to create a smaller thumbnail.
wmmarker(lat, lon, 'OverlayName', 'Hands1', 'Description', ...
'Photo taken at The Mathworks, Inc', 'Icon', 'hands1.jpg')
  4 Kommentare
Jesus Garcia
Jesus Garcia am 30 Okt. 2017
Just put [] to group the 3 vectors and it will work:
lat = dms2degrees([handsInfo.GPSInfo.GPSLatitude]);
lon = dms2degrees([handsInfo.GPSInfo.GPSLongitude])
Adrian
Adam Danz
Adam Danz am 23 Mär. 2024
Thanks for this great demo @Amy Haskins!
I found that some of my image files contained GPS data that had a value of 60 in seconds or minutes which causes an error in dms2degrees where minutes and seconds must be <60.
To get around this, I wrapped dms2degrees in a helper function that corrected the coordinates containing 60. I'll share it here in case someone else (or my future self) needs it.
lat = dms2degreesCorrection(handsInfo.GPSInfo.GPSLatitude);
lon = dms2degreesCorrection(handsInfo.GPSInfo.GPSLongitude);
function dg = dms2degreesCorrection(dms)
% Some image files can have values of 60 for seconds and minutes but this
% errors in MATLAB's dms2degrees. It's corrected here. dms is a 1x3
% vector. dg is a scalar.
if dms(3) >= 60
dms(2) = dms(2) + floor(dms(3)/60);
dms(3) = mod(dms(3),60);
end
if dms(2) >= 60
dms(1) = dms(1) + floor(dms(2)/60);
dms(2) = mod(dms(2),60);
end
dg = dms2degrees(dms);
end

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Tags

Noch keine Tags eingegeben.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by