★ New · v1.5 · VIEWERS

Step inside the scene. Tag the world from a panorama.

An immersive 360° panorama and video viewer that launches from the ribbon into its own window, raycasts your clicks into geolocated ground coordinates, and synchronizes camera, field-of-view, and tags live onto the main map. Equirectangular images, 360° video, and six-face cubemaps are all first-class — with optional AI auto-tagging from the same YOLO-E sidecar that powers Full Motion Video.

Equirectangular360° video6-face cubemap Click-to-place tagsAI auto-tag (YOLO-E)GPX / DJI / ffprobe telemetryBroadcastChannel map sync
How it works

A click in the panorama is a coordinate on the ground

Click anywhere inside the 360° viewer and the player raycasts your click to a (yaw, pitch) bearing. Combine that bearing with the camera's GPS + heading and an assumed distance, and the GeoRegEngine computes a geodesic destination point — a real lat/lon that lands as a tag on the main map, instantly.

  • Geodesic placementDestinationPoint on the camera GPS + click bearing + distance (default 50 m, UI-tunable). Pure-C# Haversine, the same math that drives the prediction engine.
  • Live cross-window syncBroadcastChannel('vr360-channel') alongside window.opener.postMessage mirrors the camera marker (cyan), a dynamic FOV frustum wedge, and tag pins (green = manual, orange = AI) onto the ArcGIS map.
  • Tag taxonomy — categories for POI, hazard, landmark, wildlife, weather, equipment, and custom; each tag carries title, description, media attachment, hyperlink, bearing/distance/accuracy, and AI confidence.
  • Three.js r128 player — vendored UMD, no importmap. Inverted SphereGeometry(500,64,32) for equirect; BoxGeometry + CubeTextureLoader for cubemaps (faces fetched via ?face=0..5).
POST /api/streetview/assets
// register an equirectangular panorama
curl -X POST http://localhost:5059/api/streetview/assets \
  -H 'Content-Type: application/json' \
  -d '{
    "title": "Intersection-NW",
    "kind": "EquirectImage",
    "path": "C:/sorties/site-A/pano_001.jpg"
  }'

→ telemetry enriched (GPX → DJI → ffprobe → SRT)
→ camera GPS + heading resolved
→ click in viewer → tag at lon/lat on map
Ingest & exploitation

Every 360° source, one viewer

Drop a panorama, point at a 360° video, or load a six-face cubemap set — the viewer sorts faces into the canonical [+X, −X, +Y, −Y, +Z, −Z] order and resolves camera pose from whichever telemetry source is present. No fake-data fallback: if telemetry is absent, the operator sets the camera location manually.

🌐

Equirectangular images

.jpg .png .webp .tiff — the common 2:1 panorama. Inverted sphere geometry, look-around with pointer drag.

🎬

360° video

.mp4 .mov .webm — frame-scrubbable immersive video. Per-frame tags carry video_timestamp_seconds.

🎲

Six-face cubemaps

Auto-sorted into Three.js CubeTextureLoader face order. Faces served individually via ?face=0..5 with range-aware responses.

🧭

Telemetry extraction

Four methods tried in order: GPX sidecar → DJI (SRT/EXIF/flight-log) → ffprobe stream tags + ISO6709 → SRT regex. Camera location, altitude, heading.

🤖

AI auto-tagging

Sweeps N perspective views per equirect frame through the :8003 YOLO-E sidecar — each view's center azimuth becomes a bearing → ground coordinate. Deduped by (label, 25 m).

📡

External panorama search

POST /api/streetview/assets/search finds nearest panoramas by lat/lon for Mapillary-style coverage.

The API surface

Register assets, manage tags, export

GroupEndpointNotes
AssetsGET / POST /api/streetview/assetsList / register a panorama, video, or cubemap
AssetsGET /api/streetview/assets/{id}/file?face=NRange-aware media byte serving (cubemap face optional)
AssetsGET /api/streetview/assets/{id}/telemetryResolved camera GPS, altitude, heading
AIPOST /api/streetview/assets/{id}/autotagYOLO-E perspective sweep → geolocated tags (503 if sidecar down)
TagsGET / POST /api/streetview/tagsCRUD over click-placed + AI tags
TagsGET /api/streetview/tags/near?lat=&lon=&radius=Spatial proximity query
TagsGET /api/streetview/tags/export?format=geojson|kmlExport the tag set to GeoJSON or KML

Base URL http://localhost:5059. Assets persist to .tmgproj as project_asset rows (registry_kind="streetview"); tags live in <dataDir>/gpkg/streetview_tags.gpkg (attributes table — appears in the catalog, not served by FeatureServer). Documented in STREETVIEW_GUIDE.md.

Exploit the panorama, not just the pixels

Click-to-place geolocation, AI auto-tagging, and live map sync — the 360° companion to the FMV exploitation workflow.