AI Infrasolutions panorama
Session-based panorama deliveries. Each session folder at the bucket root becomes one set, named after the folder.
Every row in the CSV must resolve to a real photo — there is no allowance for missing ones. See Tolerance before your first delivery.
Folder layout#
<dataset bucket>/
└── 2025-07-04_vrv-64-n_pr25-bnv-001_<uuid>/ session (one set)
└── panorama_1/
├── Recording.csv exact name, exact case, tab-separated
├── Recording_20250704_065437/
│ └── 04428.jpeg Filename column + `.jpeg`
└── Recording_…
Any folder at the bucket root that directly contains panorama_1/ is one of the sessions — recognised by its contents, not its name.
A date-prefixed folder name is the usual convention, not a requirement: any
root folder that directly contains panorama_1/ is a session. A delivery
with no such folder fails.
Photos live in subfolders of panorama_1/. The subfolder name comes from the
CSV's Directory column, so the two must agree exactly.
Every delivered photo is opened and checked, not just listed:
- Every delivered photo must start with a JPEG marker and end with an end-of-image marker. This catches a file that is not a JPEG whatever its extension says, and the truncated upload — which a size check cannot see, because a truncated file just looks smaller and nothing knows how big it should have been.
Recording.csv#
| Separator | Tab |
| Preamble | None — the header row comes first |
| Columns | Addressed by name, case-insensitively. Order does not matter |
| Extra columns | Unnamed trailing columns are tolerated |
| Decimals | Both . and , accepted |
| Photo names | Joined from the Directory and Filename columns, then .jpeg appended — case-sensitive |
| Which file | Recording.csv directly inside panorama_1/ (exact name, exact case) |
| Column | Type | Meaning |
|---|---|---|
Directory | text | Photo's subfolder, relative to panorama_1/ — joined with Filename to form the path |
Filename | text | Photo name without extension — .jpeg is appended; never .jpg |
X/Long | number | Easting, in the dataset's CRS |
Y/Lat | number | Northing |
Z | number | Height |
Pan | number | Heading, degrees |
Tilt | number | Degrees |
Roll | number | Degrees |
Timestamp | timestamp | GPS Time of capture |
Columns are addressed by name, so order does not matter — but the nine names above must be there. Extra trailing cells (unnamed accuracy columns) are ignored.
Do not re-save the file as comma-separated. A comma-separated file is not read as a slightly different export; every line becomes a single field and the delivery fails on missing columns.
Filename carries no extension. The resolved path is
<Directory>/<Filename>.jpeg, and the extension is always .jpeg — never
.jpg. See Filenames.
Timestamps#
Timestamp is GPS Time seconds since 1980-01-06 (e.g. 1435647298.756574 → 2025-07-04T06:54:40.757Z).
Deliver the recorder's GPS Time seconds. Do not convert to Unix epoch first.
Example#
Directory Filename X/Long Y/Lat Z Pan Tilt Roll Timestamp
Recording_20250704_065437 04428 177394.99911378 471544.14159442 49.778086 8.983611 -1.645189 -0.093183 1435647298.756574
Tolerance#
- Every CSV row must resolve to a delivered photo. One unresolvable row fails the run — but every row is checked first, so one pass reports them all.
- Photos in the delivery that the CSV does not reference are not indexed (noted, not an error).
Every row is still processed and reported before the run exits, so a single pass tells you everything that is wrong rather than one problem at a time.
Practically: export the CSV from the same source that produced the folder, and don't hand-edit either afterwards.
Coordinate reference system#
Nothing is reprojected. X, Y and Z are taken as delivered and stamped with the dataset's 3D SRID. See Coordinates are not reprojected.
Pan is a compass heading (north is 0°, clockwise); Tilt and Roll follow.
See Rotation angles.
Ingest parameters#
| Key | Required | Type | Meaning |
|---|---|---|---|
anonymisation | yes | string — recognised: already_anonymised, auto_anonymise | Compared exactly: already_anonymised marks the photos as already blurred, auto_anonymise queues them for blurring. There is no Ignore — these are street panoramas. |
height_above_ground | yes | number | Camera height above the road surface, in metres. |
What you get back#
- Indexed panorama records with positions and orientations, grouped by session.
- A tilepack (
.tpc) per photo. Omnibase tenants view the JPEG; DZP is not generated at ingest. - Blurred derivatives, if
anonymisationisauto_anonymise.
Common failures#
| Symptom | Cause |
|---|---|
| "no session folders found" / "the delivery has no sessions" | Nothing at the bucket root contains a panorama_1/ folder |
"no Recording.csv directly inside …" | The file is missing, spelled differently, or sits in the session root instead of panorama_1/ |
| Every row reports a missing photo | The CSV is comma-separated rather than tab-separated, or Filename includes the extension |
| Fewer photos indexed than delivered | Photos on disk that the CSV doesn't list are skipped — add rows for them, or remove them |
| Capture times decades out | Timestamp was delivered as Unix epoch instead of GPS seconds |