Skip to main content

Photogrammetry

Build an AR Clip VPS map from still photos taken with a DSLR, mirrorless camera or drone.

Take the photos​

  • Overlap each photo with the next one by 70–80 %.
  • Shoot from several heights, and include landmarks that are easy to recognise.
  • Keep the exposure the same across the set, and avoid motion blur.
  • Optional: place ground control markers about the size of a QR code, to check the scale.

Build the point cloud​

  1. Import the photos into Metashape, RealityCapture, Meshroom or another photogrammetry tool.
  2. Run alignment, then dense reconstruction.
  3. Export the point cloud as LAS, LAZ or PLY, with colour. Keep the texture resolution at 8K or below.

Upload with Python​

This script follows the same flow as arclip.design. It asks for an upload slot, uploads the LAS or PLY file, and finalises the map so that processing starts.

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

API_BASE = "https://api.arclip.app/vps/api/v3"
TOKEN = os.environ["ARCLIP_TOKEN"] # create a personal token in arclip.design
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']}")
  • ARCLIP_TOKEN is a bearer token. Create it in Console → Settings → API tokens.
  • dataType and sourceFormat describe the file you upload.
  • Set publish to True to publish the map as soon as processing finishes. Otherwise, review it in the console first.

Check processing​

import os
import requests

API_BASE = "https://api.arclip.app/vps/api/v3"
TOKEN = os.environ["ARCLIP_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

When the status is READY, open arclip.design → Maps → Preview to check the geometry, heatmap and anchors. If you see gaps or mirrored geometry, run the photogrammetry step again.


Next: LiDAR scans — build a map from terrestrial LiDAR.