Skip to main content

Photogrammetry (DSLR / Mirrorless)

Use this workflow when you capture still photos with a DSLR, mirrorless camera, or drone and want to convert them into a WebAR³ VPS map.

Capture Guidelines

  • Aim for 70–80 % overlap between consecutive photos.
  • Shoot at multiple heights and include easily recognisable landmarks.
  • Keep exposure consistent; avoid motion blur.
  • Optional: place QR-sized ground control markers to validate scale.

Reconstruction

  1. Import the photo set into Metashape, RealityCapture, Meshroom, or your preferred photogrammetry suite.
  2. Run alignment and dense reconstruction steps.
  3. Export the resulting point cloud as LAS/LAZ/PLY with colour attributes. Keep texture resolution manageable (≤8K).

Upload with the Python REST API

The snippet below mirrors the flow from the space.web-ar.studio: request an upload slot, stream the LAS/PLY file, and finalise the map so that back-end processing starts.

# upload_photogrammetry.py
from pathlib import Path
import os
import requests

API_BASE = "https://was-vps.web-ar.xyz/vps/api/v3"
TOKEN = os.environ["WEBAR3_TOKEN"] # create a personal token in space.web-ar.studio
DATA_PATH = Path("outputs/cathedral.las")

headers = {"Authorization": f"Bearer {TOKEN}"}

payload = {
"name": "Old Town Square",
"dataType": "point_cloud",
"sourceFormat": "las",
"coordinate": {"lat": 50.08746, "lon": 14.42125, "alt": 194.2}
}

init = requests.post(f"{API_BASE}/maps/import", json=payload, headers=headers)
init.raise_for_status()
info = init.json()
upload_url = info["uploadUrl"]
map_id = info["mapId"]

with DATA_PATH.open("rb") as src:
put = requests.put(upload_url, data=src, headers={"Content-Type": "application/octet-stream"})
put.raise_for_status()

finalize = requests.post(f"{API_BASE}/maps/{map_id}/finalize", json={"publish": False}, headers=headers)
finalize.raise_for_status()
print(f"Map {map_id} queued → status: {finalize.json()['status']}")
  • WEBAR3_TOKEN is a bearer token generated in Console → Settings → API tokens.
  • dataType / sourceFormat describe the payload so the back-end picks the correct pipeline.
  • Set publish to True if you wish to auto-publish once processing finishes; otherwise review the map in the Console first.

Monitor Processing

import os
import requests

API_BASE = "https://was-vps.web-ar.xyz/vps/api/v3"
TOKEN = os.environ["WEBAR3_TOKEN"]
MAP_ID = "map_12345"

resp = requests.get(f"{API_BASE}/maps/{MAP_ID}", headers={"Authorization": f"Bearer {TOKEN}"})
resp.raise_for_status()
print(resp.json()["status"]) # e.g. PROCESSING → READY → PUBLISHED

Once the status moves to READY, open space.web-ar.studio → MapsPreview to inspect the geometry, heatmap, and anchors. Re-run the photogrammetry step if you notice gaps or mirrored geometry.