Machinevertaling, niet beoordeeld door een moedertaalspreker. Engels is de referentie.

Ontvangervertrouwen en maritiemBewerken op GitHubBron: docs/INTERFERENCE-MAP.md

Interferentiekaart en blootstelling van routes

kshana interference-map bouwt een beeld per dag van waar vliegtuigen en schepen verslechterde navigatiegegevens meldden, uit open gelicentieerde trackingbestanden die u aanlevert. kshana route-exposure geeft vervolgens aan hoeveel van een geplande route op elke dag binnen de getroffen cellen lag.

Wat dit is: een beschrijving van hoe gepubliceerde positiemeldingen op eerdere dagen eruitzagen. Wat het niet is: een meting van enige ontvanger, een voorspelling of bewijs van interferentie. Een gedegradeerde of afwijkende cel kan meerdere mogelijke oorzaken hebben (hieronder vermeld), en een cel zonder item is eenvoudig niet waargenomen.

Alles draait op lokale bestanden. De standaardopdrachten openen nooit een netwerkverbinding; het ene optionele downloadhulpprogramma vereist een expliciete vlag.

Twee synthetische dagen van de interferentiekaart, getekend uit de vastgelegde voorbeelden in examples/interference-map/output, elk met een eigen synthetische route en de aandelen van route-exposure die de engine rapporteert. Links een ADS-B-dag: 1 gedegradeerde cel, 6 niet gedegradeerd, 4 niet beoordeeld (gearceerd) en cellen zonder item, leeg getekend, die niet zijn waargenomen. De route is 525 km: 11,5% van de lengte in gedegradeerde cellen, 38,3% niet gedegradeerd, 9,1% niet beoordeeld en 41,1% niet waargenomen. Rechts een AIS-dag: cellen gemarkeerd door de cirkel- en op-land-detectoren, niet-afwijkende cellen en lege cellen; de route is 454 km met 10,5% in afwijkende cellen, 21,2% niet afwijkend, 0,0% niet beoordeeld en 68,3% niet waargenomen. ADS-B en AIS zijn afzonderlijke lagen, nooit gecombineerd. Een gemarkeerde cel is geen constatering van interferentie, en een cel zonder kleur is niet waargenomen, wat niet hetzelfde is als vrij. Alle gegevens zijn verzonnen, boven de open Atlantische Oceaan, en geen meting.Twee synthetische dagen van de interferentiekaart, getekend uit de vastgelegde voorbeelden in examples/interference-map/output, elk met een eigen synthetische route en de aandelen van route-exposure die de engine rapporteert. Links een ADS-B-dag: 1 gedegradeerde cel, 6 niet gedegradeerd, 4 niet beoordeeld (gearceerd) en cellen zonder item, leeg getekend, die niet zijn waargenomen. De route is 525 km: 11,5% van de lengte in gedegradeerde cellen, 38,3% niet gedegradeerd, 9,1% niet beoordeeld en 41,1% niet waargenomen. Rechts een AIS-dag: cellen gemarkeerd door de cirkel- en op-land-detectoren, niet-afwijkende cellen en lege cellen; de route is 454 km met 10,5% in afwijkende cellen, 21,2% niet afwijkend, 0,0% niet beoordeeld en 68,3% niet waargenomen. ADS-B en AIS zijn afzonderlijke lagen, nooit gecombineerd. Een gemarkeerde cel is geen constatering van interferentie, en een cel zonder kleur is niet waargenomen, wat niet hetzelfde is als vrij. Alle gegevens zijn verzonnen, boven de open Atlantische Oceaan, en geen meting.

Beide dagen zijn de synthetische voorbeelden in examples/interference-map/output/, elk met een synthetische route in examples/interference-map/input/; de aandelen van route-exposure zijn wat kshana route-exposure voor hen afdrukt. Niets daarin is een echte plaats, een echt vliegtuig of een echt vaartuig.

Gegevens en licenties#

Alleen de bronnen die in data/INTERFERENCE-DATA-SOURCES.md zijn beoordeeld, zijn ingebouwd, te kiezen met --dataset:

--dataset Type Licentie Licentieveld in de uitvoer
adsb-lol ADS-B ODbL 1,0 ODbL-1.0
noaa-marinecadastre AIS Amerikaans publiek domein (CC0 1,0 volgens de uitgever) publiek domein
kystverket AIS NLOD 2,0 NLOD-2.0
custom beide wat u opgeeft --licence, --licence-url, --attribution vereist

Elk uitvoerbestand bevat de licentie, de licentie-URL, de vereiste bronvermelding en de dekkingsbeperkingen van de bron. Er is geen ingebouwd item voor bronnen waarvan de voorwaarden commercieel gebruik of herverspreiding van afgeleide kaarten verbieden.

ODbL en edities van Kshana. Een ADS-B-bestand per cel dat uit gegevens van adsb.lol is gemaakt, is een Derived Database en wordt vrijgegeven onder ODbL 1,0; het veld licence zegt dat ook. De eigen code van Kshana blijft AGPL-3.0. Commerciële edities van Kshana die zulke bestanden schrijven, nemen dezelfde vermelding op, en wie het bestand opnieuw publiceert, moet haar behouden. Resultaten van ADS-B en AIS worden nooit in één bestand gecombineerd, zodat de ODbL niet aan de AIS-laag gaat kleven.

