Maskinoversettelse, ikke gjennomgått av en morsmålsbruker. Engelsk er referansen.

Mottakertillit og maritimtRediger på GitHubKilde: docs/INTERFERENCE-MAP.md

Interferenskart og eksponering langs rute

kshana interference-map bygger et bilde per dag av hvor fly og skip rapporterte degraderte navigasjonsdata, fra åpent lisensierte sporingsfiler du selv oppgir. kshana route-exposure forteller deretter hvor mye av en planlagt rute som lå innenfor de berørte cellene hver dag.

Hva dette er: en beskrivelse av hvordan publiserte posisjonsrapporter så ut på tidligere dager. Hva det ikke er: en måling av noen mottaker, en prognose eller et bevis på interferens. En degradert eller avvikende celle har flere mulige årsaker (oppført nedenfor), og en celle uten oppføring ble rett og slett ikke observert.

Alt kjører på lokale filer. Standardkommandoene åpner aldri en nettverksforbindelse; den ene valgfrie nedlastingshjelperen krever et eksplisitt flagg.

To syntetiske dager i interferenskartet, tegnet fra de innsjekkede eksemplene i examples/interference-map/output, hver med sin egen syntetiske rute og eksponeringsandelene motoren rapporterer. Til venstre en ADS-B-dag: 1 degradert celle, 6 ikke degradert, 4 uvurdert (skravert) og celler uten oppføring, tegnet tomme, som ikke ble observert. Ruten er 525 km: 11,5 % av lengden i degraderte celler, 38,3 % ikke degradert, 9,1 % uvurdert og 41,1 % ikke observert. Til høyre en AIS-dag: celler flagget av sirkel- og landdetektorene, ikke-avvikende celler og tomme celler; ruten er 454 km med 10,5 % i avvikende celler, 21,2 % ikke avvikende, 0,0 % uvurdert og 68,3 % ikke observert. ADS-B og AIS er separate lag og blir aldri slått sammen. En flagget celle er ikke et funn av interferens, og en celle uten farge ble ikke observert, noe som ikke er det samme som klar. Alle data er funnet på, i åpent hav midt i Atlanteren, og er ikke en måling.To syntetiske dager i interferenskartet, tegnet fra de innsjekkede eksemplene i examples/interference-map/output, hver med sin egen syntetiske rute og eksponeringsandelene motoren rapporterer. Til venstre en ADS-B-dag: 1 degradert celle, 6 ikke degradert, 4 uvurdert (skravert) og celler uten oppføring, tegnet tomme, som ikke ble observert. Ruten er 525 km: 11,5 % av lengden i degraderte celler, 38,3 % ikke degradert, 9,1 % uvurdert og 41,1 % ikke observert. Til høyre en AIS-dag: celler flagget av sirkel- og landdetektorene, ikke-avvikende celler og tomme celler; ruten er 454 km med 10,5 % i avvikende celler, 21,2 % ikke avvikende, 0,0 % uvurdert og 68,3 % ikke observert. ADS-B og AIS er separate lag og blir aldri slått sammen. En flagget celle er ikke et funn av interferens, og en celle uten farge ble ikke observert, noe som ikke er det samme som klar. Alle data er funnet på, i åpent hav midt i Atlanteren, og er ikke en måling.

Begge dagene er de syntetiske eksemplene i examples/interference-map/output/, hver med en syntetisk rute i examples/interference-map/input/; eksponeringsandelene er det kshana route-exposure skriver ut for dem. Ingenting i dem er et ekte sted, fly eller fartøy.

Data og lisenser#

Bare kildene som er gjennomgått i data/INTERFERENCE-DATA-SOURCES.md er innebygd, valgt med --dataset:

--dataset Type Lisens Lisensfelt i utdata
adsb-lol ADS-B ODbL 1,0 ODbL-1.0
noaa-marinecadastre AIS Amerikansk allmennhetsgods (CC0 1,0 ifølge utgiveren) allmennhetsgods
kystverket AIS NLOD 2,0 NLOD-2.0
custom begge deler det du oppgir --licence, --licence-url, --attribution påkrevd

Hver utdatafil har lisensen, lisens-URL-en, den påkrevde kildehenvisningen og kildens dekningsbegrensninger innebygd. Det finnes ingen innebygd oppføring for kilder hvis vilkår forbyr kommersiell bruk eller videredistribusjon av avledede kart.

ODbL og Kshana-utgavene. En ADS-B-fil per celle laget av data fra adsb.lol er en Derived Database og gis ut under ODbL 1,0; feltet licence i filen sier det. Kshanas egen kode forblir AGPL-3.0. Kommersielle utgaver av Kshana som skriver slike filer fører den samme merknaden, og alle som publiserer filen på nytt må beholde den. ADS-B- og AIS-resultater slås aldri sammen i én fil, så ODbL knyttes ikke til AIS-laget.

