11537 Rate this article:
No rating

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.