Places and streets in South Africa, from OpenStreetMap Unmapped Dataworks, unmapped.co.za/open#addresses WHAT THIS IS The database behind the address search on unmapped.co.za (Unmapped Search, at /search). Three files, one JSON object a line, gzipped: osm-places-.ndjson.gz cities, towns, suburbs, townships, villages and other named places osm-streets-.ndjson.gz named public streets; a street longer than 1.5 km is cut into pieces of about 1 km osm-houses-.ndjson.gz one street a line: its id, its name and the house numbers OpenStreetMap has on it, each with its point Each record has its OpenStreetMap name and other names (old, official, other languages), its kind, a point ("at": [lat, lon]) and where it is (the nearby places named in OpenStreetMap). A street piece also has its end points and length; a place mapped as an area has the points where it reaches furthest north, south, east and west. WHERE IT COMES FROM Only OpenStreetMap: the Geofabrik extract of South Africa, OSM data to 31 October 2026 (sha256 in open.json on the page). Nothing else is joined in. The ward and municipality our search shows for a result are worked out when someone searches, from the Municipal Demarcation Board's ward boundaries, which are a separate dataset with their own terms; they are not in these files. No personal information: no contributor names or ids, no farms or isolated dwellings (often a family's name), no private roads or driveways. For a house, only its number and its point: never a house name, an owner, an occupant. LICENCE Data © OpenStreetMap contributors, available under the Open Database License 1.0 (https://opendatacommons.org/licenses/odbl/1-0/). See https://www.openstreetmap.org/copyright. You may copy, share, adapt and use it, also commercially, if you credit OpenStreetMap contributors and keep anything you derive from it and publish under the same licence. We add no other terms. HOW IT IS MADE (the method, ODbL 4.6) address-osm.py reads the extract and writes the two files (Python, pyosmium and shapely) address-lib.mjs turns them into the search index rows (names folded for search, ranks, heavy prefixes) address-houses.py puts each house number on its named street and writes the third file (Python, pyosmium) address-houses-lib.mjs turns the street names and house numbers into the address suggestions All four are offered here under the MIT licence. To rebuild: python3 -m venv venv && venv/bin/pip install osmium shapely venv/bin/python -I address-osm.py --pbf south-africa-261031.osm.pbf --out out/ venv/bin/python -I address-houses.py --pbf south-africa-261031.osm.pbf --streets out/osm-streets.ndjson --out out/ HOW A HOUSE NUMBER IS PLACED A point tagged addr:housenumber goes on the nearest stretch, within 400 m, of a street with exactly the name its addr:street gives. With no addr:street, it goes on a street only when one named street is within 40 m and no street of another name is within twice that; otherwise it is left out. Numbers that are not a plain number (1 to 5 digits and at most one letter) are left out. houses.json counts what was kept and left out, and why. WHERE EACH DAM IS (dam-points.json, also ODbL 1.0) For each dam in the Department of Water and Sanitation's weekly report, by station: a point inside the dam's OpenStreetMap water outline, as [lat, lon, km2 of the outline], the outline matched by name and checked against the capacity the Department gives. Since 13 November 2026, the dams OpenStreetMap can't place (and two whose OpenStreetMap outline was another dam of the same name, under "corrected") are at the Department's own station position from its reservoir station catalogues (https://www.dws.gov.za/Hydrology/Verified/HyCatalogue.aspx; the gauge, at or near the wall), as [lat, lon, full-supply surface area in km2], listed under "from_dws"; those points are the Department's, not OpenStreetMap's. "check" says how close the OpenStreetMap outlines lie to the Department's stations. Dams placed by neither are listed under "unplaced" with the reason. Used for the dams nearest a spot and the towns near a dam.