The OpenStreetMap project is “a free editable map of the whole world”, created by users with GPS data or by tracing over Yahoo Maps images (allowed by Yahoo) or public domain Landsat data. Data is viewable by anyone; registration assigns you a username and password that lets you contribute your own data to the project, using a multi-platform map editor like JOSM or Meerkartor. JOSM also lets you save downloaded data from OpenStreetMap, and this data can be converted to the .img format used by Garmin mapping GPS units, or converted to a GPX file for general import into GPS units.
The current OSM data in Garmin .img format is available for the UK, South Africa, and Africa at the Mkgmap wiki site, and for Germany/Netherlands and the entire world at this site. But if you want the most recent data, data subsets for different areas, or don’t want the entire dataset for the world, you can download data for a specific area from OpenStreetMap and convert it yourself to a Garmin .img file. Data coverage is still spotty, so you should check the OpenStreetMap site to see whether the area you’re interested in has data. If yes:
1. Click the “Download some data from the OSM server” link in JOSM, and specify the latitude/longitude bounds of the area you’re interested in (no more than 0.25 degrees square) (note: you’ll need to have entered your OSM username and password in the preferences section).
2. Save the downloaded data as an *.osm file if you want to convert it to Garmin format, else save it as a GPX file.
3. Use the command line Java program Mkgmap to convert the *.osm file to a Garmin img map file (always the same output filename, “63240001.img”, but you can rename it to a different 8-digit number after creation) . If your osm file is called test.osm and is in the same directory as mkgmap.jar, the command syntax is “java -jar mkgmap.jar test.osm”. Enter the appropriate data path if it’s located in a different directory, but the 63240001.img file will always be created in the directory where mkgmap.jar is located. If you’d prefer a GUI, I’ve created a simple one for Windows that you can download here; unzip it to the same directory as mkgmap.jar and run it. The *.osm file will have to be in the same directory as mkgmap.jar for this GUI to work; sorry about that.
4. Upload the .img file to your Garmin GPS using a program like sendMap, or MapUpload if you have a compatible Garmin unit. For GPX files, use the upload program of your choice (e.g. GPS TrackMaker or EasyGPS).
Thanks to David from the UK for the tip.