#geospatial #search #nearest-neighbor #search-index #proximity #geohash #key-index

geoprox-core

Core library for Geoprox, provides geospatial indexing and search functionalities

8 releases (4 breaking)

0.5.0 Aug 23, 2024
0.4.2 Aug 12, 2024
0.3.1 Aug 6, 2024
0.2.0 Aug 3, 2024
0.1.0 Aug 1, 2024

#270 in Geospatial

46 downloads per month
Used in 2 crates

MIT/Apache

38KB
781 lines

Geoprox Core

Geoprox Core is the foundational Rust crate for the Geoprox project, providing robust geospatial indexing and sharding capabilities. It includes two primary modules:

  • index: Manages in-memory storage and retrieval of geospatial data to ensure quick access and efficient querying.
  • shard: Handles the partitioning and indexing of geospatial information, optimizing data distribution and retrieval across large datasets.

These modules are built to handle various use cases, such as food delivery services and real-time inventory tracking.

Looking for an API implementation? See, geoprox-server for the HTTP API version of this service and contrib/client-sdk for HTTP client libraries.

Features

  • Geospatial Indexing: Efficiently index and search for resources based on their geographic location.
  • Geospatial Sharding: Manage and query distributed datasets with geospatial awareness.

Data Stuctures

GeoShard

The shard module implements the GeoShard data structure, which facilitates geographical sharding of datasets and enables efficient range queries.

Key features include:

  • Creating Indexes: Initialize geospatial indexes for different datasets.
  • Inserting Keys: Insert keys into the geospatial index with their corresponding locations.
  • Querying Ranges: Query the index to find keys within a specified range from a given location.
  • Drop Index: Deletes the index and its associated keys.
  • Batch Commands: Insert, Remove or Query objects in bulk.

Example Usage

use geoprox_core::shard::GeoShard;

let mut shard = GeoShard::default();
// ? create an index to store driver coordinates
shard.create_index("drivers").unwrap();

// ? place drivers into index
let ttl = std::time::Duration::from_secs(10);
shard.insert_key(
    "drivers", "alice",
    [36.2049, 138.253],
    Some(ttl)
).unwrap();

shard.insert_key(
    "drivers", "bob",
    [36.2047, 138.2528],
    None
).unwrap();

// ? search drivers near Japan
let nearby: LatLngCoord = [36.2048, 138.2529];
let within: f64 = 50.0; // 50km radius
let count = 100; // return up to 100 results
let sorted = true; // sort results by distance

let res = shard.query_range("drivers", nearby, within, Some(count), Some(sorted));

println!("found: {:#?}", res.unwrap());

SpatialIndex

The index module implements the SpatialIndex data structure, enabling efficient placement and searching of resources based on their geohash-encoded locations.

Key features include:

  • Placing Resources: Add resources to the index with their geohash-encoded locations.
  • Searching Resources: Perform range queries to find resources within a specified distance from a given location.

Example Usage

use geoprox_core::index::SpatialIndex;

let mut geo_index = SpatialIndex::default();

// ? place object keys into index
geo_index.insert("alice", "s00j8n0");
geo_index.insert("bob", "s00j8n1");

// ? search index for objects near New York
let nearby: LatLngCoord = [40.7128, 74.006];
let within: f64 = 200.0; // 200km radius
let count = 100; // return up to 100 results
let sorted = true; // sort results by distance
let search_depth = 6; // search precision (higher means more precise)
let res = geo_index.search(nearby, within, count, sorted, depth).unwrap();

println!("found: {:#?}", res);

assert_eq!(res.len(), 2);

res.iter().for_each(|neighbor| {
    assert!(neighbor.distance <= within);
});

Contributing

Contributions are welcome! Please see the contributing guidelines for more information.

License

This project is licensed under the Apache 2.0 or MIT License (your choice).

Dependencies

~9–33MB
~503K SLoC