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.
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.
DestinationPoint on the camera GPS + click bearing + distance (default 50 m, UI-tunable). Pure-C# Haversine, the same math that drives the prediction engine.BroadcastChannel('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.SphereGeometry(500,64,32) for equirect; BoxGeometry + CubeTextureLoader for cubemaps (faces fetched via ?face=0..5).// 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
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.
.jpg .png .webp .tiff — the common 2:1 panorama. Inverted sphere geometry, look-around with pointer drag.
.mp4 .mov .webm — frame-scrubbable immersive video. Per-frame tags carry video_timestamp_seconds.
Auto-sorted into Three.js CubeTextureLoader face order. Faces served individually via ?face=0..5 with range-aware responses.
Four methods tried in order: GPX sidecar → DJI (SRT/EXIF/flight-log) → ffprobe stream tags + ISO6709 → SRT regex. Camera location, altitude, heading.
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).
POST /api/streetview/assets/search finds nearest panoramas by lat/lon for Mapillary-style coverage.
| Group | Endpoint | Notes |
|---|---|---|
| Assets | GET / POST /api/streetview/assets | List / register a panorama, video, or cubemap |
| Assets | GET /api/streetview/assets/{id}/file?face=N | Range-aware media byte serving (cubemap face optional) |
| Assets | GET /api/streetview/assets/{id}/telemetry | Resolved camera GPS, altitude, heading |
| AI | POST /api/streetview/assets/{id}/autotag | YOLO-E perspective sweep → geolocated tags (503 if sidecar down) |
| Tags | GET / POST /api/streetview/tags | CRUD over click-placed + AI tags |
| Tags | GET /api/streetview/tags/near?lat=&lon=&radius= | Spatial proximity query |
| Tags | GET /api/streetview/tags/export?format=geojson|kml | Export 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.
Click-to-place geolocation, AI auto-tagging, and live map sync — the 360° companion to the FMV exploitation workflow.