Documentation menu

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#

SeparatorTab
PreambleNone — the header row comes first
ColumnsAddressed by name, case-insensitively. Order does not matter
Extra columnsUnnamed trailing columns are tolerated
DecimalsBoth . and , accepted
Photo namesJoined from the Directory and Filename columns, then .jpeg appended — case-sensitive
Which fileRecording.csv directly inside panorama_1/ (exact name, exact case)
ColumnTypeMeaning
DirectorytextPhoto's subfolder, relative to panorama_1/ — joined with Filename to form the path
FilenametextPhoto name without extension — .jpeg is appended; never .jpg
X/LongnumberEasting, in the dataset's CRS
Y/LatnumberNorthing
ZnumberHeight
PannumberHeading, degrees
TiltnumberDegrees
RollnumberDegrees
TimestamptimestampGPS 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.7565742025-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#

KeyRequiredTypeMeaning
anonymisationyesstring — recognised: already_anonymised, auto_anonymiseCompared 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_groundyesnumberCamera 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 anonymisation is auto_anonymise.

Common failures#

SymptomCause
"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 photoThe CSV is comma-separated rather than tab-separated, or Filename includes the extension
Fewer photos indexed than deliveredPhotos on disk that the CSV doesn't list are skipped — add rows for them, or remove them
Capture times decades outTimestamp was delivered as Unix epoch instead of GPS seconds