// the find
uber/h3-py
Python bindings for H3, a hierarchical hexagonal geospatial indexing system
Python bindings for H3, Uber's C library that maps the world to a hierarchy of hexagonal cells at 16 resolutions. You get a cell index for any lat/lng, then work with those indexes for proximity queries, aggregation, and spatial joins — without a geometry engine. The target user is anyone doing geospatial data analysis who wants fast discrete indexing without PostGIS.
The Cython layer means you're calling the C library directly — no subprocess overhead, no FFI round-trips through ctypes. Multiple API variants (basic_str, basic_int, numpy_int, memview_int) let you stay in the right dtype for your pipeline without conversion tax. 100% test coverage is enforced in CI, not just claimed. Versioning convention that locks major.minor to the C library is a thoughtful decision — you know exactly what H3 features you're getting.
Building from source requires CMake and a C toolchain; the wheels cover common platforms but if you're on something exotic you're in for a yak-shave. The library is stateless and index-oriented, so anything involving actual geometry (reprojection, intersection with arbitrary polygons) still needs Shapely or GeoPandas — h3-py doesn't replace those. The multiple API flavors are useful but the docs don't make the performance tradeoffs between them concrete, so users guess. No async support, which matters when you're doing cell lookups inside a FastAPI or async data pipeline.