Dekningsskjevhet. Kart arver dekningen til kilden sin. adsb.lol følger frivillige mottakere, så åpent hav og tynt dekkede områder er sparsomt representert. Kystverkets åpne data utelater fiskefartøy under 15 m og fritidsfartøy under 45 m, så kartet gjenspeiler større skip. MarineCadastre dekker bare amerikanske farvann.

Identifikatorer. Inndatarader har en identifikator for fly eller fartøy. Den hashes i minnet med et tilfeldig salt per kjøring, brukes bare til å telle distinkte fly eller fartøy, og skrives, logges eller skrives ut aldri. Utdataene er aggregerte: ingen identifikator forekommer noe sted i dem.

Undertrykking. En celle med færre enn 5 distinkte fly eller fartøy observert den dagen publiseres ikke i det hele tatt, og for AIS rapporteres et flaggtall på én eller to i en publisert celle som null. Ingen publisert verdi kan peke ut et fly eller et fartøy.

Inndataformater#

Ren CSV med en overskriftsrad, kommaseparert, uten anførselstegn, UTC-tider. Kolonnerekkefølgen er fri; ukjente kolonner ignoreres. Et tidsstempel er Unix-sekunder eller YYYY-MM-DDTHH:MM:SS[.fff]Z. Rader som ikke kan tolkes telles i utdataenes metadata, de blir ikke stille droppet.

ADS-B (kshana interference-map adsb):

Kolonne Påkrevd Betydning
timestamp ja rapporttidspunkt
aircraft_id ja ugjennomsiktig identifikator (hashes, lagres aldri)
lat, lon ja grader
alt_baro_ft ja høyde i fot; ground eller tom utelater raden
nic, nacp minst én heltall 0 til 11; tom betyr ikke rapportert
source_type nei hvis til stede brukes bare verdier som begynner med adsb (MLAT, TIS-B og lignende utelates)

adsb.lol readsb-historikk, lest direkte. Dagsarkivene er en delt tar-fil av readsb-sporfiler. Pakk ut ett slik utgiveren beskriver (sett delene sammen, tar -xf -), og gi deretter Kshana den utpakkede mappen, én enkelt trace_full_*.json-fil eller en CSV:

kshana interference-map adsb extracted-day/ --dataset adsb-lol --out maps/

En mappe søkes gjennom rekursivt etter trace_full_*-filer (andre filer, som trace_recent_*, ignoreres, og symbolske lenker følges ikke). Hver fil er gzip-komprimert eller ren JSON, oppdaget fra de første bytene, fordi readsb skriver gzip under et .json-navn; dekomprimeringen er begrenset til 512 MiB per fil. Fra hver sporoppføring leser Kshana tidsforskyvningen, breddegrad, lengdegrad, høyde (markøren ground utelater oppføringen), feltene nic og nac_p i flyets detaljobjekt, og strengen for posisjonskilde (oppføringer fra noe annet enn ADS-B utelates). En oppføring uten detaljobjekt har ingen nøyaktighetsfelt og telles som utelatt. En fil som ikke kan leses telles i trace_files_unreadable i utdataenes metadata og hoppes over.

AIS (kshana interference-map ais):

Kolonne Påkrevd Betydning
timestamp ja rapporttidspunkt
vessel_id ja ugjennomsiktig identifikator (hashes, lagres aldri)
lat, lon ja grader; AIS-verdiene for «ikke tilgjengelig» og (0, 0) forkastes
sog_kn nei fart over grunnen i knop; 102,3 (ikke tilgjengelig) behandles som manglende

Detektoren for landposisjon trenger en landpolygonfil (--land): GeoJSON Polygon eller MultiPolygon. Natural Earths landlag i 1:10 millioner (allmennhetsgods) er den tiltenkte filen. Uten --land er detektoren av, og utdataene sier det. Slik laster du den ned (den eneste nettverkstilgangen i denne funksjonen):

kshana interference-map fetch-land --out ne_10m_land.geojson --allow-network

Dette kjører systemets curl (som en argumentliste, ikke gjennom et skall) over HTTPS, én gang, for én fil på en fast adresse som navngir en enkelt commit i oppstrøms repositoriet. Nedlastingen beholdes bare hvis SHA-256 er lik verdien som er festet i koden; avvik sletter den og gir feil. Hvis curl ikke er installert, sier kommandoen fra om det og oppgir adressen og sjekksummen, slik at filen kan hentes for hånd. Ingenting er medlevert i repositoriet.

Utdata#

