Building My Own Garmin™ Maps for Outdoor Activities Based on OpenStreetMap Data
For many years, I’ve used pre-made Garmin maps from the internet on my devices while hiking, running, or mountain biking. These maps have always been based on data from the OpenStreetMap (OSM) project. In the early days, a map of Europe was just a few hundred megabytes in size and usually fit comfortably on the device’s memory card. However, in recent years, the OSM dataset has grown so extensively that, depending on styling and content, the required storage space for maps can quickly reach into the gigabyte range.
Since my old Garmin device only allows one map to be loaded at a time, switching between, for example, a Germany map and an Alps map isn’t easily possible for me. So, what to do? The answer: build my own custom map, including a style tailored to my personal preferences.
While researching how to build a Garmin-compatible map from OSM data as easily as possible, I came across the Freizeitkarte project by Klaus Tockloth. His website offers a complete development environment for creating maps. Using this framework, I began building my own maps, starting with some initial tests using (very) small data extracts.
My main goal during development was to create a minimalist map consisting of the complete road and path network, selected landmarks that might assist with orientation, shelters or similar places to take cover, and contour lines. A nice side effect: by heavily reducing the map data to just the essentials (mainly the transportation network), the image size of the resulting Garmin map files is significantly smaller.
Here’s a comparison table showing the image size of the generated Garmin map files for the standard Freizeitkarte style versus my minimal custom style:
Region/Country | Standard Style Image Size | My Style Image Size | Build Time |
---|---|---|---|
Hesse | 144 MB | 64 MB | 1m29s |
Germany | 2.1 GB | 880 MB | 17m10s |
Spain | 1.2 GB | 805 MB | 12m36s |
For all map builds, routing functionality, house numbers, and address search indexing were disabled. I conducted all tests on a dedicated test machine with roughly 0.5 TB RAM, 48 CPUs, and 2 TB NVMe storage. The map generation process was configured to use 100 GB RAM and all available CPU cores. This same machine also builds my global OSM vector tiles (zoom level 14) with a custom style and TileMaker in under 2 hours, as part of various quality assurance processes under the ResultMaps project.
A big thank-you to Klaus for his project, which served as both an inspiration and an extremely useful foundation!