PeakMaps

Description

Turn your list of summits, trails, and viewpoints into a beautiful, interactive map — no coding required.

PeakMaps is a WordPress plugin built for hiking blogs, outdoor clubs, tourism sites, and anyone who wants to showcase peaks, trails, and points of interest on a real, interactive map. Add a searchable database of locations, complete with GPX tracks and elevation profiles — then drop it into any page or post with a Gutenberg block or shortcode.

PeakMaps is completely free, with no peak-count cap, no expiring features, and no upgrade popups. PeakMaps Pro is a separate, optional add-on for sites that want Norwegian topographic maps (Kartverket), custom marker styles, extra data fields, on-map tools, GPX downloads, and bulk CSV import/export.

See it in action: demo table | demo map

What PeakMaps does

Add peaks to your own dedicated database, attach GPX tracks, and PeakMaps takes care of the rest: rendering them on interactive Leaflet maps, generating a sortable and filterable table, calculating elevation profiles — all without a single line of code. Place as many maps and tables as you like, anywhere on your site, each with its own filters and settings.

🗺️ Interactive map

  • Built on Leaflet — fast, lightweight, and mobile-friendly.
  • Marker clustering keeps busy maps clean at lower zoom levels.
  • Background layers: OpenStreetMap and OpenTopoMap, with an easy switcher for visitors.
  • Fullscreen mode for an immersive map view.
  • Smooth touch and pinch-zoom on mobile.

🏔️ GPX tracks and elevation profiles

  • Attach a GPX track to any peak and it renders on the map automatically.
  • Elevation profile charts with interactive hover tooltips — elevation and distance at any point along the track.
  • Ascent/descent totals, min/max elevation, and total distance calculated automatically.
  • Secure GPX proxy built in — tracks hosted anywhere load smoothly without CORS issues.

📊 Smart, filterable table

  • Fully sortable and searchable — sort by name, elevation, municipality, county, visited date, and more.
  • Live filtering by municipality, county, elevation range, free-text search, and visited status — no page reload.
  • Pagination with configurable results per page.
  • Optional row-number column and configurable column selection per instance.

🗄️ Your own peak database

  • A dedicated, purpose-built database — not repurposed WordPress posts — for fast, clean querying at any scale, with no upper limit.
  • Visited/completed tracking — doubles as a personal or club peak-bagging log.
  • Show/hide individual peaks without deleting their data.
  • Full admin interface: search, filter, sort, bulk-edit, bulk-delete, and duplicate entries.

🌍 Built for real-world use

  • Works via Gutenberg blocks (with live editor preview) or classic shortcodes ([peakmaps] and [peakmaps_item]).
  • Norwegian Bokmål translation included; standard WordPress i18n for adding more languages.
  • Automatic cache clearing on settings changes, compatible with WP Rocket, W3 Total Cache, WP Super Cache, LiteSpeed Cache, and WP-Optimize.
  • Assets load only on pages that actually contain a map or table.

PeakMaps Pro

PeakMaps Pro is a separate, optional add-on that extends the free plugin without removing anything from it. Pro adds:

🇳🇴 Norwegian Kartverket maps
Norway’s official topographic map, raster map, and nautical chart as additional background layers. When a Kartverket layer is active, Pro also refines elevation profiles against Kartverket’s own terrain model for extra accuracy.

🎨 Custom marker styles
Choose from circular, square, triangular, diamond, or star markers in any colour — or upload your own custom marker image.

📝 Five custom extra fields
Add up to five fields with labels you choose — difficulty, parking notes, permit info, or anything your project needs. Supports wildcards (*, ?), exclusion (!), and numeric comparisons (>, <, >=, <=) in filters.

🛠️ On-map tools
A distance-measuring tool and a «find my position» GPS button for visitors browsing on mobile.

⬇️ GPX download
Let visitors download GPX files, with an optional terms/consent dialog.

📥 CSV import and export
Bulk-load or update peaks from a spreadsheet, with insert mode (add new entries) and update mode (fill in missing fields on existing ones). Export your full peak database to CSV at any time — perfect for backups or editing in Excel.

Find out more about PeakMaps Pro

Perfect for

  • Hiking and outdoor blogs documenting summits, trails, and viewpoints
  • Tourism boards and destination sites showcasing regional attractions
  • Hiking clubs maintaining a shared, browsable peak list
  • Personal peak-bagging logs for trackers working through a summit list

External services

This plugin connects to external services to display maps, elevation profiles, and GPX tracks. Details for each service are below.

Map tiles (loaded directly by the visitor’s browser)

When a map is shown, the visitor’s browser requests map tile images (small square map images) directly from one or more of the following providers, depending on which background map is selected. Only standard tile-image requests are sent (map coordinates, zoom level, and the browser’s normal request headers such as IP address and user agent) — no personal data, peak data, or site content is transmitted beyond what a normal image request contains.

  • OpenStreetMap (tile.openstreetmap.org) — open, community-maintained world map. Terms: https://operations.osmfoundation.org/policies/tiles/ — Privacy: https://wiki.osmfoundation.org/wiki/Privacy_Policy
  • OpenTopoMap (tile.opentopomap.org) — open topographic map based on OpenStreetMap and elevation data. Terms/usage: https://opentopomap.org/about#verwendung

GPX file proxy (server-side request)

The server also fetches GPX track files, via a proxy, from the URLs stored on each peak (so the file can be shown on a map without cross-origin browser restrictions). The proxy only fetches URLs that exactly match a gpx_url already saved on a peak in this site’s own database; no other URL can be requested through it. Where a GPX file is hosted determines which third party (if any) receives that request — this is set by the site owner when adding a peak, not by this plugin’s own servers.

Source Code

