Hi,
I have spent recently quite a lot of time trying to find a quick method for adding precise GPS coordinates to large number of jpeg files. I use Canon 5D MII (without build in GPS receiver), for surveying camera position I use Trimble Geo7x working in centimeter mode. I came across a few different ways of modyfying jpg files, but all of them damaged MakerNote tags. Fortunately exiftool can add GPS data without loosing any of original exif information. I am sharing Python code I wrote, it works for me, it might will help someone too. I am not a programmer, I don't take any responsibility for damage caused by the script. Feel free to send any improvement suggestions :)
"""
initial condidtions:
1. folder with jpeg files named: prefix_filename.jpg (eg. V1a_IMG1234.jpg)
2. CSV file with: prefix in column H (eg. V1a , V2 , V3...), latitude value in column Q (eg. 53.1234567), logitude value in column R (eg.-6,1234567)
3. exiftool.exe and python script in the same folder
"""
import subprocess
import csv
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
root = tk.Tk()
root.withdraw()
#select jpg files
pht = filedialog.askopenfilenames(defaultextension=".jpg", title="Select JPG files")
#open CSV file
r = filedialog.askopenfilename(defaultextension=".csv", title="Select CSV file")
#open txt file or create if doesn't exist
f = open("MyArgs.txt", "a")
for c in range(len(pht)):
v = str(pht[c])
x = v.rsplit("/")
y = (x[-1])
s = str(v[:-4])
z = y.rsplit("_")
q = str(z[0])
with open(r) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for i, row in enumerate(csv_reader):
#compare jpg file prefix with survey point name in CSV file
if q == str(row[7]):
#read lon, lat from CSV file
csvLat = float(str(row[16]))
csvLon = float(str(row[17]))
absLat = abs(csvLat)
absLon = abs(csvLon)
latRef = "N" if csvLat > 0 else "S"
lonRef = "W" if csvLon < 0 else "E"
f.write('-execute\n{}\n-overwrite_original\n-gpslatitude={}\n-gpslongitude={}\n-gpslatituderef={}\n-gpslongituderef={}\n-gpsaltituderef=0\n'.format(v,absLat,absLon,latRef,lonRef))
else:
continue
#add closing instructions to the end of txt file
f.write("-stay_open\nFalse\n-exit\n")
f.close()
#run exiftool in batch mode
subprocess.run([r"exiftool", "-stay_open", "True" , "-@", "MyArgs.txt"])
#clear txt file
f = open("MyArgs.txt", "w")
f.write("")
f.close()
messagebox.showinfo("Info", "Finished")
I should point out that exiftool can read GPS logs from a CSV file (https://exiftool.org/geotag.html#CSVFormat) as long as the headers are ones that exiftool can parse.