A Python library for offline reverse geocoding. It improves on an existing library called reverse_geocode developed by Richard Penman.
UPDATE (08-Jul-16): v1.4 released! See release notes below.
Ajay Thampi | @thampiman | opensignal.com | ajaythampi.com
The K-D tree is populated with cities that have a population > 1000. The source of the data is GeoNames.
For first time installation,
$ pip install reverse_geocoder
Or upgrade an existing installation using,
$ pip install --upgrade reverse_geocoder
Package can be found on PyPI.
The library supports two modes:
import reverse_geocoder as rg
coordinates = (51.5214588,-0.1729636),(9.936033, 76.259952),(37.38605,-122.08385)
results = rg.search(coordinates) # default mode = 2
print results
The above code will output the following:
[{'name': 'Bayswater',
'cc': 'GB',
'lat': '51.51116',
'lon': '-0.18426',
'admin1': 'England',
'admin2': 'Greater London'},
{'name': 'Cochin',
'cc': 'IN',
'lat': '9.93988',
'lon': '76.26022',
'admin1': 'Kerala',
'admin2': 'Ernakulam'},
{'name': 'Mountain View',
'cc': 'US',
'lat': '37.38605',
'lon': '-122.08385',
'admin1': 'California',
'admin2': 'Santa Clara County'}]
If you'd like to use the single-threaded K-D tree, set mode = 1 as follows:
results = rg.search(coordinates,mode=1)
The performance of modes 1 and 2 are plotted below for various input sizes.

Mode 2 runs ~2x faster for very large inputs (10M coordinates).
Copyright (c) 2015 Ajay Thampi and contributors. This code is licensed under the LGPL License.
$ claude mcp add reverse-geocoder \
-- python -m otcore.mcp_server <graph>