跳转至

Using EXIF Metadata to Show Photo Locations in Google Earth, via IDL

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/using-exif-metadata-to-show-photo-locations-in-google-earth-via-idl

19124 Rate this article:

No rating

Using EXIF Metadata to Show Photo Locations in Google Earth, via IDL

Jim Pendleton Thursday, April 9, 2015

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 = ''

IDL> l += ''

IDL> l += ''

IDL> l += 'Photo Location'

IDL> l += 'Attached to ground.  Could also use GPS altitude.'

IDL> l += ''

IDL> l += '' + StrJoin([Lon, Lat, 0], ',')  + ''

IDL> l += ''

IDL> l += ''

IDL> l += ''

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.

Applying Color Thresholds for Better Visualization Granularity Improving Visibility - Understanding LiDAR Viewsheds