@rr0/ufoathome 0.124.0 → 0.125.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-embed-interview/rr0-interview.mjs +8 -7
- package/dist-embed-scene/{AdsbLolArchiveProvider-Ju7E64iO.js → AdsbLolArchiveProvider-CL1XUape.js} +1 -1
- package/dist-embed-scene/{ContrailSystem-BlsY0hsn.js → ContrailSystem-CG5BhBF7.js} +1 -1
- package/dist-embed-scene/GLTFLoader-CowOlg4J.js +1 -0
- package/dist-embed-scene/{HeadlightSystem-k2VkX7hN.js → HeadlightSystem-OwCRe0Vs.js} +1 -1
- package/dist-embed-scene/RailwaySystem-usuVIAY1.js +41 -0
- package/dist-embed-scene/{RoadMarkings-Bd5i68iF.js → RoadMarkings-DbE4nCJ2.js} +1 -1
- package/dist-embed-scene/SceneNames_es-B9tudMDH.js +1 -0
- package/dist-embed-scene/SceneNames_fr-DAd-g0yB.js +1 -0
- package/dist-embed-scene/SceneNames_it-BLLX--oG.js +1 -0
- package/dist-embed-scene/{TraceSystem-D2DpL5Qj.js → TraceSystem-B9WBM9ut.js} +1 -1
- package/dist-embed-scene/WaterSystem-yC8sKIc5.js +1 -0
- package/dist-embed-scene/rr0-scene.mjs +374 -334
- package/dist-embed-scene/sightingSchema-v2l1p6Ld.js +1 -0
- package/dist-embed-sighting/{AdsbLolArchiveProvider-BUE3bdCg.js → AdsbLolArchiveProvider-DvCD0VGc.js} +1 -1
- package/dist-embed-sighting/ContrailSystem-XVzDvxFV.js +1 -0
- package/dist-embed-sighting/GLTFLoader-DjN5_ISf.js +1 -0
- package/dist-embed-sighting/{HeadlightSystem-DmXqrF-e.js → HeadlightSystem-BAkFE-MU.js} +1 -1
- package/dist-embed-sighting/RailwaySystem-BMOTAo7T.js +41 -0
- package/dist-embed-sighting/{RoadMarkings-C_046g21.js → RoadMarkings-DtoEUDmh.js} +1 -1
- package/dist-embed-sighting/SceneNames_es-VHJ-mGWu.js +1 -0
- package/dist-embed-sighting/SceneNames_fr-BtjbcaRx.js +1 -0
- package/dist-embed-sighting/SceneNames_it-Ck8f90Z6.js +1 -0
- package/dist-embed-sighting/{SightingMessages_es-C88y-33t.js → SightingMessages_es-OXYzPf-m.js} +1 -1
- package/dist-embed-sighting/{SightingMessages_fr-DC2iwVp3.js → SightingMessages_fr-ylqIoox7.js} +1 -1
- package/dist-embed-sighting/{SightingMessages_it-B5t71z1M.js → SightingMessages_it-B9f92W5s.js} +1 -1
- package/dist-embed-sighting/{TraceSystem-DxQWm8ZH.js → TraceSystem-DpokUmzt.js} +2 -2
- package/dist-embed-sighting/WaterSystem-BLt9Dsxc.js +1 -0
- package/dist-embed-sighting/rr0-sighting.mjs +379 -339
- package/dist-embed-sighting/sightingSchema-v2l1p6Ld.js +1 -0
- package/dist-embed-sighting-editor/{AdsbLolArchiveProvider-CFgVABcu.js → AdsbLolArchiveProvider-BtbGVTLo.js} +1 -1
- package/dist-embed-sighting-editor/{BodyEditor-Dg97ZrRa.js → BodyEditor-DinH26FA.js} +1 -1
- package/dist-embed-sighting-editor/ContrailSystem-Bh3PmOP9.js +1 -0
- package/dist-embed-sighting-editor/{CoverageAssessor-8zrC-ZY0.js → CoverageAssessor-DCGCl8ic.js} +1 -1
- package/dist-embed-sighting-editor/{GLTFLoader-RPFGUAaO.js → GLTFLoader-Bpggnw6G.js} +1 -1
- package/dist-embed-sighting-editor/{HeadlightSystem-DbRok2GO.js → HeadlightSystem-DOjC-oxf.js} +1 -1
- package/dist-embed-sighting-editor/HynekAssessor-DTuaJ9gE.js +1 -0
- package/dist-embed-sighting-editor/{InterviewEditorElement-DRjEJwEk.js → InterviewEditorElement-BRL8pvdi.js} +8 -7
- package/dist-embed-sighting-editor/{LaunchEditor-byu9U1W7.js → LaunchEditor-CFmH6y0N.js} +1 -1
- package/dist-embed-sighting-editor/ModelSource-SZRN-dar.js +1 -0
- package/dist-embed-sighting-editor/{ModelThumbnails-hmPAkRbd.js → ModelThumbnails-6N7NAP44.js} +1 -1
- package/dist-embed-sighting-editor/{ModelViewer-Mvug9CHB.js → ModelViewer-C_mVYZ1c.js} +1 -1
- package/dist-embed-sighting-editor/RailwaySystem-BTm6OfuJ.js +41 -0
- package/dist-embed-sighting-editor/{RoadMarkings-BKfyWjdC.js → RoadMarkings-AaLPDthv.js} +1 -1
- package/dist-embed-sighting-editor/SceneNames_es-4pppn42v.js +1 -0
- package/dist-embed-sighting-editor/SceneNames_fr-odZ6uYWU.js +1 -0
- package/dist-embed-sighting-editor/SceneNames_it-lXfB7y6i.js +1 -0
- package/dist-embed-sighting-editor/{SightingEditorMessages_es-DvIK6dPp.js → SightingEditorMessages_es-1QZ2n8km.js} +2 -2
- package/dist-embed-sighting-editor/{SightingEditorMessages_fr-Ds1GsY_1.js → SightingEditorMessages_fr-DAg8lRfr.js} +2 -2
- package/dist-embed-sighting-editor/{SightingEditorMessages_it-Y2D8aYCY.js → SightingEditorMessages_it-C2TQ7muu.js} +2 -2
- package/dist-embed-sighting-editor/{SightingFileEditor-C0NC8jbz.js → SightingFileEditor-7inIgp24.js} +1 -1
- package/dist-embed-sighting-editor/{TraceSystem-BMYhHoF0.js → TraceSystem-D8oL7SlQ.js} +2 -2
- package/dist-embed-sighting-editor/WaterSystem-1r0jEJ6E.js +1 -0
- package/dist-embed-sighting-editor/{caseSchema-BDFgjA8v.js → caseSchema-ByeWR3Rx.js} +1 -1
- package/dist-embed-sighting-editor/{interviewSchema-CMRZUnRy.js → interviewSchema-m_h5f8H0.js} +1 -1
- package/dist-embed-sighting-editor/rr0-sighting-editor.mjs +403 -425
- package/dist-embed-sighting-editor/sightingSchema-v2l1p6Ld.js +1 -0
- package/dist-embed-sighting-editor/surroundingsSources-98rSCu2Y.js +1 -0
- package/dist-embed-sighting-editor/{trafficRuntime-BtljEizX.js → trafficRuntime-Dk4XdgcY.js} +1 -1
- package/package.json +3 -1
- package/dist-embed-scene/GLTFLoader-BHGcTcu1.js +0 -1
- package/dist-embed-scene/SceneNames_es-b8rqu51e.js +0 -1
- package/dist-embed-scene/SceneNames_fr-sF9gfZV2.js +0 -1
- package/dist-embed-scene/SceneNames_it-CoR2S3bM.js +0 -1
- package/dist-embed-scene/sightingSchema-kkSSrggd.js +0 -1
- package/dist-embed-sighting/ContrailSystem-DjBzEFUl.js +0 -1
- package/dist-embed-sighting/GLTFLoader-DvLBfH-C.js +0 -1
- package/dist-embed-sighting/SceneNames_es-rKjN2baM.js +0 -1
- package/dist-embed-sighting/SceneNames_fr-CSUSeZT0.js +0 -1
- package/dist-embed-sighting/SceneNames_it-C-mVddAw.js +0 -1
- package/dist-embed-sighting/sightingSchema-kkSSrggd.js +0 -1
- package/dist-embed-sighting-editor/ContrailSystem-DSdLswxr.js +0 -1
- package/dist-embed-sighting-editor/HynekAssessor-9gYrshkH.js +0 -1
- package/dist-embed-sighting-editor/ModelSource-f1GhdDou.js +0 -1
- package/dist-embed-sighting-editor/SceneNames_es-cN-l95fv.js +0 -1
- package/dist-embed-sighting-editor/SceneNames_fr-ZUtpsigH.js +0 -1
- package/dist-embed-sighting-editor/SceneNames_it-DLqJc0Rc.js +0 -1
- package/dist-embed-sighting-editor/sightingSchema-kkSSrggd.js +0 -1
- package/dist-embed-sighting-editor/surroundingsSources-BtDVuj-U.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{V as a,D as r}from"./rr0-sighting-editor.mjs";const n={bodies:{sun:"Soleil",moon:"Lune",Venus:"Vénus",Saturn:"Saturne"},stars:{Betelgeuse:"Bételgeuse",Vega:"Véga",Altair:"Altaïr",Aldebaran:"Aldébaran",Regulus:"Régulus",Antares:"Antarès"},comets:{"halley-1910":"comète de Halley","brooks-1911":"comète Brooks","skjellerup-maristany-1927":"comète Skjellerup-Maristany","de-kock-paraskevopoulos-1941":"comète de Kock-Paraskevopoulos","southern-1947":"comète australe","eclipse-1948":"comète de l'éclipse","arend-roland-1957":"comète Arend-Roland","mrkos-1957":"comète Mrkos","seki-lines-1962":"comète Seki-Lines","ikeya-seki-1965":"comète Ikeya-Seki","bennett-1970":"comète Bennett","white-ortiz-bolelli-1970":"comète White-Ortiz-Bolelli","kohoutek-1973":"comète Kohoutek","west-1976":"comète West","iras-araki-alcock-1983":"comète IRAS-Araki-Alcock","halley-1986":"comète de Halley","hyakutake-1996":"comète Hyakutake","hale-bopp-1997":"comète Hale-Bopp","mcnaught-2007":"comète McNaught","lovejoy-2011":"comète Lovejoy","panstarrs-2013":"comète PANSTARRS","neowise-2020":"comète NEOWISE","tsuchinshan-atlas-2024":"comète Tsuchinshan-ATLAS"},novae:{"sn-1006":"supernova de 1006","sn-1054":"supernova de 1054","sn-1181":"supernova de 1181","sn-1572":"supernova de Tycho","sn-1604":"supernova de Kepler","t-crb-1866":"nova de la Couronne boréale 1866","t-aur-1891":"nova du Cocher 1891","gk-per-1901":"nova de Persée 1901","dn-gem-1912":"nova des Gémeaux 1912","v603-aql-1918":"nova de l'Aigle 1918","v476-cyg-1920":"nova du Cygne 1920","rr-pic-1925":"nova du Peintre 1925","dq-her-1934":"nova d'Hercule 1934","cp-lac-1936":"nova du Lézard 1936","cp-pup-1942":"nova de la Poupe 1942","t-crb-1946":"nova de la Couronne boréale 1946","v446-her-1960":"nova d'Hercule 1960","v533-her-1963":"nova d'Hercule 1963","hr-del-1967":"nova du Dauphin 1967","lv-vul-1968":"nova du Petit Renard 1968","fh-ser-1970":"nova du Serpent 1970","v1500-cyg-1975":"nova du Cygne 1975","v842-cen-1986":"nova du Centaure 1986","sn-1987a":"supernova 1987A","v1974-cyg-1992":"nova du Cygne 1992","v382-vel-1999":"nova des Voiles 1999","v1494-aql-1999":"nova de l'Aigle 1999","v4743-sgr-2002":"nova du Sagittaire 2002","rs-oph-2006":"nova d'Ophiuchus 2006","v1280-sco-2007":"nova du Scorpion 2007","v339-del-2013":"nova du Dauphin 2013","v1369-cen-2013":"nova du Centaure 2013","rs-oph-2021":"nova d'Ophiuchus 2021"},satelliteClasses:{echo:"les ballons Echo","iridium-flares":"les flashes d'Iridium",iss:"la Station spatiale internationale","starlink-trains":"les trains de Starlink"},showers:{quadrantids:"Quadrantides",lyrids:"Lyrides d'avril","eta-aquariids":"Êta Aquarides","alpha-capricornids":"Alpha Capricornides","southern-delta-aquariids":"Delta Aquarides du Sud",perseids:"Perséides","southern-taurids":"Taurides du Sud",draconids:"Draconides d'octobre",orionids:"Orionides","northern-taurids":"Taurides du Nord",leonids:"Léonides",geminids:"Géminides",ursids:"Ursides"},lightRigs:{airliner:"Avion de ligne",helicopter:"Hélicoptère","car-headlights":"Voiture, phares allumés","car-hazards":"Voiture, feux de détresse","emergency-beacons":"Gyrophares de véhicule d'urgence",streetlamp:"Lampadaire"},instruments:{eye:"Œil nu","rectilinear-lens":"Appareil, modèle inconnu","roamer-1-120":"Roamer 1, film 120","instamatic-126":"Instamatic, film 126","slr-35mm-50":"Reflex 35 mm, objectif 50 mm","slr-35mm-zoom":"Reflex 35 mm, zoom 70-210 mm","phone-landscape":"Téléphone, tenu couché","phone-portrait":"Téléphone, tenu debout",...r.names(),...a.names()},decorKinds:{building:"Bâtiment",tree:"Arbre",shrub:"Buisson",bridge:"Pont",wire:"Ligne aérienne",crop:"Rang de culture",terrace:"Restanque (terrasse)",mound:"Tas de pierres",wall:"Muret de pierres sèches",streetlight:"Lampadaire",vehicle:"Véhicule",observer:"Observateur",aircraft:"Aéronef",entity:"Être"},compassPoints:["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"],towards:e=>/^[EO]/.test(e)?`à l'${e}`:`au ${e}`,starTooltip:"{name} — mag {mag}, {alt}° au-dessus de l'horizon",starTooltipBelow:"{name} — mag {mag}, {alt}° sous l'horizontale",decorTooltip:"{name} — {size}, à {distance}",satelliteTooltip:"{name} — satellite, mag {mag}, à {height} km d'altitude",opticsTooltips:{halo22:"Halo de 22° — un anneau autour du Soleil, dû à la lumière déviée par des cristaux de glace hexagonaux dans les cirrus ; son bord interne est rouge, à 21,7°",halo46:"Halo de 46° — un anneau plus rare et plus faible : la lumière entre par une face latérale d'un cristal et sort par une face de bout",oddRadius:"Halo de {angle}° — un anneau à rayon impair, rare et faible, dû à des cristaux de glace à bouts pyramidaux",parhelion:"Parhélie — une tache brillante colorée à côté du Soleil, à sa hauteur, due à des plaquettes de glace tombant à plat ; rouge côté Soleil",parhelion120:"Parhélie à 120° — une faible tache blanche à 120° du Soleil, due à la lumière réfléchie à l'intérieur de plaquettes à plat",upperTangentArc:"Arc tangent supérieur — un arc brillant posé sur le haut du halo de 22°, dû à des colonnes couchées à l'horizontale",lowerTangentArc:"Arc tangent inférieur — un arc touchant le bas du halo de 22°, dû à des colonnes couchées à l'horizontale",circumzenithal:"Arc circumzénithal — une bande vivement colorée près du zénith, due à la lumière entrant par la face du dessus de plaquettes à plat (seulement Soleil sous 32°)",circumhorizontal:"Arc circumhorizontal — une bande colorée basse dans le ciel, due à la lumière entrant par la face latérale de plaquettes à plat (seulement Soleil au-dessus de 58°)",parhelicCircle:"Cercle parhélique — un cercle blanc faisant tout le tour du ciel à la hauteur du Soleil, dû aux reflets sur les faces verticales de plaquettes à plat",pillar:"Pilier de lumière — une colonne de lumière dressée au-dessus du Soleil, due aux reflets sur des plaquettes à plat légèrement inclinées",subsun:"Sous-soleil — une image du Soleil sous l'horizon, due aux reflets sur les faces plates de plaquettes"},trafficTooltip:{unnamed:"Aéronef {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"cap {value}°",position:"à {distance} km, {elevation}° au-dessus de l'horizon, {bearing}",heard:"Entendu à {level} dB(A), parti de l'avion il y a {delay} s, {lag}° derrière lui : {character}{pitch}",rumble:"un grondement grave, rien au-delà de {cutoff} Hz",muffled:"un bruit sourd, rien au-delà de {cutoff} Hz",broad:"un souffle large",pitchHigher:", son plus aigu de {percent} %",pitchLower:", son plus grave de {percent} %",inaudible:"Inaudible ici : {level} dB(A) contre {ambient} dB(A) de bruit ambiant",soundUnknown:"Son non calculable : l'avion n'était pas encore enregistré quand il est parti",contrailPersistent:"Laisse une traînée qui dure : l'air est sursaturé en glace ({rhi} % par rapport à la glace)",contrailShort:"Laisse une traînée brève : l'air est sec par rapport à la glace ({rhi} % par rapport à la glace)",military:"militaire",restricted:"identité masquée par son propriétaire",candidate:"Un candidat compatible, pas une identification"},credits:"Crédits",notAVideo:"Ceci n'est pas une vidéo",isASimulation:"C'est une simulation en temps réel."};export{n as sceneNames_fr};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{V as a,D as o}from"./rr0-sighting-editor.mjs";const l={bodies:{sun:"Sole",moon:"Luna",Venus:"Venere",Mars:"Marte",Jupiter:"Giove",Saturn:"Saturno"},stars:{Sirius:"Sirio",Canopus:"Canopo",Arcturus:"Arturo",Procyon:"Procione",Pollux:"Polluce",Castor:"Castore",Regulus:"Regolo"},comets:{"halley-1910":"cometa di Halley","brooks-1911":"cometa Brooks","skjellerup-maristany-1927":"cometa Skjellerup-Maristany","de-kock-paraskevopoulos-1941":"cometa de Kock-Paraskevopoulos","southern-1947":"cometa australe","eclipse-1948":"cometa dell'eclisse","arend-roland-1957":"cometa Arend-Roland","mrkos-1957":"cometa Mrkos","seki-lines-1962":"cometa Seki-Lines","ikeya-seki-1965":"cometa Ikeya-Seki","bennett-1970":"cometa Bennett","white-ortiz-bolelli-1970":"cometa White-Ortiz-Bolelli","kohoutek-1973":"cometa Kohoutek","west-1976":"cometa West","iras-araki-alcock-1983":"cometa IRAS-Araki-Alcock","halley-1986":"cometa di Halley","hyakutake-1996":"cometa Hyakutake","hale-bopp-1997":"cometa Hale-Bopp","mcnaught-2007":"cometa McNaught","lovejoy-2011":"cometa Lovejoy","panstarrs-2013":"cometa PANSTARRS","neowise-2020":"cometa NEOWISE","tsuchinshan-atlas-2024":"cometa Tsuchinshan-ATLAS"},novae:{"sn-1006":"supernova del 1006","sn-1054":"supernova del 1054","sn-1181":"supernova del 1181","sn-1572":"supernova di Tycho","sn-1604":"supernova di Keplero","t-crb-1866":"nova della Corona Boreale 1866","t-aur-1891":"nova dell'Auriga 1891","gk-per-1901":"nova di Perseo 1901","dn-gem-1912":"nova dei Gemelli 1912","v603-aql-1918":"nova dell'Aquila 1918","v476-cyg-1920":"nova del Cigno 1920","rr-pic-1925":"nova del Pittore 1925","dq-her-1934":"nova di Ercole 1934","cp-lac-1936":"nova della Lucertola 1936","cp-pup-1942":"nova della Poppa 1942","t-crb-1946":"nova della Corona Boreale 1946","v446-her-1960":"nova di Ercole 1960","v533-her-1963":"nova di Ercole 1963","hr-del-1967":"nova del Delfino 1967","lv-vul-1968":"nova della Volpetta 1968","fh-ser-1970":"nova del Serpente 1970","v1500-cyg-1975":"nova del Cigno 1975","v842-cen-1986":"nova del Centauro 1986","sn-1987a":"supernova 1987A","v1974-cyg-1992":"nova del Cigno 1992","v382-vel-1999":"nova delle Vele 1999","v1494-aql-1999":"nova dell'Aquila 1999","v4743-sgr-2002":"nova del Sagittario 2002","rs-oph-2006":"nova di Ofiuco 2006","v1280-sco-2007":"nova dello Scorpione 2007","v339-del-2013":"nova del Delfino 2013","v1369-cen-2013":"nova del Centauro 2013","rs-oph-2021":"nova di Ofiuco 2021"},satelliteClasses:{echo:"i palloni Echo","iridium-flares":"i lampi degli Iridium",iss:"la Stazione Spaziale Internazionale","starlink-trains":"i treni di Starlink"},showers:{quadrantids:"Quadrantidi",lyrids:"Liridi di aprile","eta-aquariids":"Eta Aquaridi","alpha-capricornids":"Alfa Capricornidi","southern-delta-aquariids":"Delta Aquaridi australi",perseids:"Perseidi","southern-taurids":"Tauridi australi",draconids:"Draconidi di ottobre",orionids:"Orionidi","northern-taurids":"Tauridi boreali",leonids:"Leonidi",geminids:"Geminidi",ursids:"Ursidi"},lightRigs:{airliner:"Aereo di linea",helicopter:"Elicottero","car-headlights":"Auto, fari accesi","car-hazards":"Auto, luci di emergenza","emergency-beacons":"Lampeggianti di veicolo di soccorso",streetlamp:"Lampione"},instruments:{eye:"Occhio nudo","rectilinear-lens":"Fotocamera, modello sconosciuto","roamer-1-120":"Roamer 1, pellicola 120","instamatic-126":"Instamatic, pellicola 126","slr-35mm-50":"Reflex 35 mm, obiettivo 50 mm","slr-35mm-zoom":"Reflex 35 mm, zoom 70-210 mm","phone-landscape":"Telefono, in orizzontale","phone-portrait":"Telefono, in verticale",...o.names(),...a.names()},decorKinds:{building:"Edificio",tree:"Albero",shrub:"Arbusto",bridge:"Ponte",wire:"Linea aerea",crop:"Filare di coltura",terrace:"Terrazzamento",mound:"Mucchio di pietre",wall:"Muretto a secco",streetlight:"Lampione",vehicle:"Veicolo",observer:"Osservatore",aircraft:"Aeromobile",entity:"Essere"},compassPoints:["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"],towards:e=>`verso ${e}`,starTooltip:"{name} — mag {mag}, {alt}° sopra l'orizzonte",starTooltipBelow:"{name} — mag {mag}, {alt}° sotto l'orizzontale",decorTooltip:"{name} — {size}, a {distance}",satelliteTooltip:"{name} — satellite, mag {mag}, a {height} km di quota",opticsTooltips:{halo22:"Alone di 22° — un anello attorno al Sole, dovuto alla luce deviata da cristalli di ghiaccio esagonali nei cirri; il bordo interno è rosso, a 21,7°",halo46:"Alone di 46° — un anello più raro e debole: la luce entra da una faccia laterale del cristallo ed esce da una faccia di estremità",oddRadius:"Alone di {angle}° — un anello a raggio dispari, raro e debole, prodotto da cristalli di ghiaccio con estremità piramidali",parhelion:"Parelio — una macchia luminosa colorata accanto al Sole, alla sua altezza, da lastrine di ghiaccio che cadono piatte; rosso verso il Sole",parhelion120:"Parelio di 120° — una debole macchia bianca a 120° dal Sole, da luce riflessa dentro lastrine piatte",upperTangentArc:"Arco tangente superiore — un arco luminoso appoggiato sull'alone di 22°, da colonne coricate in orizzontale",lowerTangentArc:"Arco tangente inferiore — un arco che tocca la base dell'alone di 22°, da colonne coricate in orizzontale",circumzenithal:"Arco circumzenitale — una banda di colori vivi vicino allo zenit, da luce che entra dalla faccia superiore di lastrine piatte (solo con il Sole sotto i 32°)",circumhorizontal:"Arco circumorizzontale — una banda colorata bassa nel cielo, da luce che entra dalla faccia laterale di lastrine piatte (solo con il Sole sopra i 58°)",parhelicCircle:"Cerchio parelico — un cerchio bianco attorno a tutto il cielo all'altezza del Sole, da riflessi sulle facce verticali di lastrine piatte",pillar:"Colonna di luce — un fascio di luce sopra il Sole, da riflessi su lastrine piatte leggermente inclinate",subsun:"Sotto-sole — un'immagine del Sole sotto l'orizzonte, da riflessi sulle facce piatte delle lastrine"},trafficTooltip:{unnamed:"Aeromobile {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"prua {value}°",position:"a {distance} km, {elevation}° sopra l'orizzonte, {bearing}",heard:"Si sente a {level} dB(A), partito dall'aereo {delay} s fa, {lag}° dietro di esso: {character}{pitch}",rumble:"un rombo grave, nulla oltre {cutoff} Hz",muffled:"un rumore sordo, nulla oltre {cutoff} Hz",broad:"un fragore ampio",pitchHigher:", suono più acuto del {percent} %",pitchLower:", suono più grave del {percent} %",inaudible:"Non si sente qui: {level} dB(A) contro {ambient} dB(A) di rumore ambientale",soundUnknown:"Suono non calcolabile: l'aereo non era ancora registrato quando è partito",contrailPersistent:"Lascia una scia che dura: l'aria è sovrasatura rispetto al ghiaccio ({rhi} % rispetto al ghiaccio)",contrailShort:"Lascia una scia breve: l'aria è secca rispetto al ghiaccio ({rhi} % rispetto al ghiaccio)",military:"militare",restricted:"identità nascosta dal proprietario",candidate:"Un candidato compatibile, non un'identificazione"},credits:"Crediti",notAVideo:"Questo non è un video",isASimulation:"È una simulazione in tempo reale."};export{l as sceneNames_it};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={type:"number"},t={type:"string",doc:'Which account this is, unique across every recording anywhere: the day it happened, then who saw it ("1964-04-24-ZamoraLonnie"), or where for an anonymous observer.'},o={type:"object",fields:{year:{type:"number"},month:{type:"number"},day:{type:"number"},hour:{type:"number"},minute:{type:"number"},second:{type:"number"},season:{type:"enum",doc:'The season, when the date is only known to be "in the spring of 2022" (EDTF `2022-21`): then `month` and `day` are undefined.',values:["spring","summer","autumn","winter"]},raw:{type:"string",doc:"The exact EDTF-ish text as typed in the editor UI (e.g."}}},r={type:"object",doc:"See SightingEvent.endTime.",fields:{year:{type:"number"},month:{type:"number"},day:{type:"number"},hour:{type:"number"},minute:{type:"number"},second:{type:"number"},season:{type:"enum",doc:'The season, when the date is only known to be "in the spring of 2022" (EDTF `2022-21`): then `month` and `day` are undefined.',values:["spring","summer","autumn","winter"]},raw:{type:"string",doc:"The exact EDTF-ish text as typed in the editor UI (e.g."}}},n={type:"number",doc:"See SightingEvent.durationSeconds."},s={type:"string",doc:"See SightingEvent.durationText."},i={type:"number",doc:"See SightingEvent.utcOffsetHours — the legal time zone `time`/`endTime` are expressed in."},a={type:"string",doc:"See SightingEvent.timeZone — the IANA rule `utcOffsetHours` was derived from, when it was."},d={type:"array",fields:{lat:{type:"number"},lng:{type:"number"},name:{type:"string",doc:'The place as it is named, fully qualified — "Valensole, Alpes-de-Haute-Provence, …, France".'}}},h={type:"object",doc:"See Sighting.observer.",fields:{id:{type:"string",doc:'Who this is, as a reference: last name then first names, run together ("ZamoraLonnie"), whether or not a page exists for them yet.'},title:{type:"string"},lastName:{type:"string"},firstNames:{type:"array"}}},c={type:"object",doc:"Who saw it and how their account travelled — see Account, and Sighting.account.",fields:{observerAgeYears:{type:"number",doc:"The main observer's age in years AT THE TIME, not today — a 1974 account is read by whoever finds it decades later, and the number that means anything is the one from then."},observerBirth:{type:"object",doc:"The main observer's birth date, as precisely as it is known (a full date, a year, or one marked approximate): the other way of stating `observerAgeYears`, which the editor keeps in step with it against the observation date (see ObserverAge).",fields:{year:{type:"number"},month:{type:"number"},day:{type:"number"},hour:{type:"number"},minute:{type:"number"},second:{type:"number"},season:{type:"enum",doc:'The season, when the date is only known to be "in the spring of 2022" (EDTF `2022-21`): then `month` and `day` are undefined.',values:["spring","summer","autumn","winter"]},raw:{type:"string",doc:"The exact EDTF-ish text as typed in the editor UI (e.g."}}},observerPerception:{type:"object",doc:"How the main observer's own perception differs from a typical one — colour vision, alcohol, fatigue — as the values of the ObserverProviders' settings, by provider id."},observerOccupation:{type:"string",doc:'What the main observer did, as they are described: "boulanger", "pilote de ligne", "gendarme".',loose:!0},source:{type:"enum",doc:"How the account reached the person who wrote this recording.",values:["on-site","interview","telephone","questionnaire","letter","social-media","press"]},followedUp:{type:"boolean",doc:"Whether the observer was gone back to after the first account."}}},l={type:"number",doc:"How much the observer's body sways the view at rest: 1 a person, 0 a tripod — see Sighting.sway."},u={type:"object",doc:"The vehicle the observer was in, when the decor does not draw it — see Sighting.vehicle.",fields:{kind:{type:"enum",values:["car","van","truck","motorcycle","generic"]},windowsOpen:{type:"boolean",doc:"Whether the windows were open: the road and the wind come in, the cabin no longer muffles the engine."},noise:{type:"number",doc:'How loud it was, against an ordinary one of its kind: 1 by default, 1.5 for "very noisy".'},headlights:{type:"enum",doc:'How its lights are set (see HeadlightMode), or "auto": the dipped beam from the dusk on and nothing by day, which is what a driver does.',values:["off","position","dipped","main","fog","auto"]},headlightKeyframes:{type:"array",doc:"Sorted by t.",fields:{t:{type:"number"},mode:{type:"enum",values:["off","position","dipped","main","fog","auto"]}}}}},p={type:"string",doc:"See SightingEvent.description — a plain string, or one per language.",loose:!0},y={type:"string",doc:"See SightingEvent.image — the picture a shared link to this recording shows."},m={type:"string",doc:"See SightingEvent.summary — what a shared link to this recording says of it.",loose:!0},g={type:"number",doc:"See SightingEvent.summaryTime — the second the picture of this recording's card is taken at."},b={type:"array",doc:"See SightingEvent.tags."},f={type:"object",fields:{keyframes:{type:"array",fields:{t:{type:"number"},shapes:{type:"array",fields:{sourceId:{type:"string"},shape:{type:"object",fields:{kind:{type:"enum",values:["oval","polygon"]},bounds:{type:"object",fields:{x:{type:"number"},y:{type:"number"},width:{type:"number"},height:{type:"number"}}},color:{type:"string",doc:"CSS color"},angle:{type:"number",doc:"Rotation in radians about the shape's centre, positive = clockwise on screen; 0 = no rotation"},transparency:{type:"number",doc:"0 = opaque, 1 = fully transparent"},haloScale:{type:"number",doc:"0 = no halo/glow, >1 = larger glow radius"},blur:{type:"number",doc:"How indistinct the observer said its edges were — 0 for a hard outline, 1 for a shape with no edge at all."},brightness:{type:"number",doc:"How dazzling the observer said it was — 0 for a light you can look at, 1 for one you cannot."},selected:{type:"boolean"},title:{type:"string",doc:"What the observer calls it, if anything.",loose:!0},angular:{type:"object",doc:"How big this looked to the observer, in degrees of arc (see AngularExtent) — the recording's OWN statement of size, and the one it is allowed to make.",fields:{widthDeg:{type:"number",doc:"How wide it looked, in degrees of arc."},heightDeg:{type:"number",doc:"How tall it looked, in degrees of arc."}}},aim:{type:"object",doc:"Where the phenomenon itself was in the observer's sky (the direction of the shape's centre, not the way the observer was facing) — degrees of azimuth from true north and of altitude above the horizon, the same conventions as ObserverPose.",fields:{azimuthDeg:{type:"number",doc:"Degrees clockwise from true north, the same convention as ObserverPose.headingDeg."},altitudeDeg:{type:"number",doc:"Degrees above (positive) or below the horizon."}}},points:{type:"array",doc:"Points relative to bounds origin (0,0 = bounds.x, bounds.y)",fields:{x:{type:"number"},y:{type:"number"}}}}}}}}},order:{type:"array",doc:"Back-to-front paint/hit-test order — see Timeline's own `order` field."},groups:{type:"array",doc:"Each inner array is one group's member sourceIds (always >= 2 members) — see Timeline's own `groups` field."},span:{type:"number",doc:"The length of the observation the keyframes were placed against, in ms, when it is longer than the last keyframe — a shape placed at 0 s then moved at 5 s of a 10 s observation has keyframes at 0 and 5000 only, and without this the recording would end (and be stretched over the whole observation) at 5 s."}}},w={type:"object",doc:"The observer's position/elevation/orientation over time — absent for older recordings, which fall back to the legacy static place[0] (see Sighting.ts's resolveObserverPoseAt).",fields:{keyframes:{type:"array",fields:{t:{type:"number"},pose:{type:"object",fields:{lat:{type:"number",doc:"Decimal degrees."},lng:{type:"number"},elevationM:{type:"number",doc:"Metres above the local ground under the observer, not above sea level: 0 for someone standing on it, the height of a window or a cliff top otherwise."},headingDeg:{type:"number",doc:"Degrees clockwise from true north."},pitchDeg:{type:"number",doc:"Degrees above (positive) or below (negative) the local horizontal — how far up/down the observer was looking, e.g."},rollDeg:{type:"number",doc:"How far the instrument itself was tilted about its own line of sight, degrees, positive clockwise as the observer saw it — a camera held askew, a head leaned over."},fovDeg:{type:"number",doc:"Vertical field of view in degrees, as a Three.js PerspectiveCamera would take it."},fNumber:{type:"number",doc:"How far the lens was stopped down — undefined for anything the recording did not state, which then falls back to the instrument's own setting (see Instrument.fNumber)."},focusDistanceM:{type:"number",doc:"How far away the lens was focused, metres — undefined meaning at infinity, which is where a camera pointed at the sky sits and the only setting under which everything celestial comes out sharp."},filter:{type:"string",doc:"What was held in front of the instrument — a FILTERS id, a solar filter for an eclipse."}}}}}}},v={type:"object",doc:"Weather over time — absent for older recordings, which fall back to the legacy static `weather` field below (see Sighting.ts's resolveWeatherAt).",fields:{keyframes:{type:"array",fields:{t:{type:"number"},weather:{type:"object",fields:{cloudLayers:{type:"array",doc:"Explicit layers override the historical cloud fields; [] means no clouds.",fields:{id:{type:"string",doc:"Stable across keyframes: reordering layers must not regenerate their cloud pattern."},instances:{type:"array",doc:"Optional explicit masses, independent of the generated coverage percentage.",fields:{id:{type:"string"},eastM:{type:"number",doc:"Position relative to the recording's initial observer, in metres east/north."},northM:{type:"number"},baseM:{type:"number"},thicknessM:{type:"number"},widthM:{type:"number"},depthM:{type:"number"},rotationDeg:{type:"number"},density:{type:"number"},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark); absent inherits the parent layer."},seed:{type:"number"}}},type:{type:"enum",values:["cumulus","stratus","stratocumulus","cirrus","unknown"]},baseM:{type:"number",doc:"Base in metres above the recording's reference ground, not above the moving observer."},thicknessM:{type:"number",doc:"Vertical extent in metres."},coverage:{type:"number",doc:"Horizontal coverage, 0–1."},sizeM:{type:"number",doc:"Characteristic horizontal cloud size in metres."},density:{type:"number",doc:"Relative optical density, 0–2; zero is transparent."},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark)."},iceCrystalAlignment:{type:"number",doc:"Degree of preferential crystal orientation, meaningful only for cirrus."},seed:{type:"number",doc:"Reproducible variation; defaults to a hash of the stable layer id."},windDirectionDeg:{type:"number",doc:"Optional wind overrides; bearing TOWARD which the cloud travels, clockwise from north."},windSpeed:{type:"number"}}},cloudCover:{type:"number",doc:"0 = clear sky, 1 = fully overcast."},cloudDarkness:{type:"number",doc:"0 = light/clear clouds, 1 = dark/stormy character."},cloudBaseM:{type:"number",doc:"Height of the cloud layer's BASE above the ground, in meters — 600 to 2000 m covers most real low cloud."},highCloudCover:{type:"number",doc:"How much of the sky the HIGH deck covered, 0 to 1 — cirrus and cirrostratus, above about six kilometres, where anything present is ice rather than water."},lowerCloudCover:{type:"number",doc:"How much of the sky the LOW and MIDDLE decks covered, 0 to 1 — the cloud that stands between a observer and anything higher up."},iceCrystalAlignment:{type:"number",doc:"How steadily the ice crystals were falling, 0 to 1 — the one thing about the sky that decides which halo forms stood, and the one thing no record of any sighting holds."},rareIceCrystals:{type:"number",doc:"The share of a cirrus deck's crystals that are the rare kinds, 0 to 1: columns capped with pyramids, which draw the odd-radius rings (9, 20, 35 degrees), and plates free to turn about a level axis, which draw Lowitz's arcs sloping from the sundogs."},relativeHumidity:{type:"number",doc:"Relative humidity near the ground, 0 to 1."},precipitationType:{type:"enum",values:["none","rain","snow","hail"]},precipitationIntensity:{type:"number",doc:'0-1; meaningless while precipitationType is "none".'},precipitationAmount:{type:"number",doc:"How much of that precipitation is actually falling yet, 0 to 1 — absent meaning all of it."},windDirectionDeg:{type:"number",doc:"Degrees clockwise from true north — same convention as ObserverPose.headingDeg, and the direction the wind blows *toward*, not the one it comes from: SceneRenderer drifts every precipitation particle and cloud field along exactly this bearing (`sin/-cos`, north = -Z), so 0 means snow drifting northward."},windSpeed:{type:"number",doc:"Real-world wind speed in m/s (0 = calm, ~30 = violent storm/hurricane-force) — drives both cloud advection, visual precipitation drift and wind audio volume directly."},storm:{type:"boolean",doc:"Whether a thunderstorm was reported — drives both a scene-fog lightning flash and a delayed thunderclap (see SceneRenderer's lightning-flash scheduling, named for the visual mechanism it implements internally, not for this field)."}}}}}}},k={type:"object",doc:`Legacy static weather condition, kept only as weatherTrack's own fallback for recordings made before it existed — absent means "unknown/not recorded", not "clear skies" (renderers default to DEFAULT_WEATHER, see Weather.ts).`,fields:{cloudLayers:{type:"array",doc:"Explicit layers override the historical cloud fields; [] means no clouds.",fields:{id:{type:"string",doc:"Stable across keyframes: reordering layers must not regenerate their cloud pattern."},instances:{type:"array",doc:"Optional explicit masses, independent of the generated coverage percentage.",fields:{id:{type:"string"},eastM:{type:"number",doc:"Position relative to the recording's initial observer, in metres east/north."},northM:{type:"number"},baseM:{type:"number"},thicknessM:{type:"number"},widthM:{type:"number"},depthM:{type:"number"},rotationDeg:{type:"number"},density:{type:"number"},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark); absent inherits the parent layer."},seed:{type:"number"}}},type:{type:"enum",values:["cumulus","stratus","stratocumulus","cirrus","unknown"]},baseM:{type:"number",doc:"Base in metres above the recording's reference ground, not above the moving observer."},thicknessM:{type:"number",doc:"Vertical extent in metres."},coverage:{type:"number",doc:"Horizontal coverage, 0–1."},sizeM:{type:"number",doc:"Characteristic horizontal cloud size in metres."},density:{type:"number",doc:"Relative optical density, 0–2; zero is transparent."},darkness:{type:"number",doc:"Visual shading, 0 (white) to 1 (very dark)."},iceCrystalAlignment:{type:"number",doc:"Degree of preferential crystal orientation, meaningful only for cirrus."},seed:{type:"number",doc:"Reproducible variation; defaults to a hash of the stable layer id."},windDirectionDeg:{type:"number",doc:"Optional wind overrides; bearing TOWARD which the cloud travels, clockwise from north."},windSpeed:{type:"number"}}},cloudCover:{type:"number",doc:"0 = clear sky, 1 = fully overcast."},cloudDarkness:{type:"number",doc:"0 = light/clear clouds, 1 = dark/stormy character."},cloudBaseM:{type:"number",doc:"Height of the cloud layer's BASE above the ground, in meters — 600 to 2000 m covers most real low cloud."},highCloudCover:{type:"number",doc:"How much of the sky the HIGH deck covered, 0 to 1 — cirrus and cirrostratus, above about six kilometres, where anything present is ice rather than water."},lowerCloudCover:{type:"number",doc:"How much of the sky the LOW and MIDDLE decks covered, 0 to 1 — the cloud that stands between a observer and anything higher up."},iceCrystalAlignment:{type:"number",doc:"How steadily the ice crystals were falling, 0 to 1 — the one thing about the sky that decides which halo forms stood, and the one thing no record of any sighting holds."},rareIceCrystals:{type:"number",doc:"The share of a cirrus deck's crystals that are the rare kinds, 0 to 1: columns capped with pyramids, which draw the odd-radius rings (9, 20, 35 degrees), and plates free to turn about a level axis, which draw Lowitz's arcs sloping from the sundogs."},relativeHumidity:{type:"number",doc:"Relative humidity near the ground, 0 to 1."},precipitationType:{type:"enum",values:["none","rain","snow","hail"]},precipitationIntensity:{type:"number",doc:'0-1; meaningless while precipitationType is "none".'},precipitationAmount:{type:"number",doc:"How much of that precipitation is actually falling yet, 0 to 1 — absent meaning all of it."},windDirectionDeg:{type:"number",doc:"Degrees clockwise from true north — same convention as ObserverPose.headingDeg, and the direction the wind blows *toward*, not the one it comes from: SceneRenderer drifts every precipitation particle and cloud field along exactly this bearing (`sin/-cos`, north = -Z), so 0 means snow drifting northward."},windSpeed:{type:"number",doc:"Real-world wind speed in m/s (0 = calm, ~30 = violent storm/hurricane-force) — drives both cloud advection, visual precipitation drift and wind audio volume directly."},storm:{type:"boolean",doc:"Whether a thunderstorm was reported — drives both a scene-fog lightning flash and a delayed thunderclap (see SceneRenderer's lightning-flash scheduling, named for the visual mechanism it implements internally, not for this field)."}}},S={type:"object",doc:"What the sighting sounded like over time — see SoundTrack.",fields:{keyframes:{type:"array",fields:{t:{type:"number"},sound:{type:"object",fields:{kind:{type:"enum",values:["none","hum","whistle","rumble","crackle"]},volume:{type:"number",doc:"How loud it was, 0 (inaudible) to 1 (as loud as the observer could describe) — deliberately relative rather than a dB SPL figure: nobody reports a sound level in decibels, and inventing one would claim a measurement where there is only an impression."},pitchHz:{type:"number",doc:`The sound's own frequency in Hz — the oscillator's pitch for the pitched kinds ("hum", "whistle"), and the noise filter's centre for the unpitched ones ("rumble", "crackle"), where it reads as how deep or how sharp the noise is.`},src:{type:"string",doc:"An actual audio recording of the sound, when one exists (a observer who filmed the event, a later recording of the same phenomenon) — replaces synthesis entirely while it is set, with `volume` still scaling it."}}}}}}},T=JSON.parse(`{"type":"array","doc":"See Sighting.decor.","fields":{"id":{"type":"string"},"kind":{"type":"enum","values":["terrace","wall","building","tree","crop","mound","streetlight","vehicle","observer","aircraft","shrub","bridge","wire","entity"]},"title":{"type":"string","doc":"Optional display name, same role as Shape.title — falls back to a generic \\"{kind} {n}\\" label (see SightingEditorElement.decorLabel) when absent.","loose":true},"eastM":{"type":"number","doc":"Meters from the observer's own position — eastM positive = east, northM positive = north."},"northM":{"type":"number"},"headingDeg":{"type":"number","doc":"Degrees clockwise from true north, same convention as ObserverPose.headingDeg — which way a vehicle is facing, or a observer looking."},"lit":{"type":"boolean","doc":"Streetlight lamp / vehicle headlights switched on."},"litKeyframes":{"type":"array","doc":"Sorted by t.","fields":{"t":{"type":"number"},"lit":{"type":"boolean"}}},"headlights":{"type":"enum","doc":"For a vehicle: how its lights are set (see HeadlightMode).","values":["off","position","dipped","main","fog"]},"headlightKeyframes":{"type":"array","doc":"Sorted by t.","fields":{"t":{"type":"number"},"mode":{"type":"enum","values":["off","position","dipped","main","fog"]}}},"lights":{"type":"array","doc":"The object's individual lamps, each with its own place on the body and its own rhythm — see DecorLight, and LIGHT_RIGS for the ready-made sets.","fields":{"id":{"type":"string"},"offsetM":{"type":"object","doc":"Where it sits on the object, in meters relative to the object's own centre and heading: +x is its right, +y up, +z its front.","fields":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"}}},"color":{"type":"string","doc":"CSS hex colour, as emitted — the regulated red/green/white of navigation lights, the amber of a hazard flasher."},"intensity":{"type":"number","doc":"Peak luminous intensity as a ratio to an ordinary navigation light's (1, about a hundred candela — see DecorSystem's LAMP_CANDELA); the airliner rig (LIGHT_RIGS) gives its beacon 1.5 and its wingtip strobes 20."},"pattern":{"type":"object","fields":{"kind":{"type":"enum","values":["steady","flash"]},"perMinute":{"type":"number"},"dutyCycle":{"type":"number"},"phase":{"type":"number"}}}}},"track":{"type":"array","doc":"Where the object is over time, when it moves — an aircraft crossing the sky, a car driving past.","fields":{"t":{"type":"number"},"eastM":{"type":"number"},"northM":{"type":"number"},"altitudeM":{"type":"number","doc":"Meters above the observer's own elevation."},"headingDeg":{"type":"number"},"gazeAzimuthDeg":{"type":"number","doc":"Where a figure looks, as a compass azimuth: its head turns to face it, as far as a neck turns (85 degrees either side of where its body points), if its model has a node named \\"head\\" (scripts/people/split_head.py)."}}},"sightingUrl":{"type":"string","doc":"For kind \\"observer\\" only: the URL of that observer's own sighting.json recording, if known — lets the 3D scene's own context menu offer \\"view this observer's account\\" (loading it the same way SightingEditorElement.importFromUrl already does)."},"windows":{"type":"object","doc":"Per-side window opacity, 0 (fully open — the pane is invisible, and DecorSystem.addRoom's own interior wall panel is skipped there too, same as no window at all) to 100 (fully closed — a solid-looking pane)."},"color":{"type":"string","doc":"What colour this object actually is, as a CSS colour — the same way a shape states its own (see Shape.color), because a recording is written and read by people and \\"#8f86a8\\" is a colour a person can type."},"observerSide":{"type":"enum","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]},"observerFacing":{"type":"enum","doc":"Which window the observer looks through, when it is not the one at their own seat: a driver sits at \\"front-left\\" and looks through the windshield (\\"front\\").","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]},"observerKeyframes":{"type":"array","doc":"Where the observer sits over time, when they do not stay where they are: a driver is in the car until the moment they get out of it.","fields":{"t":{"type":"number"},"side":{"type":"enum","doc":"The seat they are in from this instant; absent means they are outside the object.","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]},"facing":{"type":"enum","doc":"The window they look through from this instant, when it is not the one at their seat.","values":["front","behind","left","right","front-left","front-right","behind-left","behind-right"]}}},"engine":{"type":"object","doc":"A vehicle heard running — see DecorEngine: its engine turning with its own \`track\`, heard less the further it is from the observer.","fields":{"kind":{"type":"enum","doc":"Which sound: a decor object's own \`kind\` says only \\"vehicle\\".","values":["car","van","truck","motorcycle","generic"]},"noise":{"type":"number","doc":"As ObserverVehicle.noise."}}},"aircraftSound":{"type":"enum","doc":"An aircraft heard while it flies — what sort of noise it makes (see AircraftHearing.noiseOfKind), or \\"silent\\" for one that makes none (a glider's cousin, a stand-in for something nobody heard).","values":["unknown","airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet","light-piston","turboprop-light","helicopter-light","helicopter-medium","helicopter-heavy","military-jet","glider","balloon","ultralight","unmanned","silent"]},"surveyedOn":{"type":"string","doc":"The day (YYYY-MM-DD) of the survey this object was taken from, where it comes from one (see \`origin\`): the latest of the days of everything it was drawn from (the laser flight, the aerial photograph, the map's edition)."},"facade":{"type":"object","doc":"Kind \\"building\\" only: the colour of its walls, and the windows and door drawn on them.","fields":{"color":{"type":"string","doc":"The colour of the wall, \\"#rrggbb\\": plaster, stone, brick."},"plain":{"type":"boolean","doc":"A plain wall, with no windows and no door."}}},"roof":{"type":"object","doc":"Kind \\"building\\" only: the shape and colour of its roof.","fields":{"shape":{"type":"enum","doc":"\\"flat\\" is the box; \\"gable\\" rises to a ridge along the building's longer side; \\"hip\\" slopes down on all four.","values":["flat","gable","hip"]},"ridge":{"type":"enum","doc":"Which side of the building a gable's ridge runs along: \\"width\\" (the longer side, the default) or \\"depth\\".","values":["width","depth"]},"riseM":{"type":"number","doc":"How far the ridge stands above the eaves, metres."},"color":{"type":"string","doc":"The colour of the roof seen from above, \\"#rrggbb\\", where it was measured (see RoofShapes): the walls keep their own."}}},"bridge":{"type":"object","doc":"Kind \\"bridge\\" only: how it is built, where that is known — see BridgeStructure.","fields":{"spanM":{"type":"number","doc":"Metres of open span under the deck, centred on the object."},"deckThicknessM":{"type":"number","doc":"Thickness of the deck slab, metres."},"railing":{"type":"object","doc":"The railing along both edges: its height above the road, the spacing of its posts, and how many horizontal rails it has — two rails make two rows of rectangular openings.","fields":{"heightM":{"type":"number"},"postSpacingM":{"type":"number"},"rails":{"type":"number"}}}}},"wire":{"type":"object","doc":"Kind \\"wire\\" only: how many strands, where they hang, and which ends stand on a pole — see WireStructure.","fields":{"strands":{"type":"array","doc":"The strands: each one's height above the ground and, for a crossarm, how far it hangs to one side of the line (positive to the right of its heading).","fields":{"heightM":{"type":"number"},"acrossM":{"type":"number"}}},"poles":{"type":"enum","doc":"Which ends stand on a pole: both (default), the one the object's heading points away from (\`start\`) or towards (\`end\`), or none, for a line anchored on buildings at both ends.","values":["none","both","start","end"]},"diameterM":{"type":"number","doc":"How thick a strand is, metres."},"poleHeightM":{"type":"number","doc":"How tall a pole is, metres."}}},"floors":{"type":"number","doc":"Kind \\"building\\" only: number of upper stories above the ground floor, set when the building is created (default 2, see SightingEditorElement.addDecor) and editable afterward."},"occupiedFloor":{"type":"number","doc":"Kind \\"building\\" only, meaningful once observerSide is set: which floor the observer is on, 0 (ground floor) up to floors."},"occludesSourceIds":{"type":"array","doc":"Shape sourceIds (see Timeline.sourceIds/Shape) this decor object sits in front of, from the observer's own reported viewpoint — occluding that shape wherever their screen positions line up (see SceneRenderer.isScreenPointOccluded)."},"sizeM":{"type":"object","doc":"How big it really is, in meters, along its own axes — see DecorSize.","fields":{"widthM":{"type":"number"},"lengthM":{"type":"number"},"heightM":{"type":"number"}}},"modelParameters":{"type":"object","doc":"The settings of the model this object is drawn as, by the key the model publishes them under (see ModelParameters.parameters): a being's costume colour, say."},"model":{"type":"object","doc":"The real 3D model that stands in for the primitive, if one does — see DecorModelRef.","fields":{"id":{"type":"string","doc":"Catalogue entry, resolved by the live DecorModelProvider."},"url":{"type":"string","doc":"Direct glTF/GLB address, taking precedence over \`id\`."},"headingOffsetDeg":{"type":"number","doc":"Degrees to turn the loaded model about its own vertical axis so its nose points the way this scene's heading convention expects (0 faces -Z — see DecorSystem's build)."},"credit":{"type":"object","doc":"Who made it and under what licence.","fields":{"title":{"type":"string"},"author":{"type":"string"},"license":{"type":"string","doc":"Licence name as its author states it, e.g."},"sourceUrl":{"type":"string","doc":"Where it came from, so the claim can be checked."}}}}},"origin":{"type":"string","doc":"The survey this object was taken from, by the id of its provider (\\"ign-lidar-hd\\"), when the author did not place it by hand: the trees the editor plants from a canopy survey (see CanopyProvider)."}}}`),M={type:"array",doc:"The roads the account's own plan draws — see Sighting.roads and Road.ts.",fields:{id:{type:"string"},title:{type:"string",doc:"What the account calls it, where it calls it anything.",loose:!0},surface:{type:"enum",values:["paved","gravel","dirt"]},widthM:{type:"number",doc:"Carriageway width, metres."},path:{type:"array",doc:"The centre line, in metres east and north of the observer's place at t=0.",fields:{eastM:{type:"number"},northM:{type:"number"}}},source:{type:"string",doc:"Where this line comes from — the plan, the survey, the report it was read off.",loose:!0}}},D={type:"array",doc:"What an investigator drew over the place, imported from their file — see Sighting.traces and Trace.ts.",fields:{id:{type:"string"},title:{type:"string",doc:'What its author called it ("Ligne de visée depuis la ferme").',loose:!0},kind:{type:"enum",values:["polygon","point","line"]},points:{type:"array",doc:"One point for a marker, the vertices of a line, the vertices of an outline (not repeated at the end: it is closed by being a polygon).",fields:{lat:{type:"number"},lng:{type:"number"},altM:{type:"number",doc:"Metres, read as `InvestigatorTrace.altitude` says."}}},altitude:{type:"enum",doc:"How `altM` is read.",values:["ground","relative","absolute"]},color:{type:"string",doc:"CSS colour the author gave it, `#rrggbb`."},source:{type:"string",doc:"Whose it is and where it comes from — the person, the report, the file.",loose:!0}}},j={type:"object",doc:"Which meteorological record `weatherTrack` was looked up from, when it wasn't the observer who stated the conditions — see Sighting.weatherSource.",fields:{id:{type:"string",doc:"Stable dataset id, e.g."},name:{type:"string",doc:"Human-readable dataset name, e.g."},url:{type:"string",doc:"The exact request that produced these values, so the claim stays checkable years later."}}},W={type:"string",doc:"Which INSTRUMENTS entry this was observed through — see Sighting.instrumentId."},H={type:"number",doc:"How long the shutter stayed open, seconds — one value for the whole observation, see Sighting.exposureSeconds."},x={type:"number",doc:"The speed of the film or sensor this picture was taken on — see Sighting.iso."},E={type:"number",doc:`How bright the night sky is at the place, towns and all: the zenith of a moonless night in magnitudes per square arcsecond, a Sky Quality Meter's reading or the World Atlas's "SQM" figure (Falchi et al.`},R={type:"boolean",doc:"Whether the map of where the observer stood starts open — see Sighting.observerMap."},I={type:"array",doc:"The named moments of the account — see Milestone.",fields:{t:{type:"number",doc:"When, in milliseconds from the start of the recording — the same scale every track uses."},label:{type:"string",doc:'Short label, shown on the seek bar: the letter or number the account itself uses ("A", "B"), or a couple of words where it uses none.',loose:!0},note:{type:"string",doc:"What happened at that moment, in the account's own words where possible.",loose:!0}}},z={type:"array",doc:"Pictures of the place, laid over the reconstruction at the direction each was registered in — see SceneReference.",fields:{id:{type:"string",doc:"Stable id, what the editor's own list and a future trace on the picture name."},kind:{type:"enum",values:["photo","panorama"]},src:{type:"string",doc:"Where the picture is: an address, or the picture itself as a `data:` URL."},title:{type:"string",doc:'What to call it — "Vue depuis le muret, fin été 1968".',loose:!0},credit:{type:"string",doc:"Who made it and on what terms — shown wherever the picture is, because a credit that is not displayed is not a licence (see DataSource for the same rule on the data)."},creditUrl:{type:"string",doc:"Where that credit points: the source page, the licence."},t:{type:"number",doc:"The instant of the timeline it was taken at, milliseconds, for a picture made DURING the observation — by the observer, or by whoever was there."},from:{type:"object",doc:"Where it was taken from — the one point its registration holds for.",fields:{lat:{type:"number"},lng:{type:"number"}}},drawing:{type:"boolean",doc:"Whether somebody drew on it — a trajectory, an outline, an arrow — so that what the picture shows of the phenomenon is a statement made afterwards, not a thing the camera recorded."},opacity:{type:"number",doc:"How much of it shows, 0 to 1 — the starting point of the reader's own slider, since the comparison is made by sliding: all picture, all render, and the registration checked at every step between."},registration:{type:"object",fields:{headingDeg:{type:"number",doc:"Degrees clockwise from true north, the direction the picture's centre looks at."},pitchDeg:{type:"number",doc:"Degrees above the local horizontal, positive up."},rollDeg:{type:"number",doc:"Degrees the picture is tilted about its own axis, positive clockwise as it is looked at — see ObserverPose.rollDeg."},fovDeg:{type:"number",doc:"The picture's VERTICAL field, degrees — what the lens took in top to bottom, its horizontal field following from the image's own aspect ratio."}}},landmarks:{type:"array",doc:"The details it was lined up on — see PictureLandmark.",fields:{id:{type:"string"},label:{type:"string",doc:'What the detail is — "Arbre masquant", "barrière".',loose:!0},picture:{type:"object",doc:"Where it is on the picture, 0..1 from the top-left corner.",fields:{u:{type:"number"},v:{type:"number"}}},scene:{type:"object",doc:"Where it is from the observer, in the scene.",fields:{azimuthDeg:{type:"number"},altitudeDeg:{type:"number"}}}}}}},C={type:"array",doc:"Where the account can be read as it was given, each one a source — see RecordingSource.",fields:{type:{type:"enum",values:["book","article"]},title:{type:"string"},authors:{type:"array",doc:"The author(s) name(s): for a post, the account that posted it."},url:{type:"string",doc:"Where it can be read."},publication:{type:"object",doc:"Who published it and when (EDTF).",fields:{publisher:{type:"string"},time:{type:"string"}}},index:{type:"string",doc:"Chapter, page, etc."}}},A={type:"object",doc:"What the observer took it to be, in metres — see InterpretationJson.",fields:{title:{type:"string",doc:'What the claim is, in a few words — "Craft on its legs", "Weather balloon at 3 km".',loose:!0},bodies:{type:"array",fields:{id:{type:"string"},title:{type:"string",loose:!0},explains:{type:"array",doc:"The phenomena of the account (their `sourceId`s) this body claims to be — what its projected outline is measured against at each instant, and what is drawn as a ghost beside it."},model:{type:"object",doc:"What it is shaped like.",fields:{id:{type:"string",doc:"Catalogue entry, resolved by the live DecorModelProvider."},url:{type:"string",doc:"Direct glTF/GLB address, taking precedence over `id`."},headingOffsetDeg:{type:"number",doc:"Degrees to turn the loaded model about its own vertical axis so its nose points the way this scene's heading convention expects (0 faces -Z — see DecorSystem's build)."},credit:{type:"object",doc:"Who made it and under what licence.",fields:{title:{type:"string"},author:{type:"string"},license:{type:"string",doc:"Licence name as its author states it, e.g."},sourceUrl:{type:"string",doc:"Where it came from, so the claim can be checked."}}}}},withObserver:{type:"boolean",doc:"Whether the observer carries it: its keyframes, stated FROM THE OBSERVER, are offsets from their eye that go with the eye, instead of points of the world fixed where the eye was at each keyframe's instant."},outlineNode:{type:"string",doc:'The node of the model that IS what the observer drew — "hull" for a craft on legs the observer drew as an oval — and so what its outline is measured by (see BodyConfrontation).'},track:{type:"array",fields:{t:{type:"number"},eastM:{type:"number"},northM:{type:"number"},azimuthDeg:{type:"number"},altitudeDeg:{type:"number"},distanceM:{type:"number"},onGround:{type:"boolean",doc:"Standing on the ground."},present:{type:"boolean",doc:"Gone from here on — `false` — or back — `true`."},altitudeAboveGroundM:{type:"number",doc:"Metres between the ground under it and its lowest point."},altitudeM:{type:"number",doc:"Metres between its lowest point and the ground at the recording's own origin (where the observer stands at the start) — a height in the air that does NOT follow what is under the body."},sizeM:{type:"object",fields:{widthM:{type:"number"},lengthM:{type:"number"},heightM:{type:"number"}}},attitude:{type:"object",fields:{headingDeg:{type:"number"},pitchDeg:{type:"number"},rollDeg:{type:"number"}}},appearance:{type:"object",fields:{color:{type:"string",doc:"Its surface colour, CSS."},albedo:{type:"number",doc:"How much of the light falling on it it sends back, 0-1: aluminium ~0.7, a matt dark hull ~0.1."},luminanceCdM2:{type:"number",doc:"What it gives out of itself, candela per square metre — read through the scene's own photometry exactly as a flame's is (see BodyFlame), so that the same figure is a lamp at night and nothing at all against a noon sky."},transparency:{type:"number",doc:"How much of what is behind it shows through, 0 (opaque, the default) to 1 (gone): the same statement a drawn shape's transparency makes, for a body of the scene."},haloScale:{type:"number",doc:"How far the glare it throws round itself reaches, as a multiple of what its light gives (1, the default): 0 puts the glare out, 2 doubles its width."}}},flame:{type:"object",doc:"A flame coming out of it, from here on — see BodyFlame.",fields:{node:{type:"string"},lengthM:{type:"number",doc:"How far it reaches from the node, metres."},widthM:{type:"number",doc:"How wide it is at its widest, metres."},color:{type:"string",doc:"Its colour where it leaves the node, CSS."},tipColor:{type:"string",doc:"Its colour at its far end; the same as `color` when absent."},luminanceCdM2:{type:"number"},raisesDust:{type:"boolean",doc:"Whether it raises dust where it meets the ground — a flame reaching loose, dry soil does, the more the nearer it gets."}}},motions:{type:"object",doc:"How far along each of its model's own movements it is, by the movement's name in the model (a glTF animation): 0 at its start, 1 at its end, and on past 1 for one that repeats — a turn made three times is 3."},lights:{type:"object",doc:"The luminance of each of its model's own lights, cd/m², by the name of the light's material in the model: what lets one body carry lights that behave each their own way — a steady white at each end, a red one flashing between."}}}}},smoke:{type:"array",doc:"Fires the interpretation lights on the ground, as their smoke — see SmokeSource.",fields:{eastM:{type:"number"},northM:{type:"number"},fromT:{type:"number"},untilT:{type:"number"},halfLifeS:{type:"number",doc:"How fast it dies down, seconds to half its thickness — brush flares and smoulders."}}},reentries:{type:"array",doc:"Re-entries it claims were seen: placed on the Earth, not round the observer — see ReentryJson.",fields:{id:{type:"string"},title:{type:"string",loose:!0},explains:{type:"array",doc:"The phenomena of the account (their `sourceId`s) this re-entry claims to be — see BodyJson.explains."},object:{type:"object",doc:"The object that came down, when it is known — the catalogue says which piece it was.",fields:{name:{type:"string",doc:'Its catalogue name — "SL-12 R/B".'},cosparId:{type:"string",doc:'International designator — "1968-013C".'},norad:{type:"number",doc:"US Space Surveillance Network catalogue number — 3136."}}},track:{type:"array",doc:"Where the leading point of the break-up was, at instants of the recording.",fields:{t:{type:"number"},lat:{type:"number"},lng:{type:"number"},altitudeKm:{type:"number",doc:"Height above the ellipsoid, km."}}},fragments:{type:"array",doc:"The pieces seen, each following the same path some seconds behind the leading point.",fields:{id:{type:"string"},lagS:{type:"number",doc:"Seconds behind the leading point, along the same path."},fromT:{type:"number",doc:"When it is first seen, ms of the recording — when it broke off, or when it began to glow."},untilT:{type:"number",doc:"When it goes out, ms — burned up, or slowed below glowing."},absoluteMagnitude:{type:"number",doc:"Its brightness as a magnitude at 100 km — the meteor astronomers' absolute magnitude, which a fireball report gives — from which the brightness at the observer's actual distance follows."},color:{type:"string",doc:"Its colour, as a CSS hex colour."},trainS:{type:"number",doc:"How long a stretch of its own past path still glows behind it, seconds: the tail observers describe."}}}}},launches:{type:"array",doc:"Rocket launches whose exhaust it claims was seen, lit by a Sun the ground no longer sees — see LaunchJson.",fields:{id:{type:"string"},title:{type:"string",loose:!0},explains:{type:"array",doc:"The phenomena of the account (their `sourceId`s) this launch claims to be — see BodyJson.explains."},vehicle:{type:"object",doc:"What flew, as its operator names it.",fields:{name:{type:"string",doc:'"Falcon 9".'},mission:{type:"string",doc:'"Starlink Group 10-49".'},engine:{type:"object",doc:"The engine whose exhaust it is.",fields:{thrustKN:{type:"number",doc:"Thrust in vacuum, kN: a Merlin Vacuum's 934, an RL10's 110, a solid booster's thousands."},specificImpulseS:{type:"number",doc:"Specific impulse in vacuum, seconds: 348 for a Merlin Vacuum, 465 for an RL10, 285 for a solid."},propellant:{type:"enum",values:["rp1-lox","methane-lox","hydrogen-lox","hypergolic","solid"]}}}}},track:{type:"array",doc:"Where the stage stood at instants of the recording, ms.",fields:{t:{type:"number"},lat:{type:"number"},lng:{type:"number"},altitudeKm:{type:"number",doc:"Height above the ellipsoid, km."}}},burnFromT:{type:"number",doc:"When the engine started and stopped, ms of the recording."},burnUntilT:{type:"number"},plume:{type:"object",fields:{exhaustKgPerS:{type:"number",doc:"Mass of exhaust leaving the engine, kg per second."},condensedShare:{type:"number",doc:"The share of that exhaust that ends up as particles that scatter light, 0 to 1."},particleRadiusUm:{type:"number",doc:"Radius of those particles, micrometres."},expansionKmPerS:{type:"number",doc:"How fast a puff's radius grows, km per second, from `initialRadiusKm`."},initialRadiusKm:{type:"number"},lifetimeS:{type:"number",doc:"How long a puff lasts before the particles have gone, seconds."},collarShare:{type:"number",doc:"The share of the particles that is the collar: exhaust just let go, which leaves the nozzle at its exhaust velocity (3.4 km/s for a Merlin Vacuum) and, with almost no air to stop it, spreads into a wide, short-lived shell round the stage, where the rest stays behind as the narrow trail."},collarExpansionKmPerS:{type:"number",doc:"How fast the collar's radius grows, km per second, and how long it lasts, seconds."},collarLifetimeS:{type:"number"}}}}}}},O={version:e,id:t,time:o,endTime:r,durationSeconds:n,durationText:s,utcOffsetHours:i,timeZone:a,place:d,observer:h,account:c,sway:l,vehicle:u,description:p,image:y,summary:m,summaryTime:g,tags:b,timeline:f,observerTrack:w,weatherTrack:v,weather:k,soundTrack:S,decor:T,roads:M,traces:D,weatherSource:j,instrument:W,exposureSeconds:H,iso:x,lightPollution:E,observerMap:R,milestones:I,references:z,sources:C,interpretation:A};export{c as account,T as decor,O as default,p as description,n as durationSeconds,s as durationText,r as endTime,H as exposureSeconds,t as id,y as image,W as instrument,A as interpretation,x as iso,E as lightPollution,I as milestones,h as observer,R as observerMap,w as observerTrack,d as place,z as references,M as roads,S as soundTrack,C as sources,m as summary,g as summaryTime,l as sway,b as tags,o as time,a as timeZone,f as timeline,D as traces,i as utcOffsetHours,u as vehicle,e as version,k as weather,j as weatherSource,v as weatherTrack};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{e as S,O as k,f as R,g as F}from"./rr0-sighting-editor.mjs";class K{constructor(t){if(this.candidates=t,t.length===0)throw new Error("A survey needs at least one candidate");this.current=t[0]}current;get id(){return this.current.id}get name(){return this.current.name}get attribution(){return this.current.attribution}get creditUrl(){return this.current.creditUrl}get contemporary(){return this.current.contemporary}covers(t,e){return this.candidates.some(o=>o.covers(t,e))}async getSurroundings(t,e){let o;for(const n of this.candidates)if(n.covers(t.lat,t.lng))try{const s=await n.getSurroundings(t,e);return this.current=n,s}catch(s){if(o??=s,!(s instanceof S))throw s}throw o??new S("no-coverage","No survey reaches this place")}}class w{constructor(t,e,o,n){this.heights=t,this.building=e,this.width=o,this.height=n}static ROOF_PERCENTILE=.9;static STEP_M=.9;static RECTANGLE_FILL=.72;static MIN_DEPTH_M=2.5;static MAX_PARTS=24;static MAX_CELLS=640;buildings(t){const e=t.metresPerPixel,o=t.minAreaM2??12,n=new Uint8Array(this.width*this.height),s=[];for(let r=0;r<this.building.length;r++){if(!this.building[r]||n[r])continue;const a=this.patchFrom(r,n);if(!(a.length*e*e<o))for(const i of this.buildingsOf(a,e,o))Math.hypot(i.eastM,i.northM)<=t.radiusM&&s.push(i)}return s.sort((r,a)=>Math.hypot(r.eastM,r.northM)-Math.hypot(a.eastM,a.northM)),s.slice(0,t.maxBuildings??60)}patchFrom(t,e){const o=[],n=[t];for(e[t]=1;n.length>0;){const s=n.pop();o.push(s);const r=s%this.width,a=Math.floor(s/this.width);for(const[i,c]of[[1,0],[-1,0],[0,1],[0,-1]]){const l=r+i,h=a+c;if(l<0||h<0||l>=this.width||h>=this.height)continue;const u=h*this.width+l;this.building[u]&&!e[u]&&Math.abs(this.heights[u]-this.heights[s])<=w.STEP_M&&(e[u]=1,n.push(u))}}return o}buildingsOf(t,e,o){const n=this.width/2,s=this.height/2,r=[],a=[],i=[];for(const c of t){const l=c%this.width,h=Math.floor(c/this.width);r.push((l+.5-n)*e),a.push((s-h-.5)*e),i.push(this.heights[c])}return w.ofPoints(r,a,i,e,o)}static ofPoints(t,e,o,n,s,r=w.RECTANGLE_FILL,a=[]){const i=[];for(let m=0;m<t.length;m++)for(const[E,P]of[[-.5,-.5],[.5,-.5],[-.5,.5],[.5,.5]])i.push([t[m]+E*n,e[m]+P*n]);const c=w.hull(i),{angle:l,rectangle:h}=w.smallestRectangle(c),u=t.length*n*n,M=(h.maxU-h.minU)*(h.maxV-h.minV);if(u/M>=r||u<4*s)return[w.building(h,l,w.roof(o))];const f=c.map((m,E)=>({from:{east:m[0],north:m[1]},to:{east:c[(E+1)%c.length][0],north:c[(E+1)%c.length][1]}})),d=w.dominantAngles([...a,...f]);return w.parts(t,e,o,d.length>0?d:[l],n,s)}static dominantAngles(t,e=3){const o=new Map;for(const n of t){const s=Math.hypot(n.to.east-n.from.east,n.to.north-n.from.north);if(s<1e-6)continue;const r=(Math.atan2(n.to.north-n.from.north,n.to.east-n.from.east)%(Math.PI/2)+Math.PI/2)%(Math.PI/2),a=Math.round(r/(Math.PI/60));o.set(a,(o.get(a)??0)+s)}return[...o.entries()].sort((n,s)=>s[1]-n[1]).slice(0,e).map(([n])=>n*Math.PI/60)}static parts(t,e,o,n,s,r){let a=t.map((c,l)=>l);const i=[];for(let c=0;c<w.MAX_PARTS&&a.length>0;c++){let l;for(const M of n){const f=w.largestIn(t,e,a,M,s);f&&(l===void 0||f.area>l.area)&&(l=f)}if(l===void 0||l.area<r)break;const h=l.covered;Math.min(l.rectangle.maxU-l.rectangle.minU,l.rectangle.maxV-l.rectangle.minV)>=w.MIN_DEPTH_M&&i.push(w.building(l.rectangle,l.angle,w.roof([...h].map(M=>o[M])))),a=a.filter(M=>!h.has(M))}return i}static largestIn(t,e,o,n,s){const r=Math.cos(n),a=Math.sin(n);let i=1/0,c=-1/0,l=1/0,h=-1/0;const u=[],M=[];for(const D of o){const y=t[D]*r+e[D]*a,b=-t[D]*a+e[D]*r;u.push(y),M.push(b),i=Math.min(i,y),c=Math.max(c,y),l=Math.min(l,b),h=Math.max(h,b)}const f=Math.max(s*Math.SQRT2,Math.max(c-i,h-l)/w.MAX_CELLS),d=Math.max(1,Math.ceil((c-i)/f+1e-9)),m=Math.max(1,Math.ceil((h-l)/f+1e-9)),E=new Uint8Array(d*m),P=o.map((D,y)=>{const b=Math.min(d-1,Math.max(0,Math.floor((u[y]-i)/f))),T=Math.min(m-1,Math.max(0,Math.floor((M[y]-l)/f)));return E[T*d+b]=1,T*d+b}),p=w.largestRectangle(E,d,m);if(p===void 0)return;const O=new Set;return o.forEach((D,y)=>{const b=P[y]%d,T=Math.floor(P[y]/d);b>=p.column&&b<p.column+p.columns&&T>=p.row&&T<p.row+p.rows&&O.add(D)}),{area:p.area*f*f,angle:n,covered:O,rectangle:{minU:i+p.column*f,maxU:i+(p.column+p.columns)*f,minV:l+p.row*f,maxV:l+(p.row+p.rows)*f}}}static largestRectangle(t,e,o){const n=new Array(e).fill(0);let s;for(let r=0;r<o;r++){for(let i=0;i<e;i++)n[i]=t[r*e+i]?n[i]+1:0;const a=[];for(let i=0;i<=e;i++){const c=i===e?0:n[i];for(;a.length>0&&n[a[a.length-1]]>=c;){const l=a.pop(),h=a.length===0?i:i-a[a.length-1]-1,u=n[l]*h;(s===void 0||u>s.area)&&(s={column:i-h,row:r-n[l]+1,columns:h,rows:n[l],area:u})}a.push(i)}}return s}static roof(t){const e=[...t].sort((o,n)=>o-n);return Math.max(2,e[Math.min(e.length-1,Math.floor(e.length*w.ROOF_PERCENTILE))])}static building(t,e,o){const n=Math.cos(e),s=Math.sin(e),r=t.maxU-t.minU,a=t.maxV-t.minV,i=(t.minU+t.maxU)/2,c=(t.minV+t.maxV)/2,h=((90-(r<a?e:e+Math.PI/2)*180/Math.PI)%180+180)%180;return{eastM:w.tenth(i*n-c*s),northM:w.tenth(i*s+c*n),widthM:w.tenth(Math.max(r,a)),lengthM:w.tenth(Math.min(r,a)),heightM:w.tenth(o),headingDeg:Math.round(h*10)/10}}static smallestRectangle(t){let e={area:1/0,angle:0,rectangle:{minU:0,maxU:0,minV:0,maxV:0}};for(let o=0;o<Math.max(1,t.length);o++){const[n,s]=t[o]??[0,0],[r,a]=t[(o+1)%t.length]??[1,0],i=Math.atan2(a-s,r-n),c=Math.cos(i),l=Math.sin(i);let h=1/0,u=-1/0,M=1/0,f=-1/0;for(const[m,E]of t){const P=m*c+E*l,p=-m*l+E*c;h=Math.min(h,P),u=Math.max(u,P),M=Math.min(M,p),f=Math.max(f,p)}const d=(u-h)*(f-M);d<e.area&&(e={area:d,angle:i,rectangle:{minU:h,maxU:u,minV:M,maxV:f}})}return e}static hull(t){const e=[...t].sort((a,i)=>a[0]-i[0]||a[1]-i[1]),o=e.filter((a,i)=>i===0||a[0]!==e[i-1][0]||a[1]!==e[i-1][1]);if(o.length<3)return o;const n=(a,i,c)=>(i[0]-a[0])*(c[1]-a[1])-(i[1]-a[1])*(c[0]-a[0]),s=[];for(const a of o){for(;s.length>=2&&n(s[s.length-2],s[s.length-1],a)<=0;)s.pop();s.push(a)}const r=[];for(const a of[...o].reverse()){for(;r.length>=2&&n(r[r.length-2],r[r.length-1],a)<=0;)r.pop();r.push(a)}return[...s.slice(0,-1),...r.slice(0,-1)]}static tenth(t){return Math.round(t*10)/10}}class x{constructor(t,e,o,n){this.heights=t,this.vegetation=e,this.width=o,this.height=n}static SUMMIT_RADIUS_M=2.5;static CROWN_REACH_M=8;static MAX_WIDTH_M=16;static MIN_WIDTH_M=2;static tenth(t){return Math.round(t*10)/10}trees(t){const e=t.metresPerPixel,o=t.minHeightM??4,n=t.eyeM??1.6,s=t.minElevationDeg??2,r=Math.max(1,Math.round(x.SUMMIT_RADIUS_M/e)),a=Math.round(x.CROWN_REACH_M/e),i=this.width/2,c=this.height/2,l=[];for(let h=0;h<this.height;h++)for(let u=0;u<this.width;u++){const M=this.canopy(u,h);if(M<o)continue;const f=(u+.5-i)*e,d=(c-h-.5)*e,m=Math.hypot(f,d);if(m>t.radiusM||!this.isSummit(u,h,M,r))continue;const E=Math.atan2(M-n,Math.max(m,1))*180/Math.PI;E<s||l.push({tree:{eastM:x.tenth(f),northM:x.tenth(d),heightM:x.tenth(M),widthM:x.tenth(this.crownWidth(u,h,M,e,a))},elevation:E})}return l.sort((h,u)=>u.elevation-h.elevation),l.slice(0,t.maxTrees??150).map(h=>h.tree)}canopy(t,e){if(t<0||e<0||t>=this.width||e>=this.height)return 0;const o=e*this.width+t;return this.vegetation[o]?this.heights[o]:0}isSummit(t,e,o,n){for(let s=-n;s<=n;s++)for(let r=-n;r<=n;r++){if(r===0&&s===0)continue;const a=this.canopy(t+r,e+s);if(a>o||a===o&&(s<0||s===0&&r<0))return!1}return!0}crownWidth(t,e,o,n,s){let r=0;for(let i=-s;i<=s;i++)for(let c=-s;c<=s;c++)Math.hypot(c,i)*n<=x.CROWN_REACH_M&&this.canopy(t+c,e+i)>=o*.5&&r++;const a=2*Math.sqrt(r*n*n/Math.PI);return Math.max(x.MIN_WIDTH_M,Math.min(a,x.MAX_WIDTH_M))}}class A{static WALLS={1:"stone",2:"meuliere",3:"concrete",4:"brick",5:"block",6:"wood",9:"other"};static ROOFS={1:"tile",2:"slate",3:"zinc",4:"concrete",9:"other"};static WALL_COLOURS={stone:"#b9ae9b",meuliere:"#b8a78a",concrete:"#b4b2ac",brick:"#a65f48",block:"#d0c6b2",wood:"#7d5c3e",other:"#c9c0ae"};static PLASTER="#d3cab8";static ROOF_COLOURS={tile:"#a0583f",slate:"#4a5059",zinc:"#8d969c",concrete:"#8f8e8a",other:"#7a7872"};static VARIATION=.12;static of(t,e){const o=String(t??"").trim();if(!/^\d{1,2}$/.test(o))return;const n=Number(o),s=n%10!==0?n%10:Math.floor(n/10);return(e==="wall"?A.WALLS:A.ROOFS)[String(s)]}static roofColor(t){return t?A.ROOF_COLOURS[t]:void 0}static fit(t){return t.map(e=>{if(e.facade)return e;const o={color:A.wallColor(e)};return{...e,facade:o}})}static wallColor(t){const e=t.wallMaterial?A.WALL_COLOURS[t.wallMaterial]:A.PLASTER,o=Math.sin(t.eastM*12.9898+t.northM*78.233)*43758.5453,n=1+(o-Math.floor(o)-.5)*2*A.VARIATION,s=r=>Math.max(0,Math.min(255,Math.round(parseInt(e.slice(r,r+2),16)*n))).toString(16).padStart(2,"0");return`#${s(1)}${s(3)}${s(5)}`}}class g{static MIN_RISE_M=1.2;static MIN_EAVES_M=2.5;static MIN_SEEN=.35;static NO_DATA=-9999;static BANDS=7;static INSET_M=.9;static LIFT=1.18;static PEAK=.3;static LEVEL=.45;static fit(t,e,o){return!e&&!o&&!t.some(n=>n.roofMaterial)?t:t.map(n=>{const s=e?g.shapeOf(n,e):void 0,r=(o?g.colorOf(n,o):void 0)??A.roofColor(n.roofMaterial);if(!s&&!r)return n;const a={shape:s?.shape??"flat",...s?.ridge==="depth"?{ridge:"depth"}:{},riseM:s?.riseM??0,...r?{color:r}:{}},i=s&&s.shape!=="flat"?s.topM:n.heightM;return{...n,heightM:i,roof:a}})}static world(t,e,o){const n=t.headingDeg*Math.PI/180;return{east:t.eastM+e*Math.cos(n)+o*Math.sin(n),north:t.northM-e*Math.sin(n)+o*Math.cos(n)}}static shapeOf(t,e){const o=g.BANDS,n=Math.max(e.metresPerPixel,.5),s=t.widthM/2-g.INSET_M,r=t.lengthM/2-g.INSET_M;if(s<=0||r<=0)return;const a=[],i=Array.from({length:o},()=>({sum:0,n:0})),c=Array.from({length:o},()=>({sum:0,n:0}));let l=0;for(let y=-s;y<=s;y+=n)for(let b=-r;b<=r;b+=n){l++;const{east:T,north:X}=g.world(t,y,b),C=Math.floor(T/e.metresPerPixel+e.size/2),z=Math.floor(e.size/2-X/e.metresPerPixel);if(C<0||z<0||C>=e.size||z>=e.size)continue;const V=z*e.size+C,U=e.heights[V];if(e.vegetation[V]||U===g.NO_DATA||!(U>0))continue;a.push(U);const W=i[Math.min(o-1,Math.floor((y+s)/(2*s)*o))],$=c[Math.min(o-1,Math.floor((b+r)/(2*r)*o))];W.sum+=U,W.n++,$.sum+=U,$.n++}if(l===0||a.length/l<g.MIN_SEEN)return;a.sort((y,b)=>y-b);const h=g.percentile(a,.08),u=g.percentile(a,.92),M=u-h;if(h<g.MIN_EAVES_M||M>Math.min(t.widthM,t.lengthM))return;if(M<g.MIN_RISE_M)return{shape:"flat",riseM:0,topM:u};const f=g.profile(i),d=g.profile(c);if(!f||!d)return;const m=g.peak(d)/M,E=g.peak(f)/M,P=g.spread(f)/M,p=g.spread(d)/M,O=m>=g.PEAK&&P<=g.LEVEL,D=E>=g.PEAK&&p<=g.LEVEL;if(O&&(!D||m>=E))return{shape:"gable",ridge:"width",riseM:M,topM:u};if(D)return{shape:"gable",ridge:"depth",riseM:M,topM:u};if(m>=g.PEAK&&E>=g.PEAK/2)return{shape:"hip",ridge:"width",riseM:M,topM:u}}static profile(t){const e=t.map(o=>o.n>0?o.sum/o.n:NaN);return e.filter(Number.isFinite).length>=t.length-1?e.map((o,n)=>Number.isFinite(o)?o:g.neighbour(e,n)):void 0}static neighbour(t,e){return Number.isFinite(t[e-1])?t[e-1]:t[e+1]}static peak(t){const e=Math.max(1,Math.floor(t.length/3)),o=s=>s.reduce((r,a)=>r+a,0)/s.length,n=[...t.slice(0,e),...t.slice(t.length-e)];return o(t.slice(e,t.length-e))-o(n)}static spread(t){return Math.max(...t)-Math.min(...t)}static percentile(t,e){return t[Math.min(t.length-1,Math.floor(t.length*e))]}static colorOf(t,e){const o=Math.max(e.metresPerPixel,.5),n=Math.max(t.widthM/2-g.INSET_M,o),s=Math.max(t.lengthM/2-g.INSET_M,o),r=[],a=[],i=[];for(let h=-n;h<=n;h+=o)for(let u=-s;u<=s;u+=o){const{east:M,north:f}=g.world(t,h,u),d=Math.floor(M/e.metresPerPixel+e.size/2),m=Math.floor(e.size/2-f/e.metresPerPixel);if(d<0||m<0||d>=e.size||m>=e.size)continue;const E=(m*e.size+d)*e.samples,P=e.values[E],p=e.values[E+1],O=e.values[E+2];p>P&&p>O||(r.push(P),a.push(p),i.push(O))}if(r.length===0)return;const c=h=>h.sort((u,M)=>u-M)[Math.floor(h.length/2)],l=h=>Math.min(255,Math.round(h*g.LIFT)).toString(16).padStart(2,"0");return`#${l(c(r))}${l(c(a))}${l(c(i))}`}}class v{static DEFAULT_HEIGHT_M=6;static METRES_PER_DEGREE=111320;static STREET_SPACING_M=35;static KERB_OFFSET_M=1;static DEFAULT_WIDTH_M=5.5;static PATIENCE_MS=15e3;static MAX=150;client;constructor(t={}){this.client=new k(t)}static today(){return new Date().toISOString().slice(0,10)}async near(t,e){const o=e/v.METRES_PER_DEGREE,n=e/(v.METRES_PER_DEGREE*Math.cos(t.lat*Math.PI/180)),s=[t.lat-o,t.lng-n,t.lat+o,t.lng+n].map(i=>i.toFixed(6)).join(",");let r;const a=new Promise(i=>{r=setTimeout(()=>i(void 0),v.PATIENCE_MS)});try{const i=await Promise.race([this.client.query(`[out:json][timeout:25];(node["highway"="street_lamp"](${s});way["highway"]["lit"="yes"](${s}););out geom;`),a]);return i?v.lampsFrom(i,t,e):[]}catch{return[]}finally{clearTimeout(r)}}static lampsFrom(t,e,o){const n=[];for(const r of t.elements??[]){if(r.type==="way"){v.alongStreet(r,e,n);continue}if(typeof r.lat!="number"||typeof r.lon!="number")continue;const a=(r.lon-e.lng)*v.METRES_PER_DEGREE*Math.cos(e.lat*Math.PI/180),i=(r.lat-e.lat)*v.METRES_PER_DEGREE;if(Math.hypot(a,i)>o)continue;const c=Number.parseFloat(r.tags?.height??"");n.push({eastM:Math.round(a*10)/10,northM:Math.round(i*10)/10,...Number.isFinite(c)&&c>=2&&c<=20?{heightM:c}:{}})}const s=n.filter(r=>Math.hypot(r.eastM,r.northM)<=o);return n.length=0,n.push(...s),n.sort((r,a)=>Math.hypot(r.eastM,r.northM)-Math.hypot(a.eastM,a.northM)),n.slice(0,v.MAX)}static alongStreet(t,e,o){const n=t.geometry;if(!n||n.length<2)return;const s=f=>[(f.lon-e.lng)*v.METRES_PER_DEGREE*Math.cos(e.lat*Math.PI/180),(f.lat-e.lat)*v.METRES_PER_DEGREE],r=n.map(s),a=Number.parseFloat(t.tags?.width??""),i=Number.parseInt(t.tags?.lanes??"",10),l=(Number.isFinite(a)&&a>0?a:Number.isFinite(i)&&i>0?i*3.5:v.DEFAULT_WIDTH_M)/2+v.KERB_OFFSET_M;let h=1,u=v.STREET_SPACING_M/2,M=0;for(let f=1;f<r.length;f++){const[d,m]=r[f-1],[E,P]=r[f],p=Math.hypot(E-d,P-m);if(p===0)continue;const O=(E-d)/p,D=(P-m)/p;for(;u<=M+p;u+=v.STREET_SPACING_M){const y=u-M;o.push({eastM:Math.round((d+O*y+D*l*h)*10)/10,northM:Math.round((m+D*y-O*l*h)*10)/10}),h=-h}M+=p}}}class j{id="ign-lidar-hd";name="IGN LiDAR HD";attribution="Canopy and roofs © IGN, LiDAR HD (Licence Ouverte 2.0), as surveyed on a day the service does not give";creditUrl="https://geoservices.ign.fr/lidarhd";contemporary=!0;platform;lamps;constructor(t={},e){this.platform=new R(t),this.lamps=e}covers(t,e){return R.covers(t,e)}async getSurroundings(t,e){if(!this.covers(t.lat,t.lng))throw new S("no-coverage","The LiDAR HD survey covers France only");const o=R.lidarRadius(e),[n,s,r,a,i]=await Promise.all([this.platform.lidar(t,o),this.platform.photo(t,o).catch(()=>{}),this.lamps?.near(t,e),this.platform.laserDate(t),this.platform.photoDate(t)]);return{trees:new x(n.heights,n.vegetation,n.size,n.size).trees({metresPerPixel:n.metresPerPixel,radiusM:o}),buildings:A.fit(g.fit(new w(n.heights,n.building,n.size,n.size).buildings({metresPerPixel:n.metresPerPixel,radiusM:o,maxBuildings:300}),n,s)),bridges:[],lines:[],...r?{lamps:r}:{},dates:{...a?{laser:a}:{},...s&&i?{photo:i}:{},...r?.length?{lamps:v.today()}:{}}}}}class I{static METRES_PER_DEGREE=111320;static NAMED_NATURES={Silo:"Silo"};static DEFAULT_HEIGHT_M=6;static FLOOR_HEIGHT_M=3;static FINE_M=.5;static COARSE_M=1;static MAX_CELLS=4e4;static RECTANGLE_FILL=.9;static buildings(t,e,o,n=12,s=300){const r=[];for(const i of t){const c=I.rings(i,e);if(c.length===0)continue;const l=Number(i.properties.nombre_d_etages),h=Number(i.properties.hauteur),u=Number.isFinite(h)&&h>0?h:Number.isFinite(l)&&l>0?l*I.FLOOR_HEIGHT_M:I.DEFAULT_HEIGHT_M;for(const M of I.rectanglesOf(c,u,n)){if(Math.hypot(M.eastM,M.northM)>o)continue;const f=A.of(i.properties.materiaux_des_murs,"wall"),d=A.of(i.properties.materiaux_de_la_toiture,"roof"),m=I.NAMED_NATURES[String(i.properties.nature??"")];r.push({...M,...m?{name:m}:{},...Number.isFinite(l)&&l>0?{floors:l}:{},...f?{wallMaterial:f}:{},...d?{roofMaterial:d}:{}})}}const a=i=>Math.hypot(i.eastM,i.northM);if(r.length>s){const i=c=>(c.heightM+6)*Math.sqrt(c.widthM*c.lengthM)/Math.max(a(c),50);r.sort((c,l)=>i(l)-i(c)),r.length=s}return r.sort((i,c)=>a(i)-a(c)),r}static named(t,e,o){const n=e.map(s=>({name:typeof s.properties.toponyme=="string"?s.properties.toponyme:"",rings:I.rings(s,o)})).filter(s=>s.name.length>0&&s.rings.length>0);return n.length===0?t:t.map(s=>{const r=n.find(a=>I.inside(s.eastM,s.northM,a.rings));return r?{...s,name:r.name}:s})}static inside(t,e,o){let n=0;for(const s of o)for(let r=0;r+1<s.length;r++){const a=s[r],i=s[r+1];a.north<=e!=i.north<=e&&a.east+(e-a.north)/(i.north-a.north)*(i.east-a.east)>t&&n++}return n%2===1}static rings(t,e){const o=t.geometry,n=o.type==="Polygon"?[o.coordinates]:o.type==="MultiPolygon"?o.coordinates:[],s=Math.cos(e.lat*Math.PI/180),r=[];for(const a of n)for(const i of a)r.push(i.map(([c,l])=>({east:(c-e.lng)*I.METRES_PER_DEGREE*s,north:(l-e.lat)*I.METRES_PER_DEGREE})));return r}static rectanglesOf(t,e,o){let n=1/0,s=-1/0,r=1/0,a=-1/0;for(const u of t)for(const M of u)n=Math.min(n,M.east),s=Math.max(s,M.east),r=Math.min(r,M.north),a=Math.max(a,M.north);let i=I.FINE_M;(s-n)*(a-r)/(i*i)>I.MAX_CELLS&&(i=I.COARSE_M);const c=[],l=[];for(let u=r+i/2;u<a;u+=i){const M=[];for(const f of t)for(let d=0;d+1<f.length;d++){const m=f[d],E=f[d+1];m.north<=u!=E.north<=u&&M.push(m.east+(u-m.north)/(E.north-m.north)*(E.east-m.east))}M.sort((f,d)=>f-d);for(let f=0;f+1<M.length;f+=2)for(let d=Math.ceil((M[f]-i/2)/i)*i+i/2;d<M[f+1];d+=i)c.push(d),l.push(u)}if(c.length*i*i<o)return[];const h=t.flatMap(u=>u.slice(0,-1).map((M,f)=>({from:M,to:u[f+1]})));return w.ofPoints(c,l,new Array(c.length).fill(e),i,o,I.RECTANGLE_FILL,h)}}class q{id="ign-lidar-topo";name="IGN LiDAR HD + BD TOPO";attribution="Canopy © IGN, LiDAR HD; buildings, bridges and lines © IGN, BD TOPO (Licence Ouverte 2.0), as surveyed on days the services do not give";creditUrl="https://geoservices.ign.fr/lidarhd";contemporary=!0;platform;lamps;constructor(t={},e){this.platform=new R(t),this.lamps=e}covers(t,e){return R.covers(t,e)}async getSurroundings(t,e){if(!this.covers(t.lat,t.lng))throw new S("no-coverage","The IGN's surveys cover France only");const o=R.radius(e),[n,s,r,a,i,c]=await Promise.allSettled([this.platform.lidar(t,o),this.platform.vectors(t,o,!0),this.platform.photo(t,o),this.lamps?.near(t,e)??Promise.resolve(void 0),this.platform.laserDate(t),this.platform.photoDate(t)]),l=R.lidarRadius(o);if(n.status==="rejected"&&s.status==="rejected")throw n.reason;const h=n.status==="fulfilled"?n.value:void 0,u=s.status==="fulfilled"?s.value:void 0,M=u!==void 0&&u.buildings.length===0&&u.bridges.length===0&&u.lines.length===0;if(n.status==="rejected"&&n.reason instanceof S&&n.reason.reason==="no-coverage"&&M)throw n.reason;return{trees:h?new x(h.heights,h.vegetation,h.size,h.size).trees({metresPerPixel:h.metresPerPixel,radiusM:l}):[],buildings:this.roofed(this.buildings(h,u,t,o),h,r.status==="fulfilled"?r.value:void 0),bridges:u?F.bridges(u,t,o,h?.structures):[],lines:u?F.lines(u,t,o,h?.structures):[],...a.status==="fulfilled"&&a.value?{lamps:a.value}:{},dates:{...n.status==="fulfilled"&&i.status==="fulfilled"&&i.value?{laser:i.value}:{},...r.status==="fulfilled"&&c.status==="fulfilled"&&c.value?{photo:c.value}:{},...u?.mapDate?{map:u.mapDate}:{},...a.status==="fulfilled"&&a.value?.length?{lamps:v.today()}:{}}}}roofed(t,e,o){return A.fit(g.fit(t,e,o))}buildings(t,e,o,n){const s=e?I.buildings(e.buildings,o,n):[],r=s.length>0||t===void 0?s:new w(t.heights,t.building,t.size,t.size).buildings({metresPerPixel:t.metresPerPixel,radiusM:R.lidarRadius(n),maxBuildings:300});return e?I.named(r,e.zones,o):r}}class Y{id="ign-bd-topo";name="IGN BD TOPO";attribution="Buildings, bridges and lines © IGN, BD TOPO (Licence Ouverte 2.0), as drawn on a day the service does not give";creditUrl="https://geoservices.ign.fr/bdtopo";contemporary=!0;platform;lamps;constructor(t={},e){this.platform=new R(t),this.lamps=e}covers(t,e){return R.covers(t,e)}async getSurroundings(t,e){if(!this.covers(t.lat,t.lng))throw new S("no-coverage","BD TOPO covers France only");const o=R.radius(e),[n,s,r,a]=await Promise.all([this.platform.vectors(t,o,!0),this.platform.photo(t,o).catch(()=>{}),this.lamps?.near(t,e),this.platform.photoDate(t)]);return{trees:[],buildings:A.fit(g.fit(I.named(I.buildings(n.buildings,t,o),n.zones,t),void 0,s)),bridges:F.bridges(n,t,o,void 0),lines:F.lines(n,t,o,void 0),...r?{lamps:r}:{},dates:{...n.mapDate?{map:n.mapDate}:{},...s&&a?{photo:a}:{},...r?.length?{lamps:v.today()}:{}}}}}class N{static ROOF_SHAPES={flat:"flat",gabled:"gable",gambrel:"gable",saltbox:"gable","half-hipped":"hip",hipped:"hip",pyramidal:"hip",mansard:"hip",round:"gable"};static WALL_MATERIALS={brick:"brick",stone:"stone",granite:"stone",sandstone:"stone",limestone:"stone",concrete:"concrete",cement_block:"block",block:"block",wood:"wood",timber_framing:"wood"};static ROOF_MATERIALS={roof_tiles:"tile",tiles:"tile",tile:"tile",slate:"slate",metal:"zinc",zinc:"zinc",tin:"zinc",copper:"zinc",concrete:"concrete",eternit:"other"};static COLOURS={white:"#e8e6e0",grey:"#8c8c8a",gray:"#8c8c8a",black:"#3a3a3a",red:"#a8483a",brown:"#6e4f38",beige:"#d6c9a8",yellow:"#d8c070",orange:"#c9773a",green:"#5f7a52",blue:"#506a8a",tan:"#c0a37a",cream:"#e6dcc0",pink:"#c99a96",silver:"#b4b6b6"};static height(t){const e=Number.parseFloat((t??"").replace(",","."));return Number.isFinite(e)&&e>=2&&e<=500?e:void 0}static levels(t){const e=Number.parseInt(t??"",10);return Number.isFinite(e)&&e>=1&&e<=150?e:void 0}static roofShape(t){return N.ROOF_SHAPES[(t??"").trim().toLowerCase()]}static wallMaterial(t){return N.WALL_MATERIALS[(t??"").trim().toLowerCase()]}static roofMaterial(t){return N.ROOF_MATERIALS[(t??"").trim().toLowerCase()]}static colour(t){const e=(t??"").trim().toLowerCase();return/^#[0-9a-f]{6}$/.test(e)?e:/^#[0-9a-f]{3}$/.test(e)?`#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}`:N.COLOURS[e]}}class L{id="osm-buildings";name="OpenStreetMap buildings";attribution="Buildings © OpenStreetMap contributors (ODbL), as drawn on the day of the data, which a recording is not";creditUrl="https://www.openstreetmap.org/copyright";contemporary=!0;static MAX_RADIUS_M=1500;static MIN_AREA_M2=12;static MAX_BUILDINGS=300;client;lamps;constructor(t={},e){this.client=new k(t),this.lamps=e}covers(){return!0}async getSurroundings(t,e){const o=Math.min(e,L.MAX_RADIUS_M);let n;try{n=await this.client.query(`[out:json][timeout:30];(way["building"](around:${o},${t.lat},${t.lng});relation["building"]["type"="multipolygon"](around:${o},${t.lat},${t.lng}););out geom;`)}catch(a){throw new S("unreachable",a instanceof Error?a.message:String(a))}const s=await this.lamps?.near(t,e),r=(n.osm3s?.timestamp_osm_base??"").slice(0,10);return{trees:[],buildings:A.fit(L.buildings(n,t,o)),bridges:[],lines:[],...s?{lamps:s}:{},dates:{.../^\d{4}-\d{2}-\d{2}$/.test(r)?{map:r}:{},...s?.length?{lamps:v.today()}:{}}}}static buildings(t,e,o){const n=[];for(const s of t.elements??[]){const r=L.ringsOf(s);if(r.length===0)continue;const a=s.tags??{},i=N.levels(a["building:levels"]),c=N.height(a.height),l={geometry:{type:"Polygon",coordinates:r},properties:{...c?{hauteur:c}:{},...i?{nombre_d_etages:i}:{}}};for(const h of I.buildings([l],e,o,L.MIN_AREA_M2,50))n.push(L.described(h,a,c!==void 0))}return n.sort((s,r)=>Math.hypot(s.eastM,s.northM)-Math.hypot(r.eastM,r.northM)),n.slice(0,L.MAX_BUILDINGS)}static ringsOf(t){const e=n=>{if(!n||n.length<4)return;const s=n.map(i=>[i.lon,i.lat]),r=s[0],a=s[s.length-1];return r[0]===a[0]&&r[1]===a[1]?s:void 0};if(t.type==="way"){const n=e(t.geometry);return n?[n]:[]}return(t.members??[]).filter(n=>n.role==="outer").map(n=>e(n.geometry)).filter(n=>n!==void 0).slice(0,1)}static described(t,e,o){const n=N.wallMaterial(e["building:material"]),s=N.roofMaterial(e["roof:material"]),r=N.colour(e["building:colour"]),a=N.colour(e["roof:colour"])??A.roofColor(s),i=N.roofShape(e["roof:shape"]),c=r?{color:r}:void 0;let l,h=t.heightM;if(i==="gable"||i==="hip"){const u=N.height(e["roof:height"]),M=Math.round((u??Math.min(5,Math.max(1.5,.29*Math.min(t.widthM,t.lengthM))))*10)/10;o||(h=Math.round((t.heightM+M)*10)/10),l={shape:i,riseM:M,...e["roof:orientation"]==="across"?{ridge:"depth"}:{},...a?{color:a}:{}}}else(i==="flat"||a)&&(l={shape:"flat",riseM:0,...a?{color:a}:{}});return{...t,heightM:h,...e.name?{name:e.name}:{},...n?{wallMaterial:n}:{},...s?{roofMaterial:s}:{},...c?{facade:c}:{},...l?{roof:l}:{}}}}const _=[{id:"ign-lidar-topo",name:"IGN LiDAR HD + BD TOPO",credit:"© IGN, LiDAR HD and BD TOPO, Licence Ouverte 2.0; street lamps © OpenStreetMap contributors",creditUrl:"https://geoservices.ign.fr/lidarhd",create:()=>new q({},new v)},{id:"ign-lidar-hd",name:"IGN LiDAR HD",credit:"© IGN, LiDAR HD, Licence Ouverte 2.0; street lamps © OpenStreetMap contributors",creditUrl:"https://geoservices.ign.fr/lidarhd",create:()=>new j({},new v)},{id:"ign-bd-topo",name:"IGN BD TOPO",credit:"© IGN, BD TOPO, Licence Ouverte 2.0; street lamps © OpenStreetMap contributors",creditUrl:"https://geoservices.ign.fr/bdtopo",create:()=>new Y({},new v)},{id:"osm-buildings",name:"OpenStreetMap buildings",credit:"Buildings and street lamps © OpenStreetMap contributors (ODbL)",creditUrl:"https://www.openstreetmap.org/copyright",create:()=>new L({},new v)}];class G{static DEFAULT_ID=_[0].id;static WORLD_ID="osm-buildings";static NONE="none";static byId(t){return t===G.NONE?void 0:_.find(e=>e.id===t)??_[0]}static providerFor(t,e,o){const n=G.byId(t)?.create();if(t!==void 0&&t!==G.DEFAULT_ID)return n?.covers(e,o)?n:void 0;const s=_.find(a=>a.id===G.WORLD_ID).create(),r=[n,s].filter(a=>a!==void 0&&a.covers(e,o));return r.length>1?new K(r):r[0]}}export{_ as SURROUNDINGS_SOURCES,G as SurroundingsSources};
|