Dekkingsbias. Kaarten erven de dekking van hun bron. adsb.lol volgt ontvangers van vrijwilligers, dus open zee en dun gedekte regio's zijn schaars. De open data van Kystverket laat vissersvaartuigen onder 15 m en pleziervaartuigen onder 45 m weg, dus de kaart geeft grotere schepen weer. MarineCadastre dekt alleen Amerikaanse wateren.

Identificatoren. Invoerrijen bevatten een identificator van een vliegtuig of vaartuig. Die wordt in het geheugen gehasht met een willekeurige salt per run, alleen gebruikt om afzonderlijke vliegtuigen of vaartuigen te tellen, en nooit geschreven, gelogd of afgedrukt. De uitvoer is geaggregeerd: er komt nergens in een identificator voor.

Onderdrukking. Een cel met minder dan 5 afzonderlijke vliegtuigen of vaartuigen die die dag zijn waargenomen, wordt helemaal niet gepubliceerd, en voor AIS wordt een gemarkeerd aantal van één of twee in een gepubliceerde cel gerapporteerd als null. Geen enkele gepubliceerde waarde kan een vliegtuig of vaartuig herleidbaar maken.

Invoerformaten#

Gewone CSV met een koptekstrij, door komma's gescheiden, zonder aanhalingstekens, UTC-tijden. De volgorde van de kolommen is vrij; onbekende kolommen worden genegeerd. Een tijdstempel is Unix-seconden of YYYY-MM-DDTHH:MM:SS[.fff]Z. Rijen die niet kunnen worden geparsed, worden geteld in de metadata van de uitvoer en niet stilzwijgend weggelaten.

ADS-B (kshana interference-map adsb):

Kolom Vereist Betekenis
timestamp ja tijd van de melding
aircraft_id ja ondoorzichtige identificator (gehasht, nooit opgeslagen)
lat, lon ja graden
alt_baro_ft ja hoogte in voet; ground of leeg sluit de rij uit
nic, nacp ten minste één gehele getallen 0 tot en met 11; leeg betekent niet gemeld
source_type nee indien aanwezig worden alleen waarden gebruikt die beginnen met adsb (MLAT, TIS-B en dergelijke worden uitgesloten)

Historie van adsb.lol readsb, rechtstreeks gelezen. De dagelijkse archieven zijn een gesplitste tar van readsb-tracebestanden. Pak er een uit zoals de uitgever beschrijft (voeg de delen samen, tar -xf -) en geef Kshana vervolgens de uitgepakte map, één bestand trace_full_*.json of een CSV:

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

Een map wordt recursief doorzocht op bestanden trace_full_* (andere bestanden, zoals trace_recent_*, worden genegeerd en symbolische links worden niet gevolgd). Elk bestand is gzip-gecomprimeerd of gewone JSON, vastgesteld aan de eerste bytes, omdat readsb gzip schrijft onder een naam .json; decompressie is begrensd op 512 MiB per bestand. Uit elk trace-item leest Kshana de tijdsverschuiving, breedtegraad, lengtegraad, hoogte (de markering ground sluit het item uit), de velden nic en nac_p van het detailobject van het vliegtuig en de tekenreeks van de positiebron (items van iets anders dan ADS-B worden uitgesloten). Een item zonder detailobject heeft geen nauwkeurigheidsvelden en wordt als uitgesloten geteld. Een bestand dat niet kan worden gelezen, wordt geteld in trace_files_unreadable in de metadata van de uitvoer en overgeslagen.

AIS (kshana interference-map ais):

Kolom Vereist Betekenis
timestamp ja tijd van de melding
vessel_id ja ondoorzichtige identificator (gehasht, nooit opgeslagen)
lat, lon ja graden; de AIS-waarden "niet beschikbaar" en (0, 0) worden weggegooid
sog_kn nee snelheid over de grond in knopen; 102,3 (niet beschikbaar) wordt als ontbrekend behandeld

De detector voor positie op land heeft een bestand met landpolygonen nodig (--land): GeoJSON Polygon of MultiPolygon. De landlaag van Natural Earth van 1:10 miljoen (publiek domein) is het beoogde bestand. Zonder --land staat de detector uit en zegt de uitvoer dat. Om het te downloaden (de enige netwerktoegang in deze functie):

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

Dit draait de systeemopdracht curl (als argumentenlijst, niet via een shell) over HTTPS, eenmalig, voor één bestand op een vast adres dat één commit van de upstream-repository aanwijst. De download wordt alleen bewaard als zijn SHA-256 gelijk is aan de in de code vastgepinde waarde; bij een afwijking wordt hij verwijderd en mislukt de opdracht. Als curl niet is geïnstalleerd, zegt de opdracht dat en geeft ze het adres en de controlesom, zodat het bestand met de hand kan worden opgehaald. Er wordt niets in de repository meegeleverd.

Uitvoer#