Én GeoJSON-fil per kilde per UTC-dag, i mappen --out, med navnet <source>-<dataset>-<YYYY-MM-DD>.geojson, der <source> er adsb eller ais, <dataset> er nøkkelen --dataset (adsb-lol, noaa-marinecadastre, kystverket eller custom), og datoen er UTC-dagen til rapportene: adsb-adsb-lol-2026-03-01.geojson, ais-kystverket-2026-03-01.geojson. Datasettet står i navnet slik at to datasett av samme type ikke kan dele en fil, og Kshana overskriver aldri en fil: hvis noe mål finnes, feiler kommandoen før den skriver noe. CLI-et skriver ut én linje per fil det skriver. En leser kan hente ut de tre delene med ^(adsb|ais)-(.+)-(\d{4}-\d{2}-\d{2})\.geojson$; den samme informasjonen ligger inne i filen (source_kind, data.dataset, date). Syntetiske eksempelfiler, én per kilde, ligger i examples/interference-map/output/, sammen med kommandoen som lager dem på nytt, til bruk ved bygging og testing av en visning. Et medlem på toppnivå, kshana_interference_map, holder skjemanavnet, datoen, rutenettet, metode-id-en og alle parametere, tallene på dagsnivå, datalisensen og kildehenvisningen, og en merknad. Hvert objekt er en cellepolygon med cell_i, cell_j, status, degraded og de aggregerte antallene.

Rutenettet er fast: kvadratiske celler på --cell-deg grader (standard 0,5) i breddegrad og lengdegrad, indeksert fra (-90, -180). Bredden i øst-vest-retning krymper med breddegraden: omtrent 55 km ved ekvator og omtrent 28 km ved 60 grader for standardverdien. Breddegrad 90 hører til den siste raden, og lengdegrad 180 er den samme meridianen som -180. De forhåndsregistrerte metodene er definert på rutenettet med 0,5 grader. En annen --cell-deg kjører, men er ikke den forhåndsregistrerte metoden: CLI-et sier det, og filen registrerer grid.preregistered_cell_deg og grid.is_preregistered (false) slik at en visning også kan si det.

Tilbakeholdte antall. Hvert antall per celle under publiseringsminimumet (5) er null, også null, så null betyr aldri «ingen», og ingen publisert verdi kan peke ut et fly eller et fartøy. Feltene status og degraded oppgis likevel. I ADS-B-filer er aircraft_observed alltid minst 5 for en publisert celle; aircraft_sampled og aircraft_affected er null under 5, og affected_share er null med mindre begge er minst 5 (en andel ville avslørt et tilbakeholdt antall). I AIS-filer er hver oppføring i vessels_flagged null under 5.

Formatversjon og felt#

Formatet er fastsatt som schema: "kshana-interference-map/v1", format_version: 1. En endring som fjerner eller omdøper et felt, eller endrer hva et felt betyr, øker versjonen; å legge til et felt gjør det ikke, så en leser må ignorere felt den ikke kjenner. Et antall som er null er tilbakeholdt, ikke null.

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[]

status-verdier: ADS-B degraded, not_degraded, insufficient_sample, withheld_day_confounded, withheld_no_background; AIS anomalous, not_anomalous. degraded er true bare for degraded og anomalous. Rapporten for rute-eksponering har sitt eget skjema, kshana-route-exposure/v1.

Observatoriet: dagsproduktet#

kshana interference-map daily gjør én UTC-dag med ADS-B-rapporter om til observatoriets tre filer (GeoJSON, PNG og en JSON med hendelsesrapport) og et hash-manifest, og kshana interference-map sensitivity spiller av den dagen på nytt under endringer av de forhåndsregistrerte parameterne, én om gangen. Kommandoen håndhever utgivelsesreglene: minst 24 timer etter at dagen er slutt (--delay-hours kan bare økes), celler på 0,5 grader eller grovere, bare tre tilstander (degraded, not_degraded, not_observed), ingen årsak tilskrevet og ingen OpenSky-data. Metodenotatet, filformatene og begrensningene står i observatory/METHOD.md. En regional kjøring (--bbox south,west,north,east) leser bare rapportene i boksen og sier det i filen.

Spesifikasjon for kartsiden i Studio#

For kartsiden i Studio, som laster en GeoJSON-fil brukeren oppgir (siden er bygd i Studio-kilden, ikke i dette repositoriet). Ingenting lastes opp: filen leses i nettleseren, og siden sender ingen forespørsel til noen datakilde.

Lese en fil. Godta en fil bare hvis kshana_interference_map.schema begynner med kshana-interference-map/ og format_version er et tall siden støtter; ellers sier du at filen ikke er et støttet interferenskart fra Kshana. Les feltene som er oppført ovenfor; ignorer ukjente. En fil holder én kilde og én dag. Flere filer kan lastes.

