2020’s Most-Interesting Photos

January 3, 2021  |    0 comments  |  General Interest

As in years past, these are the 10 most-interesting photos I made and shared in 2020 as determined by Flickr’s obscure and mysterious “Interestingness” algorithm.

10. Twisted

9. The Lonesome Tree at Evening

8. Dam Danger

7. On the Forest Highway

6. Skybound

5. Pumping Petroleum

4. Early-Morning Solitude

3. Autumn Backroad

2. Placid Dawn

  1. Countryside Drive

Sadly, because of the ongoing COVID-19 pandemic, we were unable to complete any of the travel we had planned on in 2020, so most of our photos this year are from the North Texas region where we make our homebase. We were able to sneak off to Arkansas and Oklahoma a couple of times, so there is some variety, but not what we’d planned. Hopefully, things will start to return to normal now that the vaccine is rolling out and we have a new administration that seems to want to make things better for others rather than only enriching themselves.

Hope that you have a great 2021!

A Lightweight EXIF Data Viewer

May 18, 2020  |    0 comments  |  Apps

(Note: This post originally appeared on my new mostly-non-photography blog [robotsprocket])

If you’ve read the title of this post and are wondering “what is this EXIF thing?”, then here’s a bit of information. EXIF is an acronym for EXchangeable Image File Format. And, no, I don’t know why it’s not “EXIFF”. Basically, it’s metadata tagged onto a digital image that contains information about that image. This, along with another group of metadata, IPTC, is used by digital photographers to keep track of information about such things as camera/lens settings, geographic information and copyright of a given photo.

Some photographers post their images online with this information intact, while others will strip it out when posting, keeping their secret sauce to themselves. For myself, I keep it intact as I hope it might be helpful to other photographers to understand how a photo was capture as well as being an aid in enforcing copyright. Most, if not all, photos on my photography site have this data tagged onto them and the basic data can be viewed by clicking the “View Photo Data and Location” button under the photo:

Basic EXIF data on 75CentralPhotography.Com

However, there are a lot of times that I want to view this data locally for unpublished photos on my PC. To make this easy, I wrote a simple Windows application that will display this data for a selected photo:

Main Interface

It displays the most-commonly used EXIF data on the main interface; and, if there’s GPS information embedded in the metadata, it shows a button to view the photo’s location on Google Maps. If you want all the EXIF data, you can click “File→Show All EXIF Data…” and a dialog will appear showing everything:

Everything, Everything

This application is written in VB.NET and the source code is available on GitHub. If you want to install it, you’re welcome to download it here.

A couple of installation notes:

When downloading the installer, you may get this warning:

Because this app hasn’t been installed enough times for Windows to “trust” it, Windows Defender wants you to really think about it before installing. To continue, click the three dots and choose “Keep”.

You might then get another warning:

Go ahead and click the down arrow next to “Show more” and click “Keep Anyway”. Then, navigate to your download location and doubleclick EXIFViewer.msi to install. You might get another warning:

Click More info and you’ll get the option to run anyway. At this point, the installer will launch and you can install the application.

A lot of rigmarole to install an app, but it’s for most people’s own good, as Windows tries its best to prevent you from installing malicious software using Defender Smartscreen. In this case, you’re going to have to trust me that this isn’t malicious. You have the option, of course, to review the source code at the Github repository listed above. And you know where to find me. If enough people install, Windows will eventually allow it past Smartscreen without complaint.

If you download and use the EXIFViewer and have any feedback or find any bugs, please submit an issue here or send me an email at

Oh Hey, New Blog

April 19, 2020  |    0 comments  |  Elsewhere

If you’ve been following this blog for a while, you might’ve noticed that sometimes, on the rare occasions that I do post, I don’t strictly post about photography.

Instead, I post code or lamentations over lost family members or other random things.

Since this is a photoblog, I’ve decided that I should stick with photography here and start collecting this other stuff somewhere else.

So, consider this the official announcement of [RobotSprocket], my new blog where I share everything else.

I’ve just started it, so bear with me while I work out some of the kinks and get into my groove with writing and sharing, but if you like random things, then by all means, bookmark it.


Nightmare Fuel*

February 7, 2020  |    0 comments  |  Apps

*Or how a neural network changed everyday people into Eldritch Abominations.

