Neatbo.

Photo GPS to GPX

Export every supported local JPEG GPS position in explicit UTC order, with originals, source records and complete GPX/JSON/CSV ZIP.

Browser-local processingInputOriginal baseline JPEG with Exif GPS 2.3/2.4 and explicit GPS UTCOutputGPX 1.1, complete JSON/CSV and every original in a ZIPUp to 10 MiB per file · File limit: 500
  1. 1Add input
  2. 2Adjust settings
  3. 3Get your result

Tool input and files are processed in this browser without being uploaded.

Your input

Inputs are kept temporarily in this tab when switching tools. Refreshing or closing clears them; large results may need to be regenerated.

⌘ / Ctrl + Enter to run

or drag and drop them here

Files stay on this device. Your originals stay unchanged.

.jpg · .jpeg

Up to 10 MiB per file · File limit: 500

    Options

    Complete the required options first. You can keep the defaults for the rest.

    Split only when the adjacent UTC gap is strictly greater; unused in waypoint mode.

    Only for an absent GPS datum; a declared other datum always refuses.

    Preparing the tool…

    Before you start

    Turn the embedded GPS positions in original trip photos into a sparse GPX track or waypoint set. Keep every source photo and audit exact GPS UTC ordering, equal-time ambiguity and coordinate provenance.

    How to use this tool

    1. Choose all original JPEG photos for the trip.
    2. Select track or waypoints, set the track gap threshold and confirm WGS84 only if you know the missing datum.
    3. Run and inspect every UTC, source index, coordinate and ambiguity row.
    4. Download the ZIP; open GPX in a compatible reader and use JSON plus originals to audit provenance.

    Supported inputs and limits

    1–500 original JPEGs, 10 MiB each and 100 MiB total. Filename labels allow up to 512 UTF-8 bytes; the operating-system file picker may impose a shorter basename limit.

    Baseline 8-bit SOF0 with one interleaved scan and terminal EOI; one Exif APP1 with classic little- or big-endian TIFF and GPS version 2.3/2.4. Progressive JPEG, BigTIFF, multiple-image MPF, JUMBF/APP11, XMP, trailers and unsupported structures refuse the whole queue.

    Per photo: at most 4096 JPEG markers, 4 IFD directories, 512 entries per directory and 1024 entries. The entire queue allows 100000 IFD entries. Unknown GPS tags, aliased/cyclic directories, overlapping structures, malformed values or required missing fields fail atomically.

    GPSDateStamp and GPSTimeStamp must explicitly provide Gregorian UTC in years 0001–9999. Hours/minutes are integers and seconds must be exact to at most 9 decimal places. No local-clock, camera-time, filename or file-time fallback; leap seconds and recurring fractions are unsupported.

    Declared WGS-84/WGS84 is supported. A missing datum requires your explicit WGS84 assumption; a declared different datum is always refused. Source rational coordinates remain exact in JSON; GPX decimals truncate toward zero to 12 places. Exact +180° longitude is represented as −180° with an equivalence flag.

    Every photo becomes one point. Exact UTC sorts the points; equal timestamps retain selection order and are marked ambiguous. Track segments split only when an adjacent time gap is strictly greater than the selected 0–86400-second threshold; waypoint mode has no track segments.

    These are sparse photo positions, not a measured continuous route. No road matching, interpolation, geocoding or GPX elevation is added. Original altitude/ref/version and every present GPS field type, count, source span and SHA256 are retained; critical fields also have raw hex. For a GPS field with rawHex:null, read the original JPEG at the report’s absolute valueOffset for byteLength bytes; its SHA256 identifies those exact raw bytes.

    The screen lists every point and copies a bounded scalar summary. Download photo-gps-package.zip for all original JPEG bytes, photo-points.gpx, complete photo-points.json and formula-safe quote-all photo-points.csv. CSV text is apostrophe-prefixed; JSON and original bytes preserve exact text.

    Protective output guards are GPX 4 MiB, JSON 8 MiB, CSV 8 MiB and stored ZIP 128 MiB; stricter input budgets dominate them. No photo is silently skipped and no partial package is returned on refusal or cancellation.

    Processing stays in this browser; no files, names or coordinates are uploaded. The parser checks bounded JPEG/Exif structure without decoding pixels or certifying source GPS accuracy, complete JPEG/Exif conformance or device compatibility.

    Worked example

    Example input

    An authored 934-byte baseline JPEG named little-endian.jpg with declared WGS-84 and explicit GPS UTC 2026-10-08T12:34:56.7890123Z.
    Example options
    Track; split only above 3600 seconds; missing-datum assumption off.

    Example output

    1 sourced point at 31.220083333333, 121.482416666666; a 410-byte GPX, 1 segment and 4 complete ZIP members.

    When something does not work

    Any unsupported, malformed, missing-field or over-budget photo stops the entire queue. Choose supported originals or correct the source before retrying. Cancellation discards unfinished output; rerun the same selected files.

    Frequently asked questions

    Can you infer time from the camera clock or filename?

    No. GPS UTC date and time must be embedded explicitly. Inferring local timezone or missing capture time could put a photo in the wrong order.

    Does the connecting line show where I walked?

    Only photo positions are known. Track connections and time-gap segments do not establish the path taken between photos; use waypoint mode when connections would mislead.

    Why is a valid photograph unsupported?

    The tool deliberately accepts a finite baseline JPEG/Exif GPS profile. A progressive JPEG or valid transformed, future or reserved structure can fall outside it; no source is silently dropped.

    Documentation & further reading

    Related tools