I've been tracking my location since 2008, and write down everything I eat and drink. I've spoken at conferences around the world about owning your data, OAuth, quantified self, and explained why R is a vowel.
My DSLR camera doesn't have GPS, so normally all my photos would not include the location of where I was when I took the photo. I used to use the Eye-Fi card that did geotagging, but that is no longer supported in the new "mobi" line. I could get an external GPS unit for my camera, but that sounds cumbersome and would only work with that one camera.
Since I already track everywhere I go, I figured I could use this data to geotag my photos when I upload them to Flickr. It turns out, due to the limitations of Exif, the metadata format that digital cameras use to store information about photos, it wasn't so easy.
Exif lets the camera write arbitrary text data into a jpg when it saves it. There are a handful of standard properties that most cameras write, such as the time the photo was taken, the camera settings such as shutter speed, f-stop, etc, and GPS location if the camera knows where it is. My thought was that if I know when the photo was taken, I can find out where I was at that time, and then add the GPS data to the photo.
Unfortunately, the format for storing dates in Exif does not support specifying a timezone offset. The format for dates is YYYY:MM:DD HH:MM:SS. Without the timezone offset, this series of numbers corresponds to many different actual points in time, depending on which timezone you interpret it as. So what I need is a way to turn the camera time into a specific point in time in order to find out where I was at that time.
I realized that since I have a complete log of my GPS coordinates, I should have enough information to piece this together. Essentially the question I am asking is "where was I when my clock read 7:00pm on July 16 2016?" Note that there are two parts to the answer: my location, and the absolute point in time. It's kind of like solving an equation where there are three variables and you know two of them. The three variables are: my location, the clock time, and the timezone offset. If we knew my location and the clock time, we could find the timezone offset. If we knew the timezone offset and the clock time, then we could find my location.
Where was I when my clock read "7:00pm on July 16 2016"?
If we knew what timezone I was in, then "7:00pm on July 16, 2016" becomes a single reference to an absolute point in time. But we don't know what timezone I was in yet, so there are actually 24 possible absolute points in time this could be. (I'm simplifying this problem slightly by ignoring the 30-minute offset timezones.)
The solution is to find my location (which includes the absolute point in time) at all 24 possible points in time, find the timezone offset that corresponds to each location, then find the location where its timezone offset matches the candidate offset. Below is an example:
Offset-less time in question: 2016-05-12 16:00:00
This could be any of the absolute points in time:
(I left out some of the less common timezone offsets I frequent for the sake of clarity in this example.) Now let's query my GPS database to find out what my local time actually was at each of these points in time:
|Potential Time||Time from GPS||Location|
|2016-05-12 16:00:00 -23:00||2016-05-13 10:59:03 -04:00||New York|
|2016-05-12 16:00:00 -22:00||2016-05-13 10:00:00 -04:00||New York|
|2016-05-12 16:00:00 -07:00||2016-05-12 19:00:00 -04:00||New York|
|2016-05-12 16:00:00 -08:00||no data|
|2016-05-12 16:00:00 -06:00||2016-05-12 17:59:21 -04:00||New York|
|2016-05-12 16:00:00 -05:00||2016-05-12 16:59:53 -04:00||New York|
|2016-05-12 16:00:00 -04:00||2016-05-12 15:59:57 -04:00||New York|
|2016-05-12 16:00:00 -03:00||2016-05-12 14:52:46 +02:00||France|
|2016-05-12 16:00:00 +00:00||2016-05-12 14:52:46 +02:00||France|
|2016-05-12 16:00:00 +01:00||2016-05-12 14:52:46 +02:00||France|
|2016-05-12 16:00:00 +02:00||2016-05-12 14:52:46 +02:00||France|
|2016-05-12 16:00:00 +22:00||2016-05-11 19:15:41 +02:00||Düsseldorf|
|2016-05-12 16:00:00 +23:00||2016-05-11 18:46:26 +02:00||Düsseldorf|
(Note that the times aren't an exact match, because my GPS device doesn't log a point every second. In reality it's more like every second when I'm moving and have a good GPS lock, and when I'm not moving, it records less data. Also on plane flights I sometimes lose the GPS signal part way through the flight which is why many of the rows in this case show the same time from my GPS.)
As you can see by comparing the potential timezone on the left with the actual timezone on the right, there are two offsets that match (highlighted in yellow), so we need to determine which is the correct one. This happens when I am traveling on a plane and cross timezones very quickly.
If we take the two candidates and look at the actual time difference in seconds between the timestamps described, the answer becomes obvious.
|Potential Time||Time from GPS||Difference|
|2016-05-12 16:00:00 -04:00
|2016-05-12 15:59:57 -04:00
|2016-05-12 16:00:00 +02:00
|2016-05-12 14:52:46 +02:00
From this, I can conclude that when my clock read "2016-05-12 16:00:00" it was at "2016-05-12 16:00:00 -0400" when I was in New York.
Most of the time only one offset matches, so this last step isn't necessary. It's only when I quickly cross timezones that there are potentially more than one match.
Since I want to be able to use this to geotag photos, it makes sense to include it as an API in the same system that stores my GPS logs. I encapsulated this logic in my GPS server, Compass with a simple API that returns the answer given an offset-less time. Now I can use it in my geotagging script!
I've been a long-time fan of the Eye-Fi SD cards. My primary use for them is to have all my photos automatically uploaded to Flickr from my camera. It turns out I'm lazy and having to manually copy photos off an SD card and upload them is too much work.
I've had the Eye-Fi Pro X2 card for years. I have it configured to upload everything to Flickr marked "private". I recently got an email saying that they are discontinuing the X2 product line in favor of their new "mobi" line, which will essentially brick the cards. I, as well as many others, were upset by this news.
Their new "mobi" line seems to be completely different, and heavily promotes subscribing to the Eye-Fi cloud service, something that I have no interest in. I don't want to use their tools to store and manage my photos. I want to send them to Flickr, or even better, my own website. Sadly their new cloud service doesn't even support uploading to Flickr.
I started looking into other options, but the state of wifi-enabled SD cards is pretty terrible right now. There are a handful of other brands of cards, but they all are limited to downloading photos directly to an iPhone/Android, rather than uploading from the card to something on the Internet.
The one promising card I found is the Toshiba FlashAir, which has the ability to write custom code that runs on it. I wrote up my initial experiments with it, which were only mildly successful. I tried to pick up that work again, but did not have any luck. There's almost no visibility into the code that's running, so it's very hard to debug. I decided it's not worth it to sink any more time into making that card work.
I decided to again look into the new Eye-Fi card to see what it's actually all about. It seems that my initial understanding of it was completely wrong. I managed to get a Eyefi Mobi Pro card for $36, including a year of their cloud service, so at least worst case I can write that off as paying $3/mo for a year of their service.
After some experiments, I learned that everything I read about the new Mobi card was actually totally wrong! Here is my understanding of the difference between the two cards.
The card connects to a configured wifi network, and uploads the photos to the Eyefi servers. The Eyefi servers then upload to Flickr, or whatever I've configured. The upside is that the card can upload to the internet without my computer or phone helping. The downside is that it requires Eyefi servers to be involved in the process. Also they are shutting down these servers in September presumably because they never figured out a way to make people want to pay for them.
The card connects to a configured wifi network. If my computer is also on that same network, the app on my computer will download the photos from the card. If I have an Eyefi Cloud account, my computer will upload the photos there as well. The upside is that I don't need a Eyefi servers in order to use the card. The downside is the card can only upload photos when my computer is on the same network.
So for now, I'll try out this Mobi card and see if it ends up being useful even though it can't connect to the internet on its own.
My wish is for a wifi SD card that can join a wifi network and upload to an FTP/HTTP server itself, without going through a third-party cloud service and without another device helping it out.