Eén GeoJSON-bestand per bron per UTC-dag, in de map --out, genaamd <source>-<dataset>-<YYYY-MM-DD>.geojson, waarbij <source> gelijk is aan adsb of ais, <dataset> de sleutel --dataset is (adsb-lol, noaa-marinecadastre, kystverket of custom) en de datum de UTC-dag van de meldingen is: adsb-adsb-lol-2026-03-01.geojson, ais-kystverket-2026-03-01.geojson. De dataset staat in de naam, zodat twee datasets van één type geen bestand kunnen delen, en Kshana overschrijft nooit een bestand: als een doel bestaat, mislukt de opdracht voordat er iets wordt geschreven. De CLI drukt één regel af per bestand dat ze schrijft. Een lezer kan de drie delen terugvinden met ^(adsb|ais)-(.+)-(\d{4}-\d{2}-\d{2})\.geojson$; dezelfde informatie staat in het bestand (source_kind, data.dataset, date). Synthetische voorbeeldbestanden, één per bron, staan in examples/interference-map/output/, met de opdracht die ze opnieuw genereert, om een viewer te bouwen en te testen. Een lid kshana_interference_map op het hoogste niveau bevat de schemanaam, de datum, het raster, de methode-id en elke parameter, de cijfers op dagniveau, de gegevenslicentie en bronvermelding, en een mededeling. Elke feature is een celpolygoon met cell_i, cell_j, status, degraded en de geaggregeerde aantallen.

Het raster ligt vast: vierkante cellen van --cell-deg graden (standaard 0,5) in breedte- en lengtegraad, geïndexeerd vanaf (-90, -180). De oost-westbreedte neemt af met de breedtegraad: ongeveer 55 km op de evenaar en ongeveer 28 km op 60 graden voor de standaardwaarde. Breedtegraad 90 hoort bij de laatste rij en lengtegraad 180 is dezelfde meridiaan als -180. De vooraf vastgelegde methoden zijn gedefinieerd op het raster van 0,5 graad. Een andere --cell-deg werkt, maar is niet de vooraf vastgelegde methode: de CLI zegt dat, en het bestand legt grid.preregistered_cell_deg en grid.is_preregistered (false) vast zodat een viewer het ook kan zeggen.

Achtergehouden aantallen. Elk aantal per cel onder het publicatieminimum (5) is null, nul inbegrepen, dus null betekent nooit "geen" en geen enkel gepubliceerd getal kan een vliegtuig of vaartuig herleidbaar maken. De velden status en degraded worden nog wel gegeven. In ADS-B-bestanden is aircraft_observed voor een gepubliceerde cel altijd ten minste 5; aircraft_sampled en aircraft_affected zijn null onder 5, en affected_share is null tenzij beide ten minste 5 zijn (een aandeel zou een achtergehouden aantal onthullen). In AIS-bestanden is elk item van vessels_flagged gelijk aan null onder 5.

Formaatversie en velden#

Het formaat ligt vast als schema: "kshana-interference-map/v1", format_version: 1. Een wijziging die een veld verwijdert of hernoemt, of wijzigt wat een veld betekent, verhoogt de versie; een veld toevoegen doet dat niet, dus een lezer moet velden negeren die hij niet kent. Een aantal dat null is, is achtergehouden, niet nul.

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

Waarden van status: ADS-B degraded, not_degraded, insufficient_sample, withheld_day_confounded, withheld_no_background; AIS anomalous, not_anomalous. degraded is alleen true voor degraded en anomalous. Het rapport over route-exposure heeft een eigen schema kshana-route-exposure/v1.

Observatorium: het dagelijkse product#

kshana interference-map daily zet één UTC-dag aan ADS-B-meldingen om in de drie bestanden van het observatorium (GeoJSON, PNG en een JSON met incidentrapport) en een hashmanifest, en kshana interference-map sensitivity speelt die dag opnieuw af onder wijzigingen van de vooraf vastgelegde parameters, één voor één. De opdracht dwingt de vrijgaveregels af: ten minste 24 uur nadat de dag eindigt (--delay-hours mag alleen worden verhoogd), cellen van 0,5 graad of grover, slechts drie toestanden (degraded, not_degraded, not_observed), geen oorzaak toegeschreven en geen gegevens van OpenSky. De methodenotitie, de bestandsformaten en de beperkingen staan in observatory/METHOD.md. Een regionale run (--bbox south,west,north,east) leest alleen de meldingen van het vak en zegt dat in het bestand.

Specificatie van de kaartpagina van Studio#

Voor de kaartpagina van Studio, die een GeoJSON-bestand laadt dat de gebruiker aanlevert (de pagina is gebouwd in de broncode van Studio, niet in deze repository). Er wordt niets geüpload: het bestand wordt in de browser gelezen en de pagina doet geen verzoek aan een gegevensbron.

Een bestand lezen. Accepteer een bestand alleen als kshana_interference_map.schema begint met kshana-interference-map/ en format_version een getal is dat de pagina ondersteunt; zeg anders dat het bestand geen ondersteunde interferentiekaart van Kshana is. Lees de hierboven genoemde velden; negeer onbekende. Een bestand bevat één bron en één dag. Er mogen meerdere bestanden worden geladen.

Cellen. Teken de polygoon van elke feature. Kleur op status en zeg in een legenda altijd wat elke kleur betekent. Vier toestanden, waarvan er geen mag worden verborgen of samengevoegd:

