#h3 #compression #index #cell #tree #storage #set

h3o-zip

为H3单元格索引量身定制的压缩方案

1 个不稳定版本

0.1.6 2024年3月25日

#911算法

Download history 133/week @ 2024-04-08 178/week @ 2024-04-15 150/week @ 2024-04-22 57/week @ 2024-05-06 137/week @ 2024-05-13 141/week @ 2024-05-20 139/week @ 2024-05-27 110/week @ 2024-06-03 121/week @ 2024-06-10 110/week @ 2024-06-17 76/week @ 2024-06-24 67/week @ 2024-07-01 67/week @ 2024-07-08 107/week @ 2024-07-15 84/week @ 2024-07-22

330 每月下载量
3 crates 中使用

BSD-3-Clause

295KB
971

h3o-zip — H3压缩算法

Crates.io Docs.rs CI Status Coverage License

此库允许将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(())
}

许可证

BSD 3-Clause

依赖项

~5.5MB
~63K SLoC