Celler. Tegn polygonen til hvert objekt. Farg etter status, og si alltid hva hver farge betyr i en tegnforklaring. Fire tilstander, og ingen av dem må skjules eller slås sammen:

Tilstand Betydning Hvor den kommer fra
Degradert (eller avvikende for AIS) en høy andel av flyene rapporterte lav nøyaktighet, eller fartøyene viste avvik, den dagen degraded er true
Klar observert med nok fly eller fartøy og ikke flagget status er not_degraded eller not_anomalous
Uvurdert observert, men for få utvalgte fly, dagen var forstyrret, eller dagens bakgrunn kunne ikke estimeres status er insufficient_sample, withheld_day_confounded eller withheld_no_background
Ikke observert for få fly eller fartøy, så cellen ble ikke publisert ingen objekt for den cellen

«Ikke observert» er fraværet av et objekt: tegn det nøytralt (uten fyll, eller med skravur), aldri i fargen til «klar». Bruk et fargeskjema som ikke bare er avhengig av rødt mot grønt. Celledetaljer ved hold over eller valg viser antallene i properties slik de er oppgitt, og hvert null-antall som «tilbakeholdt (færre enn 5)», aldri som null. En visning bør også si, når grid.is_preregistered er false, at filen bruker en cellestørrelse utenfor den forhåndsregistrerte metoden.

Lag. ADS-B og AIS er separate lag med egne brytere, tegnforklaringer og lisenslinjer. Slå dem aldri sammen til ett fargefelt eller ett antall, tegn dem aldri som én kombinert celle, og summer aldri cellene deres. Ulike dager er ulike filer: vis én dag om gangen, med en dagsvelger, i stedet for å legge dager oppå hverandre.

Lisens og kildehenvisning. For hvert synlige lag vises, på kartet og i enhver eksport eller skjermdump, teksten i data.attribution ordrett, data.licence med en lenke til data.licence_url, og data.coverage_notes. Hvis et ADS-B-lag vises, gjelder ODbL-lisensen bare for det laget. Ikke tilby å eksportere en kombinert fil.

Metode. Tilby metode-id-en og parameterne (method.id, method.parameters) og tallene i day i et detaljpanel, inkludert day_confounded (si rett ut at ingen celle ble kalt degradert på grunn av dagens bakgrunn) og input_stats.

Forbehold som skal beholdes (vis filens egne method.caveats og notice, og hold denne ordlyden eller en tilsvarende synlig sammen med kartet):

  • En degradert eller avvikende celle er ikke et funn av interferens. Andre årsaker finnes.
  • En celle uten farge ble ikke observert. Det er ikke bevis for at området var klart.
  • Dette er en beskrivelse av tidligere posisjonsrapporter, ikke en prognose og ikke en måling av noen mottaker.
  • Dekningen følger datakilden; les dekningsnotatene.

Siden må ikke navngi eller vise noe enkeltstående fly eller fartøy, og filene inneholder ingen.

Eksponering langs rute. Hvis siden også laster en kshana-route-exposure/v1-rapport, vis radene per dag og kilde med alle de fire andelene (degradert, klar, uvurdert, ikke observert) sammen, aldri den degraderte andelen alene, i tillegg til rapportens caveats, og hver rads map_licence og map_attribution.

Senderregion (interference-map locate)#

kshana interference-map locate estimerer hvor en interferenskilde kan befinne seg fra de samme åpne ADS-B- eller AIS-rapportene: en region ved oppgitte konfidensnivåer, et tyngdepunkt med en usikkerhetsellipse og øktene i tid. Den returnerer aldri et bart punkt. MODELLED (registerrad VM-bc70cb57): fysikken er lærebokens radiosiktlinje, regionenes troverdighet er betinget av modellen, og den eneste eksterne kontrollen er Jammertest-sammenligningen forhåndsregistrert i emitter-region/PREREGISTRATION.md. Publisering av senderregioner i det offentlige observatoriet er en egen avgjørelse for eieren og er av: observatoriet leser ikke denne modulen, og en test låser det.

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/

Alternativer: --levels 0.5,0.9,0.95, --cell-km, --session-gap-min, --emitter-height-m min,max, --ship-height-m (AIS), --tdoa fix.json (fusjoner en TDOA-posisjonsbestemmelse; se under). Ethvert alternativ som avviker fra den forhåndsregistrerte verdien kunngjøres som «ikke den forhåndsregistrerte metoden». Filer overskrives aldri.

