Using EXIF Metadata to Show Photo Locations in Google Earth, via IDL
Have you ever needed an IDL API for
retrieving a geographic location at which a digital camera photo was taken, one
stored in a standard format such as a TIFF or JPEG?
On a lovely spring morning, I shot
this photo of a flowering tree in full bloom near the Exelis building in
Boulder, Colorado. When I grow older and daft-er, how will I remember where the
photo was taken, plus or minus GPS accuracy?
IDL 8.4.1 includes a new READ_EXIF function for
The input is the path to the image
file, and the output is a HASH
containing much useful metadata.
If GPS tagging was enabled on the
device on which the photo was acquired, its contents will be stored in the inelegantly-named
but standard key "ifd0_subifd0_GPS".
IDL> r = read_exif(dialog_pickfile())
IDL> if r.haskey('ifd0_subifd0_GPS') then GPSInfo = r['ifd0_subifd0_GPS']
IDL> print, GPSInfo, /implied
[105.00000000000000, 14.000000000000000, 10.588900000000001],
[14.000000000000000, 53.000000000000000, 34.000000000000000],
"Exif_GPSInfo_GPSVersionID": [2, 2, 0, 0],
The tag names are long and cumbersome, but they
use a standard prefix.
IDL> pre = 'Exif_GPSInfo_GPS'
Let's show the location in Google
Earth. First extract the longitude and latitude in decimal degrees.
IDL> Lon =Total(Float(GPSInfo[pre+'Longitude'])/[1.,60.,3600.])
IDL> Lon *= GPSInfo[pre+'LongitudeRef'].Compare('W') eq 0 ? -1 : 1
IDL> Lat =Total(Float(GPSInfo[pre+'Latitude'])/[1.,60.,3600.])
IDL> Lat *= GPSInfo[pre+'LatitudeRef'].Compare('N') eq 0 ? 1 : -1
Next, create some KML containing
the placemarker location.
IDL> l = '<?xml version="1.0" encoding="UTF-8"?>'
IDL> l += '<kml xmlns="http://www.opengis.net/kml/2.2">'
IDL> l += '<Placemark>'
IDL> l += '<name>Photo Location</name>'
IDL> l += '<description>Attached to ground. Could also use GPS
IDL> l += '<Point>'
IDL> l += '<coordinates>' + StrJoin([Lon, Lat, 0], ',') + '</coordinates>'
IDL> l += '</Point>'
IDL> l += '</Placemark>'
IDL> l += '</kml>'
Write the KML to a temporary file.
IDL> tempfile = filepath('test.kml', /tmp)
IDL> openw, lun, tempfile, /get_lun & printf, lun, l & free_lun, lun
If ".kml" is registered as a known extension on your computer,
you should be able to simply SPAWN
the path to the file.
tempfile, /hide, /nowait
Be aware that GPS tagging of photos is generally disabled by default on most mobile devices these days to support a greater level of privacy. To toggle GPS tagging on, one generally needs to locate a "Settings" or "Options" menu associated with the camera application on a particular device.