Ga naar inhoud

Verwerking en bewaking

Nadat invoerbestanden zijn geüpload, kan het platform verwerkte uitvoer genereren (gestandaardiseerde puntenwolken, mesh-HLOD’s, photospheres, enzovoort). Deze gids legt uit hoe u verwerkingsopties opsomt, verwerking start en de voortgang pollt totdat elke uitvoer een eindtoestand bereikt.

Er wordt van uitgegaan dat u een bundle met ten minste één voltooide uploadsessie hebt en de read:bundle- en write:bundle-scopes hebt.


Verwerking is fire-and-forget: de API zet een verwerkingstaak in de wachtrij en retourneert onmiddellijk.

sequenceDiagram
  participant Client as Client
  participant RCAPI as RCAPI

  Client->>RCAPI: GET processing/options
  RCAPI-->>Client: options + metadata

  Client->>RCAPI: POST processing
  RCAPI-->>Client: accepted or typed error

  loop until all terminal
    Client->>RCAPI: GET bundle/processings
    RCAPI-->>Client: processing records (status, progress)
  end
MethodePadScopeDoel
GET/v1/bundles/{bundleId}/processing/optionsread:bundleMogelijke uitvoertypen en hun metadata opsommen
POST/v1/bundles/{bundleId}/processingwrite:bundleVerwerking voor gevraagde uitvoer starten
GET/v1/bundles/{bundleId}/processingsread:bundleDe verwerkingsrecords van de bundle opsommen om de voortgang te pollen
GET/v1/site/{siteId}/bundles/{bundleId}read:hierarchyDe bundle met zijn verwerkte uitvoercomponenten (ondertekende links) ophalen

Ontdek vóór het starten welke uitvoer de bundle kan produceren en hoeveel elke kost.

GET {api_url}/v1/bundles/{bundleId}/processing/options?page=1&limit=20&sortBy=type&sortDir=ASC
Authorization: Bearer {access_token}
ParameterTypeBeschrijving
pagenumber1-gebaseerde pagina-index (standaard 1)
limitnumberPaginagrootte (standaard 20, maximum 20)
sortBystringtype of cost (standaard type)
sortDirstringASC of DESC (standaard ASC)

De response is een gepagineerde lijst ({ items, total }). Elke optie beschrijft één uitvoertype:

VeldBetekenis
typeUitvoercomponenttype dat u meegeeft bij het starten van de verwerking (bijv. StandardizedPointCloud, OgcPointCloudHlod)
hasProcessingtrue wanneer er al een verwerking voor deze uitvoer is gestart
costVerwerkingskosten in bytes voor betaalde uitvoer; 0 voor free-tier-uitvoer

Voorbeeld:

{
"items": [
{
"type": "StandardizedPointCloud",
"hasProcessing": false,
"cost": 734003200
},
{
"type": "OgcPointCloudHlod",
"hasProcessing": false,
"cost": 734003200
}
],
"total": 2
}

Sla uitvoer over waar hasProcessing true is, tenzij u van plan bent opnieuw te verwerken.

Geef de lijst met uitvoercomponenttypen die u door de pijplijn wilt laten produceren mee, plus een cost-veld dat de totale verwerkingskosten erkent. De server telt de cost-waarden uit stap 1 op voor elk type in requestedComponents en wijst het verzoek af wanneer uw erkenning niet overeenkomt.

Verwerking start asynchroon zodra de kosten zijn geaccepteerd.

POST {api_url}/v1/bundles/{bundleId}/processing
Authorization: Bearer {access_token}
Content-Type: application/json
{
"requestedComponents": [
"StandardizedPointCloud",
"OgcPointCloudHlod"
],
"cost": 1468006400
}

In het bovenstaande voorbeeld is cost 734003200 + 734003200 uit de optielijst van stap 1.

204 No Content: Verwerking is geaccepteerd en in de wachtrij geplaatst.

