Files
giglez/docs/GPS_AUTO_EXTRACTION.md
T
Trilltechnician 04bd80b25b GPS Auto-Extraction + First Successful Upload Complete
Major milestone: GPS coordinates now auto-extract from filenames and
uploads appear on map with full end-to-end workflow functional!

 GPS Auto-Extraction Features:
- JavaScript GPS extractor class matching Python patterns
- Supports 3 filename formats:
  * N/S/E/W: 34.0478N_118.2349W_filename.sub
  * lat/lon prefix: lat34.0478lon-118.2348_filename.sub
  * Signed decimal: -34.0478_118.2348_filename.sub
- Auto-populates latitude/longitude form fields on file drop
- Green notification toast shows detected coordinates
- File list shows GPS badge for files with coordinates

🗺️ Web Interface Improvements:
- Upload endpoint now stores captures in-memory
- Query endpoint returns uploaded captures for map display
- Stats endpoint shows real-time upload counts
- Map displays uploaded captures as markers
- Color-coded by frequency band

📁 Updated Files:
- static/js/upload.js: GPS extraction + auto-population
- src/api/main_simple.py: In-memory storage + endpoints
- src/parser/gps_extractor.py: Backend GPS extraction (Python)
- scripts/test_gps_extraction.py: Python test suite
- test_gps_extraction.html: Browser test suite

📊 T-Embed Files Updated:
- 34.0478N_118.2348W_1637_raw_8.sub: 315 MHz Princeton
- 34.0478N_118.2349W_1351_raw_10.sub: 433.92 MHz Princeton
- 34.0478N_118.2349W_1650_test_raw.sub: 433.92 MHz RAW
- All now have proper Flipper SubGhz headers

 Tested Features:
- GPS extraction from filename: 34.0478N_118.2349W → 34.0478, -118.2349
- Auto-population of GPS fields in upload form
- File upload with GPS validation
- Capture appears on map after upload
- Statistics update in real-time
- Frequency distribution calculated correctly

🎯 End-to-End Flow Working:
1. User drops .sub file with GPS in filename
2. GPS auto-detected and form fields populate
3. User clicks Upload
4. Server parses RF data + GPS coordinates
5. Capture stored in memory
6. Map refreshes and displays new marker
7. Stats update with new counts

🚀 Demo: http://localhost:8000
Upload 34.0478N_118.2349W_1351_raw_10.sub and watch it appear on map!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 18:37:13 -08:00

6.3 KiB

GPS Auto-Extraction from Filenames

Feature Overview

The web interface now automatically detects and extracts GPS coordinates from filenames, eliminating the need for manual coordinate entry when filenames contain location data.

Supported Filename Patterns

1. N/S/E/W Format (Primary)

Pattern: LAT[NS]_LON[EW]

Examples:

  • 34.0478N_118.2348W_1637_raw_8.sub → 34.0478, -118.2348
  • 34.0478N_118.2349W_1351_raw_10.sub → 34.0478, -118.2349
  • 40.7128N_74.0060W_capture.sub → 40.7128, -74.0060

Notes:

  • Most common format from T-Embed RF captures
  • N = positive latitude, S = negative latitude
  • E = positive longitude, W = negative longitude

2. lat/lon Prefix Format

Pattern: latLATlonLON

Examples:

  • lat34.0478lon-118.2348_test.sub → 34.0478, -118.2348
  • lat40.7128lon-74.0060_capture.sub → 40.7128, -74.0060

Notes:

  • Allows signed decimal notation
  • Case-insensitive (LAT/LON also works)

3. Signed Decimal Format

Pattern: LAT_LON (with optional negative signs)

Examples:

  • -34.0478_118.2348_capture.sub → -34.0478, 118.2348
  • 40.7128_-74.0060_test.sub → 40.7128, -74.0060

Notes:

  • Simple signed decimal degrees
  • Less common but supported

How It Works

1. File Upload Detection

When user selects/drops .sub files:

1. Files are added to upload queue
2. First file with GPS coordinates is automatically detected
3. GPS fields are auto-populated
4. User sees notification toast

2. UI Indicators

  • GPS Detection Notification: Green toast shows which file provided coordinates
  • File List Badge: Files with GPS show 📍 GPS badge
  • Coordinate Display: Extracted coordinates appear next to filename

3. Validation

  • Latitude range: -90 to 90
  • Longitude range: -180 to 180
  • Invalid coordinates are rejected
  • Malformed patterns are skipped

User Experience

