Mobile mapping generic
Deliver 360° panorama images, point clouds, or both. Panoramas need JPEG images and one CSV listing each photo's filename, position, orientation and capture time. Point clouds are delivered as LAS or LAZ files.
Prepare your delivery#
- Panoramas: JPEG images and one pose CSV, using the layout below.
- Point clouds: LAS or LAZ files in a point cloud folder.
- Both: include both folders in the same dataset.
Deliver at least one of these. Before submitting for validation, check the dataset's coordinate system and required settings.
Folder layout#
Use this layout for a new delivery. Omit the folder for any data you are not delivering.
<dataset bucket>/
├── panorama/
│ ├── poses.csv one CSV; the filename is your choice
│ └── jpg/
│ ├── PANO_0001.jpg
│ └── PANO_0002.jpg
└── pointcloud/
└── scan_001.laz
Put the CSV directly inside panorama/ and the images directly inside
panorama/jpg/. Do not put them in further subfolders. Deliver complete,
valid JPEG files; an incomplete upload or a different image format renamed
to .jpg fails the delivery.
Point clouds may be in subfolders of pointcloud/. See
Point cloud generic for file requirements,
including checks for incomplete files and LAS Extra Bytes metadata. Here,
point clouds are optional.
Alternative folder names#
Existing deliveries may use these names instead, in the order shown:
| Content | Accepted folders, in priority order |
|---|---|
| Panoramas | panorama/, ingest/Panorama1/, Panorama1/ |
| Point clouds | pointcloud/, Pointcloud/, ingest/Pointcloud/ |
Use only one folder for each kind of content. For panoramas, the first folder containing any file is used. For point clouds, the first folder containing LAS or LAZ files is used. Files in later folders are not included.
Each panorama layout needs a CSV directly in the chosen folder and a jpg/
subfolder containing the images. A missing CSV fails the delivery. A missing
or empty jpg/ subfolder leaves the panoramas out; another panorama folder
is not used as a fallback.
Coordinate reference system#
Supply data in the coordinate system configured for the dataset. Coordinates are used as delivered; they are not reprojected automatically.
- Photo positions (
x,y,z) must use the dataset's 3D CRS. - Point clouds must use the same horizontal system and vertical datum as the photo positions. Their boundaries use the dataset's 2D CRS.
zis the absolute height in that CRS, not the camera's height above the road or ground.
For example, with EPSG:7415, x and y are RD coordinates in metres and z
is height in metres relative to NAP. Camera height above ground is a
separate dataset setting.
See Coordinates for more background.
The pose CSV#
Create one UTF-8, comma-separated CSV with a header row, followed by one row per photo. For example:
filename,x,y,z,heading,pitch,roll,timestamp
PANO_0001.jpg,182518.396,477934.743,37.326,0.0,0.0,0.0,2025-12-13T15:09:06.704Z
PANO_0002.jpg,182519.204,477936.881,37.341,1.4,0.1,-0.2,2025-12-13T15:09:08.113Z
Keep the columns in this order. Header names may differ (for example,
heading is also called pan), but changing a header does not change the
meaning of its column. Always include the header, or the first photo will
be left out.
| Column | Field | Meaning |
|---|---|---|
| 1 | filename | Photo filename — resolved against the real jpg/ listing; see filename matching |
| 2 | x | Easting, in the dataset's CRS |
| 3 | y | Northing |
| 4 | z | Height |
| 5 | pan | Heading (also called pan), in degrees; see the angle conventions below |
| 6 | tilt | Pitch (also called tilt), in degrees |
| 7 | roll | Roll, degrees |
| 8 | timestamp | Capture time |
| 9 | floor (optional) | Floor label, e.g. B1 or Ground; leave blank for a photo not on a floor. At most 64 characters |
Use a decimal point as in the example. Decimal commas are also accepted, but a value containing a comma must be enclosed in double quotes so it stays in one CSV column.
Deliver only these columns. Positions after the optional floor column
are reserved for future fields. Include exactly one CSV in the panorama
folder; CSVs in subfolders are not used.
Filename matching#
Use the photo's filename, including .jpg or .jpeg, in the first column.
Names are case-sensitive: PANO_0001.jpg and pano_0001.jpg do not match.
Only images directly inside jpg/ are included.
Filenames without an extension are also accepted: .jpg is tried first,
then .jpeg. If an extension is supplied, it must match the delivered file.
Timestamps#
Use a capture time with an explicit timezone where possible, such as
2025-12-13T15:09:06.704Z. The Z means UTC. An explicit offset such as
+01:00 is also accepted.
Accepted timestamp formats are listed below. In the date formats,
[.fff] means optional fractional seconds.
- epoch seconds (whole or fractional)
- RFC 3339 (
2026-05-07T09:18:00Z) YYYY-MM-DD HH:MM:SS[.fff](read as UTC)YYYY-MM-DDTHH:MM:SS[.fff](read as UTC)YYYY/MM/DD HH:MM:SS[.fff](read as UTC)DD-MM-YYYY HH:MM:SS[.fff](read as Dutch local time, Europe/Amsterdam)YYYY-MM-DD(UTC midnight)
Epoch seconds means Unix time, counted from 1970-01-01 UTC, not GPS Time
or milliseconds. Date-time formats without a timezone use UTC, except
DD-MM-YYYY HH:MM:SS, which uses Dutch local time (Europe/Amsterdam, CET
or CEST depending on the date).
If you also deliver point clouds, check that photo and scanner capture times agree. This matters for measurements in panoramas.
Heading, pitch and roll#
Deliver all three angles in degrees. They describe the centre of the panorama: the middle column of the equirectangular image.
| Angle | Zero | Positive direction |
|---|---|---|
heading (pan) | The image centre faces grid north in the dataset's CRS | Clockwise: 90 faces east |
pitch (tilt) | The image centre is level | The image centre looks up |
roll | The horizon is level | The right-hand side dips: clockwise, seen from behind |
Check the roll sign before submitting for validation. A wrong sign can pass the delivery checks but leave the panoramas tilted in the viewer.
Data from Orbit and CoPre: use Orbit mobile mapping
for an Orbit generic traject file, which uses the opposite roll sign.
For a CHCNAV CoPre *_OrbitPos.txt file, arrange the values in the CSV
layout above, copy Pan and Tilt unchanged, and negate Roll.
Floors (optional)#
For indoor imagery, add a floor label as the ninth column:
filename,x,y,z,heading,pitch,roll,timestamp,floor
PANO_0001.jpg,182518.396,477934.743,37.326,0.0,0.0,0.0,2025-12-13T15:09:06.704Z,Ground
PANO_0002.jpg,182519.204,477936.881,41.012,1.4,0.1,-0.2,2025-12-13T15:09:08.113Z,1
Use consistent labels: B1 and b1 appear as different floors in the
viewer's floor menu. Labels may contain up to 64 characters. Leave the
cell blank, or omit the ninth column, for a photo without a floor.
Dataset settings#
Set camera height above ground and anonymisation on the dataset before submitting the delivery. Both settings are required for this dataset type, including when you deliver point clouds only.
| Setting | Required | What to choose |
|---|---|---|
anonymisation | yes | Choose already_anonymised if faces and number plates are already blurred, or auto_anonymise to have Georizon blur them. |
height_above_ground | yes | Camera height above the road surface, in metres. |
set_name | no | A name for the group of photos in the viewer, such as a capture run. Default: 1. |
tile_pointclouds | no | Enable to organise point clouds into 100 m grid tiles. Leave unset if you do not need a grid layout. |
Camera height above ground is in metres; for example, enter 2.3 for a
camera mounted 2.3 m above the road. It does not replace the absolute z
coordinate in the CSV.
Missing and unlisted photos#
Aim to deliver every photo listed in the CSV. The following allowance is for missing files; a corrupt JPEG that is present still fails the delivery.
- Up to 10 % of a recording's CSV rows may reference missing photos. Beyond that the run fails, naming the recording.
- Photos in the delivery that the CSV does not reference are not indexed (noted, not an error).
Measurements in panoramas#
When you deliver panoramas and point clouds together, the point cloud can provide depth for measurements in the panoramas. There is no extra depth file to upload. Coverage, coordinates and capture times must agree; see Depth for the matching requirements.
Before submitting#
- Confirm the dataset's CRS matches the coordinates and heights you supply.
- Check filenames, including capitalisation, against the CSV.
- Include the CSV header and keep the documented column order.
- Check angle conventions and timestamp timezones.
- Finish all uploads and set the two required dataset settings.
Troubleshooting#
| Problem | What to check |
|---|---|
| “The delivery has no panorama or pointcloud content” | Use one of the accepted folder layouts and include panoramas, point clouds, or both. |
| “No CSV file found under …” | Put one CSV directly in the panorama folder, alongside jpg/. |
| Panoramas are missing | Check that jpg/ contains the images and that an earlier alternative panorama folder has not been left in the delivery. |
| The first photo is missing | Add a header row before the first photo row. |
| A required setting is missing | Set both height_above_ground and anonymisation on the dataset. |
| Too many photos are reported missing | Match filename case and extensions, and put images directly inside jpg/. |
| Images are in the wrong place or at the wrong height | Check the dataset's CRS and vertical datum against the supplied data. |
| Panoramas look tilted | Check pitch and roll signs against the angle table. |
| Panoramas have no measurement depth | Check point cloud coverage, coordinate systems and capture times. |