Schnellstart: einen Raum mit cURL steuern
Dies ist die „gib mir einfach die Befehle“-Anleitung, um alles in einem Raum über HTTP mit einem
raumbezogenen Token (cmap_…) zu erledigen — ohne Browsersitzung, ohne Benutzeranmeldung. Die
vollständige Endpunktliste steht in der Referenz.
1. Ein Token besorgen
Abschnitt betitelt „1. Ein Token besorgen“Stellen Sie ein Token als Raumeigentümer aus — in der App (Meine Räume → Schaltfläche API auf der Raumkarte) oder über HTTP mit Ihrem Eigentümer-JWT. Einzelheiten unter Raum-API-Tokens.
curl -X POST "$API/api/rooms/$ROOM/api-tokens" \ -H "Authorization: Bearer $JWT" -H "Content-Type: application/json" \ -d '{"name":"my-script","permissions":["read","write","upload"],"expiresInDays":30}'# → { "token": "cmap_…", "id": "…" }2. Die Shell einrichten
Abschnitt betitelt „2. Die Shell einrichten“export API=https://collmap.com # production (use http://localhost:3001 for local dev)export ROOM=aB3dEfGhIj # the 10-char room id — it's in the map URL: /map/<ROOM>export TOKEN=cmap_xxxxxxxxxxxx # your room tokenAUTH="Authorization: Bearer $TOKEN"(Die Beispiele leiten zur besseren Lesbarkeit durch jq — optional.)
3. Kurzer Funktionstest
Abschnitt betitelt „3. Kurzer Funktionstest“curl -s "$API/api/rooms/$ROOM" -H "$AUTH" | jq . # → room metadata (200) for a read token- 200 → alles verdrahtet.
- 403 „API token is not scoped to this room“ →
$ROOMpasst nicht zum Raum des Tokens. - 403 „API token lacks ‘read’ permission“ → neu ausstellen,
readeinschließen.
4. Daten in den Raum schreiben
Abschnitt betitelt „4. Daten in den Raum schreiben“Eine Vektorebene hochladen upload
Abschnitt betitelt „Eine Vektorebene hochladen “GeoJSON, gezipptes Shapefile oder GeoPackage. Größere Vektorverarbeitung läuft asynchron → Sie
bekommen eine jobId.
curl -X POST "$API/api/layers/upload" -H "$AUTH" \ -F "roomName=$ROOM" -F "layerName=my-layer" -F "file=@data/my-layer.geojson"# → { "jobId": "job-…", ... } then poll:curl -s "$API/api/layers/jobs/<jobId>" -H "$AUTH" | jq '{stage,progress,message}'Ein GeoTIFF hochladen upload
Abschnitt betitelt „Ein GeoTIFF hochladen “Derselbe Endpunkt; eine .tif/.tiff wird in die Raster-Pipeline geleitet. Legen Sie die Darstellung
gleich fest:
# single-band: colormap + stretchcurl -X POST "$API/api/layers/upload" -H "$AUTH" \ -F "roomName=$ROOM" -F "layerName=elevation" -F "file=@data/dem.tif" \ -F 'display={"colormap":"terrain","band":1,"vmin":0,"vmax":1500,"opacity":0.8}'
# multi-band: an RGB compositecurl -X POST "$API/api/layers/upload" -H "$AUTH" \ -F "roomName=$ROOM" -F "layerName=truecolor" -F "file=@data/scene.tif" \ -F 'display={"renderMode":"rgb","rgbBands":[1,2,3]}'Einen einzelnen Marker anlegen write
Abschnitt betitelt „Einen einzelnen Marker anlegen “Synchron — liefert den angelegten Marker samt Id zurück.
curl -X POST "$API/api/rooms/$ROOM/markers" -H "$AUTH" -H "Content-Type: application/json" \ -d '{"latitude":47.5596,"longitude":7.5886,"title":"Site A","description":"first visit","tags":["survey"]}'# → 201 { "success": true, "marker": { "id": "marker-…", ... } }Pflicht sind nur latitude/longitude. Optional: title, description, color (Hex), tags,
eventDate (Epoch ms), markerIconId, markerIconSize, imageKey/thumbnailKey,
embeddedMediaUrl, mediaSize.
Einen Marker aktualisieren oder löschen write
Abschnitt betitelt „Einen Marker aktualisieren oder löschen “# read one backcurl -s "$API/api/rooms/$ROOM/markers/$MARKER" -H "$AUTH" | jq '.marker.title'
# change only what you name; null clears a fieldcurl -X PATCH "$API/api/rooms/$ROOM/markers/$MARKER" -H "$AUTH" -H "Content-Type: application/json" \ -d '{"title":"Site A (revisited)","description":null,"color":"#ef4444"}'
curl -X DELETE "$API/api/rooms/$ROOM/markers/$MARKER" -H "$AUTH"# → 200 { "success": true, "markerId": "marker-…" }latitude, longitude, title und color lassen sich ändern, aber nicht leeren; imageKey und
thumbnailKey müssen gemeinsam gesendet werden. Ein leerer Rumpf wird als empty_update abgelehnt.
Beide Aufrufe erscheinen live in offenen Browsern und landen im Verlauf des Raums.
Marker massenhaft aus Punkt-GeoJSON anlegen write
Abschnitt betitelt „Marker massenhaft aus Punkt-GeoJSON anlegen “curl -X POST "$API/api/rooms/$ROOM/bulk-import" -H "$AUTH" -F "file=@data/points.geojson"# → { "jobId": "bulk-import-…" }; poll: curl -s "$API/api/jobs/<jobId>" -H "$AUTH" | jq .Eine Ebene aus Inline-GeoJSON erzeugen write
Abschnitt betitelt „Eine Ebene aus Inline-GeoJSON erzeugen “curl -X POST "$API/api/rooms/$ROOM/layers" -H "$AUTH" -H "Content-Type: application/json" \ -d '{"name":"drawn","description":"study area","geojson":{"type":"FeatureCollection","features":[]}, "color":"e11d48","opacity":0.35,"strokeWeight":3,"visible":true}'5. Daten zurücklesen
Abschnitt betitelt „5. Daten zurücklesen“curl -s "$API/api/layers/$ROOM" -H "$AUTH" | jq '.layers[].name' # layerscurl -s "$API/api/rooms/$ROOM/markers" -H "$AUTH" | jq '.count' # markerscurl -s "$API/api/rooms/$ROOM/raster-layers" -H "$AUTH" | jq '.rasterLayers[] | {id,name,display}'6. Kommentare readwrite
Abschnitt betitelt „6. Kommentare “curl -s "$API/api/rooms/$ROOM/comments?resolved=false" -H "$AUTH" | jq '.comments[].body'curl -X POST "$API/api/rooms/$ROOM/comments" -H "$AUTH" -H "Content-Type: application/json" \ -d '{"objectId":"marker-1","objectType":"marker","body":"needs review","lat":47.56,"lng":7.59}'7. Die Darstellung eines Rasters ändern write
Abschnitt betitelt „7. Die Darstellung eines Rasters ändern “curl -X PATCH "$API/api/rooms/$ROOM/raster-layers/<layerId>/display" \ -H "$AUTH" -H "Content-Type: application/json" \ -d '{"colormap":"viridis","band":1,"vmin":0,"vmax":3000}'8. Export / Import readwrite
Abschnitt betitelt „8. Export / Import “curl -X POST "$API/api/rooms/$ROOM/export" -H "$AUTH" -H "Content-Type: application/json" -d '{}' -o room.gpkgcurl -X POST "$API/api/rooms/$ROOM/import" -H "$AUTH" -F "file=@room.gpkg" # ≤ 2 GiBGroße Räume: mit GET /api/rooms/$ROOM/export-size sondieren, dann die asynchronen
Export-Aufträge nutzen.
9. Der bequeme Weg: das Import-Skript
Abschnitt betitelt „9. Der bequeme Weg: das Import-Skript“scripts/import_geo_data.mjs erkennt Formate automatisch, teilt große Dateien auf und fragt Aufträge
für Sie ab:
COMAP_API_TOKEN=$TOKEN node scripts/import_geo_data.mjs --room $ROOM data/my-folderCOMAP_API_TOKEN=$TOKEN node scripts/import_geo_data.mjs --room $ROOM points.csv imagery.tiffnode scripts/import_geo_data.mjs --room $ROOM --dry-run data/my-folder # preview only10. Fehlersuche
Abschnitt betitelt „10. Fehlersuche“| Symptom | Ursache → Abhilfe |
|---|---|
403 api_token_not_allowed an einem Datenendpunkt |
Sie haben einen Eigentümer-/Admin-Endpunkt getroffen (siehe was ein Token nicht darf); in Produktion ist ein neues Deployment womöglich noch nicht live |
403 „API token is not scoped to this room“ |
roomName/$ROOM ≠ Raum des Tokens |
403 „API token lacks 'X' permission“ |
Token neu ausstellen, Berechtigung X einschließen |
401 Invalid or expired API token |
Token widerrufen/abgelaufen — ein neues ausstellen |
413 quota_exceeded |
Die Speichergrenze des Raumeigentümers ist erreicht — Platz schaffen oder Tarif anheben |
413 file_too_large |
Datei > 50 MB in einer Anfrage — Import-Skript / stückweisen Upload verwenden |

