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.
| Key | Type | Meaning |
|---|---|---|
imageID | text | Resolves to <imageID>_rgb.tif, lowercased |
orientation | text | Camera direction. Becomes the set name |
capture_date | text | ISO 8601 timestamp |
camera_pos_x | number | Easting, in UTM zone 31N — see below |
camera_pos_y | number | Northing |
camera_z | number | Height |
footprint_wkt | text | Footprint polygon as WKT, in ETRS89 lon/lat |
omega | number | Radians |
phi | number | Radians |
kappa | number | Radians |
focal_length | number | Millimetres |
pixel_size | number | Millimetres |
raster_size_width | integer | Pixels |
raster_size_height | integer | Pixels |
pp0_x | number | Principal point offset, micrometres |
pp0_y | number | Principal 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_sizeis in millimetres.focal_lengthis 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:
| Field | Source CRS | Destination |
|---|---|---|
camera_pos_x / camera_pos_y / camera_z | EPSG:25831 — ETRS89 / UTM zone 31N, 3D | the dataset's CRS |
footprint_wkt | EPSG:4258 — ETRS89 lon/lat | the 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
.tifis not present underoblique/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#
| Symptom | Cause |
|---|---|
| "json metadata file not found" | No .json directly inside oblique/, or it is nested a level deeper |
| Every photo reported missing | Filenames on disk are not <imageID>_rgb.tif in lowercase |
| Photos misplaced by hundreds of kilometres | The 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 wrongly | The angles were delivered in degrees rather than radians |