This plugin’s own frontend script, assets/js/nu_script.js, is shipped as a whitespace-minified build for faster loading. Its full human-readable source — same code, same behavior, just formatted — is included in this plugin at assets/src/nu_script.js. No bundler, transpiler, or other build step is used beyond whitespace minification; regenerating the minified file from the source is a single pass through any standard JS minifier.

All other JavaScript and CSS files written for this plugin (everything under assets/js/ and assets/css/ not listed below) are already shipped in their normal, unminified, human-readable form — no separate source is needed for those.

Bundled third-party libraries (Leaflet, Leaflet.markercluster, Leaflet.fullscreen, Leaflet.UTM) are minified as distributed upstream; each file includes a header comment with its name, license, and source repository URL. GPXParser.js (MIT) is included in readable form with a few PeakMaps fixes, listed in its header comment.

External services

This plugin’s map displays background map tiles from a small set of publicly available tile providers, selectable per-site under PeakMaps Settings Background maps. Each provider’s tiles are only loaded when the site owner has selected that specific layer to be shown on the map — no data is sent to any of them unless a map using that layer is actually displayed to a visitor. The data sent in every case is limited to what any map-tile request needs: the visitor’s browser requests image tiles for the map area currently in view (an approximate geographic tile coordinate, not the visitor’s precise location), the same as loading any other embedded map.

Blocks

This plugin provides 2 blocks.

  • PeakMaps Peaks
  • PeakMaps Map

Installation

  1. Upload the peakmaps folder to /wp-content/plugins/, or install the ZIP via Plugins > Add New > Upload Plugin.
  2. Activate the plugin from the Plugins menu in WordPress.
  3. Go to PeakMaps in the admin menu to set up map defaults and add peaks.
  4. Add a map or table with the “PeakMaps” Gutenberg blocks, or the shortcodes [peakmaps_map] / [peakmaps_table].

FAQ

How do I add peaks?

Use the “New peak” button under the PeakMaps menu to add peaks one at a time — name, position, GPX track, and the other details.

How do I display the map or table?

Use the Gutenberg blocks, or the shortcodes [peakmaps_map] and [peakmaps_table]. Parameters are documented on the Help page in admin.

The plugin uses a caching plugin — why don’t my changes show up?

The page cache may serve old HTML. PeakMaps clears the cache automatically when you save the map settings, but also remember to hard-refresh your browser.

Do I have to pay to use PeakMaps?

No. PeakMaps is completely free, with no locked features, limits, or license requirements.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“PeakMaps” is open source software. The following people have contributed to this plugin.

Contributors

Translate “PeakMaps” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

2.9.67

  • Audit of the elevation profile and track drawing, every case verified in a real browser.
  • Fixed: GPX files with several tracks (e.g. one per day) restarted the distance at 0 for each, so the profile drew the days on top of each other and the length/descent were wrong. Distance now runs continuously.
  • Fixed: very large GPX files (~130,000+ points) drew nothing at all (call-stack overflow).
  • Fixed: points at exactly 0 m elevation were dropped; below-sea-level points were drawn outside the chart.
  • Fixed: gaps between track segments are no longer bridged by a straight line on the map or counted as distance.
  • Fixed: a recording that never moves no longer shows an empty chart.
  • New: routes (<rte>) with elevation get a profile when the file has no track elevation.
  • Chart is sharp on high-DPI screens, uses round axis values and the site language’s decimal separator, can be scrubbed by touch, and hovering is ~7× cheaper. The hover line no longer lingers after the pointer leaves.

2.9.66

  • Fixed: total ascent/descent (/) was massively overstated on GPS tracks, the more so the denser the track. The figure was a naive sum of every point-to-point rise, so GPS elevation noise of a metre or two on each of thousands of points piled up into totals several times the real climb (a watch logging every second could read 800%+ too high). Elevation is now smoothed over a window measured in metres — widened automatically on sparse tracks — and integrated with a 2 m dead zone, so noise no longer accumulates while real hills are kept. Validated against profiles with a known climb: a 400 m ascent that previously read 862 m (1000 pts) or 3605 m (5000 pts) now reads 401 m and 399 m; average error dropped from ~200% to under 6%, and small real hills are preserved rather than flattened.
  • Fixed: a one-time stall on the first pan/zoom after a dense track loaded. The elevation chart drew one line segment per track point — tens of thousands of them into roughly 1000 pixels — which the browser only rasterized on the next repaint. The chart now draws at most two points (the min and max) per pixel column, so a 20,000-point track behaves like a 1,000-point one. The curve is unchanged to the eye (a sharp spike still reaches full height), and the hover readout still uses the full track data.

2.9.65

  • Fixed: an empty elevation-profile box could appear under the map when the GPX track had no elevation data (or when there was no track to draw). The graph block now stays hidden until a track with real elevation data is actually drawn, so it no longer sits empty under the map.

2.9.64

  • New per-peak “Marker” setting. Each peak now has a “Show a marker where the track is drawn” checkbox (on by default). Turn it off for a track that isn’t really a summit, and its GPX route is still drawn on the map but without a pin. Works everywhere a map is shown — the shortcode and the block.
  • New markers parameter for the [peakmaps_map] shortcode. Set markers="no" to draw the GPX track(s) on the map without any peak markers; markers="yes" forces markers on even if they’re hidden globally. (This is the per-map switch; the per-peak setting above is the per-track one.)
  • Fixed: the elevation profile chart could render at a fixed narrow width (~100px) and never correct itself, mainly in Chrome/macOS, when it was first drawn before its container had a laid-out width. A ResizeObserver now redraws it the moment the container gets a real width.

For older versions, see CHANGELOG.md in the plugin’s files (this section is trimmed to stay under WordPress.org’s 5000-character readme changelog limit).