Wanneer verwerking niet kan worden gestart, retourneert de API 409 Conflict met een getypeerde error:

error-waardeBetekenis
ProcessingCostMismatchDe ingediende cost komt niet overeen met het berekende totaal voor de gevraagde uitvoer
InsufficientProcessingCapacityDe verwerkingslimiet van de organisatie zou worden overschreden
NoInputDataFoundForProcessingEr zijn geen voltooide invoerbestanden beschikbaar op de bundle
FailedToLaunchProcessingPijplijnindiening is mislukt om een onverwachte reden

Voorbeeld:

{
"error": "ProcessingCostMismatch"
}

Structurele validatie van de geüploade batch (verplichte typen, extensies, afhankelijkheden) wordt na het starten afgedwongen door de verwerkingspijplijn. Als uw uploadsessie is voltooid maar het requirements-contract heeft geschonden, kan de verwerking later mislukken, ook al is elk bestand succesvol geüpload en heeft de startaanroep 204 geretourneerd.

Poll na een succesvolle start de verwerkingsrecords van de bundle totdat elk een eindtoestand bereikt.

GET {api_url}/v1/bundles/{bundleId}/processings
Authorization: Bearer {access_token}

De response is een lijst ({ items, total }) met elk verwerkingsrecord voor de bundle. Er zijn geen queryparameters; alle records worden in één aanroep geretourneerd.

Elk item volgt één verwerkingstaak:

VeldBetekenis
idIdentifier van het verwerkingsrecord
statusPijplijnstatus (zie onderstaande tabel)
progressVoltooiingspercentage (0100) tijdens de activiteit
createdAtWanneer de taak is gemaakt
updatedAtWanneer de taak voor het laatst van toestand is veranderd
launchedByIdId van de gebruiker die de taak heeft gestart, of null
knownErrorsGestructureerde fouten, elk met een errorCode en de betrokken errorFilepaths (null wanneer niet bestandsspecifiek)
StatusEindtoestand?Betekenis
PendingneeIn de wachtrij, nog niet gestart
ProcessingneePijplijn draait
RestartedneeTaak is opnieuw gestart en draait weer
ReadyjaUitvoer succesvol geproduceerd
FailedjaOngestructureerde pijplijnfout
FailedToLaunchjaTaak is nooit in de pijplijn terechtgekomen
KnownErrorjaGestructureerde validatie- of formaatfout

Poll totdat elk record zich in een eindtoestand bevindt (Ready, Failed, FailedToLaunch of KnownError).

Voorbeeld van een response tijdens de uitvoering:

{
"items": [
{
"id": "3f2b1c4d-8e7a-4b2c-9d1e-0a1b3c4d4e6f",
"status": "Processing",
"progress": 42,
"createdAt": "2026-06-01T14:05:00Z",
"updatedAt": "2026-06-01T14:12:00Z",
"launchedById": "b1a2c3d4-5e6f-7a8b-9c0d-1e2f3a2b2c1d",
"knownErrors": []
},
{
"id": "9c0d1e2f-3a4b-5c6d-7e8f-9a0b2c3d3e4f",
"status": "Pending",
"progress": 0,
"createdAt": "2026-06-01T14:05:00Z",
"updatedAt": "2026-06-01T14:05:00Z",
"launchedById": "b1a2c3d4-5e6f-7a8b-9c0d-1e2f3a3b1c1d",
"knownErrors": []
}
],
"total": 2
}

Voorbeeld met een bekende fout:

{
"items": [
{
"id": "3f2b1c4d-8e7a-4b2c-9d1e-0a2b3c4d4e5f",
"status": "KnownError",
"progress": 100,
"createdAt": "2026-06-01T14:05:00Z",
"updatedAt": "2026-06-01T14:48:00Z",
"launchedById": "b1a2c3d4-5e6f-7a8b-1c0d-2e6f3a4b5c6d",
"knownErrors": [
{
"errorCode": "MissingTrajectory",
"errorFilepaths": ["scan.las"]
}
]
}
],
"total": 1
}

