$ cargo install geolite
$ geolite --version
$ geolite build brazil # needs +/- 45gb while building then +/- 3gb when finished
$ geolite http-server # open http://localhost:8080# command line
$ docker run pjpimentel/geolite:latest --version
# pre-built geocoder of a continent
$ docker run -p 8080:8080 pjpimentel/geolite:prebuilt-south-america
# open http://localhost:8080$ docker run pjpimentel/geolite:latest --version
$ docker run -t -v ./geolite-data:/.geolite pjpimentel/geolite:latest build brazilsize matters: once a region's data grows too large for a docker image, its pre-built image stops being updated and may be dropped.
docker run -p 8080:8080 pjpimentel/geolite:prebuilt-south-america
docker run -p 8080:8080 pjpimentel/geolite:prebuilt-south-america-YYYYMMDDHHMM
# open http://localhost:8080the images are rebuilt on the 1st and the 15th of every month from the latest geofabrik extracts; the dated tag keeps each build.
| # | region | docker cmd |
|---|---|---|
| 1 | south-america | docker run -p 8080:8080 pjpimentel/geolite:prebuilt-south-america |
| 2 | portugal | docker run -p 8080:8080 pjpimentel/geolite:prebuilt-portugal |
| 3 | netherlands | docker run -p 8080:8080 pjpimentel/geolite:prebuilt-netherlands |
| 4 | switzerland | docker run -p 8080:8080 pjpimentel/geolite:prebuilt-switzerland |
$ geolite build brazil # br/data.sqlite3 and br/index.tantivy, sealed
$ geolite build south-america # one base per country, thirteen in all
# or with docker
$ docker run --rm -t -v ./geolite-data:/.geolite pjpimentel/geolite:latest build brazil
$ docker run --rm -p 8080:8080 -v ./geolite-data:/.geolite pjpimentel/geolite:latest http-server$ geolite osm-pbf-file download brazil
$ geolite exec extract-osm-pbf-blob-chunks brazil
$ geolite exec extract-osm-pbf-header brazil
$ geolite exec extract-osm-pbf-data brazil
# the two extraction stages read everything the osm data holds, every pbf decoded so far
$ geolite exec extract-osm-admin-levels
$ geolite exec extract-osm-house-numbers# every base of the data path, or the ones named: `geolite exec index-addresses br`
$ geolite exec index-admin-levels-hierarchy
$ geolite exec index-addresses
$ geolite exec index-coordinates# deletes a country without children and a street without parents, then folds the ways of one
# street into one row: both read the hierarchy and clear the addresses and coordinates indexes,
# which have to be built again after them
$ geolite exec optimize-delete-isolated-admin-levels
$ geolite exec optimize-merge-admin-levels
$ geolite exec optimize-delete-intermediary-data
$ geolite exec optimize-sqlite-file$ geolite query "-23.970949,-46.318730" # the base of the country whose boundary holds the point
$ geolite query "rua castro alves, embare, santos, sao paulo" # every base of the data path at once
$ geolite query "rua castro alves, embare, santos, sao paulo" --countries br # the bases named$ geolite http-server # open http://localhost:8080
$ geolite tui # the admin levels walked like folders, one per country at the root$ cargo test --profile e2e --test '*' -- --ignored --nocapture"geo" comes from "geocode" and "lite" comes from "sqlite", no special meaning.
the data comes from any .osm.pbf file (openstreetmap's protobuffer format). this project uses geofabrik as the initial source, which extracts its data from openstreetmap.
the source code is under agplv3 and its dependencies keep their own (all permissive: mit, apache-2.0, bsd, zlib, isc). databases built from openstreetmap data — including the ones shipped in the prebuilt-* images — are derivative databases under the odbl, filtered and restructured for geocoding: © openstreetmap contributors.
two reasons, in this order: to practice rust on a problem large enough to be interesting, and because the alternatives i tried were a bit too complex for a quick run.