Inspection photos
Pipe and duct inspection runs: a sequence of camera frames along a streng (section), positioned by a GeoJSON of measurement points. One folder per inspection, each indexed as its own set.
Folder layout#
<dataset bucket>/
└── ingest/
├── 20260612_streng_A/ one folder per inspection; the folder
│ ├── inspection.geojson name becomes the set name
│ └── frames/
│ ├── 000001.png
│ └── 000002.png
└── 20260612_streng_B/
├── inspection.geojson
└── frames/
└── 000001.png
Every directory directly inside ingest/ is treated as one inspection. Loose
files at that level are ignored. There is no naming convention for the folder —
whatever you call it is what appears as the set name, so make it meaningful.
Inside each inspection folder:
| GeoJSON | The first *.geojson found. Any filename |
| Frames | frames/*.png. PNG only — other formats are not seen |
An inspection folder missing its GeoJSON, or whose GeoJSON has no usable features, is skipped with a note rather than failing the run. That makes a half-delivered batch index quietly and partially, so check the set count after the first run.
The GeoJSON#
One file describes the whole inspection. Features are told apart by a
feature_type property, and exactly two kinds are read.
feature_type = "streng"#
One feature describing the section as a whole. Only the first one is used.
| Property | Type | Meaning |
|---|---|---|
datum_inspectie | text | Inspection date. Day-first — 12-06-2026 is 12 June |
Every frame's capture time is this date plus its own offset, so getting the day-first reading wrong shifts a whole inspection.
If there is no streng feature, the inspection is skipped.
feature_type = "meetpunt"#
One feature per camera frame. Processed in frame order.
| Property | Type | Meaning |
|---|---|---|
frame | number | Sequence number — used for ordering |
frame_pad | text | Path to the frame image, relative to the inspection folder |
rd_x | number | Easting, in the dataset's CRS |
rd_y | number | Northing |
z_nap_m | number | Height |
heading_deg | number | Camera heading, degrees |
tijdstip_sec | number | Seconds from the start of the inspection |
If there are no meetpunt features, the inspection is skipped.
Frame resolution#
frame_pad does double duty, and the two uses differ:
- Existence is checked on the last path segment only, against the real
listing of
frames/. - The stored path is the whole
frame_pad, appended to the inspection folder.
So write frames/000001.png — the true path relative to the inspection folder.
A value like foo/bar/000001.png passes the existence check on its basename and
then indexes a path that does not resolve, producing frames that are listed but
cannot be opened.
The filename must be spelled identically and end in .png. A meetpunt whose
frame is missing is skipped with a note; there is no percentage limit.
Camera geometry#
Inspection cameras are fixed-specification, so nothing is delivered or configured for them — the values are the same for every frame:
| Focal length | 12 mm |
| Pixel size | 6 µm |
| Frame size | 720 × 576 px |
| Principal point offset | 0, 0 |
Each frame gets a small square footprint centred on its measurement point. Its size is derived from the median spacing between consecutive points in the run, so a densely-sampled inspection draws small footprints and a sparse one draws larger ones, with a 0.1 m floor. Nothing to configure.
Coordinate reference system#
Nothing is reprojected. rd_x, rd_y and z_nap_m are taken as delivered
and stamped with the dataset's SRID. The GeoJSON's own crs member, if present,
is not read. See Coordinates are not reprojected.
Despite the property names, nothing forces RD/NAP — the values go in as whatever the dataset is configured for.
Ingest parameters#
None. This template runs on a dataset with an empty parameter set, and
set_name is not read — the inspection folder name is always the set.
What you get back#
One indexed frame per resolved meetpunt, in a set named after its inspection
folder, with a position, a footprint, a capture time and the fixed camera
geometry above.
Common failures#
| Symptom | Cause |
|---|---|
| An inspection missing entirely | No *.geojson in its folder, or no streng / meetpunt features in it |
| Nothing indexed at all | The inspection folders are at the bucket root rather than under ingest/ |
| Capture times months out | datum_inspectie was written month-first — it is read day-first |
| Frames missing | The images are not .png, or not directly inside frames/ |
| Footprints far too large | The run has only a couple of measurement points, so the median spacing is large |