Toestand Betekenis Waar het vandaan komt
Gedegradeerd (of afwijkend bij AIS) een groot aandeel van de vliegtuigen meldde lage nauwkeurigheid, of vaartuigen vertoonden die dag afwijkingen degraded is true
Vrij waargenomen met genoeg vliegtuigen of vaartuigen en niet gemarkeerd status is not_degraded of not_anomalous
Niet beoordeeld waargenomen, maar te weinig bemonsterde vliegtuigen, de dag was verstoord, of de achtergrond van de dag kon niet worden geschat status is insufficient_sample, withheld_day_confounded of withheld_no_background
Niet waargenomen te weinig vliegtuigen of vaartuigen, dus de cel is niet gepubliceerd geen feature voor die cel

"Niet waargenomen" is de afwezigheid van een feature: teken het neutraal (geen vulling, of een arcering), nooit in de kleur van "vrij". Gebruik een kleurenschema dat niet alleen op rood tegenover groen steunt. Celdetails bij hover of selectie tonen de aantallen in properties zoals gegeven, en elk aantal null als "achtergehouden (minder dan 5)", nooit als nul. Een viewer moet ook zeggen, wanneer grid.is_preregistered false is, dat het bestand een celgrootte gebruikt buiten de vooraf vastgelegde methode.

Lagen. ADS-B en AIS zijn afzonderlijke lagen met eigen schakelaars, legenda's en licentieregels. Voeg ze nooit samen tot één kleurveld of één aantal, teken ze nooit als één gecombineerde cel en tel hun cellen nooit op. Verschillende dagen zijn verschillende bestanden: toon één dag tegelijk, met een dagkiezer, in plaats van dagen over elkaar te leggen.

Licentie en bronvermelding. Toon voor elke zichtbare laag, op de kaart en in elke export of screenshot, de tekst van data.attribution letterlijk, de data.licence met een link naar data.licence_url, en de data.coverage_notes. Als een ADS-B-laag wordt getoond, geldt haar ODbL-licentie alleen voor die laag. Bied geen gecombineerd bestand aan om te exporteren.

Methode. Bied de methode-id en parameters (method.id, method.parameters) en de cijfers van day aan in een detailpaneel, inclusief day_confounded (zeg ronduit dat geen enkele cel gedegradeerd is genoemd vanwege de achtergrond van de dag) en input_stats.

Voorbehouden die moeten blijven (toon de eigen method.caveats en notice van het bestand en houd deze formulering of een gelijkwaardige zichtbaar bij de kaart):

  • Een gedegradeerde of afwijkende cel is geen constatering van interferentie. Er bestaan andere oorzaken.
  • Een cel zonder kleur is niet waargenomen. Het is geen bewijs dat het gebied vrij was.
  • Dit is een beschrijving van eerdere positiemeldingen, geen voorspelling en geen meting van enige ontvanger.
  • De dekking volgt de gegevensbron; lees de dekkingsnotities.

De pagina mag geen individueel vliegtuig of vaartuig noemen of tonen, en de bestanden bevatten er geen.

Route-exposure. Als de pagina ook een rapport kshana-route-exposure/v1 laadt, toon dan zijn rijen per dag en bron met de vier aandelen (gedegradeerd, vrij, niet beoordeeld, niet waargenomen) samen, nooit het gedegradeerde aandeel alleen, plus de caveats van het rapport en de map_licence en map_attribution van elke rij.

Zendergebied (interference-map locate)#

kshana interference-map locate schat waar een interferentiebron zich kan bevinden uit dezelfde open ADS-B- of AIS-meldingen: een gebied bij vermelde betrouwbaarheidsniveaus, een zwaartepunt met een onzekerheidsellips en de sessies in de tijd. Het geeft nooit een kaal punt terug. MODELLED (registerrij VM-bc70cb57): de fysica is leerboekradiolijnzicht, de geloofwaardigheid van de gebieden hangt van het model af, en de enige externe controle is de Jammertest-vergelijking die vooraf is vastgelegd in emitter-region/PREREGISTRATION.md. Het publiceren van zendergebieden in het openbare observatorium is een afzonderlijk besluit van de eigenaar en staat uit: het observatorium leest deze module niet, en een test legt dat vast.

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/

Opties: --levels 0.5,0.9,0.95, --cell-km, --session-gap-min, --emitter-height-m min,max, --ship-height-m (AIS), --tdoa fix.json (een TDOA-positiebepaling samenvoegen; hieronder). Elke optie die van de vooraf vastgelegde waarde afwijkt wordt aangekondigd als "niet de vooraf vastgelegde methode". Bestanden worden nooit overschreven.