I recently came across a story on The Verge about a guy who used software to upscale the Lumière Brothers’ 1896 short film L’Arrivée d’un train en gare de La Ciotat to 4K resolution at 60 frames per second. This was accomplished using Topaz Labs’ Gigapixel-AI software, which purports to use advanced neural networks to enhance resolution of low-resolution photos (i.e. “make small photos big”). You can see this video here:

While it’s not perfect, it’s intriguing to see what the late 1800s might have looked like if we took modern video cameras back in time and did some shooting. For reference, here’s the original version of the film:

My interest piqued, I wanted to give this software a try on some of my old, low-res photos, so I downloaded a trial copy and started playing around with it. One of my first tests was to try it on an old scan of a photo my father took in 1980 when Ronald Reagan visited our town while campaigning for president:

As I’d scanned this roughly 13 years ago with my first negative scanner, the quality isn’t great and the resolution is a measly 2171×1443.

However, after putting it through Gigapixel-AI, I got this pretty-good-looking result:

Good-looking, that is, until I zoomed in on the people. It soon became obvious something terrible had happened:

What happened to their faces!?!?!?!?

The software’s neural network attempted to use information it already “knows” about faces to “fill in the gaps” in the low-resolution original, but it seems that it doesn’t always to a great job of this.

Luckily, Topaz Labs seems to have anticipated this and added an option to turn off or reduce face refinement. Once I turned this off, the results were much-better:

Still not perfect, but considering how little detail was in the original, pretty-impressive. For reference, here are the same areas in the original, unprocessed scan:

And, if you’re curious, the enhanced version of the photo without face refinement enabled:

All-in-all, Gigapixel-AI seems like a nice bit of software for “rescuing” old photos that need to be enlarged for print or web display, just don’t look too-closely.

Our Arbitrarily-Determined Most-Interesting Photos of 2019

December 17, 2019  |    0 comments  |  Site-related

As mentioned in previous years, Flickr uses a mysterious algorithm to determine what constitute an “interesting” photo. No one seems to know what makes a photo interesting in the eyes of Flickr. My assumption is that it’s some combination of view count relative to a user’s normalized view count, some comment metrics, a dash of machine learning and magic dust.

At any rate, as we’ve done before, here are the 10 Most-Interesting photos taken this year by us as determined by Flickr.

Donkeys and Cows
Red Hibiscus
Sunrise at the Pier
Dawn on the Ridge
In the Fog
The Little Town at the Foot of the Mountain

Twelve Years of Photos

August 12, 2019  |    0 comments  |  Site-related

When I was a little kid, my parents made sure that we went on adventures to see the world, or at least the world that they had the time and means to expose us to, which usually meant our home state of Texas. From our home in East Texas, we went to easy-to-reach places such as Dallas and Fort Worth, and more-distant locales, such as Austin, San Antonio, Corpus Christi, Big Bend and the Rio Grande Valley. One of the common denominators of these trips was my late father carrying around his Minolta SRT-101 SLR with the “kit” 50mm lens permanently attached.

I was always fascinated by this mechanical wonder…if you took off the lens and clicked the shutter button, you could see the shutter curtain pop open for a split second. Pushing the lever over to advance the film would reset the curtain for the next shot. Ingenious and incredibly interesting for a little nerdy kid who harbored fantasies of building robots and walking on the Moon.

(Side note: I’ve still never built a robot and my chances of ever visiting the Moon are zero)

The fact that this little metal box with a tube of glass on the front could capture memories was—and still is—amazing to me. I still have thousands of my father’s negatives, awaiting for a time when I can get around to digitizing them before they fade away. I relished every chance he’d allow me to click the shutter button and make another celluloid memory.

By the time high school rolled around, I decided to join the yearbook. The staff was shorthanded and I ended up as a photographer. Or, more-often-than-not, the photographer. I loved spending time in the darkroom, processing film and printing it in the dim glow of the red safelight.

I’d hoped to continue doing photography as a hobby after high school, into college, but the reality of the cost of film, let alone maintaining and stocking a darkroom, precluded that. I took a couple of photojournalism classes just to have some access to a darkroom, but outside of that, I rarely took photos.

Graduation came and went and I started my career as a software developer, always thinking that one day I’d get back into photography. But the cost was always a blocker. Then digital cameras came onto the scene. Pricey at first, with not-so-great quality, I kept waiting for them to get better, knowing that memory cards and hard drive storage would be a lot cheaper than film.

Finally, a bit over twelve years ago, the Canon 400D came out and was in my price range. I dove right in. And I loved it.

