# Freemap.sk > Freemap.sk is a free, non-commercial web map application built on OpenStreetMap data by the NGO Freemap Slovakia (a Slovak local chapter of the OpenStreetMap Foundation). Its focus is a detailed outdoor map for hiking, cycling, cross-country skiing and horse riding across Europe, complemented by many additional base and overlay layers and by tools for search, route planning, drawing and measurement, GPX viewing, live tracking, personal maps, map embedding, and export. This file gives AI systems and assistants structured information so they can explain, describe, and help users interact with the site. Contact: [info@freemap.sk](mailto:info@freemap.sk) Key facts: - Built on OpenStreetMap data; the map is continuously updated from the OSM database. - Displays marked hiking, biking, skiing and riding trails, and supports high-resolution (retina) displays. - Background and overlay layers include the NLC forest roads, aerial imagery, public transport, Wikipedia, community photos, and an animated weather radar. - Tools: search (by name or category), route planning (walking, cycling, stroller, wheelchair, car, skiing, etc.), map annotation (points, lines, polygons), measurement (distance, elevation, area, position), GPX track viewing, personal saved maps, live tracking, and export (GPX, GeoJSON, KML/KMZ, PDF, SVG, PNG, JPG). - Users can generate embed code to place the map on their own websites. - The application is a single-page application (SPA) and reflects its state in the URL. The sections below describe how to build map URLs (deep links), the application's functions (the main-menu tools and modals), the available map layers, and external resources. ## Deep links (building map URLs) The app keeps its state in the URL, so you can hand a user a link that opens Freemap in a specific state — a viewport, chosen layers, markers, drawn lines/areas, a planned route, or an opened modal — with no API and no login. This is the normal way to "create a map" programmatically: build the URL and give it to the user. Parameters live in the URL **hash** (`#name=value&name2=value2…`); a query string (`?name=…`) is accepted as a fallback. Base URL: `https://www.freemap.sk/`. The highest-value parameters for building links: - `map=zoom/lat/lon` — viewport, e.g. `map=13/48.7483/19.1480` (coordinates to 6 decimals). With a fractional **Zoom step**, the zoom can be fractional too, to 2 decimals (`map=13.75/…`). - `layers=codes` — base layer + overlays by their id code (see the Layer registry below), e.g. `layers=X` (Outdoor) or `layers=X~I` (Outdoor + Photos). - **`point=lat/lon` — put a marker on the map. This is the parameter for "a map with points / markers". It is repeatable: add one `point=` per marker.** - `line=lat/lon,lat/lon,…` and `polygon=lat/lon,lat/lon,…` — draw a line or a filled area (each repeatable). - `points=[transport/]lat/lon,…` together with `transport=…` — a **planned route** through waypoints. This is routing, not standalone markers — do not confuse the plural `points=` with the marker parameter `point=`. - `show=type[/arg]` — open a modal/viewer, e.g. `show=gallery-viewer/123`. - `elevation-chart=feature` — open the elevation profile on the feature named: `route-planner` (the planned route), `track-viewer` (the active imported track), `tracking/` (a tracked device), or `drawing/` (a drawn line, by its zero-based `line=`/`polygon=` index). Only one profile shows at a time, and it opens once the geometry it charts has loaded — so it can be combined with `points=`, `track-uid=`, `import-url=` or a saved map's `id=`. - `lang=code` — force the UI language (`en`, `sk`, …). **Example — a map with two markers** (Bratislava and Košice) on the Outdoor layer: ``` https://www.freemap.sk/#map=8/48.43/19.18&layers=X&point=48.14816/17.10674&point=48.72083/21.25808 ``` **Styling, labelling and opening the editor.** After the `lat/lon`, a `point` / `line` / `polygon` value may carry style fields, each a one-letter code, joined by the record-separator `%1E` (a leading `%1E` separates them from the coordinates). The useful codes are `L`abel, `C`olor (`%23` = `#`, RGBA hex), `S`hape (`s`quare / `r`ing, default pin), and `I`con spec — `poi:` for a bundled POI icon or `fa:` for a Font Awesome icon (`%3A` = `:`). The markers show on their own; `tools=draw-points` is optional and only additionally opens the drawing toolbar so the user can edit the points. E.g. a blue ring marker labelled "Ahoj!" with the animal-shelter icon: ``` https://www.freemap.sk/#map=17/48.979457/21.169961&layers=X&tools=draw-points&point=48.979061/21.167738%1EC%230000ff%1ELAhoj!%1ESr%1EIpoi%3Aanimal_shelter ``` For every URL parameter and the full style codec, see [`doc/url-params.md`](https://github.com/FreemapSlovakia/freemap-v3-react/blob/main/doc/url-params.md). ## Functions The main menu is under a button with a "hamburger" icon at the top left of the page. **Without a connection** the app says up front what it cannot do: everything that needs the server — logging in and the account, photo upload and the photo leaderboard, the route finder, objects, map details, map changes, live tracking, the map legend, the exports the server produces, purchases and the links that open other websites — is disabled and marked with a crossed-out Wi-Fi symbol whose tooltip says it is unavailable offline; the dialogs of those functions head themselves with the same notice. In the layer menu, every map that has no downloaded tiles carries that symbol too. What works from local or cached data stays available: drawing and measurement, imported tracks and files, the language, saved maps flagged for offline use (and saving to them), offline maps, and the GPS recorder. The search box also stays usable, because coordinates, a bounding box, tile numbers (`zoom/x/y`) and pasted GeoJSON are all read locally; only searching by name needs the server, and only such a query takes the symbol in place of the search button — which is what stops it being submitted. Switching the photos layer on is likewise left alone: it is a local toggle, badged, and simply shows nothing. Settings sit in between. A signed-out browser keeps them itself, so map preferences, custom maps and the layer configuration all save offline; a signed-in account keeps them on the server, where the copy fetched at the next sign-in would overwrite anything saved meanwhile, so those saves wait for a connection and say so. What an offline map holds is the browser's own either way — renaming one, changing its icon or narrowing its area works offline, while enlarging it, downloading a new one or resuming an unfinished one does not. Logging out also waits for a connection, because it ends the session on the server and clears what the account left in this browser. That the app is offline at all is said once, by the same crossed-out Wi-Fi symbol standing beside the logo in the top toolbar. ### Search - Access: the search box at the top of the page ("Search in the map") Searches the map by place name, category, or coordinates. Suggestions appear as you type, from the third character on, biased towards the middle of the map you are looking at; pressing Enter or the search button asks for a longer list of the same. Results may come from several sources — place-name (forward) and reverse geocoding, both answered by Freemap's own Photon instance over OpenStreetMap data and localized into the UI language, nearby and surrounding POIs (Overpass), raw coordinates, OSM elements, and WMS feature info. A geocoded hit arrives as a point; its outline and full tags are fetched from OSM once it is picked. Pointing at a result in the list (or arrowing onto it) draws it on the map, so it can be found without being picked — the map doesn't move and nothing is loaded for it. Picking a result goes to it and shows it on the map for as long as it stays selected — closing its selection toolbar (× or Esc), picking the next result, or selecting anything else takes it off again. A 📌 **Keep on the map** button on that toolbar makes it stay instead: kept results remain on the map beside one another and beside whatever is being looked at, so several can be compared at once. Once a result is kept, that button becomes the 🗑 delete one — the two share the slot, so the toolbar always offers the one thing that can be done about the result being on the map. Clicking one on the map picks it out of them. The selected result is drawn in the selection color instead of the configured result color, the same way a selected POI is; the selection toolbar and the details popup act on it, and it can be used as the start or destination of a route. Its ⋮ menu turns the result into drawing features — asking for a simplification factor, derived from the geometry's own detail, when there is enough of it to be worth thinning — or opens the shared result style. A result that is merely being looked at has no delete button, going as it does the moment it stops being looked at; Del takes either kind off outright. Only kept OSM elements go into the URL, each with its own `osm-node=` / `osm-way=` / `osm-relation=` param, so a link restores all of them — in one Overpass query however many it names. ### UI Language switcher - Access: Main menu > Language - Available languages: Slovak, Czech, Hungarian, English, Polish, German, Italian, Slovenian, French ### Account - Access: Main menu > Account - Keyboard shortcut: e a - URL path: `/#show=account` Available only to logged-in users. Logged-out users instead see a **Log in** item in the same place, which opens the login provider chooser (see Login providers below). The Account modal has three collapsible sections (below); from the buttons at the bottom the user can also log out or delete their account. #### Purchases - Shows current premium status (e.g. "premium access until ", or "premium access, your subscription renews automatically" while an auto-renewing subscription is running) and the credit balance, with a **Buy credits** button - History of purchases (date and item) - Users can purchase yearly premium access and/or credits; a user with a running subscription is shown their premium status instead of purchase options - **Manage payments** — shown to anyone who ever paid through Polar; opens the Polar customer portal in a new tab (cancel the subscription, change the payment method, download invoices). It does not cover payments made through Rovas - Yearly premium costs 8 € up to 31 August 2026 and 15 € from 1 September 2026; it is bought either as an auto-renewing subscription (which keeps the price it was started at) or as a one-time year (which keeps the price for that year only). Until the increase, an info bar announces it and the "Get premium access" modal compares the two options side by side — "Now" and "Price next year": yearly subscription 8 € and 8 €, one-time purchase 8 € and 15 € — notes that a subscription can be cancelled at any time, labels the one-time option in the buy dropdown with both prices, and asks for confirmation before a one-time purchase (offering to subscribe instead). A user holding a one-time year is instead pointed at a "Keep your current price" modal (`/#show=premium-switch`) offering the switch to a subscription, which starts charging only once their paid year runs out - Credits are currently spent only on "Offline maps export" (see description below) - Yearly premium allows: - Removal of the ad banner - Access to premium photos (users can mark uploaded photos as premium-only) - Access to higher map zoom levels for specific map layers (see below) - Multimodal routing (combining several transport modes in one route) - "Optimize order" in the route planner (reordering the waypoints to minimize travel time) - Colorizing routes and tracks in every mode except Elevation, Speed and Time — those three are free, the rest carry a gem and are locked (the option is disabled, the gem opens the purchase flow) - Weather radar: up to 6 hours of history instead of 2, plus the 1-hour forecast (the `R` overlay) - High-resolution elevation data in supported countries (used by the elevation API for the chart, colorizing, and elevation fill); currently Slovakia (DMR 5.0: ÚGKK SR), Czechia (DMR 5G: ČÚZK), Austria (ALS DTM: Geoland.at), Switzerland (swissALTI3D: © swisstopo), Italy (HR-DTM 5 m: IRPI-CNR), Slovenia (DMR: Ministrstvo za okolje in prostor), Spain (MDT05: IGN/CNIG), Sweden (Markhöjdmodell: Lantmäteriet), France (RGE ALTI: IGN), Poland (NMT: GUGiK), Finland (Korkeusmalli 2 m: Maanmittauslaitos), Croatia (DMR: Državna geodetska uprava), and Norway (DTM: Kartverket, NLOD 2.0), with more countries being added; past their borders a premium read falls back to a global 30 m model (GEDTM30), while without premium the elevation API answers from SRTM everywhere #### Personal information - Profile picture (choose / remove) - Name (required) and email address - "About me" description #### Login providers Supported login providers: - Apple - Facebook - Google - OpenStreetMap - Garmin For each provider the modal shows either a **Connect** button (to link it) or a **Disconnect** button (if already linked), so multiple providers can be linked to a single Freemap account. ### Clear map elements - Access: Main menu > Clear map elements - Keyboard shortcut: g c Clears the data layer (all interactive map elements of various tools) from the map. ### Photos - Access: Main menu > Photos - Keyboard shortcut: shift f - Layer code: `I` (e.g. `/#layers=X~I`) Toggles the photos toolbar and the community-photos map layer. Photos appear as markers; the toolbar provides: - **Upload** (p u) — see upload modal below - **Filter** (p f) — "Photo filtering" modal: by tag, author, upload-date range, capture-date range, rating range, and premium / panorama (tri-state) toggles - **Colorize markers by** (dropdown) — None (default), Differ mine, Author, Rating, Taken date, Upload date, Season, Premium, License. Own vs. Wikimedia is **not** a color mode — it's shown by marker **shape** (square = Wikimedia, circle = own photo, wide rectangle = own panorama), independent of the coloring. Wikimedia Commons photos carry Author (numeric Commons id), Taken date, Upload date, Season, Rating, Premium, Differ-mine and License data (imported from the Commons image + Structured-Data dumps), so they colorize in every mode; a photo missing a given value falls back individually (neutral grey for dates/season, the fallback license color for license), just like an own photo. For every mode except None and Author, the dropdown's first item is a **Legend** checkbox (set off by a divider) that toggles a legend below the toolbar — a color scale for the gradient modes (Rating/Taken date/Upload date/Season), labeled swatches for the categorical ones (Differ mine/Premium/License) - **View photos** (dropdown, ordering) — from last uploaded (p l), from newest, from most rated, from last comment - **Leaderboard** (p b) — modal with a time-period selector (All time / last 3 months / last 30 days) and ranking tables: photos per author, and photos per author per country - **Settings** (gear dropdown) — Show shooting direction, Notify photo comments via e-mail, plus premium options: "Include all my photos in premium content" and "Make all my photos accessible to everyone" **Upload modal:** drag-and-drop or pick photos; per photo set name, description, capture date/time, location (with "Set the location" on the map), azimuth (shooting direction), tags, a license (Creative Commons: CC0, CC BY, CC BY-SA — the default, CC BY-NC, CC BY-NC-SA), and an optional "make available only to premium users" flag. Shows the gallery rules (max 10 MB, landscapes/documentation only, own photos only, published under the license you choose per photo, etc.). **Photo viewer:** shows the full image with its Creative Commons license (badge + "licensed since" date), uploader, capture date and rating; users can comment, rate, modify (own photos), delete, show on the map, open fullscreen, or open in an external app. That last menu also offers **Share photo**, which hands the picture itself — the full-size file, named after its title — to the device's share sheet, as opposed to **Share location**, which shares a link. Wikimedia Commons photos open in the same viewer, showing the Commons author, license and a link to the Commons file page (image and attribution fetched straight from Commons); they can be rated and commented but not edited/deleted. Full-360 equirectangular panoramas open in an interactive drag-to-look viewer (Pannellum): own photos flagged as panoramas on upload, and Wikimedia Commons photos detected by their exact 2:1 dimensions. Photos can be navigated sequentially (e.g. "1 / 51"). URL path (open photo): `/#show=gallery-viewer/` (legacy `/#image=` still works). ### My maps - Access: Main menu > My maps - Keyboard shortcut: g m - URL path: `/#show=my-maps` (legacy `/#show=maps` still works) Opens the user-saved maps manager in a modal. Each saved map stores the current state: active map layers, drawing, planned route (including its routing mode and that mode's parameters, such as the roundtrip distance/seed or the isochrone buckets and limit), watched live-tracked devices, GPX track, and the search results pinned to the map. Pinned results are saved with their geometry, names and tags, so opening the map draws them without fetching each element again — which is what makes them work offline. It also keeps the ones the URL can't name: only OSM elements appear in the URL (as `osm-node=` / `osm-way=` / `osm-relation=`), so a geocoding hit without an OSM element, a WMS feature or a plain-coordinates result used to be lost on reload and is now carried by the map. Pinning or removing an OSM element counts as an unsaved change; one the URL can't name does not, because a reload can't bring it back to compare against. The planned route is saved with the computed route itself — the line, the itinerary and the elevation profile — not just its waypoints. So opening the map draws exactly the route that was planned, without a routing request, and a saved route no longer changes when the routing graph does. The stored route stays the answer for as long as the map is open: edit a waypoint and undo it, or switch transport away and back, and the saved route returns without a routing request rather than being computed afresh. **Recompute route** in the route finder's ⋮ menu — offered only while the stored route is what's on screen — is the way to ask the router again, and counts as an unsaved change. Opening a saved map sends no routing request at all, online or off. A map saved before routes were stored simply has none and is routed on open, as before. Isochrones are recomputed on open either way. The modal lists saved maps with their created/modified dates and a filter box. A gear menu sets load options: - **Include saved background map and position** — also restore the saved base/overlay layers and viewport - **Make all available offline** / **Remove all from offline** — flag every listed map for offline use, or clear the flag - **Send unsent changes** — push saves that are still waiting in the browser (see below); enabled only while something is waiting Each map has a per-item menu with **Load**, **Modify**, and **Delete**. Loading onto a map that already holds something asks first, offering **Append** (add the loaded map to what's there) or **Replace**; an empty map loads straight away. Modify edits the map **Name** and its **Editors** — other users can be added as editors to collaborate on the same saved map, and has an **Available offline** checkbox. There is also an option to add a new (empty) saved map. Maps flagged **Available offline** keep a copy of the saved map document in the browser (IndexedDB), so they appear in the list and can be **Load**ed even with no connection; an "Offline" badge marks them and they refresh automatically when their server copy is newer. A planned route opens complete offline — line, itinerary and elevation profile — because the document carries the computed route (which is saved for every map, offline-flagged or not), and pinned search results open with it for the same reason. This caches only the map document — the background tiles are cached separately via **Offline maps**. **Save works without a connection.** Saving a map you may write to while offline (or when the request can't reach the server) files the change in the browser and reports it as saved; a badge next to the map name — in the list and in the active-map toolbar — says **Unsent**, then **Sending…**, and goes away once the change is through (the list's **modified** date is then the server's own record of when it landed). The map's offline copy is updated at the same time, so reopening it offline shows the change rather than the server's older version. Queueing a change also caches the app itself, so it can be reopened offline even with no map flagged for offline use. Unsent changes are pushed automatically when the connection returns and when the app starts, and can be pushed by hand with **Send unsent changes** in the gear menu. Only one change per map is kept — a save is the whole document, so a newer one simply stands for the older. Creating a new map and deleting one still need a connection. If the map changed on the server meanwhile the change can't be sent, and the badge says **Conflict**; the same happens, as **Cannot send**, when write access was withdrawn or the map no longer exists. A **Save** made with a connection that the server refuses for one of those reasons ends up in the same place rather than as a plain error, so the change is kept and can be settled. Until it is, the map still counts as having unsaved changes — the change is safe in the browser but is not going anywhere on its own — so the warning icon stays up beside the badge, and **Reload map** settles it by discarding the refused change and re-reading the stored map. A message offers the ways out that keep the change — **Save as a copy** (keeps both) and, for a conflict only, **Overwrite the server version**. The map's per-item menu in My maps has those and **Discard my changes**, which is destructive and asks for confirmation, so it lives only where it can. A map that the refusal itself removed from the list — deleted on the server, or no longer shared — is still listed, so its change stays reachable. A server error is not one of these: the change simply stays queued and is retried automatically a few minutes later. If write access was withdrawn the map opens read-only, so **Save** offers to keep the content as your own copy instead of retrying a write that cannot succeed. Logging out discards unsent changes along with everything else the account left in the browser, and asks first when there are any. While a saved map is loaded ("connected"), a toolbar shows the map name with **Save** and a **Disconnect** button (whose dropdown also offers **Disconnect and clear**, to disconnect and clear the current map contents). **Save** stores the map in place for its owner and editors; on someone else's map it saves the current contents as your own copy (and prompts to log in first when logged out). Editing the contents of a loaded map (by hand or via browser back/forward) marks it as having unsaved changes: a warning icon appears next to the map name, **Save** is highlighted, and a **Reload map** button offers to discard the changes and re-read the stored map. Unsaved changes survive a page reload — the map's working copy is kept in the browser (IndexedDB for the imported track, the URL for everything else), and the stored map is re-read only when there is nothing unsaved to protect. They are not part of the shareable link, though — only saving puts them in the map. ### Drawing and measurement - Access: Main menu > Drawing and measurement - Keyboard shortcut: - g p for drawing points (markers) / measuring coordinates and elevation; URL path: `/#tools=draw-points` - g l for drawing lines / measuring distance and azimuth; URL path: `/#tools=draw-lines` - g n for drawing polygons / measuring area; URL path: `/#tools=draw-polygons` Several tools can be open at once, each with its own toolbar, and the `tools=` URL parameter lists them (e.g. `/#tools=route-planner,tracking`; the older `tool=` spelling is read the same way). The exception is the tools that take clicks on the map — route finder, drawing, map details: only one of those is open at a time, opening another replaces it, and while one is open a click no longer selects a feature. Its toolbar is outlined in green to say so. Escape closes it; the other toolbars are closed by their own button. Toggles the drawing and measurement toolbar. The toolbar lets the user switch between Point / Line / Polygon and open **Style settings** (e d), the default drawing style (color, fill color, width, line cap, line join, dash style, shape) applied to new drawings. **Measurement readouts:** drawing a line shows its length; a polygon shows its area and perimeter (each copyable). A point can show its coordinates and elevation; the gem beside the elevation names the terrain model it was read from, and for non-premium users offers higher-precision data. **Editing a selected geometry** — a context toolbar offers **Properties** plus, via a "⋮" menu: - Lines: Elevation profile, Project point, Simplify, Reverse direction - Polygons: Cut out a hole, Simplify, Reverse direction - Polygon holes: Detach hole, Simplify, Reverse direction - Points: Project point, and Open in… (new window, share location, or an external app) While drawing, individual nodes can be edited: a line point can **Join** another line, **Continue** drawing, **Split** the line, or be deleted; a polygon point can be deleted. **Holes in polygons.** A polygon can have holes (an island in a lake is just a further hole, since rings alternate filled/empty). **Cut out a hole** on a selected polygon switches to polygon drawing and turns the next ring drawn into a hole of it; a polygon drawn entirely inside another one instead offers **Make a hole of the enclosing polygon** (the smallest one containing it). A hole is fully subordinate — it has no label or style of its own, is drawn and measured as part of its parent (the area readout subtracts it, the perimeter counts its outline), is not clickable inside, and is deleted with it. **Detach hole** turns it back into a polygon of its own. In the URL a hole carries the extra style-field code `H` naming its parent polygon's position among the `line=`/`polygon=` params. **Properties modal:** Label, Color, Shape, Icon (searchable picker), and Text (up to 2 characters shown inside the marker); lines/polygons additionally expose fill color, width, line cap/join and dash style. **Project point modal:** create a point at a given Distance (m) and Azimuth (°) from the selected point. **Simplify** prompts for a simplification factor (0 = no simplification). **Elevation profile** opens a chart of elevation along a line, with total climb and total descent. Waypoints are marked with their name and elevation, and their distance is ticked on the x-axis. Pointing at the chart marks the matching place on the map, labelled with its distance, elevation, climb/descent so far, and the local steepness in both percent and degrees (signed: positive climbs in the direction of travel); pointing at the charted line on the map does the same the other way round, marking the place and its position in the chart. A toolbar below the chart can download it as SVG (not in an embedded map, where the browser forbids downloads), open the elevation preferences, and, when the line carries waypoints, toggle their markers and labels; the grip at its right end resizes the chart window, which is otherwise dragged around by the plot itself, and both the size and the position are remembered for the next time it opens. Under the toolbar the chart credits the terrain models its elevation was actually read from, as the elevation API reports them: the national high-resolution ones (premium) plus GEDTM30 past their borders, or SRTM. A route on the free tier keeps the router's own elevation instead, which is credited to Sonny's LiDAR DTM. Non-premium users get a premium gem there offering higher-precision data. Elevation the user recorded or imported is credited to nobody, so the line is omitted for live tracking and for tracks shown as recorded. Only one profile is shown at a time, and it stays with whatever opened it — a planned route, an imported track, a tracked device or a drawn line — redrawing itself as that line changes (re-routing, reshaping a drawn line, live positions arriving) rather than closing. Which one it is shows in the URL as `elevation-chart=` (see the URL parameters above), so a link can share an opened profile. ### Route finder - Access: Main menu > Route finder - Keyboard shortcut: g r - URL path: `/#tools=route-planner` Toggles the route finder toolbar, which has: a transport/router selector, a mode selector, **Start** and **Finish** point pickers, a swap-endpoints button, and a close button. Routing is based on a Freemap-hosted GraphHopper or third-party OSRM router. A route can contain multiple midpoints. Some midpoints may be marked as "manual," which activates manual routing as a user-drawn path for that route segment. The **Start**/**Finish** (and midpoint) pickers offer: Select on the map, Your position, or Home position. Supported vehicles (the transport dropdown also offers "Straight line" for fully manual routing): - GraphHopper - Car - Car (4WD) - Motorcycle - Racing bike - Mountain bike - Walking - Hiking - OSRM - Car - Bicycle - Walking Routing modes: - GraphHopper - Ordered - Roundtrip - Isochrones - OSRM - Ordered - Visiting places - Visiting places (roundtrip) Once a route is found the toolbar also offers: - **Colorize by** (dropdown) — Inactive, Elevation, Steepness, Heading (only modes the route has data for are shown; every mode except Elevation, Speed and Time is premium — badged with a gem and disabled without premium access); for the elevation profile and elevation/steepness colorize, premium users get every point sampled from the terrain model (high-resolution where available), while others keep the router's own elevation and only have missing values filled on demand. While a mode is active, the dropdown's first item is a **Show colorizing legend** checkbox (set off by a divider) that toggles a color-scale legend below the toolbar - **More** (⋮ menu) — Elevation profile (chart with total climb/descent), Convert to drawing (the route becomes one drawing line in its transport-mode color, plus a point per start/finish/stop; a long route asks for a simplification factor first, offered already filled in with one derived from how many vertices it has), **Route style…** (opens a modal with sliders for line width, line opacity, and marker opacity; saved in local storage), **Recompute route** (shown only while the route on screen is the one the open map has stored; asks the router again — a saved map draws the route it was saved with, and returns to it whenever the waypoints, mode and transport come back to what it was saved for, so this is the only way to pick up a changed routing graph; it marks the map as having unsaved changes), kilometre/percent milestone toggles, and (premium; GraphHopper "Ordered" mode with 3+ points, single transport) **Optimize order** — reorders the waypoints to minimize total travel time, with variants: keep start fixed, keep start and finish fixed, round trip (return to start), or free (reorder all) - **Delete** (🗑) — removes the result together with its start/finish/stop points. It appears as soon as the first point is placed, so a half-built route can be dropped as well An isochrone result offers the same **Delete** button and a reduced ⋮ menu with only Convert to drawing (one drawing polygon per reachability band, keeping any inner rings it has as holes, with the same simplification question when the rings are detailed enough to warrant it) and **Route style…** (the line width and opacity apply to the rings). It also counts as the "found route" source in the map data export and the map-to-document export, which always carry the route's start/finish/stop markers (named Start/Finish/Stop N in the data formats; on a rendered document the marker glyph speaks for itself, so no text label is drawn) and paint the route in the same transport-mode colors, width and opacity the map uses. Each ring is named after the limit it reaches — "Isochrone 30 min", or "Isochrone 5.000 km" for a distance-limited one — in the drawing, in the exported files, and as the label drawn on an exported document. ### Objects (POIs) - Access: Main menu > Objects (POIs) - Keyboard shortcut: g o - URL path: `/#tools=objects` Toggles the objects toolbar. The toolbar contains a combo box to search for various POIs by type. Multiple types can be activated and will be visible interactively as markers with icons on the map. A **Marker style** button opens a modal to set the marker shape (pin/ring/square) and color, applied to all displayed objects. These can also be preset via the read-only `/#objects-style=` URL param (see `doc/url-params.md`). While objects are displayed, the toolbar carries a **⋮ menu** offering **Convert to drawing** and **Show as Lookup**. Either hands the objects over for good: the type filter is cleared and the toolbar closes, so they leave the map as objects (as lookups they arrive kept, and the element behind one is fetched from OSM only when it is clicked; at most 500 can be handed over at once, since each is named separately in the URL). A selected object's toolbar carries the same ⋮ menu for that one object, leaving the others alone — and leaving the object itself on the map, which is why it says **Copy to drawing** instead — with a third item, **With full geometry**, for a way or a relation — that one fetches the element from OSM first and then, if it turns out detailed enough to be worth thinning, asks for a simplification factor derived from it. Del clears the type filter while the objects toolbar is open and nothing is selected. ### Tracks and data - Access: Main menu > Tracks and data - Keyboard shortcut: g g - URL path: `/#tools=import-file` (the old `track-viewer` alias still works) Toggles the tracks and data toolbar. **Upload** opens the file import modal (URL path: `/#show=file-import`; legacy `/#show=upload-track` still works), which accepts GPX, KML, KMZ, TCX and GeoJSON files; several files can be picked or dropped at once and are merged into one view. Files can also be dropped anywhere on the map. When geodata is already shown, importing asks whether to **append** the new data or **replace** what's loaded. An external track can also be loaded directly by URL via `/#import-url=` (legacy `gpx-url=` and `load=` still work), supporting the same GPX, KML, KMZ, TCX and GeoJSON formats. Once a track is loaded, the toolbar offers: - **Track** (dropdown) — shown only when several lines are loaded; picks which one the elevation profile and "More info" describe (a line can also be picked by clicking it on the map; the active one is highlighted) - **Elevation profile** — chart of elevation along the active track (with total climb/descent); recorded waypoints are marked along it with their name and elevation and their distance ticked on the x-axis (toggleable), and a toolbar below the chart can download it as SVG (not in an embedded map, where the browser forbids downloads) - **Colorize by** (dropdown) — Inactive, Elevation, Steepness, Speed, Heart rate, Cadence, Power, Temperature, Time, Heading (entries with no data in the track are disabled; every mode except Elevation, Speed and Time is premium — badged with a gem and disabled without premium access). While a mode is active, the dropdown's first item is a **Show colorizing legend** checkbox (set off by a divider) that toggles a color-scale legend below the toolbar - **More info** — a popup with the track's distance, min/max elevation, total climb and total descent - a warning icon while the loaded track isn't part of a saved map — unlike drawing, a track isn't carried in the URL, so it exists only in this browser until saved via **Save to my maps**. It does survive a page reload: the track you have open is kept in the browser (IndexedDB) and put back when you reload the page you were on. That copy goes with the browser's storage, which is why the warning stays. - **More** (⋮ menu) — gathers the remaining actions: - **Update elevation** — refill/override elevation from the terrain model (shown only while the track still has recorded elevation to replace); premium users get the high-resolution DEM where available - **Save to my maps** — save the loaded track into a new personal map (requires login; prompts to log in first otherwise). Hidden when a map is already active, since the active-map toolbar's own **Save** persists the track with the map. Older `#track-uid=…` share links still load - **Default style** — opens a modal to set the color, width, fill, dash, line cap/join and waypoint shape applied to imported features that carry no style of their own (independent of the drawing tool's defaults). Can also be preset via the read-only `/#track-style=` URL param (see `doc/url-params.md`) - **Convert to drawing** — turn the imported track into editable drawing features (a recorded track is replaced and warns that its per-point data — elevation, heart rate, speed, time — will be dropped; the same prompt asks for a simplification factor, offered already filled in with one derived from the track's own density — the gentlest that gets the drawing down to a few hundred editable vertices, or zero for a track short enough to convert whole) - delete and close buttons ### Map details - Access: Main menu > Map details - Keyboard shortcut: g i - URL path: `/#tools=map-details` Toggles the map details toolbar. Clicking a location queries information about it, grouped by source (each toggleable via the **Sources** dropdown); the results are listed in the search box's dropdown and are displayed the same way search results are — the picked one for as long as it is selected, plus any kept through the selection toolbar's **Keep on the map** toggle: - **Reverse geocoding** — the locality / address of the point - **Nearby** — features near the clicked point - **Containing features** — administrative and geographic areas containing the point (cadastral community, district, region, mountain range, country, etc.) Selecting a feature opens a detail popup with the terrain-model elevation at it (read from the elevation API at one point of the feature — a line at its midpoint, anything else at the centre of its geometry — naming the model behind the number and offering premium a higher-precision one), its OSM tags, a link to open it at OpenStreetMap.org (and its history), an "Edit in JOSM" button, and the data source. It follows the selection, and an ⓘ **Details** toggle on the selection toolbar (of both search results and objects) shows and hides it. Closing the popup switches that toggle off, so further selections come without it until it is switched back on; the choice is remembered. The geometry displayed for search and map-details results shares one style (color, fill, width, dash, line cap/join, marker shape — the same set as the track-viewer default style), editable in a dedicated **Lookup style** modal opened from the ⋮ menu on the search-result selection toolbar (it carries a **Reset to default** button). It can also be preset via the read-only `/#search-style=` URL param, and `window.fmHeadless.searchResultStyle` overrides it in headless image rendering (see `doc/url-params.md`). ### Map changes - Access: Main menu > Map changes - Keyboard shortcut: g x - URL path: `/#tools=changesets` Toggles the OSM changes toolbar, which contains: a dropdown to select the time window (changesets from the last 3, 7, 14, or 30 days), an "All authors" text input to filter by OSM username, a clear button, a button to download the changesets, and an edit button. OSM changes matching the selected parameters are displayed on the map as markers showing the mapper's name and changeset description. Clicking the marker will open the toast with the following details: - author - changeset description - date/time of the changeset - changeset links to osm.org and Achavi ### Live tracking - Access: Main menu > Live tracking, or keyboard shortcut g t Live tracking lets a user register their own devices (so others can follow their position) and watch other people's devices. Supported tracker apps/devices include OsmAnd, Locus, Traccar, and similar. It opens a **toolbar** with: - **Watched devices** and **My tracked devices** — open the two managers (also reachable directly via g w and g d) - **Visual** — what to draw for tracks: points, line, or line + points - **Colorize by** — color the watched tracks by a per-point value; modes are shown only when the tracks carry the data: Elevation, Steepness, Speed, Time, Heading, Battery, GSM signal (Inactive = solid track color). Every mode except Elevation, Speed and Time is premium — badged with a gem and disabled without premium access. While a mode is active, the dropdown's first item is a **Show colorizing legend** checkbox (set off by a divider) that toggles a color-scale legend below the toolbar - **Elevation profile** — a chart of the selected (or first) track that reports altitude; uses the recorded altitudes as-is - **⋮ menu** (shown once a watched track has more than one position) — **Copy to Tracks and data** takes a snapshot of the tracks into the track viewer, where they become ordinary loaded tracks (asking first whether to append to or replace what it already holds), and **Copy to drawing** turns them into editable drawing lines in the device's color and width, asking for a simplification factor — derived from how dense the recording is — only when there is enough of it to be worth thinning. Both are copies: the live feed goes on and the watched devices stay. A selected device's toolbar carries the same menu, acting on that device alone #### My tracked devices Manage your own devices so others can watch your position via a watch token. The list shows each device's tracking token, name, max age, and creation date. Each device has: - a button showing a **QR code** to quickly set up a tracker app (e.g. Traccar/OsmAnd) - a menu with **Modify**, **Watch tokens**, and **Delete** - an **Add new** button **Device form:** Name (required), Token (required), Max Count (max number of stored locations), and Max Age (in minutes). Each location sent by a device may carry properties such as altitude, speed, bearing, GSM/GPS signal strength, GPS precision, battery level, and a custom message. **Watch tokens** (per device): independent share tokens, each with a created date, an optional validity window and a note. They can be copied, viewed, edited, or deleted, and the device owner can add new ones to share position with different people. The token form has **From**, **To**, and **Note** fields. #### Watched devices Manage devices you follow to see your friends' positions. Note: the watched-devices list is only reflected in the page URL — to persist it, save it via **My maps**. Each watched device is added with a **Watch Device** form: Watch Token (required), Label, Color, line Width (px), Since (date/time), Max Age (minutes), Max Count, Split Distance (meters), and Split Duration (minutes). Watched tracks render on the map; selecting one shows a small toolbar to delete or close it. ### GPS recorder - Access: Main menu > GPS recorder (marked **experimental**) - URL path: `/#tools=gps-recorder` - **Android only**, and it needs a separate app: the *Freemap GPS Recorder*, a self-hosted APK the tool links to when it isn't installed. The tool is hidden entirely on other platforms. Records a GPS track with the Android app while the map shows it live, so the recording survives the browser being closed, backgrounded or killed — the phone does the recording, the page is a viewer and a remote control. The toolbar offers: - **Record** / **Pause** — one button. Pausing keeps the recording; pressing Record again continues it as a new segment, drawn with a gap rather than a straight line across the break - **Finish** (⏹) — ends the ride: the track becomes an ordinary loaded track in **Tracks and data** (elevation, colorize, the elevation profile and every export then work on it), a copy is kept in this browser, and only then does the app delete its own. Always asks for confirmation first, since the recorder is emptied either way; while a recording is still running the question also says the ride cannot be resumed afterwards. Asks whether to **append** or **replace** when geodata is already shown, the same as a file import - **Delete recording** (🗑) — throws the recording away without taking it; shown only when there is one and nothing is recording - a summary, opening a dropdown that lists every figure: distance, elapsed time, elevation above sea level, climb, current and average speed, accuracy, the number of satellites the last fix used, point and segment counts, and the time of the last fix. Ticking a row also shows that figure in the summary itself, so the toolbar can be made to say whatever is worth a glance on the ride; distance and elapsed time are ticked to begin with, the choice is remembered in this browser, and with nothing ticked the summary shrinks to an ℹ button - **Elevation profile** (📈) — the profile of the ride so far, redrawn as fixes arrive, with a break at each pause; shown once two fixes carry an altitude. The recorded altitude is drawn as measured, so no terrain model is credited under it - **Recording settings** (⚙) — time between fixes, minimum distance between fixes, an accuracy limit for discarding poor fixes, the position source (the GPS receiver, which measures elevation per fix, or the fused GPS/wifi/sensor one, which places you better but repeats an elevation for seconds at a time) and the accuracy/battery trade-off that applies to the fused source (all applied by the app when a recording starts), plus: after what gap a new segment begins, whether **Locate me** is answered by the recorded fixes instead of the browser tracking GPS separately, and whether to keep the screen on While a recording is running the toolbar cannot be dismissed, only collapsed: closing it (or pressing Esc, or switching to another tool) leaves a strip with just a blinking red dot and an expand button (plus the tool's name where the screen is wide enough for it), so the recording is visible without opening the menu. The dot is itself a button, opening the same summary dropdown, read-only there since a collapsed toolbar has nothing to pin a figure to. Collapsing is remembered in this browser: neither a reload nor closing and reopening the tool undoes it, only the expand button does. The strip disappears once the recording is paused or finished. The recording is also shown as a red line on the map with its newest fix marked; clicking either opens the tool. ### Offline maps - Access: Maps button menu > Manage maps > Offline maps - Keyboard shortcut: m o Caches selected map areas (tiles) in the browser for offline use. (This is different from "Offline maps export", which produces a downloadable MBTiles/SQLiteDB file.) A cached map is not limited to what it holds. While there is a connection it behaves as the layer it was made from: it takes that layer's zoom range and its premium gate, and any tile it doesn't have — outside its area, deeper than it was downloaded, or not downloaded yet — is fetched from that layer's own server. Such tiles are only displayed, never added to the cached map. Without a connection the map falls back to being just what was downloaded: its own area and zoom range, with the deepest cached level scaled up beyond it. The manager modal lists already-cached offline maps with their zoom range, tile count, scale, size and status (Ready, or incomplete with a percentage), and has buttons to modify, delete, and **Add offline map**. A ready map has an **Activate** button that switches the map layer on and zooms to its area; a map that is still downloading offers **Zoom to area** instead. A running download can be **Stop**ped, which halts it and keeps whatever has been cached so far; an incomplete map then offers **Resume**, which fetches only the tiles it is missing. **Delete** discards the map altogether and is available whether or not it is downloading. The "Cache map for offline use" form lets the user choose: - the map (layer) to cache — tile layers only; WMS layers cannot be cached - the area: current visible area, or a rectangle drawn on the map - a name - an icon, picked from the same icon set the drawing points use (Font Awesome and the OSM POI icons). Caching a custom map starts from that map's own icon; the built-in layers have none to pass on. A map left without one keeps the generic glyph of wherever it is listed — the offline symbol in the offline-map lists and in Configure layers, the custom-map symbol in the layer menu and toolbar - the zoom range. For a layer whose deepest zooms are premium, a non-premium user's range stops just short of them and a gem beside the field says why: cached tiles are kept for good and are shown with no connection, where no checkerboard applies, so downloading those levels needs premium access. Browsing them online is unaffected — the cached map shows the same checkerboard there as the source layer does. - the scale (1×, 2×, … — only for layers that offer hi-DPI tiles; defaults to what the current screen displays). A cached map holds exactly one scale and is always drawn at it, regardless of the screen and of the resolution/feature-size preferences. - whether to show the cached map in the menu and/or toolbar It shows the estimated tile count and size before caching starts; the size is estimated by fetching a few real tiles of the selected layer, area, zoom range and scale. It warns about very large downloads and about downloads that would not fit in the browser's free storage. **Modify** opens the same form seeded from an existing offline map, to change its name, icon, area, zoom range and menu/toolbar visibility. The map (layer) and the scale are fixed, since changing either would invalidate every stored tile. Widening the area or the zoom range downloads only the tiles that are missing; narrowing it deletes the tiles that fall outside. The form then shows both the map's total tile count and how many of them still have to be downloaded. Changing only the name touches no tiles. Picking the rectangle option (in this form and in the map/document exports below) hides the modal and lets the user drag the rectangle's corner, edge, and center handles on the map, confirming with **OK** or discarding with **Cancel** (Esc). The confirmed rectangle is remembered for the other export/cache forms until the page is reloaded; if it lies outside the current view, the map jumps to it. ### Share / Open in external app - Access: Main menu > Share / Open in external app Opens a submenu: - Copy page URL j c - Share location - OpenStreetMap j o - Mapy.com j m - Google Maps j g - Geocaching - F4Map j 4 - Peakfinder j p - Mapillary j l - OpenStreetCam - Waze - OMA (SK) - Hiking.sk (SK) j h - ZBGIS (SK) j z - Edit in JOSM j j - Edit in iD j i ### Map export to image/document - Access: Main menu > Map export to image/document - Keyboard shortcut: e p - URL path: `/#show=map-to-document-export` Opens a modal to export the map as an image or document. Options: - Export area: visible area, or a rectangle drawn on the map - Format: JPEG, PNG, PDF, or SVG - Optional server-rendered overlays: contours, shaded relief, hiking trails, bicycle trails, ski trails, horse trails - Own map-feature sources to draw on top (only those with data are selectable, same set as the map data export): found route (always with its start/finish/stop markers), objects (POIs), photos, drawing lines/areas/points, live tracking, imported GPX track, highlighted map feature - Glow: optional glow/shadow drawn around all own map-feature markers and lines, with configurable color (incl. opacity) and width - Marker size: configurable pixel size of own map-feature point markers - Labels: configurable color (no opacity), size, and weight of own map-feature labels - Drawing order: Topmost or Natural - Map resolution (DPI) The modal also displays the attribution that must accompany the exported map when shared. While the export runs the modal stays open with its controls disabled and a spinner on the export button; only Cancel stays active (cancelling asks for confirmation and aborts the request). When the export finishes the resulting file is downloaded automatically. ### Map data export - Access: Main menu > Map data export - Keyboard shortcut: e g - URL path: `/#show=map-features-export` Opens a modal to export the user's own map data as a GPX, GeoJSON or KML file. The KML option emits a self-contained KMZ (zipped KML plus packaged PNG marker icons) when point icons are present, and a plain KML otherwise. Exported drawing features round-trip losslessly back into Freemap — style, icon, label, the line/polygon distinction and polygon holes are preserved (GeoJSON and KML carry holes as interior rings natively; GPX, which has no polygon type, carries them as sibling tracks linked by a private extension) — and for other apps the marker icons and styles are additionally mapped to their nearest Garmin (BaseCamp), OsmAnd and Locus equivalents so they still render sensibly. Only the data types that actually have something on the map are selectable: - found (planned) route, optionally including stops - objects (POIs) - photos (in the visible map area) - drawing — points, lines, polygons - live tracking - tracks and data - highlighted map feature When a single map feature is selected (a drawing point/line/polygon, an object, a track, the planned route, or a lookup result), an **Only the selected item** toggle appears (on by default) that narrows the export to just that one feature instead of its whole source. For the file/share/Google Drive/Dropbox targets an **Elevation** control chooses whether to fill elevation from the elevation API into exported points, lines and the planned route: *Keep recorded* (leave as-is), *Fill missing* (only coordinates lacking elevation), or *Override all* (replace every elevation). Polygons are always skipped. While the export runs its controls are disabled and a spinner replaces the icon on the export button. **Close** stays active: it gives up on the export — one that is filling elevation is abandoned outright, while one that is not carries on and downloads its file with the modal already gone. The target can be a downloaded file, the device share sheet, Google Drive, Dropbox, or Garmin Connect. **Share** hands the exported file to the operating system's share sheet (send it to a messenger, mail app, or a hiking app); it is offered only in browsers that let a page share files at all. Chromium-based browsers share no geo formats, so there the file travels as plain text with a `.txt` suffix appended to its name (`freemap-export-….gpx.txt`), which a note under the target explains. If the browser refuses to open the share sheet at all — an export slow enough to lose the click that asked for it — the file is downloaded instead and a message says so. Exporting a planned route to Garmin Connect as a course (experimental) requires a connected Garmin account and lets the user choose a course name and activity type (running, hiking, mountain biking, trail running, road/gravel cycling, other). ### Maps for GPS devices - Access: Main menu > Maps for GPS devices - URL path: `/#show=document/exports` (legacy `/#document=exports` still works) Opens a modal with instructions to get various maps for GPS devices: - Garmin (+BaseCamp) - Locus - Orux maps - BackCountry Navigator - BikeComputer - XCTrack ### Offline maps export - Access: Main menu > Offline maps export - Keyboard shortcut: e m - URL path: `/#show=offline-map-export` Opens a modal to download a map in offline formats (MBTiles or SQLiteDB). Selection can be the current visible map area or a rectangle drawn on the map. Multiple tile-based maps are supported for download. Users can select the desired zoom range and, for maps offering hi-DPI variants, the tile scale. The modal summarizes the tile count, the estimated file size (sampled from real tiles of the selected map, area, zoom range and scale) and the price in credits. Link to the map prepared for download will be emailed to the provided email address. ### Embed map - Access: Main menu > Embed map - Keyboard shortcut: e e - URL path: `/#show=embed` Opens a modal to configure the map for embedding into another website. Users can configure: - dimensions (w/h) - enabled features (search, map layer switch button, "find me" (locate me) button) Users can then copy and paste the generated iframe markup. ### Info & help - Access: Info & help Opens a submenu: - Map legend - Contacts - OpenStreetMap documentation - About Freemap Association - About OpenStreetMap - Map License - Keyboard Shortcuts - Garmin - Freemap.sk for Geocaching Extension - **Reset application** — clears all locally stored settings (signing you out) and reloads the page; confirmed first Most items open a modal with the selected topic; **Reset application** instead wipes the persisted state and reloads. The **Map License** modal explains the attribution the licenses require and points at the map's **©** button, which lists the sources to credit for what is currently shown: the active layers' map, data and picture credits, plus a routing credit (Sonny's LiDAR DTM, the terrain model the router is weighted by) whenever a GraphHopper route or isochrone stands. The **Map legend** modal is specific to the currently active map and explains its symbols, grouped into collapsible categories (e.g. Accommodation, Food & Drink, Institutions, Sports, Natural features, Other points of interest, Land cover, Water, Roads and paths, Railways, Terrain, Borders, Other). The legend content differs per map type and is also available for WMS and custom WMS maps. It can also be opened from the map's **?** help button (m l). ### Support Freemap - Access: Main menu > Support Freemap - URL path: `/#show=support-us` ### Social and app buttons At the bottom of the main menu there is a row of buttons: links to Mastodon, [Facebook](https://www.facebook.com/FreemapSlovakia), [YouTube](https://www.youtube.com/channel/UCy0FrRnqJlc96dEpDIpNhIQ) and [GitHub](https://www.github.com/FreemapSlovakia); the mobile apps on Google Play and the App Store; and a **Services status** link. ### UI theme switcher At the bottom right of the main menu, there are buttons to switch the app UI theme: Light / Dark / Auto. ### Map context menu (right-click) Right-clicking (or long-pressing) a location on the map opens a context menu with actions for that point: - Center a map here - Find coordinates and elevation - Query nearby features - Show nearby photos - Share / Open in external app (same submenu as in the main menu) - Add here a point - Start here drawing a line or measurement - Plan a route from here - Plan a route to here ### Help button A round **?** button at the bottom-right corner of the map opens a small popover with: - Copyright - Map legend (m l) - Privacy policy ## Map Layers Freemap provides numerous raster, vector, and WMS map layers with different content, coverage, and zoom levels. Each layer includes attributes describing its purpose, availability, and data sources. The map-layer switching toolbar is available at the middle bottom of the screen. Featured or user-configured maps are directly accessible as buttons in this toolbar. A map that cannot be shown where the view currently is stays listed rather than disappearing, marked with a button that puts it right: a magnifier when the view is zoomed out past the map's minimum zoom, a globe when the view is away from the map's area, and a magnifier-with-marker when both — pressing it switches the map on and moves the view to where the map draws. Custom maps and offline maps are each listed in alphabetical order, after the built-in ones. The toolbar also contains the following buttons: - zoom in (keyboard shortcut: +) - zoom out (keyboard shortcut: -) - find me (locate me by the browser's geolocation API) - toggle fullscreen **Find me** cycles through three states: off; on with the map following the position (the button is highlighted); and on without following, once the map has been moved by hand (the button stays pressed but loses the highlight). Pressing it in that third state brings the map back to the position and resumes following rather than switching locating off — only a press while following turns it off. While waiting for the first fix the button shows a spinner in place of its icon. A refused permission switches locating off with a brief warning. If the device is still searching after half a minute, the spinner stays and a warning says there is no signal yet; if it cannot determine a position at all, the spinner gives way to a warning. Either way locating stays on, so a fix arriving later is still taken. The map is also moved with the keyboard, without having to click it first: + and - zoom a level at a time, and the arrow keys pan, holding shift for a triple step. Zooming keeps the map following the located position, while panning with the arrows ends the following — as do dragging, a two-finger touch, and zooming toward a point with the wheel or a double click. The located position is drawn as a dot with an accuracy circle, plus a direction beam that widens as the heading gets less certain. Its source is chosen by the **Direction indicator** preference (see Preferences below): *Hidden*, *Direction of travel* (GPS course, shown only while moving), or *Device compass* (also works standing still; offered only on devices with orientation sensors). The compass is the default wherever it needs no permission; on iOS, which prompts for it, the default is direction of travel. The whole display fades as its fix ages, so a lost signal stops reading as a live position: it stays solid for the first 20 seconds, dims until the fix is two minutes old, and then remains as a faint last-known position rather than disappearing. With the **Distance and bearing** preference on (the default), panning the map away from the located position also draws a crosshair in the middle of the map and a dotted line from it to the position, with the distance and the bearing from the located position to the middle of the map — the heading to walk to reach what is being looked at — shown above the crosshair (for example "325.6 m · 226°"). The line and the readout fade with the age of the fix like the rest of the located display; the crosshair does not, since it marks the middle of the screen rather than anything the GPS reported. It appears only once the map is far enough off the position for the line to say anything, so it stays out of the way while the map follows the position. There is also a button with three vertical dots that opens a menu listing additional maps, a "Filter maps" box, and a "Show all maps" item. The same menu includes a "Manage maps" item (described below). ### Manage maps - Access: Maps button menu > Manage maps Expands a submenu with four items, each opening its own modal: **Configure layers**, **Custom maps** (suffixed with the number of custom maps), **Offline maps** (suffixed with the total cache size), and — below a divider — **Preferences**. #### Configure layers - Keyboard shortcut: m y A table of all built-in and custom map layers. For each layer the user can toggle: show in toolbar, show in menu, overlay opacity (overlays only), and a keyboard shortcut (a 🚫 marker indicates that no shortcut can be assigned). #### Custom maps - Keyboard shortcut: m c Manage user-defined map layers — a list with edit/delete actions and an **Add custom map** button. Each custom map has: - name - icon, picked from the same icon set the drawing points use (Font Awesome and the OSM POI icons); the generic custom-map glyph is used when none is picked - type (technology): Image tiles (TMS, XYZ), Vector (MapLibre), or WMS - URL (tile template for TMS/XYZ, server URL for WMS, or style URL for MapLibre) - min zoom / max native zoom (for a WMS the latter caps the requested image resolution instead of the zoom drawn at) - extra resolutions and "scale with DPI" (not for WMS, which always matches the display density) - for WMS: "load in tiles" — off by default, since a WMS is asked for one GetMap covering the whole view per pan/zoom; switch it on for a server that limits image size or caches tiles (premium-gated zooms use tiles either way) - layer: base or overlay - show in menu / show in toolbar #### Preferences - Keyboard shortcut: m p - **Max zoom** — global maximum zoom level - **Zoom step** — the smallest zoom change scroll-wheel, pinch and box zoom can settle on: `1` (whole zoom levels, the default), `½`, `¼`, or *Free* (no snapping at all). The +/ buttons and keys always go to the next whole level whatever this says - **Resolution scale** — simulates display pixel density and affects which tile variant is fetched (Auto by default) - **Feature size** — enlarges rendered labels and lines (no effect on satellite, shading, WMS, or vector (MapLibre) layers) - **Direction indicator** — source of the direction beam on the located position: *Hidden*, *Direction of travel* (GPS course over ground, visible only while moving) or *Device compass* (magnetometer, works standing still, offered only where orientation sensors exist). Defaults to the compass except on iOS, where enabling it costs a permission prompt, so direction of travel is the default there - **Distance and bearing** — while locating, draws a line between the located position and a crosshair in the middle of the map, labelled with the distance and the bearing from the position to the crosshair; visible only once the map is panned away from that position. On by default - **Remove spikes** (Elevation profile section) — a slider, 0–100 m, default 25 m. Where a way is drawn a few metres off the road it describes, the terrain model answers with the bank or rock face beside it; a running median drops excursions narrower than half this window, up or down, and keeps anything wider as real terrain, followed by a light average that rounds off the steps a median leaves. Zero switches it off - **Fill terrain-model ditches** (Elevation profile section) — a slider, 0–100 m, default 25 m. The detailed national terrain models (available in some countries) are usually adjusted for hydrology and dig a ditch through the road at every culvert; dips narrower than this are filled in the elevation profile and its climb/descent totals, while wider ones are kept as real terrain. Zero switches it off, and it changes nothing where the global model is used. Bridges and tunnels a route crosses are levelled separately, from the router's own data, and are unaffected by this setting - **Steepness window** (Elevation profile section) — a slider, 0–200 m plus a final "whole line" notch, default 50 m. The steepness reported at the place pointed at on the elevation profile is averaged over a stretch this long around it, so a couple of metres of GPS noise don't read as a wall. The window is centred on that place itself, so on a track whose points are far apart it still describes the stretch under the pointer rather than whatever surrounds the nearest point. Zero measures across just the segment the place stands on; "whole line" measures across the entire line at once, so the readout is the same everywhere on it and reports the rise over the line's whole length — on a straight measuring line that is the angle one end is seen at from the other, useful for sightlines (which ridge hides a summit or a sunset). Unlike the two sliders above it corrects nothing, so it changes no profile, only that readout Which terrain model answers is not a setting: premium reads get the detailed national models where they exist and GEDTM30 past their borders, everyone else gets SRTM everywhere, for profiles and exports alike. The first two sliders correct a terrain model, so they apply wherever elevation is read from one — planned routes, drawn lines and measurements, and imported tracks whose elevation was replaced from the server — and never to recorded altitude (live tracking, or a track kept as recorded). - **Reset to default** — fills this modal's fields (max zoom, zoom step, resolution scale, feature size, direction indicator, distance and bearing, spike removal, ditch filling, steepness window) with their defaults; apply with Save or close without saving Modals that edit a persisted default style or settings (Map preferences, Configure layers, drawing **Default properties**, objects **Marker style**, track-viewer **Default style**, **Lookup style**) also carry a **Reset to default** button that refills the form with default values (applied with Save, not immediately). ### Maps Pre-defined map layers. #### Field description - **name** (human-friendly; as shown in the UI) - **id** (internal type code; used in the `layers=` URL param) - **layer** (base | overlay) — overlays are drawn on top of a base layer - **technology** (tile | maplibre | wms | parametricShading | gallery | wikipedia | interactive | radar) - **minZ / maxNativeZ** (minimum usable zoom / maximum native tile zoom; above maxNativeZ tiles are upscaled) - **premiumFromZ** (zoom level from which premium access is required, if any) - **creditsPerMTile** (offline-export price in credits per million tiles, if applicable) - **supersededBy** (id of the replacement layer, for legacy layers) - **shortcut** (keyboard shortcut to toggle the layer, if any; ⇧ = Shift) - **countries** (ISO 3166-1 alpha-2 codes the layer covers; blank = worldwide / not restricted) - **notes** (attribution, experimental status, coverage quirks) #### Layer registry Mirrors `src/shared/mapDefinitions.tsx`. A blank cell means the field is not set in the definition (worldwide / default / not applicable). ⇧ denotes Shift. **Base layers** | name | id | technology | minZ | maxNativeZ | premiumFromZ | creditsPerMTile | supersededBy | shortcut | countries | notes | | ---------------------------- | --- | ----------------- | ---: | ---------: | -----------: | --------------: | ------------ | -------- | ------------ | ------------------------------------------------------ | | Hiking, Bicycle, Ski, Riding | X | tile | 5 | 20 | 19 | 5000 | | x | Europe (~46) | © Freemap, OSM; multi-source national elevation/relief, GEDTM30 elsewhere | | KST Hiking Trails | XK | tile | 5 | 20 | | | | | sk | Outdoor map showing only official KST hiking routes; © Freemap, OSM; multi-source national elevation/relief | | OpenStreetMap | O | tile | 0 | 19 | | | | o | | © OpenStreetMap | | Aerial | Z | tile | 0 | 20 | 20 | 1000 | | z | sk, cz | © GKÚ, NLC; © ČÚZK | | Aerial | S | tile | 0 | 19 | | | | s | | © Esri | | Aerial (2017–2019) | J1 | tile | 0 | 19 | | 1000 | Z | | sk | © GKÚ, NLC (legacy mosaic) | | Aerial (2020–2022) | J2 | tile | 0 | 19 | | 1000 | Z | | sk | © GKÚ, NLC (legacy mosaic) | | Public transport (ÖPNV) | d | tile | 0 | 18 | | | | q | | © MeMoMaps, OSM | | Detailed terrain shading | 7 | tile | 0 | 20 | 17 | 1000 | | h | sk | © Freemap; LLS DMR © ÚGKK SR | | Detailed terrain shading | 8 | tile | 0 | 18 | 16 | | | | cz | © Freemap, © ČÚZK | | Terrain shading | 5 | tile | 0 | 18 | | 1000 | | | sk | © Freemap; DMR 5.0 © ÚGKK SR | | Surface shading | 6 | tile | 0 | 18 | | 1000 | | | sk | © Freemap; DMP 1.0 © ÚGKK SR | | OpenStreetMap Vector | VO | maplibre | | | | | | | | OSM data; MapTiler | | Streets Vector | VS | maplibre | | | | | | | | OSM data; MapTiler | | Dataviz Vector | VD | maplibre | | | | | | | | OSM data; MapTiler | | Outdoor Vector | VT | maplibre | | | | | | | | OSM data; MapTiler | | Cadastre | WKA | wms | | | 15 | | | k | sk | © GKÚ | | Tree Composition | WDZ | wms | 13 | | 15 | | | | sk | © NLC Zvolen | | Forest Types | WLT | wms | 12 | | 15 | | | | sk | © NLC Zvolen | | Geological | WGE | wms | | | 15 | | | l | sk | © ŠGÚDŠ | | Hydrochemic | WHC | wms | | | 15 | | | w | sk | © ŠGÚDŠ | **Overlay layers** | name | id | technology | minZ | maxNativeZ | premiumFromZ | creditsPerMTile | supersededBy | shortcut | countries | notes | | -------------------------- | --- | ----------------- | ---: | ---------: | -----------: | --------------: | ------------ | -------- | --------- | ---------------------------------------------------------- | | Data layer | i | interactive | | | | | | ⇧d | | Interactive items of all tools (drawing, route, search, …) | | Photos | I | gallery | 10 | | | | | ⇧f | | Own Creative-Commons photos (CC BY-SA 4.0 default; premium-only option) **and** geotagged Wikimedia Commons photos, in one layer; both shown from zoom 10 | | Wikipedia | w | wikipedia | 8 | | | | | ⇧w | | Wikipedia | | Weather radar | R | radar | | 9 | | | | ⇧r | | Animated precipitation radar. Premium: up to 6 h of history plus a 1-hour forecast; otherwise 2 h and no forecast. Data © EUMETNET OPERA — over Italy CC BY-SA 4.0 © Radar-DPC | | Forest tracks NLC (2017) | l1 | tile | 11 | 15 | | 1000 | l2 | | sk | © NLC Zvolen (legacy) | | Forest tracks NLC | l2 | maplibre | 9 | | | | | ⇧n | sk | © NLC Zvolen | | Parametric shading | h | parametricShading | | 13 | | | | ⇧h | | Experimental; © Freemap, GEDTM30 (Europe) | | Parametric shading | y | parametricShading | | 19 | 13 | | | ⇧y | sk | Experimental; © Freemap; LLS DMR © ÚGKK SR | | Parametric shading | z | parametricShading | | 18 | 13 | | | | cz | Experimental; © Freemap, © ČÚZK | | Cadastre | wka | wms | | | 15 | | | ⇧k | sk | © GKÚ (cadastre over aerial) | Notes: - The `i` (Data layer) overlay hosts every tool's interactive features; hiding it hides those features without disabling the tools. - The single `X` "Outdoor" base map renders hiking, bicycle, ski and riding trails together — there are no longer separate per-activity trail layers. - The `R` (Weather radar) overlay is animated: turning it on opens its own toolbar with play/pause, frame stepping and a timeline. The timeline carries the same frames for everyone — the measured frames the server offers (about three hours at present) plus a one-hour forecast — but only part of it can be opened without premium: premium reaches up to six hours back and can open the forecast, everyone else two hours and no forecast. The locked stretches are painted in the upsell colour at each end and offer premium when clicked. The only setting is whether the forecast frames are shown at all, which is itself premium. ##### Internal layer codes The id values above are used in deep links via the `layers=` URL param: one base-layer code, optionally followed by `~` and the concatenated overlay codes (e.g. `layers=X~I` = Outdoor base + Photos overlay). They are **advisory** for interpreting links and do **not** grant permission to scrape tiles or data; respect each layer's attribution and license. Clicking a marker on the Wikipedia overlay opens a preview modal, addressable via the unified `show=` param: `/#show=wiki/:`. Wikimedia Commons photos are part of the Photos layer and open in the gallery viewer like any other photo (legacy `/#show=wmc/<pageId>` and `/#wmc=<pageId>` links still resolve there). ## Links - [Freemap.sk](https://www.freemap.sk/): the web map application described in this document - [Freemap Slovakia on GitHub](https://www.github.com/FreemapSlovakia): source code and issue tracker - [Freemap Slovakia on Facebook](https://www.facebook.com/FreemapSlovakia) - [Freemap Slovakia on YouTube](https://www.youtube.com/channel/UCy0FrRnqJlc96dEpDIpNhIQ) - [OpenStreetMap](https://www.openstreetmap.org/): underlying map data source - [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page): OpenStreetMap documentation