Modell. Rapporter samles i enheter (ett fly eller ett fartøy i én 2-minutters kasse), hver berørt (ADS-B: minst halvparten av rapportene har lav NIC eller NACp etter kartets egen regel; AIS: en usannsynlig fart eller et sprang, eller en posisjon inne i landet bortenfor kystlinjen) eller ikke. Et fly eller fartøy teller bare med minst 5 gode rapporter i inndataene (den samme vakten for utstyrsgrunnlinje som kartet). Berørte enheter grupperes i økter: et gap på mer enn 30 minutter deler i tid, og innenfor en tidsklynge hører to enheter sammen når én sender kunne vært innen rekkevidde av begge. For én økt får hver kandidatposisjon på et rutenett en sannsynlighet:

  • Siktlinje. Et fly i høyde h og en senderantenne ved h_e ser hverandre ut til 4.122 (sqrt h + sqrt h_e) km på en 4/3-jordradius. h_e marginaliseres over 2 til 100 m (8 logaritmisk fordelte verdier).
  • Effekt. Senderens effekt er ukjent, så en effektiv rekkevidde fra 12 km til 426 km (trinn på 1,25) eller «bare siktlinje» begrenser rekkevidden, marginalisert med lik vekt. Kanten av rekkevidden er myk: en enhet teller som innen rekkevidde med en vekt som faller lineært over 15 % av rekkevidden på hver side (minst tre fjerdedeler av en rutenettcelle), fordi terreng, antennemønster og vei ikke er kjent bedre enn det.
  • Berørt og uberørt. Et fly eller fartøy er mottakelig med sannsynlighet 0,6 (mottakerutstyr, antenne og signalvei er ulike), en enhet av et mottakelig innen rekkevidde er berørt med sannsynlighet 0,9, og enhver annen enhet er berørt med bakgrunnssannsynligheten 0,03 (andre årsaker). Mottakelighet er en latent egenskap ved flyet, summert ut per fly, det samme er en vedvarende utstyrsfeil (sannsynlighet 0,03: alle enhetene til det flyet er berørt uansett hvor det er), noe som hindrer en defekt transponder i å dra regionen. Så et berørt fly drar posterioren mot posisjoner som når det, og et uberørt fly med siktlinje presser mot posisjoner som ville ha nådd det med høyst ett flys verdi, uansett hvor mange rapporter det sendte, mens et uberørt fly uten siktlinje ikke sier noe.
  • Terrengfri. Terreng, ducting og diffraksjon er ikke modellert (terreng kan bare fjerne siktlinje).
  • Temperering. Log-sannsynligheten ganges med 0,3 (en potensposterior). Modellens evidens er mer avhengig og kantene mindre skarpe enn uavhengigheten sannsynligheten antar, og på syntetiske data med de feilene holdt de utemperte regionene den sanne kilden langt under sin oppgitte rate; 0,3 ble valgt bare på syntetiske data (utledningen står i docs/emitter-region/PREREGISTRATION.md, avsnitt 8).

Posterioren gir regioner med høyest tetthet ved de oppgitte nivåene (nøstede; polygoner med hull der det trengs), det posteriorvektede tyngdepunktet og dets momentellipse (skalert til 95 % under en gaussisk; polygonene, ikke ellipsen, er de kalibrerte nivåene). Rutenettet er grovt (omtrent 5 til 10 km) over hele domenet, og hver grov celle som holder masse deles 4 ganger 4. Dekningsskjevhet håndteres ved å betinge på hvor rapporter finnes: en region er bred der få fly var til stede, og en økt hvis region på 95 % fyller mer enn 80 % av søkedomenet rapporteres unconstrained uten tyngdepunkt.

Økter og profil. Hver publiserte økt har start, slutt, varighet, arealet av cellene på 0.5 grader som holder en berørt enhet og minst 5 distinkte fly eller fartøyer, antallet distinkte berørte og observerte, og motevidensen (distinkte uberørte med siktlinje til tyngdepunktet; holdt tilbake under 5). En økt med færre enn 5 distinkte berørte fly eller fartøyer holdes tilbake og telles. Profilen gir, per UTC-time i døgnet, de distinkte berørte flyene (null under 5) og minuttene med øktid, og timer med øktid per UTC-døgn.

Valgfri TDOA-fusjon. --tdoa fix.json tar {"receivers": [[lat, lon, height_m], ...], "tdoa_s": [...], "sigma_s": 1e-7, "start": [lat, lon]} (minst tre mottakere; tdoa_s[i] er mottaker i+1 minus mottaker 0). Posisjonen løses på jordoverflaten med Gauss-Newton på geolocation::tdoa_predict, kovariansen er geolocation::tdoa_crlb_on_sphere, og gaussen multipliseres inn i posterioren. Cramer-Rao-grensen er en nedre grense på en modell, ikke en målt nøyaktighet.

