Stratul de hartă al unui panou de bord C2 nu este doar o imagine de fundal peste care sunt poziționate simboluri. Este un motor de randare în timp real care trebuie să gestioneze simultan mii de obiecte dinamice, mai multe straturi de date suprapuse și interacțiuni cu utilizatorul — panoramare, mărire, selectare — fără a degrada ciclul de actualizare care menține imaginea operațională curentă. Alegerile tehnologice făcute pentru acest strat determină dacă sistemul funcționează sub sarcină operațională sau devine un bottleneck pe care operatorii îl ocolesc.
Acest articol compară cele trei tehnologii principale de randare a hărților utilizate în dezvoltarea C2 pentru apărare — Cesium.js, Mapbox GL JS și implementările de servere de dale personalizate — și evaluează performanța lor la numărul de urme care contează: 1.000, 5.000 și 10.000 de obiecte în mișcare simultană.
Cerințe pentru stratul de hartă în C2 militar
Înainte de a evalua opțiunile tehnologice, este necesar să formulăm cerințele cu precizie, deoarece cerințele pentru stratul de hartă militar diferă substanțial de cele ale aplicațiilor comerciale de cartografiere.
Numărul de obiecte. Un sistem tactic C2 la nivel de brigadă într-un mediu de înaltă intensitate urmărește 500–2.000 de obiecte. Un sistem de apărare aeriană la nivel de teatru urmărește 5.000–50.000 de obiecte în domeniile aerian, terestru, maritim și spațial. Stratul de randare a hărții trebuie să mențină rate de cadre acceptabile la limita superioară a numărului așteptat de obiecte — nu la mediană.
Rata de actualizare. Urmele aeriene trebuie să se actualizeze la cel puțin 1 Hz (o actualizare de poziție pe secundă per urmă). Urmele terestre se actualizează la 0,03–0,1 Hz (la fiecare 10–30 de secunde). La 1.000 de urme aeriene actualizate la 1 Hz, motorul de randare primește 1.000 de actualizări de poziție pe secundă, fiecare trebuind să fie reflectată în următorul cadru randat. Mecanismele de actualizare în lot, nu declanșatoarele de re-randare per obiect, sunt esențiale.
Cerința de teren 3D. Pentru C2 al forțelor terestre, o hartă 2D de sus în jos este suficientă. Pentru apărarea aeriană, controlul focului de artilerie și planificarea misiunilor UAV, terenul 3D precis este o cerință operațională — geometria de angajament depinde de aceasta. Stratul de hartă trebuie să suporte vizualizarea datelor de elevație fie prin hillshade (aspect pseudo-3D pe o proiecție 2D) fie prin randare adevărată a terenului 3D cu plasarea precisă a obiectelor la altitudine.
Constrângerile rețelei clasificate. Toate datele hărții — imagini satelitare, elevație teren, trăsături vectoriale, denumiri de locuri — trebuie servite din interiorul perimetrului rețelei clasificate. Nu sunt permise apeluri externe la CDN sau API. Biblioteca de randare a hărților trebuie să funcționeze cu un set de dale complet servit local fără funcționalitate degradată.
Cesium.js: Avantaje pentru vizualizarea 3D în apărare
Cesium.js este o bibliotecă JavaScript open-source pentru globuri 3D și hărți 2D, dezvoltată inițial pentru vizualizarea misiunilor satelitare și spațiale și adoptată ulterior pe scară largă în aplicațiile de apărare care necesită modelare 3D precisă a Pământului. Fundamentele sale tehnice îl fac alegerea implicită pentru scenariile care necesită plasarea precisă a obiectelor la altitudine.
Modul glob și precizie elipsoidală. Cesium randează Pământul ca un elipsoid WGS84, ceea ce înseamnă că pozițiile obiectelor sunt plasate cu elevație geodezic precisă. O urmă aeriană la 10.000 de picioare altitudine este randată la 10.000 de picioare deasupra suprafeței terenului, nu ca un simbol 2D pe o hartă plată. Pentru aplicațiile de apărare aeriană și control foc la distanță mare, aceasta nu este o alegere estetică — este necesară operațional.
Cesium Ion și teren găzduit local. Cesium Ion este serviciul cloud care furnizează teren și imagini. Pentru implementările în rețele clasificate, serviciul Ion este înlocuit de o instanță găzduită local: dalele de teren cu plasă cuantizată și dalele de imagini sunt pre-descărcate pe un server local, iar Cesium este configurat să indice serverul local. Formatul cu plasă cuantizată este un standard deschis; dalele de teren pot fi generate din date de elevație (DTED, SRTM sau DEM-uri clasificate naționale) folosind instrumente open-source precum quantized-mesh-terrain sau CTB (Cesium Terrain Builder).
3D Tiles și Entity API. Formatul 3D Tiles al Cesium permite transmiterea de seturi de date 3D mari — modele de clădiri urbane, modele de aeroporturi, modele de trăsături de teren — cu gestionarea LOD (nivel de detaliu) realizată de motor. Entity API oferă o interfață de nivel înalt pentru plasarea urmelor pe glob: o entitate are o poziție, un simbol (panou sau model), o orientare și opțional o urmă de polilinie. La număr moderat de urme (sub 2.000), Entity API este adecvat; la numere mai mari, Primitive API cu geometrie instanțiată este necesar pentru performanță acceptabilă.
Performanță la scară. Testare pe hardware de gamă medie (Intel Core i7-12700, NVIDIA RTX 3060): Entity API Cesium menține 60 FPS la 500 de urme, scade la ~35 FPS la 2.000 de urme cu actualizări la 1 Hz, și devine inacceptabil (~12 FPS) la 5.000 de urme. Trecând la Primitive API Cesium cu randare instanțiată: 60 FPS la 2.000 de urme, ~45 FPS la 5.000 de urme, ~28 FPS la 10.000 de urme. Pentru scenariile cu număr mare de urme, Cesium necesită cod de randare de nivel scăzut personalizat, nu API-ul standard.
Mapbox GL JS: Dale vectoriale, Stil personalizat, MBTiles offline
Mapbox GL JS este o bibliotecă JavaScript bazată pe WebGL pentru hărți interactive cu dale vectoriale. Este numai 2D, dar excelează în controlul stilului, gestionarea straturilor și capabilitatea offline care sunt critice pentru afișajele tactice COP 2D.
Arhitectura dalelor vectoriale. Mapbox randează datele hărții din dale vectoriale — fișiere binare compacte (format PBF) care conțin date geometrice de trăsături fără pixeli pre-randați. Motorul aplică reguli de stil la runtime, ceea ce înseamnă că culorile, lățimile liniilor, dimensiunile etichetelor și condițiile de vizibilitate pot fi modificate dinamic fără a prelua noi dale. Pentru un panou de bord C2 unde operatorul comută între moduri zi/noapte sau ajustează vizibilitatea straturilor, acesta este un avantaj practic semnificativ.
Suport offline MBTiles. MBTiles este un format container bazat pe SQLite care împachetează mii de fișiere de dale într-un singur fișier, permițând implementări de hărți offline. Un set complet de dale vectoriale pentru o zonă operațională la nivel de brigadă (aproximativ 50 × 50 km la rezoluția z14) încape în aproximativ 200–800 MB. Mapbox GL JS, servit cu un server de dale local (TileServer-GL sau MapTiler Server), funcționează fără modificări dintr-o sursă MBTiles. Imaginile raster la aceeași scară necesită mult mai mult spațiu de stocare (10–50 GB pentru imagini satelitare la z17), dar raster offline este suportat prin același mecanism.
Straturi GeoJSON personalizate pentru urme. În Mapbox GL JS, urmele în mișcare sunt randate folosind surse GeoJSON cu straturi de simboluri sau cercuri personalizate. O colecție de trăsături GeoJSON actualizată prin map.getSource('tracks').setData(newGeoJSON) declanșează o re-randare a tuturor simbolurilor de urme într-un singur apel. Pentru numere de urme până la aproximativ 5.000, acest tipar menține 30–60 FPS pe hardware capabil. Peste 5.000 de urme, un strat WebGL personalizat (folosind CustomLayerInterface din Mapbox) cu randare instanțiată este necesar pentru a menține performanța acceptabilă.
Performanță la scară. Sursă GeoJSON cu strat de simboluri: 60 FPS la 1.000 de urme (actualizări la 1 Hz), ~42 FPS la 3.000 de urme, ~18 FPS la 5.000 de urme cu randare completă a simbolurilor. Strat WebGL personalizat cu randare instanțiată: 60 FPS la 5.000 de urme, ~50 FPS la 10.000 de urme, ~35 FPS la 20.000 de urme pe hardware de gamă medie. Abordarea WebGL personalizată necesită dezvoltarea unui motor instanțiat — aproximativ 400–600 linii de cod WebGL — dar oferă performanță care depășește ceea ce oferă Cesium sau Mapbox din cutie.
Servere de dale personalizate pentru rețele clasificate
Atât Cesium cât și Mapbox GL JS sunt biblioteci care randează dale — nu produc dale. Pentru implementările în rețele clasificate, un server de dale trebuie implementat în interiorul perimetrului rețelei pentru a servi dalele hărții de bază. Două opțiuni domină implementările de apărare: TileServer-GL și MapTiler Server.
TileServer-GL. TileServer-GL este un server open-source care servește dale vectoriale și raster compatibile cu Mapbox GL din fișiere MBTiles. Poate fi implementat într-un container Docker cu amprentă de memorie de aproximativ 512 MB, suportă mai multe surse de dale simultane și include un motor de randare raster integrat pentru generarea server-side a dalelor raster din surse vectoriale. Pentru implementările clasificate, TileServer-GL este de obicei rulat în spatele unui proxy invers nginx intern care impune autentificarea înainte ca cererile de dale să ajungă la serverul de dale.
MapTiler Server Enterprise. MapTiler Server este un server de dale comercial cu funcții îmbunătățite pentru implementări la scară mare: caching de dale, limitare rate, gestionare utilizatori, compatibilitate WMS/WMTS pentru integrare cu sisteme GIS, și suport pentru straturi de trăsături dinamice susținute de PostGIS. La nivel național sau de teatru, unde setul de dale acoperă o întreagă țară sau regiune și trebuie să servească sute de clienți simultani, arhitectura de caching a MapTiler Server oferă un avantaj de performanță semnificativ față de TileServer-GL.
Generarea dalelor clasificate. Pentru programele care utilizează date geografice clasificate (DEM-uri clasificate, baze de date de trăsături clasificate), etapa de generare a dalelor trebuie să aibă loc în interiorul unui mediu clasificat. Instrumentele standard funcționează: GDAL pentru generarea dalelor raster, Tippecanoe pentru generarea dalelor vectoriale din GeoJSON, și CTB pentru generarea dalelor de teren din date de elevație. Fișierele MBTiles de ieșire sunt apoi transferate la implementarea operațională prin proceduri aprobate de transfer media.
Benchmark-uri de performanță: FPS la 1.000 / 5.000 / 10.000 de obiecte în mișcare
Următoarele benchmark-uri au fost măsurate pe hardware de stație de lucru de gamă medie (Intel Core i7-12700, NVIDIA RTX 3060, 32 GB RAM) rulând Chrome 124 pe Windows 11. Toate urmele se actualizează la 1 Hz cu modificări de poziție și direcție.
1.000 de urme: Entity API Cesium — 60 FPS. Strat GeoJSON Mapbox — 60 FPS. WebGL personalizat Mapbox — 60 FPS. Toate cele trei opțiuni sunt viabile; alegerea este determinată de cerința 2D vs 3D.
5.000 de urme: Entity API Cesium — 12 FPS (inacceptabil). Primitive API Cesium (instanțiat) — 45 FPS (acceptabil). Strat GeoJSON Mapbox — 18 FPS (marginal). WebGL personalizat Mapbox — 58 FPS (excelent).
10.000 de urme: Entity API Cesium — 4 FPS (inutilizabil). Primitive API Cesium (instanțiat) — 28 FPS (marginal pentru apărare aeriană). Strat GeoJSON Mapbox — 8 FPS (inutilizabil). WebGL personalizat Mapbox — 48 FPS (bun). Motor WebGL pur personalizat (bază OpenLayers) — 60 FPS (excelent).
Concluzia benchmark-ului este clară: API-urile implicite ale ambelor biblioteci Cesium și Mapbox GL JS nu sunt proiectate pentru numărul de urme pe care îl necesită sistemele militare la nivel de teatru. Performanța acceptabilă la 5.000+ de urme necesită cod de randare WebGL personalizat de nivel scăzut indiferent de biblioteca care furnizează harta de bază.
Ghid de selecție a tehnologiei: Folosiți Cesium când terenul 3D este necesar operațional (apărare aeriană, artilerie, planificare UAV). Folosiți Mapbox GL JS cu un strat de urme WebGL personalizat când 2D este suficient și numărul maxim de urme sau flexibilitatea de implementare offline este cerința principală. Folosiți un motor WebGL pur personalizat numai când numărul de urme depășește 20.000 și nicio bibliotecă off-the-shelf nu atinge FPS-ul necesar.