Repository navigation
Map Layers
🇮🇱 עברית
NavAid ships ten base-map layers. Pick one with the Layer dropdown in the toolbar's Map section; the Layer opacity slider directly beneath it dims the one you picked, and Base map (Display) chooses what shows through underneath.
| Layer | Source | Notes |
|---|---|---|
| CVFR | flight-maps.com | Default. Israeli combined VFR chart with airspace, NAVAIDs, terrain. |
| CVFR (AIP) (not yet released) | CAA AIP — not flight-maps.com | The same chart, cut from the CAA's own two CVFR sheets. Carries the leg distances, magnetic tracks and altitude flags the extracted set drops. In development — not in the layer picker yet. |
| Navigation | flight-maps.com | Nav-focused chart series. |
| Low Alt | flight-maps.com | Low-altitude chart for ultralights. |
| Helicopters | flight-maps.com | Helicopter-relevant chart. Not offered on the live site — see below. |
| ATS routes (ENR 6.1) | CAA AIP — not flight-maps.com | The enroute sheet: ATS routes, levels, designators, comm facilities. Amendment 2/25, eff. 02 OCT 25. |
| Satellite | Esri World Imagery | Satellite imagery, no labels. |
| OpenStreetMap | openstreetmap.org | OSM road / city base. |
| OpenFlightMaps | open flightmaps association | Aeronautical chart for about twenty regions, mostly European (Greece, Italy, Austria, Croatia…). No data over Israel (nor Spain, the UK…): it is always offered, and where the view is empty the map says so — see No data here below. The tiles are transparent, so the base map fills in beneath them; published to zoom 12. Gist: layerEnabledOpenFlightMaps. |
| World (offline) | Natural Earth (public domain), shipped with the app | Country outlines and names, and about 600 major cities (every capital and every city of a million people or more), in English/Hebrew; no tiles, works with no connection at all — the chart for a long flight. Gist: layerEnabledWorld. |
The world map is always underneath. Whatever chart is chosen, the country outlines and names are drawn below it, so wherever a tile is missing — offline, on an airliner, outside a downloaded area, beyond a chart's edge — you see coastlines, borders and names instead of an empty map. A chart tile that fails to load is transparent, so the world map shows through it.
Under the outlines is shaded relief — land colour, mountains, desert and sea, from Natural
Earth (public domain) — shipped with the app as three packed files (11.6 MB), so it works offline
too. It is a world-scale picture, about 2.5 km a pixel, so it shows fully to zoom 8 and fades
into a plain land colour by zoom 9; closer in, the clean map with its borders and names is
easier to read than an enlarged blur, and over Israel the offline CVFR chart covers it anyway.
Choose World (offline) as the map under the chart to see it around the charts online as well.
worldRelief (tuning → Base layers) turns it off. The packs are built by scripts/build-relief-tiles.py.
Cities are a dot and a name (a capital's dot is ringed), thinning out as you zoom out: the biggest (Cairo, London) from a continent away, all of them — Haifa, say — from a country's view. In Hebrew the name runs to the left of its dot.
Zoom out to a continent, on any chart. The map zooms out to zoom 2 — all of Europe in one
screen — whichever chart is chosen. The Israeli charts are published from zoom 6, so further out
they drop away and the countries show; OpenStreetMap and OpenFlightMaps fill in down to zoom 4.
The gist can raise the limit (mapMinZoom, default 2; 8 was the old floor).
Zoom in to z18 (64×), on any chart. Every chart goes to the same zoom 18 (MAP_MAX_ZOOM); it stopped at z15 (8× on the zoom readout) before. Satellite and OpenStreetMap have real detail all the way in. Past a chart's sharpest tiles it is drawn from them, enlarged: CVFR, Navigation and Low Alt from z13, Helicopters and OpenFlightMaps from z12.
No data here. A chart with nothing to draw where the map is says so, once per arrival in an empty area: "CVFR has no data here: it covers Israel.", "OpenFlightMaps has no data here: it covers about twenty regions, mostly in Europe." It is read from the chart itself, not a list of regions: the Israeli charts by their own frame (offline too) or a missing tile on our mirror; OpenFlightMaps by its empty (fully transparent) tiles; ATS by the sheet's frame. OpenStreetMap, Satellite and World cover the world and never say it. A tile that failed for want of a signal is not "no data", so nothing is said then.
Helicopters is not offered on the live site. The layer is built and works, but it is switched off in the deployed configuration (
layerEnabledHelicopters), so it does not appear in the Layer list. Anyone running their own copy can turn it back on from the tuning gist. The helicopter route overlays are a separate thing and still available — see Extra Layers.
Not yet in the released app. This layer and its build script (
scripts/build-cvfr-tiles.py) live on a development branch, not onmain; the tiles are not yet served and the layer does not appear in the picker. The method below is documented ahead of release.
The CVFR chart, built here rather than downloaded. The CAA publishes it as two PDFs — AIP part II, northern and southern sheets — and those are vector, so what survives a render is what the paper prints. Side by side with the flight-maps.com CVFR tiles at the same zoom, this one carries the annotations a pilot actually flies by: leg distances, magnetic tracks, and the altitude flag on each leg.
| Coverage | 29.43–33.36 N, 34.10–35.91 E |
| Zooms | z8–13 (16.3 m/px at z13); Leaflet upscales 6 and 7 |
| Size | 3,768 tiles, 155 MB |
| Served from |
navaid-tiles.supino.org/CVFR-AIP/{z}/{x}/{y}.png — ours, never flight-maps.com |
| Built by | scripts/build-cvfr-tiles.py |
How it is placed. The sheets are drawn on a conic projection: their meridians converge, Web Mercator's do not, and laid down as printed the corners land about 900 m out. So the script reads the sheet's own printed graticule, fits the cone its meridians meet at, and treats each parallel as a circle about that apex — the two ends of every parallel agree to about 1 pt in 120,000, which is the check that the shape is right. Same method as the ATS sheet below.
What is cropped. Two cuts. The neat line, and then the panels the CAA prints inside it — title, notes, frequency table, legend, scale bars, and the north sheet's "הגדלת אזור המרכז" Tel Aviv enlargement (drawn at a different scale, over the sea off Netanya). Warped into place those would stand as walls of Hebrew text on Jordan and the Mediterranean. Cut panels become transparent, not white, so the map underneath shows through. Where the two sheets overlap (31°20'N–31°30'N) they blend rather than seam.
Rebuilding after an amendment is one command:
python3 scripts/build-cvfr-tiles.py cvfr-north.pdf cvfr-south.pdf --out CVFR-AIPThe panel boxes are measured off the paper and live in the script's PANELS table; a
re-issued sheet that moves them needs that table re-measured.
The one chart here that is not tiles from flight-maps.com. It is the CAA's own AIP sheet,
fetched from their index, reprojected and shipped in the app as a single raster
(docs/ats-img/ats-routes.png, bounds in data/ats-chart.json). Two consequences:
- It does not sharpen as you zoom. About 100 m/px, so it softens past zoom 11 — there is no tile set behind it. That is the sheet the CAA publishes.
-
It had to be reprojected. The sheet is drawn on a conformal cone: on the paper, a degree
of longitude takes 92.7 pt at the top edge and 96.6 pt at the bottom, tracking cos(latitude),
which is the opposite of what Web Mercator does. Laid down as printed it would read about
4 km out at the corners.
scripts/warp-ats-chart.pyrebuilds it from the sheet's own graticule — meridians are straight lines meeting at the cone's apex, parallels are circles about that apex — and lands within ~0.25 km of the drawn graticule.
Its reporting points ship as data/ats-route-graph.json (81 nodes, read off the sheet's own
printed coordinates by scripts/extract-ats-waypoints.py), so Follow chart hands them to
the route builder while it is showing. It carries no edges: the sheet's route structure —
designators, levels, one-way segments — is not extracted, so there is no auto-routing on it.
Display → Base map chooses the map drawn below the chart. It defaults to
OpenFlightMaps (defaultBaseLayer; OpenStreetMap until October 2026), which is what fills
in around a chart that covers only the FIR — but any chart can take that place, which is how two
charts are read together:
- ATS over the satellite image — Layer: ATS, Base map: Satellite.
- ATS over CVFR — Layer: ATS, Base map: CVFR.
Dim the top one with Layer opacity (Map) to see through it; baseLayerOpacity
(default 0.7) sets how strongly the base map itself is drawn. A chart is never laid under
itself. Your choice is saved as navaid.baseLayer, and it wins over the default.
OpenFlightMaps comes with OpenStreetMap beneath it. OpenFlightMaps is aeronautical data (airspace, airports, VORs, labels) on a transparent ground with no terrain, so on its own it is lines on the plain world map. Chosen as the base map, it is a stack: OpenStreetMap at the bottom, OpenFlightMaps above it, the chart on top, and the credits name both. Every other base map is a single layer. If OpenStreetMap or OpenFlightMaps is itself the chart, only the other one stays underneath. OpenFlightMaps has no data over Israel or Cyprus, so there it is OpenStreetMap under the chart.
CVFR, ATS and Low Alt each carry their own route graph — their own waypoints, reporting points and names. A route drawn on one is a list of names the other two do not have, so with a route on screen NavAid refuses to switch between them and says which chart the route was planned on. The picker snaps back to where the map actually is.
Everything else in the picker is scenery over the same ground — Navigation, Satellite, OpenStreetMap, the helicopter chart — and changes what is underneath rather than what the route means. Those are never blocked.
The chart a route belongs to is remembered rather than read from the active layer, so a detour through Satellite cannot launder the switch; its own chart is always reachable again. Two escapes stay open: clearing the route unpins it (and a route drawn afterwards belongs to whichever chart you are on then), and a chart the gist withdraws can still fall back to CVFR — a route does not outrank a chart that is no longer in service.
Your selection is saved in localStorage under navaid.layer. Older saved values (Nav, Heli) are migrated to the new names automatically.
-
Only the live site draws from
flight-maps.com. The charts are hosted there as a courtesy, so every other deployment of this same code — a PR preview under/pr/<n>/,/staging/, a fork, a developer's laptop — draws the identical charts from our own mirror athttps://navaid-tiles.supino.orginstead. The check is the hostname plus the path, and anything it cannot identify falls back to the mirror. - PNG export and offline downloads always use that mirror: it serves
Access-Control-Allow-Origin: *, which the canvas export needs. Off the live site the displayed tiles are the mirror's too, so export can read them directly. - OSM and Esri support CORS directly; PNG export fetches them from origin.
PNG export renders each layer at its maximum practical native tile zoom (z13 for CVFR), not the on-screen zoom. So even a zoomed-out map view exports at full chart detail. The Map opacity slider is honored in the exported base map, and flight-maps.com tiles outside published chart bounds are skipped as expected blank areas.
From a waypoint inspector you can open an expanded satellite view — a real Leaflet map centred on the point, with pan, a zoom control (the same black-on-white bottom-right control as the main map), a layer dropdown, and a recentre (⌖) button. The four flight-maps.com charts are only selectable up to their tile range; past that zoom they're disabled and the view falls back to Satellite. See Inspector.
Charts and imagery remain © their providers. NavAid is not affiliated with flight-maps.com / CAAI / Esri / OSM.
For pilots
- Quick Start
- Video tutorials · סרטונים
- Features
- The Map
- Auto zoom
- Toolbar
- Phone layout
- Safety notice
- Route and Legs
- Waypoints and Notes
- Inspector
- AI Assistant
- User Guide
- Frequency Changes
- VOR and Radial/DME
- Map Layers
- Bearing dial
- Extra Layers
- Airport charts
- Flight Plan
- Route check
- Flight planning form
- Submit a flight plan
- Fuel
- Print and Export
- Simulator Connect
- Google Earth
- GPS Track Recording
- Comm failure
- Follow me
- Bilingual UI
- Offline and PWA
- Settings and Persistence
- Keyboard and Touch
- FAQ and Troubleshooting
For developers
- Architecture
- Directory Structure
- Tuning Panel
- Hidden Tools
- LocalStorage Schema
- Nav-waypoints dataset
- Airfields dataset
- Service Worker
- Deployment
- Contributing
- Changelog
🇮🇱 עברית
לטייסים
- התחלה מהירה
- תכונות
- עוזר AI
- מדריך למשתמש
- זום אוטומטי
- שינויי תדר
- VOR ו-Radial/DME
- סרגל הכלים
- פריסת הטלפון
- הודעת הבטיחות
- שכבות מפה
- שכבות נוספות
- תוכנית טיסה
- בדיקת מסלול
- טופס תכנון טיסה
- הגשת תוכנית טיסה
- הדפסה וייצוא
- חיבור סימולטור
- Google Earth
- הקלטת מסלול GPS
- תקלת קשר
- עקבו אחריי
- ממשק דו-לשוני
- לא מקוון ו-PWA
- הגדרות ושמירה
- מקלדת ומגע
- שאלות נפוצות ופתרון תקלות
למפתחים
🌐 Live 🧪 Staging 📦 Repo 💡 Ideas / bugs