将经纬度坐标转换为中国行政区划代码 (adcode) 的高性能解决方案。
基于 Uber H3 空间索引,提供 Go 和 Java 参考实现。
测试环境:Apple M2,14M H3 索引,真实数据
| 语言 | 实现 | 查询速度 | 吞吐量 |
|---|---|---|---|
| Go | Swiss Map | 56 ns/op | 17.7M ops/sec |
| Go | 二分查找 | 258 ns/op | 3.9M ops/sec |
| Java | Fastutil Map | 260 ns/op | 3.9M ops/sec |
| Java | 二分查找 | 318 ns/op | 3.1M ops/sec |
| 语言 | 实现 | 内存 | 加载时间 |
|---|---|---|---|
| Java | 二分查找 | 161 MB | 381 ms |
| Go | 二分查找 | 209 MB | 644 ms |
| Java | Fastutil Map | 388 MB | 3.1 s |
| Go | Swiss Map | 411 MB | 2.7 s |
| 场景 | 推荐 |
|---|---|
| 极致查询性能 | Go + Swiss Map (56 ns) |
| 内存敏感 | Java + 二分查找 (161 MB) |
| 冷启动敏感 | Java + 二分查找 (381 ms) |
| 平衡方案 | Go + 二分查找 |
直接复制代码到你的项目中,根据需要修改。
复制 examples/go/h3adcode/ 到你的项目:
// 内存优先 (209 MB, O(log n))
resolver, _ := h3adcode.New("data/h3_to_adcode_res8.bin")
// 速度优先 (411 MB, O(1))
resolver, _ := h3adcode.NewFast("data/h3_to_adcode_res8.bin")
// 查询
adcode := resolver.Lookup(39.9042, 116.4074) // 北京 -> 110101复制 examples/java/src/ 到你的项目,添加依赖:
<!-- 仅 FastResolver 需要 -->
<dependency>
<groupId>it.unimi.dsi</groupId>
<artifactId>fastutil</artifactId>
<version>8.5.12</version>
</dependency>// 内存优先 (161 MB, O(log n))
Resolver resolver = Resolver.fromBinary(Paths.get("data/h3_to_adcode_res8.bin"));
// 速度优先 (388 MB, O(1))
FastResolver resolver = FastResolver.fromBinary(Paths.get("data/h3_to_adcode_res8.bin"));
// 查询
int adcode = resolver.lookup(39.9042, 116.4074); // 北京 -> 110101二进制数据文件位于 data/ 目录:
| 文件 | 分辨率 | 精度 | 大小 |
|---|---|---|---|
h3_to_adcode_res8.bin |
8 | ~0.7 km² | 160 MB |
├── data/ # 二进制数据文件
│ └── h3_to_adcode_res8.bin
├── examples/
│ ├── go/h3adcode/ # Go 参考实现
│ └── java/ # Java 参考实现
├── generator/ # 数据生成工具 (gitignore)
├── Makefile # make bench 运行性能测试
└── README.md
make bench # Go + Java
make bench-go # 仅 Go
make bench-java # 仅 JavaMIT
