Häiriökartta ja reitin altistus
kshana interference-map rakentaa päiväkohtaisen kuvan siitä, missä ilma-alukset ja alukset raportoivat heikentynyttä navigointidataa, sinun toimittamistasi avoimesti lisensoiduista seurantatiedostoista. kshana route-exposure kertoo sitten, kuinka suuri osa suunnitellusta reitistä oli kunakin päivänä vaikutusalueen soluissa.
Mitä tämä on: kuvaus siitä, miltä julkaistut paikkaraportit näyttivät aiempina päivinä. Mitä se ei ole: minkään vastaanottimen mittaus, ennuste tai todiste häiriöstä. Heikentyneellä tai poikkeavalla solulla on useita mahdollisia syitä (lueteltu jäljempänä), ja solu, jolla ei ole merkintää, yksinkertaisesti jäi havaitsematta.
Kaikki toimii paikallisilla tiedostoilla. Oletuskomennot eivät koskaan avaa verkkoyhteyttä; ainoa valinnainen latausapuri vaatii nimenomaisen lipun.
Molemmat päivät ovat hakemiston examples/interference-map/output/ synteettisiä näytteitä, ja kummallakin on synteettinen reitti hakemistossa examples/interference-map/input/; reittialtistuksen osuudet ovat se, mitä kshana route-exposure niille tulostaa. Mikään niissä ei ole todellinen paikka, ilma-alus tai alus.
Data ja lisenssit#
Sisäänrakennettuina ovat vain tiedostossa data/INTERFERENCE-DATA-SOURCES.md tarkastetut lähteet, valittuna valitsimella --dataset:
--dataset |
Tyyppi | Lisenssi | Tulosteen lisenssikenttä |
|---|---|---|---|
adsb-lol |
ADS-B | ODbL 1,0 | ODbL-1.0 |
noaa-marinecadastre |
AIS | Yhdysvaltain public domain (CC0 1,0 julkaisijan mukaan) | public domain |
kystverket |
AIS | NLOD 2,0 | NLOD-2.0 |
custom |
kumpi tahansa | mitä ilmoitat | --licence, --licence-url, --attribution vaaditaan |
Jokainen tulostetiedosto upottaa lisenssin, lisenssin URL-osoitteen, vaaditun tekijänmaininnan ja lähteen kattavuusrajoitukset. Sisäänrakennettua kohtaa ei ole lähteille, joiden ehdot kieltävät kaupallisen käytön tai johdettujen karttojen edelleenjaon.
ODbL ja Kshanan versiot. adsb.lolin datasta tehty solukohtainen ADS-B-tiedosto on Derived Database ja julkaistaan ODbL 1,0 -lisenssillä; sen kenttä licence kertoo tämän. Kshanan oma koodi pysyy AGPL-3.0:na. Kshanan kaupalliset versiot, jotka kirjoittavat tällaisia tiedostoja, liittävät saman huomautuksen, ja kaikkien, jotka julkaisevat tiedoston uudelleen, on säilytettävä se. ADS-B- ja AIS-tuloksia ei koskaan yhdistetä yhteen tiedostoon, joten ODbL ei kiinnity AIS-kerrokseen.
Kattavuuden vinouma. Kartat perivät lähteensä kattavuuden. adsb.lol seuraa vapaaehtoisten vastaanottimia, joten avomeri ja heikosti katetut alueet ovat harvoja. Kystverketin avoin data jättää pois alle 15 m:n kalastusalukset ja alle 45 m:n huviveneet, joten sen kartta heijastaa suurempia aluksia. MarineCadastre kattaa vain Yhdysvaltain vedet.
Tunnisteet. Syöterivit sisältävät ilma-aluksen tai aluksen tunnisteen. Se tiivistetään muistissa satunnaisella ajokohtaisella suolalla, sitä käytetään vain erillisten ilma-alusten tai alusten laskemiseen, eikä sitä koskaan kirjoiteta, kirjata lokiin tai tulosteta. Tulosteet ovat aggregaatteja: mikään tunniste ei esiinny niissä missään.
Pimitys. Solua, jossa havaittiin sinä päivänä alle 5 erillistä ilma-alusta tai alusta, ei julkaista lainkaan, ja AIS:ssä julkaistun solun merkittyjen alusten lukumäärä yksi tai kaksi raportoidaan arvona null. Mikään julkaistu arvo ei voi tunnistaa yksittäistä ilma-alusta tai alusta.
Syöttömuodot#
Pelkkä CSV otsikkorivillä, pilkuin erotettu, ilman lainausmerkkejä, UTC-ajat. Sarakejärjestys on vapaa; tuntemattomat sarakkeet ohitetaan. Aikaleima on Unix-sekunteja tai YYYY-MM-DDTHH:MM:SS[.fff]Z. Rivit, joita ei voi jäsentää, lasketaan tulosteen metadataan, ei jätetä äänettömästi pois.
ADS-B (kshana interference-map adsb):
| Sarake | Pakollinen | Merkitys |
|---|---|---|
timestamp |
kyllä | raportin aika |
aircraft_id |
kyllä | läpinäkymätön tunniste (tiivistetään, ei koskaan tallenneta) |
lat, lon |
kyllä | astetta |
alt_baro_ft |
kyllä | korkeus jalkoina; ground tai tyhjä arvo sulkee rivin pois |
nic, nacp |
vähintään yksi | kokonaisluvut 0–11; tyhjä tarkoittaa, ettei arvoa ole raportoitu |
source_type |
ei | jos sarake on olemassa, käytetään vain arvoja, jotka alkavat merkillä adsb (MLAT, TIS-B ja vastaavat suljetaan pois) |
adsb.lolin readsb-historia luettuna suoraan. Päiväarkistot ovat jaettu tar-paketti readsb-jälkitiedostoista. Pura yksi julkaisijan kuvaamalla tavalla (yhdistä osat, tar -xf -) ja anna sitten Kshanalle purettu hakemisto, yksittäinen trace_full_*.json-tiedosto tai CSV:
kshana interference-map adsb extracted-day/ --dataset adsb-lol --out maps/
Hakemistosta etsitään rekursiivisesti tiedostoja trace_full_* (muut tiedostot, kuten trace_recent_*, ohitetaan, eikä symbolisia linkkejä seurata). Jokainen tiedosto on gzip-pakattu tai pelkkää JSONia, mikä tunnistetaan sen ensimmäisistä tavuista, koska readsb kirjoittaa gzipin nimellä, jonka pääte on .json; purku on rajattu 512 MiB:iin tiedostoa kohti. Jokaisesta jälkimerkinnästä Kshana lukee aikasiirtymän, leveysasteen, pituusasteen, korkeuden (merkki ground sulkee merkinnän pois), ilma-aluksen tietoolion kentät nic ja nac_p sekä paikkalähdemerkkijonon (merkinnät, jotka eivät ole ADS-B:tä, suljetaan pois). Merkinnällä, jolla ei ole tietoolioa, ei ole tarkkuuskenttiä, ja se lasketaan poissuljetuksi. Tiedosto, jota ei voi lukea, lasketaan kenttään trace_files_unreadable tulosteen metadatassa ja ohitetaan.
AIS (kshana interference-map ais):
| Sarake | Pakollinen | Merkitys |
|---|---|---|
timestamp |
kyllä | raportin aika |
vessel_id |
kyllä | läpinäkymätön tunniste (tiivistetään, ei koskaan tallenneta) |
lat, lon |
kyllä | astetta; AIS:n ”ei saatavilla” -arvot ja (0, 0) hylätään |
sog_kn |
ei | maanopeus solmuina; 102,3 (ei saatavilla) käsitellään puuttuvana |
Maalla-ilmaisin tarvitsee maapolygonitiedoston (--land): GeoJSON Polygon tai MultiPolygon. Tarkoitettu tiedosto on Natural Earthin 1:10 miljoonan mittakaavan maakerros (public domain). Ilman valitsinta --land ilmaisin on pois käytöstä, ja tuloste sanoo niin. Sen lataamiseksi (ainoa verkkoyhteys tässä ominaisuudessa):
kshana interference-map fetch-land --out ne_10m_land.geojson --allow-network
Tämä ajaa järjestelmän komennon curl (argumenttilistana, ei komentotulkin kautta) HTTPS:n yli kerran yhdelle tiedostolle kiinteässä osoitteessa, joka nimeää yhden upstream-repositorion commitin. Lataus säilytetään vain, jos sen SHA-256 vastaa koodiin kiinnitettyä arvoa; ristiriita poistaa sen ja epäonnistuu. Jos komentoa curl ei ole asennettu, komento sanoo sen ja antaa osoitteen ja tarkistussumman, jotta tiedoston voi noutaa käsin. Repositorioon ei niputeta mitään.
Tuloste#
Yksi GeoJSON-tiedosto lähdettä ja UTC-päivää kohti hakemistossa --out, nimettynä <source>-<dataset>-<YYYY-MM-DD>.geojson, missä <source> on adsb tai ais, <dataset> on avaimen --dataset arvo (adsb-lol, noaa-marinecadastre, kystverket tai custom) ja päivämäärä on raporttien UTC-päivä: adsb-adsb-lol-2026-03-01.geojson, ais-kystverket-2026-03-01.geojson. Aineisto on nimessä, jotta kaksi saman tyypin aineistoa ei voi jakaa tiedostoa, ja Kshana ei koskaan korvaa tiedostoa: jos mikä tahansa kohde on olemassa, komento epäonnistuu ennen kuin mitään kirjoitetaan. CLI tulostaa yhden rivin jokaisesta kirjoittamastaan tiedostosta. Lukija voi palauttaa kolme osaa lausekkeella ^(adsb|ais)-(.+)-(\d{4}-\d{2}-\d{2})\.geojson$; sama tieto on tiedoston sisällä (source_kind, data.dataset, date). Synteettiset näytetiedostot, yksi lähdettä kohti, ovat hakemistossa examples/interference-map/output/, niiden uudelleen luovan komennon kanssa, katseluohjelman rakentamista ja testaamista varten. Ylätason jäsen kshana_interference_map sisältää skeeman nimen, päivämäärän, ruudukon, menetelmän tunnisteen ja jokaisen parametrin, päivätason luvut, datan lisenssin ja tekijänmaininnan sekä huomautuksen. Jokainen kohde on solupolygoni, jolla on cell_i, cell_j, status, degraded ja aggregaattilukumäärät.
Ruudukko on kiinteä: neliösolut, joiden koko on --cell-deg astetta (oletus 0,5) leveys- ja pituusasteessa, indeksoituna pisteestä (-90, -180). Itä–länsi-suuntainen leveys kapenee leveysasteen mukana: oletuksella noin 55 km päiväntasaajalla ja noin 28 km 60 asteen kohdalla. Leveysaste 90 kuuluu viimeiseen riviin, ja pituusaste 180 on sama pituuspiiri kuin -180. Ennalta rekisteröidyt menetelmät on määritelty 0,5 asteen ruudukolle. Toinen arvo valitsimelle --cell-deg toimii, mutta ei ole ennalta rekisteröity menetelmä: CLI sanoo niin, ja tiedosto kirjaa grid.preregistered_cell_deg ja grid.is_preregistered (false), jotta katseluohjelma voi sanoa sen myös.
Pimitetyt lukumäärät. Jokainen solukohtainen lukumäärä, joka on julkaisuminimin (5) alapuolella, on null, nolla mukaan lukien, joten null ei koskaan tarkoita ”ei yhtään”, eikä mikään julkaistu luku voi tunnistaa yksittäistä ilma-alusta tai alusta. Kentät status ja degraded annetaan edelleen. ADS-B-tiedostoissa aircraft_observed on julkaistulla solulla aina vähintään 5; aircraft_sampled ja aircraft_affected ovat null, kun arvo on alle 5, ja affected_share on null, ellei molempia ole vähintään 5 (osuus paljastaisi pimitetyn lukumäärän). AIS-tiedostoissa kukin kentän vessels_flagged merkintä on null, kun arvo on alle 5.
Formaatin versio ja kentät#
Formaatti on lukittu muotoon schema: "kshana-interference-map/v1", format_version: 1. Muutos, joka poistaa tai nimeää uudelleen kentän tai muuttaa sen merkitystä, nostaa versiota; kentän lisääminen ei nosta, joten lukijan on ohitettava kentät, joita se ei tunne. Lukumäärä, joka on null, on pimitetty, ei nolla.
FeatureCollection
kshana_interference_map
schema, format_version, kshana_version, notice
source_kind "adsb" | "ais"
date "YYYY-MM-DD" (UTC)
grid { type: "fixed_lat_lon", cell_deg, preregistered_cell_deg, is_preregistered }
method { id, summary, parameters{...}, guards[], input_stats{...}, caveats[] }
day day-level figures (ADS-B: background_evaluated, background_share,
day_confounded, cells_published, cells_suppressed_below_min_distinct;
AIS: on_land_detector, cells_published, cells_suppressed_...)
data { dataset, name, licence, licence_url, attribution, coverage_notes[] }
features[] Polygon (one closed ring, [lon, lat], counter-clockwise)
properties cell_i, cell_j, status, degraded,
ADS-B: aircraft_observed, aircraft_sampled|null, aircraft_affected|null,
affected_share|null
AIS: vessels_observed, vessels_flagged{detector: n|null}, detectors[]
Kentän status arvot: ADS-B degraded, not_degraded, insufficient_sample, withheld_day_confounded, withheld_no_background; AIS anomalous, not_anomalous. degraded on tosi vain arvoille degraded ja anomalous. Reittialtistusraportilla on oma skeemansa kshana-route-exposure/v1.
Observatorio: päivätuote#
kshana interference-map daily muuttaa yhden UTC-päivän ADS-B-raportit observatorion kolmeksi tiedostoksi (GeoJSON, PNG ja häiriöraportti-JSON) ja tiivistemanifestiksi, ja kshana interference-map sensitivity toistaa kyseisen päivän ennalta rekisteröityjen parametrien yksi kerrallaan tehdyillä muutoksilla. Komento valvoo julkaisusääntöjä: vähintään 24 h päivän päättymisen jälkeen (--delay-hours voi vain nostaa), solut 0,5 astetta tai karkeammat, vain kolme tilaa (degraded, not_degraded, not_observed), ei syyn osoittamista ja ei OpenSky-dataa. Menetelmämuistio, tiedostomuodot ja rajoitukset ovat tiedostossa observatory/METHOD.md. Alueellinen ajo (--bbox south,west,north,east) lukee vain laatikon raportit ja sanoo sen tiedostossa.
Studion karttasivun määrittely#
Studion karttasivua varten, joka lataa käyttäjän antaman GeoJSON-tiedoston (sivu rakennetaan Studion lähdekoodissa, ei tässä repositoriossa). Mitään ei lähetetä: tiedosto luetaan selaimessa, eikä sivu tee pyyntöä mihinkään datalähteeseen.
Tiedoston lukeminen. Hyväksy tiedosto vain, jos kshana_interference_map.schema alkaa merkkijonolla kshana-interference-map/ ja format_version on luku, jota sivu tukee; muuten sano, ettei tiedosto ole tuettu Kshanan häiriökartta. Lue yllä luetellut kentät; ohita tuntemattomat. Tiedostossa on yksi lähde ja yksi päivä. Useita tiedostoja voi ladata.
Solut. Piirrä jokaisen kohteen polygoni. Väritä arvolla status, ja kerro aina selitteessä, mitä kukin väri tarkoittaa. Neljä tilaa, joista mitään ei saa piilottaa tai yhdistää:
| Tila | Merkitys | Mistä se tulee |
|---|---|---|
| Heikentynyt (AIS:ssä poikkeava) | suuri osuus ilma-aluksista raportoi matalaa tarkkuutta, tai alusten havaittiin olevan poikkeavia, sinä päivänä | degraded on tosi |
| Vapaa | havaittu riittävällä määrällä ilma-aluksia tai aluksia eikä merkitty | status on not_degraded tai not_anomalous |
| Arvioimaton | havaittu, mutta otantaan ei tullut tarpeeksi ilma-aluksia, päivä oli sekoittunut, tai päivän taustaa ei voitu arvioida | status on insufficient_sample, withheld_day_confounded tai withheld_no_background |
| Ei havaittu | liian vähän ilma-aluksia tai aluksia, joten solua ei julkaistu | solulle ei ole kohdetta |
”Ei havaittu” on kohteen puuttuminen: piirrä se neutraalisti (ei täyttöä tai viivoitus), ei koskaan ”vapaan” värillä. Käytä väriskeemaa, joka ei nojaa pelkästään punaiseen ja vihreään. Solun tiedot kohdistettaessa tai valittaessa näyttävät kentän properties lukumäärät sellaisenaan ja jokaisen luvun null muodossa ”pimitetty (alle 5)”, ei koskaan nollana. Katseluohjelman tulee myös sanoa, kun grid.is_preregistered on false, että tiedosto käyttää solukokoa, joka on ennalta rekisteröidyn menetelmän ulkopuolella.
Kerrokset. ADS-B ja AIS ovat erillisiä kerroksia, joilla on omat kytkimensä, selitteensä ja lisenssirivinsä. Älä koskaan yhdistä niitä yhdeksi väri- tai lukumääräkentäksi, älä koskaan piirrä niitä yhdeksi yhdistetyksi soluksi äläkä koskaan laske niiden soluja yhteen. Eri päivät ovat eri tiedostoja: näytä yksi päivä kerrallaan päivänvalitsimella päällekkäisten päivien sijaan.
Lisenssi ja tekijänmaininta. Näytä jokaiselle näkyvälle kerrokselle kartalla ja kaikissa viennissä tai kuvakaappauksissa tekstin data.attribution sanatarkasti, kentän data.licence linkillä osoitteeseen data.licence_url sekä kentän data.coverage_notes. Jos ADS-B-kerros näytetään, sen ODbL-lisenssi koskee vain sitä kerrosta. Älä tarjoa yhdistetyn tiedoston vientiä.
Menetelmä. Tarjoa menetelmän tunniste ja parametrit (method.id, method.parameters) sekä luvut day tietopaneelissa, mukaan lukien day_confounded (sano selvästi, ettei yhtäkään solua julistettu heikentyneeksi päivän taustan vuoksi) ja input_stats.
Säilytettävät varaumat (näytä tiedoston omat method.caveats ja notice ja pidä tämä sanamuoto tai sen vastine näkyvillä kartan kanssa):
- Heikentynyt tai poikkeava solu ei ole havainto häiriöstä. On olemassa muitakin syitä.
- Solu ilman väriä jäi havaitsematta. Se ei ole todiste siitä, että alue oli vapaa.
- Tämä on kuvaus aiemmista paikkaraporteista, ei ennuste eikä minkään vastaanottimen mittaus.
- Kattavuus seuraa datalähdettä; lue kattavuushuomautukset.
Sivu ei saa nimetä tai näyttää yksittäistä ilma-alusta tai alusta, eikä tiedostoissa ole yhtään.
Reittialtistus. Jos sivu lataa myös raportin kshana-route-exposure/v1, näytä sen rivit päivää ja lähdettä kohti neljän osuuden (heikentynyt, vapaa, arvioimaton, ei havaittu) kanssa yhdessä, ei koskaan heikentynyttä osuutta yksinään, sekä raportin caveats ja kunkin rivin map_licence ja map_attribution.
Lähetinalue (interference-map locate)#
kshana interference-map locate arvioi, missä häiriölähde voi olla, samoista avoimista ADS-B- tai AIS-raporteista: alue ilmoitetuilla luottamustasoilla, painopiste epävarmuusellipsillä ja istunnot ajassa. Se ei koskaan palauta pelkkää pistettä. MODELLED (kirjanpitorivi VM-bc70cb57): fysiikka on oppikirjan radion näköyhteys, alueiden uskottavuus on ehdollinen mallille, ja ainoa ulkoinen tarkistus on Jammertest-vertailu, joka on ennalta rekisteröity tiedostossa emitter-region/PREREGISTRATION.md. Lähetinalueiden julkaiseminen julkisessa observatoriossa on erillinen omistajan päätös ja on pois päältä: observatorio ei lue tätä moduulia, ja testi kiinnittää sen.
kshana interference-map locate input.csv --source adsb --dataset adsb-lol --out regions/
kshana interference-map locate day-dir/ --source adsb --dataset adsb-lol --out regions/ # readsb traces
kshana interference-map locate ais.csv --source ais --dataset kystverket --land land.geojson --out regions/
Valinnat: --levels 0.5,0.9,0.95, --cell-km, --session-gap-min, --emitter-height-m min,max, --ship-height-m (AIS), --tdoa fix.json (TDOA-paikannuksen fuusio; alla). Jokainen valinta, joka poikkeaa ennalta rekisteröidystä arvosta, ilmoitetaan sanoin ”ei ennalta rekisteröity menetelmä”. Tiedostoja ei koskaan ylikirjoiteta.
Malli. Raportit lokeroidaan yksiköihin (yksi ilma-alus tai alus yhdessä 2 minuutin lokerossa), kukin vaikutuksen alainen (ADS-B: vähintään puolella sen raporteista on matala NIC tai NACp kartan oman säännön mukaan; AIS: epäuskottava nopeus tai hyppy tai paikka rannikkoviivan sisämaan puolella) tai ei. Ilma-alus tai alus lasketaan vain, jos syötteessä on vähintään 5 hyvää raporttia (sama laitteiston lähtötason suoja kuin kartalla). Vaikutuksen alaiset yksiköt ryhmitellään istunnoiksi: yli 30 minuutin väli jakaa ajassa, ja aikaklusterin sisällä kaksi yksikköä kuuluu yhteen, kun yksi lähetin voisi olla molempien kantamalla. Jokaisella istunnolla jokainen ruudukon ehdokaspaikka saa uskottavuusfunktion arvon:
- Näköyhteys. Korkeudella
holeva ilma-alus ja lähetinantenni korkeudellah_enäkevät toisensa etäisyydelle4.122 (sqrt h + sqrt h_e)km asti 4/3-maapallon säteellä.h_emarginalisoidaan välille 2–100 m (8 logaritmisesti jaettua arvoa). - Teho. Lähettimen teho on tuntematon, joten tehollinen kantama 12 km:stä 426 km:iin (askeleet 1,25) tai ”vain näköyhteys” rajaa kantaman, marginalisoituna yhtäpainoisesti. Kantaman reuna on pehmeä: yksikkö lasketaan kantamalla olevaksi painolla, joka laskee lineaarisesti kummallakin puolella välillä, jonka pituus on 15% kantamasta (vähintään kolme neljäsosaa ruudukon solusta), koska maastoa, antennikuviota ja reittiä ei tunneta sitä tarkemmin.
- Vaikutuksen alaiset ja ulkopuoliset. Ilma-alus tai alus on herkkä todennäköisyydellä 0,6 (vastaanotinlaitteisto, antenni ja signaalireitti vaihtelevat), herkän ilma-aluksen kantaman sisällä oleva yksikkö on vaikutuksen alainen todennäköisyydellä 0,9, ja mikä tahansa muu yksikkö on vaikutuksen alainen taustatodennäköisyydellä 0,03 (muut syyt). Herkkyys on ilma-aluksen latentti ominaisuus, summattu pois ilma-alusta kohti, samoin pysyvä laitevika (todennäköisyys 0,03: kaikki kyseisen ilma-aluksen yksiköt ovat vaikutuksen alaisia missä tahansa se onkaan), mikä estää viallista transponderia vetämästä aluetta. Siksi vaikutuksen alainen ilma-alus vetää posteriorin kohti paikkoja, jotka yltäisivät siihen, ja vaikutuksen ulkopuolinen ilma-alus, jolla on näköyhteys, työntää vastaan paikkoja, jotka olisivat yltäneet siihen, enintään yhden ilma-aluksen painolla riippumatta siitä, kuinka monta raporttia se lähetti, kun taas vaikutuksen ulkopuolinen ilma-alus ilman näköyhteyttä ei kerro mitään.
- Maastoton. Maastoa, kanavointia ja diffraktiota ei mallinneta (maasto voi vain poistaa näköyhteyden).
- Temperointi. Log-uskottavuus kerrotaan luvulla 0,3 (tehoposteriori). Mallin todistusaineisto on riippuvaisempaa ja sen reunat vähemmän teräviä kuin uskottavuuden olettama riippumattomuus, ja synteettisellä datalla, jossa on nämä viat, temperoimattomat alueet sisälsivät todellisen lähteen selvästi harvemmin kuin ilmoitettu osuus; 0,3 valittiin vain synteettisellä datalla (johdanto on tiedostossa
docs/emitter-region/PREREGISTRATION.md, kohta 8).
Posteriori antaa suurimman tiheyden alueet ilmoitetuilla tasoilla (sisäkkäiset; polygonit reikineen tarvittaessa), posteriorilla painotetun painopisteen ja sen momenttiellipsin (skaalattu tasolle 95% gaussisen mallin mukaan; kalibroidut tasot ovat polygonit, ei ellipsi). Ruudukko on karkea (noin 5–10 km) koko alueella, ja jokainen massaa sisältävä karkea solu jaetaan 4 × 4. Kattavuusharha käsitellään ehdollistamalla sille, missä raportteja on: alue on leveä siellä, missä ilma-aluksia oli vähän, ja istunto, jonka 95% alue täyttää yli 80% hakualueestaan, raportoidaan tilana unconstrained, ilman painopistettä.
Istunnot ja profiili. Jokaisella julkaistulla istunnolla on alku, loppu, kesto, sellaisten 0.5 asteen solujen pinta-ala, joissa on vaikutuksen alainen yksikkö ja vähintään 5 erillistä ilma-alusta tai alusta, erilliset vaikutuksen alaiset ja havaitut määrät sekä vastatodiste (erilliset vaikutuksen ulkopuoliset, joilla on näköyhteys painopisteeseen; pidätetään alle 5). Istunto, jossa on alle 5 erillistä vaikutuksen alaista ilma-alusta tai alusta, pidätetään ja lasketaan. Profiili antaa UTC-tunnin mukaan erilliset vaikutuksen alaiset ilma-alukset (null alle 5) ja istuntoajan minuutit sekä istuntoajan tunnit UTC-päivää kohti.
Valinnainen TDOA-fuusio. --tdoa fix.json ottaa muodon {"receivers": [[lat, lon, height_m], ...], "tdoa_s": [...], "sigma_s": 1e-7, "start": [lat, lon]} (vähintään kolme vastaanotinta; tdoa_s[i] on vastaanotin i+1 miinus vastaanotin 0). Paikka ratkaistaan Maan pinnalla Gauss-Newtonilla funktiolla geolocation::tdoa_predict, sen kovarianssi on geolocation::tdoa_crlb_on_sphere, ja gaussinen kerrotaan posterioriin. Cramer-Rao-raja on mallin alaraja, ei mitattu tarkkuus.
Tulosteet (emitter-<source>-<dataset>-<day>): .geojson (MultiPolygon-alue tasoa ja istuntoa kohti, ellipsipolygoni, painopistepiste, joka kantaa ellipsinsä), -summary.json, -sessions.csv, -figure.svg. Jokainen sisältää aineiston lisenssin, lisenssin URL-osoitteen ja tekijänoikeusmerkinnän, menetelmätunnisteen kshana-interference-map/emitter-region/v1, jokaisen parametrin, oletukset ja rajoitukset, ja kantaa todistemerkintänsä (taso MODELLED, kirjanpitorivien tunnisteet; kuvan alla oleva kaista, rivit # evidence taulukossa, jäsen evidence JSONissa). Konetiedostot ovat englanniksi kielestä riippumatta; kuvateksti ja komentorivin rivit lokalisoidaan. Synteettinen esimerkki on kohteessa examples/emitter-region/ (regenerate.sh).
Yksityisyys ja sanamuoto. Mikään ilma-aluksen tai aluksen tunniste ei esiinny missään tulosteessa; raportin paikkaa ei piirretä; istunto vaatii vähintään 5 erillistä ilma-alusta tai alusta; alle 5 olevat määrät ovat null. Sanamuoto on neutraali: ”arvioitu lähetinalue”, ”häiriölähteen alue”. Alue ei ole kenenkään sijainti, ei ole syyn havainto eikä kerro mitään siitä, kuka tai mikä on lähteen takana; laajennettu sanamuototesti tarkistaa tulosteista toimijoiden, aikomuksen ja konfliktin sanat.
Rajoitukset. Uskottavuus on ehdollinen mallille. Synteettisellä datalla (generaattori, joka jakaa mallin, kantaman reunat 15% epävarmoja ilma-alusta kohti, pysyvät laitevikat, tuntematon teho ja tuntematon antennin korkeus) 95% alue sisälsi todellisen lähteen osuudessa 0,99 istunnoista (ilma-alusgeometria) ja osuudessa 1,00 (aluksen geometria) ja 50% alue osuudessa noin 0,77: tasot ovat konservatiivisia uskottavuuseksponentin 0,3 vuoksi, ja istunnon painopistevirheen mediaani on 23 km (ilma-alukset) ja 12 km (alukset). Kalibrointi tarkistetaan vain synteettisellä datalla; Jammertest-vertailu ennalta rekisteröitiin (emitter-region/PREREGISTRATION.md) ja ajettiin kerran: NOT ASSESSABLE molemmille lähteille (emitter-region/RESULTS.md). Yksi lähde istuntoa kohti; useat lähellä olevat lähteet näyttävät yhdeltä. Alueellinen syy (tähdistön katkos, avaruussää) antaa alueen, joka ei ole lähde. ADS-B antaa vähän raportteja vilkkaan ilmatilan ulkopuolella, ja vain noin neljännes readsb-jälkipisteistä kantaa NIC- ja NACp-arvon, joten harvat alueet antavat leveitä alueita tai ei aluetta (31% aluksen geometrian istunnoista oli unconstrained).
ADS-B-menetelmä (kshana-interference-map/adsb/v2)#
Jokainen ilmassa oleva ADS-B-raportti sisältää kaksi itse arvioitua navigoinnin laatukenttää: NIC (sijainnin sulkeumasäde) ja NACp (95 %:n tarkkuusraja, EPU). Kun aluksella oleva vastaanotin menettää satelliittiratkaisunsa tai lakkaa luottamasta siihen, molemmat laskevat, minkä vuoksi ne ovat häiriön tunnusmerkki. Ne laskevat myös muista syistä.
Ennalta rekisteröidyt parametrit (koodin vakioita, kirjoitetaan jokaiseen tiedostoon; muutos tarkoittaa uutta menetelmäversiota):
| Parametri | Arvo |
|---|---|
| Korkeusalaraja | barometrinen korkeus vähintään 5000 ft |
| Matalan tarkkuuden raportti | NACp enintään 6 (ilmoitettu EPU-raja on 556 m, 0,3 NM, tai suurempi, tai tuntematon) tai NIC enintään 5 (ilmoitettu sulkeumasäteen raja on 1852 m, 1 NM, tai suurempi, tai tuntematon) |
| Hyvä raportti | NACp vähintään 8 ja NIC vähintään 7; arvioidaan syötteen sisältämien kenttien perusteella (molemmat, kun molemmat ovat olemassa, muuten se, joka on) |
| Laitteiston lähtötaso | ilma-alus lasketaan soluun vain, jos sillä on samana päivänä vähintään 5 hyvää raporttia kyseisen solun ulkopuolella |
| Soluun otantaan tulleet ilma-alukset | vähintään 3 raporttia solussa |
| Solussa vaikutuksen alaiset ilma-alukset | vähintään 50 % sen solun raporteista on matalan tarkkuuden raportteja |
| Vähimmäisotanta | vähintään 10 otantaan tullutta ilma-alusta |
| Heikentynyt | vähintään 5 vaikutuksen alaista ilma-alusta, otantaan tulleiden ilma-alusten vaikutuksen alaisten osuus vähintään 0,30, ja vähintään 0,15 yli päivän solujen mediaaniosuuden |
| Sekoittunut päivä | solujen mediaaniosuus (vähintään 5 täyden otannan solun yli) vähintään 0,15: yhtäkään solua ei julisteta heikentyneeksi |
| Ei taustaa | alle 5 täyden otannan solua, joten mediaania ei voi arvioida: solu, joka täyttää kynnykset, on withheld_no_background, ei heikentynyt |
| Julkaisuminimi | vähintään 5 havaittua erillistä ilma-alusta |
Nämä arvot asetettiin NIC- ja NACp-koodien määritelmistä ja yksityisyyssäännöstä ennen kuin mitään dataa katsottiin. Niitä ei viritetty todellisella datalla, ja testit käyttävät vain synteettistä dataa. Solujen tilat: degraded, not_degraded, insufficient_sample (julkaistu, mutta alle 10 otantaan tullutta ilma-alusta), withheld_day_confounded ja withheld_no_background.
Versio 2. Versio 1 julisti solun heikentyneeksi jo 3 vaikutuksen alaisella ilma-aluksella, mikä on alle 5 ilma-aluksen julkaisuminimin, ja ohitti päivän taustatarkistuksen sanomatta sitä, kun alle 5 solua oli otannassa täysin. Versio 2 vaatii vähintään 5 vaikutuksen alaista ilma-alusta ja pidättää arvion (withheld_no_background), kun taustaa ei voi arvioida. Molemmat muutokset tiukentavat menetelmää (mikään, mikä ei ollut heikentynyt versiossa 1, ei ole heikentynyt versiossa 2); syynä on, ettei julkaistu arvio saa koskaan perustua pienempään ilma-alusmäärään kuin se määrä, jonka alapuolella lukumäärät pimitetään. Version 1 tiedostoja ei julkaistu.
Miksi tarkkuuskentät laskevat muista syistä kuin häiriöstä, ja kunkin suoja:
| Syy | Suoja |
|---|---|
| Vanhemmat transponderit, jotka eivät koskaan raportoi NIC:iä tai NACp:tä tai raportoivat ne kiinteällä matalalla arvolla | laitteiston lähtötaso: ilma-alusta, jolla ei ole hyviä raportteja muualla samana päivänä, ei lasketa |
| Matala korkeus ja pintaoperaatiot (maastopeitto, erilaiset paikkaformaatit) | korkeusalaraja; rivit, jotka on merkitty ground, suljetaan pois |
| MLAT tai muut ei-GNSS-paikat | suodatin source_type, kun sarake on olemassa |
| Yksi ilma-alus lähettää monta raporttia | lasketaan erilliset ilma-alukset, ei raportteja |
| Satelliittitähdistön tai täydennysjärjestelmän katko tai avaruussääilmiö, joka laskee tarkkuutta laajalla alueella | solun on ylitettävä päivän solujen mediaaniosuus marginaalilla, ja päivä, jonka mediaani on itsessään korkea, merkitään sekoittuneeksi eikä yhtäkään solua julisteta |
| Vika yhden ilma-aluksen laitteistossa | vaatii osuuden monesta erillisestä ilma-aluksesta ja vähimmäisotannan |
| Vähän ilma-aluksia solussa | vähimmäisotanta; kun havaintoja on alle 5, solua ei julkaista |
Mitä jää jäljelle: menetelmä ei osaa erottaa häiriötä alueellisesta syystä, joka on paikallinen eikä laaja (paikallinen satelliittigeometrian vaikutus tai maapohjaisen täydennysjärjestelmän katko näyttäisi samalta), ja se on varovainen yhteen suuntaan: ilma-alus, joka lentää koko päivän vain vaikutusalueen sisällä, ei saa lähtötasoa eikä sitä lasketa, joten pysyvät laajat alueet raportoidaan liian vähäisinä.
AIS-menetelmä (kshana-interference-map/ais/v2)#
Alusta ja päivää kohti viisi ilmaisinta. Ilmaisin täyttää ehdot solussa, kun se merkitsee vähintään 5 erillistä alusta, joiden osuus solussa havaituista aluksista on vähintään 20 %; solu on anomalous, jos jokin ilmaisin täyttää ehdot.
| Ilmaisin | Sääntö (ennalta rekisteröity) |
|---|---|
on_land |
vähintään 3 raporttia solussa yli 2000 m toimitetusta rantaviivasta sisämaahan |
circle |
20 peräkkäisen raportin ikkuna (askel 10, aukot enintään 30 min), jonka keskimääräinen säde keskipisteestä on 500 m – 20 km, säteen variaatiokerroin enintään 0,15, yksi kulkusuunta, jonka kokonaiskiertymä on vähintään 270 astetta (askeleet enintään 90 astetta, nettokiertymä vähintään 80 % kokonaiskiertymästä), ja keskinopeus vähintään 2 kn |
implausible_jump |
vähintään 2 hyppyä soluun saapuvana: peräkkäisiä ilmoituksia, joiden välimatka on vähintään 1000 m ja aikaero enintään 1 h ja joiden perusteella nopeus on yli 70 kn (laskettu nopeus käyttää ilmoitusten välillä vähintään 1 s, joten kaksi ilmoitusta samalla aikaleimalla ja vähintään 1 km:n päässä toisistaan olevissa paikoissa lasketaan hypyksi) |
implausible_speed |
vähintään 3 ilmoitettua nopeutta yli 70 kn solussa |
same_position |
vähintään 5 eri alusta ilmoittaa saman paikan (pyöristettynä 1e-4 asteen tarkkuuteen, noin 11 m) samassa 10 minuutin ikkunassa |
Soluja, joissa on alle 5 eri alusta, ei julkaista; jokainen merkittyjen alusten määrä alle 5, nolla mukaan lukien, ilmoitetaan arvona null.
Versio 2. Versio 1 hyväksyi ilmaisimen jo 3 merkitystä aluksesta ja julkaisi luvut 3 ja 4. Versio 2 nostaa merkittyjen alusten vähimmäismäärän arvoon 5, joka on julkaisun vähimmäismäärä, jotta päätös anomalous ei koskaan perustu pienempään alusmäärään kuin se, jonka alle lukuja ei julkaista. Tämä tiukentaa menetelmää, eikä versiosta 1 julkaistu yhtään tiedostoa.
Tunnetut väärien positiivisten syyt, joita osuussääntö ja kynnysarvot vähentävät mutta eivät poista: joissa, kanavissa ja satamissa olevat alukset karkean rantaviivan lähellä (siksi on olemassa 2 km:n sisämaapuskuri); kaksi samaa tunnistetta käyttävää alusta, mikä näyttää hypyiltä; transponderit, joilla on virheellinen paikkaratkaisu, sekä testilaitteet; ja luotsiveneiden ja etsintäalusten kierteleminen, joka voi muistuttaa kehiä. Mittakaavan 1:10 miljoonaa rantaviivatiedosto on tarkka noin kilometrin tarkkuudella.
Hyppy- ja nopeusilmaisimet vertaavat ilmoituksia yhden syötetiedoston sisällä; useaan tiedostoon tai päivään jakautunutta jälkeä ei yhdistetä.
Muisti. Syöte luetaan rivi kerrallaan, eikä sitä pidetä kokonaisena muistissa. ADS-B säilyttää vain ilma-aluskohtaiset solukohtaiset laskurit. AIS säilyttää jokaisen hyväksytyn ilmoituksen tiiviissä tietueessa (noin 40 tavua), kunnes sen päivä on arvioitu, joten muisti kasvaa syötteen AIS-ilmoitusten määrän mukana; jaa hyvin suuri AIS-syöte päivittäin.
Reitin altistuminen#
kshana route-exposure --route route.geojson --map out/ [--map other/] \
[--from 2026-03-01] [--to 2026-03-07] [--out report.json] [--json]
--route on GeoJSON-LineString (sellaisenaan, Feature-kohteessa tai FeatureCollection-kohteessa) tai CSV-tiedosto, jonka rivit ovat muotoa lat,lon. --map ottaa karttatiedostoja tai niiden hakemistoja, ja sen voi toistaa. Reittipisteet yhdistetään suorilla viivoilla leveys- ja pituusasteessa, joten tihennä pitkät osuudet; osuus kulkee pituusasteessa lyhintä tietä, joten antimeridiaanin (179,5 E – 179,5 W) ylittävä osuus ylittää sen. Reitti jaetaan noin 250 m:n paloihin. Jokainen pala mitataan omien kahden päätepisteensä välillä pallolla, jonka säde on 6371,0088 km (sama polku, joka ratkaisee, mihin soluun se kuuluu), ja se liitetään soluun, jossa sen keskipiste on.
Päivää ja lähdettä kohden raportti antaa reitin pituuden ja neljä osuutta, joiden summa on 1: share_degraded, share_not_degraded, share_unassessed (solu on olemassa mutta ilman päätöstä) ja share_not_observed (solua ei ole kartassa). Lue kaksi viimeistä yhdessä ensimmäisen kanssa: reittiä, jolla on pieni heikentynyt osuus ja suuri havaitsemattomien osuus, ei ole osoitettu vapaaksi. ADS-B- ja AIS-rivit raportoidaan erikseen, eikä niitä koskaan yhdistetä. Jokaisella rivillä on kartan lisenssi ja tekijänmerkintä.
Kirjastofunktiot#
Kutsujille, jotka pitävät dataa muistissa (sidokset, MCP-palvelin, selainversio), moduuli kshana::interference_map::api tarjoaa samat menetelmät niin, että sisään tulee teksti tai tavuja ja ulos JSON, eikä mitään tiedostoa tai verkkoa käytetä:
| Funktio | Syöte | Tuloste |
|---|---|---|
adsb_maps_from_csv(csv, &DatasetSpec, cell_deg) |
ADS-B CSV -teksti | Vec<DayMap> |
adsb_maps_from_readsb_traces(&[&[u8]], &DatasetSpec, cell_deg) |
yksi tavuviipale kutakin readsb-jälkitiedostoa kohden (gzip tai pelkkä) | Vec<DayMap> |
ais_maps_from_csv(csv, &DatasetSpec, cell_deg, Option<&str>) |
AIS CSV -teksti, valinnainen maa-alueen GeoJSON-teksti | Vec<DayMap> |
route_exposure(route_text, &[&str], from, to) |
reittiteksti, karttojen GeoJSON-tekstit, valinnaiset rajat YYYY-MM-DD |
kshana-route-exposure/v1 JSON |
Kohteella DayMap on file_name (<source>-<dataset>-<date>.geojson), date ja geojson (v1-asiakirja). DatasetSpec on Preset("adsb-lol" | "noaa-marinecadastre" | "kystverket") tai Custom { licence, licence_url, attribution }; DEFAULT_CELL_DEG on 0,5. Virheet ovat MapError. Aineistosäännöt (hyväksytyt esiasetukset, lisenssiteksti vaaditaan, lajin on vastattava) pätevät täsmälleen kuten komentorivillä.
Ulkoinen validointi#
tests/interference_map_reference.rs vertaa Kshanaa riippumattomiin toteutuksiin synteettisillä syötteillä; toleranssit on ennakkorekisteröity tiedostossa tests/fixtures/interference_map_ref/PREREGISTRATION.md: NIC- ja NACp-koodien merkitykset pyModeS-dekoodausta vastaan synteettisillä ADS-B-kehyksillä, AIS:n ei-saatavilla-arvot pyais-dekoodausta vastaan synteettisillä AIVDM-lauseilla, ruudukon solujen osoitus shapelya vastaan, reitin pituus solun tilaa kohden shapelya ja GeographicLibia vastaan sekä sisämaan peittäminen shapelya ja pyprojia vastaan. Kiinnitteet tuottaa scripts/gen_interference_map_ref.py; CI ei tarvitse Pythonia. Tämä validoi sen, miten koodit ja kenttäarvot luetaan, sekä geometrian. Se ei validoi sitä, että merkitty solu on häiriö.
Testit#
Kaikki testit käyttävät synteettistä generoitua dataa eivätkä verkkoa: yksikkötestit tiedostossa src/interference_map/ ja tests/interference_map_cli.rs komentojen päästä päähän -testaukseen, mukaan lukien se, ettei yksikään tunniste päädy tulosteeseen ja että hylkäykset eivät jätä tiedostoja jälkeensä.