Top Tools and Tips for Exporting Photos to PhotoKMLExporting photos to PhotoKML lets you turn geotagged images into interactive maps that can be viewed in Google Earth or other KML-capable viewers. This article covers tools, workflows, common pitfalls, and practical tips so you can efficiently convert, organize, and publish photo-based KML tours and overlays.
What is PhotoKML?
PhotoKML is a method of embedding photos (or references to photos) into KML (Keyhole Markup Language) files so images appear as placemarks, overlays, or pop-up balloons in mapping applications like Google Earth. Instead of storing binary image data in KML, workflows often link to image files hosted locally or online; some tools package images and KML together (KMZ).
When to use PhotoKML
- Visualizing fieldwork photos with precise locations (environmental surveys, archaeology, construction).
- Creating travel guides and photo tours for sharing in Google Earth.
- Real estate/property mapping with photo evidence attached to property points.
- Journalism and storytelling where location context enhances narrative.
Tools for creating PhotoKML
Below are reliable tools and brief notes on what each does well.
Tool | Platform | Key strengths |
---|---|---|
Google Earth Pro | Windows, macOS | Built-in KML support, easy placemark creation, KMZ packaging |
ExifTool | Cross-platform (CLI) | Robust metadata extraction/editing (EXIF, GPS tags) |
GeoSetter | Windows | Batch geotagging, review EXIF, write KML directly |
QGIS | Windows, macOS, Linux | Powerful geoprocessing, create KML from layers, plugins for photos |
HoudahGeo | macOS | Intuitive geotagging and KML export, photo-to-GPS workflows |
Bulk KML generators (various scripts) | Cross-platform | Automation-friendly for large image sets |
Online services (e.g., Mapme-style, specialized converters) | Web | Quick conversions, useful for non-technical users |
Quick workflow overview
- Verify/assign GPS coordinates to photos (geotagging).
- Clean and standardize EXIF metadata (timestamps, orientations).
- Choose a tool to map photos to placemarks and export KML/KMZ.
- Host images online (optional) or package them into a KMZ.
- Test in Google Earth and tweak placemark styling and balloons.
Step-by-step: Preparing images
- Check EXIF GPS data: Use ExifTool to inspect GPSLatitude, GPSLongitude, GPSTimestamp.
- Example: exiftool IMG_0001.jpg
- If photos lack GPS, geotag by:
- Using a GPX track from a GPS logger and matching timestamps (HoudahGeo, GeoSetter, or QGIS plugins).
- Manual placement in Google Earth or QGIS for a few images.
- Correct timestamps and time zones before matching GPX tracks — mismatched times are the most common error.
Exporting methods
- Google Earth Pro:
- Create placemarks and add images in the placemark balloon via the “Description” field (use
).
- Save as KMZ to bundle images.
- Create placemarks and add images in the placemark balloon via the “Description” field (use
- QGIS:
- Create a point layer with photo path attributes (e.g., “photo_url”).
- Use “Save As” → KML and set Description field to include HTML
tag referencing the photo path.
- ExifTool + scripts:
- Batch-generate KML by extracting coordinates and writing KML templates (good for automation).
- GeoSetter/HoudahGeo:
- Provide user-friendly GUIs to geotag and export KML/KMZ directly.
Balloon HTML tips
- Keep HTML lightweight: many KML viewers have limited HTML/CSS support.
- Use relative paths if bundling into KMZ; use absolute URLs for hosted images.
- Example simple description:
Caption text
- Avoid external JavaScript and heavy CSS; stick to basic tags (img, p, br, a, b).
Hosting vs. KMZ packaging
- KMZ (KML zipped with resources) is best for portability and offline use — images are included.
- Hosting images (HTTP/HTTPS) keeps KMZ small and supports high-resolution images without bloating files.
- If hosting, ensure:
- URLs are stable and publicly accessible.
- Use HTTPS for compatibility and security.
Automation and large datasets
- Use scripting (Python, Node.js, shell) with ExifTool to extract coordinates and generate KML templates.
- For thousands of images:
- Batch resize/thumbnail images for balloons to reduce viewer load.
- Store original high-res images separately and link to them from the balloon.
- Consider tiling/overlay techniques if you need to place photos as ground overlays (orthorectified), not just placemarks.
Common problems and fixes
- Missing or incorrect GPS: check timestamps, time zones, and GPX sync.
- Wrong photo orientation: ensure EXIF Orientation is correct or rotate images before packaging.
- Broken image links in balloons: verify paths in the KML/KMZ and test in Google Earth; relative paths differ when inside a KMZ.
- Slow loading: use thumbnails in balloons or host images on a fast CDN.
Best practices
- Standardize filenames and metadata fields (caption, date, photographer) to populate KML descriptions automatically.
- Include attribution and copyright data in the balloon description.
- Keep KML/KMZ sizes practical — split very large collections into multiple KMZs or use hosted images.
- Test the KML/KMZ on the target viewer(s): Google Earth desktop, mobile, and web behave differently.
Example Python snippet to generate simple KML from CSV (paths and coords)
# save as photos_to_kml.py import csv from xml.sax.saxutils import escape template_head = '''<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> ''' template_tail = '</Document> </kml> ' placemark_tpl = ''' <Placemark> <name>{name}</name> <description><![CDATA[<img src="{img}" width="400"/><br/>{caption}]]></description> <Point><coordinates>{lon},{lat},0</coordinates></Point> </Placemark> ''' def csv_to_kml(csv_path, kml_path): with open(csv_path, newline='', encoding='utf-8') as f, open(kml_path, 'w', encoding='utf-8') as out: reader = csv.DictReader(f) out.write(template_head) for row in reader: out.write(placemark_tpl.format( name=escape(row.get('name','')), img=escape(row['img']), caption=escape(row.get('caption','')), lon=row['lon'], lat=row['lat'] )) out.write(template_tail) if __name__ == '__main__': csv_to_kml('photos.csv', 'photos.kml')
Final checklist before publishing
- GPS and timestamps verified.
- Images accessible (in KMZ or via URLs).
- Balloon HTML displays correctly and loads quickly.
- Copyright and captions included.
- File sizes and structure tested on intended viewers.
If you want, I can: extract GPS from a set of sample photos and produce a ready-to-open KMZ, write a custom script for your workflow, or review your existing KML for problems. Which would you like?