资讯详情

H3 六边形分层地理空间索引系统:从源码编译到命令行与 C API 实战指南

📅 2026/10/7 2:27:19 | 华诺云谱 👁 阅读
H3 六边形分层地理空间索引系统:从源码编译到命令行与 C API 实战指南
GIS【免费下载链接】h3Hexagonal hierarchical geospatial indexing system项目地址https://gitcode.com/gh_mirrors/h3/h3点击查看免费下载导读H3 是一套基于正六边形网格的分层地理空间索引系统它用可不断细分约为 0~15 级的六边形网格覆盖全球把 S2 分层细分的思路与六边形网格的均匀邻接特性结合在一起。本文以 H3 官方仓库 README 为主线完整讲解从零编译 H3 C 库、运行测试/覆盖率/基准测试到用命令行工具完成经纬度→索引→边界/中心点转换以及用 C 语言直接调用 H3 API 的完整流程并穿插源码级实现细节让读者既能照着跑通全流程也能理解底层原理。H3 是什么H3 是一个使用六边形网格的地理空间索引系统。其核心设计是用可以近似地逐级细分的六边形网格来覆盖地球从而同时获得六边形网格与 S2 分层细分两者的优势。六边形的优势每个六边形与 6 个邻居共享边且中心点与邻居的距离一致不存在四边形网格中对角邻居距离不一的问题更利于做邻域搜索与距离计算。分层的优势网格可递归细分为更细的六边形天然支持多分辨率下的聚合aggregation与点查询。H3 的公开文档位于 h3geo.org仓库内的 Markdown 开发者文档位于 dev-docs 目录。H3 当前仓库版本信息记录在 VERSION 文件中本仓库为 4.5.0。从源码结构看 H3 的整体布局src/h3lib/H3 核心 C 库公共 API 由 src/h3lib/include/h3api.h.in 经 CMake 配置生成configure_file 生成 h3api.h应用只需包含h3/h3api.h。src/apps/filters/命令行 filter 工具latLngToCell、cellToLatLng、cellToBoundary、gridDisk 等按stdin/stdout 文本过滤器设计可自由组合管道。src/apps/testapps/、src/apps/benchmarks/、src/apps/fuzzers/测试、基准与模糊测试程序。examples/C 语言示例程序。tests/cli/命令行工具的回归测试数据以 CMake 测试描述文件形式存在。KML/make kml生成的网格可视化 KML 文件仓库内已有 icosa.kml。安装 H3使用预编译绑定推荐如果目标编程语言已有官方绑定推荐直接使用预编译绑定。官方提供 Java、JavaScript、Python 等语言的绑定完整列表见 h3geo.org 的 bindings 页面。macOS 下使用 Homebrewbrew install h3从源码构建从源码构建 H3 C 库需要以下工具C 编译器官方用gcc和clang验证过CMake 要求cmake_minimum_required(VERSION 3.20)Make如果计划向 H3 贡献代码还必须安装clang-format官方还推荐安装ccmake与LCOV以便配置 cmake 参数、运行测试并生成覆盖率报告。官方建议覆盖率分析使用gcc因为部分clang版本生成的注解与lcov不兼容。构建 API 文档需要 Doxygen。各平台安装构建依赖Alpine# Installing the bare build requirements apk add cmake make gcc libtool musl-devDebian/Ubuntu# Installing the bare build requirements sudo apt install cmake make gcc libtool # Installing useful tools for development sudo apt install clang-format cmake-curses-gui lcov doxygenmacOSbrew首先确保已安装 Apple 开发者命令行工具然后# Installing the bare build requirements brew install cmake # Installing useful tools for development brew install clang-format lcov doxygenWindowsVisual Studio需要安装 CMake 与 Visual Studio含 Visual C 编译器Windows 构建细节参见 Windows 构建说明。FreeBSD# Installing the build requirements sudo pkg install bash cmake gmake doxygen lcov编译步骤从 Git 仓库检出时默认是最新开发版本若在应用中使用 H3应切换到最近发布的正式版本git checkout v$(VERSION)在仓库根目录编译mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease .. make之后所有make命令都应在build目录内执行。注意用 CMake 构建 H3 有多种方式上述方法只是其中一种把全部构建产物收敛到build目录的示例。系统级安装sudo make install按上述方式构建时清理全部构建产物rm -rf buildCMake 构建选项补充来自根 CMakeLists.txt-DCMAKE_BUILD_TYPEDebug|ReleaseDebug 用于测试/覆盖率Release 用于性能。-DENABLE_COVERAGEON开启覆盖率编译Debug 配合使用。-DBUILD_BENCHMARKSON/OFF默认 ON构建基准测试程序。-DBUILD_FUZZERSON/OFF默认 ON构建 fuzzer 程序。-DBUILD_FILTERSON/OFF默认 ON构建命令行 filter 工具。-DBUILD_GENERATORSON/OFF默认 ON构建代码生成类 miscapps。-DENABLE_LIBFUZZERON/OFF决定 fuzzer 使用 libFuzzer 还是 afl 前端。另外 CMake 会在编译前自动执行 clang-format若检测到与 clang-tidy若检测到分别由ENABLE_FORMAT、ENABLE_LINTING选项控制。测试构建完成后运行测试make test跳过最耗时的用例、跑快速测试集make test-fast测试体系由 CMakeTests.cmake 注册覆盖核心库单元测试、CLI 工具回归测试见 tests/cli/ 下的描述文件例如tests/cli/latLngToCell.txt中定义的latLngToCell --lat 20 --lng 123 -r 2 -f newline应输出824b9ffffffffff等。覆盖率若安装了lcov且项目以CMAKE_BUILD_TYPEDebug与ENABLE_COVERAGEON构建即可生成代码覆盖率报告。例如从干净仓库开始mkdir build cd build cmake -DCMAKE_BUILD_TYPEDebug -DENABLE_COVERAGEON .. make make coverage然后在浏览器中打开coverage/index.html查看详细的 HTML 覆盖率报告。基准测试以 Release 构建并运行计时基准测试mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease .. make make benchmarks基准程序位于 src/apps/benchmarks/覆盖 gridDisk、gridPathCells、directedEdge、polygonToCells、cellArea 等核心路径如 benchmarkH3Api.c、benchmarkGridDiskCells.c。文档与 KML 可视化若 CMake 运行时已安装 Doxygen执行make docs可生成开发者文档索引位于dev-docs/_build/html/index.html。Doxygen 配置模板见 dev-docs/Doxyfile.in。构建完成后执行make kml可生成用于可视化六边形网格的 KML 文件产物放在KML/目录。从 CMakeLists.txt 可以看到默认只为分辨率 0~2 生成 cells/centers KML更高分辨率的文件体积会非常大。构建文档网站请参考 website/ 目录。使用 H3命令行使用以自由女神像坐标为例先获取某个位置的 H3 索引./bin/latLngToCell --resolution 10 --latitude 40.689167 --longitude -74.044444其中10是 H3 分辨率取值范围 0最粗到 15最细坐标是十进制度数的纬度和经度。输出形如8a2a1072b59ffff的 H3 索引。再对该索引做进一步查询例如取该六边形边界顶点./bin/cellToBoundary --index 8a2a1072b59ffff输出该位置的六边形顶点第一个 16 进制串是索引本身随后是各顶点经纬度8a2a1072b59ffff { 40.690058601 -74.044151762 40.689907695 -74.045061792 40.689270936 -74.045341418 40.688785091 -74.044711031 40.688935993 -74.043801021 40.689572744 -74.043521377 }获取六边形中心点坐标./bin/cellToLatLng --index 8a2a1072b59ffff输出形如40.6894218437 -74.0444313999CLI 工具实现要点这些命令不是一次性脚本而是设计成 stdin/stdout 过滤器的可组合工具见 src/apps/filters/latLngToCell.c 头注释与实现latLngToCell支持-r/--resolution必填0-15 含端点、--lat/--latitude、--lng/--longitude。若只给坐标不给经纬度则从 stdin 逐行读取lat lng十进制坐标对直到 EOF每行输出一个索引失败时输出H3_NULL。cellToBoundary支持--index单索引输入或从 stdin 逐行读取索引还支持--kml输出 KML、--kml-name与--kml-description自定义 KML 头部名称与描述默认分别为 H3 Geometry 与 Generated by cellToBoundary。cellToLatLng同样支持--index或 stdin 批量输入以及--kml/--kml-name/--kml-description默认描述 Generated by cellToLatLng。因此可以组合管道做批量处理例如./bin/cellToBoundary indexes.txt ./bin/cellToLatLng --kml --kml-name kml title --kml-description h3 cells indexes.txt cells.kml统一 h3 命令多子命令 CLI此外仓库还提供一个整合大部分 API 的h3命令源码见 src/apps/filters/h3.c采用子命令分发架构例如h3 latLngToCell --resolution 10 --latitude 40.689167 --longitude -74.044444 h3 cellToBoundary --cell 8a2a1072b59ffff h3 cellToLatLng --cell 8a2a1072b59ffff其子命令覆盖索引latLngToCell、cellToLatLng、cellToBoundary、constructCell、stringToInt、intToString、检查isValidCell、isPentagon、getResolution、getBaseCellNumber 等、遍历gridDisk、gridDiskDistances、gridRing、gridPathCells、gridDistance、层级cellToParent、cellToChildren等多数子命令支持-f/--format指定输出格式json默认、wkt适用于 cellToLatLng、cellToBoundary、newline等便于脚本与管道消费。从 C 语言使用上述功能同样可以从 C 直接调用。例如编译并运行 examples/index.ccc -lh3 examples/index.c -o example ./example该示例程序依次调用latLngToCell(location, resolution, indexed)把经纬度弧度制先用degsToRads转换转为 H3 索引cellToBoundary(indexed, boundary)取边界顶点注意通过boundary.numVerts遍历因为五边形等特殊情况顶点数可能不同cellToLatLng(indexed, center)取中心坐标输出前用radsToDegs转回度数。运行输出The index is: 8a2a1072b59ffff Boundary vertex #0: 40.690059, -74.044152 Boundary vertex #1: 40.689908, -74.045062 Boundary vertex #2: 40.689271, -74.045341 Boundary vertex #3: 40.688785, -74.044711 Boundary vertex #4: 40.688936, -74.043801 Boundary vertex #5: 40.689573, -74.043521 Center coordinates: 40.689422, -74.044431核心 API 结构与错误码公共头文件 src/h3lib/include/h3api.h.in 定义了H3Index64 位无符号整数是 H3 系统中对象cell、edge 等的统一标识符H3_NULL0用于表示 latLngToCell 等函数出错或数组中的缺失数据类似浮点中的 NaN。LatLng以弧度存储的经纬度结构CellBoundary含numVerts与按逆时针顺序排列的verts最多MAX_CELL_BNDRY_VERTS 10个顶点最坏情况是五边形5 个原始顶点 5 个跨边交点。H3Error错误码体系E_SUCCESS、E_LATLNG_DOMAIN、E_RES_DOMAIN、E_CELL_INVALID、E_PENTAGON、E_RES_MISMATCH、E_MEMORY_ALLOC、E_INDEX_INVALID等并配套describeH3Error将错误码转成可读字符串。因此编写应用时建议对每个 API 调用检查返回值与 CLI 工具内部if (e E_SUCCESS) ... else ...的处理保持一致。更多示例与测试验证仓库 examples/ 还提供 distance.c距离、neighbors.c邻居、compactCells.c紧凑化、edge.c有向边等示例均可在构建后以类似方式编译运行。核心算法实现集中在 src/h3lib/lib/如 h3Index.c、algos.c、polyfill.c、directedEdge.c、localij.c 等配套的单元测试在 src/apps/testapps/如 testH3Api.c、testGridDisk.c、testPolygonToCells.cCLI 回归测试数据在 tests/cli/随机/真实输入文件在 tests/inputfiles/含各分辨率 cell/center 对照文件可用于校验转换一致性。参与贡献与许可欢迎提交 Pull Request 与 GitHub Issue详见 贡献指南。合并代码前需要同意 Uber 贡献者许可协议CLA。H3 采用 Apache 2.0 许可证仓库还包含 DGGRIDCopyright (c) 2015 Southern Oregon University的相关内容。发布流程与版本更新脚本见 RELEASE.md、scripts/update_version.sh。赞分享GIS【免费下载链接】h3Hexagonal hierarchical geospatial indexing system项目地址https://gitcode.com/gh_mirrors/h3/h3点击查看免费下载相关推荐H3 六边形分层地理空间索引系统核心机制、索引结构与实战入门指南H3 六边形分层地理空间索引系统核心机制、索引结构与实战入门指南 H3 是一个把全球划分为六边形单元cell的开源地理空间索引系统由 H3 Core LGIS终极小说下载神器novel-downloader 一键保存100网站小说完整指南终极小说下载神器novel downloader 一键保存100网站小说完整指南 你是否曾遇到过这样的情况追了好几个月的小说突然从网站上消失了或者想要在网页爬虫【亲测免费】 开源亮点h3-py —— Uber的六边形分层地理空间索引系统开源亮点h3 py —— Uber的六边形分层地理空间索引系统 在数据驱动的世界中地理位置信息的高效处理和分析变得越来越重要。Uber通过其开源项目 h3上一篇5分钟搞定Windows和Office永久激活KMS智能激活终极指南下一篇5分钟快速上手免费下载B站大会员4K视频的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