Going on adventures to take photos was almost eclipsed by the relaxation and zen brought on by editing the photos on my PC. I quickly maxed out my PC’s hard drive with RAW files…I’d go out on a Saturday morning and not return until late in the evening, my CF cards full and my batteries dead.

I loved taking photos, but what good is capturing images if no one gets to see them?

Since there were few avenues for sharing photos—Instagram wasn’t around yet and Flickr was just getting rolling—I decided to create a photoblog. Photoblogs were big at the time, precisely because a lot of people found themselves in the same situation as myself—lots of photos, no where to display to the world.

My goal at the time was to post a photo every day for as long as I could keep it up. Now, twelve years later, I’m still posting a new photo every day.

A lot has happened in that twelve years. I got married. Changed jobs a few times. Moved around the DFW area. Switched from Canon to Panasonic to Sony. But one thing has been consistent and has kept me sane—posting a new photo every single day for over 4300 days straight.

This year, to celebrate the twelfth year of 75CentralPhotography, I put together a barcode representation of every photo posted from August 12, 2007 until today.

Click to view larger

Each vertical line on this image is a representation of each photo posted to the site, compressed to 1 pixel wide and stitched together via a .NET app I threw together.

I think it’s an interesting artwork on it’s own, but as a visual representation of what twelve years of daily photos looks like, it’s a great visualization of the effort and passion that I’ve put into photography for over a decade.

As for 75CentralPhotography, I don’t have plans to stop posting photos daily, so fingers-crossed that I’ll be able to continue for years-to-come.

Thank you for your support for the last twelve years…I appreciate every one of my followers, fans and visitors.

(If you’re interested, you can read more about my personal photographic history at a post I did several years ago. It’s somewhat out-of-date, as it doesn’t cover the years I spent in the Micro Four-Thirds ecosystem and my subsequent transition (still-ongoing) to Sony, but it’s still informative. Or at least I think it is).

An Eulogy for “The Most-Photographed Dog Ever”*

July 25, 2019  |     6 comments  |  Other Stuff

*Perhaps just a bit of hyperbole

On Wednesday morning, after a sudden illness, we had to make the difficult, but ultimately for-the-best, decision to say goodbye to our beloved Winston.

You may not have known Winston, but if you ever had the chance to meet him, he would’ve loved you instantly. He was like that…he loved everybody, oftentimes with boundless enthusiasm that consisted of cuddles and “kiss attacks”.

We adopted Winston in the Spring of 2010; Laura and I had just gotten married the year before and had moved to a new neighborhood in Addison, Texas, where everyone seemed to have a dog and we wanted to join the club. We thought it over for a while—would we go to a shelter and pick one out? or, would we settle on a breed and find the right dog that way? We never really settled on what we wanted…initially, we wanted something on the small side, preferably female.

One weekend in April, we went out to East Texas to visit my mother and, on a lark, decided to visit the Edom Art Festival. While perusing the arts and crafts, Laura came across the Van Zandt County Humane Society booth and took a look at the dogs, not intending, of course, to adopt. But it was love at first sight, for both Laura and the odd-shaped black, white and grey dog with the gorgeous eyes, long waggy tail and friendly smile. He ambled up to her, gave her a hug with his short little legs and we had to bring him home. Despite not meeting our dog criteria (female and small), he’d chosen to bless us with his unyielding love and we brought him into our lives.

He’d been found on a roadside in the Piney Woods of East Texas, abandoned by some sorry person who didn’t appreciate the treasure they’d lost or, for that matter, appreciate the preciousness of a pet’s life. His shelter name was “Stubby”, on account of his short legs and long body (when he was fully grown, he was exactly four feet from the tip of his nose to the tip of his tail, was maybe 14 inches at the shoulder and weighed somewhere in the 70 pound range). After completing his adoption (and, sadly, causing his foster “dad” to have to retreat to his truck to cry on account of how much he was going to miss “Stubby”), we welcomed him into our tiny family.

Of course, “Stubby”, whilst somewhat apropos, just wasn’t dignified enough for our tastes. So we bequeathed the much-more regal Winston upon him. As mentioned, he was an odd-shaped dog, a mix of perhaps Corgi or Basset and Blue Heeler with a bit of Lab thrown in for good measure. His front legs were shorter than his hind legs, giving him the shape of a dragster (though certainly without the speed). On occasions when he’d run (oftentimes to the chant from Laura or myself of “Fast Dog!”), he’d usually jack knife a bit, his longer hind legs outpacing his front.

