Desktop aplikácia na spracovanie CSV meraní mobilného signálu (LTE / 5G NR) do priestorových zón alebo úsekov po trase, s automatickým generovaním štatistických výstupov pre operátorov.
Program načíta namerané dáta z jedného alebo viacerých CSV súborov, aplikuje voliteľné filtre na duplikáciu zdieľaných frekvencií, voliteľne synchronizuje 5G NR pokrytie z NSA LTE merania, transformuje GPS súradnice do metrického systému (S-JTSK), rozdelí body do zón alebo úsekov, agreguje hodnoty signálu po frekvenciách a operátoroch, klasifikuje kvalitu pokrytia a exportuje dva výstupné CSV súbory.
V hornej časti aplikácie vyber Frekvencie · LTE + 5G. Tento režim podporuje ľubovoľný počet LTE aj 5G CSV naraz a používa existujúci výpočet priestorových zón. V nastaveniach si vyber Úseky po trase, Štvorcové zóny (stred) alebo Štvorcové zóny (prvý bod v zóne). Veľkosť v metroch znamená dĺžku úseku alebo stranu štvorca. Časové okná fungujú rovnako ako pri štandardnom spracovaní: pri úsekoch vyrežú dotknuté úseky, pri štvorcových zónach jednotlivé merania v danom čase.
Mapovanie stĺpcov má vo frekvenčnom režime dva nezávislé bloky: Mapovanie LTE a Mapovanie 5G. Každý priraďuje GPS, operátora, PCI a RSRP/SINR iba zo stĺpcov súborov označených danou technológiou. LTE prednostne vyberá RSRP/SINR, 5G SSS-RSRP/SSS-SINR. Zmena jedného mapovania nemení druhé ani mapovanie štandardného režimu. Vybrané povinné stĺpce sa overujú v každom súbore danej technológie; známe aliasy sú podporované aj pri rôznych exportoch v rámci rovnakej technológie. V tomto režime je sekcia štandardne zbalená ako rozšírené nastavenie; pri chýbajúcom alebo nejednoznačnom mapovaní sa otvorí na opravu. Frekvenciu naďalej vyberáš pri každom súbore osobitne.
- Pridaj vstupné súbory a pri každom výslovne vyber LTE alebo 5G. Typ podľa hlavičky je iba pomôcka.
- Vyber stĺpec fyzickej frekvencie v Hz: pri dodaných 5G dátach
SSRef, pri LTEFrequency.NR-ARFCNaEARFCNsú čísla kanálov a na toto porovnávanie sa nepoužívajú. - MNC sa pred zoskupovaním opraví podľa čísla za lomkou v hodnote typu
231/2. Automatické hľadanie prechádza PLMN a dodatočnéextra_col_*stĺpce; konkrétny stĺpec možno vybrať ručne. Prázdna hodnota ponechá MNC. Konfliktné alebo nejednoznačné hodnoty hlásia chybu. V dátachdata/2100je táto hodnota vextra_col_1, za pomenovaným stĺpcomAdd. PLMNs. - Pre každú kombináciu zóna/úsek + MCC + MNC + frekvencia + technológia sa vyberie jeden pôvodný riadok s najvyšším jednotlivým RSRP. Nejde o priemer. Pri rovnakom RSRP vyhrá prvý riadok po stabilnom časovom zoradení; pri zhodnom alebo chýbajúcom čase sa zachová vstupné poradie. LTE a 5G zostávajú samostatné aj pri rovnakej frekvencii.
- Filtre sú spoločné pre LTE aj 5G, rovnako ako v štandardnom režime. Automaticky sa načítajú oba priečinky
filters/ajfiltre_5G/; ručne pridané súbory sa pridajú do jedného spoločného zoznamu. Rovnaký súbor vybraný viackrát sa načíta len raz. Rozhodujú podmienky filtra, nie jeho priečinok alebo technológia merania. Ak chceš použiť iba vlastné filtre, vypni automatické filtre a pridaj ich do spoločného zoznamu. BW a mapovanie stĺpcov zostávajú nezávislé pre LTE a 5G. Filtre nič nemenia ani neduplikujú. Kontroluje sa operátor už po oprave MNC na vybranom najsilnejšom meraní. Vyberá sa pravidlo s najviac zhodnými podmienkami, pri zhode podľa názvu súboru, rovnako ako v štandardnom režime. - Pri načítaných filtroch obsahuje
Operator_sedihodnotuyes, iba ak existuje zhodné pravidlo a nemení MCC ani MNC. Chýbajúca zhoda alebo zmena operátora (aj v niektorej z viacerých assignment kombinácií) znamenáno. S vypnutými filtrami je výsledokyes. - Dva výsledné stĺpce:
Operator_sedikontroluje vždy iba strednú frekvenciu f.Operator_sedi_BWkontroluje f, f − BW × 1 000 000 a f + BW × 1 000 000 a obsahujeyes, iba ak na všetkých troch bodoch existuje zhodné pravidlo a nemení operátora (pri vypnutých filtroch je výsledokyes). BW sa zadáva samostatne pre LTE a 5G v MHz, predvolene 0. Pri prázdnom alebo nulovom BW sú oba výsledky rovnaké. BW je odchýlka na každú stranu, nedelí sa dvoma a nepreberá sa zo vstupného stĺpcaBW. Vnútro intervalu sa nekontroluje; frekvencia použitá na zoskupovanie sa nemení.
Rozsahy filtrov sú [od, do): dolná hranica patrí do rozsahu, horná už nie. Rovnosť alebo rozsah s rovnakými hranicami kontroluje presnú hodnotu. Napríklad 5G meranie MNC=2, 2131,25 MHz, BW=5 MHz má s dodanými filtrami Operator_sedi=yes a Operator_sedi_BW=no: dolný bod 2126,25 MHz patrí do filtra Orange (MNC=1). Pri načítaných filtroch znamená bod mimo všetkých pásiem no. Ak nie sú načítané žiadne filtre, výsledok je yes. Napríklad LTE Orange 2112,5 MHz s poskytnutým pásmom od 2110 MHz má pri BW 2,5 MHz výsledok yes / yes, ale pri BW 2,6 MHz yes / no: dolný bod 2109,9 MHz už leží mimo všetkých poskytnutých pásiem.
Hlavičky sa načítajú z úvodnej vzorky každého CSV (najviac 1 MiB). Náhľad nespracúva ani nespája všetky merania. Pri ďalšom pridávaní sa nezmenené hlavičky použijú z pamäte; zmena veľkosti alebo času úpravy súboru vyvolá nové načítanie. Novšia požiadavka zruší predchádzajúcu a existujúce nastavenie frekvencie/PLMN zostane zachované.
Až Spustiť spracovanie načíta všetky riadky vrátane dodatočných stĺpcov, ktoré sa objavia neskôr než vo vzorke. Automatická oprava PLMN preto kontroluje celý súbor. Viaceré súbory sa zladia podľa názvov stĺpcov a zoradia podľa času rovnakým mechanizmom ako v pôvodnom režime: prednosť má Date + Time, náhradou je UTC. Bez použiteľného času sa zachová vstupné poradie. Pôvodný súbor a číslo jeho riadku zostanú vo výstupe. Pri zhodnom RSRP rozhoduje prvý riadok po tomto stabilnom zoradení.
Merania výkonu a rozsah testov sú v audite spájania.
Pri úsekoch po trase samotné stretnutie dvoch trás pri križovatke nestačí na spoločné číslovanie. Overuje sa aj poloha pozdĺž navrhovaného prekrytia, aby sa vzdialené časti rôznych ciest nespojili do jedného úseku. Oprava a výsledky na štyroch LTE a štyroch 5G súboroch sú v audite zákazníckych trás.
<prvý_vstup>_frequencies_5g.csvobsahuje iba 5G merania a 5G vstupné stĺpce.<prvý_vstup>_frequencies_lte.csvobsahuje iba LTE merania a LTE vstupné stĺpce.
Výstupné cesty možno zmeniť osobitne. Schéma sa zjednocuje iba medzi súbormi tej istej technológie; 5G a LTE stĺpce sa vo výstupoch nepomiešajú. Oba súbory začínajú jedným prázdnym riadkom a hlavičkou na druhom riadku, rovnako ako štandardný export zón. Majú spoločné identifikátory zón alebo úsekov. Stĺpec technologia sa neexportuje, pretože technológiu určuje samostatný súbor. Ak pre technológiu nie sú výsledné merania, jej súbor obsahuje prázdny riadok a hlavičku. Tento režim nevytvára ďalší súbor štatistík.
Za vstupnými stĺpcami sú doplnené:
| Stĺpec | Význam |
|---|---|
Frekvencia_Hz |
Fyzická frekvencia použitá na zoskupovanie |
Usek alebo Zona |
ID spoločného úseku (napr. segment_12) alebo bunky štvorcovej mriežky |
Usek_latitude, Usek_longitude alebo Zona_latitude, Zona_longitude |
GPS začiatku úseku, stredu štvorca alebo prvého zostávajúceho bodu v zóne podľa režimu. Vstupné GPS zostávajú z najsilnejšieho merania. |
Zdrojovy_subor, original_excel_row |
Zdroj a číslo riadku vybraného merania (od 1 vrátane preambuly a hlavičky) |
Pocet_merani |
Počet meraní v danej skupine |
Operator_sedi |
Kontrola iba strednej frekvencie |
Operator_sedi_BW |
Kontrola stredu a oboch krajných bodov podľa BW danej technológie; pri prázdnom/nulovom BW rovnaká ako stred |
Ostatne_PCI |
Jedinečné ostatné PCI tej istej skupiny, numericky zoradené a oddelené čiarkami; bez vybraného PCI |
Prázdne úseky, vlastných operátorov, mobile synchronizáciu a prahy pokrytia tento režim nepoužíva. Riadky bez použiteľného RSRP, GPS alebo kľúčov skupiny sa do výsledku nezaradia.
Regresné testy vrátane štyroch súborov (2 LTE + 2 5G), opravy PLMN, maxima RSRP, oddelených schém, filtrov, BW a časových výrezov:
go test ./...
# Kompletné lokálne dáta 2100 (~290 MB):
RUN_LARGE_REAL_DATA_TESTS=1 go test ./internal/backend -run '^TestFrequencyMode_Real2100$' -v
# Audit 21 kombinácií priestorového režimu, BW a zapnutia filtrov:
RUN_LARGE_REAL_DATA_TESTS=1 FREQUENCY_AUDIT_OUTPUT_DIR=/tmp/frequency-bw-audit \
go test ./internal/backend -run '^TestFrequencyMode_Real2100BWAudit$' -count=1 -v -timeout 15m
# Nezávislá kontrola všetkých exportov s presnou desatinnou aritmetikou:
python3 scripts/audit_frequency_outputs.py /tmp/frequency-bw-audit --report /tmp/frequency-bw-audit/report.jsonRozsah a výsledky overenia sú v protokole auditu BW.
| Vrstva | Technológia |
|---|---|
| Backend a výpočty | Go 1.24 |
| Desktop shell | Wails v2 |
| Frontend (UI) | TypeScript, vanilla DOM |
| Cieľový OS pre build | Windows (amd64), vývoj na macOS/Linux |
| Geodetická projekcia | Natívna Go implementácia (Krovák / EPSG:5514) |
| Kódovania CSV | UTF-8, Latin-1, Latin-2, CP1250, Windows-1250, ISO-8859-2 |
Požiadavky: Go 1.22+, Node.js 20+, Wails CLI (voliteľné).
Frontend závislosti:
cd frontend && npm installVývojový režim:
go run github.com/wailsapp/wails/v2/cmd/wails@v2.11.0 devWindows produkčný build:
go run github.com/wailsapp/wails/v2/cmd/wails@v2.11.0 build -platform windows/amd64 -cleanTesty:
go test ./...Vstup: Jeden alebo viac CSV súborov oddelených bodkočiarkou (;). Pri viacerých súboroch sa stĺpce zladia podľa názvov, takže nemusia byť v rovnakom poradí. Povinné namapované stĺpce musia existovať v každom vstupnom CSV. Po zlúčení sa riadky zoradia podľa časovej značky, ak je dostupná.
Výstupy:
| Súbor | Obsah |
|---|---|
<input>_zones.csv |
Jeden riadok za každú kombináciu zóna + operátor s priemerným RSRP, vybranou frekvenciou, PCI a GPS súradnicami stredu zóny |
<input>_stats.csv |
Sumárna tabuľka za každého operátora (MCC/MNC) s počtom GOOD a BAD zón |
V mobile režime sa do názvu výstupov automaticky pridáva _mobile. Výstupné cesty je možné manuálne prepísať v UI.
Celé spracovanie prebieha v jednom sekvenčnom pipeline v tomto poradí:
- Načítanie CSV -- Detekcia kódovania, nájdenie hlavičky, normalizácia stĺpcov a zjednotenie schémy podľa názvov. Pri viacerých súboroch zlúčenie riadkov a zoradenie podľa času.
- Príprava riadkov -- Doplnenie stĺpca
original_excel_rowpre trasovateľnosť. Voliteľné vylúčenie riadkov podľa časových okien alebo podľa čísla riadku. - Aplikácia filtrov -- Načítanie pravidiel z
.txtsúborov, priradenie k riadkom podľa podmienok, duplikácia riadkov podľa assignment kombinácií. - Mobile sync (voliteľný) -- Načítanie NSA LTE CSV, synchronizácia stĺpca
5G NRdo 5G datasetu na základe časovej zhody. - Transformácia súradníc -- Prevod WGS84 (GPS) na S-JTSK (EPSG:5514) v metroch.
- Výpočet zón / úsekov -- Priradenie každého bodu do zóny podľa zvoleného režimu.
- Agregácia štatistík -- Zoskupenie podľa zóna + operátor + frekvencia + PCI, výpočet priemerov, výber najlepšej frekvencie.
- Export zones CSV -- Zápis jedného riadku za zóna + operátor, voliteľné doplnenie prázdnych zón a custom operátorov.
- Export stats CSV -- Zápis sumárnych GOOD/BAD počtov za operátora.
Program skúša dekódovať súbor v tomto poradí: UTF-8 (striktná validácia), Latin-1, Latin-2, CP1250, Windows-1250, ISO-8859-2. Použije sa prvý dekóder, pri ktorom sa nájde tabulárna hlavička.
Pri neznámej schéme sa za hlavičku považuje prvý riadok s minimálne 6 stĺpcami (oddelenými bodkočiarkou), za ktorým nasledujú aspoň 2 dátové riadky s podobným počtom stĺpcov (z najbližších 25 neprázdnych riadkov). Rozpoznateľná meracia alebo minimálna NSA LTE hlavička sa prijme aj so 4–5 stĺpcami a jediným dátovým riadkom.
- Hodnoty aj hlavičky môžu byť CSV-quoted; bodkočiarka vo vnútri úvodzoviek sa nepovažuje za oddeľovač.
- Trailing prázdne stĺpce po
;sa orezávajú. - Ak dátové riadky majú viac polí ako hlavička, doplnia sa stĺpce
extra_col_1,extra_col_2atď. - Duplicitné názvy stĺpcov sa disambiguujú:
name,name_2,name_3. - Riadky sa zarovnajú na jednotnú šírku (doplnia sa prázdne hodnoty alebo sa orezávajú).
Pri viacerých vstupných CSV sa vytvorí kanonická schéma ako únia stĺpcov zo všetkých súborov. Prvý súbor určí základné poradie stĺpcov, nové stĺpce z ďalších súborov sa pridajú na koniec v poradí prvého výskytu. Riadky z každého súboru sa pred zlúčením preusporiadajú podľa názvov stĺpcov.
Porovnávanie názvov je normalizované: ignoruje sa veľkosť písmen, medzery a znaky ako - alebo _. Napríklad Longi-tude, longi_tude a LONGITUDE sa považujú za rovnaký stĺpec. Ak jeden súbor obsahuje dva stĺpce, ktoré sú po normalizácii rovnaké, spracovanie skončí chybou, aby sa nevybral nesprávny zdroj hodnoty.
Povinné mapované stĺpce (latitude, longitude, frequency, pci, mcc, mnc, rsrp) musia byť dostupné v každom vstupnom CSV. Bežné názvy toho istého logického poľa sa medzi exportmi rôznych meračov považujú za ekvivalentné (Latitude/Lat, Longitude/Lon/Lng, Frequency/NR-ARFCN/EARFCN, ako aj varianty RSRP a SINR uvedené nižšie). Ak súbor obsahuje zároveň viac takýchto aliasov, prednosť má presný stĺpec vybraný používateľom. Voliteľné stĺpce a ostatné stĺpce z union schémy môžu v niektorom súbore chýbať; vtedy sa do výsledného datasetu doplní prázdna hodnota. Ak súbory obsahujú časové údaje (UTC alebo Date + Time), riadky sa po zlúčení zoradia chronologicky.
Príklad pre rôzne poradie:
a.csv: Latitude;Longitude;RSRP;PCI
b.csv: PCI;RSRP;Longitude;Latitude
Výsledná schéma: Latitude;Longitude;RSRP;PCI
Príklad pre nový stĺpec:
Ak ďalší súbor obsahuje navyše SINR, výsledná schéma ho pridá na koniec.
Súbory bez SINR dostanú v tomto stĺpci prázdnu hodnotu.
Na základe názvov stĺpcov program automaticky rozpozná typ merania:
- 5G (NR) -- ak hlavička obsahuje stĺpec s textom
NR-ARFCN - LTE -- ak hlavička obsahuje stĺpec s textom
EARFCN - Neznámy -- inak
Táto informácia sa zobrazuje v UI a slúži na varovanie, ak je v mobile režime vstupný súbor LTE namiesto 5G.
Používateľ mapuje logické kľúče na názvy stĺpcov z kanonickej schémy CSV. Pri viacerých súboroch je táto schéma výsledkom union zlúčenia podľa názvov. Indexy stĺpcov sú len interná reprezentácia tejto kanonickej schémy.
| Kľúč | Povinný | Typické názvy stĺpcov |
|---|---|---|
latitude |
áno | Latitude, Lat |
longitude |
áno | Longitude, Lon, Lng |
frequency |
áno | Frequency, NR-ARFCN, EARFCN |
pci |
áno | PCI |
mcc |
áno | MCC |
mnc |
áno | MNC |
rsrp |
áno | SSS-RSRP, RSRP, NR-SS-RSRP |
sinr |
nie | SSS-SINR, SINR, NR-SS-SINR |
Program sa pokúsi automaticky predvyplniť mapovanie na základe hlavičky. Používateľ môže každé pole manuálne upraviť. Kontrola pripravenosti v UI overí, či sú povinné mapované stĺpce dostupné vo všetkých vstupných CSV ešte pred spustením spracovania.
Parsovanie číselných hodnôt vo všetkých stĺpcoch: orezanie medzier, nahradenie čiarky bodkou, prevod na float64.
Filtre slúžia na duplikáciu riadkov pre zdieľané frekvencie medzi operátormi. Načítavajú sa z .txt súborov. Program automaticky hľadá filtre v priečinkoch filters/ a filtre_5G/ vedľa spustiteľného súboru. Dodatočné filtre je možné pridať manuálne cez UI.
Súbor obsahuje blok <Query>...</Query> (alebo celý text súboru, ak tag chýba). Text sa delí na dve časti oddelené prvou bodkočiarkou:
- Pred bodkočiarkou -- assignments (priradenia hodnôt)
- Za bodkočiarkou -- conditions (podmienky)
Syntax: "NázovStĺpca" = hodnota
Každý assignment definuje, aké hodnoty sa majú zapísať do daného stĺpca. Jedno pole môže mať viac assignment hodnôt -- vytvoria sa všetky kombinácie (kartézsky súčin).
Podmienky sú zoskupené v zátvorkách (...). Každá skupina je kombinácia AND podmienok. Viacero skupín funguje ako OR.
Typy podmienok:
- Rovnosť:
"Pole" = hodnota-- presná zhoda floatov - Rozsah:
"Pole" = od-do-- interval[od, do)(dolná hranica vrátane, horná bez). Ak od == do, správa sa ako rovnosť. Ak od > do, hranice sa automaticky prehodia.
Pre každý riadok sa nájdu všetky pravidlá, ktorých aspoň jedna skupina podmienok sedí. Z nich sa vyberie jedno pravidlo: prednosť má pravidlo s väčším počtom podmienok v najlepšej zhodenej skupine, pri zhode rozhoduje abecedný názov súboru.
Pre vybrané pravidlo sa vygenerujú všetky kombinácie assignment hodnôt. Každá kombinácia vytvorí nový riadok so zmenenými hodnotami v assignment stĺpcoch. Voliteľne sa ponechá aj originálny riadok.
Hľadanie stĺpca prebieha v tomto poradí: presná zhoda názvu, case-insensitive zhoda, špeciálna logika pre Frequency (preferuje stĺpec SSRef, ak existuje), fallback cez aliasy a používateľské mapovanie.
Mobile režim slúži na doplnenie informácie o 5G NR pokrytí do 5G datasetu na základe časovej synchronizácie s NSA LTE meraním. Vstupný (hlavný) CSV je 5G meranie, NSA LTE CSV je súbor s rovnakou trasou meraný v rovnakom čase.
- Načítanie NSA LTE CSV -- rovnaká logika zlúčenia podľa názvov ako pre hlavný súbor, voliteľná aplikácia filtrov. NSA LTE súbory nemusia mať rovnakú hlavičku ako hlavný 5G vstup, ale každý musí obsahovať MCC, MNC, 5G NR a časový stĺpec UTC alebo dvojicu Date + Time.
- Zostrojenie časovej osi -- pre oba datasety sa z riadkov extrahuje čas v milisekundách.
- Vybudovanie lookup tabuliek -- NSA LTE riadky sa zoskupia podľa MCC+MNC a zoradia podľa času. Pre každú skupinu sa prebuduje prefixový súčet YES a NO skóre pre efektívne dotazovanie okien.
- Pre každý 5G riadok -- v NSA LTE dátach sa nájde okno
[čas - tolerancia, čas + tolerancia]a vyhodnotí sa skóre. - Zápis výsledku -- do stĺpca
5G NRv 5G datasete sa zapíšeyes,no, alebo zostane prázdny.
Čas sa vyhodnocuje samostatne pre každý riadok, takže v jednej dávke môžu byť exporty z rôznych meračov aj v rôznych formátoch:
- Date + Time stĺpce -- preferovaná kombinácia dátumu a času, ak je na danom riadku platná.
- UTC ako číslo -- fallback pre daný riadok; automaticky sa rozpoznajú epoch sekundy, milisekundy, mikrosekundy aj nanosekundy.
- UTC ako datetime string -- fallback pre daný riadok; skúšajú sa formáty
YYYY-MM-DD HH:MM:SS.nnn,D.M.YYYY HH:MM:SS,DD.MM.YYYY HH:MM:SS, RFC3339 a ďalšie.
Časová zóna: Europe/Bratislava (ak dostupná), inak lokálna.
Hodnoty yes, true, 1, y, t, a, ano, áno sa normalizujú na yes. Hodnoty no, false, 0, n, f na no. Všetko ostatné zostáva prázdne.
Pre daný 5G riadok sa v NSA LTE lookup tabuľke binárnym vyhľadávaním nájdu všetky NSA LTE riadky v časovom okne:
- Ak okno obsahuje aspoň jedno
yes, výsledok jeyes. - Inak ak obsahuje aspoň jedno
no, výsledok jeno. - Inak je výsledok prázdny (žiadna zhoda).
- Ak okno obsahuje zároveň
yesajno, eviduje sa ako konflikt, ale výsledok ostávayes.
Tolerancia je konfigurovateľná (predvolene 1000 ms). Záporná tolerancia sa automaticky nastaví na 0.
Hľadanie prebieha najprv podľa presnej zhody MCC+MNC. Ak 5G riadok nemá MCC/MNC, použije sa globálny NSA LTE lookup cez všetkých operátorov.
- NSA LTE súbor musí obsahovať stĺpce MCC, MNC a 5G NR (alebo alias 5GNR, NR).
- NSA LTE súbor musí obsahovať aspoň jeden riadok s
5G NR = yes. - Každý vybraný NSA LTE súbor musí mať aspoň jeden použiteľný riadok s časom, MCC, MNC a hodnotou 5G NR
yesalebono. - Každý hlavný vstupný CSV zdroj musí mať parsovateľný čas a aspoň jednu MCC/MNC + časovú zhodu; neplatný alebo úplne nezosynchronizovaný zdroj sa ohlási konkrétnou cestou.
- Ak sa medzi 5G a NSA LTE dátami nenájde ani jedna časová zhoda v nastavenej tolerancii, spracovanie skončí jasnou chybou namiesto tichého označenia všetkých riadkov ako
no.
Všetky GPS súradnice (WGS84, EPSG:4326) sa pred výpočtom zón transformujú do metrického súradnicového systému S-JTSK (EPSG:5514). Implementácia je celá v Go bez externých knižníc.
- Stupne na radiány
- Geodetické na ECEF (Earth-Centered Earth-Fixed) na elipsoide WGS84
- Inverzná Helmertova transformácia (7-parametrová, position-vector konvencia) -- prevod z WGS84 geocentrických na Bessel 1841 geocentrické
- ECEF na geodetické na elipsoide Bessel 1841 (iteratívny výpočet)
- Krovákova projekcia -- prevod na rovinné súradnice
- Prehodenie osí na EPSG:5514 konvenciu (East, North)
Používa sa na spätný prevod stredov zón do GPS pre export:
- Aproximácia cez inverznú Krovákovu projekciu + Helmert forward + ECEF na WGS84
- Newton-Raphson spresňovanie (max 8 iterácií) s Jakobiánom cez konečné diferencie
- Translácie: tx=485.0 m, ty=169.5 m, tz=483.8 m
- Rotácie: rx=7.786", ry=4.398", rz=4.103" (v uhlových sekundách)
- Mierka: 0 ppm
Program podporuje tri režimy rozdelenia bodov do priestorových jednotiek:
Body sa rozdeľujú do úsekov po trase podľa kumulatívnej vzdialenosti. Každý úsek má dĺžku definovanú veľkosťou zóny (predvolene 100 m).
Výpočet pre jeden CSV track:
- Kumulatívna vzdialenosť sa počíta postupne:
cumDist += hypot(x_i - x_{i-1}, y_i - y_{i-1}) - ID úseku:
floor((cumDist + 1e-9) / veľkosťZóny)-- epsilon 1e-9 chráni pred hraničnými chybami float aritmetiky - Ak krok prekročí hranicu jedného alebo viac úsekov, pre každú hranicu sa interpoluje začiatok nového úseku:
P_start = P_prev + (P_curr - P_prev) * fraction, kdefraction = (boundary - prevCumDist) / stepDist, clipované do [0, 1]
Pri viacerých vstupných CSV sa nevytvára jedna časovo zoradená línia. Každý vstupný CSV súbor sa najprv berie ako samostatný track a vzdialenosť sa počíta iba medzi susednými bodmi toho istého tracku. Program potom z prekrývajúcich sa alebo nadväzujúcich trackov odvodí spoločnú trasu a priradí body na spoločnú vzdialenosť po tejto trase.
Spoločná trasa pre viac CSV:
- Tracky sa párujú podľa polohy, nie podľa času.
- Ak dva tracky merajú rovnaký úsek, body na rovnakých 100 m intervaloch dostanú rovnaký
segment_<id>. - Ak jeden track pokračuje ďalej než druhý, spoločná trasa sa predĺži o pokračujúci track.
- Opačný smer merania je podporený, ak sa tracky polohovo prekrývajú.
- Dlhá medzera medzi nadväzujúcimi trackmi sa ponechá v spoločnej vzdialenosti po trase aj vtedy, keď je vypnuté generovanie prázdnych úsekov. V QGIS potom bude viditeľná medzera medzi meranými segmentmi.
- Ak je zapnuté generovanie prázdnych úsekov, rovnaká medzera sa navyše vyplní prázdnymi 100 m úsekmi. Tento režim pokrýva tunely, výpadky GPS alebo úseky bez meraní.
Na priradenie prekrývajúcich sa bodov sa používa tolerancia 75 m od spoločnej trasy. Tracky sa pre porovnanie vzorkujú rovnomerne podľa prejdenej vzdialenosti, takže rozdielny počet opakovaných GPS riadkov pri státí neovplyvní zladenie meračov. Ak sa track polohovo neprekrýva s už známou trasou, pripojí sa cez najbližší koncový bod ako pokračovanie trasy; orientácia sa odvodí z konkrétneho pripájaného konca aj vtedy, keď bol nadväzujúci úsek zaznamenaný opačným smerom. Prázdne úseky rozhodujú iba o tom, či sa chýbajúce segmenty v medzere aj zapíšu do exportu.
Kľúč zóny: segment_<id>. Súradnice zóny: interpolovaný začiatok úseku.
Body sa mapujú do štvorcovej mriežky:
zónaX = floor(x / veľkosťZóny) * veľkosťZónyzónaY = floor(y / veľkosťZóny) * veľkosťZóny
Kľúč zóny: <zónaX>_<zónaY>. Do exportu sa zapisujú súradnice stredu zóny (zónaX + veľkosť/2, zónaY + veľkosť/2) pretransformované späť do WGS84.
Rovnaká mriežková logika ako center, ale do exportu sa zapisujú pôvodné GPS súradnice z prvého nameraného bodu v zóne.
Predvolená: 100 m. Ak je zadaná hodnota <= 0, automaticky sa použije 100.
Riadky sa zoskupia podľa kombinácie: zóna + operátor (MCC_MNC) + frekvencia + PCI. Riadky s prázdnou hodnotou v ktoromkoľvek z týchto polí sa vylúčia.
Pre každú skupinu sa vypočíta:
- RSRPAvg = súčet RSRP / počet meraní
- SINRAvg = súčet SINR / počet platných SINR hodnôt (iba ak aspoň jedna existuje)
- NRValue =
yesak aspoň jedno meranie má NR=yes, inaknoak aspoň jedno jeno, inak prázdne
Pre každú kombináciu zóna + operátor sa vyberie jedna frekvencia + PCI. Skupiny sa zoradia:
- RSRPAvg zostupne (lepší signál prvý)
- Počet meraní zostupne (viac dát prvý)
- Frekvencia numericky vzostupne (tie-break)
- Frekvencia lexikograficky vzostupne
- PCI numericky vzostupne
- PCI lexikograficky vzostupne
Z takto zoradeného zoznamu sa vyberie prvá skupina, ktorá súčasne spĺňa:
RSRPAvg >= RSRPThresholdSINRAvg >= SINRThreshold
Ak žiadna skupina nespĺňa obe prahy, vyberie sa úplne prvá (najlepšia podľa RSRP).
Pre export štatistík:
Bez SINR:
- GOOD ak
RSRPAvg >= RSRPThreshold
So SINR:
- GOOD ak
RSRPAvg >= RSRPThresholdaSINRAvg >= SINRThreshold
V mobile režime navyše:
- GOOD len ak súčasne
5G NR = yes
Hranica (>=) patrí do GOOD.
- Prvý riadok je prázdny
- Druhý riadok je hlavička: pôvodné stĺpce z CSV + (voliteľne 5G NR stĺpec) +
Riadky_v_zone+Frekvencie_v_zone - Nasledujúce riadky: po jednom za každú kombináciu zóna + operátor
| Pole | Formát |
|---|---|
| RSRP | %.2f (priemer) |
| SINR | %.2f (priemer, ak existuje) |
| Lat/Lon (segments, center) | %.6f (prepočítané zo stredu zóny) |
| Lat/Lon (original) | pôvodná hodnota z prvého bodu |
| 5G NR | 1 (yes), 0 (no), alebo pôvodná hodnota |
| MCC, MNC, PCI | celočíselný formát (bez .0) |
Ak je zapnutá voľba "Generovať prázdne zóny", pre každú kombináciu zóna + operátor, kde chýba meranie, sa doplní riadok:
- RSRP = -174
- SINR = -50 (ak je SINR stĺpec vo vstupnej schéme)
- 5G NR = 0
- Súradnice sa prepočítajú zo stredu príslušnej zóny
- Na konci riadku je komentár
# Prázdna zóna - automaticky vygenerovaná(alebo# Prázdny úsek...pre segmenty)
V režime segmentov sa prázdne úseky generujú aj pre interpolované časti trasy, kde nie je žiadny meraný bod. Typický prípad je tunel, výpadok GPS alebo medzera medzi dvoma nadväzujúcimi CSV trackmi.
Ak sú zapnuté prázdne zóny aj custom operátori, pre každého zadaného operátora (MCC:MNC alebo MCC:MNC:PCI), ktorý sa v dátach nenachádza, sa pre každú zónu doplní prázdny riadok s rovnakými hodnotami. Zároveň sa pre nich vytvorí placeholder v štatistikách.
Hlavička: MNC;MCC;<GOOD stĺpec>;<BAD stĺpec>
Názvy GOOD/BAD stĺpcov sa generujú dynamicky podľa nastavených prahov a režimu:
- Bez SINR:
RSRP >= -110/RSRP < -110 - So SINR:
RSRP >= -110 a SINR >= -5/RSRP < -110 alebo SINR < -5 - V mobile režime sa pridáva:
a 5G NR = yes/alebo 5G NR != yes
Pre každého operátora (MCC + MNC) sa spočíta počet GOOD a BAD zón podľa pravidiel klasifikácie.
Ak sú zapnuté prázdne zóny: chýbajúce zóny pre operátora sa pripočítajú k BAD. Výpočet: missingZones = celkovýPočetZón - počtZónOperátora, a BAD += missingZones.
Ak je výsledný dataset prázdny, stats súbor obsahuje len prázdny riadok.
Voliteľná funkcia v UI umožňuje definovať časové okná, ktoré vyrežú zadanú časť meranej trasy. Používateľ zadá začiatok a koniec (dátum + čas). Program najprv z kompletných dát vypočíta trasu, segmenty a prípadné prázdne segmenty. Až potom premietne časové okno na vzdialenosť pozdĺž trasy a z finálneho datasetu odstráni všetky dotknuté segmenty vrátane automaticky vygenerovaných prázdnych segmentov.
Ak v časovom okne nie je žiadny bod s použiteľnými GPS súradnicami (napríklad počas prejazdu tunelom), poloha začiatku a konca výrezu sa interpoluje medzi najbližšími časovo označenými bodmi pred a po okne. Časové okno tak zabráni tomu, aby sa tunel po odstránení meraní znovu objavil ako séria prázdnych úsekov.
V režimoch štvorcových zón (center, original) sa časový filter tiež aplikuje až po priestorovom spracovaní, ale odstraňuje jednotlivé merania patriace do okna. Koniec okna zadaný na celé sekundy zahŕňa celú poslednú sekundu vrátane milisekundových meraní.
Podporované formáty dátumu a času sú rovnaké ako pri mobile sync. Pri viacerých oknách sa riadok vylúči, ak padne do ktoréhokoľvek z nich.
| Parameter | Predvolená hodnota |
|---|---|
| Režim zón | segments (úseky po trase) |
| Veľkosť zóny / úseku | 100 m |
| RSRP hranica | -110 dBm |
| SINR hranica | -5 dB |
| Tolerancia mobile sync | 1000 ms |
| NR stĺpec | 5G NR |
| Generovať prázdne zóny | vypnuté |
| Ponechať originálne riadky pri filtroch | vypnuté |
| Mobile režim | vypnutý |
Program obsahuje pripravené filtre pre slovenských operátorov:
Priečinok filters/ (LTE filtre):
- Orange (231-01) so zdieľanými frekvenciami SWAN
- Slovak Telekom (231-02) so zdieľanými frekvenciami O2
- SWAN (231-03) so zdieľanými frekvenciami Orange
- O2 (231-06) so zdieľanými frekvenciami Slovak Telekom
Priečinok filtre_5G/ (5G filtre):
- Orange (231-01) -- frekvenčné rozsahy
- Slovak Telekom (231-02) -- frekvenčné rozsahy
- SWAN (231-03) -- frekvenčné rozsahy
- O2 (231-06) -- frekvenčné rozsahy
Tieto filtre zabezpečujú, že pri meraní zdieľaných frekvencií sa riadok správne zduplikuje pre oboch operátorov.
100mscript/
main.go -- vstupný bod, konfigurácia Wails okna
app.go -- Wails API vrstva (file dialógy, preview, spustenie)
wails.json -- Wails konfigurácia projektu
internal/backend/ -- celá výpočtová logika
types.go -- definície ProcessingConfig, ProcessingResult
runner.go -- vstupný bod RunProcessing
runner_native.go -- hlavný pipeline (orchestrácia krokov)
csv_loader.go -- načítanie CSV, detekcia kódovania, hlavička
csv_merge.go -- zlúčenie viacerých CSV, triedenie podľa času
filters.go -- parser filtračných pravidiel
filter_apply.go -- aplikácia filtrov na CSV dáta
mobile_sync_native.go -- synchronizácia 5G NR z NSA LTE
projection_native.go -- geodetická transformácia WGS84 <-> S-JTSK
processing_native.go -- výpočet zón, agregácia, výber frekvencie
outputs_native.go -- export _zones.csv a _stats.csv
input_kind.go -- detekcia 5G vs LTE
mapping.go -- automatické mapovanie stĺpcov
original_rows.go -- správa original_excel_row
time_selector.go -- časové okná a triedenie podľa času
processing_events.go -- progress eventy pre UI
frontend/src/
main.ts -- celé UI (formulár, mapovanie, spustenie, výsledky)
app.css -- štýly
filters/ -- LTE filtre pre slovenských operátorov
filtre_5G/ -- 5G filtre pre slovenských operátorov
data/ -- testovacie vstupné a výstupné dáta
build/ -- Wails build konfigurácia
Po spracovaní program zobrazí:
| Metrika | Popis |
|---|---|
| Unikátne zóny | Počet rôznych zón v export dátach |
| Unikátni operátori | Počet rôznych MCC_MNC kombinácií |
| Celkový počet riadkov zón | Počet riadkov v zones výstupe |
| Pokrytie (%) | Iba pre grid režimy (nie segmenty): pomer obsadených zón k teoretickému maximu na základe bounding boxu |
Pokrytie sa počíta: rangeX = (maxX - minX + veľkosťZóny), rangeY = (maxY - minY + veľkosťZóny), teoretickýMax = (rangeX / veľkosťZóny) * (rangeY / veľkosťZóny), pokrytie = (unikátneZóny / teoretickýMax) * 100.
Aplikácia má jedno okno rozdelené na ľavý a pravý panel.
Ľavý panel:
- Vstupné dáta -- správa zoznamu CSV súborov (pridať, odstrániť, vyčistiť), automatické načítanie náhľadu po pridaní. Voľba mobile režimu s NSA LTE súbormi. Správa filtrov (automatické + manuálne).
- Nastavenia spracovania -- výber režimu zón, veľkosť, prahy RSRP/SINR, voľba ponechania originálnych riadkov, generovanie prázdnych zón, custom operátori.
- Mapovanie stĺpcov -- dropdown pre každý povinný a voliteľný stĺpec, predvyplnený z hlavičky.
- Časové úseky -- definícia časových okien pre vylúčenie meraní.
Pravý panel (sticky):
- Kontrola pripravenosti -- prehľad, či sú splnené všetky podmienky pre spustenie vrátane dostupnosti povinných mapovaných stĺpcov vo všetkých CSV.
- Priebeh spracovania -- krokový indikátor fázy pipeline s progress barom.
- Výstupné cesty -- voliteľné prepísanie výstupných súborov.
- Tlačidlo Spustiť -- spustí spracovanie.
- Výsledky -- po dokončení zobrazí štatistiky a odkazy na výstupné súbory.
Jakub Vysocan (jakubvysocan@gmail.com)