A beautiful macOS application that maps your geotagged photos, displays their locations on an interactive map, extracts metadata, and uses on-device AI to identify objects in your photos.
- Load photos from any folder on your Mac
- Support for multiple formats: JPEG, PNG, HEIC, RAW, ORF (Olympus), and DNG
- View photos in an organized list with GPS status indicators
- Quick metadata display for each photo
- Display all geotagged photos on an interactive map
- Automatic clustering of nearby photos (groups photos within 1km)
- Toggle clustering on/off with "Group Nearby" button
- Map automatically fits to show all photo locations
- Zoom in/out to explore specific areas
- Extract GPS coordinates from photo metadata
- Display latitude, longitude, and elevation for each photo
- Track highest and lowest elevation across all photos
- View location details in the map info panel
- Analyze photos using Apple's on-device Vision framework
- Detect objects in photos with confidence scores
- Color-coded confidence indicators (green/yellow/orange)
- All processing happens locally on your Mac (no internet required)
- View complete camera information:
- Camera make and model
- Lens information
- Focal length, ISO, aperture, shutter speed
- Capture date and time
- And more!
- Supports extended metadata extraction with exiftool integration
- Clean, modern SwiftUI design
- Split-view layout with photo list and map
- Smooth navigation between photos and details
- Custom app icon
- macOS: 13.0 or later
- Xcode: 15.0 or later (for building)
- Swift: 5.9+
- Hardware: Any modern Mac (Intel or Apple Silicon)
- Open Xcode
- File → New → Project
- Choose macOS → App
- Fill in the form:
- Product Name:
PhotoMapApp - Team: None (or your team)
- Organization Identifier:
com.youname(e.g.,com.camerongary) - Interface: SwiftUI
- Language: Swift
- Product Name:
- Click Create and choose where to save
- In Xcode, open the main Swift file (usually in the left sidebar)
- Select all the code (⌘A)
- Delete it
- Download
PhotoMapApp-FINAL-WORKING.swift - Copy all the code from that file (⌘A → ⌘C)
- Paste into Xcode (⌘V)
- Download
AppIcon.svg - In Xcode:
- Click the PhotoMapApp project
- Click the PhotoMapApp target
- Go to App Icons and Launch Screen
- Drag
AppIcon.svginto the AppIcon area - Xcode will automatically generate all required sizes
If you get a "CodeSign failed" error:
- Click PhotoMapApp target
- Click Signing & Capabilities tab
- Uncheck "Automatically manage signing"
- Set Signing Certificate to "Sign to Run Locally"
If the error persists:
- Close Xcode
- Run in Terminal:
rm -rf ~/Library/Developer/Xcode/DerivedData/PhotoMapApp*
- Reopen Xcode and try building again
- Press ⌘B to build (wait for "Build complete!")
- Press ⌘R to run
- The app will launch in a new window
- Click "Select Photo Folder" button in the top-left
- Browse to a folder containing your photos
- Select the folder and click "Open"
- The app will:
- Load all photos in that folder
- Display them in the left sidebar
- Show the count of photos and GPS-tagged photos
- Display highest/lowest elevation
In the List (Left Sidebar):
- Photos are listed with their filenames
- Red map pin icon + coordinates = photo has GPS data
- Orange warning = no GPS data embedded
- Click a photo to view its full details and metadata
In the Detail View:
- Photo thumbnail at the top
- Location data with exact GPS coordinates and elevation
- Camera metadata (make, model, lens, ISO, aperture, etc.)
- "Back to Map" button to return to the map view
- "Analyze" button to detect objects in the photo
- The right panel shows an interactive map
- Red markers = individual photos
- Orange markers = clusters of nearby photos (hover to see count)
- Toggle "Group Nearby" to cluster/uncluster photos
- Zoom in/out with scroll wheel or trackpad
- Pan by clicking and dragging
- Map Info box shows:
- Total number of photos
- Number of clusters
- Selected photo details
- Click a photo in the list or open its detail view
- Click the "Analyze" button
- Wait for the analysis to complete (shows progress indicator)
- See detected objects with confidence scores:
- Green bar = high confidence (>80%)
- Yellow bar = medium confidence (>60%)
- Orange bar = lower confidence (<60%)
- Results reset automatically when you switch to another photo
Each photo detail view shows:
- Filename - the original filename
- Location Data - GPS coordinates, elevation
- Camera Metadata - Make, model, lens, ISO, aperture, shutter speed, date/time
- Detected Objects - results from AI analysis
For better metadata extraction from Olympus RAW files (.orf), install exiftool:
brew install exiftoolThe app will automatically detect and use it if available. Without it, the app falls back to standard EXIF extraction.
To test the app with sample photos:
# Create a test folder
mkdir -p ~/TestPhotos
cd ~/TestPhotos
# Create test images (requires ImageMagick)
brew install imagemagick
magick -size 800x600 xc:blue test1.jpg
magick -size 800x600 xc:red test2.jpg
# Add GPS metadata (requires exiftool)
brew install exiftool
# Add GPS to test1.jpg (Los Angeles)
exiftool -GPSLatitude=34.0522 -GPSLatitudeRef=N \
-GPSLongitude=118.2437 -GPSLongitudeRef=W \
-GPSAltitude=50 test1.jpg
# Add GPS to test2.jpg (San Francisco)
exiftool -GPSLatitude=37.7749 -GPSLatitudeRef=N \
-GPSLongitude=122.4194 -GPSLongitudeRef=W \
-GPSAltitude=52 test2.jpgThen in the app: Select Photo Folder → Choose ~/TestPhotos → See your test photos on the map!
| Format | Extension | Notes |
|---|---|---|
| JPEG | .jpg, .jpeg | Widely supported |
| PNG | .png | Widely supported |
| HEIC | .heic | Apple's modern format |
| RAW | .raw | Generic raw format |
| Olympus RAW | .orf | Best with exiftool installed |
| DNG | .dng | Adobe's raw format |
| Shortcut | Action |
|---|---|
| ⌘B | Build the app |
| ⌘R | Run the app |
| ⌘Q | Quit the app |
| ⌘, | Open Preferences |
Solution:
rm -rf ~/Library/Developer/Xcode/DerivedData/PhotoMapApp*Then reopen Xcode and rebuild.
- Check that the folder contains supported formats (.jpg, .png, .heic, .orf, etc.)
- Ensure you have read permissions for the folder
- Try with the test folder (
~/TestPhotos) first
- Some photos may not have GPS embedded
- Use Preview.app to check: Right-click photo → Get Info → see if GPS is listed
- Create test photos with GPS data (see "Creating Test Data" above)
- Ensure the photo format is supported (JPEG, PNG, HEIC, etc.)
- Try with different photos - some may not have detectable objects
- Works best with clear, well-lit photos
The app runs in development mode from Xcode. To create a production app:
- In Xcode: Product → Archive
- Follow the archiving wizard
- Export to Applications
- Language: Swift
- UI Framework: SwiftUI
- Maps: MapKit
- AI/ML: Vision framework (on-device)
- Metadata: EXIF extraction + exiftool integration
- File System: Foundation framework
- All GPS coordinates are parsed from EXIF data
- Elevation data extracted from GPS EXIF tags
- Object detection runs locally using Apple's Vision framework
- No data is sent to any servers - everything stays on your Mac
- Handles 50-100 photos smoothly
- Larger collections (500+) may need pagination (future enhancement)
- Object detection takes 1-3 seconds per photo depending on image size
- Use high-quality photos - Object detection works better with clear images
- Enable location services on your camera - Ensures GPS data is embedded
- Try different folders - Start with a small set of 5-10 photos to test
- Use recent photos - Modern cameras embed more complete metadata
- Keep geotagged photos in separate folders by trip or date
- Use consistent naming conventions for easy browsing
- Check GPS data before importing with Preview.app
Built with:
- Apple's MapKit for interactive mapping
- Vision framework for on-device AI object detection
- SwiftUI for the beautiful user interface
- exiftool (optional) for enhanced metadata extraction
This app is free to use and modify for personal use.
If you encounter any problems:
- Check the Troubleshooting section above
- Verify all System Requirements are met
- Try rebuilding with a clean derived data folder
- Check that you're using the latest code
Enjoy mapping your photos! 📸🗺️✨