{"id":38408,"date":"2026-10-21T12:48:46","date_gmt":"2026-10-21T12:48:46","guid":{"rendered":"https:\/\/volatusaerospace.com\/?page_id=38408"},"modified":"2026-10-21T13:21:42","modified_gmt":"2026-10-21T13:21:42","slug":"lidar-mapping-drone-services","status":"publish","type":"page","link":"https:\/\/volatusaerospace.com\/fr-ca\/services\/technical-capabilities\/lidar-mapping-drone-services\/","title":{"rendered":"Services de cartographie LiDAR a\u00e9rienne et de cr\u00e9ation de nuages de points 3D"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"38408\" class=\"elementor elementor-38408\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9befad0 e-con-full dark-section e-flex e-con e-parent\" data-id=\"9befad0\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1a338f0 elementor-widget__width-inherit elementor-absolute elementor-widget elementor-widget-html\" data-id=\"1a338f0\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"volatus-lidar-hero\" data-duration=\"14\" data-point-density=\"0.5\" data-auto-rotate=\"true\">\r\n  <canvas tabindex=\"0\" role=\"img\" aria-label=\"Interactive lidar mapping scene. Drag horizontally to orbit and vertically to tilt. Arrow keys rotate the view. Press Home to reset.\" aria-describedby=\"vl-interaction-help\"><\/canvas>\r\n  <div class=\"vl-fallback\" role=\"img\" aria-label=\"Lidar mapping illustration: a landscape is scanned into a point cloud, revealing bare earth and elevation contours.\">\r\n    <svg viewBox=\"0 0 760 560\" aria-hidden=\"true\"><g fill=\"none\" stroke=\"#FFB601\" stroke-width=\"1.1\" opacity=\".65\"><path d=\"M98 345 350 140 675 285 425 489Z\"\/><path d=\"M120 340Q250 160 390 230T642 290M153 365Q260 210 399 265T612 321M185 391Q285 260 415 298T581 350M219 415Q319 311 435 331T550 380M251 438Q347 360 456 365T517 409\"\/><\/g><\/svg>\r\n  <\/div>\r\n  <div class=\"vl-hint\" id=\"vl-interaction-help\" aria-hidden=\"true\" hidden><\/div>\r\n  <div class=\"vl-bottom\">\r\n    <div class=\"vl-caption\" aria-hidden=\"true\"><span class=\"vl-marker\"><\/span><span class=\"vl-phase\">Terrain & elevation contours<\/span><span class=\"vl-index\">04 \/ 04<\/span><\/div>\r\n  <\/div>\r\n  <span class=\"vl-sr\">Illustrative lidar workflow: landscape acquisition, point cloud capture, ground beneath the canopy, and terrain contours. This is a conceptual animation, not survey data.<\/span>\r\n<\/div>\r\n\r\n<style>\r\n  #volatus-lidar-hero {\r\n    --vl-gold: #FFB601;\r\n    position: absolute !important;\r\n    top: 0 !important;\r\n    left: 0 !important;\r\n    width: 100vw !important;\r\n    height: 100% !important;\r\n    min-height: 100vh !important;\r\n    overflow: hidden !important;\r\n    z-index: 1 !important;\r\n    background: #000000 !important;\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n    border: 0 !important;\r\n    box-sizing: border-box !important;\r\n    color: #e2e2e2 !important;\r\n    pointer-events: none !important;\r\n    isolation: isolate !important;\r\n  }\r\n  #volatus-lidar-hero *,\r\n  #volatus-lidar-hero *::before,\r\n  #volatus-lidar-hero *::after {\r\n    box-sizing: border-box !important;\r\n  }\r\n  #volatus-lidar-hero canvas {\r\n    position: absolute !important;\r\n    inset: 0 !important;\r\n    width: 100% !important;\r\n    height: 100% !important;\r\n    display: block !important;\r\n    touch-action: pan-y !important;\r\n    z-index: 1 !important;\r\n    pointer-events: auto !important;\r\n    cursor: grab;\r\n    outline: none;\r\n    border: 0 !important;\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n  }\r\n  #volatus-lidar-hero canvas,\r\n  #volatus-lidar-hero .vl-bottom {\r\n    opacity: 0;\r\n    transition: opacity .7s ease;\r\n  }\r\n  #volatus-lidar-hero.vl-ready canvas,\r\n  #volatus-lidar-hero.vl-ready .vl-bottom {\r\n    opacity: 1;\r\n  }\r\n  #volatus-lidar-hero canvas:focus-visible {\r\n    outline: 1px solid #ffb60166;\r\n    outline-offset: -6px;\r\n  }\r\n  #volatus-lidar-hero.vl-dragging canvas {\r\n    cursor: grabbing;\r\n  }\r\n  #volatus-lidar-hero .vl-fallback {\r\n    position: absolute !important;\r\n    inset: 0 !important;\r\n    width: 100% !important;\r\n    height: 100% !important;\r\n    z-index: 1 !important;\r\n    pointer-events: none !important;\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n    display: none !important;\r\n  }\r\n  #volatus-lidar-hero.vl-failed .vl-fallback {\r\n    display: block !important;\r\n  }\r\n  #volatus-lidar-hero .vl-fallback svg {\r\n    width: 100% !important;\r\n    height: 100% !important;\r\n    display: block !important;\r\n  }\r\n  #volatus-lidar-hero .vl-hint {\r\n    position: absolute !important;\r\n    inset: 24px 32px auto auto !important;\r\n    z-index: 3 !important;\r\n    pointer-events: none !important;\r\n    font: 400 10px\/1.5 'DM Sans', -apple-system, BlinkMacSystemFont, Arial, sans-serif !important;\r\n    color: #747474 !important;\r\n    letter-spacing: .02em !important;\r\n  }\r\n  #volatus-lidar-hero .vl-hint span {\r\n    margin: 0 5px !important;\r\n    color: #FFB601 !important;\r\n  }\r\n  #volatus-lidar-hero .vl-bottom {\r\n    position: absolute !important;\r\n    z-index: 3 !important;\r\n    inset: auto 32px 28px 32px !important;\r\n    display: flex !important;\r\n    align-items: center !important;\r\n    justify-content: space-between !important;\r\n    gap: 14px !important;\r\n    pointer-events: none !important;\r\n  }\r\n  #volatus-lidar-hero .vl-caption {\r\n    display: flex !important;\r\n    align-items: center !important;\r\n    gap: 10px !important;\r\n    font: 400 12px\/1.4 'DM Sans', -apple-system, BlinkMacSystemFont, Arial, sans-serif !important;\r\n    letter-spacing: .035em !important;\r\n    color: #b3b3b3 !important;\r\n  }\r\n  #volatus-lidar-hero .vl-marker {\r\n    width: 5px !important;\r\n    height: 5px !important;\r\n    flex-shrink: 0 !important;\r\n    border-radius: 50% !important;\r\n    background: var(--vl-gold) !important;\r\n    box-shadow: 0 0 8px #ffb60155 !important;\r\n  }\r\n  #volatus-lidar-hero .vl-index {\r\n    margin-left: 14px !important;\r\n    color: #686868 !important;\r\n    font-variant-numeric: tabular-nums !important;\r\n    font-size: 10px !important;\r\n    letter-spacing: .09em !important;\r\n  }\r\n  #volatus-lidar-hero .vl-hint[hidden] {\r\n    display: none !important;\r\n  }\r\n  #volatus-lidar-hero .vl-sr {\r\n    position: absolute !important;\r\n    width: 1px !important;\r\n    height: 1px !important;\r\n    padding: 0 !important;\r\n    margin: -1px !important;\r\n    overflow: hidden !important;\r\n    clip: rect(0,0,0,0) !important;\r\n    white-space: nowrap !important;\r\n    border: 0 !important;\r\n  }\r\n  @media (max-width: 1024px) {\r\n    #volatus-lidar-hero .vl-bottom {\r\n      inset: auto 20px 20px 20px !important;\r\n      gap: 8px !important;\r\n    }\r\n    #volatus-lidar-hero .vl-caption {\r\n      font-size: 11px !important;\r\n      gap: 8px !important;\r\n    }\r\n    #volatus-lidar-hero .vl-index {\r\n      display: none !important;\r\n    }\r\n    #volatus-lidar-hero .vl-hint {\r\n      inset: 18px 20px auto auto !important;\r\n      font-size: 9px !important;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n(function start() {\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', start, { once: true });\r\n    return;\r\n  }\r\n  const root = document.getElementById('volatus-lidar-hero');\r\n  if (!root) return;\r\n  if (root.__vlDestroy) root.__vlDestroy();\r\n\r\n  const canvas = root.querySelector('canvas');\r\n  let ctx;\r\n  try { ctx = canvas.getContext('2d', { alpha: true }); } catch (_) { ctx = null; }\r\n  if (!ctx) { root.classList.add('vl-failed'); return; }\r\n\r\n  const hint = root.querySelector('.vl-hint');\r\n  const phase = root.querySelector('.vl-phase');\r\n  const index = root.querySelector('.vl-index');\r\n  const motion = window.matchMedia('(prefers-reduced-motion: reduce)');\r\n  const duration = Math.min(60, Math.max(8, Number(root.dataset.duration) || 14)) * 1000;\r\n  const rotate = root.dataset.autoRotate !== 'false';\r\n  const TAU = Math.PI * 2;\r\n  const clamp = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v));\r\n  const smooth = (a, b, v) => { const t = clamp((v - a) \/ (b - a)); return t * t * (3 - 2 * t); };\r\n  const lerp = (a, b, t) => a + (b - a) * t;\r\n\r\n  let seed = 1831;\r\n  const random = () => { seed = (seed * 1664525 + 1013904223) >>> 0; return seed \/ 4294967296; };\r\n  const terrain = (x, z) => .045 + .30 * Math.exp(-((x + .58) ** 2 * 5 + (z + .33) ** 2 * 8)) + .21 * Math.exp(-((x - .57) ** 2 * 6 + (z - .40) ** 2 * 10)) + .065 * Math.sin(x * 5 + z * 3) + .022 * Math.cos(z * 10 - x * 4) + .012 * Math.sin(x * 22 + z * 8) * Math.cos(z * 18);\r\n  const roadZ = x => .23 + .105 * Math.sin(x * 3.4) - .035 * x;\r\n\r\n  const points = [];\r\n  const faces = [];\r\n  const lines = [];\r\n  const trees = [];\r\n  const contours = [];\r\n  const grid = [];\r\n  const addPoint = (x, y, z, type = 0, size = 1) => points.push({ x, y, z, type, size, r: random() });\r\n  const addFace = (vertices, tone, type = 0) => faces.push({ vertices, tone, type, cx: vertices.reduce((s, p) => s + p[0], 0) \/ vertices.length, depth: vertices.reduce((s, p) => s + p[2], 0) \/ vertices.length });\r\n\r\n  const NX = 32, NZ = 24;\r\n  for (let j = 0; j <= NZ; j++) {\r\n    const row = [];\r\n    for (let i = 0; i <= NX; i++) {\r\n      const x = -1 + 2 * i \/ NX, z = -.72 + 1.44 * j \/ NZ;\r\n      row.push([x, terrain(x, z), z]);\r\n    }\r\n    grid.push(row);\r\n  }\r\n  for (let j = 0; j < NZ; j++) {\r\n    for (let i = 0; i < NX; i++) {\r\n      const a = grid[j][i], b = grid[j][i + 1], c = grid[j + 1][i + 1], d = grid[j + 1][i];\r\n      const dx = (b[1] - a[1]) \/ (2 \/ NX), dz = (d[1] - a[1]) \/ (1.44 \/ NZ);\r\n      const light = (-dx * -.55 + 1 * .83 - dz * -.40) \/ Math.hypot(dx, 1, dz);\r\n      const shade = Math.round(clamp(32 + light * 49, 28, 94));\r\n      addFace([a, b, c], shade);\r\n      addFace([a, c, d], shade - 1);\r\n    }\r\n  }\r\n\r\n  \/\/ Floating survey tile sides\r\n  for (let i = 0; i < NX; i++) {\r\n    for (const j of [0, NZ]) {\r\n      const a = grid[j][i], b = grid[j][i + 1];\r\n      addFace([a, b, [b[0], -.08, b[2]], [a[0], -.08, a[2]]], j === NZ ? 28 : 23, 4);\r\n    }\r\n  }\r\n  for (let j = 0; j < NZ; j++) {\r\n    for (const i of [0, NX]) {\r\n      const a = grid[j][i], b = grid[j + 1][i];\r\n      addFace([a, b, [b[0], -.08, b[2]], [a[0], -.08, a[2]]], i === NX ? 26 : 21, 4);\r\n    }\r\n  }\r\n\r\n  \/\/ Ground returns\r\n  const pointDensityVal = Math.min(1.5, Math.max(.35, Number(root.dataset.pointDensity) || 1));\r\n  for (let n = 0; n < 10800 * pointDensityVal; n++) {\r\n    const x = random() * 2 - 1, z = random() * 1.44 - .72;\r\n    addPoint(x, terrain(x, z) + .002, z, 0, .75 + random() * .65);\r\n  }\r\n\r\n  \/\/ Survey road\r\n  for (let i = 0; i < 100; i++) {\r\n    const x = -1 + i * .02, x2 = x + .02, z = roadZ(x), z2 = roadZ(x2), rw = .032;\r\n    addFace([[x, terrain(x, z - rw) + .004, z - rw], [x2, terrain(x2, z2 - rw) + .004, z2 - rw], [x2, terrain(x2, z2 + rw) + .004, z2 + rw], [x, terrain(x, z + rw) + .004, z + rw]], 35, 1);\r\n    for (const offset of [-rw, rw]) lines.push({ a: [x, terrain(x, z + offset) + .009, z + offset], b: [x2, terrain(x2, z2 + offset) + .009, z2 + offset], type: 1, cx: x });\r\n    if (i % 5 < 2) lines.push({ a: [x, terrain(x, z) + .009, z], b: [x2, terrain(x2, z2) + .009, z2], type: 1, cx: x });\r\n  }\r\n  for (let n = 0; n < 950 * pointDensityVal; n++) {\r\n    const x = random() * 2 - 1, z = roadZ(x) + (random() - .5) * .069;\r\n    addPoint(x, terrain(x, z) + .008, z, 1, .75 + random() * .35);\r\n  }\r\n\r\n  \/\/ Canopy vegetation\r\n  const treeSites = [[-.81, -.37], [-.65, -.49], [-.48, -.40], [-.27, -.50], [-.06, -.44], [.15, -.54], [.34, -.49], [-.88, -.12], [-.68, -.20], [-.45, -.20], [-.20, -.24], [.06, -.22], [.76, .43], [.90, .30], [.63, .55], [.39, .55], [-.73, .49], [-.88, .43]];\r\n  treeSites.forEach(([x, z]) => {\r\n    const ground = terrain(x, z), h = .17 + random() * .13, r = .066 + random() * .028;\r\n    trees.push({ x, z, ground, h, r });\r\n    lines.push({ a: [x, ground, z], b: [x, ground + h * .68, z], type: 2, cx: x });\r\n    for (let n = 0; n < 35 * pointDensityVal; n++) addPoint(x + (random() - .5) * .012, ground + random() * h * .6, z + (random() - .5) * .012, 2, .85);\r\n    for (let lobe = 0; lobe < 4; lobe++) {\r\n      const ox = (lobe === 1 ? -.037 : lobe === 2 ? .033 : 0), oz = (lobe === 1 ? .021 : lobe === 2 ? -.019 : lobe === 3 ? .027 : 0), cy = ground + h * (lobe === 0 ? .78 : lobe === 3 ? .53 : .63), rx = r * (lobe === 0 ? .79 : .70), ry = h * (lobe === 0 ? .25 : .22);\r\n      const L = 3, S = 6;\r\n      const sphere = (lat, lon) => [x + ox + Math.sin(lat) * Math.cos(lon) * rx, cy + Math.cos(lat) * ry, z + oz + Math.sin(lat) * Math.sin(lon) * rx];\r\n      for (let j = 0; j < L; j++) {\r\n        for (let i = 0; i < S; i++) {\r\n          const a = sphere(j * Math.PI \/ L, i * TAU \/ S), b = sphere((j + 1) * Math.PI \/ L, i * TAU \/ S), c = sphere((j + 1) * Math.PI \/ L, (i + 1) * TAU \/ S), d = sphere(j * Math.PI \/ L, (i + 1) * TAU \/ S);\r\n          addFace([a, b, c, d], Math.round(62 + 23 * Math.sin(i * TAU \/ S) + j * 2.2), 2);\r\n        }\r\n      }\r\n      for (let n = 0; n < 110 * pointDensityVal; n++) {\r\n        const u = random() * 2 - 1, angle = random() * TAU, rr = Math.sqrt(1 - u * u);\r\n        addPoint(x + ox + rr * Math.cos(angle) * rx, cy + u * ry, z + oz + rr * Math.sin(angle) * rx, 2, .85 + random() * .5);\r\n      }\r\n    }\r\n  });\r\n\r\n  \/\/ Built infrastructure\r\n  function building(x, z, w, d, h) {\r\n    const y = terrain(x, z) + .008;\r\n    const A = [x - w \/ 2, y, z - d \/ 2], B = [x + w \/ 2, y, z - d \/ 2], C = [x + w \/ 2, y, z + d \/ 2], D = [x - w \/ 2, y, z + d \/ 2];\r\n    const top = p => [p[0], p[1] + h, p[2]];\r\n    addFace([A, B, top(B), top(A)], 67, 3);\r\n    addFace([B, C, top(C), top(B)], 85, 3);\r\n    addFace([C, D, top(D), top(C)], 58, 3);\r\n    addFace([D, A, top(A), top(D)], 50, 3);\r\n    addFace([top(A), top(B), top(C), top(D)], 115, 3);\r\n    for (const p of [A, B, C, D]) lines.push({ a: p, b: top(p), type: 3, cx: x });\r\n    for (const [a, b] of [[A, B], [B, C], [C, D], [D, A]]) lines.push({ a: top(a), b: top(b), type: 3, cx: x });\r\n    for (let n = 0; n < 550 * pointDensityVal; n++) {\r\n      const side = Math.floor(random() * 5), u = random(), v = random();\r\n      let px = x + (u - .5) * w, py = y + h, pz = z + (v - .5) * d;\r\n      if (side < 4) { py = y + v * h; if (side < 2) pz = z + (side === 0 ? -.5 : .5) * d; else { px = x + (side === 2 ? -.5 : .5) * w; pz = z + (u - .5) * d; } }\r\n      addPoint(px, py + .001, pz, 3, .85 + random() * .45);\r\n    }\r\n  }\r\n  building(.50, -.07, .24, .15, .105);\r\n  building(.72, -.15, .14, .12, .075);\r\n\r\n  \/\/ Elevation contours\r\n  for (let level = .015; level < .48; level += .022) {\r\n    const segments = [];\r\n    for (let j = 0; j < NZ; j++) {\r\n      for (let i = 0; i < NX; i++) {\r\n        const verts = [grid[j][i], grid[j][i + 1], grid[j + 1][i + 1], grid[j + 1][i]];\r\n        const hits = [];\r\n        for (let k = 0; k < 4; k++) {\r\n          const a = verts[k], b = verts[(k + 1) % 4];\r\n          if ((a[1] < level) !== (b[1] < level)) { const t = (level - a[1]) \/ (b[1] - a[1]); hits.push([lerp(a[0], b[0], t), level + .003, lerp(a[2], b[2], t)]); }\r\n        }\r\n        if (hits.length === 2) segments.push(hits);\r\n        else if (hits.length === 4) { segments.push([hits[0], hits[1]]); segments.push([hits[2], hits[3]]); }\r\n      }\r\n    }\r\n    contours.push({ level, segments });\r\n  }\r\n\r\n  const layer = type => type === 4 ? 0 : type === 0 ? 1 : type === 1 ? 2 : 3;\r\n  faces.sort((a, b) => (layer(a.type) - layer(b.type)) || ((a.depth - .5 * a.cx) - (b.depth - .5 * b.cx)));\r\n  points.sort((a, b) => (a.z - .5 * a.x) - (b.z - .5 * b.x));\r\n\r\n  let width = 0, height = 0, dpr = 1, scale = 1, originX = 0, originY = 0;\r\n  let clock = 0, raf = 0, lastTime = 0, lastPaint = 0, inView = true, destroyed = false, currentLabel = -1;\r\n  let yaw = -.52, cos = Math.cos(yaw), sin = Math.sin(yaw), pitch = .49, vertical = .94;\r\n  let scrolling = false, scrollTimer = 0;\r\n  addEventListener('scroll', () => { scrolling = true; clearTimeout(scrollTimer); scrollTimer = setTimeout(() => scrolling = false, 120); }, { passive: true });\r\n  let orbit = 0, tilt = 0, pointer = null, dragged = false, hoverDrone = false, droneScreen = [-1000, -1000], lastSortedYaw = Infinity, lastT = 0;\r\n\r\n  const projection = p => [originX + (p[0] * cos - p[2] * sin) * scale, originY + ((p[0] * sin + p[2] * cos) * pitch - p[1] * vertical) * scale];\r\n\r\n  function strokeWorld(a, b, color, lineWidth = 1, alpha = 1) {\r\n    const p = projection(a), q = projection(b);\r\n    ctx.globalAlpha = alpha; ctx.strokeStyle = color; ctx.lineWidth = lineWidth;\r\n    ctx.beginPath(); ctx.moveTo(p[0], p[1]); ctx.lineTo(q[0], q[1]); ctx.stroke();\r\n  }\r\n\r\n  function polygon(vertices, fill, alpha = 1, stroke = null) {\r\n    if (alpha < .003) return;\r\n    ctx.globalAlpha = alpha; ctx.fillStyle = fill;\r\n    ctx.beginPath();\r\n    vertices.forEach((v, i) => { const p = projection(v); if (i) ctx.lineTo(p[0], p[1]); else ctx.moveTo(p[0], p[1]); });\r\n    ctx.closePath(); ctx.fill();\r\n    if (stroke) { ctx.strokeStyle = stroke; ctx.lineWidth = .55; ctx.stroke(); }\r\n  }\r\n\r\n  function ring(center, rx, rz, color, alpha = 1, lineWidth = .8, fill = null) {\r\n    const vertices = [];\r\n    for (let i = 0; i < 32; i++) { const a = i \/ 32 * TAU; vertices.push([center[0] + Math.cos(a) * rx, center[1], center[2] + Math.sin(a) * rz]); }\r\n    if (fill) polygon(vertices, fill, alpha);\r\n    ctx.globalAlpha = alpha; ctx.strokeStyle = color; ctx.lineWidth = lineWidth;\r\n    ctx.beginPath();\r\n    vertices.forEach((v, i) => { const p = projection(v); if (i) ctx.lineTo(...p); else ctx.moveTo(...p); });\r\n    ctx.closePath(); ctx.stroke();\r\n  }\r\n\r\n  function drawDrone(x, y, z, t, opacity = 1) {\r\n    const bank = motion.matches ? 0 : Math.sin(t * TAU) * .014;\r\n    const local = (px, py, pz) => [x + px, y + py + px * bank, z + pz];\r\n    const armDistX = 0.225;\r\n    const armDistZ = 0.170;\r\n    const rotors = [\r\n      { x: -armDistX, z: -armDistZ, i: 0 },\r\n      { x:  armDistX, z: -armDistZ, i: 1 },\r\n      { x: -armDistX, z:  armDistZ, i: 2 },\r\n      { x:  armDistX, z:  armDistZ, i: 3 }\r\n    ];\r\n\r\n    function drawRotorAssembly(m) {\r\n      const rootX = Math.sign(m.x) * 0.076;\r\n      const rootZ = Math.sign(m.z) * 0.064;\r\n      \/\/ Arm socket mount on fuselage\r\n      ring(local(rootX, 0.008, rootZ), 0.016, 0.016, '#282c30', opacity, 0.9, '#181b1d');\r\n      \/\/ Main structural arm tube\r\n      strokeWorld(local(rootX, 0.008, rootZ), local(m.x, 0.022, m.z), '#1e2225', 7.5, opacity);\r\n      strokeWorld(local(rootX, 0.016, rootZ), local(m.x, 0.028, m.z), '#6c7479', 1.4, opacity * 0.9);\r\n\r\n      \/\/ Motor pod lower bell & stator\r\n      ring(local(m.x, 0.024, m.z), 0.028, 0.028, '#2a2f33', opacity, 0.9, '#1a1d20');\r\n      ring(local(m.x, 0.038, m.z), 0.025, 0.025, '#858d92', opacity, 0.9, '#373d42');\r\n      ring(local(m.x, 0.050, m.z), 0.019, 0.019, '#d2d6d8', opacity, 0.85, '#70777b');\r\n\r\n      \/\/ Transparent spinning propeller disk\r\n      ring(local(m.x, 0.060, m.z), 0.088, 0.088, '#cbd0d3', opacity * 0.26, 0.8, '#bcc3c71e');\r\n\r\n      \/\/ Spinning aerodynamic propeller blades\r\n      const spin = motion.matches ? 0.55 : t * TAU * 54 + m.i * 0.83;\r\n      const rx = Math.cos(spin) * 0.082, rz = Math.sin(spin) * 0.082;\r\n      strokeWorld(local(m.x - rx, 0.062, m.z - rz), local(m.x + rx, 0.062, m.z + rz), '#dbe0e3', 2.4, opacity * 0.65);\r\n      const rx2 = Math.cos(spin + 0.28) * 0.076, rz2 = Math.sin(spin + 0.28) * 0.076;\r\n      strokeWorld(local(m.x - rx2, 0.062, m.z - rz2), local(m.x + rx2, 0.062, m.z + rz2), '#a8b0b5', 1.3, opacity * 0.25);\r\n\r\n      \/\/ Motor spinner cap\r\n      ring(local(m.x, 0.064, m.z), 0.007, 0.007, '#f4f6f7', opacity * 0.9, 0.8, '#c5cacd');\r\n\r\n      \/\/ Navigation beacon (port red, starboard green, rear amber)\r\n      const navColor = m.z > 0 ? (m.x < 0 ? '#ff453a' : '#30d158') : '#ffb601';\r\n      ring(local(m.x, 0.016, m.z), 0.007, 0.007, navColor, opacity * 0.85, 0.8, navColor);\r\n    }\r\n\r\n    function drawSkid(side) {\r\n      strokeWorld(local(side * 0.075, -0.018, -0.052), local(side * 0.095, -0.115, -0.085), '#969c9f', 2.2, opacity);\r\n      strokeWorld(local(side * 0.075, -0.018,  0.052), local(side * 0.095, -0.115,  0.085), '#969c9f', 2.2, opacity);\r\n      strokeWorld(local(side * 0.095, -0.115, -0.112), local(side * 0.095, -0.115, 0.112), '#c4c8ca', 2.6, opacity);\r\n      strokeWorld(local(side * 0.095, -0.115, 0.112), local(side * 0.095, -0.100, 0.125), '#c4c8ca', 2.2, opacity);\r\n      strokeWorld(local(side * 0.095, -0.115, -0.112), local(side * 0.095, -0.100, -0.125), '#c4c8ca', 2.2, opacity);\r\n    }\r\n\r\n    function drawFuselage() {\r\n      const shell = [[-.105, -.060], [-.074, -.092], [.074, -.092], [.105, -.060], [.105, .060], [.074, .092], [-.074, .092], [-.105, .060]];\r\n      for (let i = 0; i < shell.length; i++) {\r\n        const a = shell[i], b = shell[(i + 1) % shell.length];\r\n        polygon([local(a[0], -.030, a[1]), local(b[0], -.030, b[1]), local(b[0], .035, b[1]), local(a[0], .035, a[1])], i < 4 ? '#596065' : '#3f464a', opacity);\r\n      }\r\n      polygon(shell.map(p => local(p[0], .036, p[1])), '#c9cdcf', opacity, '#f1f1f1');\r\n      polygon([local(-.066, .040, -.047), local(.066, .040, -.047), local(.066, .040, .047), local(-.066, .040, .047)], '#252a2d', opacity, '#666d71');\r\n      polygon([local(-.014, .043, -.052), local(.014, .043, -.052), local(.014, .043, .052), local(-.014, .043, .052)], '#FFB601', opacity);\r\n      ring(local(-.042, 0.044, -.062), 0.009, 0.009, '#f0f3f4', opacity, 0.8, '#e2e5e7');\r\n      ring(local( 0.042, 0.044, -.062), 0.009, 0.009, '#f0f3f4', opacity, 0.8, '#e2e5e7');\r\n    }\r\n\r\n    function drawLidarPayload() {\r\n      polygon([local(-.040, -.030, -.031), local(.040, -.030, -.031), local(.040, -.060, -.031), local(-.040, -.060, -.031)], '#5e6569', opacity);\r\n      strokeWorld(local(0, -.058, 0), local(0, -.090, 0), '#c0c5c7', 4, opacity);\r\n      const cylinder = [];\r\n      for (let i = 0; i < 14; i++) {\r\n        const a = TAU * i \/ 14, b = TAU * (i + 1) \/ 14;\r\n        cylinder.push([local(Math.cos(a) * .037, -.087, Math.sin(a) * .037), local(Math.cos(b) * .037, -.087, Math.sin(b) * .037), local(Math.cos(b) * .037, -.172, Math.sin(b) * .037), local(Math.cos(a) * .037, -.172, Math.sin(a) * .037)]);\r\n      }\r\n      cylinder.forEach((vertices, i) => polygon(vertices, i < 7 ? '#626a6f' : '#343a3e', opacity));\r\n      ring(local(0, -.089, 0), .038, .038, '#c7cbcd', opacity, .9, '#7c8488');\r\n      ring(local(0, -.143, 0), .039, .039, '#FFB601', opacity, 2.2);\r\n      ring(local(0, -.175, 0), .030, .030, '#a3aaad', opacity, .9, '#171c1f');\r\n      ring(local(0, -.179, 0), .013, .013, '#FFB601', opacity, .8, '#FFB601');\r\n    }\r\n\r\n    \/\/ Dynamic depth sorting: renders strictly from back to front\r\n    const renderItems = [\r\n      { depth: rotors[0].x * sin + rotors[0].z * cos, draw: () => drawRotorAssembly(rotors[0]) },\r\n      { depth: rotors[1].x * sin + rotors[1].z * cos, draw: () => drawRotorAssembly(rotors[1]) },\r\n      { depth: rotors[2].x * sin + rotors[2].z * cos, draw: () => drawRotorAssembly(rotors[2]) },\r\n      { depth: rotors[3].x * sin + rotors[3].z * cos, draw: () => drawRotorAssembly(rotors[3]) },\r\n      { depth: -0.095 * sin, draw: () => drawSkid(-1) },\r\n      { depth:  0.095 * sin, draw: () => drawSkid(1) },\r\n      { depth: 0, draw: () => { drawFuselage(); drawLidarPayload(); } }\r\n    ];\r\n\r\n    renderItems.sort((a, b) => a.depth - b.depth);\r\n    renderItems.forEach(item => item.draw());\r\n\r\n    droneScreen = projection(local(0, -.025, 0));\r\n    const center = local(0, -.135, 0);\r\n    if (hoverDrone || (t > .025 && t < .095)) {\r\n      const p = projection(center), endX = clamp(p[0] + 75, 80, width - 116), endY = p[1] + 22;\r\n      ctx.globalAlpha = opacity * .8; ctx.strokeStyle = '#ffb60188'; ctx.lineWidth = .7;\r\n      ctx.beginPath(); moveTo(...p); ctx.lineTo(endX - 7, endY); ctx.lineTo(endX + 81, endY); ctx.stroke();\r\n      ctx.font = \"500 9px 'DM Sans', Arial, sans-serif\"; ctx.fillStyle = '#c4c4c4'; ctx.fillText('LIDAR PAYLOAD', endX, endY - 6);\r\n    }\r\n  }\r\n\r\n  const PCOL = ['#FFB601', '#dedede', '#e2e2e2', '#b3b3b3', '#bdbdbd'];\r\n  const buckets = Array.from({ length: 40 }, () => []);\r\n\r\n  function render(t) {\r\n    if (!width || !height) return;\r\n    lastT = t;\r\n    const scan = lerp(-1.08, 1.08, smooth(.10, .47, t));\r\n    const reset = smooth(.91, 1, t);\r\n    const bare = smooth(.50, .65, t) * (1 - reset);\r\n    const contour = smooth(.53, .78, t) * (1 - reset);\r\n    const cloud = smooth(.08, .15, t) * (1 - reset);\r\n    const classificationZ = lerp(.88, -.90, smooth(.50, .68, t));\r\n    const classified = z => smooth(-.13, .13, z - classificationZ) * (1 - reset);\r\n\r\n    yaw = -.52 + orbit + (rotate && !motion.matches && !dragged ? Math.sin(t * TAU) * .026 : 0);\r\n    cos = Math.cos(yaw); sin = Math.sin(yaw);\r\n    pitch = .49 + tilt; vertical = Math.sqrt(1 - pitch * pitch) * 1.08;\r\n\r\n    if (Math.abs(lastSortedYaw - yaw) > .08) {\r\n      faces.sort((a, b) => (layer(a.type) - layer(b.type)) || ((a.depth * cos + a.cx * sin) - (b.depth * cos + b.cx * sin)));\r\n      points.sort((a, b) => (a.z * cos + a.x * sin) - (b.z * cos + b.x * sin));\r\n      lastSortedYaw = yaw;\r\n    }\r\n\r\n    ctx.globalAlpha = 1;\r\n    ctx.clearRect(0, 0, width, height);\r\n\r\n    \/\/ Soft grounding shadow under floating survey tile\r\n    ctx.save();\r\n    ctx.translate(originX, originY + scale * .20);\r\n    ctx.scale(1, .30);\r\n    const shadow = ctx.createRadialGradient(0, 0, scale * .12, 0, 0, scale * .93);\r\n    shadow.addColorStop(0, '#000000bb');\r\n    shadow.addColorStop(1, '#00000000');\r\n    ctx.fillStyle = shadow;\r\n    ctx.fillRect(-scale, -scale, scale * 2, scale * 2);\r\n    ctx.restore();\r\n\r\n    for (const face of faces) {\r\n      const acquired = smooth(face.cx - .07, face.cx + .06, scan) * cloud;\r\n      let alpha = face.type === 4 ? .88 : (1 - acquired * .985);\r\n      if (face.type === 2) alpha *= 1 - classified(face.depth) * .93;\r\n      if (face.type === 3) alpha *= 1 - bare * .65;\r\n      if (alpha < .02) continue;\r\n      const shade = face.tone, color = `rgb(${shade},${shade},${shade})`;\r\n      polygon(face.vertices, color, alpha, face.type === 0 && alpha > .3 ? color : null);\r\n    }\r\n\r\n    for (const line of lines) {\r\n      const acquired = smooth(line.cx - .07, line.cx + .06, scan) * cloud;\r\n      strokeWorld(line.a, line.b, line.type === 1 ? '#a8adb0' : '#b3b3b3', line.type === 1 ? .50 : .75, (.52 - acquired * .35) * (1 - bare * .70));\r\n    }\r\n\r\n    const corners = [[-1, -.079, -.72], [1, -.079, -.72], [1, -.079, .72], [-1, -.079, .72]];\r\n    for (let i = 0; i < 4; i++) strokeWorld(corners[i], corners[(i + 1) % 4], '#666666', .6, .28);\r\n    for (const y of [-.04, 0]) for (let i = 0; i < 4; i++) strokeWorld([corners[i][0], y, corners[i][2]], [corners[(i + 1) % 4][0], y, corners[(i + 1) % 4][2]], '#646b70', .45, .10);\r\n\r\n    if (contour > .005) {\r\n      ctx.globalAlpha = contour * .76; ctx.strokeStyle = '#FFB601'; ctx.lineWidth = .90;\r\n      ctx.beginPath();\r\n      for (const c of contours) {\r\n        for (const [a, b] of c.segments) {\r\n          if (classified((a[2] + b[2]) * .5) < .3) continue;\r\n          const p = projection(a), q = projection(b);\r\n          ctx.moveTo(p[0], p[1]); ctx.lineTo(q[0], q[1]);\r\n        }\r\n      }\r\n      ctx.stroke();\r\n    }\r\n\r\n    buckets.forEach(b => b.length = 0);\r\n    for (const p of points) {\r\n      const acquired = smooth(p.x - .06, p.x + .07, scan) * cloud;\r\n      if (acquired < .008) continue;\r\n      let alpha = acquired * (.43 + p.r * .44);\r\n      if (p.type === 2) alpha *= 1 - classified(p.z) * .94;\r\n      if (p.type === 3) alpha *= 1 - bare * .68;\r\n      if (p.type === 0) alpha *= 1 - contour * .36;\r\n      const edge = Math.max(0, 1 - Math.abs(p.x - scan) \/ .045) * (1 - bare);\r\n      const gr = p.type === 0 ? Math.max(0, 1 - Math.abs(p.z - classificationZ) \/ .065) * bare * (1 - reset) : 0;\r\n      const a = clamp(alpha + edge * .30);\r\n      const ci = (edge > .25 || gr > .3) ? 0 : p.type === 1 ? 1 : p.type === 3 ? 2 : p.type === 2 ? 3 : 4;\r\n      const s = p.size * (width <= 1024 ? .82 : 1) * (edge > .3 ? 1.32 : 1);\r\n      const px = originX + (p.x * cos - p.z * sin) * scale, py = originY + ((p.x * sin + p.z * cos) * pitch - p.y * vertical) * scale;\r\n      buckets[ci * 8 + Math.min(7, (a * 8) | 0)].push(px - s \/ 2, py - s \/ 2, s);\r\n    }\r\n    for (let k = 0; k < 40; k++) {\r\n      const b = buckets[k]; if (!b.length) continue;\r\n      ctx.fillStyle = PCOL[(k \/ 8) | 0]; ctx.globalAlpha = ((k % 8) + .5) \/ 8;\r\n      for (let i = 0; i < b.length; i += 3) ctx.fillRect(b[i], b[i + 1], b[i + 2], b[i + 2]);\r\n    }\r\n\r\n    const returnHome = smooth(.89, 1, t), park = smooth(.47, .68, t);\r\n    const droneX = lerp(lerp(scan, .08, park), -1.08, returnHome);\r\n    const droneZ = lerp(-.43 * park, 0, returnHome);\r\n    const droneY = .93 + (motion.matches ? 0 : Math.sin(t * TAU * 3) * .011);\r\n    const sensor = [droneX, droneY - .169, droneZ];\r\n\r\n    const scanAlpha = smooth(.11, .15, t) * (1 - smooth(.44, .49, t));\r\n    if (scanAlpha > .005) {\r\n      for (let j = 0; j < 16; j++) {\r\n        const z = -.72 + j \/ 16 * 1.44, z2 = z + 1.44 \/ 16;\r\n        const a = [scan, terrain(scan, z) + .010, z], b = [scan, terrain(scan, z2) + .010, z2];\r\n        polygon([sensor, a, b], '#FFB601', scanAlpha * (.012 + (j % 3 === 0 ? .018 : 0)));\r\n        if (j % 2 === 0) strokeWorld(sensor, a, '#FFB601', .65, scanAlpha * (j % 4 === 0 ? .20 : .10));\r\n      }\r\n      ctx.globalAlpha = scanAlpha * .93; ctx.strokeStyle = '#FFB601'; ctx.lineWidth = 1.35;\r\n      ctx.beginPath();\r\n      for (let j = 0; j <= 80; j++) {\r\n        const z = -.72 + 1.44 * j \/ 80, p = projection([scan, terrain(scan, z) + .007, z]);\r\n        if (j) ctx.lineTo(p[0], p[1]); else ctx.moveTo(p[0], p[1]);\r\n      }\r\n      ctx.stroke();\r\n    }\r\n\r\n    const revealAlpha = smooth(.50, .54, t) * (1 - smooth(.65, .70, t)) * (1 - reset);\r\n    if (revealAlpha > .005) {\r\n      ctx.globalAlpha = revealAlpha * .55; ctx.strokeStyle = '#FFB601'; ctx.lineWidth = .95;\r\n      ctx.beginPath();\r\n      for (let i = 0; i <= 80; i++) {\r\n        const x = -1 + 2 * i \/ 80, p = projection([x, terrain(x, classificationZ) + .008, classificationZ]);\r\n        if (i) ctx.lineTo(...p); else ctx.moveTo(...p);\r\n      }\r\n      ctx.stroke();\r\n    }\r\n\r\n    const shadowCenter = [clamp(droneX, -1, 1), terrain(clamp(droneX, -1, 1), droneZ) + .012, droneZ];\r\n    ring(shadowCenter, .11, .064, '#000000', .07, 0, '#000000');\r\n    drawDrone(droneX, droneY, droneZ, t);\r\n\r\n    const labels = ['Drone acquisition', 'Point cloud capture', 'Canopy \u2192 ground classification', 'Terrain & elevation contours'];\r\n    const state = t < .13 ? 0 : t < .50 ? 1 : t < .68 ? 2 : 3;\r\n    if (currentLabel !== state) {\r\n      phase.textContent = labels[state];\r\n      index.textContent = `0${state + 1} \/ 04`;\r\n      currentLabel = state;\r\n    }\r\n  }\r\n\r\n  const active = () => !destroyed && !motion.matches && inView && !document.hidden && width > 0 && height > 0;\r\n\r\n  function frame(now) {\r\n    raf = 0;\r\n    if (!root.isConnected) { destroy(); return; }\r\n    if (!active()) { lastTime = 0; return; }\r\n    if (lastTime) clock += Math.min(80, now - lastTime);\r\n    lastTime = now;\r\n    if (scrolling) { raf = requestAnimationFrame(frame); return; }\r\n    if (now - lastPaint >= 1000 \/ 30) {\r\n      render((clock % duration) \/ duration);\r\n      lastPaint = now;\r\n    }\r\n    raf = requestAnimationFrame(frame);\r\n  }\r\n\r\n  function schedule() { if (active() && !raf) { lastTime = 0; raf = requestAnimationFrame(frame); } }\r\n  function suspend() { if (raf) cancelAnimationFrame(raf); raf = 0; lastTime = 0; }\r\n\r\n  function resize() {\r\n    width = root.clientWidth || window.innerWidth;\r\n    height = root.clientHeight || window.innerHeight;\r\n    if (!width || !height) { suspend(); return; }\r\n    dpr = Math.min(window.devicePixelRatio || 1, 1.25);\r\n    if (canvas.width === Math.round(width * dpr) && canvas.height === Math.round(height * dpr)) return;\r\n\r\n    canvas.width = Math.round(width * dpr);\r\n    canvas.height = Math.round(height * dpr);\r\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n\r\n    const isMobile = width <= 1024;\r\n    if (isMobile) {\r\n      \/\/ Mobile \/ Tablet: reduced size and nudged slightly down\r\n      scale = Math.min(width * 0.31, height * 0.27);\r\n      originX = width * 0.50;\r\n      originY = height * 0.74;\r\n    } else {\r\n      \/\/ Desktop (>1024px): reduced size and shifted down so the drone clears the top bar\r\n      scale = Math.min(width * 0.23, height * 0.43);\r\n      originX = width * 0.68;\r\n      originY = height * 0.63;\r\n    }\r\n\r\n    render(motion.matches ? 0.82 : (clock % duration) \/ duration);\r\n    schedule();\r\n  }\r\n\r\n  function motionChanged() {\r\n    if (motion.matches) { suspend(); render(.82); }\r\n    else { schedule(); }\r\n  }\r\n\r\n  function visibilityChanged() { if (document.hidden) suspend(); else schedule(); }\r\n\r\n  const repaint = () => render(motion.matches ? .82 : lastT);\r\n\r\n  function pointerDown(event) {\r\n    if (event.button !== undefined && event.button !== 0) return;\r\n    if (pointer) return;\r\n    pointer = { id: event.pointerId, x: event.clientX, y: event.clientY, orbit, tilt };\r\n    if (canvas.setPointerCapture) canvas.setPointerCapture(event.pointerId);\r\n    canvas.focus({ preventScroll: true });\r\n    root.classList.add('vl-dragging');\r\n  }\r\n\r\n  function pointerMove(event) {\r\n    if (pointer && event.pointerId === pointer.id) {\r\n      const dx = event.clientX - pointer.x, dy = event.clientY - pointer.y;\r\n      orbit = clamp(pointer.orbit + dx * .004, -.62, .62);\r\n      tilt = clamp(pointer.tilt + dy * .0012, -.10, .10);\r\n      if (Math.abs(dx) + Math.abs(dy) > 3) dragged = true;\r\n      repaint(); return;\r\n    }\r\n    const rect = canvas.getBoundingClientRect();\r\n    const next = Math.hypot(event.clientX - rect.left - droneScreen[0], event.clientY - rect.top - droneScreen[1]) < scale * .28;\r\n    if (next !== hoverDrone) { hoverDrone = next; repaint(); }\r\n  }\r\n\r\n  function pointerUp(event) {\r\n    if (!pointer || event.pointerId !== pointer.id) return;\r\n    pointer = null;\r\n    root.classList.remove('vl-dragging');\r\n    if (canvas.hasPointerCapture && canvas.hasPointerCapture(event.pointerId)) canvas.releasePointerCapture(event.pointerId);\r\n  }\r\n\r\n  function pointerLeave() { if (!pointer && hoverDrone) { hoverDrone = false; repaint(); } }\r\n\r\n  function resetView() {\r\n    orbit = 0; tilt = 0; dragged = false; hoverDrone = false; pointer = null;\r\n    root.classList.remove('vl-dragging'); repaint();\r\n  }\r\n\r\n  function keyDown(event) {\r\n    if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home'].includes(event.key)) return;\r\n    event.preventDefault(); dragged = true;\r\n    if (event.key === 'Home') { resetView(); return; }\r\n    if (event.key === 'ArrowLeft') orbit = clamp(orbit - .09, -.62, .62);\r\n    if (event.key === 'ArrowRight') orbit = clamp(orbit + .09, -.62, .62);\r\n    if (event.key === 'ArrowUp') tilt = clamp(tilt - .035, -.10, .10);\r\n    if (event.key === 'ArrowDown') tilt = clamp(tilt + .035, -.10, .10);\r\n    repaint();\r\n  }\r\n\r\n  canvas.addEventListener('pointerdown', pointerDown);\r\n  canvas.addEventListener('pointermove', pointerMove);\r\n  canvas.addEventListener('pointerup', pointerUp);\r\n  canvas.addEventListener('pointercancel', pointerUp);\r\n  canvas.addEventListener('lostpointercapture', pointerUp);\r\n  canvas.addEventListener('pointerleave', pointerLeave);\r\n  canvas.addEventListener('keydown', keyDown);\r\n  document.addEventListener('visibilitychange', visibilityChanged);\r\n  if (motion.addEventListener) motion.addEventListener('change', motionChanged); else motion.addListener(motionChanged);\r\n\r\n  const resizeObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(resize) : null;\r\n  if (resizeObserver) resizeObserver.observe(root); else window.addEventListener('resize', resize, { passive: true });\r\n\r\n  const intersection = typeof IntersectionObserver !== 'undefined' ? new IntersectionObserver(entries => {\r\n    inView = entries[0].isIntersecting;\r\n    if (inView) schedule(); else suspend();\r\n  }, { threshold: 0 }) : null;\r\n  if (intersection) intersection.observe(root);\r\n\r\n  const removalObserver = new MutationObserver(() => { if (!root.isConnected) destroy(); });\r\n  removalObserver.observe(document.documentElement, { childList: true, subtree: true });\r\n\r\n  function destroy() {\r\n    if (destroyed) return;\r\n    destroyed = true;\r\n    suspend();\r\n    if (resizeObserver) resizeObserver.disconnect();\r\n    window.removeEventListener('resize', resize);\r\n    if (intersection) intersection.disconnect();\r\n    removalObserver.disconnect();\r\n    document.removeEventListener('visibilitychange', visibilityChanged);\r\n    canvas.removeEventListener('pointerdown', pointerDown);\r\n    canvas.removeEventListener('pointermove', pointerMove);\r\n    canvas.removeEventListener('pointerup', pointerUp);\r\n    canvas.removeEventListener('pointercancel', pointerUp);\r\n    canvas.removeEventListener('lostpointercapture', pointerUp);\r\n    canvas.removeEventListener('pointerleave', pointerLeave);\r\n    canvas.removeEventListener('keydown', keyDown);\r\n    root.classList.remove('vl-dragging');\r\n    if (motion.removeEventListener) motion.removeEventListener('change', motionChanged); else motion.removeListener(motionChanged);\r\n    if (root.__vlDestroy === destroy) delete root.__vlDestroy;\r\n  }\r\n\r\n  root.__vlDestroy = destroy;\r\n  hint.hidden = false;\r\n  resize();\r\n  requestAnimationFrame(() => root.classList.add('vl-ready'));\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c4d574b e-con-full e-flex e-con e-child\" data-id=\"c4d574b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a046852 elementor-icon-list--layout-inline elementor-mobile-align-center elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"a046852\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/volatusaerospace.com\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Home<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">\/<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/volatusaerospace.com\/fr-ca\/services\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Services<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">\/<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/volatusaerospace.com\/fr-ca\/services\/technical-capabilities\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Technical Capabilities<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">\/<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\"> <span style=\"color: #FFB601\">Lidar Mapping<span><\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3d68768 elementor-widget-mobile__width-inherit elementor-widget__width-inherit elementor-widget-laptop__width-initial elementor-widget-tablet__width-initial elementor-widget elementor-widget-heading\" data-id=\"3d68768\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Lidar\n <span style=\"color: #FFB601\">Mapping\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-131b724 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget-laptop__width-initial elementor-widget-tablet__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"131b724\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tLidar uses laser pulses to capture three-dimensional information about terrain, vegetation, infrastructure, and other physical features. The resulting point cloud is a detailed spatial record for surveying, terrain modelling, corridor mapping, infrastructure assessment, and environmental analysis- with accuracy verified against independent checkpoints.\n\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7663f5e e-con-full e-flex e-con e-child\" data-id=\"7663f5e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-513c229 elementor-widget elementor-widget-button\" data-id=\"513c229\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6IjQ5NjIiLCJ0b2dnbGUiOmZhbHNlfQ%3D%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Talk To An Expert<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c63a972 e-con-full e-flex e-con e-child\" data-id=\"c63a972\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;position&quot;:&quot;absolute&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-215a639 elementor-widget elementor-widget-html\" data-id=\"215a639\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"scroll-indicator-container\">\r\n  <svg class=\"scroll-arrow arrow-1\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\r\n  <svg class=\"scroll-arrow arrow-2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\r\n  <svg class=\"scroll-arrow arrow-3\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>\r\n<\/div>\r\n\r\n<style>\r\n.scroll-indicator-container {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n}\r\n\r\n.scroll-arrow {\r\n  color: #555555; \/* Base gray color *\/\r\n  animation: lightSequence 2s infinite;\r\n  margin-top: -12px; \/* Adjusted overlap for smaller arrows *\/\r\n}\r\n\r\n\/* Delaying each arrow to create the cascading light effect *\/\r\n.arrow-1 { animation-delay: 0s; }\r\n.arrow-2 { animation-delay: 0.3s; }\r\n.arrow-3 { animation-delay: 0.6s; }\r\n\r\n@keyframes lightSequence {\r\n  0% { color: #555555; }\r\n  20% { \r\n    color: #ffffff; \/* White light *\/\r\n  }\r\n  40% { color: #555555; }\r\n  100% { color: #555555; }\r\n}\r\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8b12557 e-flex e-con-boxed e-con e-parent\" data-id=\"8b12557\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0c68631 e-con-full e-flex e-con e-child\" data-id=\"0c68631\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-c05d05f e-con-full e-flex e-con e-child\" data-id=\"c05d05f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-22182c6 e-con-full e-flex e-con e-child\" data-id=\"22182c6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-606c45c elementor-widget elementor-widget-heading\" data-id=\"606c45c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Overview <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cf7418d elementor-widget elementor-widget-text-editor\" data-id=\"cf7418d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Lidar uses laser pulses to capture three-dimensional information about terrain, vegetation, infrastructure, and other physical features. The resulting point cloud provides a detailed spatial record that can be used for surveying, terrain modelling, corridor mapping, infrastructure assessment, and environmental analysis.<\/p><p>Volatus combines aerial and terrestrial lidar acquisition with GNSS\/INS positioning, post-processed (PPK) trajectories, and geospatial processing to produce survey-grade datasets, with accuracy verified against independent checkpoints. Depending on the project, outputs can include classified point clouds, digital terrain models, digital surface models, elevation data, 3D models, and other GIS-read<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4a3f00d e-con-full e-flex e-con e-child\" data-id=\"4a3f00d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ddc869b elementor-widget elementor-widget-image\" data-id=\"ddc869b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"419\" src=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/Lidar-Overview-1024x536.webp\" class=\"attachment-large size-large wp-image-38751\" alt=\"\" srcset=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/Lidar-Overview-1024x536.webp 1024w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/Lidar-Overview-300x157.webp 300w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/Lidar-Overview-768x402.webp 768w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/Lidar-Overview-18x9.webp 18w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/Lidar-Overview.webp 1200w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-746412d e-flex e-con-boxed e-con e-parent\" data-id=\"746412d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-b2ae131 e-con-full e-flex e-con e-child\" data-id=\"b2ae131\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ade9708 e-con-full e-flex e-con e-child\" data-id=\"ade9708\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-8a7dc8e e-con-full e-flex e-con e-child\" data-id=\"8a7dc8e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a8f6782 elementor-widget elementor-widget-heading\" data-id=\"a8f6782\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What is <span style=\"color: #FFB601\">lidar?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9959558 elementor-widget elementor-widget-text-editor\" data-id=\"9959558\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><span data-contrast=\"auto\">Lidar stands for Light Detection and Ranging. A lidar sensor emits laser pulses and measures the time taken for each pulse to return after hitting a surface. These measurements are combined with positioning and inertial data to calculate the location of each return in three dimensions.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">The resulting point cloud contains millions of spatially referenced points representing terrain, vegetation, structures, and other features within the survey area.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">A single laser pulse can also produce multiple returns as it passes through vegetation. Part of the pulse reaches the ground through gaps in the canopy, which makes lidar particularly useful for mapping terrain under vegetation, where conventional aerial imagery only sees the top of the canopy. Ground return density decreases under dense, leaf-on vegetation, so leaf-off acquisition is preferred when bare earth is the priority. Volatus lidar systems include multi-echo capabilities on selected platforms.<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1ff4689 e-con-full e-flex e-con e-child\" data-id=\"1ff4689\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c4d4bb5 elementor-widget__width-inherit elementor-widget elementor-widget-image\" data-id=\"c4d4bb5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"250\" src=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/What-is-lidar-1024x320.webp\" class=\"attachment-large size-large wp-image-38756\" alt=\"\" srcset=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/What-is-lidar-1024x320.webp 1024w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/What-is-lidar-300x94.webp 300w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/What-is-lidar-768x240.webp 768w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/What-is-lidar-1536x480.webp 1536w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/What-is-lidar-18x6.webp 18w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/What-is-lidar.webp 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0c7c202 e-flex e-con-boxed e-con e-parent\" data-id=\"0c7c202\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-70cadde e-con-full e-flex e-con e-child\" data-id=\"70cadde\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3599594 e-con-full e-flex e-con e-child\" data-id=\"3599594\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a9b9873 e-con-full e-flex e-con e-child\" data-id=\"a9b9873\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5e4b061 elementor-widget elementor-widget-heading\" data-id=\"5e4b061\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">How lidar<span style=\"color: #FFB601\"> mapping works<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1fd56dd elementor-widget elementor-widget-text-editor\" data-id=\"1fd56dd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Lidar mapping starts with mission planning around the required coverage, point density, terrain, asset type, accuracy, and deliverables. Point density is set by flight altitude, speed, line spacing, overlap, and the sensor&#8217;s pulse rate.<\/p><p>A lidar payload collects laser measurements while GNSS and inertial systems record the position and orientation of the sensor. The sensor trajectory is post-processed (PPK) against a base station to georeference the collected data accurately. Independent checkpoints surveyed on the ground are then used to verify the final accuracy.<\/p><p>The resulting point cloud is processed and classified to separate ground, vegetation, structures, and other relevant features. Derived datasets can then be generated for terrain modelling, elevation analysis, infrastructure mapping, volumetric measurement, and 3D modelling.<\/p><p>Volatus supports lidar workflows using aerial UAV platforms as well as terrestrial and vehicle-mounted systems. This allows the acquisition method to be selected around the site and the required data rather than limiting the survey to one platform.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b49e639 e-con-full e-flex e-con e-child\" data-id=\"b49e639\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bcafb37 elementor-widget__width-inherit elementor-widget elementor-widget-image\" data-id=\"bcafb37\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"713\" height=\"401\" src=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/How-lidar-mapping-works-.webp\" class=\"attachment-large size-large wp-image-38749\" alt=\"\" srcset=\"https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/How-lidar-mapping-works-.webp 713w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/How-lidar-mapping-works--300x169.webp 300w, https:\/\/volatusaerospace.com\/wp-content\/uploads\/2026\/10\/How-lidar-mapping-works--18x10.webp 18w\" sizes=\"(max-width: 713px) 100vw, 713px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c09807f e-con-full e-flex e-con e-parent\" data-id=\"c09807f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b5addfd elementor-widget elementor-widget-heading\" data-id=\"b5addfd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Lidar data <span style=\"color: #FFB601\">and deliverables <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9054344 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"9054344\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tLidar acquisition produces a three-dimensional point cloud that can be processed into different geospatial products.\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ecc25b1 elementor-widget elementor-widget-html\" data-id=\"ecc25b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- VOLATUS DELIVERABLES v2 \/ Paste this entire section file into one Elementor HTML widget. Unique instance ID: volatus-deliverables. Animations use synthetic illustrative survey data, not project exports. No external JavaScript libraries required. -->\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400..700;1,9..40,400..700&family=Montserrat:ital,wght@0,400..800;1,400..800&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap\" rel=\"stylesheet\">\r\n<section id=\"volatus-deliverables\" aria-labelledby=\"vd-title\">\r\n<div class=\"vd-shell\">\r\n<div class=\"vd-grid\">\r\n<article class=\"vd-card vd-cloud\" data-kind=\"cloud\" aria-labelledby=\"vd-title-cloud\"><div class=\"vd-card-header\"><h3 id=\"vd-title-cloud\">Classified point clouds<\/h3><span class=\"vd-format\">.LAS \/ .LAZ<\/span><\/div><p class=\"vd-description\">Separate ground, vegetation, structures, and other features within the dataset (LAS\/LAZ).<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"cloud\" role=\"img\" aria-label=\"Animated illustrative classified point clouds output\"><\/canvas><span class=\"vd-stage-tag\">CLASSIFICATION \/ 4 CLASSES<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><button type=\"button\" class=\"vd-open\" aria-haspopup=\"dialog\" aria-controls=\"vd-viewer\">Orbit the point cloud <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/article>\r\n<article class=\"vd-card vd-dtm\" data-kind=\"dtm\" aria-labelledby=\"vd-title-dtm\"><div class=\"vd-card-header\"><h3 id=\"vd-title-dtm\">Digital terrain model<\/h3><span class=\"vd-format\">.TIF<\/span><\/div><p class=\"vd-description\">Represent the bare-earth surface for elevation, slope, drainage, grading, and terrain analysis.<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"dtm\" role=\"img\" aria-label=\"Animated illustrative digital terrain model output\"><\/canvas><span class=\"vd-stage-tag\">OUTPUT PREVIEW \/ GeoTIFF<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><\/div><\/article>\r\n<article class=\"vd-card vd-dsm\" data-kind=\"dsm\" aria-labelledby=\"vd-title-dsm\"><div class=\"vd-card-header\"><h3 id=\"vd-title-dsm\">Digital surface model<\/h3><span class=\"vd-format\">.TIF<\/span><\/div><p class=\"vd-description\">Represent the elevation of the ground together with structures, vegetation, and other surface features.<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"dsm\" role=\"img\" aria-label=\"Animated illustrative digital surface model output\"><\/canvas><span class=\"vd-stage-tag\">OUTPUT PREVIEW \/ GeoTIFF<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><\/div><\/article>\r\n<article class=\"vd-card vd-mesh\" data-kind=\"mesh\" aria-labelledby=\"vd-title-mesh\"><div class=\"vd-card-header\"><h3 id=\"vd-title-mesh\">3D models & meshes<\/h3><span class=\"vd-format\">.OBJ \/ .GLB<\/span><\/div><p class=\"vd-description\">See survey geometry become connected triangles, reconstructing facilities and built assets.<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"mesh\" role=\"img\" aria-label=\"Animated illustrative 3d models & meshes output\"><\/canvas><span class=\"vd-stage-tag\">OUTPUT PREVIEW \/ OBJ \/ GLB<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><\/div><\/article>\r\n<article class=\"vd-card vd-contours\" data-kind=\"contours\" aria-labelledby=\"vd-title-contours\"><div class=\"vd-card-header\"><h3 id=\"vd-title-contours\">Elevation & contours<\/h3><span class=\"vd-format\">.DXF \/ .SHP<\/span><\/div><p class=\"vd-description\">Equal-elevation lines describe slope, ridge lines and changes in terrain.<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"contours\" role=\"img\" aria-label=\"Animated illustrative elevation & contours output\"><\/canvas><span class=\"vd-stage-tag\">OUTPUT PREVIEW \/ DXF \/ SHP<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><\/div><\/article>\r\n<article class=\"vd-card vd-volume\" data-kind=\"volume\" aria-labelledby=\"vd-title-volume\"><div class=\"vd-card-header\"><h3 id=\"vd-title-volume\">Volumetric measurements<\/h3><span class=\"vd-format\">.CSV \/ .PDF<\/span><\/div><p class=\"vd-description\">A measured stockpile surface is compared with a defined reference base.<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"volume\" role=\"img\" aria-label=\"Animated illustrative volumetric measurements output\"><\/canvas><span class=\"vd-stage-tag\">OUTPUT PREVIEW \/ CSV \/ PDF<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><\/div><\/article>\r\n<article class=\"vd-card vd-gis\" data-kind=\"gis\" aria-labelledby=\"vd-title-gis\"><div class=\"vd-card-header\"><h3 id=\"vd-title-gis\">GIS & CAD-ready data<\/h3><span class=\"vd-format\">.DWG \/ .SHP<\/span><\/div><p class=\"vd-description\">Processed datasets can be incorporated into existing geospatial and engineering workflows (GeoTIFF, DXF\/DWG, SHP).<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"gis\" role=\"img\" aria-label=\"Animated illustrative gis & cad-ready data output\"><\/canvas><span class=\"vd-stage-tag\">OUTPUT PREVIEW \/ DWG \/ SHP<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><\/div><\/article>\r\n<article class=\"vd-card vd-qa\" data-kind=\"qa\" aria-labelledby=\"vd-title-qa\"><div class=\"vd-card-header\"><h3 id=\"vd-title-qa\">Accuracy & QA report<\/h3><span class=\"vd-format\">.PDF \/ .CSV<\/span><\/div><p class=\"vd-description\">Checkpoint results documenting the vertical and horizontal accuracy achieved.<\/p><div class=\"vd-stage\"><canvas data-vd-scene=\"qa\" role=\"img\" aria-label=\"Animated illustrative accuracy & qa report output\"><\/canvas><span class=\"vd-stage-tag\">OUTPUT PREVIEW \/ PDF \/ CSV<\/span><div class=\"vd-telemetry\" aria-hidden=\"true\"><\/div><button type=\"button\" class=\"vd-replay\" aria-label=\"Replay this deliverable animation\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.85.83 6.72 2.24L21 7\"\/><path d=\"M21 3v4h-4\"\/><\/svg><\/button><\/div><\/article>\r\n<\/div><\/div>\r\n<dialog id=\"vd-viewer\" aria-labelledby=\"vd-modal-title\"><div class=\"vd-modal-head\"><div><span class=\"vd-kicker\">INTERACTIVE DATA EXPLORER<\/span><h3 id=\"vd-modal-title\">Classified point cloud<\/h3><\/div><button class=\"vd-close\" type=\"button\" aria-label=\"Close point cloud viewer\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"><\/line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"><\/line><\/svg><\/button><\/div><div class=\"vd-viewer-layout\"><div class=\"vd-webgl-wrap\"><canvas class=\"vd-webgl\" tabindex=\"0\" aria-label=\"3D point cloud. Drag to orbit, scroll or pinch to zoom. Arrow keys rotate; plus and minus zoom; R resets.\"><\/canvas><div class=\"vd-viewer-top\"><span class=\"vd-cloud-count\" aria-live=\"polite\"><\/span><span>ILLUSTRATIVE \/ LOCAL DATA<\/span><\/div><div class=\"vd-no-webgl\" hidden>WebGL is unavailable in this browser. The animated classified-point preview remains available in the section.<button type=\"button\" class=\"vd-close-fallback\">Return to deliverables<\/button><\/div><div class=\"vd-viewer-help\">DRAG TO ORBIT <span>\u00b7<\/span> SCROLL \/ PINCH TO ZOOM <span>\u00b7<\/span> ARROW KEYS + \/ \u2212<\/div><\/div><aside class=\"vd-viewer-controls\"><h4>Point classification<\/h4><p>Show or hide each return class in real time.<\/p><div class=\"vd-class-list\"><label><input type=\"checkbox\" data-vd-class=\"0\" checked><i style=\"--key:#c99562\"><\/i><span>Ground<\/span><b><\/b><\/label><label><input type=\"checkbox\" data-vd-class=\"1\" checked><i style=\"--key:#9ce276\"><\/i><span>Low vegetation<\/span><b><\/b><\/label><label><input type=\"checkbox\" data-vd-class=\"2\" checked><i style=\"--key:#30a976\"><\/i><span>High vegetation<\/span><b><\/b><\/label><label><input type=\"checkbox\" data-vd-class=\"3\" checked><i style=\"--key:#ffb601\"><\/i><span>Structures<\/span><b><\/b><\/label><\/div><label class=\"vd-mode-label\">Colour mode<select class=\"vd-mode\"><option value=\"0\">Classification<\/option><option value=\"1\">Elevation<\/option><\/select><\/label><label class=\"vd-size-label\">Point size <input class=\"vd-point-size\" type=\"range\" min=\"1\" max=\"5\" step=\"0.25\" value=\"2.25\"><\/label><div class=\"vd-camera-buttons\"><button type=\"button\" data-vd-camera=\"top\">Top view<\/button><button type=\"button\" data-vd-camera=\"reset\">Reset view<\/button><button type=\"button\" data-vd-camera=\"in\" aria-label=\"Zoom in\">\uff0b<\/button><button type=\"button\" data-vd-camera=\"out\" aria-label=\"Zoom out\">\u2212<\/button><\/div><p class=\"vd-viewer-note\">Illustrative survey geometry. Show or hide ground, vegetation and buildings to inspect the complete dataset.<\/p><\/aside><\/div><\/dialog>\r\n<\/section><style>\r\n#volatus-deliverables{--vd-gold:#FFB601;--vd-gold-hover:#ffc433;--vd-gold-glow:rgba(255,182,1,.35);--vd-black:#111111;--vd-card-bg:linear-gradient(135deg,#181818 0%,#121212 100%);--vd-text:#F5F5F5;--vd-muted:#A3A3A3;--vd-mono:'Space Mono',monospace;--vd-head:'Montserrat',sans-serif;--vd-body:'DM Sans',sans-serif;position:relative!important;width:100%!important;padding:32px 20px!important;margin:0!important;background:#000000!important;color:var(--vd-text)!important;font:400 15px\/1.6 var(--vd-body)!important;isolation:isolate;color-scheme:dark;overflow:hidden!important}\r\n#volatus-deliverables,#volatus-deliverables *,#volatus-deliverables *::before,#volatus-deliverables *::after{box-sizing:border-box!important}\r\n#volatus-deliverables .vd-shell{max-width:1320px!important;margin:0 auto!important;width:100%!important}\r\n#volatus-deliverables button,#volatus-deliverables input,#volatus-deliverables select{font:inherit!important;letter-spacing:inherit!important;box-shadow:none!important;text-transform:none!important}\r\n#volatus-deliverables button,#volatus-deliverables input[type=\"button\"],#volatus-deliverables input[type=\"submit\"],#volatus-deliverables input[type=\"reset\"]{cursor:pointer!important;border-radius:0!important;margin:0!important;color:inherit!important;min-height:0!important;min-width:0!important;box-sizing:border-box!important;appearance:none!important;-webkit-appearance:none!important}\r\n#volatus-deliverables button:focus-visible,#volatus-deliverables input:focus-visible,#volatus-deliverables select:focus-visible{outline:2px solid var(--vd-gold);outline-offset:3px}\r\n#volatus-deliverables canvas{outline:none!important}\r\n#volatus-deliverables .vd-grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:18px}\r\n#volatus-deliverables .vd-card{position:relative;grid-column:span 3;min-width:0;padding:22px 18px 20px;background:var(--vd-card-bg);border:1px solid rgba(255,255,255,0.14)!important;border-radius:0!important;overflow:hidden;box-shadow:none;transition:border-color .22s ease}\r\n#volatus-deliverables .vd-card:hover,#volatus-deliverables .vd-card:focus-within{border-color:var(--vd-gold)!important}\r\n#volatus-deliverables .vd-card>*{position:relative}\r\n#volatus-deliverables .vd-card-header{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:9px}\r\n#volatus-deliverables .vd-format{color:var(--vd-gold);font:700 9px\/1.4 var(--vd-mono);padding:4px 7px;background:rgba(255,182,1,.08);border:1px solid rgba(255,182,1,.25);white-space:nowrap;border-radius:0}\r\n#volatus-deliverables h3{margin:0!important;font:600 19px\/1.35 var(--vd-head)!important;color:#FFFFFF!important;letter-spacing:-.025em!important}\r\n#volatus-deliverables .vd-description{font:400 15px\/1.65 var(--vd-body);  color: #FFFFFF;\r\nmargin:0 0 19px;min-height:60px;max-width:49ch}\r\n#volatus-deliverables .vd-stage{height:250px;background:radial-gradient(ellipse at 50% 55%,#181818,#0b0b0b 75%);border:1px solid rgba(255,255,255,.08);border-radius:0;position:relative;overflow:hidden;isolation:isolate;contain:paint}\r\n#volatus-deliverables .vd-stage::after{content:'';position:absolute;inset:0;background:linear-gradient(0deg,rgba(11,11,11,.8),transparent 25%,transparent 85%,rgba(11,11,11,.5));pointer-events:none}\r\n#volatus-deliverables .vd-stage canvas{display:block!important;width:100%!important;height:100%!important;margin:0!important;border:0!important;max-width:none!important}\r\n#volatus-deliverables .vd-stage-tag{position:absolute;left:12px;top:10px;z-index:1;color:#888888;font:8px var(--vd-mono);letter-spacing:.08em}\r\n#volatus-deliverables .vd-telemetry{position:absolute;left:12px;bottom:12px;z-index:1;color:#A3A3A3;font:8px var(--vd-mono);letter-spacing:.03em;pointer-events:none}\r\n#volatus-deliverables button.vd-replay,#volatus-deliverables .vd-replay{position:absolute!important;z-index:4!important;top:8px!important;right:8px!important;width:30px!important;height:30px!important;min-width:30px!important;max-width:30px!important;min-height:30px!important;max-height:30px!important;padding:0!important;margin:0!important;border:1px solid rgba(255,255,255,.14)!important;border-radius:0!important;background:rgba(18,18,18,.96)!important;color:#B3B3B3!important;display:flex!important;align-items:center!important;justify-content:center!important;text-align:center!important;line-height:1!important;cursor:pointer!important;box-sizing:border-box!important;outline:none!important;box-shadow:none!important;appearance:none!important;-webkit-appearance:none!important;transition:all .2s ease!important}\r\n#volatus-deliverables .vd-replay svg{width:13px!important;height:13px!important;display:block!important;pointer-events:none!important}\r\n#volatus-deliverables .vd-replay:hover{color:var(--vd-gold);border-color:var(--vd-gold);background:#181818}\r\n#volatus-deliverables .vd-cloud,#volatus-deliverables .vd-dtm,#volatus-deliverables .vd-gis,#volatus-deliverables .vd-qa{grid-column:span 6}\r\n#volatus-deliverables .vd-cloud .vd-stage,#volatus-deliverables .vd-dtm .vd-stage{height:320px}\r\n#volatus-deliverables .vd-cloud .vd-description,#volatus-deliverables .vd-dtm .vd-description,#volatus-deliverables .vd-gis .vd-description,#volatus-deliverables .vd-qa .vd-description{min-height:40px}\r\n#volatus-deliverables .vd-gis .vd-stage,#volatus-deliverables .vd-qa .vd-stage{height:270px}\r\n#volatus-deliverables button.vd-open,#volatus-deliverables .vd-open{position:absolute!important;bottom:10px!important;right:10px!important;z-index:3!important;border:1px solid rgba(255,182,1,.45)!important;border-radius:0!important;background:rgba(18,18,18,.96)!important;padding:8px 12px!important;min-height:0!important;max-height:36px!important;min-width:0!important;color:#FFFFFF!important;font:600 10px\/1 var(--vd-mono)!important;display:inline-flex!important;gap:10px!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;outline:none!important;box-shadow:none!important;appearance:none!important;-webkit-appearance:none!important;transition:all .22s ease!important}\r\n#volatus-deliverables .vd-open:hover{border-color:var(--vd-gold);color:#111111;background:var(--vd-gold)}\r\n#volatus-deliverables .vd-cloud .vd-telemetry{bottom:52px}\r\n#volatus-deliverables dialog{position:fixed!important;inset:0!important;margin:auto!important;width:min(1160px,calc(100% - 32px))!important;max-width:1160px!important;max-height:calc(100dvh - 32px)!important;overflow:auto!important;padding:0!important;border:1px solid rgba(255,182,1,.28)!important;border-radius:0!important;background:#141414!important;color:#F5F5F5!important;box-shadow:0 35px 160px rgba(0,0,0,.85)!important}\r\n#volatus-deliverables dialog::backdrop{background:rgba(0,0,0,.88);backdrop-filter:blur(8px)}\r\n#volatus-deliverables .vd-modal-head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:22px 26px;border-bottom:1px solid rgba(255,255,255,.08)}\r\n#volatus-deliverables .vd-modal-head h3{font:700 22px var(--vd-head)!important;color:#FFFFFF!important;letter-spacing:-.03em!important;margin:6px 0 0!important}\r\n#volatus-deliverables .vd-kicker{display:flex;align-items:center;gap:10px;font:700 11px\/1.5 var(--vd-head);letter-spacing:.14em;color:var(--vd-gold);text-transform:uppercase}\r\n#volatus-deliverables button.vd-close,#volatus-deliverables .vd-close{position:relative!important;width:36px!important;height:36px!important;min-width:36px!important;max-width:36px!important;min-height:36px!important;max-height:36px!important;padding:0!important;margin:0!important;border:1px solid rgba(255,255,255,.14)!important;border-radius:0!important;background:#1f1f1f!important;color:#CCCCCC!important;display:flex!important;align-items:center!important;justify-content:center!important;text-align:center!important;line-height:1!important;cursor:pointer!important;box-sizing:border-box!important;outline:none!important;box-shadow:none!important;appearance:none!important;-webkit-appearance:none!important;transition:all .2s ease!important}\r\n#volatus-deliverables .vd-close svg{width:14px!important;height:14px!important;display:block!important;pointer-events:none!important}\r\n#volatus-deliverables .vd-close:hover{border-color:var(--vd-gold);color:#111111;background:var(--vd-gold)}\r\n#volatus-deliverables .vd-viewer-layout{display:grid;grid-template-columns:1fr 265px;min-height:510px}\r\n#volatus-deliverables .vd-webgl-wrap{position:relative;min-width:0;background:radial-gradient(ellipse at center,#1c1c1c,#0a0a0a);min-height:440px}\r\n#volatus-deliverables .vd-webgl{display:block!important;width:100%!important;height:100%!important;position:absolute;inset:0;touch-action:none;cursor:grab;max-width:none!important}\r\n#volatus-deliverables .vd-webgl:active{cursor:grabbing}\r\n#volatus-deliverables .vd-viewer-top{position:absolute;left:18px;right:18px;top:16px;display:flex;justify-content:space-between;gap:12px;pointer-events:none;color:#888888;font:8px var(--vd-mono)}\r\n#volatus-deliverables .vd-viewer-help{position:absolute;bottom:15px;left:15px;right:15px;pointer-events:none;display:flex;justify-content:center;gap:10px;flex-wrap:wrap;color:#737373;font:8px var(--vd-mono)}\r\n#volatus-deliverables .vd-viewer-help span{color:var(--vd-gold)}\r\n#volatus-deliverables .vd-viewer-controls{padding:22px 19px;border-left:1px solid rgba(255,255,255,.08);background:#181818}\r\n#volatus-deliverables h4{margin:0 0 6px!important;color:#FFFFFF!important;font:700 14px var(--vd-head)!important;letter-spacing:-.02em!important}\r\n#volatus-deliverables .vd-viewer-controls p{font:11px\/1.6 var(--vd-body);color:var(--vd-muted);margin:0 0 19px}\r\n#volatus-deliverables .vd-class-list{display:flex;flex-direction:column;gap:6px;margin-bottom:24px}\r\n#volatus-deliverables .vd-class-list label{display:flex;align-items:center;gap:7px;padding:10px 9px;background:#202020;border:1px solid rgba(255,255,255,.08);border-radius:0;cursor:pointer;font-size:11px;color:#E0E0E0;font-family:var(--vd-body);transition:border-color .18s}\r\n#volatus-deliverables .vd-class-list label:hover{border-color:rgba(255,182,1,.35)}\r\n#volatus-deliverables input[type=checkbox]{accent-color:var(--vd-gold);width:14px;height:14px;margin:0 3px 0 0}\r\n#volatus-deliverables .vd-class-list i{width:6px;height:6px;border-radius:50%;background:var(--key)}\r\n#volatus-deliverables .vd-class-list b{margin-left:auto;font:8px var(--vd-mono);font-weight:400;color:#888888}\r\n#volatus-deliverables .vd-mode-label,#volatus-deliverables .vd-size-label{display:flex;flex-direction:column;gap:10px;color:#B3B3B3;font:10px var(--vd-mono);margin:16px 0}\r\n#volatus-deliverables .vd-mode{color:#F0F0F0;background:#202020;border:1px solid rgba(255,255,255,.12);padding:10px;width:100%;font-size:11px;border-radius:0;font-family:var(--vd-body)}\r\n#volatus-deliverables .vd-mode:focus{border-color:var(--vd-gold);outline:none}\r\n#volatus-deliverables input[type=range]{width:100%;accent-color:var(--vd-gold)}\r\n#volatus-deliverables .vd-camera-buttons{display:grid;grid-template-columns:1fr 1fr;gap:8px}\r\n#volatus-deliverables .vd-camera-buttons button{padding:8px 6px!important;margin:0!important;color:#D0D0D0!important;border:1px solid rgba(255,255,255,.12)!important;border-radius:0!important;background:#222222!important;font:10px\/1.2 var(--vd-mono)!important;min-height:32px!important;max-height:34px!important;min-width:0!important;display:flex!important;align-items:center!important;justify-content:center!important;text-align:center!important;box-sizing:border-box!important;outline:none!important;box-shadow:none!important;appearance:none!important;-webkit-appearance:none!important;transition:all .18s ease!important}\r\n#volatus-deliverables .vd-camera-buttons button:hover{border-color:var(--vd-gold);color:#111111;background:var(--vd-gold)}\r\n#volatus-deliverables .vd-viewer-note{margin:19px 0 0!important;font-size:10px!important;color:#737373!important;font-family:var(--vd-body)!important;line-height:1.5!important}\r\n#volatus-deliverables .vd-no-webgl{position:absolute;inset:45px 25px;align-content:center;color:#E0E0E0;text-align:center;font:14px\/1.6 var(--vd-body)}\r\n#volatus-deliverables .vd-no-webgl button{display:block;margin:20px auto;padding:10px 15px;background:var(--vd-gold);border:1px solid var(--vd-gold);color:#111111;font-weight:600;font-family:var(--vd-body);border-radius:0}\r\n\r\n#volatus-deliverables [hidden]{display:none!important}\r\n@media(min-width:1500px){#volatus-deliverables .vd-stage{height:258px}}\r\n@media(max-width:1024px) and (min-width:769px){\r\n  #volatus-deliverables .vd-card{grid-column:span 6}\r\n  #volatus-deliverables .vd-gis .vd-stage,#volatus-deliverables .vd-qa .vd-stage{height:260px}\r\n  #volatus-deliverables .vd-cloud .vd-stage,#volatus-deliverables .vd-dtm .vd-stage{height:280px}\r\n  #volatus-deliverables .vd-description{min-height:40px}\r\n}\r\n@media(max-width:768px){\r\n  #volatus-deliverables{padding:24px 12px!important}\r\n  #volatus-deliverables .vd-grid{display:flex!important;flex-direction:column!important;gap:18px!important}\r\n  #volatus-deliverables .vd-card{width:100%!important;max-width:100%!important;grid-column:auto!important;padding:18px 14px 16px!important}\r\n  #volatus-deliverables .vd-card-header{margin-bottom:8px}\r\n  #volatus-deliverables .vd-card-header h3{font-size:16px!important;line-height:1.3!important}\r\n  #volatus-deliverables .vd-format{font-size:8.5px!important;padding:3px 6px!important}\r\n  #volatus-deliverables .vd-description{min-height:0!important;font-size:13px!important;line-height:1.5!important;margin:0 0 14px!important}\r\n  #volatus-deliverables .vd-stage,\r\n  #volatus-deliverables .vd-cloud .vd-stage,\r\n  #volatus-deliverables .vd-dtm .vd-stage,\r\n  #volatus-deliverables .vd-gis .vd-stage,\r\n  #volatus-deliverables .vd-qa .vd-stage{height:250px!important}\r\n  #volatus-deliverables .vd-stage-tag{font-size:7px;left:10px;top:8px}\r\n  #volatus-deliverables .vd-telemetry{font-size:7.5px;left:10px;bottom:10px}\r\n  #volatus-deliverables button.vd-replay,#volatus-deliverables .vd-replay{width:28px!important;height:28px!important;min-width:28px!important;max-width:28px!important;min-height:28px!important;max-height:28px!important;top:6px!important;right:6px!important}\r\n  #volatus-deliverables .vd-replay svg{width:12px!important;height:12px!important}\r\n  #volatus-deliverables button.vd-close,#volatus-deliverables .vd-close{width:32px!important;height:32px!important;min-width:32px!important;max-width:32px!important;min-height:32px!important;max-height:32px!important}\r\n  #volatus-deliverables .vd-close svg{width:12px!important;height:12px!important}\r\n  #volatus-deliverables .vd-viewer-layout{display:flex!important;flex-direction:column!important}\r\n  #volatus-deliverables .vd-webgl-wrap{min-height:280px;height:45vh}\r\n  #volatus-deliverables .vd-viewer-controls{border-left:0;border-top:1px solid rgba(255,255,255,.08);padding:16px}\r\n  #volatus-deliverables .vd-class-list{display:grid;grid-template-columns:1fr 1fr;margin-bottom:14px}\r\n  #volatus-deliverables .vd-class-list label{font-size:10px}\r\n  #volatus-deliverables .vd-class-list b{font-size:7px}\r\n  #volatus-deliverables .vd-modal-head{padding:16px 18px}\r\n  #volatus-deliverables .vd-modal-head h3{font-size:17px!important}\r\n  #volatus-deliverables button.vd-open,#volatus-deliverables .vd-open{position:absolute!important;bottom:10px!important;right:10px!important;z-index:3!important;border:1px solid rgba(255,182,1,.45)!important;border-radius:0!important;background:rgba(18,18,18,.96)!important;padding:8px 12px!important;min-height:0!important;max-height:36px!important;min-width:0!important;color:#FFFFFF!important;font:600 10px\/1 var(--vd-mono)!important;display:inline-flex!important;gap:10px!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;outline:none!important;box-shadow:none!important;appearance:none!important;-webkit-appearance:none!important;transition:all .22s ease!important}\r\n  #volatus-deliverables .vd-cloud .vd-telemetry{bottom:48px}\r\n}\r\n<\/style>\r\n<script>\r\n(()=>{'use strict';\r\nconst root=document.getElementById('volatus-deliverables');if(!root||root.dataset.initialized)return;root.dataset.initialized='true';\r\nconst $=s=>root.querySelector(s),$$=s=>[...root.querySelectorAll(s)],TAU=Math.PI*2;\r\nconst reduced=matchMedia('(prefers-reduced-motion: reduce)');let paused=reduced.matches,clock=3.2,last=0,raf=0,destroyed=false,lastPaint=0;\r\nconst rampStops=[[118,67,246],[45,157,235],[52,209,163],[221,214,77],[255,79,61]];\r\nconst clamp=(x,a,b)=>Math.max(a,Math.min(b,x)),lerp=(a,b,t)=>a+(b-a)*t;\r\nfunction ramp(t,alpha=1){t=clamp(t,0,.99999)*4;const n=Math.floor(t),f=t-n,c=rampStops[n].map((v,i)=>Math.round(lerp(v,rampStops[n+1][i],f)));return `rgba(${c.join(',')},${alpha})`}\r\nconst staticTimes={cloud:10.7,dtm:9.5,dsm:8.4,mesh:8.4,contours:8.4,volume:8.4,gis:8.4,qa:8.4};\r\nconst clsColors=['#c99562','#9ce276','#30a976','#FFB601'];\r\nlet seed=1248;function rnd(){seed=(Math.imul(1664525,seed)+1013904223)>>>0;return seed\/4294967296}\r\nconst gauss=(x,z,cx,cz,s)=>Math.exp(-((x-cx)**2+(z-cz)**2)\/s);\r\nfunction height(x,z){return .25+3.5*gauss(x,z,-3,-3,26)+2.4*gauss(x,z,5,-5,17)+.55*Math.sin(x*.3+z*.15)+.24*Math.cos(z*.6)}\r\nconst trees=Array.from({length:29},(_,i)=>{let x,z;do{x=rnd()*19-9.5;z=rnd()*19-9.5}while(x>1&&x<8&&z>-2&&z<5);return {x,z,r:.6+rnd()*.65,h:2.4+rnd()*2.8,y:0}});trees.forEach(t=>t.y=height(t.x,t.z));\r\nconst building={x:4.7,z:1.2,w:4.6,d:3.4,base:height(4.7,1.2),h:2.4};\r\nconst cloud=[];const add=(x,y,z,c)=>cloud.push({x,y,z,c});\r\nfor(let i=0;i<=120;i++)for(let j=0;j<=120;j++){const x=i\/6-10,z=j\/6-10;add(x,height(x,z)+(rnd()-.5)*.025,z,0)}\r\nfor(let i=0;i<3000;i++){const x=rnd()*20-10,z=rnd()*20-10;if(x>1.8&&x<7.5&&z>-1&&z<3.3)continue;add(x,height(x,z)+.12+rnd()*.58,z,1)}\r\nfor(const tr of trees){for(let i=0;i<570;i++){const a=rnd()*TAU,r=Math.sqrt(rnd())*tr.r,ny=(rnd()-.5)*1.6;const shape=Math.sqrt(Math.max(.03,1-(ny\/1.05)**2));add(tr.x+Math.cos(a)*r*shape,tr.y+tr.h*.66+ny*tr.h*.4,tr.z+Math.sin(a)*r*shape,2)}for(let i=0;i<30;i++)add(tr.x+(rnd()-.5)*.12,tr.y+rnd()*tr.h*.68,tr.z+(rnd()-.5)*.12,2)}\r\nfor(let i=0;i<5600;i++){const u=rnd(),v=rnd(),b=building;let x,y,z;if(i%3===0){x=b.x+(u-.5)*b.w;z=b.z+(v-.5)*b.d;y=b.base+b.h+.65*(1-Math.abs((x-b.x)\/(b.w*.5)))}else if(i%3===1){x=b.x+(i%2?1:-1)*b.w*.5;z=b.z+(u-.5)*b.d;y=b.base+v*b.h}else{x=b.x+(u-.5)*b.w;z=b.z+(i%2?1:-1)*b.d*.5;y=b.base+v*b.h}add(x,y,z,3)}\r\nconst counts=[0,0,0,0];cloud.forEach(p=>counts[p.c]++);\r\nconst elevationMax=Math.max(...cloud.map(p=>p.y));\r\nconst previewCloud=cloud.filter((_,i)=>i%8===0);\r\nfunction surface(x,z){let y=height(x,z);for(const tr of trees){const r=Math.hypot(x-tr.x,z-tr.z)\/tr.r;if(r<1)y=Math.max(y,tr.y+tr.h*(.65+.35*Math.sqrt(1-r*r)))}const b=building;if(Math.abs(x-b.x)<b.w\/2&&Math.abs(z-b.z)<b.d\/2)y=Math.max(y,b.base+b.h+.65*(1-Math.abs((x-b.x)\/(b.w*.5))));return y}\r\nfunction stock(x,z){return 4.1*Math.exp(-((x+1.7)**2\/14+(z+.8)**2\/8))+2.3*Math.exp(-((x-4)**2\/5+(z-2.4)**2\/7))}\r\nlet measuredVolume=0;for(let x=-9.9;x<10;x+=.2)for(let z=-9.9;z<10;z+=.2)measuredVolume+=stock(x,z)*.04;\r\nconst residuals=[8,-12,5,18,-9,14,-7,3,-16,11,-4,9];const rmse=Math.sqrt(residuals.reduce((s,x)=>s+x*x,0)\/residuals.length),mean=residuals.reduce((a,b)=>a+b,0)\/residuals.length;\r\nconst scenes=$$('canvas[data-vd-scene]').map(canvas=>({canvas,ctx:canvas.getContext('2d',{alpha:false}),kind:canvas.dataset.vdScene,w:1,h:1,visible:true,dirty:true,offset:reduced.matches?clock-staticTimes[canvas.dataset.vdScene]:0,telemetry:canvas.parentElement.querySelector('.vd-telemetry')}));\r\nfunction sizeScene(s){const r=s.canvas.getBoundingClientRect(),dpr=Math.min(devicePixelRatio||1,1.75);if(!r.width||!r.height)return;s.w=r.width;s.h=r.height;s.canvas.width=Math.round(r.width*dpr);s.canvas.height=Math.round(r.height*dpr);s.ctx.setTransform(dpr,0,0,dpr,0,0);s.dirty=true}\r\nconst resize=new ResizeObserver(entries=>{for(const e of entries){const s=scenes.find(s=>s.canvas===e.target);if(s)sizeScene(s)}if(viewer)resizeGL();wake()});scenes.forEach(s=>{resize.observe(s.canvas);sizeScene(s)});\r\nconst inView=new IntersectionObserver(entries=>{for(const e of entries){const s=scenes.find(s=>s.canvas===e.target);if(s){s.visible=e.isIntersecting;s.dirty=true}}wake()},{rootMargin:'60px',threshold:0});scenes.forEach(s=>inView.observe(s.canvas));\r\nfunction projectFactory(s,yaw=.72,pitch=.57,scale=1,cy=.54,cx=.5){const ca=Math.cos(yaw),sa=Math.sin(yaw),sp=Math.sin(pitch),cp=Math.cos(pitch),sc=Math.min(s.w\/31,s.h\/22)*scale;return(x,y,z)=>{const rx=x*ca-z*sa,rz=x*sa+z*ca;return [s.w*cx+rx*sc,s.h*cy+(rz*sp-(y-1.6)*cp)*sc,rz*cp+(y-1.6)*sp]}}\r\nfunction line(ctx,pts,color,width=1,close=false,fill=null){if(!pts.length)return;ctx.beginPath();ctx.moveTo(pts[0][0],pts[0][1]);for(let i=1;i<pts.length;i++)ctx.lineTo(pts[i][0],pts[i][1]);if(close)ctx.closePath();if(fill){ctx.fillStyle=fill;ctx.fill()}if(color){ctx.strokeStyle=color;ctx.lineWidth=width;ctx.stroke()}}\r\nfunction poly3(c,P,pts,color,fill,width=.6){line(c,pts.map(p=>P(...p)),color,width,true,fill)}\r\nfunction base(s,P){const c=s.ctx;c.fillStyle='#0c0c0c';c.fillRect(0,0,s.w,s.h);const g=c.createRadialGradient(s.w*.5,s.h*.6,8,s.w*.5,s.h*.5,s.w*.55);g.addColorStop(0,'#1a1a1a');g.addColorStop(1,'#0c0c0c');c.fillStyle=g;c.fillRect(0,0,s.w,s.h);for(let i=-12;i<=12;i+=2){line(c,[P(i,-1.2,-12),P(i,-1.2,12)],'rgba(255,255,255,0.06)',.6);line(c,[P(-12,-1.2,i),P(12,-1.2,i)],'rgba(255,255,255,0.06)',.6)}\r\n const corners=[[9,27],[s.w-9,27],[9,s.h-10],[s.w-9,s.h-10]];c.lineWidth=1;for(let i=0;i<4;i++){const [x,y]=corners[i],dx=i%2?-6:6,dy=i<2?6:-6;line(c,[[x+dx,y],[x,y],[x,y+dy]],'rgba(255,182,1,0.45)',1)}}\r\nfunction text(c,t,x,y,color='#b0b0b0',size=8,align='left'){c.fillStyle=color;c.font=`${size}px \"Space Mono\",monospace`;c.textAlign=align;const width=c.measureText(t).width,logicalWidth=c.canvas.width\/Math.abs(c.getTransform().a||1);if(align==='left')x=clamp(x,8,logicalWidth-width-8);else if(align==='center')x=clamp(x,width\/2+8,logicalWidth-width\/2-8);else x=clamp(x,width+8,logicalWidth-8);c.fillText(t,x,y);c.textAlign='left'}\r\nfunction scan(s,P,t,groundFn=height){const c=s.ctx,x=(t%9)\/9*22-11;let pts=[];for(let z=-10;z<=10;z+=.25)pts.push(P(x,groundFn(x,z)+.06,z));line(c,pts,'#FFD768',1.7)}\r\nfunction cloudScene(s,t){\r\n  const P=projectFactory(s,.7+Math.sin(t*.14)*.12,.6,1.05,.54);base(s,P);\r\n  const c=s.ctx,scanX=(t%11)\/11*22-11,b=[[],[],[],[],[]];\r\n  for(const p of previewCloud){const q=P(p.x,p.y,p.z);const k=p.x<scanX?p.c:4;b[k].push(q[0],q[1])}\r\n  for(let k=0;k<5;k++){c.fillStyle=k<4?clsColors[k]:'#35383d';c.globalAlpha=k<4?.95:.28;const a=b[k];for(let i=0;i<a.length;i+=2)c.fillRect(a[i],a[i+1],1.5,1.5)}\r\n  c.globalAlpha=1;scan(s,P,t*9\/11);\r\n  s.telemetry.textContent=`${cloud.length.toLocaleString()} PTS \u00b7 4 CLASSES`;\r\n}\r\nfunction dtmScene(s,t){\r\n const c=s.ctx,P=projectFactory(s,.75+Math.sin(t*.12)*.07,.6,1.05,.54);base(s,P);\r\n const phase=(t%12)\/12,cut=phase<.75?lerp(-11,11,phase\/.75):11;\r\n for(let z=-10;z<=10;z+=.65){const pts=[];for(let x=-10;x<=10;x+=.38)pts.push(P(x,height(x,z),z));line(c,pts,'rgba(255,255,255,0.3)',.65)}\r\n for(let x=-10;x<=10;x+=.65){const pts=[];for(let z=-10;z<=10;z+=.4)pts.push(P(x,height(x,z),z));line(c,pts,'rgba(255,255,255,0.2)',.65)}\r\n for(let z=-10;z<10;z+=1.3)for(let x=-10;x<10;x+=1.3)line(c,[P(x,height(x,z),z),P(x+1.3,height(x+1.3,z+1.3),z+1.3)],'rgba(255,182,1,0.18)',.5);\r\n const ghost=previewCloud.filter(p=>p.c>0&&p.x>cut).map(p=>({p,q:P(p.x,p.y,p.z)})).sort((a,b)=>a.q[2]-b.q[2]);\r\n for(const {p,q} of ghost){c.fillStyle=clsColors[p.c];c.globalAlpha=.3*clamp((p.x-cut)\/1.8,0,1);c.fillRect(q[0],q[1],1.6,1.6)}c.globalAlpha=1;\r\n if(phase<.75){const a=[];for(let z=-10;z<=10;z+=.25)a.push(P(cut,height(cut,z)+.04,z));line(c,a,'#FFD768',1.8);const b=P(cut,7,-7);text(c,'GROUND FILTER',b[0],b[1],'#FFB601',8,'center')}\r\n s.telemetry.textContent=phase<.75?'REMOVING VEGETATION + STRUCTURES':'BARE EARTH \/ TERRAIN RETAINED';\r\n}\r\nconst surfaceCells=[];for(let x=-10;x<10;x+=.45)for(let z=-10;z<10;z+=.45){const a=[[x,surface(x,z),z],[x+.45,surface(x+.45,z),z],[x+.45,surface(x+.45,z+.45),z+.45],[x,surface(x,z+.45),z+.45]];surfaceCells.push({a,y:a.reduce((n,p)=>n+p[1],0)\/4})}\r\nconst surfaceMax=Math.max(...surfaceCells.map(a=>a.y));surfaceCells.forEach(cell=>cell.col=ramp(cell.y\/surfaceMax));\r\nfunction dsmScene(s,t){const c=s.ctx,P=projectFactory(s,.78+Math.sin(t*.15)*.1,.68,1.04,.62);base(s,P);const cells=surfaceCells.map(a=>({p:a.a.map(p=>P(...p)),col:a.col})).sort((a,b)=>a.p[0][2]-b.p[0][2]);for(const cell of cells)line(c,cell.p,null,.2,true,cell.col);scan(s,P,t,surface);const x=s.w-15,g=c.createLinearGradient(0,65,0,150);rampStops.slice().reverse().forEach((a,i)=>g.addColorStop(i\/4,`rgb(${a.join(',')})`));c.fillStyle=g;c.fillRect(x,66,4,84);text(c,'H',x+2,58,'#FFB601',7,'center');text(c,'L',x+2,164,'#A3A3A3',7,'center');s.telemetry.textContent='ELEVATION \/ CANOPY + STRUCTURES';}\r\n\/\/ 3D Models & Meshes geometry & rendering\r\nconst meshTris=[];\r\n(()=>{\r\n  function addT(p1,p2,p3,tag='main'){\r\n    const u=[p2[0]-p1[0],p2[1]-p1[1],p2[2]-p1[2]],v=[p3[0]-p1[0],p3[1]-p1[1],p3[2]-p1[2]];\r\n    let nx=u[1]*v[2]-u[2]*v[1],ny=u[2]*v[0]-u[0]*v[2],nz=u[0]*v[1]-u[1]*v[0];\r\n    const len=Math.hypot(nx,ny,nz)||1;\r\n    nx\/=len;ny\/=len;nz\/=len;\r\n    const cx=(p1[0]+p2[0]+p3[0])\/3,cy=(p1[1]+p2[1]+p3[1])\/3,cz=(p1[2]+p2[2]+p3[2])\/3;\r\n    meshTris.push({p:[p1,p2,p3],n:[nx,ny,nz],c:[cx,cy,cz],tag});\r\n  }\r\n  function addQ(p1,p2,p3,p4,tag='main'){addT(p1,p2,p3,tag);addT(p1,p3,p4,tag)}\r\n  \/\/ Foundation Plinth\r\n  const fx0=-5.4,fx1=5.2,fz0=-3.2,fz1=4.0,fy0=0.0,fy1=0.35;\r\n  addQ([fx0,fy1,fz0],[fx1,fy1,fz0],[fx1,fy1,fz1],[fx0,fy1,fz1],'plinth');\r\n  addQ([fx0,fy0,fz1],[fx1,fy0,fz1],[fx1,fy1,fz1],[fx0,fy1,fz1],'plinth');\r\n  addQ([fx1,fy0,fz1],[fx1,fy0,fz0],[fx1,fy1,fz0],[fx1,fy1,fz1],'plinth');\r\n  addQ([fx0,fy0,fz0],[fx0,fy0,fz1],[fx0,fy1,fz1],[fx0,fy1,fz0],'plinth');\r\n  \/\/ Main Processing Hall\r\n  const mx0=-5.0,mx1=0.6,mz0=-2.5,mz1=2.5,my_b=0.35,my_e=3.3,my_r=5.0;\r\n  const xs=[mx0,mx0+(mx1-mx0)*0.33,mx0+(mx1-mx0)*0.66,mx1];\r\n  for(let i=0;i<xs.length-1;i++){\r\n    addQ([xs[i],my_b,mz1],[xs[i+1],my_b,mz1],[xs[i+1],my_e,mz1],[xs[i],my_e,mz1],'wall_s');\r\n    addQ([xs[i+1],my_b,mz0],[xs[i],my_b,mz0],[xs[i],my_e,mz0],[xs[i+1],my_e,mz0],'wall_n');\r\n    addQ([xs[i],my_r,0],[xs[i+1],my_r,0],[xs[i+1],my_e,mz1],[xs[i],my_e,mz1],'roof_s');\r\n    addQ([xs[i],my_e,mz0],[xs[i+1],my_e,mz0],[xs[i+1],my_r,0],[xs[i],my_r,0],'roof_n');\r\n  }\r\n  addQ([mx0,my_b,mz0],[mx0,my_b,mz1],[mx0,my_e,mz1],[mx0,my_e,mz0],'wall_w');\r\n  addT([mx0,my_e,mz0],[mx0,my_e,mz1],[mx0,my_r,0],'gable_w');\r\n  addT([mx1,my_e,mz1],[mx1,my_e,mz0],[mx1,my_r,0],'gable_e');\r\n  addQ([mx1,my_b,0.6],[mx1,my_b,mz1],[mx1,my_e,mz1],[mx1,my_e,0.6],'wall_e');\r\n  \/\/ Rooftop Clerestory Monitor\r\n  const rx0=-4.0,rx1=-0.4,rz=0.8,ry_b=4.6,ry_top=5.4;\r\n  addQ([rx0,ry_b,rz],[rx1,ry_b,rz],[rx1,ry_top,0],[rx0,ry_top,0],'clerestory_s');\r\n  addQ([rx0,ry_top,0],[rx1,ry_top,0],[rx1,ry_b,-rz],[rx0,ry_b,-rz],'clerestory_n');\r\n  addT([rx0,ry_b,rz],[rx0,ry_top,0],[rx0,ry_b,-rz],'clerestory_end');\r\n  addT([rx1,ry_b,-rz],[rx1,ry_top,0],[rx1,ry_b,rz],'clerestory_end');\r\n  \/\/ Annex Control Wing\r\n  const ax0=0.6,ax1=4.4,az0=-2.5,az1=0.6,ay_t=2.4;\r\n  addQ([ax0,my_b,az1],[ax1,my_b,az1],[ax1,ay_t,az1],[ax0,ay_t,az1],'annex_w');\r\n  addQ([ax1,my_b,az1],[ax1,my_b,az0],[ax1,ay_t,az0],[ax1,ay_t,az1],'annex_w');\r\n  addQ([ax1,my_b,az0],[ax0,my_b,az0],[ax0,ay_t,az0],[ax1,ay_t,az0],'annex_w');\r\n  addQ([ax0,ay_t,az0],[ax1,ay_t,az0],[ax1,ay_t,az1],[ax0,ay_t,az1],'annex_r');\r\n  \/\/ Annex Rooftop HVAC Unit\r\n  const hx0=1.4,hx1=2.8,hz0=-1.9,hz1=-0.7,hy0=2.4,hy1=3.1;\r\n  addQ([hx0,hy0,hz1],[hx1,hy0,hz1],[hx1,hy1,hz1],[hx0,hy1,hz1],'hvac');\r\n  addQ([hx1,hy0,hz1],[hx1,hy0,hz0],[hx1,hy1,hz0],[hx1,hy1,hz1],'hvac');\r\n  addQ([hx0,hy1,hz0],[hx1,hy1,hz0],[hx1,hy1,hz1],[hx0,hy1,hz1],'hvac_t');\r\n  \/\/ Cylindrical Storage Silo Tank\r\n  const cx=2.7,cz=2.5,sr=1.45,sy0=0.35,sy1=4.0,scone=5.2,n_seg=12;\r\n  for(let i=0;i<n_seg;i++){\r\n    const a1=(i\/n_seg)*TAU,a2=((i+1)\/n_seg)*TAU;\r\n    const x1=cx+Math.cos(a1)*sr,z1=cz+Math.sin(a1)*sr;\r\n    const x2=cx+Math.cos(a2)*sr,z2=cz+Math.sin(a2)*sr;\r\n    addQ([x1,sy0,z1],[x2,sy0,z2],[x2,sy1,z2],[x1,sy1,z1],'silo_w');\r\n    addT([x1,sy1,z1],[x2,sy1,z2],[cx,scone,cz],'silo_c');\r\n  }\r\n  \/\/ Overhead Structural Pipe Bridge\r\n  const tx0=0.6,ty0=2.8,tz0=2.0,tx1=cx-sr*0.65,ty1=3.2,tz1=cz-sr*0.45;\r\n  addQ([tx0,ty0,tz0],[tx1,ty1,tz1],[tx1,ty1+0.4,tz1],[tx0,ty0+0.4,tz0],'truss');\r\n  addQ([tx0,ty0,tz0-0.35],[tx1,ty1,tz1-0.35],[tx1,ty1+0.4,tz1-0.35],[tx0,ty0+0.4,tz0-0.35],'truss');\r\n  addQ([tx0,ty0+0.4,tz0-0.35],[tx1,ty1+0.4,tz1-0.35],[tx1,ty1+0.4,tz1],[tx0,ty0+0.4,tz0],'truss_top');\r\n  \/\/ Entrance Rollup Door Frame\r\n  const dx0=-3.8,dx1=-2.0,dy_top=2.2;\r\n  addQ([dx0,my_b,mz1+0.05],[dx1,my_b,mz1+0.05],[dx1,dy_top,mz1+0.05],[dx0,dy_top,mz1+0.05],'door');\r\n})();\r\nconst meshVerts=[];\r\n(()=>{\r\n  const map=new Map();\r\n  meshTris.forEach(t=>{\r\n    t.p.forEach(pt=>{\r\n      const k=`${pt[0].toFixed(2)},${pt[1].toFixed(2)},${pt[2].toFixed(2)}`;\r\n      if(!map.has(k)){map.set(k,pt);meshVerts.push(pt)}\r\n    });\r\n  });\r\n})();\r\nconst sunLight=[0.45,0.75,-0.48];\r\nconst sunLen=Math.hypot(...sunLight);\r\nconst sunL=sunLight.map(v=>v\/sunLen);\r\nfunction meshScene(s,t){\r\n  const c=s.ctx;\r\n  const orbitYaw=0.65+Math.sin(t*0.2)*0.12;\r\n  const orbitPitch=0.53+Math.sin(t*0.15)*0.03;\r\n  const P=projectFactory(s,orbitYaw,orbitPitch,1.38,0.64,0.5);\r\n  base(s,P);\r\n  const cycle=t%10;\r\n  const sweepProgress=Math.min(1,cycle\/4.2);\r\n  const sweepX=-6.5+sweepProgress*13.0;\r\n  const solidFactor=Math.min(1,Math.max(0,(cycle-4.0)\/2.2));\r\n  const projected=meshTris.map(tri=>{\r\n    const q=tri.p.map(pt=>P(pt[0],pt[1],pt[2]));\r\n    const depth=(q[0][2]+q[1][2]+q[2][2])\/3;\r\n    const midX=tri.c[0];\r\n    const isMeshed=midX<=sweepX||cycle>=4.2;\r\n    const meshFade=cycle>=4.2?1:Math.min(1,Math.max(0,(sweepX-midX)\/1.0));\r\n    const dot=Math.abs(tri.n[0]*sunL[0]+tri.n[1]*sunL[1]+tri.n[2]*sunL[2]);\r\n    const bright=0.2+0.8*dot;\r\n    return {tri,q,depth,midX,isMeshed,meshFade,bright};\r\n  });\r\n  projected.sort((a,b)=>a.depth-b.depth);\r\n  if(cycle<4.4){\r\n    meshVerts.forEach(v=>{\r\n      if(v[0]>sweepX){\r\n        const pt=P(v[0],v[1],v[2]);\r\n        const dist=v[0]-sweepX;\r\n        const alpha=Math.min(1,Math.max(0.2,1-dist\/5.5));\r\n        c.fillStyle=`rgba(255,182,1,${alpha*0.75})`;\r\n        c.fillRect(pt[0]-1.2,pt[1]-1.2,2.4,2.4);\r\n      }\r\n    });\r\n  }\r\n  projected.forEach(({tri,q,isMeshed,meshFade,bright,midX})=>{\r\n    if(!isMeshed)return;\r\n    c.beginPath();\r\n    c.moveTo(q[0][0],q[0][1]);\r\n    c.lineTo(q[1][0],q[1][1]);\r\n    c.lineTo(q[2][0],q[2][1]);\r\n    c.closePath();\r\n    const isRoof=tri.tag.includes('roof')||tri.tag.includes('silo_c')||tri.tag.includes('gable')||tri.tag.includes('clerestory');\r\n    const isPlinth=tri.tag.includes('plinth');\r\n    const isDoor=tri.tag.includes('door');\r\n    const baseAlpha=0.22+solidFactor*0.65;\r\n    const fillAlpha=baseAlpha*meshFade;\r\n    let r,g,b;\r\n    if(isDoor){r=Math.round(200*bright);g=Math.round(145*bright);b=0}\r\n    else if(isRoof){r=Math.round(38+bright*60);g=Math.round(32+bright*48);b=Math.round(14+bright*15)}\r\n    else if(isPlinth){r=Math.round(18+bright*25);g=Math.round(18+bright*25);b=Math.round(20+bright*28)}\r\n    else{r=Math.round(22+bright*45);g=Math.round(24+bright*42);b=Math.round(28+bright*42)}\r\n    c.fillStyle=`rgba(${r},${g},${b},${fillAlpha})`;\r\n    c.fill();\r\n    const isEdgeHot=Math.abs(midX-sweepX)<0.9&&cycle<4.2;\r\n    const edgeAlpha=isEdgeHot?1.0:(0.4+solidFactor*0.4)*meshFade;\r\n    const edgeWidth=isEdgeHot?1.6:0.85;\r\n    c.strokeStyle=isEdgeHot?'#FFFFFF':`rgba(255,182,1,${edgeAlpha})`;\r\n    c.lineWidth=edgeWidth;\r\n    c.stroke();\r\n  });\r\n  if(cycle<4.2){\r\n    const pTopA=P(sweepX,6.2,-4.0),pTopB=P(sweepX,6.2,5.0),pBotB=P(sweepX,0.0,5.0),pBotA=P(sweepX,0.0,-4.0);\r\n    c.save();\r\n    c.beginPath();\r\n    c.moveTo(pTopA[0],pTopA[1]);c.lineTo(pTopB[0],pTopB[1]);c.lineTo(pBotB[0],pBotB[1]);c.lineTo(pBotA[0],pBotA[1]);\r\n    c.closePath();\r\n    c.fillStyle='rgba(255,182,1,0.06)';c.fill();\r\n    c.strokeStyle='#FFE082';c.lineWidth=2.2;\r\n    c.beginPath();c.moveTo(pTopB[0],pTopB[1]);c.lineTo(pBotB[0],pBotB[1]);c.stroke();\r\n    c.restore();\r\n    s.telemetry.textContent=`RECONSTRUCTING TIN \/ ${(sweepProgress*100).toFixed(0)}% DELAUNAY MESH`;\r\n  }else if(cycle<7.2){\r\n    s.telemetry.textContent='SOLIDIFYING FACETS \/ DIRECTIONAL SHADING';\r\n  }else{\r\n    s.telemetry.textContent='CONNECTED TRIANGLES \/ FACILITY DIGITAL TWIN';\r\n  }\r\n}\r\nconst contourSegments=[];for(let level=0;level<=6;level+=.35){const seg=[];const step=.35;for(let x=-11;x<11;x+=step)for(let z=-11;z<11;z+=step){const corners=[[x,z],[x+step,z],[x+step,z+step],[x,z+step]];const v=corners.map(p=>height(...p));const ints=[];for(let e=0;e<4;e++){const j=(e+1)%4;if((v[e]<level)!==(v[j]<level)){const f=(level-v[e])\/(v[j]-v[e]);ints.push([lerp(corners[e][0],corners[j][0],f),level,lerp(corners[e][1],corners[j][1],f)])}}if(ints.length===2)seg.push(ints);if(ints.length===4){seg.push([ints[0],ints[1]],[ints[2],ints[3]])}}contourSegments.push({level,seg})}\r\nfunction contoursScene(s,t){const c=s.ctx,P=projectFactory(s,.65,.97,1.06,.6);base(s,P);const pulse=(t%10)\/10*6;for(const layer of contourSegments){const major=Math.round(layer.level\/.35)%3===0;const col=Math.abs(layer.level-pulse)<.3?'#FFB601':ramp(layer.level\/5.3,.85);c.beginPath();for(const seg of layer.seg){const a=P(...seg[0]),b=P(...seg[1]);c.moveTo(a[0],a[1]);c.lineTo(b[0],b[1])}c.strokeStyle=col;c.lineWidth=major?1.1:.6;c.stroke();}for(const [x,z] of [[-4,-6],[-1,4],[6,-4]]){const h=height(x,z),p=P(x,h,z);text(c,`${(100+Math.round(h\/.35)*.35).toFixed(2)} m`,p[0],p[1],'#FFB601',7)}s.telemetry.textContent='0.35 m SAMPLE INTERVAL \/ ISOLINES';}\r\nconst volumeCells=[];for(let x=-10;x<10;x+=.6)for(let z=-10;z<10;z+=.6){const v=stock(x,z);volumeCells.push({a:[[x,stock(x,z),z],[x+.6,stock(x+.6,z),z],[x+.6,stock(x+.6,z+.6),z+.6],[x,stock(x,z+.6),z+.6]],v,col:ramp(.45+v\/8,.83)});}\r\nfunction volumeScene(s,t){const c=s.ctx,P=projectFactory(s,.7+Math.sin(t*.12)*.09,.63,1.03,.58);base(s,P);\r\n poly3(c,P,[[-10,0,-10],[10,0,-10],[10,0,10],[-10,0,10]],'rgba(255,182,1,0.65)','rgba(255,182,1,0.06)');\r\n const cells=volumeCells.map(a=>({p:a.a.map(p=>P(...p)),col:a.col})).sort((a,b)=>a.p[0][2]-b.p[0][2]);for(const cell of cells)line(c,cell.p,'rgba(255,255,255,0.08)',.35,true,cell.col);\r\n const phase=(t%10)\/10,level=clamp(phase\/.75,0,1)*4.4;let accumulated=0;\r\n for(let x=-10;x<10;x+=.5){let q=[];for(let z=-10;z<10;z+=.5){const h=stock(x,z);accumulated+=Math.min(h,level)*.25;if(h>level)q.push(P(x,level,z));else if(q.length){line(c,q,'rgba(255,182,1,0.85)',.8);q=[]}}if(q.length)line(c,q,'rgba(255,182,1,0.85)',.8)}\r\n const peak=stock(-1.7,-.8),a=P(-8,0,8),b=P(-8,peak,8);line(c,[a,b],'#FFB601',.8);line(c,[[a[0]-3,a[1]],[a[0]+3,a[1]]],'#FFB601',1);line(c,[[b[0]-3,b[1]],[b[0]+3,b[1]]],'#FFB601',1);text(c,`${peak.toFixed(1)} m`,b[0]+6,b[1],'#FFFFFF',8);\r\n text(c,`${(phase<.75?Math.min(accumulated,measuredVolume):measuredVolume).toFixed(1)} m\u00b3`,s.w-14,43,'#FFB601',16,'right');text(c,phase<.75?'INTEGRATING \/ SAMPLE':'TOTAL \/ SAMPLE',s.w-14,57,'#888888',6,'right');s.telemetry.textContent='V = \u222b (SURFACE \u2212 BASE) dA';\r\n}\r\nfunction gisScene(s,t){const c=s.ctx,P=projectFactory(s,.72,.56,s.w<380?.8:.94,.65,s.w<380?.42:.5);base(s,P);const split=2.2+Math.sin(t*.65)*.65;for(let k=0;k<3;k++){const y=k*split;const surfacePts=[[-10,y,-8],[10,y,-8],[10,y,8],[-10,y,8]];poly3(c,P,surfacePts,['rgba(90,176,141,0.6)','rgba(100,181,246,0.6)','rgba(255,182,1,0.8)'][k],['rgba(22,36,28,0.85)','rgba(18,30,42,0.85)','rgba(32,28,16,0.85)'][k]);if(k===0){for(let z=-8;z<8;z+=.6)for(let x=-10;x<10;x+=.6){const h=height(x,z),col=`rgba(${Math.round(55+h*14)},${Math.round(85+h*13)},${Math.round(57+h*5)},.85)`;poly3(c,P,[[x,y,z],[x+.6,y,z],[x+.6,y,z+.6],[x,y,z+.6]],null,col)}}if(k===1){poly3(c,P,[[-8,y+.01,-6],[-2,y+.01,-5],[1,y+.01,-1],[-4,y+.01,2],[-8,y+.01,0]],'#64b5f6','rgba(100,181,246,0.15)');poly3(c,P,[[2,y+.01,-5],[8,y+.01,-6],[8,y+.01,0],[3,y+.01,2]],'#5ab08d','rgba(90,176,141,0.18)');line(c,[P(-9,y+.03,6),P(-5,y+.03,3),P(1,y+.03,5),P(8,y+.03,3)],'#64b5f6',1.6)}if(k===2){for(const [x,z,w,d] of [[-5,-2,4,3],[3,1,5,3],[6,-4,2,2]]){poly3(c,P,[[x,y,z],[x+w,y,z],[x+w,y,z+d],[x,y,z+d]],'#FFB601',null,1);line(c,[P(x,y,z),P(x+w,y,z+d)],'rgba(255,182,1,0.4)',.6)}line(c,[P(-9,y,-7),P(-9,y,7),P(9,y,7)],'rgba(255,255,255,0.4)',.7)}const p=P(10,y,-8);line(c,[p,[p[0]+20,p[1]-4]],'rgba(255,255,255,0.4)',.6);text(c,['RASTER','VECTOR','CAD'][k],p[0]+24,p[1]-2,['#A3A3A3','#90CAF9','#FFB601'][k],8)}s.telemetry.textContent='SHARED CRS \/ LAYERS ALIGNED';}\r\nfunction qaScene(s,t){const c=s.ctx;c.fillStyle='#111111';c.fillRect(0,0,s.w,s.h);\r\n const pad=s.w<380?12:20,left=pad,right=s.w-pad,top=s.w<380?25:31,bottom=s.h-(s.w<380?18:24);\r\n c.fillStyle='#181818';c.fillRect(left,top,right-left,bottom-top);c.strokeStyle='rgba(255,255,255,0.12)';c.lineWidth=.7;c.strokeRect(left,top,right-left,bottom-top);\r\n const narrow=s.w<400;text(c,narrow?'CHECKPOINT QA \/ SAMPLE':'SURVEY QUALITY \/ CHECKPOINT REPORT',left+13,top+18,'#FFFFFF',narrow?7:8);if(!narrow)text(c,'ILLUSTRATIVE DATASET',right-13,top+18,'#888888',6,'right');\r\n const x0=left+36,x1=right-17,y0=top+66,y1=bottom-49,ym=(y0+y1)\/2,ys=(y1-y0)\/80;\r\n for(const val of [-30,-15,0,15,30]){const y=ym-val*ys;line(c,[[x0,y],[x1,y]],Math.abs(val)===30?'rgba(255,182,1,0.65)':'rgba(255,255,255,0.08)',.6);text(c,`${val>0?'+':''}${val}`,x0-8,y+3,'#888888',7,'right')}\r\n const progress=clamp((t%10)\/7,0,1);\r\n residuals.forEach((v,i)=>{const x=x0+(x1-x0)*(i+.5)\/12,y=ym-v*ys,highlight=i\/12<progress;line(c,[[x,ym],[x,y]],highlight?'#FFB601':'rgba(255,255,255,0.15)',3);c.beginPath();c.arc(x,y,2.5,0,TAU);c.fillStyle=highlight?'#FFE082':'rgba(255,255,255,0.25)';c.fill();text(c,String(i+1).padStart(2,'0'),x,y1+14,'#888888',6,'center')});\r\n text(c,narrow?'RESIDUAL \/ mm':'VERTICAL RESIDUAL \/ mm',left+13,top+39,'#888888',7);text(c,`RMSEz ${rmse.toFixed(1)} mm`,right-14,top+(narrow?59:43),'#FFB601',narrow?11:13,'right');\r\n line(c,[[left+12,bottom-27],[right-12,bottom-27]],'rgba(255,255,255,0.08)',.6);\r\n text(c,narrow?`N12 \u00b7 BIAS ${mean.toFixed(1)} mm`:`N = 12     BIAS = ${mean.toFixed(1)} mm`,left+13,bottom-12,'#B3B3B3',narrow?6:8);\r\n text(c,narrow?'12\/12 \u00b130 mm':'12 \/ 12 WITHIN \u00b130 mm',right-13,bottom-12,'#FFB601',narrow?6:8,'right');\r\n s.telemetry.textContent='PDF \/ CHECKPOINTS + RMSE + BIAS';\r\n}\r\nconst painters={cloud:cloudScene,dtm:dtmScene,dsm:dsmScene,mesh:meshScene,contours:contoursScene,volume:volumeScene,gis:gisScene,qa:qaScene};\r\nlet viewer=null;let scrolling=false,scrollTimer=0;addEventListener('scroll',()=>{scrolling=true;clearTimeout(scrollTimer);scrollTimer=setTimeout(()=>{scrolling=false;wake()},150)},{passive:true});function frame(now){raf=0;if(destroyed||document.hidden)return;if(!dialog.open&&!paused&&now-lastPaint<1000\/20){raf=requestAnimationFrame(frame);return}lastPaint=now;const delta=last?Math.min((now-last)\/1000,.08):0;last=now;if(!paused&&!dialog.open)clock+=delta;if(!dialog.open){const skip=scrolling;for(const s of scenes){if(s.visible&&(!paused||s.dirty)&&(!skip||s.dirty)){painters[s.kind](s,Math.max(0,clock-s.offset));s.dirty=false}}}if(viewer&&dialog.open)drawGL();if((!dialog.open&&!paused&&scenes.some(s=>s.visible))||(viewer&&dialog.open&&viewer.dirty))raf=requestAnimationFrame(frame)}\r\nfunction wake(){if(!raf&&!document.hidden&&!destroyed){last=0;raf=requestAnimationFrame(frame)}}\r\n$$('.vd-replay').forEach(button=>button.addEventListener('click',()=>{const scene=scenes.find(s=>s.canvas===button.parentElement.querySelector('canvas'));scene.offset=paused?clock-staticTimes[scene.kind]:clock;scene.dirty=true;wake()}));\r\nfunction pauseLabel(){const b=$('.vd-pause');if(!b)return;b.setAttribute('aria-pressed',String(paused));b.innerHTML=paused?'<span aria-hidden=\"true\">\u25b7<\/span> Resume motion':'<span aria-hidden=\"true\">\u2161<\/span> Pause motion'}\r\nconst pauseBtn=$('.vd-pause');if(pauseBtn){pauseBtn.addEventListener('click',()=>{paused=!paused;pauseLabel();wake()});pauseLabel()}\r\nconst onReduced=e=>{paused=e.matches;if(e.matches)scenes.forEach(s=>s.offset=clock-staticTimes[s.kind]);pauseLabel();scenes.forEach(s=>s.dirty=true);wake()};reduced.addEventListener('change',onReduced);const onVisibility=()=>{last=0;if(!document.hidden){scenes.forEach(s=>s.dirty=true);wake()}};document.addEventListener('visibilitychange',onVisibility);\r\nconst dialog=$('#vd-viewer'),glCanvas=$('.vd-webgl');let priorFocus=null,priorOverflow='',pointerMap=new Map(),gesture=null;\r\nconst vertexSource=`\r\nprecision highp float;\r\nattribute vec3 aPosition;\r\nattribute float aClass;\r\nuniform mat4 uMVP;\r\nuniform vec4 uVisibility;\r\nuniform float uPointSize;\r\nuniform float uColourMode;\r\nuniform float uPixelRatio;\r\nuniform float uElevationMax;\r\nvarying vec3 vColour;\r\nvarying float vVisible;\r\nvec3 elevation(float h){float t=clamp(h\/uElevationMax,0.0,0.999)*4.0;vec3 a;vec3 b;if(t<1.0){a=vec3(.463,.263,.965);b=vec3(.176,.616,.922);}else if(t<2.0){a=vec3(.176,.616,.922);b=vec3(.204,.820,.639);}else if(t<3.0){a=vec3(.204,.820,.639);b=vec3(.867,.839,.302);}else{a=vec3(.867,.839,.302);b=vec3(1.,.310,.239);}return mix(a,b,fract(t));}\r\nvoid main(){vVisible=aClass<.5?uVisibility.x:(aClass<1.5?uVisibility.y:(aClass<2.5?uVisibility.z:uVisibility.w));vec3 colour=aClass<.5?vec3(.788,.584,.384):(aClass<1.5?vec3(.612,.886,.463):(aClass<2.5?vec3(.188,.663,.463):vec3(1.0,.714,.004)));float tone=.78+.22*fract(sin(dot(aPosition.xz,vec2(12.9898,78.233)))*43758.5453);vColour=mix(colour,elevation(aPosition.y),uColourMode)*tone;gl_Position=uMVP*vec4(aPosition,1.0);gl_PointSize=clamp(uPointSize*uPixelRatio*35.0\/max(10.0,gl_Position.w),1.0,12.0);}\r\n`;\r\nconst fragmentSource=`precision mediump float;varying vec3 vColour;varying float vVisible;void main(){if(vVisible<.5)discard;vec2 p=gl_PointCoord*2.0-1.0;float r=dot(p,p);if(r>1.0)discard;gl_FragColor=vec4(vColour*(1.0-.16*r),1.0);}`;\r\nfunction shader(gl,type,source){const sh=gl.createShader(type);gl.shaderSource(sh,source);gl.compileShader(sh);if(!gl.getShaderParameter(sh,gl.COMPILE_STATUS)){const msg=gl.getShaderInfoLog(sh);gl.deleteShader(sh);throw new Error(msg)}return sh}\r\nfunction matrixMultiply(a,b){const out=new Float32Array(16);for(let c=0;c<4;c++)for(let r=0;r<4;r++)out[c*4+r]=a[r]*b[c*4]+a[4+r]*b[c*4+1]+a[8+r]*b[c*4+2]+a[12+r]*b[c*4+3];return out}\r\nfunction perspective(fov,aspect,near,far){const f=1\/Math.tan(fov\/2),nf=1\/(near-far);return new Float32Array([f\/aspect,0,0,0,0,f,0,0,0,0,(far+near)*nf,-1,0,0,2*far*near*nf,0])}\r\nfunction lookAt(eye,target){const norm=v=>{const len=Math.hypot(...v);return v.map(x=>x\/len)},cross=(a,b)=>[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]],dot=(a,b)=>a.reduce((v,x,i)=>v+x*b[i],0);const z=norm(eye.map((v,i)=>v-target[i])),x=norm(cross([0,1,0],z)),y=cross(z,x);return new Float32Array([x[0],y[0],z[0],0,x[1],y[1],z[1],0,x[2],y[2],z[2],0,-dot(x,eye),-dot(y,eye),-dot(z,eye),1])}\r\nfunction makeViewer(){const gl=glCanvas.getContext('webgl',{alpha:false,antialias:true,powerPreference:'low-power'});if(!gl)throw new Error('WebGL not available');const vs=shader(gl,gl.VERTEX_SHADER,vertexSource),fs=shader(gl,gl.FRAGMENT_SHADER,fragmentSource),program=gl.createProgram();gl.attachShader(program,vs);gl.attachShader(program,fs);gl.linkProgram(program);gl.deleteShader(vs);gl.deleteShader(fs);if(!gl.getProgramParameter(program,gl.LINK_STATUS))throw new Error(gl.getProgramInfoLog(program));const positions=new Float32Array(cloud.length*3),classes=new Float32Array(cloud.length);cloud.forEach((p,i)=>{positions.set([p.x,p.y,p.z],i*3);classes[i]=p.c});const buffers=[];gl.useProgram(program);for(const [name,array,n] of [['aPosition',positions,3],['aClass',classes,1]]){const b=gl.createBuffer();buffers.push(b);gl.bindBuffer(gl.ARRAY_BUFFER,b);gl.bufferData(gl.ARRAY_BUFFER,array,gl.STATIC_DRAW);const loc=gl.getAttribLocation(program,name);gl.enableVertexAttribArray(loc);gl.vertexAttribPointer(loc,n,gl.FLOAT,false,0,0)}const uniforms={};for(const key of ['uMVP','uVisibility','uPointSize','uColourMode','uPixelRatio','uElevationMax'])uniforms[key]=gl.getUniformLocation(program,key);gl.enable(gl.DEPTH_TEST);gl.depthFunc(gl.LEQUAL);return {gl,program,buffers,uniforms,yaw:.7,pitch:.62,distance:35,dirty:true,ratio:1,shown:new Float32Array([1,1,1,1])}}\r\nfunction resizeGL(){if(!viewer||!dialog.open)return;const r=glCanvas.getBoundingClientRect();viewer.ratio=Math.min(devicePixelRatio||1,2);const w=Math.max(1,Math.round(r.width*viewer.ratio)),h=Math.max(1,Math.round(r.height*viewer.ratio));if(glCanvas.width!==w||glCanvas.height!==h){glCanvas.width=w;glCanvas.height=h;viewer.dirty=true}wake()}\r\nfunction updateClasses(){let n=0;$$('[data-vd-class]').forEach(input=>{const i=Number(input.dataset.vdClass);input.closest('label').querySelector('b').textContent=counts[i].toLocaleString();if(viewer)viewer.shown[i]=input.checked?1:0;if(input.checked)n+=counts[i]});$('.vd-cloud-count').textContent=`${n.toLocaleString()} \/ ${cloud.length.toLocaleString()} POINTS SHOWN`;if(viewer){viewer.dirty=true;wake()}}\r\nfunction drawGL(){if(!viewer||!viewer.dirty||viewer.gl.isContextLost())return;const v=viewer,g=v.gl;g.viewport(0,0,glCanvas.width,glCanvas.height);g.clearColor(0.067,0.067,0.067,1);g.clear(g.COLOR_BUFFER_BIT|g.DEPTH_BUFFER_BIT);const cp=Math.cos(v.pitch),eye=[Math.sin(v.yaw)*cp*v.distance,2+Math.sin(v.pitch)*v.distance,Math.cos(v.yaw)*cp*v.distance],view=lookAt(eye,[0,2,0]),proj=perspective(Math.PI\/4,glCanvas.width\/glCanvas.height,.1,180);g.useProgram(v.program);g.uniformMatrix4fv(v.uniforms.uMVP,false,matrixMultiply(proj,view));g.uniform4fv(v.uniforms.uVisibility,v.shown);g.uniform1f(v.uniforms.uPointSize,Number($('.vd-point-size').value));g.uniform1f(v.uniforms.uColourMode,Number($('.vd-mode').value));g.uniform1f(v.uniforms.uPixelRatio,v.ratio);g.uniform1f(v.uniforms.uElevationMax,elevationMax);g.drawArrays(g.POINTS,0,cloud.length);v.dirty=false;}\r\nfunction openViewer(){priorFocus=document.activeElement;priorOverflow=document.documentElement.style.overflow;dialog.showModal();document.documentElement.style.overflow='hidden';try{if(!viewer)viewer=makeViewer();glCanvas.hidden=false;$('.vd-no-webgl').hidden=true;updateClasses();resizeGL();glCanvas.focus();wake()}catch(error){$('.vd-no-webgl').hidden=false;glCanvas.hidden=true;console.warn('Volatus point-cloud viewer:',error.message);$('.vd-close').focus()}}\r\n$('.vd-open').addEventListener('click',openViewer);$('.vd-close').addEventListener('click',()=>dialog.close());$('.vd-close-fallback').addEventListener('click',()=>dialog.close());dialog.addEventListener('click',e=>{if(e.target===dialog){const r=dialog.getBoundingClientRect();if(e.clientX<r.left||e.clientX>r.right||e.clientY<r.top||e.clientY>r.bottom)dialog.close()}});dialog.addEventListener('close',()=>{document.documentElement.style.overflow=priorOverflow;pointerMap.clear();gesture=null;priorFocus?.focus();scenes.forEach(s=>s.dirty=true);wake()});\r\n$$('[data-vd-class]').forEach(input=>input.addEventListener('change',updateClasses));$('.vd-mode').addEventListener('change',()=>{if(viewer){viewer.dirty=true;wake()}});$('.vd-point-size').addEventListener('input',()=>{if(viewer){viewer.dirty=true;wake()}});\r\nfunction camera(action){if(!viewer)return;if(action==='reset'){viewer.yaw=.7;viewer.pitch=.62;viewer.distance=35}else if(action==='top'){viewer.pitch=Math.PI\/2-.015;viewer.yaw=0;viewer.distance=36}else viewer.distance=clamp(viewer.distance*(action==='in'?.85:1.18),15,90);viewer.dirty=true;wake()}\r\n$$('[data-vd-camera]').forEach(b=>b.addEventListener('click',()=>camera(b.dataset.vdCamera)));\r\nfunction gestureState(){const p=[...pointerMap.values()];return p.length>1?{distance:Math.hypot(p[0].x-p[1].x,p[0].y-p[1].y)}:p.length?{x:p[0].x,y:p[0].y}:null}\r\nglCanvas.addEventListener('pointerdown',e=>{if(!viewer)return;glCanvas.focus();glCanvas.setPointerCapture(e.pointerId);pointerMap.set(e.pointerId,{x:e.clientX,y:e.clientY});gesture=gestureState()});glCanvas.addEventListener('pointermove',e=>{if(!viewer||!pointerMap.has(e.pointerId))return;pointerMap.set(e.pointerId,{x:e.clientX,y:e.clientY});const next=gestureState();if(pointerMap.size===1&&gesture&&'x'in gesture){viewer.yaw-=(next.x-gesture.x)*.008;viewer.pitch=clamp(viewer.pitch+(next.y-gesture.y)*.007,-.15,Math.PI\/2-.01)}else if(next?.distance&&gesture?.distance)viewer.distance=clamp(viewer.distance*gesture.distance\/next.distance,15,90);gesture=next;viewer.dirty=true;wake()});for(const event of ['pointerup','pointercancel','lostpointercapture'])glCanvas.addEventListener(event,e=>{pointerMap.delete(e.pointerId);gesture=gestureState()});glCanvas.addEventListener('wheel',e=>{if(!viewer)return;e.preventDefault();viewer.distance=clamp(viewer.distance*Math.exp(clamp(e.deltaY,-150,150)*.0015),15,90);viewer.dirty=true;wake()},{passive:false});\r\nglCanvas.addEventListener('keydown',e=>{if(!viewer)return;let handled=true;switch(e.key){case'ArrowLeft':viewer.yaw-=.12;break;case'ArrowRight':viewer.yaw+=.12;break;case'ArrowUp':viewer.pitch=clamp(viewer.pitch+.1,-.15,Math.PI\/2-.01);break;case'ArrowDown':viewer.pitch=clamp(viewer.pitch-.1,-.15,Math.PI\/2-.01);break;case'+':case'=':camera('in');break;case'-':case'_':camera('out');break;case'r':case'R':camera('reset');break;default:handled=false}if(handled){e.preventDefault();viewer.dirty=true;wake()}});\r\nglCanvas.addEventListener('webglcontextlost',e=>{e.preventDefault();$('.vd-no-webgl').hidden=false;$('.vd-no-webgl').firstChild.textContent='The graphics context was interrupted. Waiting for the browser to restore it. ';});glCanvas.addEventListener('webglcontextrestored',()=>{try{viewer=makeViewer();$('.vd-no-webgl').hidden=true;glCanvas.hidden=false;updateClasses();resizeGL();wake()}catch{$('.vd-no-webgl').hidden=false}});\r\nresize.observe(glCanvas);updateClasses();wake();\r\nconst removal=new MutationObserver(()=>{if(root.isConnected)return;destroyed=true;cancelAnimationFrame(raf);resize.disconnect();inView.disconnect();removal.disconnect();document.removeEventListener('visibilitychange',onVisibility);reduced.removeEventListener('change',onReduced);if(dialog.open)document.documentElement.style.overflow=priorOverflow;if(viewer){viewer.buffers.forEach(b=>viewer.gl.deleteBuffer(b));viewer.gl.deleteProgram(viewer.program)}});removal.observe(document.body,{childList:true,subtree:true});\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc3cd56 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-heading\" data-id=\"dc3cd56\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Data is delivered in the client's required horizontal and vertical reference systems, such as NAD83(CSRS) with CGVD2013 heights. Volatus also supports trajectory processing, strip adjustment, colorization, and classification through the lidar processing platforms used with its systems. <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e72ab11 e-flex e-con-boxed e-con e-parent\" data-id=\"e72ab11\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1992ee1 elementor-widget elementor-widget-heading\" data-id=\"1992ee1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Industry \n\n<span style=\"color: #FFB601\">Use Cases\n<\/h2>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ac97143 e-grid e-con-full e-con e-child\" data-id=\"ac97143\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a3012ba e-con-full e-flex e-con e-child\" data-id=\"a3012ba\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-98d2b59 e-con-full e-flex e-con e-child\" data-id=\"98d2b59\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1180129 e-con-full e-flex e-con e-child\" data-id=\"1180129\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d160eb5 elementor-widget elementor-widget-heading\" data-id=\"d160eb5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Terrain modelling and topographic surveys<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-15a9591 elementor-widget elementor-widget-text-editor\" data-id=\"15a9591\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tGenerate elevation data and digital terrain models for engineering, site planning, grading, drainage, and environmental assessment.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-baabfa6 e-con-full e-flex e-con e-child\" data-id=\"baabfa6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-2ede79d e-con-full e-flex e-con e-child\" data-id=\"2ede79d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a137fb0 e-con-full e-flex e-con e-child\" data-id=\"a137fb0\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dc355d0 elementor-widget elementor-widget-heading\" data-id=\"dc355d0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Infrastructure and corridor mapping<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-af07a6c elementor-widget elementor-widget-text-editor\" data-id=\"af07a6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tMap transportation corridors, utilities, pipelines, transmission infrastructure, and other linear assets with georeferenced three-dimensional data.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-496033b e-con-full e-flex e-con e-child\" data-id=\"496033b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-81d9134 e-con-full e-flex e-con e-child\" data-id=\"81d9134\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-59ec6d7 e-con-full e-flex e-con e-child\" data-id=\"59ec6d7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-81085aa elementor-widget elementor-widget-heading\" data-id=\"81085aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vegetation and environmental monitoring<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6ba85e1 elementor-widget elementor-widget-text-editor\" data-id=\"6ba85e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tCapture vegetation structure and ground conditions beneath canopy for forestry, environmental assessment, and land monitoring.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4596f41 e-con-full e-flex e-con e-child\" data-id=\"4596f41\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-647acf7 e-con-full e-flex e-con e-child\" data-id=\"647acf7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e5b95a3 e-con-full e-flex e-con e-child\" data-id=\"e5b95a3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ba521a6 elementor-widget elementor-widget-heading\" data-id=\"ba521a6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Digital twins and 3D modelling<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-313311f elementor-widget elementor-widget-text-editor\" data-id=\"313311f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tCreate detailed three-dimensional datasets for infrastructure, facilities, terrain, and complex project sites.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f36dceb e-con-full e-flex e-con e-child\" data-id=\"f36dceb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-59d629f e-con-full e-flex e-con e-child\" data-id=\"59d629f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-42e8b28 e-con-full e-flex e-con e-child\" data-id=\"42e8b28\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f0679a5 elementor-widget elementor-widget-heading\" data-id=\"f0679a5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Change detection<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2cd6f7 elementor-widget elementor-widget-text-editor\" data-id=\"f2cd6f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tCompare repeat lidar surveys to measure changes in terrain, vegetation, construction, erosion, and infrastructure.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6666638 e-con-full e-flex e-con e-child\" data-id=\"6666638\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-71336e9 e-con-full e-flex e-con e-child\" data-id=\"71336e9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-50bda8d e-con-full e-flex e-con e-child\" data-id=\"50bda8d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ef151d1 elementor-widget elementor-widget-heading\" data-id=\"ef151d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Mining and aggregates<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-281a9ee elementor-widget elementor-widget-text-editor\" data-id=\"281a9ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tMap terrain and calculate stockpile or material volumes using three-dimensional surface data.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ba17963 e-grid e-con-full e-con e-child\" data-id=\"ba17963\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4677c80 e-con-full e-flex e-con e-child\" data-id=\"4677c80\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-5e534a7 e-con-full e-flex e-con e-child\" data-id=\"5e534a7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0e82471 e-con-full e-flex e-con e-child\" data-id=\"0e82471\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f2f0499 elementor-widget elementor-widget-heading\" data-id=\"f2f0499\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Asset positioning and surveying<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3de51e1 elementor-widget elementor-widget-text-editor\" data-id=\"3de51e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tCapture the location and geometry of physical assets for mapping, engineering, inspection, and asset management.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dad24b7 e-con-full e-flex e-con e-child\" data-id=\"dad24b7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-b14ff45 e-con-full e-flex e-con e-child\" data-id=\"b14ff45\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9c75636 e-con-full e-flex e-con e-child\" data-id=\"9c75636\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a098bd elementor-widget elementor-widget-heading\" data-id=\"7a098bd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Shallow-water and shoreline mapping<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2c9c2bb elementor-widget elementor-widget-text-editor\" data-id=\"2c9c2bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tVolatus also offers topo-bathymetric lidar for mapping submerged and dry terrain in a single survey. Depth reach depends on water clarity, typically up to about two Secchi depths, so surveys are timed for clear water conditions.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-210f028 e-flex e-con-boxed e-con e-parent\" data-id=\"210f028\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-09096b1 e-con-full filter-section item-drones e-flex e-con e-child\" data-id=\"09096b1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3681f45 e-con-full e-flex e-con e-child\" data-id=\"3681f45\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-7d9cdd0 e-con-full e-flex e-con e-child\" data-id=\"7d9cdd0\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;sticky&quot;:&quot;top&quot;,&quot;sticky_offset&quot;:90,&quot;sticky_parent&quot;:&quot;yes&quot;,&quot;sticky_on&quot;:[&quot;desktop&quot;,&quot;laptop&quot;],&quot;sticky_effects_offset&quot;:0,&quot;sticky_anchor_link_offset&quot;:0}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f4c464d elementor-widget__width-inherit elementor-widget elementor-widget-heading\" data-id=\"f4c464d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">How lidar supports an <span style=\"color: #FFB601\">asset monitoring program<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce9f9bc elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"ce9f9bc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tA lidar survey creates a georeferenced three-dimensional record of an asset or site. Repeat surveys provide comparable datasets that can be analyzed for measurable change, provided the control, reference system, and acquisition parameters stay consistent between surveys.\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-504ef7e e-con-full e-flex e-con e-child\" data-id=\"504ef7e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-59a6967 e-grid e-con-full e-con e-child\" data-id=\"59a6967\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-e0fdfbb e-con-full e-flex e-con e-child\" data-id=\"e0fdfbb\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9090851 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"9090851\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">01<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f19c864 elementor-widget elementor-widget-icon-box\" data-id=\"f19c864\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tRepeat surveys\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\t Capture the same area at defined intervals using the same control and flight parameters to establish a consistent spatial record.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-eef4b18 e-con-full e-flex e-con e-child\" data-id=\"eef4b18\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-16f5cc9 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"16f5cc9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">02<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-63dba3a elementor-widget elementor-widget-icon-box\" data-id=\"63dba3a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tChange detection\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tCompare point clouds and derived models to identify changes in terrain, structures, vegetation, or site conditions. Changes are reported against the measured accuracy of each survey, so real change can be separated from survey noise.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-bd72ee9 e-con-full e-flex e-con e-child\" data-id=\"bd72ee9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8966739 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"8966739\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">03<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-906555a elementor-widget elementor-widget-icon-box\" data-id=\"906555a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tAsset measurement\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tExtract elevation, clearance, position, dimensions, and other spatial measurements from the point cloud.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-580ca31 e-con-full e-flex e-con e-child\" data-id=\"580ca31\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e647452 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"e647452\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">04<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-37f1a8c elementor-widget elementor-widget-icon-box\" data-id=\"37f1a8c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tVegetation analysis\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tSeparate vegetation from ground data to assess canopy structure, encroachment, and terrain beneath vegetation.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4d6eace e-con-full e-flex e-con e-child\" data-id=\"4d6eace\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b3732a4 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"b3732a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">05<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c7c73f0 elementor-widget elementor-widget-icon-box\" data-id=\"c7c73f0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tGeoreferenced findings\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\t Position measurements and features within the surveyed coordinate system for use in GIS and engineering workflows.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7cf84b7 e-con-full e-flex e-con e-child\" data-id=\"7cf84b7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-31bd4a4 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"31bd4a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">06<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-70857de elementor-widget elementor-widget-icon-box\" data-id=\"70857de\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\t3D asset records\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tBuild detailed spatial datasets that can support digital twins, planning, inspection, and asset management.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-396eb24 e-flex e-con-boxed e-con e-parent\" data-id=\"396eb24\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-34befbb elementor-widget elementor-widget-heading\" data-id=\"34befbb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Why Choose <span style=\"color: #FFB601\"> Volatus\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7eefd61 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-html\" data-id=\"7eefd61\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n\/* Expanded to fill the ENTIRE container *\/\r\n.vts-gravity-module {\r\n  position: absolute;\r\n  top: 0; \r\n  left: 0; \r\n  width: 100%; \r\n  height: 100%; \/* Changed from 50% *\/\r\n  min-height: 250px; \r\n  z-index: 0; \r\n  pointer-events: none; \r\n  background: transparent; \r\n  overflow: hidden; \r\n  font-family: 'Courier New', monospace; \r\n  user-select: none;\r\n}\r\n\r\n.vts-gravity-module canvas {\r\n  width: 100% !important; height: 100% !important; display: block;\r\n}\r\n<\/style>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/simplex-noise\/2.4.0\/simplex-noise.min.js\"><\/script>\r\n\r\n<div class=\"vts-gravity-module\"><\/div>\r\n\r\n<script>\r\n\/\/ ==========================================\r\n\/\/ EASY CUSTOMIZATION OPTIONS\r\n\/\/ ==========================================\r\nconst VTS_CONFIG = {\r\n  particleColor: 0xFFB601, \/\/ Lighter yellow (Hex format: 0xRRGGBB)\r\n  particleOpacity: 0.3,    \/\/ Lowered opacity (0.0 is invisible, 1.0 is solid)\r\n  particleSize: 3,         \/\/ Size of the individual dots\r\n  particleCount: 2000,     \/\/ Total number of dots in the scene\r\n  flowSpeed: 0.4,          \/\/ How fast the particles flow horizontally\r\n  waveSpeed: 0.002         \/\/ How fast the 3D waves ripple\r\n};\r\n\r\n(function(){\r\n  let bootAttempts = 0;\r\n  \r\n  function bootAllModules(){\r\n    if(bootAttempts > 50) return;\r\n    bootAttempts++;\r\n\r\n    \/\/ Wait for libraries\r\n    if(!window.THREE || !window.SimplexNoise) {\r\n        setTimeout(bootAllModules, 100);\r\n        return;\r\n    }\r\n\r\n    \/\/ Find ALL wrappers on the page that haven't been initialized yet\r\n    const wrappers = document.querySelectorAll('.vts-gravity-module:not(.vts-active)');\r\n    \r\n    wrappers.forEach(wrapper => {\r\n        wrapper.classList.add('vts-active');\r\n\r\n        \/\/ ==========================================\r\n        \/\/ ELEMENTOR DOM RELOCATION FIX \r\n        \/\/ ==========================================\r\n        const parentContainer = wrapper.closest('.e-con, .e-container, .elementor-section');\r\n        if(parentContainer && wrapper.parentElement !== parentContainer) {\r\n            parentContainer.style.position = 'relative';\r\n            parentContainer.style.overflow = 'hidden';\r\n            parentContainer.insertBefore(wrapper, parentContainer.firstChild); \r\n        }\r\n\r\n        let W = wrapper.clientWidth;\r\n        let H = wrapper.clientHeight;\r\n        if (H < 100) H = 250;\r\n\r\n        \/\/ ==========================================\r\n        \/\/ ISOLATED 3D SCENE SETUP\r\n        \/\/ ==========================================\r\n        const scene = new THREE.Scene(); \r\n        const camera = new THREE.PerspectiveCamera(45, W\/H, 1, 2000); \r\n        \r\n        \/\/ Leveled the camera\r\n        camera.position.set(0, 10, 200); \r\n        camera.lookAt(0, 0, 0); \/\/ Adjusted lookAt to center\r\n\r\n        const renderer = new THREE.WebGLRenderer({alpha: true, antialias: true}); \r\n        renderer.setSize(W, H); \r\n        renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n        wrapper.appendChild(renderer.domElement);\r\n        \r\n        \/\/ ==========================================\r\n        \/\/ PARTICLE SYSTEM\r\n        \/\/ ==========================================\r\n        const particleCount = VTS_CONFIG.particleCount;\r\n        const geo = new THREE.BufferGeometry();\r\n        const posArray = new Float32Array(particleCount * 3);\r\n        const initialY = new Float32Array(particleCount);\r\n\r\n        for(let i = 0; i < particleCount; i++) {\r\n            posArray[i * 3] = (Math.random() - 0.5) * 1400; \/\/ X spread    \r\n            \/\/ Spreads particles fully across the vertical space\r\n            posArray[i * 3 + 1] = (Math.random() - 0.5) * 600;   \r\n            posArray[i * 3 + 2] = (Math.random() - 0.5) * 800; \/\/ Z spread \r\n            initialY[i] = posArray[i * 3 + 1];\r\n        }\r\n        \r\n        geo.setAttribute('position', new THREE.BufferAttribute(posArray, 3));\r\n\r\n        const canvas = document.createElement('canvas');\r\n        canvas.width = 16; canvas.height = 16;\r\n        const context = canvas.getContext('2d');\r\n        context.beginPath(); context.arc(8, 8, 8, 0, 2 * Math.PI);\r\n        context.fillStyle = '#ffffff'; context.fill();\r\n        const circleTexture = new THREE.CanvasTexture(canvas);\r\n\r\n        const mat = new THREE.PointsMaterial({ \r\n            color: VTS_CONFIG.particleColor, \r\n            size: VTS_CONFIG.particleSize, \r\n            map: circleTexture, \r\n            transparent: true, \r\n            opacity: VTS_CONFIG.particleOpacity, \r\n            alphaTest: 0.1, \r\n            sizeAttenuation: true \r\n        });\r\n        \r\n        const particles = new THREE.Points(geo, mat); \r\n        scene.add(particles);\r\n\r\n        const simplex = new SimplexNoise();\r\n        let localTime = Math.random() * 100; \r\n        \r\n        \/\/ ==========================================\r\n        \/\/ LOCAL ANIMATION LOOP\r\n        \/\/ ==========================================\r\n        function animateGrav() {\r\n            requestAnimationFrame(animateGrav);\r\n            localTime += VTS_CONFIG.waveSpeed; \r\n\r\n            const pos = geo.attributes.position.array;\r\n            \r\n            for(let i = 0; i < particleCount; i++) {\r\n                let index = i * 3;\r\n                pos[index] -= VTS_CONFIG.flowSpeed; \r\n                \r\n                if (pos[index] < -700) { pos[index] = 700; }\r\n\r\n                const x = pos[index], z = pos[index + 2];\r\n                const noiseVal = simplex.noise3D(x * 0.004, z * 0.004, localTime) * 25;\r\n                const dist = Math.sqrt(x*x + z*z);\r\n                const well = dist < 150 ? -30 * Math.cos(dist*Math.PI\/300) : 0;\r\n                \r\n                const slope = x * 0.06; \r\n                \r\n                pos[index + 1] = initialY[i] + noiseVal + well + slope;\r\n            }\r\n            \r\n            geo.attributes.position.needsUpdate = true;\r\n            renderer.render(scene, camera);\r\n        }\r\n        \r\n        animateGrav();\r\n\r\n        \/\/ ==========================================\r\n        \/\/ ISOLATED RESIZE OBSERVER\r\n        \/\/ ==========================================\r\n        let resizeTimer;\r\n        if(window.ResizeObserver) {\r\n            new ResizeObserver(()=>{\r\n              clearTimeout(resizeTimer);\r\n              resizeTimer = setTimeout(() => {\r\n                  if(!wrapper) return;\r\n                  const newW = wrapper.clientWidth;\r\n                  let newH = wrapper.clientHeight;\r\n                  if (newH < 100) newH = 250;\r\n                  \r\n                  if(newW > 0 && newH > 0 && (newW !== W || newH !== H)){\r\n                      W = newW; H = newH;\r\n                      renderer.setSize(W, H);\r\n                      camera.aspect = W \/ H;\r\n                      camera.updateProjectionMatrix();\r\n                  }\r\n              }, 200);\r\n            }).observe(parentContainer || wrapper);\r\n        }\r\n    });\r\n  }\r\n  \r\n  if(document.readyState==='complete'){ bootAllModules(); } \r\n  else { window.addEventListener('load', bootAllModules); }\r\n  document.addEventListener('DOMContentLoaded', bootAllModules);\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-fc14dfb e-con-full e-flex e-con e-child\" data-id=\"fc14dfb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-6e1a2a7 e-con-full e-flex e-con e-child\" data-id=\"6e1a2a7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-876dc60 e-con-full e-flex e-con e-child\" data-id=\"876dc60\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-d947895 e-con-full glass-card  e-flex e-con e-child\" data-id=\"d947895\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9ff9650 elementor-widget elementor-widget-heading\" data-id=\"9ff9650\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">01<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1743753 elementor-widget elementor-widget-icon-box\" data-id=\"1743753\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tIntegrated aerial and terrestrial capability\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\t Volatus combines UAV, vehicle-mounted, and terrestrial lidar acquisition to address different site conditions and survey requirements.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-80f8b0c e-con-full glass-card  e-flex e-con e-child\" data-id=\"80f8b0c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c1933fd elementor-widget elementor-widget-heading\" data-id=\"c1933fd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">02<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5fe206d elementor-widget elementor-widget-icon-box\" data-id=\"5fe206d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tPoint cloud processing\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tLidar data can be processed for terrain modelling, strip adjustment, colorization, classification, and visualization rather than being delivered as unprocessed sensor\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-01eea0a e-con-full e-flex e-con e-child\" data-id=\"01eea0a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4c6da05 e-con-full glass-card  e-flex e-con e-child\" data-id=\"4c6da05\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e00954f elementor-widget elementor-widget-heading\" data-id=\"e00954f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">03<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a3eccf6 elementor-widget elementor-widget-icon-box\" data-id=\"a3eccf6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tGNSS\/INS positioning with PPK processing\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tHigh-precision trajectory processing supports accurately georeferenced lidar data and repeatable mapping workflows.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7fa1568 e-con-full glass-card  e-flex e-con e-child\" data-id=\"7fa1568\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2c18431 elementor-widget elementor-widget-heading\" data-id=\"2c18431\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">04<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4ddfaa7 elementor-widget elementor-widget-icon-box\" data-id=\"4ddfaa7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tVerified accuracy\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tResults are checked against independent ground checkpoints and documented in an accuracy report.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-07f6a6a e-con-full e-flex e-con e-child\" data-id=\"07f6a6a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-f9fcecd e-con-full glass-card  e-flex e-con e-child\" data-id=\"f9fcecd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-882a5bb elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-heading\" data-id=\"882a5bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">05<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fedb8d8 elementor-widget elementor-widget-icon-box\" data-id=\"fedb8d8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tIntegrated geospatial workflows\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tLidar can be combined with RGB imagery, photogrammetry, multispectral data, and other sensors when additional visual or spectral information is required.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b94d0f8 e-con-full e-flex e-con e-child\" data-id=\"b94d0f8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-b7078c4 e-con-full glass-card  e-flex e-con e-child\" data-id=\"b7078c4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c2cc740 elementor-widget elementor-widget-heading\" data-id=\"c2cc740\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">06<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5f93336 elementor-widget elementor-widget-icon-box\" data-id=\"5f93336\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tMultiple lidar platforms\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tVolatus provides access to lidar systems suited to different requirements, including high-density mapping, long-range acquisition, vertical mapping, mobile mapping, and topo-bathymetric applications with the YellowScan Navigator.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9cd2e92 e-con-full glass-card  e-flex e-con e-child\" data-id=\"9cd2e92\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1828d7f elementor-widget elementor-widget-heading\" data-id=\"1828d7f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">07<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2a6f733 elementor-widget elementor-widget-icon-box\" data-id=\"2a6f733\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tHigh-density data acquisition\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tVolatus lidar systems include platforms capable of high point densities and multiple returns for detailed terrain, vegetation, and infrastructure mapping.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-daa9443 e-con-full e-flex e-con e-parent\" data-id=\"daa9443\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-799fb71 e-con-full e-flex e-con e-child\" data-id=\"799fb71\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-7cb2825 e-flex e-con-boxed e-con e-child\" data-id=\"7cb2825\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-51584fe e-con-full e-flex e-con e-child\" data-id=\"51584fe\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-07fa760 elementor-widget elementor-widget-heading\" data-id=\"07fa760\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Lidar <span style=\"color: #FFB601\"> vs. <\/span> Photogrammetry <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b012534 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"b012534\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Lidar measures distance using laser pulses and produces three-dimensional point cloud data. Photogrammetry reconstructs spatial information from overlapping imagery.<\/p><p>Lidar is particularly useful for terrain mapping under vegetation, thin features such as wires and poles, elevation analysis, and three-dimensional infrastructure data, and it is less dependent on lighting conditions. Photogrammetry provides high-resolution visual information, orthomosaics, and image-based 3D reconstruction, but it only models the top of the canopy and needs good, even lighting and textured surfaces.<\/p><p>The two technologies can also be used together. Combining lidar with RGB imagery provides both three-dimensional measurements and visual context within the same geospatial workflow.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4abff84 e-flex e-con-boxed e-con e-child\" data-id=\"4abff84\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0e367dc e-con-full e-flex e-con e-child\" data-id=\"0e367dc\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-df354b4 e-con-full e-flex e-con e-child\" data-id=\"df354b4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a7a00be elementor-view-framed elementor-shape-circle elementor-widget elementor-widget-icon\" data-id=\"a7a00be\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-helicopter\" viewBox=\"0 0 640 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M304 384h272c17.67 0 32-14.33 32-32 0-123.71-100.29-224-224-224V64h176c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H144c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h176v64H112L68.8 70.4C65.78 66.37 61.03 64 56 64H16.01C5.6 64-2.04 73.78.49 83.88L32 192l160 64 86.4 115.2A31.992 31.992 0 0 0 304 384zm112-188.49C478.55 208.3 528.03 257.44 540.79 320H416V195.51zm219.37 263.3l-22.15-22.2c-6.25-6.26-16.24-6.1-22.64.01-7.09 6.77-13.84 11.25-24.64 11.25H240c-8.84 0-16 7.18-16 16.03v32.06c0 8.85 7.16 16.03 16 16.03h325.94c14.88 0 35.3-.47 68.45-29.52 7.02-6.14 7.57-17.05.98-23.66z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-543bc43 elementor-widget elementor-widget-heading\" data-id=\"543bc43\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Lidar<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9cfc243 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"9cfc243\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Terrain mapping under vegetation<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Captures thin features (wires, poles)<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Detailed elevation analysis<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Three-dimensional infrastructure data<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Less dependent on lighting conditions<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-66936bc e-con-full e-flex e-con e-child\" data-id=\"66936bc\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6bb3b46 e-con-full e-flex e-con e-child\" data-id=\"6bb3b46\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-e93de11 e-con-full e-flex e-con e-child\" data-id=\"e93de11\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4910b7a elementor-view-framed elementor-shape-circle elementor-widget elementor-widget-icon\" data-id=\"4910b7a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-helicopter\" viewBox=\"0 0 640 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M304 384h272c17.67 0 32-14.33 32-32 0-123.71-100.29-224-224-224V64h176c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H144c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h176v64H112L68.8 70.4C65.78 66.37 61.03 64 56 64H16.01C5.6 64-2.04 73.78.49 83.88L32 192l160 64 86.4 115.2A31.992 31.992 0 0 0 304 384zm112-188.49C478.55 208.3 528.03 257.44 540.79 320H416V195.51zm219.37 263.3l-22.15-22.2c-6.25-6.26-16.24-6.1-22.64.01-7.09 6.77-13.84 11.25-24.64 11.25H240c-8.84 0-16 7.18-16 16.03v32.06c0 8.85 7.16 16.03 16 16.03h325.94c14.88 0 35.3-.47 68.45-29.52 7.02-6.14 7.57-17.05.98-23.66z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e560491 elementor-widget elementor-widget-heading\" data-id=\"e560491\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Photogrammetry <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c4b51b elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"4c4b51b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">High-resolution visual information<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Orthomosaics<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Image-based 3D reconstruction<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Only models the top of the canopy<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-far-arrow-alt-circle-right\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\"> Requires good, even lighting and textured surfaces<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2eb51e6 e-flex e-con-boxed e-con e-parent\" data-id=\"2eb51e6\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-5ca63b3 e-con-full e-flex e-con e-child\" data-id=\"5ca63b3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-842b520 e-con-full e-flex e-con e-child\" data-id=\"842b520\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;sticky&quot;:&quot;top&quot;,&quot;sticky_on&quot;:[&quot;desktop&quot;,&quot;laptop&quot;],&quot;sticky_offset&quot;:90,&quot;sticky_parent&quot;:&quot;yes&quot;,&quot;sticky_effects_offset&quot;:0,&quot;sticky_anchor_link_offset&quot;:0}\">\n\t\t<div class=\"elementor-element elementor-element-89ba88e e-con-full e-flex e-con e-child\" data-id=\"89ba88e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ec68c5f elementor-widget elementor-widget-icon-box\" data-id=\"ec68c5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tDiscuss your <span style=\"color: #FFB601\">program  \t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tTell us the site, area, terrain, asset type, required accuracy, and deliverables. Volatus will recommend the appropriate lidar platform, positioning and control approach, acquisition workflow, and data products for the project. \t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1709c88 elementor-widget elementor-widget-button\" data-id=\"1709c88\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6IjQ5NjIiLCJ0b2dnbGUiOmZhbHNlfQ%3D%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Contact a specialist<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-00e4314 e-con-full e-flex e-con e-child\" data-id=\"00e4314\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a198b23 elementor-widget elementor-widget-heading\" data-id=\"a198b23\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Frequently Asked <span style=\"color: #FFB601\">Questions<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b853d0a va-faq elementor-widget elementor-widget-n-accordion\" data-id=\"b853d0a\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;default_state&quot;:&quot;expanded&quot;,&quot;max_items_expended&quot;:&quot;one&quot;,&quot;n_accordion_animation_duration&quot;:{&quot;unit&quot;:&quot;ms&quot;,&quot;size&quot;:400,&quot;sizes&quot;:[]}}\" data-widget_type=\"nested-accordion.default\">\n\t\t\t\t\t\t\t<div class=\"e-n-accordion\" aria-label=\"Accordion. Open links with Enter or Space, close with Escape, and navigate with Arrow Keys\">\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1930\" class=\"e-n-accordion-item\" open>\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"1\" tabindex=\"0\" aria-expanded=\"true\" aria-controls=\"e-n-accordion-item-1930\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">01<\/span>What is lidar mapping? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1930\" class=\"elementor-element elementor-element-790685e e-con-full e-flex e-con e-child\" data-id=\"790685e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1930\" class=\"elementor-element elementor-element-58de577 e-flex e-con-boxed e-con e-child\" data-id=\"58de577\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-afe2854 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"afe2854\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t Lidar mapping uses laser measurements to create georeferenced three-dimensional point clouds of terrain, vegetation, infrastructure, and other physical features.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1931\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"2\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1931\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">02<\/span>How does aerial lidar work? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1931\" class=\"elementor-element elementor-element-19c3f92 e-con-full e-flex e-con e-child\" data-id=\"19c3f92\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1931\" class=\"elementor-element elementor-element-0fb8ec5 e-flex e-con-boxed e-con e-child\" data-id=\"0fb8ec5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a32f24e elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"a32f24e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t A lidar sensor emits laser pulses and records their returns. GNSS and inertial systems provide the position and orientation data needed to convert those measurements into a three-dimensional point cloud. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1932\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"3\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1932\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">03<\/span>What does a lidar survey produce? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1932\" class=\"elementor-element elementor-element-abe9e23 e-con-full e-flex e-con e-child\" data-id=\"abe9e23\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1932\" class=\"elementor-element elementor-element-56d2833 e-flex e-con-boxed e-con e-child\" data-id=\"56d2833\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4e202ee elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"4e202ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tDepending on project requirements, lidar surveys can produce classified point clouds, digital terrain models, digital surface models, elevation data, contours, 3D models, and volumetric measurements.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1933\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"4\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1933\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">04<\/span>How accurate is aerial lidar? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1933\" class=\"elementor-element elementor-element-1600456 e-con-full e-flex e-con e-child\" data-id=\"1600456\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1933\" class=\"elementor-element elementor-element-1f052c0 e-flex e-con-boxed e-con e-child\" data-id=\"1f052c0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-94fc03c elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"94fc03c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tAccuracy depends on the lidar system, positioning solution, flight parameters, terrain, surface type, and processing workflow. Volatus sets an accuracy target for each project, then verifies the result against independent ground checkpoints and reports it in an accuracy report.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1934\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"5\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1934\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">05<\/span>What are RTK and PPK? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1934\" class=\"elementor-element elementor-element-6a08d12 e-con-full e-flex e-con e-child\" data-id=\"6a08d12\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1934\" class=\"elementor-element elementor-element-fdb3681 e-flex e-con-boxed e-con e-child\" data-id=\"fdb3681\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0933f28 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"0933f28\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tRTK and PPK are GNSS correction methods used to improve positioning accuracy. RTK applies corrections in real time through a radio or network link, while PPK applies them after the flight using logged base station data. For lidar, PPK processing of the sensor trajectory is the standard workflow because it is more robust and can be reprocessed if needed.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1935\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"6\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1935\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">06<\/span>Can lidar map terrain beneath vegetation? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1935\" class=\"elementor-element elementor-element-f1a689b e-con-full e-flex e-con e-child\" data-id=\"f1a689b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1935\" class=\"elementor-element elementor-element-a8df231 e-flex e-con-boxed e-con e-child\" data-id=\"a8df231\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ce09e98 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"ce09e98\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tYes. Part of each laser pulse can pass through gaps in the canopy and reach the ground, which makes lidar useful for terrain modelling, forestry, environmental surveys, and corridor mapping. Results are best under leaf-off conditions, and very dense canopy reduces the number of ground returns.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1936\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"7\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1936\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">07<\/span>Can lidar be used for corridor mapping? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1936\" class=\"elementor-element elementor-element-a0434b8 e-con-full e-flex e-con e-child\" data-id=\"a0434b8\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1936\" class=\"elementor-element elementor-element-124d647 e-flex e-con-boxed e-con e-child\" data-id=\"124d647\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8836f0b elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"8836f0b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tYes. Lidar can be used to map transportation, utility, pipeline, and other linear corridors, providing three-dimensional information about terrain, vegetation, infrastructure, and clearances.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1937\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"8\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1937\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">08<\/span> Can lidar calculate stockpile volumes? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1937\" class=\"elementor-element elementor-element-3a37ebf e-con-full e-flex e-con e-child\" data-id=\"3a37ebf\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1937\" class=\"elementor-element elementor-element-097a36c e-flex e-con-boxed e-con e-child\" data-id=\"097a36c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf098d2 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"cf098d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tYes. Point clouds and derived surface models can be used to calculate volumes and compare material quantities between repeat surveys.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1938\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"9\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1938\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">09<\/span>Can lidar detect changes over time? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1938\" class=\"elementor-element elementor-element-41ee2c3 e-con-full e-flex e-con e-child\" data-id=\"41ee2c3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1938\" class=\"elementor-element elementor-element-6195b30 e-flex e-con-boxed e-con e-child\" data-id=\"6195b30\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-45b0ce2 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"45b0ce2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tYes. Repeat lidar surveys can be compared to identify measurable changes in terrain, vegetation, construction, erosion, and infrastructure.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1939\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"10\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1939\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">10<\/span>Can lidar create 3D models? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1939\" class=\"elementor-element elementor-element-6910a83 e-con-full e-flex e-con e-child\" data-id=\"6910a83\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1939\" class=\"elementor-element elementor-element-2ee2075 e-flex e-con-boxed e-con e-child\" data-id=\"2ee2075\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf68a34 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"cf68a34\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tYes. Lidar point clouds can be processed into three-dimensional representations of terrain, infrastructure, facilities, and other physical environments.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-19310\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"11\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-19310\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">11<\/span> What is the difference between lidar and photogrammetry? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-19310\" class=\"elementor-element elementor-element-f81a563 e-con-full e-flex e-con e-child\" data-id=\"f81a563\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-19310\" class=\"elementor-element elementor-element-88de6a5 e-flex e-con-boxed e-con e-child\" data-id=\"88de6a5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a99bd68 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"a99bd68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tLidar uses laser measurements to capture three-dimensional spatial data, while photogrammetry reconstructs geometry from overlapping images. Each provides different information, and the two can be combined where both spatial and visual data are required.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-19311\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"12\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-19311\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> <span class=\"faq-no\">12<\/span>Can lidar and photogrammetry be captured together?  <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-19311\" class=\"elementor-element elementor-element-507043c e-con-full e-flex e-con e-child\" data-id=\"507043c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-19311\" class=\"elementor-element elementor-element-e471eb4 e-flex e-con-boxed e-con e-child\" data-id=\"e471eb4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-67b9323 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"67b9323\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tYes. Volatus can combine lidar with RGB imagery and other sensors to provide three-dimensional measurements alongside high-resolution visual information.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Capturez des nuages de points 3D haute pr\u00e9cision, des mod\u00e8les num\u00e9riques du terrain et des donn\u00e9es de cartographie des couloirs. Solutions LiDAR a\u00e9riennes de niveau d\u2019\u00e9tude pour l\u2019analyse de l\u2019infrastructure et du terrain.<\/p>","protected":false},"author":3,"featured_media":0,"parent":36391,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"class_list":["post-38408","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/38408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/comments?post=38408"}],"version-history":[{"count":106,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/38408\/revisions"}],"predecessor-version":[{"id":38895,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/38408\/revisions\/38895"}],"up":[{"embeddable":true,"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/pages\/36391"}],"wp:attachment":[{"href":"https:\/\/volatusaerospace.com\/fr-ca\/wp-json\/wp\/v2\/media?parent=38408"}],"curies":[{"name":"Bien jou\u00e9","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}