{"id":13439547,"url":"https://github.com/gx0r/rrgeo","last_synced_at":"2026-04-02T18:46:09.269Z","repository":{"id":41825884,"uuid":"48859040","full_name":"gx0r/rrgeo","owner":"gx0r","description":"A blazing fast, offline, reverse geocoder","archived":false,"fork":false,"pushed_at":"2026-02-05T18:41:11.000Z","size":2872,"stargazers_count":138,"open_issues_count":4,"forks_count":11,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-03-31T04:05:28.182Z","etag":null,"topics":["geocoding","kd-tree","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gx0r.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-12-31T18:42:09.000Z","updated_at":"2026-03-02T13:00:13.000Z","dependencies_parsed_at":"2023-11-25T16:21:39.092Z","dependency_job_id":"cd256d36-0525-4f52-b287-1202ef62cb26","html_url":"https://github.com/gx0r/rrgeo","commit_stats":{"total_commits":209,"total_committers":6,"mean_commits":"34.833333333333336","dds":0.0430622009569378,"last_synced_commit":"ffcdee7b1e458a960ddfafa8e97c09a270f62808"},"previous_names":["llambda/rust-reverse-geocoder","llambda/rrgeo","ggcode1/rrgeo"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/gx0r/rrgeo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gx0r%2Frrgeo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gx0r%2Frrgeo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gx0r%2Frrgeo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gx0r%2Frrgeo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gx0r","download_url":"https://codeload.github.com/gx0r/rrgeo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gx0r%2Frrgeo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31308577,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["geocoding","kd-tree","rust"],"created_at":"2024-07-31T03:01:15.008Z","updated_at":"2026-04-02T18:46:09.244Z","avatar_url":"https://github.com/gx0r.png","language":"Rust","funding_links":[],"categories":["Libraries","库 Libraries"],"sub_categories":["Geospatial","地理空间 Geospatial"],"readme":"# Rust Reverse Geocoder\n\nA fast reverse geocoder in Rust. Inspired by Python [reverse-geocoder](https://github.com/thampiman/reverse-geocoder).\n\n## Links\n\n- [Crate](https://crates.io/crates/reverse_geocoder)\n- [Changelog](CHANGELOG.md)\n- [Docs](https://docs.rs/reverse_geocoder/)\n\n## Description\n\n`rrgeo` takes a latitude and longitude as input and returns the closest city, country, latitude, and longitude, using a k-d tree to efficiently find the nearest neighbour based on a known list of locations. This can be useful if you need to reverse geocode a large number of coordinates quickly, or just need the rough location of coordinates but don't want the expense or complication of an online reverse geocoder.\n\nThis project contains (via [Cargo workspaces](https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html)) a [library](https://crates.io/crates/reverse_geocoder), an [Axum](https://github.com/tokio-rs/axum) REST API, an [Actix](https://actix.rs/) REST API, a [Warp](https://seanmonstar.com/post/176530511587/warp) REST API, and a command-line utility.\n\n## Usage\n\n### Command line search\n\nExample usage:\n\n```\n\u003e cargo run -p rrgeo-cmd --release 40 -73\n0 ms to search\nLocation: (40.72788, -73.09761): West Sayville, New York, Suffolk County, US\nDistance: 0.539337006499999\n```\n\n### Web Servers\n\nExample usage:\n\n```bash\ncargo run -p rrgeo-axum --release\ncargo run -p rrgeo-actix --release\ncargo run -p rrgeo-warp --release\n```\n\n## Benchmarks\n\nBenchmarked on Apple M2.\n\n- Core library benchmarked with `cargo bench` and [criterion](https://github.com/japaric/criterion.rs)\n- Web servers benchmarked with [oha](https://github.com/hatoo/oha)\n\nCore library:\n\n```bash\n\u003e cargo bench\ntime:   [154.16 ns 155.34 ns 157.00 ns]\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eServed via Axum\u003c/summary\u003e\n\n```bash\n\u003e cargo run -p rrgeo-axum --release\n\u003e  oha http://localhost:3000/\\?lat\\=40\\\u0026long\\=\\-73 -z 5sec\nSummary:\n  Success rate:\t100.00%\n  Total:\t5.0004 secs\n  Slowest:\t0.0099 secs\n  Fastest:\t0.0000 secs\n  Average:\t0.0002 secs\n  Requests/sec:\t221767.0303\n\n  Total data:\t162.86 MiB\n  Size/request:\t154 B\n  Size/sec:\t32.57 MiB\n\nResponse time histogram:\n  0.000 [1]       |\n  0.001 [1108827] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n  0.002 [21]      |\n  0.003 [49]      |\n  0.004 [9]       |\n  0.005 [4]       |\n  0.006 [1]       |\n  0.007 [1]       |\n  0.008 [2]       |\n  0.009 [1]       |\n  0.010 [2]       |\n\nResponse time distribution:\n  10.00% in 0.0001 secs\n  25.00% in 0.0002 secs\n  50.00% in 0.0002 secs\n  75.00% in 0.0003 secs\n  90.00% in 0.0003 secs\n  95.00% in 0.0004 secs\n  99.00% in 0.0005 secs\n  99.90% in 0.0006 secs\n  99.99% in 0.0009 secs\n\n\nDetails (average, fastest, slowest):\n  DNS+dialup:\t0.0016 secs, 0.0011 secs, 0.0019 secs\n  DNS-lookup:\t0.0000 secs, 0.0000 secs, 0.0002 secs\n\nStatus code distribution:\n  [200] 1108918 responses\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eServed via Actix Web\u003c/summary\u003e\n\n```bash\n\u003e cargo run --release --bin rrgeo-actix\n\u003e oha http://localhost:3000/\\?lat\\=40\\\u0026long\\=\\-73 -z 5sec\nSummary:\n  Success rate:\t100.00%\n  Total:\t5.0007 secs\n  Slowest:\t0.2502 secs\n  Fastest:\t0.0000 secs\n  Average:\t0.0002 secs\n  Requests/sec:\t204563.3764\n\n  Total data:\t106.34 MiB\n  Size/request:\t109 B\n  Size/sec:\t21.26 MiB\n\nResponse time histogram:\n  0.000 [1]       |\n  0.025 [1021753] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n  0.050 [432]     |\n  0.075 [165]     |\n  0.100 [101]     |\n  0.125 [218]     |\n  0.150 [266]     |\n  0.175 [7]       |\n  0.200 [1]       |\n  0.225 [7]       |\n  0.250 [12]      |\n\nResponse time distribution:\n  10.00% in 0.0000 secs\n  25.00% in 0.0001 secs\n  50.00% in 0.0001 secs\n  75.00% in 0.0001 secs\n  90.00% in 0.0002 secs\n  95.00% in 0.0003 secs\n  99.00% in 0.0011 secs\n  99.90% in 0.0323 secs\n  99.99% in 0.1263 secs\n\n\nDetails (average, fastest, slowest):\n  DNS+dialup:\t0.0015 secs, 0.0012 secs, 0.0019 secs\n  DNS-lookup:\t0.0000 secs, 0.0000 secs, 0.0002 secs\n\nStatus code distribution:\n  [200] 1022963 responses\n\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eServed via Warp\u003c/summary\u003e\n\n```bash\n\u003e cargo run --release --bin rrgeo-warp\n\u003e oha http://localhost:3000/\\?lat\\=40\\\u0026long\\=\\-73 -z 5sec\nSuSummary:\n  Success rate:\t100.00%\n  Total:\t5.0003 secs\n  Slowest:\t0.0111 secs\n  Fastest:\t0.0000 secs\n  Average:\t0.0002 secs\n  Requests/sec:\t232498.2550\n\n  Total data:\t170.74 MiB\n  Size/request:\t154 B\n  Size/sec:\t34.15 MiB\n\nResponse time histogram:\n  0.000 [1]       |\n  0.001 [1162216] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n  0.002 [167]     |\n  0.003 [52]      |\n  0.004 [56]      |\n  0.006 [56]      |\n  0.007 [4]       |\n  0.008 [3]       |\n  0.009 [1]       |\n  0.010 [1]       |\n  0.011 [2]       |\n\nResponse time distribution:\n  10.00% in 0.0001 secs\n  25.00% in 0.0002 secs\n  50.00% in 0.0002 secs\n  75.00% in 0.0003 secs\n  90.00% in 0.0003 secs\n  95.00% in 0.0004 secs\n  99.00% in 0.0004 secs\n  99.90% in 0.0007 secs\n  99.99% in 0.0038 secs\n\n\nDetails (average, fastest, slowest):\n  DNS+dialup:\t0.0018 secs, 0.0013 secs, 0.0025 secs\n  DNS-lookup:\t0.0000 secs, 0.0000 secs, 0.0005 secs\n\nStatus code distribution:\n  [200] 1162559 responses\n```\n\n\u003c/details\u003e\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n## Contribution\n\nAny contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgx0r%2Frrgeo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgx0r%2Frrgeo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgx0r%2Frrgeo/lists"}