Model. Meldingen worden ingedeeld in eenheden (één vliegtuig of vaartuig in één bin van 2 minuten), elk getroffen (ADS-B: ten minste de helft van zijn meldingen heeft volgens de eigen regel van de kaart een lage NIC of NACp; AIS: een onwaarschijnlijke snelheid of sprong, of een positie landinwaarts van de kustlijn) of niet. Een vliegtuig of vaartuig telt alleen mee met ten minste 5 goede meldingen in de invoer (dezelfde bescherming met een apparatuurbasislijn als de kaart). Getroffen eenheden worden gegroepeerd in sessies: een tussenpoos van meer dan 30 minuten splitst in de tijd, en binnen een tijdcluster horen twee eenheden bij elkaar wanneer één zender voor beide binnen bereik kan zijn. Voor één sessie krijgt elke kandidaatpositie op een raster een aannemelijkheid:

  • Lijnzicht. Een vliegtuig op hoogte h en een zenderantenne op h_e zien elkaar tot op 4.122 (sqrt h + sqrt h_e) km op een 4/3-aardstraal. h_e wordt gemarginaliseerd over 2 tot 100 m (8 logaritmisch verdeelde waarden).
  • Vermogen. Het vermogen van de zender is onbekend, dus een effectief bereik van 12 km tot 426 km (stappen van 1,25) of "alleen lijnzicht" begrenst het bereik, met gelijk gewicht gemarginaliseerd. De rand van het bereik is zacht: een eenheid telt als binnen bereik met een gewicht dat lineair afneemt over 15% van het bereik aan elke kant (ten minste driekwart van een rastercel), omdat terrein, antennepatroon en pad niet nauwkeuriger bekend zijn.
  • Getroffen en niet getroffen. Een vliegtuig of vaartuig is gevoelig met kans 0,6 (apparatuur van de ontvanger, antenne en signaalpad verschillen), een eenheid van een gevoelig exemplaar binnen bereik is getroffen met kans 0,9, en elke andere eenheid is getroffen met de achtergrondkans 0,03 (andere oorzaken). Gevoeligheid is een latente eigenschap van het vliegtuig, per vliegtuig weggesommeerd, evenals een blijvende apparatuurfout (kans 0,03: alle eenheden van dat vliegtuig zijn getroffen waar het zich ook bevindt), wat voorkomt dat een defecte transponder het gebied meetrekt. Een getroffen vliegtuig trekt dus de posterior naar posities die het bereiken, en een niet getroffen vliegtuig met lijnzicht duwt met ten hoogste het gewicht van één vliegtuig tegen posities die het zouden hebben bereikt, hoeveel meldingen het ook verstuurde, terwijl een niet getroffen vliegtuig zonder lijnzicht niets zegt.
  • Terreinvrij. Terrein, ducting en diffractie worden niet gemodelleerd (terrein kan lijnzicht alleen wegnemen).
  • Temperen. De log-aannemelijkheid wordt vermenigvuldigd met 0,3 (een machtsposterior). Het bewijs van het model is afhankelijker en zijn randen minder scherp dan de onafhankelijkheid die de aannemelijkheid aanneemt, en op synthetische data met die fouten bevatten de ongetemperde gebieden de ware bron ruim onder hun vermelde percentage; 0,3 is alleen op synthetische data gekozen (de afleiding staat in docs/emitter-region/PREREGISTRATION.md, sectie 8).

De posterior geeft gebieden met de hoogste dichtheid bij de vermelde niveaus (genest; polygonen met gaten waar nodig), het met de posterior gewogen zwaartepunt en zijn momentenellips (geschaald naar 95% onder een gaussische verdeling; de polygonen, niet de ellips, zijn de gekalibreerde niveaus). Het raster is grof (ongeveer 5 tot 10 km) over het hele domein en elke grove cel met massa wordt 4 bij 4 gesplitst. Dekkingsbias wordt aangepakt door te conditioneren op waar meldingen bestaan: een gebied is breed waar weinig vliegtuigen aanwezig waren, en een sessie waarvan het gebied van 95% meer dan 80% van zijn zoekdomein vult wordt gemeld als unconstrained zonder zwaartepunt.

Sessies en profiel. Elke gepubliceerde sessie heeft begin, einde, duur, het oppervlak van de cellen van 0.5 graad die een getroffen eenheid en ten minste 5 onderscheiden vliegtuigen of vaartuigen bevatten, de aantallen onderscheiden getroffen en waargenomen eenheden, en het tegenbewijs (onderscheiden niet getroffen eenheden met lijnzicht op het zwaartepunt; achtergehouden onder 5). Een sessie met minder dan 5 onderscheiden getroffen vliegtuigen of vaartuigen wordt achtergehouden en geteld. Het profiel geeft, per UTC-uur van de dag, de onderscheiden getroffen vliegtuigen (null onder 5) en de minuten sessietijd, en uren sessietijd per UTC-dag.

Optionele TDOA-fusie. --tdoa fix.json neemt {"receivers": [[lat, lon, height_m], ...], "tdoa_s": [...], "sigma_s": 1e-7, "start": [lat, lon]} (ten minste drie ontvangers; tdoa_s[i] is ontvanger i+1 min ontvanger 0). De positie wordt op het aardoppervlak opgelost met Gauss-Newton op geolocation::tdoa_predict, de covariantie ervan is geolocation::tdoa_crlb_on_sphere, en de gaussische verdeling wordt met de posterior vermenigvuldigd. De Cramér-Rao-grens is een ondergrens voor een model, geen gemeten nauwkeurigheid.

