There are all sorts of ways that having GPS information embedded into your photos' metadata can be useful, from visualizing and sharing your grand adventure on a map, sorting photos geographically, or as a reference for entering location keywords and captions. There are two pieces you need. One is your collection of photos. The other is a track of GPS coordinates.
There are cameras that have GPS receivers built in and can embed that information automatically. If you're using one of those, you're all set. But the majority of cameras don't yet have that feature, in large part because of the extra battery and power demands of GPS. In that case, you'll likely be using a standalone GPS receiver of some kind to create a GPS tracklog.
Once you have the GPS tracklog, you'll need a way to take that information and embed it into each individual photo. That's where these geotagging programs come in. These apps take the photos you've shot and the GPS tracklog you've recorded with your GPS receiver and marry them together. To do that, they rely on timestamps as a reference point. While it's not technically required, it makes things easier to have your camera's internal clock set correctly before you start shooting.
The most widely compatible file format for GPS tracklogs is the GPX format. If you have the option, use that. Not every manufacturer uses GPX, but there's usually a way to convert from the manufacturer's format to GPX. NMEA is a distant second in compatibility, but some of the software below also supports that.
So here's a roundup of software that will take the two pieces--your photos and the GPS tracklog--and marry them together to geotag (or geoencode) your photos.
I've put Lightroom first not because it's the best software for geotagging, but because there's a good chance you're already using Lightroom for organizing or editing your photos.
Lightroom has a built-in map module. It's very good for visualizing routes and as a way of sorting photos based on geographical data. It has useful reverse-geocoding functions, and it's good for manually geocoding--you just drag thumbnails onto the map.
But when it comes to importing GPS tracklogs, it's more basic than I would like. That said, it works. To access this function, in the Map module, go to the Map item in the top bar menu and then Map > Tracklog > Load Tracklog.
Once you've loaded it, then you can specify the time offset to compensate if your camera's clock is set to a different timezone than the local one. For instance, I usually keep my cameras on UTC, so when using Lightroom's tracklog function I need to specify the offset amount.
You then need to use the Map > Tracklog > Auto-Tag Photos function to actually correlate the GPS data with the photos and have them show up on the map. If they still don't show up, there's a good chance that the off-set amount you specified is incorrect (or there's no GPS data in the tracklog that aligns with the photos, of course).
If you're already using Lightroom, it's nice to have the geotagging function already built into the Map module. If you want to enhance it with other options such as altitude information or more robust vicinity searching or adding fuzziness between track points, I recommend taking a look at Jeffrey Friedl's Geoenconding Support plugin for Lightroom.
PhotoMechanic does a lot of things very well, and it's especially valuable if you need speed and efficiency in your workflow. It also happens to have a very capable geotagging features built in.
To import a GPS tracklog, go to File > Import GPS Coordinates. You can import multiple GPX files, but you have to do them individually and they get added to the GPS Log Files panel at top left. The other parts of the screen let you move through individual photos, move through the track on the map, and to apply timezone or clock offsets so that the photo's EXIF timestamp corresponds to the time data in the GPX file.
If you want to fine-tune your geotags or manually geotag, there's a separate screen. Select the thumbnails of the photos you want to work with and then go to Image > Set GPS Coordinates. With this screen you can manually override the GPS data either by inputting numbers or dragging the pin on the map.
PhotoMechanic has quite powerful geotagging functionality built-in, but it's not as intuitive as it could be. And again, if you're not already using PhotoMechanic, there are better options if you're looking for software specifically to geotag photos (there are, of course, lots of other areas that PhotoMechanic excels, which is why it's a central part of my workflow).
If you use Mac and are serious about geotagging, HoudahGeo is hard to beat. It is very powerful, and I find it to be the most intuitive to use. Not only does it give you an enormous amount of control over the geotagging process itself, but it includes a number of options so that you can publish your geocoded photo directly to Flickr, Google Earth, or Locr. It can also access Lightroom catalogs directly, and it supports an unusually large number tracklog file formats, including GPX, BIN, CSV, LOG, NMEA, SBN, SBP, SDF, TXC, TES, TRK, TRI, TWL, and WPO.
HoudahGeo's workflow is essentially three steps, starting with Load (above), then Process:
And then Output:
There are too many features built in to cover here, but I highly recommend downloading the trial version and taking it for a spin. Unfortunately it's only available for Mac.
Gpicsync is an open source option with versions for Windows, Mac, and Linux. It locks into the functionality of Google Earth and ExifTool, and you'll need to install those if you don't already have them.
Its workflow is pretty straightforward in a very utilitarian kind of way. You specify the folder the photos are in, where the GPX file is, and set the time offset.
It's a project hosted by Google Code and you can find more information and download it here.
Geosetter is a freeware program for Windows that is quite capable, but it hasn't been updated for several years and I haven't tested it on recent versions of Windows. You can find it here.
PhotoLinker is a Mac app with both a free and a pro version. You can find more information in it here, along with a free trial, and you can download the free version or buy the pro version from the Mac App Store.
MAPic is an interesting new app for the iPhone that lets you edit the geotagging data not just with the photos taken with the iPhone but also with images you took with other cameras like DSLRs. It can come in particularly handy for things like posting to Instagram. It's available through iTunes/
There are other options available. If you're willing to get your hands dirty and roll your own command line solution, GPSphoto.pl works well complemented by other tools.
If you have another one that you'd recommend, let us know in the comments.
Merging and Editing GPX Files
Sometimes you might want to edit or merge GPX files, and there are tools that handle only that. The one I like is Adze (for Mac). I find it particularly handy for merging GPX files created over the course of travel spanning multiple days or weeks.
There are also other tools available that handle this function, including GPS Track Editor, GPX Editor, JGPSTrackEdit, or even doing it manually by taking advantage of the fact that GPX files are in plain text (here's a guide.
Another handy utility for managing waypoint data is EasyGPS (Windows only), and it works with data from all the major GPS manufacturers.