geodb-rs
A high-performance, pure-Rust geographic database with countries, states/regions, cities, aliases, phone codes, currencies, timezones, and WebAssembly support.
This repository is a Cargo workspace containing:
geodb-core— main geographic database library (published on crates.io) — docs: https://docs.rs/geodb-coregeodb-cli— finished command‑line interface — docs: https://docs.rs/geodb-cligeodb-wasm— WebAssembly bindings + browser demo — docs: https://docs.rs/geodb-wasmgeodb-py— Python bindings (published on PyPI as “geodb‑rs”) — https://pypi.org/project/geodb-rs/
Overview
geodb-core provides:
- 🚀 Fast loading from compressed JSON or binary cache
- 💾 Automatic caching based on dataset file and filters
- 🔎 Flexible lookups: ISO codes, names, aliases, phone codes
- 🌍 Countries, states/regions, cities, populations
- 🗺 Accurate metadata: region, subregion, currency
- 📞 Phone code search
- ⏱ Zero-copy internal model
- 🦀 Pure Rust — no unsafe
- 🕸 WASM support via
geodb-wasm
The dataset is adapted from
https://github.com/dr5hn/countries-states-cities-database
(licensed under CC-BY-4.0, attribution required).
Important: Data source we rely on
geodb-core ships and expects the upstream dataset from the following file in the dr5hn/countries-states-cities-database repository:
The default loader uses a copy of this file placed under
crates/geodb-core/data/countries+states+cities.json.gzand builds a binary cache alongside it. If you update or replace the dataset, ensure it retains the same JSON structure. Please observe the CC‑BY‑4.0 license and attribution of the upstream project.
Installation
For Rust applications
[]
= "0.2"
For WebAssembly (browser/Node)
[]
= "0.2"
Quick Start
use *;
Loading & Caching
Default loading
Loads from:
geodb-core/data/countries+states+cities.json.gz
Creates automatic cache:
countries+states+cities.json.ALL.bin
let db = load?;
Load from a custom file
let db = load_from_path?;
Cache becomes:
worlddata.json.ALL.bin
Filtered loading (ISO2)
let db = load_filtered_by_iso2?;
Cache:
countries+states+cities.json.DE_US.bin
Cache rules:
<dataset_filename>.<filter>.bin
Usage Examples
List all countries
use *;
let db = load?;
for country in db.countries
Find by ISO code
if let Some = db.find_country_by_iso2
Country details
if let Some = db.find_country_by_iso2
States & cities
if let Some = db.find_country_by_iso2
Phone search
let countries = db.find_countries_by_phone_code;
Search for cities named “Springfield”
let results: = db.countries
.iter
.flat_map
.collect;
WebAssembly (geodb-wasm)
Exports:
search_country_prefixsearch_countries_by_phonesearch_state_substringsearch_city_substringsmart_searchget_stats
To run locally:
Live demo:
https://trahe.eu/geodb-rs.html
Command-line interface (geodb-cli)
The CLI is finished and available on crates.io. It provides quick access to the database for exploration, scripting, or data checks.
Install:
Examples:
Docs.rs: https://docs.rs/geodb-cli
Python bindings (geodb-py)
- Package name on PyPI: geodb-rs
https://pypi.org/project/geodb-rs/ - Module to import in Python:
geodb_rs - Built and published wheels for these targets:
- os: ubuntu-latest
target: x86_64
manylinux: auto
- os: ubuntu-latest
target: aarch64
manylinux: auto
- os: macos-13
target: x86_64
manylinux: ""
- os: macos-14
target: aarch64
manylinux: ""
- os: windows-latest
target: x64
manylinux: ""
Quick start:
= # tries bundled data first
# (countries, states, cities)
Workspace Layout
geodb-rs/
├── crates/
│ ├── geodb-core
│ ├── geodb-wasm
│ ├── geodb-cli
│ └── geodb-py
├── data/
│ ├── countries+states+cities.json.gz
│ └── geodb.standard.bin
├── examples/
├── scripts/
└── README.md
Performance
- Initial load from JSON: ~20–40ms
- Cached load: ~1–3ms
- Memory use: 10–15MB
- Fully zero-copy internal model
Contributing
Before submitting PRs:
cargo fmt
cargo clippy --all-targets -- -D warnings
cargo test --workspace
cargo doc --workspace
cargo sort -cwg
taplo format --check
cargo deny check
License
Code
MIT License.
Data Attribution (Required)
This project includes data from:
countries-states-cities-database
https://github.com/dr5hn/countries-states-cities-database
Licensed under Creative Commons Attribution 4.0 (CC-BY-4.0).
Attribution is required if you redistribute or use the dataset.
Links
- Repo: https://github.com/holg/geodb-rs
- Rust docs:
- geodb-core: https://docs.rs/geodb-core
- geodb-cli: https://docs.rs/geodb-cli
- geodb-wasm: https://docs.rs/geodb-wasm
- Crates.io: https://crates.io/crates/geodb-core
- PyPI (Python bindings): https://pypi.org/project/geodb-rs/
Made with ❤️ in Rust.