Upload Flow with GPS in Filename

  1. Drop/Select File: User uploads 34.0478N_118.2348W_capture.sub
  2. Auto-Detection: System extracts GPS (34.0478, -118.2348)
  3. Notification: Green toast appears:
    📍 GPS Auto-Detected!
    From: 34.0478N_118.2348W_capture.sub
    Coordinates: 34.047800, -118.234800
    
  4. Form Population: Latitude and longitude fields auto-fill
  5. Upload: User clicks "Upload Files" (no manual GPS entry needed)

Upload Flow WITHOUT GPS in Filename

  1. Drop/Select File: User uploads raw_7.sub
  2. No Detection: No GPS found in filename
  3. Manual Entry: User must manually enter GPS or use "Use Current Location"
  4. Validation: System checks for valid coordinates before upload

Implementation Details

JavaScript GPS Extractor Class

Location: static/js/upload.js

class GPSFilenameExtractor {
    extract(filename) {
        // Try each pattern in order
        return this.tryNSEW(filename) ||
               this.tryLatLon(filename) ||
               this.trySigned(filename);
    }
}

Pattern Matching

  • PATTERN_NSEW: /(\d+\.?\d*)([NS])_(\d+\.?\d*)([EW])/i
  • PATTERN_LATLON: /lat(-?\d+\.?\d+)lon(-?\d+\.?\d+)/i
  • PATTERN_SIGNED: /(-?\d+\.?\d+)_(-?\d+\.?\d+)/

Auto-Population Logic

function addFiles(files) {
    // Try to extract GPS from first file with coordinates
    if (!autoDetectedGPS) {
        for (const file of files) {
            const coords = gpsExtractor.extract(file.name);
            if (coords) {
                autoDetectedGPS = coords;
                document.getElementById('default-lat').value = coords.latitude.toFixed(6);
                document.getElementById('default-lon').value = coords.longitude.toFixed(6);
                showGPSDetectionNotification(file.name, coords);
                break;
            }
        }
    }
}

Testing

Test Suite

Location: test_gps_extraction.html

Open in browser to verify all patterns:

firefox test_gps_extraction.html
# or
chromium test_gps_extraction.html

Test Coverage

  • N/S/E/W format (3 test cases)
  • lat/lon prefix format
  • Signed decimal format
  • Negative detection (files without GPS)

Python Compatibility

The JavaScript implementation matches the Python GPSFilenameExtractor class:

  • Same pattern support
  • Same validation rules
  • Same coordinate transformation logic

T-Embed RF Compatibility

Tested Files

From signatures/t-embed-rf/:

  • 34.0478N_118.2348W_1637_raw_8.sub → Auto-detected
  • 34.0478N_118.2349W_1351_raw_10.sub → Auto-detected
  • 34.0478N_118.2349W_1650_test_raw.sub → Auto-detected
  • ⏭️ raw_4.sub → Manual entry required
  • ⏭️ raw_5.sub → Manual entry required

Success Rate: 37.5% (3 of 8 files) auto-detected

Error Messages

GPS Required

If no GPS provided (manual or filename):

Please provide GPS coordinates (manually or via filename like: 34.0478N_118.2349W_filename.sub)

GPS Detected but Not Populated

If GPS exists in filename but form is empty:

GPS detected in filename but not populated. Please refresh and try again.

Out of Range

If coordinates exceed valid ranges:

GPS coordinates out of range

Benefits

  1. Faster Uploads: No manual GPS entry for T-Embed captures
  2. Fewer Errors: Eliminates coordinate typos
  3. Better UX: Clear feedback when GPS is detected
  4. Flexible: Still allows manual entry for files without GPS
  5. Compatible: Matches Python backend extraction logic

Future Enhancements

Additional Patterns

  • DMS format: 34d02m52sN_118d14m05sW
  • Compact format: N34.0478W118.2348
  • Plus codes: 8762+MXP_capture.sub

Multi-File GPS

Currently uses first file's GPS for all uploads. Future enhancement:

  • Per-file GPS extraction
  • Mixed batch uploads (some with GPS, some without)
  • GPS override UI per file

Companion JSON

Check for .json files alongside .sub files:

{
    "capture.sub": {
        "latitude": 34.0478,
        "longitude": -118.2348,
        "accuracy": 5.0
    }
}
  • static/js/upload.js - Frontend GPS extraction
  • src/parser/gps_extractor.py - Backend GPS extraction
  • scripts/test_gps_extraction.py - Python test suite
  • test_gps_extraction.html - JavaScript test suite

Summary

GPS auto-extraction is LIVE and working with the format 34.0478N_118.2349W_filename.sub. Users can now simply drag and drop T-Embed captures without manually entering coordinates!