At home, he joined our two cats, Miis and Squeaky (sadly, Squeaky left us last year after a long, lingering bout of congestive heart failure, thought Miis is still with us, at the ripe age of 18, too mean to die). While Miis never really interacted with him, Winston loved to try to chew on Squeaky’s ears. At least once, one of the cats had enough of his crap and gave him a good swipe across the nose, but, for the most part, they lived together harmoniously.

Living in the neighborhood we did, in a mid-rise building, we walked him every morning and evening, and often more than that. His friendliness and adorableness soon earned him many friends—both canine and human. Countless times, on their first encounter with him, people would ask “What kind of dog is he?”. Unable to ascertain his exact provenance, my stock answer soon became “We’re not sure…just random dog parts. It’s like they just took whatever parts they had leftover at the dog factory that day and put him together”.

Our weekends typically consisted of rising early and going to the dog park, Winston riding shotgun, his Chewbacca to my Han Solo. At the dog park, Winston always seemed to be more interested in the people than the other dogs. He’d make his rounds, greeting everyone with either a smile or, if you were lucky, kisses. He loved to snake along the fence of the park, taking in all the various smells and, I imagine, making a mental map of the most-foul ones for later reference (for reasons that he never revealed). If he felt like playing, he’d wander the grounds, inspecting each and every tennis ball until he found the most disgusting one, just to make sure that I had to touch something I’d rather not. After leaving the dog park, we’d go through the local drive-through car wash…Winston loved the sights and sounds of the water and soap jets cleaning the car. If we were feeling a bit peckish, we’d swing by the donut shop for breakfast…a donut for me, a dozen donut holes to take home to Laura and a donut hole treat for Winston.

In the evenings, Laura and I would watch TV, Winston curled up on the sofa between us. On occasion, I’d make a cup of coffee, set it on the end table and leave the room for a moment, only to return to find an empty cup and a slightly-jittery dog. As the months passed, it became apparent that Winston was one of the most-important parts of our lives. Without kids, we focused our love on “Sweet Winnie”. We dressed him up as a pirate for a pet costume contest, we bought him sweaters to keep him warm in Winter (he loved wearing clothes) and we took him on adventures. We were “dog people”.

The first time we traveled out-of-state after adopting him, we were forced to board him at a local pet hotel and, I’m not-to-ashamed-to-admit, I cried on the way there and back, unable to bear to leave him, worried that he might think we didn’t love him and were abandoning him like he’d been abandoned as a puppy. Each time after that, it got a bit easier to leave him, but every vacation’s last few days would be punctuated by Laura or myself exclaiming “I’m so ready to get home and see Winnie”.

