8个版本 (4个重大变更)

新版本 0.5.0 2024年8月23日
0.4.2 2024年8月12日
0.3.1 2024年8月6日
0.2.0 2024年8月3日
0.1.0 2024年8月1日

#261 in 地理空间

Download history 325/week @ 2024-07-29 311/week @ 2024-08-05 180/week @ 2024-08-12

每月816次下载
用于 2 crate

MIT/Apache

38KB
781

Geoprox Core

Geoprox Core是Geoprox项目的Rust基础crate,提供强大的地理空间索引和分片功能。它包括两个主要模块

  • index:管理内存存储和检索地理空间数据,确保快速访问和高效查询。
  • shard:处理地理空间信息的分区和索引,优化大数据集的数据分布和检索。

这些模块旨在处理各种用例,例如外卖服务和实时库存跟踪。

寻找API实现?请参阅,geoprox-server用于此服务的HTTP API版本和contrib/client-sdk用于HTTP客户端库。

功能

  • 地理空间索引:根据其地理位置高效索引和搜索资源。
  • 地理空间分片:管理和查询具有地理感知能力的分布式数据集。

数据结构

GeoShard

《code>shard模块实现了《code>GeoShard数据结构,该结构便于数据集的地理空间分片,并支持高效的范围查询。

主要功能包括

  • 创建索引:为不同的数据集初始化地理空间索引。
  • 插入键:将键及其对应的位置插入到地理空间索引中。
  • 查询范围:通过索引查询给定位置附近的指定范围内的键。
  • 删除索引:删除索引及其相关键。
  • 批量命令:批量插入、删除或查询对象。

示例用法

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

index 模块实现了 SpatialIndex 数据结构,使其能够根据资源基于其地理哈希编码的位置进行高效放置和搜索。

主要功能包括

  • 放置资源:将资源及其地理哈希编码的位置添加到索引中。
  • 搜索资源:执行范围查询以查找给定位置附近的资源。

示例用法

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);
});

贡献

欢迎贡献!请参阅贡献指南获取更多信息。

许可证

本项目采用Apache 2.0MIT许可证(任选其一)。

依赖关系

~8–33MB
~501K SLoC