Cyclomedia import
Cyclomedia panoramas as Cyclomedia delivers them: the DataPackage XML and an image folder with the .jpg photos in subfolders named after the first six characters of each image id. Positions and capture times come from the XML, not from a CSV.
Two things are unusual about it: it is configured explicitly rather than by folder scanning, and it reprojects coordinates from the SRID declared in the package.
Configuration#
The folders are not discovered — they are named explicitly when the run is started:
| Variable | Meaning | Example |
|---|---|---|
CYCLOMEDIA_XML_PATHS | Comma-separated XML paths | NL-BVLD-230901.DataPackage.xml,NL-BVLD-230906.DataPackage.xml |
CYCLOMEDIA_JPG_DIRECTORIES | Comma-separated image folders, paired positionally with the XML list | nl-bvld-230901,nl-bvld-230906 |
The two lists must be the same length and are matched by position — the first XML goes with the first directory. A mismatch stops the run immediately.
If you are delivering data rather than running the import, what this means for you is simply: give your GEORIZON contact the XML filenames and the matching image folder names.
Folder layout#
<dataset bucket>/
├── NL-BVLD-230901.DataPackage.xml named by CYCLOMEDIA_XML_PATHS
└── nl-bvld-230901/ named by CYCLOMEDIA_JPG_DIRECTORIES
├── 001234/ first 6 characters of the ImageId
│ └── 001234ab.jpg
└── 005678/
└── 005678cd.jpg
Exactly one level of subfolder is expected under the image directory, and its
name is the first six characters of the ImageId — Cyclomedia's own
bucketing scheme. Each such subfolder becomes one
set.
Images are .jpg.
The DataPackage XML#
Namespace http://www.cyclomedia.com/. One <Recording> per photo:
| Element | Required | Meaning |
|---|---|---|
ImageId | yes | Photo name; the file is <ImageId>.jpg |
RecordedAt/DateTime | yes | Capture time |
SRID | yes | Coordinate system of this recording — see below |
Longitude | yes | X when the SRID is projected |
Latitude | yes | Y when the SRID is projected |
Height | no | Defaults to 2 when absent or xsi:nil |
Orientation | no | Heading; defaults to 0 when absent or xsi:nil |
xsi:nil="true" is handled explicitly for Height and Orientation, so an
empty element is a default rather than an error.
Tilt and roll are always recorded as zero — the format carries no values for them.
Coordinate reference system#
This dataset type reprojects. Four source SRIDs are supported; anything else stops the run.
| Source SRID | Handling |
|---|---|
28992 (RD New) | Used as-is |
7415 (RD New + NAP) | Used as-is |
31370 (Belgian Lambert 72) | Transformed to the dataset's CRS |
4258 (ETRS89) | Promoted to 4937 (3D) so height converts correctly, then transformed |
One transformer is built per package, so a single delivery is assumed to use a single source SRID throughout.
Ingest parameters#
| Key | Required | Default |
|---|---|---|
height_above_ground | no | 2.06 |
Photos are recorded as already anonymised, and are not queued for blurring.
Tolerance#
A <Recording> whose JPG is not present is skipped with a warning and the
run continues. That is more forgiving than most dataset types here — but it also
means a wholesale path mismatch produces a run that "succeeds" with almost
nothing indexed. Check the indexed count against the recording count.
Common failures#
| Symptom | Cause |
|---|---|
| "Number of XML paths and JPG directories must be the same" | The two configured lists have different lengths |
| "SRID … not supported, quitting" | The package uses a source CRS outside the four supported ones |
| Run succeeds but almost nothing indexed | The image folder name or the six-character subfolder layout doesn't match what the XML implies |
| Everything at height 2 m | The XML has no Height values, so the default was used throughout |