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
- Import the photos into Metashape, RealityCapture, Meshroom or another photogrammetry tool.
- Run alignment, then dense reconstruction.
- 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_TOKENis a bearer token. Create it in Console → Settings → API tokens.dataTypeandsourceFormatdescribe the file you upload.- Set
publishtoTrueto 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.