Manipulating stored geocoordinates in cellphone photos

exiftool to the Rescue

Although there is a go-exif2 library for Go which reads Exif tags, there is no easy-to-use library that writes new tags or refreshes the existing tags in a JPEG file. This is why Listing 1 resorts to the Unix utility exiftool. On Ubuntu, this jack-of-all-trades can be set up via the package manager (Listing 5, first line). The tool expects coordinates in a floating-point format and either creates or refreshes the corresponding Exif tags in a JPEG image file (second line).

Listing 5

Editing Exif Tags

01 $ sudo apt-get install exiftool
02 $ exiftool -gpslatitude=37.<xx> -gpslongitude=-122.<yy> file.jpg

The patch() function from line 42 of Listing 1 calls the tool from Go via the os/exec interface. It takes the name of a program including parameters. To collect the output of the command-line utility invoked, programmers provide a byte buffer, assigned to the Stdout and Stderr outputs. Run() starting in line 52 invokes the external process, grabs its output, and checks the exit code.

Normally, exiftool returns with an exit code of  . In this case, the error err in line 53 is equal to nil, and patch() returns to the caller (the main program) after the work is done. exiftool modifies the JPEG file given to it directly and stores a backup of the original in x_original, but geofuzz is not interested in this, and therefore simply ignores it, leaving it in the same directory.

To generate an executable geofuzz binary from the source code in Listing 1, Listing 6 shows the Go commands for initializing a Go module and compiling the code while automatically downloading any dependencies from GitHub. Then you just need to install geofuzz in a path listed in your PATH variable, and a quick call to geofuzz file.jpg quickly drops a privacy-friendly obfuscation layer over the geotags in the file. Curious online snoopers will be furious, because they'll be searching in the wrong part of town!

Listing 6

Generating the Binary

01 $ go mod init geofuzz
02 $ go build geofuzz.go

Infos

  1. Exif format: https://en.wikipedia.org/wiki/EXIF
  2. GeoImgr: https://tool.geoimgr.com
  3. "Programming Snapshot: Go program finds photos with nearby GPS coordinates," by Mike Schilli, Linux Magazine, issue 225, August 2019, p. 44, https://www.linux-magazine.com/Issues/2019/225/Programming-Snapshot-Go/(language)/eng-US
  4. Generating random locations nearby?: https://gis.stackexchange.com/questions/25877/generating-random-locations-nearby

The Author

Mike Schilli works as a software engineer in the San Francisco Bay area, California. Each month in his column, which has been running since 1997, he researches practical applications of various programming languages. If you email him at mailto:mschilli@perlmeister.com he will gladly answer any questions.

Buy Linux Magazine

SINGLE ISSUES
 
SUBSCRIPTIONS
 
TABLET & SMARTPHONE APPS
Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • ExifTool and jExifToolGUI

    ExifTool lets you modify and analyze metadata in multimedia files from the command line, but its comprehensive feature set results in a lengthy learning curve. Luckily, jExiftoolGUI offers an intuitive interface that makes using ExifTool easier, even for less experienced users.

  • Easy Geotagging with ExifTool
  • Programming Snapshot – Go

    Every photo you take with your mobile phone stores the GPS location in the Exif data. A Go program was let loose on Mike Schilli's photo collection to locate shots taken within an area around a reference image.

  • Workspace: ExifTool

    Understanding the full power of ExifTool can be daunting. We show how to put it to practical use.

  • Perl: Elasticsearch

    The Elasticsearch full-text search engine quickly finds expressions even in huge text collections. With a few tricks, you can even locate photos that have been shot in the vicinity of a reference image.

comments powered by Disqus
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters

Support Our Work

Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.

Learn More

News