De verwerkingslijst bevat niet het uitvoer-type per record. Om voltooide uitvoer terug te koppelen aan hun componenttypen en ondertekende links, haalt u de componenten van de bundle op (zie Verwerkte uitvoer ophalen).

  • Interval: 1-5 minuten is een redelijke standaard. Verwerking kan meerdere minuten tot enkele uren duren, afhankelijk van de invoergrootte.
  • Rate limits: de bundle-endpoints delen een rate-limit-bucket met meerdere andere endpoints. Vermijd pollen onder de minuut.

Zodra een verwerkingsrecord Ready bereikt, haalt u de bundle op om de uitvoercomponenten en hun ondertekende downloadlinks te verkrijgen. Bundledetails bevinden zich op het hiërarchie-endpoint:

GET {api_url}/v1/site/{siteId}/bundles/{bundleId}
Authorization: Bearer {access_token}

Dit endpoint vereist de read:hierarchy-scope en retourneert de bundle met zijn components-array:

VeldBetekenis
idBundle-id
nameBundlenaam
componentsEén vermelding per beschikbare component (invoer en verwerkte uitvoer)

Elke component bevat:

VeldBetekenis
idComponent-id
typeComponenttype, bijv. StandardizedPointCloud, OgcPointCloudHlod
versionComponentversie
signedLinkOndertekende URL om de component te downloaden; geen auth-header vereist
rootsToegangspuntpaden binnen de component, indien van toepassing

Voorbeeld:

{
"id": "a6f75b3c-f261-4b27-9a2a-9a6cc4178a13",
"name": "ZF capture 2026-06-01",
"components": [
{
"id": "5d6e7f8a-9b0c-1d2e-3f4a-1b3c7d4e8f0a",
"type": "StandardizedPointCloud",
"version": "1",
"signedLink": "https://cdn…/components/…?X-Amz-…"
}
]
}

Een RealityPlan-project stelt dezelfde bundle beschikbaar via GET /v1/reality-plan/{projectId}/bundles/{bundleId} (scope read:twin).

import time
import requests
API_URL = "https://<your-regional-api-url>"
TOKEN = "<access_token>"
BUNDLE_ID = "<bundleId>"
headers = {"Authorization": f"Bearer {TOKEN}"}
base = f"{API_URL}/v1/bundles/{BUNDLE_ID}"
# 1. Discover outputs.
options = requests.get(
f"{base}/processing/options",
headers=headers,
params={"page": 1, "limit": 20},
).json()
options_by_type = {item["type"]: item for item in options["items"]}
to_process = [
item["type"]
for item in options["items"]
if not item["hasProcessing"]
]
total_cost = sum(options_by_type[t]["cost"] for t in to_process)
print(f"Launching: {to_process} (cost: {total_cost})")
# 2. Start processing.
response = requests.post(
f"{base}/processing",
headers=headers,
json={"requestedComponents": to_process, "cost": total_cost},
)
if response.status_code == 409:
raise RuntimeError(
f"Processing failed to start: {response.json().get('error')}"
)
response.raise_for_status() # expect 204
# 3. Poll until every job is terminal.
TERMINAL = {"Ready", "Failed", "FailedToLaunch", "KnownError"}
POLL_SECONDS = 15
TIMEOUT_SECONDS = 3600
deadline = time.time() + TIMEOUT_SECONDS
while time.time() < deadline:
listing = requests.get(
f"{base}/processings",
headers=headers,
).json()
processings = listing.get("items", [])
for p in processings:
print(f" {p['id']}: {p['status']} ({p['progress']}%)")
if processings and all(p["status"] in TERMINAL for p in processings):
break
time.sleep(POLL_SECONDS)
else:
raise TimeoutError("Processing did not finish within the timeout")

Om de ruwe invoerbestanden op te halen die zijn geüpload (voor archivering, herverwerking of audit), zie Invoerbestanden downloaden.