Uitvoer (emitter-<source>-<dataset>-<day>): .geojson (MultiPolygon-gebied per niveau en sessie, de ellipspolygoon, het zwaartepunt met zijn ellips), -summary.json, -sessions.csv, -figure.svg. Elk bevat de licentie van de dataset, de licentie-URL en de bronvermelding, de methode-id kshana-interference-map/emitter-region/v1, elke parameter, de aannames en de beperkingen, en draagt zijn bewijslabel (niveau MODELLED, id's van registerrijen; de strook onder de figuur, # evidence-regels in de tabel, een lid evidence in de JSON). Machinebestanden zijn Engels in elke taal; de figuurtekst en de regels van de opdrachtregel zijn gelokaliseerd. Een synthetisch voorbeeld staat in examples/emitter-region/ (regenerate.sh).

Privacy en formulering. Geen enkele identificator van een vliegtuig of vaartuig komt in enige uitvoer voor; er wordt geen meldingspositie getekend; een sessie heeft ten minste 5 onderscheiden vliegtuigen of vaartuigen nodig; aantallen onder 5 zijn null. De formulering is neutraal: "geschat zendergebied", "gebied van een interferentiebron". Een gebied is niet de positie van wie dan ook, is geen vaststelling van de oorzaak en zegt niets over wie of wat achter een bron zit; de uitgebreide formuleringstest controleert de uitvoer op woorden over actoren, bedoeling en conflict.

Beperkingen. De geloofwaardigheid hangt van het model af. Op synthetische data (een generator die het model deelt, met onzekere bereikranden van 15% per vliegtuig, blijvende apparatuurfouten, onbekend vermogen en onbekende antennehoogte) bevatte het gebied van 95% de ware bron in 0,99 (vliegtuiggeometrie) en 1,00 (scheepsgeometrie) van de sessies en het gebied van 50% in ongeveer 0,77: de niveaus zijn conservatief, door de aannemelijkheidsexponent van 0,3, en de zwaartepuntfout van een sessie heeft een mediaan van 23 km (vliegtuigen) en 12 km (schepen). De kalibratie is alleen op synthetische data gecontroleerd; de Jammertest-vergelijking is vooraf vastgelegd (emitter-region/PREREGISTRATION.md) en eenmaal uitgevoerd: NOT ASSESSABLE voor beide bronnen (emitter-region/RESULTS.md). Eén bron per sessie; meerdere dichtbij gelegen bronnen lijken op één. Een regionale oorzaak (een uitval van een constellatie, ruimteweer) geeft een gebied dat geen bron is. ADS-B geeft weinig meldingen buiten druk luchtruim, en slechts ongeveer een kwart van de tracepunten van readsb draagt NIC en NACp, dus dunne gebieden geven brede of geen gebieden (31% van de sessies met scheepsgeometrie was unconstrained).

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

Elke ADS-B-melding in de lucht bevat twee zelfbeoordeelde navigatiekwaliteitsvelden: NIC (de insluitingsstraal van de positie) en NACp (de nauwkeurigheidsgrens van 95%, EPU). Wanneer de ontvanger aan boord zijn satellietpositiebepaling verliest of wantrouwt, dalen beide, waardoor ze een kenmerk van interferentie dragen. Ze dalen ook om andere redenen.

Vooraf vastgelegde parameters (constanten in de code, in elk bestand geschreven; een wijziging betekent een nieuwe methodeversie):

Parameter Waarde
Hoogtedrempel barometrische hoogte van ten minste 5000 ft
Melding met lage nauwkeurigheid NACp ten hoogste 6 (de gemelde EPU-grens is 556 m, 0,3 NM, of groter, of onbekend) of NIC ten hoogste 5 (de gemelde grens van de insluitingsstraal is 1852 m, 1 NM, of groter, of onbekend)
Goede melding NACp ten minste 8 en NIC ten minste 7; beoordeeld op de velden die de invoer heeft (beide wanneer beide aanwezig zijn, anders het aanwezige veld)
Basislijn voor de apparatuur een vliegtuig telt alleen mee in een cel met ten minste 5 goede meldingen buiten die cel op dezelfde dag
Bemonsterde vliegtuigen in een cel ten minste 3 meldingen in de cel
Getroffen vliegtuigen in een cel ten minste 50% van zijn meldingen in de cel heeft lage nauwkeurigheid
Minimale steekproef ten minste 10 bemonsterde vliegtuigen
Gedegradeerd ten minste 5 getroffen vliegtuigen, een getroffen aandeel van de bemonsterde vliegtuigen van ten minste 0,30, en ten minste 0,15 boven het mediane celaandeel van de dag
Verstoorde dag mediaan celaandeel (over ten minste 5 cellen met een volledige steekproef) van ten minste 0,15: geen enkele cel wordt gedegradeerd verklaard
Geen achtergrond minder dan 5 cellen met een volledige steekproef, dus de mediaan kan niet worden geschat: een cel die aan de drempels voldoet, is withheld_no_background, niet gedegradeerd
Publicatieminimum ten minste 5 afzonderlijke vliegtuigen waargenomen

Deze waarden zijn vastgesteld op basis van de definities van de codes NIC en NACp en van de privacyregel, voordat naar gegevens werd gekeken. Ze zijn niet afgesteld op echte gegevens, en de tests gebruiken uitsluitend synthetische gegevens. Celstatussen: degraded, not_degraded, insufficient_sample (gepubliceerd maar met minder dan 10 bemonsterde vliegtuigen), withheld_day_confounded en withheld_no_background.

Versie 2. Versie 1 verklaarde een cel gedegradeerd vanaf slechts 3 getroffen vliegtuigen, minder dan het publicatieminimum van 5 vliegtuigen, en sloeg de controle van de achtergrond van de dag stilzwijgend over wanneer minder dan 5 cellen volledig waren bemonsterd. Versie 2 vereist ten minste 5 getroffen vliegtuigen en houdt de uitspraak (withheld_no_background) achter wanneer de achtergrond niet kan worden geschat. Beide wijzigingen verscherpen de methode (niets wat in versie 1 niet gedegradeerd was, is gedegradeerd in versie 2); de reden is dat een gepubliceerde uitspraak nooit mag steunen op minder vliegtuigen dan het aantal waaronder aantallen worden achtergehouden. Bestanden van versie 1 zijn niet vrijgegeven.

Waarom nauwkeurigheidsvelden om andere redenen dan interferentie dalen, en de waarborg voor elk:

Oorzaak Waarborg
Oudere transponders die NIC of NACp nooit melden, of ze melden met een vaste lage waarde de basislijn voor de apparatuur: een vliegtuig zonder goede meldingen elders op die dag telt niet mee
Lage hoogte en operaties aan de grond (terreinafscherming, andere positieformaten) hoogtedrempel; rijen gemarkeerd met ground worden uitgesloten
MLAT of andere niet-GNSS-posities filter source_type wanneer de kolom aanwezig is
Eén vliegtuig dat veel meldingen verstuurt afzonderlijke vliegtuigen worden geteld, geen meldingen
Een uitval van een constellatie of augmentatie, of een gebeurtenis in het ruimteweer, die de nauwkeurigheid over een groot gebied verlaagt de cel moet het mediane celaandeel van de dag met een marge overschrijden, en een dag waarvan de mediaan zelf hoog is, wordt als verstoord gemarkeerd en verklaart geen cel
Een storing in de apparatuur van één vliegtuig vereist een aandeel van veel afzonderlijke vliegtuigen, met een minimale steekproef
Weinig vliegtuigen in de cel minimale steekproef; onder 5 waargenomen wordt de cel niet gepubliceerd

Wat overblijft: de methode kan interferentie niet onderscheiden van een regionale oorzaak die lokaal is in plaats van wijdverbreid (een lokaal effect van de satellietgeometrie of een uitval van grondgebonden augmentatie zou er hetzelfde uitzien), en ze is in één richting conservatief: een vliegtuig dat de hele dag alleen binnen een getroffen regio vliegt, heeft geen basislijn en telt niet mee, dus aanhoudende grote gebieden worden te laag gerapporteerd.

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

Per vaartuig per dag vijf detectoren. Een detector kwalificeert in een cel wanneer ze ten minste 5 afzonderlijke vaartuigen markeert die ten minste 20% van de daar waargenomen vaartuigen vormen; de cel is anomalous als een detector kwalificeert.

Detector Regel (vooraf vastgelegd)
on_land ten minste 3 meldingen in de cel op meer dan 2000 m landinwaarts van de opgegeven kustlijn
circle een venster van 20 opeenvolgende meldingen (stap 10, hiaten van hoogstens 30 min) waarvan de gemiddelde straal tot het zwaartepunt 500 m tot 20 km is, met een variatiecoëfficiënt van de straal van hoogstens 0,15, één bewegingsrichting met een totale draaiing van ten minste 270 graden (stappen van hoogstens 90 graden, netto ten minste 80% van het totaal), en een gemiddelde snelheid van ten minste 2 kn
implausible_jump ten minste 2 sprongen die in de cel aankomen: opeenvolgende meldingen die ten minste 1000 m uit elkaar liggen, hoogstens 1 uur na elkaar, en die meer dan 70 kn impliceren (de geïmpliceerde snelheid gebruikt ten minste 1 s tussen de meldingen, dus twee meldingen met dezelfde tijdstempel en posities die 1 km of meer uit elkaar liggen, tellen als een sprong)
implausible_speed ten minste 3 gemelde snelheden boven 70 kn in de cel
same_position ten minste 5 afzonderlijke vaartuigen die dezelfde positie melden (afgerond op 1e-4 graad, ongeveer 11 m) in hetzelfde venster van 10 minuten

Cellen met minder dan 5 afzonderlijke vaartuigen worden niet gepubliceerd; elk gemarkeerd aantal onder 5, nul inbegrepen, wordt gerapporteerd als null.

Versie 2. Versie 1 liet een detector kwalificeren vanaf 3 gemarkeerde vaartuigen en publiceerde aantallen van 3 en 4. Versie 2 verhoogt het minimum aan gemarkeerde vaartuigen tot 5, het publicatieminimum, zodat een uitspraak anomalous nooit steunt op minder vaartuigen dan het aantal waaronder aantallen worden achtergehouden. Dit verscherpt de methode en er is geen bestand van versie 1 vrijgegeven.

Bekende oorzaken van valse positieven, die de aandeelregel en de drempels verminderen maar niet wegnemen: vaartuigen in rivieren, kanalen en havens dicht bij een grove kustlijn (de landinwaartse buffer van 2 km bestaat hiervoor); twee vaartuigen die één identificator delen, wat op sprongen lijkt; transponders met een slechte positiebepaling of testapparatuur; en rondhangen van loodsboten en zoekvaartuigen, wat op cirkels kan lijken. Een kustlijnbestand van 1:10 miljoen is nauwkeurig tot ongeveer een kilometer.

De detectoren voor sprongen en snelheid vergelijken meldingen binnen één invoerbestand; een spoor dat over bestanden of dagen is gesplitst, wordt niet aan elkaar gezet.

Geheugen. De invoer wordt regel voor regel gelezen en nooit in zijn geheel vastgehouden. ADS-B bewaart alleen tellers per vliegtuig per cel. AIS bewaart elke geaccepteerde melding in een compact record (ongeveer 40 bytes) totdat zijn dag is beoordeeld, dus het geheugen groeit met het aantal AIS-meldingen in de invoer; splits een zeer grote AIS-invoer per dag.

Route-exposure#

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

--route is een GeoJSON LineString (kaal, in een Feature of in een FeatureCollection) of een CSV met regels lat,lon. --map accepteert kaartbestanden of mappen daarvan, en mag worden herhaald. Waypoints worden met rechte lijnen in breedte- en lengtegraad verbonden, dus verdicht lange etappes; een etappe neemt in lengtegraad de korte weg, dus een etappe die de antimeridiaan kruist (179,5 E naar 179,5 W) kruist die. De route wordt in stukken van ongeveer 250 m gesplitst. Elk stuk wordt gemeten tussen zijn eigen twee eindpunten op een bol met straal 6371,0088 km (hetzelfde pad dat bepaalt in welke cel het ligt) en toegewezen aan de cel die zijn middelpunt bevat.

Per dag en per bron geeft het rapport de lengte van de route en vier aandelen die samen 1 vormen: share_degraded, share_not_degraded, share_unassessed (cel aanwezig maar zonder uitspraak) en share_not_observed (cel ontbreekt op de kaart). Lees de laatste twee samen met de eerste: een route met een laag gedegradeerd aandeel en een hoog niet-waargenomen aandeel is niet als vrij aangetoond. ADS-B- en AIS-rijen worden afzonderlijk gerapporteerd en nooit gecombineerd. Elke rij draagt de licentie en bronvermelding van de kaart.

Bibliotheekfuncties#

Voor aanroepers die gegevens in het geheugen hebben (bindings, de MCP-server, de browserbuild) biedt de module kshana::interference_map::api dezelfde methoden met tekst of bytes als invoer en JSON als uitvoer, zonder een bestand of het netwerk aan te raken:

Functie Invoer Uitvoer
adsb_maps_from_csv(csv, &DatasetSpec, cell_deg) ADS-B-CSV-tekst Vec<DayMap>
adsb_maps_from_readsb_traces(&[&[u8]], &DatasetSpec, cell_deg) één bytereeks per readsb-tracebestand (gzip of gewoon) Vec<DayMap>
ais_maps_from_csv(csv, &DatasetSpec, cell_deg, Option<&str>) AIS-CSV-tekst, optioneel GeoJSON-tekst van het land Vec<DayMap>
route_exposure(route_text, &[&str], from, to) routetekst, GeoJSON-teksten van kaarten, optionele grenzen YYYY-MM-DD JSON kshana-route-exposure/v1

Een DayMap heeft file_name (<source>-<dataset>-<date>.geojson), date en geojson (het document v1). DatasetSpec is Preset("adsb-lol" | "noaa-marinecadastre" | "kystverket") of Custom { licence, licence_url, attribution }; DEFAULT_CELL_DEG is 0,5. Fouten zijn MapError. De datasetregels (toegestane voorinstellingen, licentietekst vereist, type moet overeenkomen) gelden precies zoals op de opdrachtregel.

Externe validatie#

tests/interference_map_reference.rs vergelijkt Kshana met onafhankelijke implementaties op synthetische invoer, met toleranties die vooraf zijn vastgelegd in tests/fixtures/interference_map_ref/PREREGISTRATION.md: de betekenis van de codes NIC en NACp tegen decodering met pyModeS van synthetische ADS-B-frames, AIS-waarden voor niet beschikbaar tegen decodering met pyais van synthetische AIVDM-zinnen, celtoewijzing in het raster tegen shapely, routelengte per celtoestand tegen shapely en GeographicLib, en landinwaartse maskering tegen shapely en pyproj. De fixtures worden gemaakt door scripts/gen_interference_map_ref.py; CI heeft geen Python nodig. Dit valideert hoe de codes en veldwaarden worden gelezen en de geometrie. Het valideert niet dat een gemarkeerde cel interferentie is.

Tests#

Alle tests gebruiken synthetisch gegenereerde gegevens en geen netwerk: unittests in src/interference_map/, en tests/interference_map_cli.rs voor de opdrachten van begin tot eind, inclusief dat geen enkele identificator in een uitvoer terechtkomt en dat weigeringen geen bestanden achterlaten.