Documentation menu

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:

VariableMeaningExample
CYCLOMEDIA_XML_PATHSComma-separated XML pathsNL-BVLD-230901.DataPackage.xml,NL-BVLD-230906.DataPackage.xml
CYCLOMEDIA_JPG_DIRECTORIESComma-separated image folders, paired positionally with the XML listnl-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:

ElementRequiredMeaning
ImageIdyesPhoto name; the file is <ImageId>.jpg
RecordedAt/DateTimeyesCapture time
SRIDyesCoordinate system of this recording — see below
LongitudeyesX when the SRID is projected
LatitudeyesY when the SRID is projected
HeightnoDefaults to 2 when absent or xsi:nil
OrientationnoHeading; 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 SRIDHandling
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#

KeyRequiredDefault
height_above_groundno2.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#

SymptomCause
"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 indexedThe image folder name or the six-character subfolder layout doesn't match what the XML implies
Everything at height 2 mThe XML has no Height values, so the default was used throughout