1 个不稳定版本
0.1.6 | 2024年3月25日 |
---|
#911 在 算法 中
330 每月下载量
在 3 crates 中使用
295KB
971 行
h3o-zip — H3压缩算法
此库允许将H3单元格集压缩成紧凑的空间高效表示。
它提供了压缩的H3树编解码器(CHT)。
这特别适用于磁盘存储或网络传输。
压缩结果
密集集
测试数据:覆盖巴黎的11分辨率下的54,812个H3单元格(连续形状,无孔)。
格式 | 大小(以字节为单位) | 位/索引 |
---|---|---|
原始 | 438 496 | 64.00 |
CHT | 16 330 | 2.38 |
紧凑 | 16 192 | 2.36 |
紧凑+CHT | 933 | 0.14 |
由连续索引组成的密集集更容易压缩。我们可以看到,H3的compact
例程非常有效,并且与CHT一样好,通过编码索引在~2位上。
现在,有趣的部分是,通过首先压缩索引集,然后应用CHT,我们可以进一步减少大小(结果负载比原始负载小约470倍)!
这是因为H3压缩与CHT不同,并不真正压缩数据(索引始终编码在64位上),而是通过将子组替换为其祖先来减少索引的数量。
集越密集,压缩率越高: mainland France at resolution 11(267,532,208个索引,1.99 Gio)被压缩并压缩到100.93Kio!
稀疏集
测试数据:覆盖 mainland France 中的环道的11分辨率下的690,451个H3单元格。
格式 | 大小(以字节为单位) | 位/索引 |
---|---|---|
原始 | 5 523 608 | 64.00 |
紧凑 | 5 519 768 | 63.95 |
CHT | 539 405 | 6.25 |
紧凑+CHT | 539 265 | 6.25 |
像这样的稀疏集更难压缩,因为可利用的冗余较少。
H3压缩在这里完全不起作用(仅从600k中减少了480个索引),因为它无法找到足够的完整子组来替换它们。
另一方面,CHT仍然产生显著的结果(尽管不如密集集上的好),将负载减少到原始负载的1/10,并使用~6.25位/索引。
安装
Cargo
- 按照此指南安装rust工具链,以便安装cargo。
- 运行
cargo install h3o-zip
用法
加载一个城市的形状,计算分辨率为10的H3覆盖范围,并将压缩后的结果保存到磁盘
use geojson::GeoJson;
use h3o::{
geom::{Geometry, ToCells},
CellIndex, Resolution,
};
use std::{fs::File, io::BufReader};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let file = BufReader::new(File::open("city.geojson")?);
let geojson = GeoJson::from_reader(file)?;
let geometry = Geometry::try_from(&geojson)?;
let mut file = File::create("coverage.cht")?;
h3o_zip::compress(
&mut file,
CellIndex::compact(geometry.to_cells(Resolution::Ten))?,
)?;
Ok(())
}
许可证
依赖项
~5.5MB
~63K SLoC