No project description provided
Project description
Implementing the GeoSot in Rust
编码使用示例
use geosot::{get_code, to_string};
fn main() {
let x = 76.233;
let y = 27.688;
let level = 32;
let code = get_code(x, y, level);
// 32级
// code: 339638376531246140
// grid: G001023122-203103-131010.33003300330
println!("经维度: {} {}", x, y);
println!("code: {}", code);
println!("grid: {}", to_string(code, level));
}
GeoSOT 空间关系计算库
基于 GeoSOT 编码的空间区域交、并、差、补关系计算库。
功能特性
- ✅ 基础编码功能:经纬度与 GeoSOT 编码的相互转换
- ✅ 空间区域表示:支持点、矩形、多边形区域的 GeoSOT 编码表示
- ✅ 空间集合运算:交集、并集、差集、对称差集、补集
- ✅ 空间关系判断:相交、包含、子集、超集、不相交判断
- ✅ 空间分析指标:Jaccard相似度、重叠率、紧密度计算
- ✅ 多种创建方式:支持点集、矩形、多边形等多种区域创建方式
快速开始
基本使用
use geosot::spatial::{GeoSotRegion, spatial_analysis};
fn main() {
// 创建区域
let level = 20; // 精度等级
let mut region = GeoSotRegion::new(level);
// 添加点
region.add_point(116.0, 39.0); // 北京
region.add_point(121.0, 31.0); // 上海
println!("区域包含 {} 个网格", region.size());
}
空间集合运算
use geosot::spatial::GeoSotRegion;
// 创建两个区域
let region_a = GeoSotRegion::from_codes(vec![1, 2, 3, 4], 20);
let region_b = GeoSotRegion::from_codes(vec![3, 4, 5, 6], 20);
// 交集运算
let intersection = region_a.intersection(®ion_b);
println!("交集: {} 个网格", intersection.size());
// 并集运算
let union = region_a.union(®ion_b);
println!("并集: {} 个网格", union.size());
// 差集运算
let difference = region_a.difference(®ion_b);
println!("差集: {} 个网格", difference.size());
// 对称差集
let sym_diff = region_a.symmetric_difference(®ion_b);
println!("对称差集: {} 个网格", sym_diff.size());
矩形区域创建
use geosot::spatial::GeoSotRegion;
// 创建矩形区域
let region = GeoSotRegion::from_rectangle(
115.0, 38.0, // 左下角经纬度
117.0, 40.0, // 右上角经纬度
18 // 精度等级
);
println!("矩形区域包含 {} 个网格", region.size());
空间关系判断
let region1 = GeoSotRegion::from_codes(vec![1, 2, 3], 20);
let region2 = GeoSotRegion::from_codes(vec![2, 3, 4], 20);
let region3 = GeoSotRegion::from_codes(vec![1, 2], 20);
// 判断相交
if region1.intersects(®ion2) {
println!("区域1和区域2相交");
}
// 判断包含关系
if region3.is_subset(®ion1) {
println!("区域3是区域1的子集");
}
// 判断不相交
if region1.is_disjoint(®ion2) {
println!("区域1和区域2不相交");
}
空间分析指标
use geosot::spatial::spatial_analysis;
let region1 = GeoSotRegion::from_codes(vec![1, 2, 3, 4], 20);
let region2 = GeoSotRegion::from_codes(vec![3, 4, 5, 6], 20);
// Jaccard 相似度
let similarity = spatial_analysis::jaccard_similarity(®ion1, ®ion2);
println!("Jaccard相似度: {:.4}", similarity);
// 重叠率
let overlap = spatial_analysis::overlap_ratio(®ion1, ®ion2);
println!("重叠率: {:.4}", overlap);
// 紧密度
let compactness = spatial_analysis::compactness(®ion1);
println!("紧密度: {:.4}", compactness);
补集运算
// 定义全集
let universe = GeoSotRegion::from_codes(vec![1, 2, 3, 4, 5, 6, 7, 8], 20);
let region = GeoSotRegion::from_codes(vec![2, 4, 6], 20);
// 计算补集
let complement = region.complement(&universe);
println!("补集包含 {} 个网格", complement.size());
// 结果:{1, 3, 5, 7, 8}
API 参考
GeoSotRegion 结构体
创建方法
new(level: usize)- 创建空区域from_codes(codes: Vec<u64>, level: usize)- 从编码向量创建from_rectangle(min_lng, min_lat, max_lng, max_lat, level)- 从矩形创建from_polygon(points: &[(f64, f64)], level)- 从多边形创建
添加操作
add_code(&mut self, code: u64)- 添加编码add_point(&mut self, lng: f64, lat: f64)- 添加经纬度点
查询操作
contains(&self, code: u64) -> bool- 检查是否包含编码contains_point(&self, lng: f64, lat: f64) -> bool- 检查是否包含点size(&self) -> usize- 获取网格数量is_empty(&self) -> bool- 检查是否为空
集合运算
intersection(&self, other: &GeoSotRegion) -> GeoSotRegion- 交集union(&self, other: &GeoSotRegion) -> GeoSotRegion- 并集difference(&self, other: &GeoSotRegion) -> GeoSotRegion- 差集symmetric_difference(&self, other: &GeoSotRegion) -> GeoSotRegion- 对称差集complement(&self, universe: &GeoSotRegion) -> GeoSotRegion- 补集
关系判断
is_subset(&self, other: &GeoSotRegion) -> bool- 子集判断is_superset(&self, other: &GeoSotRegion) -> bool- 超集判断intersects(&self, other: &GeoSotRegion) -> bool- 相交判断is_disjoint(&self, other: &GeoSotRegion) -> bool- 不相交判断
转换方法
to_strings(&self) -> Vec<String>- 转为网格字符串表示to_coordinates(&self) -> Vec<(f64, f64)>- 转为经纬度坐标
空间分析模块 (spatial_analysis)
jaccard_similarity(region1, region2) -> f64- Jaccard相似度计算overlap_ratio(region1, region2) -> f64- 重叠率计算compactness(region) -> f64- 紧密度计算
使用示例
复合操作
let beijing = GeoSotRegion::from_rectangle(115.5, 39.0, 116.5, 40.0, 18);
let shanghai = GeoSotRegion::from_rectangle(120.5, 30.5, 121.5, 31.5, 18);
let hangzhou = GeoSotRegion::from_rectangle(119.5, 29.5, 120.5, 30.5, 18);
// 复合操作:(北京 ∪ 上海) - 杭州
let result = beijing.union(&shanghai).difference(&hangzhou);
println!("复合操作结果: {} 个网格", result.size());
批量区域分析
let regions = vec![
GeoSotRegion::from_rectangle(115.0, 39.0, 117.0, 40.0, 18),
GeoSotRegion::from_rectangle(120.0, 30.0, 122.0, 32.0, 18),
GeoSotRegion::from_rectangle(113.0, 22.0, 115.0, 24.0, 18),
];
// 计算所有区域的并集
let mut total_union = GeoSotRegion::new(18);
for region in ®ions {
total_union = total_union.union(region);
}
println!("所有区域的并集: {} 个网格", total_union.size());
// 分析区域间的相似度
for i in 0..regions.len() {
for j in (i+1)..regions.len() {
let similarity = spatial_analysis::jaccard_similarity(®ions[i], ®ions[j]);
println!("区域{}与区域{}的相似度: {:.4}", i+1, j+1, similarity);
}
}
运行示例
# 运行基本示例
cargo run --example demo
# 运行空间关系示例
cargo run --example spatial_demo
# 运行测试
cargo test
# 运行特定测试
cargo test test_spatial_operations
注意事项
- 精度等级:精度等级范围为 1-32,数值越大精度越高,但计算量也越大
- 性能考虑:大区域(高精度)的空间运算可能较慢,建议根据实际需求选择合适的精度
- 内存使用:区域使用
BTreeSet<u64>存储编码,大区域会占用较多内存 - 坐标系统:使用 WGS84 坐标系统,经度范围 [-180, 180],纬度范围 [-90, 90]
扩展功能
可以基于此库进一步开发:
- 多层级区域分析
- 时空数据处理
- 空间索引构建
- 地理信息可视化
- 空间聚类分析
许可证
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file geosot-0.1.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: geosot-0.1.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 171.4 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
564b18f95c3ffe19563f7bf798b22d7ef80b56b0ce733880dc3de06be0a57b3b
|
|
| MD5 |
99d8aa81a59d653c92802a3c27eced61
|
|
| BLAKE2b-256 |
9adabe2557f09b8145c6b66d80256aa583caaf2d4fbbcd76503ee43ff2962290
|