#geocoding #service #cities #storage #engine

geosuggest-core

Suggest by name or find nearest by coordinates cities

19 releases

new 0.7.1 May 26, 2025
0.6.6 Feb 13, 2025
0.6.5 Dec 16, 2024
0.6.4 Sep 20, 2024
0.5.1 Sep 28, 2023

#156 in HTTP server

Download history 166/week @ 2025-02-02 328/week @ 2025-02-09 266/week @ 2025-02-16 238/week @ 2025-02-23 171/week @ 2025-03-02 204/week @ 2025-03-09 195/week @ 2025-03-16 266/week @ 2025-03-23 197/week @ 2025-03-30 237/week @ 2025-04-06 295/week @ 2025-04-13 179/week @ 2025-04-20 131/week @ 2025-04-27 172/week @ 2025-05-04 422/week @ 2025-05-11 299/week @ 2025-05-18

1,058 downloads per month
Used in 2 crates

MIT license

59KB
1K SLoC

geosuggest-core

Library to suggest and to find nearest by coordinates cities

Live demo with sources

HTTP service

Examples

Usage example

use tokio;

use geosuggest_core::{EngineData, storage};
use geosuggest_utils::{IndexUpdater, IndexUpdaterSettings};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("Build index...");
    let engine_data = load_engine_data().await?;

    println!("Initialize engine...");
    let engine = engine_data.as_engine()?;

    println!(
        "Suggest result: {:#?}",
        engine.suggest::<&str>("Beverley", 1, None, Some(&["US"]))
    );
    println!(
        "Reverse result: {:#?}",
        engine.reverse::<&str>((11.138298, 57.510973), 1, None, None)
    );

    Ok(())
}

async fn load_engine_data() -> Result<EngineData, Box<dyn std::error::Error>> {
    let index_file = std::path::Path::new("/tmp/geosuggest-index.rkyv");

    let updater = IndexUpdater::new(IndexUpdaterSettings {
        names: None, // no multilang support
        ..Default::default()
    })?;

    let storage = storage::Storage::new();

    Ok(if index_file.exists() {
        // load existed index
        let metadata = storage
            .read_metadata(index_file)
            .map_err(|e| format!("On load index metadata from {index_file:?}: {e}"))?;

        match metadata {
            Some(m) if updater.has_updates(&m).await? => {
                let engine = updater.build().await?;
                storage
                    .dump_to(index_file, &engine)
                    .map_err(|e| format!("Failed dump to {index_file:?}: {e}"))?;
                engine
            }
            _ => storage
                .load_from(index_file)
                .map_err(|e| format!("On load index from {index_file:?}: {e}"))?,
        }
    } else {
        // initial
        let engine = updater.build().await?;
        storage
            .dump_to(index_file, &engine)
            .map_err(|e| format!("Failed dump to {index_file:?}: {e}"))?;
        engine
    })

}

Dependencies

~8–27MB
~462K SLoC