After a few years, Laura left her job teaching and started traveling for work, oftentimes being gone for three weeks out of the month. Luckily, I always had Winston with me to keep me company. We’d have long, one-sided conversations with Winston always being a good, patient listener. To wile away the time while Laura was out-of-town, we’d watch obscure movies (usually in a foreign language, which I assumed perturbed Winston as he couldn’t read the subtitles) or work on software or photography projects. At night, he’d climb into bed with me, his collar’s tags clinking in the darkness (I’d usually take it off at night, saying “Let’s take off your jingle-jangle, Winnie”), and curl up next to me. On Winter nights, his prodigious body heat was welcome, staving off the cold that the heater couldn’t. On Summer nights, I’d have to turn the ceiling fan and the tower fan on full blast just to get comfortable. When Laura was home, he’d do the same, though we’d often need to move him a bit to get it comfortable for all three of us (he never really learned to lay parallel, preferring a perpendicular arrangement to ensure that he could touch both of us at the same time.

A few years ago, Laura was diagnosed with cancer and needed to undergo both chemotherapy and radiation treatment. Winston never left her side—for three straight months, he slept on her feet at night to keep her warm, snuggled her when she was restless and loved her when the chemotherapy’s effects were at their worst. Many nights, I turned to Winston for love and comfort as I struggled to stay strong for Laura while we went through this experience. He never not loved me back…a steady source of comfort, strength and loyalty.

Eventually, we moved into a house to give him the opportunity to have a yard of his own—his own private dog park. He loved to lay out in the sun, soaking up the warmth and relaxing in nature. Worried that he was lonely, we adopted a companion for him a couple of years ago. Millie loved to try to get him to wrestle and play, but they usually just settled with lying together in the yard or climbing into bed with us at night, a half-human/half-canine dog pile. Millie was, at most, only a few months old when we adopted her and our hope was that, although he was getting to be “comfortably middle-aged”, Winston would have several more years to teach her how to be a “good dog”; a selfless, loving, friendly companion. And though it’s taken a couple of years, I’d say he succeeded. Millie, while being full of boundless energy—the polar opposite of Winston—is also full of boundless love.

Roughly a year ago, we took in our “old lady”. Bonnie’s owners were forced to let her go when they were moved into a nursing facility. At eleven-years-old, we knew no one else would adopt her and we decided that the right thing to do would be to bring her into our home and let her have the best life possible for her remaining days. Unfortunately, we soon discovered that she was heartworm positive, so those days might go quick. Winston and Bonnie got along well; while old and sickly, Bonnie loves to play with Miilie and Winston would often try to impose himself on their wrestling matches. A couple of months ago, however, we were informed that her disease has progressed to the point where she might have “weeks to months” to live. We knew our time with her would be short, so we’ve been somewhat-prepared for the day when we have to say goodbye to her.

We never thought we’d be saying goodbye to Winston before Bonnie. Though he’d been arthritic for a couple of years now, having a hard time getting around, he’d been otherwise energetic and playful. And now, suddenly, in the last week, he was sick. Coughing, struggling to breath and barely moving. Our first vet visit on the weekend judged him to have nausea and upset stomach, but by the next night, he was doing worse. Coughing, trying to throw up and struggling. We took him to another vet, referred by his primary vet, who judged that he had developed a rare condition (megaesophagus) and would have to be hand fed while sitting up for the rest of his life and the prognosis wouldn’t be good. Drugs were prescribed and attempts were made to get him to eat, but his condition kept deteriorating. On Tuesday, we took him to the ER and they told us his prognosis wasn’t not great at all, but that there was a chance he might turn around a bit and that we could give him palliative care for a few days to make sure he was comfortable. They’d keep him overnight and give him steroids and fluids. We gave him loves and went home, wondering if we’d made the right choice.

By Wednesday morning, the vet had called and let us know that he’d made a sharp turn for the worse. Knowing there was nothing we could do to make him better, we made the hard, too-short drive to the hospital to say our goodbyes and help him pass on to the next life. 

We just hope that he knew that we loved—and will always love—him and that were ultimately doing this to make things better for him. He wouldn’t be in pain any longer and wouldn’t needlessly-suffer. We both held him as he took his last breaths and I’m certain that he knew we loved him.

I like to think that Winston had so much love to give that he gave it all away a bit too quickly. We’ll be forever grateful that he was part of our lives and I’ll cherish my time with the “odd-shaped dog” for the rest of my life. If there is a better place or afterlife for dogs, I like to think that Winston is there now, sniffing around for the best smells, gently taking the tastiest treats and finally conquering his irrational fear of snowmen.

Luckily, for us, we have an incredible photographic archive of our life with Winston. Looking through my Google Photos and Lightroom catalogs, I’d say that there are roughly 20,000 photos of him taken over the years. Over the last day, it’s been both joyful and heartbreaking to scroll through these digital memories, many of which reminded me of several of the anecdotes I shared in this piece.

Master of the “side-eye”

Looking sad on his first visit to the vet

We took him to visit Santa for his first birthday. Since he was about four-months-old when we adopted him in April 2010, we celebrated his birthday on Christmas Day.

A rare display of athletic prowess as Winston attempts to catch a snowball
Winston never had a sad day in his life…he was always smiling
Showing some concern
Love, Always and Forever
(Adapted and expanded from a post I made on Facebook on July 24th, 2019)

My Geo-Tagging Workflow

February 28, 2019  |    0 comments  |  Apps GPS Logs Technique/Workflow

In my last post, wherein I outlined how I added a link to each photo’s location on Google Maps, I mentioned that I thought I’d done a writeup on how I geo-tag photos, but couldn’t find it. After extensive searching of the archives, I can confirm that I don’t seem to actually have ever written about my process. Today, I’ll rectify that oversight.

Let’s take a look at the tools I use, then I’ll walk you through how it all comes together.

First, we need a way to record a GPS log. Typically, these are in the format of a .gpx file, which is a type of XML file that can contain a geotrack, which is, at its most-basic, a series of GPS fixes in latitude and longitude along with a timestamp for each point that allows software to reconstruct a route. It may also, but not necessarily, contain speed and heading information. It can also contain a series of waypoints, which are GPS fixes that aren’t linked in a time dimension, so no track can be generated from these as there’s no way of knowing which order the GPS fixes/points were gathered, as order in the file doesn’t necessarily mean that’s the order they were gathered. In addition, we’ll need the time information later to match the time a photo was taken to a spot on our geotrack.

To build a .gpx file while out taking photos, we need a GPS receiver that has the ability to periodically record our current location in a file then export it for consumption by another tool to actually tag the photos. For this, I use a couple of different tools:

When I was using an iPhone as my day-to-day phone, I used an app called MotionX GPS to record my tracks.

Now that I’m using a Google Pixel 2 XL as my phone, I’ve had to find a different app to record tracks as MotionX GPS isn’t available for Android. I tried a few an eventually settled on GPSLogger. The UI isn’t as pretty as MotionX GPS, but it gets the job done.

The next tool we need is a way to merge the location and time data in our .gpx file with our photo data. Since I’m an Adobe Lightroom user (Classic, none of that CC nonsense for me!), I could use Lightroom’s rudimentary built-in geo-tagging feature (a tutorial can be found here), but I prefer some fine control over the process, so I use Jeffrey Friedl’s excellent Geoencoding Support plugin.

This allows us to fine-tune all sorts of fiddly bits in the process, such as correcting for the camera’s time being off a bit from the actual GPS time, which brings us to our next point:

How do I ensure that my time is correct on my camera?

There are a few ways to do it. If you’re lucky, your camera’s companion smartphone app supports synchronizing your phone’s time with your camera’s time, such as the Panasonic Image App (Android/IOS) does. If you’re not-as-lucky, you have to manually sync it, which means opening your camera’s settings and setting the date/time to match the phone’s as close as possible. Fortunately, it doesn’t need to be precise as most geotagging tools, such as Jeffrey’s Lightroom Geoencoding Support, allow for some “fuzziness” to the time matching algorithm.

Once you’ve tagged your photos, you can manually tag any misses in Lightroom’s Map tab. Now you have a precise log of your adventures and the photos you’ve taken.

In addition, you can open the .gpx file in Google Earth and get a nice map of your adventure. Here’s one from a visit I made to the Great Smoky Mountains last year:

So, there you have it, my geotagging workflow. However, I would be remiss in failing to mention that I’m currently testing using a GPS watch (the Suunto Traverse) for tracking as I don’t need to worry about killing my phone’s battery life while logging my location. So far, so good. I might do a write up in the future about my experiences with it.

How I Added Photo Location Data to 75CentralPhotography.Com

February 17, 2019  |    1 comment  |  Code GPS Logs Site-related

I like to geotag my photos. Almost every time I go on a phototrek/drive/adventure/walk, I log my locations so that I can merge my geotagged data with my photos and know exactly where each photo was taken. (I swear I thought I’d done a write-up on how I do this, but I can’t seem to find it. I have posted some of the track logs in the past however…you can see them here .)

Since I have this data sitting around and it’s embedded in each photo on 75CentralPhotography.Com, I thought it would be fun for visitors to the site to see exactly where in the world each photo was taken. But how to do this?

WordPress—the backend system for the site—helpfully provides a function to store EXIF data (basically the metadata in a photo that shows interesting things like shutter speed, aperture, ISO and a ton of other stuff) but only stores the basics, whereas the EXIF standard has scores of datapoints (colorspace, exposure bias, YCbCr positioning—whatever that is—to name a few). Unfortunately, this means that they don’t include location data as part of this limited scope.

Luckily, some kind soul has already solved part of the problem for us with a built-in function in PHP (WordPress’ programming language). This function, exif_read_data(), will let us read any part of a photo’s EXIF data and use it how we want. In this case, that would be to link to Google Maps and show a place marker of where the photo was taken.

Here’s how I leveraged that function to add a link on each photo’s page to the related location on Google Maps.

First, we need to get the photo’s EXIF data. Since exif_read_data() will only accept a local file as a parameter, we need to get the local path to the image relative to the page where we are executing the code/displaying the link. Fortunately, WordPress has us covered with a couple of functions: attachment_url_to_postid() and get_attached_file().

attachment_url_to_postid takes the URL of an attachment (i.e. a photo attached to a post) and returns the ID of that photo. To get the attachment’s URL, we use our old friend catch_that_image(), which resolves the URL of the first photo on a post (and, since we only ever post one photo at a time on the site, the only image on a post). Then, we take the result of that function and pass it to get_attached_file(), which returns the aforementioned local path of the photo file:

$attachment_id = attachment_url_to_postid( catch_that_image() );
$fullsize_path = get_attached_file( $attachment_id ); 

We then take this local path and pass it to exif_read_data() for parsing of the photo’s EXIF data:

$exif = exif_read_data($fullsize_path);

This function returns an array of values where the first value is the EXIF data label and the second is the EXIF data itself (you might think of this as a keyset). So, a particular photo’s data might look something like this:

Equipment Make SONY
Camera Model ILCE-7RM2
Camera Software Adobe Photoshop Lightroom Classic 8.2 (Macintosh)
Photographer Matt Harvey
Maximum Lens Aperture f/2.8
Focal Length (35mm Equiv) 44 mm
Horizontal Resolution 96 dpi
Vertical Resolution 96 dpi
Image Created2019:02:16 21:03:14
Exposure Time 1/80 sec
F-Number f/4.5
Exposure Program Normal Program
ISO Speed Rating100
Lens Aperture f/4.5
Brightness 7.2 EV
Exposure Bias 0 EV
Metering Mode Pattern
Light Source Unknown
Flash No Flash, Compulsory
Focal Length 44.00 mm
Color Space Information sRGB
Exposure Mode Auto
White Balance Auto
Scene Capture Type Standard
Contrast Normal
Saturation Normal
Sharpness Normal
Latitude N 33° 3.9174′
Longitude W 96° 58.2118′
Resolution Unit i
Exif IFD Pointer266
Compression Scheme JPEG Compression (Thumbnail)
Horizontal Resolution 72 dpi
Vertical Resolution 72 dpi
Resolution Unit i
Offset to JPEG SOI1044
Bytes of JPEG Data19487
Exif Version2.3
Image Generated2019:02:16 07:52:16
Image Digitized2019:02:16 07:52:16
Shutter Speed 1/80 sec
Focal Plane Horiz Resolution 2164 dpcm
Focal Plane Vert Resolution 2164 dpcm
Focal Plane Res Unit cm
File Source Digital Still Camera
Scene Type Directly Photographed
Digital Zoom Ratio1
GPS Info Version
Latitude Reference N
Longitude Reference W

In the context of this project, we only care about two elements of this data: Latitude and Longitude. So, to extract individual data points, we use a couple of functions to extract the coordinates and convert to decimal:

$lon = getGps($exif["GPSLongitude"], $exif['GPSLongitudeRef']);
$lat = getGps($exif["GPSLatitude"], $exif['GPSLatitudeRef']);

Which calls:

function getGps($exifCoord, $hemi) {
	$degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
	$minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
	$seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;
	$flip = ($hemi == 'W' or $hemi == 'S') ? -1 : 1;
	return $flip * ($degrees + $minutes / 60 + $seconds / 3600);
function gps2Num($coordPart) {
	$parts = explode('/', $coordPart);
	if (count($parts) <= 0)
	return 0;
	if (count($parts) == 1)
	return $parts[0];
	return floatval($parts[0]) / floatval($parts[1]);

So we finally have a specific photo’s GPS location. Our final step is to verify that we have valid data for GPS (i.e. neither the latitude or longitude are 0, because that’s what’s returned when no GPS data is available and there could be, but shouldn’t be, photos on the site without location data). If the verification passes, we link to Google Maps with our coordinates:

if($lat <> 0 && $lon <>0){
								echo '<a href="'.$lat.','.$lon.'" target ="_blank" title="Location data may be innacurate or fuzzed in certain cases">View This Photo\'s Location on Google Maps</a></br>  ';

Note that we added a title element to the anchor tag for the link that states that photo data may be inaccurate or “fuzzed” for some photos. This is because some photos were tagged “after the fact” instead of using an actual GPS log or were tagged en masse with a fairly-accurate location or were tagged with a general location to preserve privacy (i.e. photos I’ve taken at home or other people’s homes).

To view any photo’s location on the site, go to the individual page for a photo and click the “View This Photo’s Location on Google Maps” link under the photo’s tags.

If you find any bugs or photos without GPS data or have any ideas for improvements, please let me know at


© 1993-2021 Matt Harvey/75Central Photography - All Rights Reserved • Contact for image licensing and other queries.