Documentation menu

Vexcel oblique

Vexcel oblique aerial deliveries. Everything about the imagery — camera calibration, orientation, footprint, capture time — comes from one JSON file, so there is no CSV and no shapefile.

Photos are indexed per camera orientation; each becomes its own set.

Folder layout#

<dataset bucket>/
└── oblique/
    ├── metadata.json          exactly one .json, any name
    └── tif/
        ├── 000123456_rgb.tif  lowercase filenames
        └── 000123457_rgb.tif

The JSON is found by glob, so its name is free — but there must be exactly one .json directly inside oblique/. If none is found, the run fails.

Image filenames are built as <imageID>_rgb.tif, lowercased. If your imageID values contain uppercase characters, the files on disk must be lowercase or they will not be found.

The metadata JSON#

A JSON array of objects, one per photo.

KeyTypeMeaning
imageIDtextResolves to <imageID>_rgb.tif, lowercased
orientationtextCamera direction. Becomes the set name
capture_datetextISO 8601 timestamp
camera_pos_xnumberEasting, in UTM zone 31N — see below
camera_pos_ynumberNorthing
camera_znumberHeight
footprint_wkttextFootprint polygon as WKT, in ETRS89 lon/lat
omeganumberRadians
phinumberRadians
kappanumberRadians
focal_lengthnumberMillimetres
pixel_sizenumberMillimetres
raster_size_widthintegerPixels
raster_size_heightintegerPixels
pp0_xnumberPrincipal point offset, micrometres
pp0_ynumberPrincipal point offset, micrometres

Three unit conventions here are unique to this template and worth repeating:

  • Angles are radians, not degrees. Every other template on this site takes degrees.
  • pixel_size is in millimetres. focal_length is millimetres too.
  • Positions and footprints are in different CRSs — see below.

Example#

[
  {
    "imageID": "000123456",
    "orientation": "forward",
    "capture_date": "2026-03-25T11:42:07",
    "camera_pos_x": 588430.12,
    "camera_pos_y": 5751022.87,
    "camera_z": 1043.55,
    "footprint_wkt": "POLYGON((4.8901 52.3731, 4.8975 52.3731, ...))",
    "omega": 0.00735,
    "phi": -0.00206,
    "kappa": 1.52251,
    "focal_length": 100.5,
    "pixel_size": 0.0046,
    "raster_size_width": 14192,
    "raster_size_height": 10640,
    "pp0_x": 12.4,
    "pp0_y": -3.1
  }
]

Coordinate reference system#

Unusually, this template does reproject — and it applies two different source CRSs within the same record:

FieldSource CRSDestination
camera_pos_x / camera_pos_y / camera_zEPSG:25831 — ETRS89 / UTM zone 31N, 3Dthe dataset's CRS
footprint_wktEPSG:4258 — ETRS89 lon/latthe dataset's CRS

Both source CRSs are fixed and cannot be configured. A delivery in any other projection will be silently misplaced rather than rejected, because a plausible coordinate is indistinguishable from a correct one. Confirm the projection with the supplier before the first run and check the result on a map.

This is an exception to the general rule; see Coordinates are not reprojected.

Tolerance#

  • A record whose .tif is not present under oblique/tif/skipped, with a note. No percentage limit.
  • Images on disk that the JSON does not list → not indexed, and not reported.

Neither condition fails the run, so a delivery whose JSON and images disagree indexes quietly and partially. Compare the indexed count against your record count after the first run.

Ingest parameters#

None. This template runs on a dataset with an empty parameter set, and the set name always comes from each record's orientation.

What you get back#

Indexed oblique photos, one set per camera orientation, each with its reprojected footprint, reprojected camera position, orientation angles and full camera calibration.

The .tif files themselves are not moved or converted — they are served from where you delivered them.

Common failures#

SymptomCause
"json metadata file not found"No .json directly inside oblique/, or it is nested a level deeper
Every photo reported missingFilenames on disk are not <imageID>_rgb.tif in lowercase
Photos misplaced by hundreds of kilometresThe delivery is not in UTM zone 31N / ETRS89 — both source CRSs are fixed
Footprints correct, cameras wrong (or vice versa)The two fields use different source CRSs; only one of them matched
Photos rotated wronglyThe angles were delivered in degrees rather than radians