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 outside our office 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 that purpose.
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
{
"ifd0_subifd0_GPS": {
"Exif_GPSInfo_GPSLongitude": [105.00000000000000, 14.000000000000000, 10.588900000000001],
"Exif_GPSInfo_GPSAltitudeRef": 0,
"Exif_GPSInfo_GPSLatitude": [40.000000000000000, 1.0000000000000000, 13.553400000000000],
"Exif_GPSInfo_GPSAltitude": 0.00000000000000000,
"Exif_GPSInfo_GPSTimeStamp": [14.000000000000000, 53.000000000000000, 34.000000000000000],
"Exif_GPSInfo_GPSProcessingMethod": "ASCII",
"Exif_GPSInfo_GPSVersionID": [2, 2, 0, 0],
"Exif_GPSInfo_GPSDateStamp": "2015:04:06",
"Exif_GPSInfo_GPSLatitudeRef": "N",
"Exif_GPSInfo_GPSLongitudeRef": "W"
}
}
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 altitude.</description>'
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.
IDL> spawn, 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.