Utdata (emitter-<source>-<dataset>-<day>): .geojson (MultiPolygon-region per nivå og økt, ellipsepolygonet, tyngdepunktet med ellipsen sin), -summary.json, -sessions.csv, -figure.svg. Hver bygger inn datasettets lisens, lisens-URL og kildeangivelse, metode-id-en kshana-interference-map/emitter-region/v1, hver parameter, forutsetningene og begrensningene, og bærer sin evidensetikett (nivå MODELLED, rad-id-er i registeret; stripen under figuren, linjer # evidence i tabellen, et medlem evidence i JSON). Maskinfiler er engelske uansett språk; figurteksten og linjene på kommandolinjen er lokalisert. Et syntetisk eksempel finnes i examples/emitter-region/ (regenerate.sh).

Personvern og ordlyd. Ingen identifikator for fly eller fartøy vises i noen utdata; ingen rapportposisjon tegnes; en økt trenger minst 5 distinkte fly eller fartøyer; antall under 5 er null. Ordlyden er nøytral: «estimert senderregion», «kilderegion for interferens». En region er ikke posisjonen til noen, er ikke et funn om årsaken og sier ingenting om hvem eller hva som står bak en kilde; den utvidede ordlydstesten kontrollerer utdataene for ord om aktører, hensikt og konflikt.

Begrensninger. Troverdigheten er betinget av modellen. På syntetiske data (en generator som deler modellen, med kanter av rekkevidden usikre med 15 % per fly, vedvarende utstyrsfeil, ukjent effekt og ukjent antennehøyde) holdt regionen på 95 % den sanne kilden i 0,99 (flygeometri) og 1,00 (skipsgeometri) av øktene og regionen på 50 % i omtrent 0,77: nivåene er konservative, på grunn av sannsynlighetseksponenten på 0,3, og tyngdepunktsfeilen for en økt har en median på 23 km (fly) og 12 km (skip). Kalibreringen er bare kontrollert på syntetiske data; Jammertest-sammenligningen ble forhåndsregistrert (emitter-region/PREREGISTRATION.md) og kjørt én gang: NOT ASSESSABLE for begge kilder (emitter-region/RESULTS.md). Én kilde per økt; flere nære kilder ser ut som én. En regional årsak (et konstellasjonsutfall, romvær) gir en region som ikke er en kilde. ADS-B gir få rapporter utenfor travelt luftrom, og bare omtrent en fjerdedel av readsb-sporpunktene bærer NIC og NACp, så tynt dekkede områder gir brede eller ingen regioner (31 % av øktene med skipsgeometri var unconstrained).

ADS-B-metode (kshana-interference-map/adsb/v2)#

Hver ADS-B-rapport fra fly i luften har to selvvurderte felt for navigasjonskvalitet: NIC (innesluttingsradius for posisjonen) og NACp (grensen for 95 % nøyaktighet, EPU). Når mottakeren om bord mister eller ikke stoler på satellittposisjonen sin, faller begge, og derfor bærer de en signatur for interferens. De faller også av andre årsaker.

Forhåndsregistrerte parametere (konstanter i koden, skrevet inn i hver fil; en endring betyr en ny metodeversjon):

Parameter Verdi
Høydegrense barometrisk høyde på minst 5000 fot
Rapport med lav nøyaktighet NACp på høyst 6 (den rapporterte EPU-grensen er 556 m, 0,3 NM, eller større, eller ukjent) eller NIC på høyst 5 (den rapporterte grensen for innesluttingsradius er 1852 m, 1 NM, eller større, eller ukjent)
God rapport NACp på minst 8 og NIC på minst 7; bedømt på feltene inndataene har (begge når begge finnes, ellers det som finnes)
Utstyrsgrunnlinje et fly teller i en celle bare med minst 5 gode rapporter utenfor den cellen samme dag
Fly i utvalget i en celle minst 3 rapporter i cellen
Berørte fly i en celle minst 50 % av rapportene i cellen er av lav nøyaktighet
Minste utvalg minst 10 fly i utvalget
Degradert minst 5 berørte fly, en berørt andel av flyene i utvalget på minst 0,30, og minst 0,15 over dagens median for cellenes andel
Forstyrret dag medianandel for celler (over minst 5 celler med fullt utvalg) på minst 0,15: ingen celle erklæres degradert
Ingen bakgrunn færre enn 5 celler med fullt utvalg, så medianen kan ikke estimeres: en celle som når tersklene er withheld_no_background, ikke degradert
Publiseringsminimum minst 5 distinkte fly observert

Disse verdiene ble fastsatt ut fra definisjonene av NIC- og NACp-kodene og fra personvernregelen før noen data ble sett på. De ble ikke tunet på ekte data, og testene bruker bare syntetiske data. Cellestatuser: degraded, not_degraded, insufficient_sample (publisert, men færre enn 10 fly i utvalget), withheld_day_confounded og withheld_no_background.

Versjon 2. Versjon 1 erklærte en celle degradert fra så få som 3 berørte fly, færre enn publiseringsminimumet på 5 fly, og hoppet over kontrollen av dagens bakgrunn uten å si fra når færre enn 5 celler var fullt utvalgt. Versjon 2 krever minst 5 berørte fly og holder tilbake vurderingen (withheld_no_background) når bakgrunnen ikke kan estimeres. Begge endringene strammer inn metoden (ingenting som ikke var degradert i versjon 1 er degradert i versjon 2); grunnen er at en publisert vurdering aldri må hvile på færre fly enn tallet som antall holdes tilbake under. Filer fra versjon 1 ble ikke gitt ut.

Hvorfor nøyaktighetsfeltene faller av andre årsaker enn interferens, og vernet mot hver:

Årsak Vern
Eldre transpondere som aldri rapporterer NIC eller NACp, eller rapporterer dem med en fast lav verdi utstyrsgrunnlinjen: et fly uten gode rapporter andre steder den dagen telles ikke
Lav høyde og operasjoner på bakken (terrengskygging, andre posisjonsformater) høydegrense; rader markert ground utelates
MLAT eller andre posisjoner som ikke er fra GNSS source_type-filter når kolonnen finnes
Ett fly som sender mange rapporter distinkte fly telles, ikke rapporter
Et konstellasjons- eller utvidelsesavbrudd, eller en romværhendelse, som senker nøyaktigheten over et stort område cellen må overstige dagens median for cellenes andel med en margin, og en dag der medianen selv er høy markeres som forstyrret og erklærer ingen celle
En feil i utstyret til ett fly krever en andel av mange distinkte fly, med et minste utvalg
Få fly i cellen minste utvalg; under 5 observert publiseres ikke cellen

Det som gjenstår: metoden kan ikke skille interferens fra en regional årsak som er lokal snarere enn utbredt (en lokal effekt av satellittgeometri eller et avbrudd i bakkebasert utvidelse ville sett likt ut), og den er konservativ i én retning: et fly som bare flyr innenfor et berørt område hele dagen har ingen grunnlinje og telles ikke, så vedvarende store områder underrapporteres.

AIS-metode (kshana-interference-map/ais/v2)#

Per fartøy per dag, fem detektorer. En detektor kvalifiserer i en celle når den flagger minst 5 distinkte fartøy som utgjør minst 20 % av fartøyene observert der; cellen er anomalous hvis en detektor kvalifiserer.

Detektor Regel (forhåndsregistrert)
on_land minst 3 rapporter i cellen mer enn 2000 m inne på land fra den oppgitte kystlinjen
circle et vindu på 20 påfølgende rapporter (steg 10, mellomrom på høyst 30 min) der gjennomsnittsradius fra tyngdepunktet er 500 m til 20 km, variasjonskoeffisienten for radius er høyst 0,15, én bevegelsesretning med total svingning på minst 270 grader (steg på høyst 90 grader, netto minst 80 % av totalen), og gjennomsnittsfart på minst 2 kn
implausible_jump minst 2 hopp som kommer inn i cellen: påfølgende rapporter minst 1000 m fra hverandre, høyst 1 time mellom, som antyder mer enn 70 kn (den antydede farten bruker minst 1 s mellom rapportene, så to rapporter med samme tidsstempel og posisjoner 1 km eller mer fra hverandre teller som et hopp)
implausible_speed minst 3 rapporterte farter over 70 kn i cellen
same_position minst 5 distinkte fartøy som rapporterer samme posisjon (avrundet til 1e-4 grader, omtrent 11 m) i det samme 10-minuttersvinduet

Celler med færre enn 5 distinkte fartøy publiseres ikke; hvert flaggtall under 5, også null, rapporteres som null.

Versjon 2. Versjon 1 lot en detektor kvalifisere fra 3 flaggede fartøy og publiserte antall på 3 og 4. Versjon 2 hever minimumet for flaggede fartøy til 5, publiseringsminimumet, slik at en anomalous-vurdering aldri hviler på færre fartøy enn tallet som antall holdes tilbake under. Dette strammer inn metoden, og ingen fil fra versjon 1 ble gitt ut.

Kjente årsaker til falske positive, som andelsregelen og tersklene reduserer, men ikke fjerner: fartøy i elver, kanaler og havner nær en grov kystlinje (bufferen på 2 km inne på land finnes for dette); to fartøy som deler én identifikator, noe som ser ut som hopp; transpondere med dårlig posisjonsbestemmelse eller testutstyr; og kretsing fra losbåter og søkefartøy, som kan likne sirkler. En kystlinjefil på 1:10 millioner er nøyaktig til omtrent en kilometer.

Hopp- og fartsdetektorene sammenligner rapporter innenfor én inndatafil; et spor som er delt over filer eller dager sys ikke sammen.

Minne. Inndata leses linje for linje og holdes aldri samlet. ADS-B beholder bare tellere per fly per celle. AIS beholder hver godtatte rapport i en kompakt post (omtrent 40 bytes) til dagen er evaluert, så minnebruken vokser med antallet AIS-rapporter i inndataene; del en svært stor AIS-inndata opp etter dag.

Eksponering langs rute#

kshana route-exposure --route route.geojson --map out/ [--map other/] \
    [--from 2026-03-01] [--to 2026-03-07] [--out report.json] [--json]

--route er en GeoJSON LineString (alene, i en Feature eller i en FeatureCollection) eller en CSV med lat,lon-linjer. --map tar kartfiler eller mapper med dem, og kan gjentas. Veipunkter forbindes med rette linjer i breddegrad og lengdegrad, så fortett lange etapper; en etappe tar korteste vei rundt i lengdegrad, så en som krysser antimeridianen (179,5 Ø til 179,5 V) krysser den. Ruten deles i biter på omtrent 250 m. Hver bit måles mellom sine egne to endepunkter på en kule med radius 6371,0088 km (den samme veien som avgjør hvilken celle den ligger i) og knyttes til cellen som rommer midtpunktet.

Per dag og per kilde gir rapporten rutelengden og fire andeler som summerer til 1: share_degraded, share_not_degraded, share_unassessed (celle til stede, men uten vurdering) og share_not_observed (celle fraværende fra kartet). Les de to siste sammen med den første: en rute med lav degradert andel og høy andel ikke observert er ikke vist å være klar. ADS-B- og AIS-rader rapporteres hver for seg og slås aldri sammen. Hver rad har kartets lisens og kildehenvisning.

Bibliotekfunksjoner#

For kallere som har data i minnet (bindinger, MCP-serveren, nettleserbygget) tilbyr modulen kshana::interference_map::api de samme metodene med tekst eller bytes inn og JSON ut, uten å røre noen fil og uten nettverk:

Funksjon Inn Ut
adsb_maps_from_csv(csv, &DatasetSpec, cell_deg) ADS-B CSV-tekst Vec<DayMap>
adsb_maps_from_readsb_traces(&[&[u8]], &DatasetSpec, cell_deg) ett byte-utsnitt per readsb-sporfil (gzip eller ren) Vec<DayMap>
ais_maps_from_csv(csv, &DatasetSpec, cell_deg, Option<&str>) AIS CSV-tekst, valgfri land-GeoJSON-tekst Vec<DayMap>
route_exposure(route_text, &[&str], from, to) rutetekst, kart-GeoJSON-tekster, valgfrie YYYY-MM-DD-grenser kshana-route-exposure/v1 JSON

Et DayMap har file_name (<source>-<dataset>-<date>.geojson), date og geojson (v1-dokumentet). DatasetSpec er Preset("adsb-lol" | "noaa-marinecadastre" | "kystverket") eller Custom { licence, licence_url, attribution }; DEFAULT_CELL_DEG er 0,5. Feil er MapError. Datasettreglene (klarerte forhåndsinnstillinger, lisenstekst påkrevd, typen må stemme) gjelder nøyaktig som på kommandolinjen.

Ekstern validering#

tests/interference_map_reference.rs sammenligner Kshana med uavhengige implementeringer på syntetiske inndata, med toleranser som er forhåndsregistrert i tests/fixtures/interference_map_ref/PREREGISTRATION.md: betydningen av NIC- og NACp-kodene mot pyModeS-dekoding av syntetiske ADS-B-rammer, AIS-verdier for «ikke tilgjengelig» mot pyais-dekoding av syntetiske AIVDM-setninger, celletilordning i rutenettet mot shapely, rutelengde per celletilstand mot shapely og GeographicLib, og maskering av land mot shapely og pyproj. Testdataene lages av scripts/gen_interference_map_ref.py; CI trenger ikke Python. Dette validerer hvordan kodene og feltverdiene leses, og geometrien. Det validerer ikke at en flagget celle er interferens.

Tester#

Alle tester bruker syntetisk genererte data og ingen nettverk: enhetstester i src/interference_map/, og tests/interference_map_cli.rs for kommandoene fra ende til ende, blant annet at ingen identifikator når en utdatafil og at avslag ikke etterlater filer.