Skip to main content

H3 bindings for Polars

Project description

This is a Polars extension that adds support for the H3 discrete global grid system, so you can index points and geometries to hexagons directly in Polars. All credits goes to the h3o for doing the heavy lifting.

Highlights

  • ๐Ÿš€ Blazing Fast: Built entirely in Rust, offering vectorized, multi-core H3 operations within Polars. Ideal for high-performance data processing.

  • ๐ŸŒ H3 Feature Parity: Comprehensive support for H3 functions, covering almost everything the standard H3 library provides, excluding geometric functions.

  • ๐Ÿ“‹ Fully Tested & Used in Production: Thoroughly tested against the standard H3 library.

  • ๐Ÿ” Data Type Agnostic: Supports string and integer H3 indexes natively, eliminating format conversion hassles.

Get started

You can get started by installing it with pip (or uv):

pip install polars-h3

You can use the extension as a drop-in replacement for the standard H3 functions.

import polars_h3 as plh3
import polars as pl

df = (
    pl.DataFrame(
        {
            "lat": [37.7749],
            "long": [-122.4194],
        }
    )
    .with_columns(
        plh3.latlng_to_cell(
            "lat",
            "long",
            resolution=7,
            return_dtype=pl.Utf8,
        ).alias("h3_cell")
    )
)

print(df)
shape: (1, 3)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ lat     โ”† long      โ”† h3_cell         โ”‚
โ”‚ ---     โ”† ---       โ”† ---             โ”‚
โ”‚ f64     โ”† f64       โ”† str             โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 37.7749 โ”† -122.4194 โ”† 872830828ffffff โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Check out the quickstart notebook for more examples.

๐ŸŒŸ You can also find the advanced notebooks here.

Implemented functions

This extension implements most of the H3 API. The full list of functions is below - you can find full docs here.

โš ๏ธ Performance Note: When possible, prefer using pl.UInt64 for H3 indices instead of the pl.Utf8 representation. String representations require casting operations which impact performance. Working directly with the native 64-bit integer format provides better computational efficiency.

We are unable to support the functions that work with geometries.

Full list of functions

โœ… = Supported ๐Ÿšง = Pending ๐Ÿ›‘ = Not supported

Function Description Supported
latlng_to_cell Convert latitude/longitude coordinate to cell ID โœ…
cell_to_lat Convert cell ID to latitude โœ…
cell_to_lng Convert cell ID to longitude โœ…
cell_to_latlng Convert cell ID to latitude/longitude โœ…
get_resolution Get resolution number of cell ID โœ…
str_to_int Convert pl.Utf8 cell ID to pl.UInt64 โœ…
int_to_str Convert pl.UInt64 or pl.Int64 cell ID to pl.Utf8 โœ…
is_valid_cell True if this is a valid cell ID โœ…
is_res_class_iii True if the cell's resolution is class III โœ…
is_pentagon True if the cell is a pentagon โœ…
get_icosahedron_faces List of icosahedron face IDs the cell is on โœ…
cell_to_parent Get coarser cell for a cell โœ…
cell_to_children Get finer cells for a cell โœ…
cell_to_center_child Provides the center child (finer) cell contained by cell at resolution childRes. โœ…
cell_to_child_pos Position of the child cell within the ordered list of all children of its parent at the specified resolution โœ…
child_pos_to_cell Child cell at a given position within the ordered list of children for a specified parent/resolution โœ…
compact_cells Compacts a collection of H3 cells (all same resolution) by replacing child cells with their parent if all children exist โœ…
uncompact_cells Uncompacts a set of H3 cells to the resolution res โœ…
grid_ring Produces the "hollow ring" of cells which are exactly grid distance k from the origin cell โœ…
grid_disk Produces the "filled-in disk" of cells at most grid distance k from the origin cell โœ…
grid_path_cells Find a grid path to connect two cells โœ…
grid_distance Find the grid distance between two cells โœ…
cell_to_local_ij Convert a cell ID to a local I,J coordinate space โœ…
local_ij_to_cell Convert a local I,J coordinate to a cell ID โœ…
cell_to_boundary Convert cell ID to its boundary lat/lng coordinates โœ…
cell_to_vertex Get the vertex ID for a cell ID and vertex number โœ…
cell_to_vertexes Get all vertex IDs for a cell ID (5 for pentagon, 6 for hex) โœ…
vertex_to_latlng Convert a vertex ID to latitude/longitude coordinates โœ…
is_valid_vertex True if passed a valid vertex ID โœ…
is_valid_directed_edge True if passed a valid directed edge ID โœ…
origin_to_directed_edges Get all directed edge IDs for a cell ID โœ…
directed_edge_to_cells Convert a directed edge ID to origin/destination cell IDs โœ…
get_directed_edge_origin Convert a directed edge ID to origin cell ID โœ…
get_directed_edge_destination Convert a directed edge ID to destination cell ID โœ…
cells_to_directed_edge Convert an origin/destination pair to directed edge ID โœ…
are_neighbor_cells True if the two cell IDs share an edge โœ…
average_hexagon_area Get average area of a hexagon cell at resolution โœ…
cell_area Get the area of a cell ID โœ…
average_hexagon_edge_length Average hexagon edge length at resolution โœ…
edge_length Get the length of a directed edge ID โœ…
get_num_cells Get the number of cells at a resolution โœ…
get_pentagons Get all pentagons at a resolution โœ…
great_circle_distance Compute the great circle distance between two points (haversine) โœ…
cells_to_multi_polygon_wkt Convert a set of cells to multipolygon WKT ๐Ÿ›‘
polygon_wkt_to_cells Convert polygon WKT to a set of cells ๐Ÿ›‘
directed_edge_to_boundary_wkt Convert directed edge ID to linestring WKT ๐Ÿ›‘

Plotting

The library also comes with helper functions to plot hexes on a Folium map.

import polars_h3 as plh3
import polars as pl

hex_map = plh3.graphing.plot_hex_outlines(df, "h3_cell")
display(hex_map)

# or if you have a metric to plot

hex_map = plh3.graphing.plot_hex_fills(df, "h3_cell", "metric_col")
display(hex_map)

CleanShot 2024-12-08 at 00 26 22

Development

It's recommended to use uv to manage the extension's python dependencies. If you modify rust code, you will need to run uv run maturin develop --uv to see changes.

You can run test suite with uv run pytest. You can also run the docs locally with uv run mkdocs serve.

Benchmarking

If you're looking to benchmark the performance of the extension, build the release version with maturin develop --release --uv and then run uv run -m benchmarks.engine (assuming you have the benchmark dependencies installed). Benchmarking with the development version will lead to misleading results.

# 1 โ€“ (build) compile the optimized Rust extension
uv run maturin develop --release --uv

# 2 โ€“ (run) execute the benchmark CLI
uv run h3-bench \
  --libraries plh3 duckdb h3_py \   # which back-ends to test (or โ€œallโ€)
  --functions latlng_to_cell cell_to_parent \  # which functions to time (or โ€œallโ€)
  --iterations 3 \                  # repetitions per test
  --fast-factor 4 \                 # divide default row-counts to speed things up
  --output results.json             # optional: dump raw results

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

polars_h3-0.6.1.tar.gz (462.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

polars_h3-0.6.1-cp38-abi3-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.8+Windows x86-64

polars_h3-0.6.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

polars_h3-0.6.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

polars_h3-0.6.1-cp38-abi3-manylinux_2_12_i686.manylinux2010_i686.whl (4.8 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.12+ i686

polars_h3-0.6.1-cp38-abi3-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

polars_h3-0.6.1-cp38-abi3-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file polars_h3-0.6.1.tar.gz.

File metadata

  • Download URL: polars_h3-0.6.1.tar.gz
  • Upload date:
  • Size: 462.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for polars_h3-0.6.1.tar.gz
Algorithm Hash digest
SHA256 40fabd8b3000123a6205b96cd762db6c0c9ae3ea7a9a4d6bcc906712a7982c51
MD5 2a1e0e638641360b2f3b97997b1f53a0
BLAKE2b-256 09fd202a91409696b926c029fd7cb8b360a24dc334b9590ccf3c1ed8365a60d2

See more details on using hashes here.

File details

Details for the file polars_h3-0.6.1-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: polars_h3-0.6.1-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 4.4 MB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for polars_h3-0.6.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 0dba767a4249888e3e8518e64f741e20e41c872906518877e13a8b6688b758c5
MD5 7b53c2a309e41b04f355971b51b00459
BLAKE2b-256 f8dd4670c35219b8c0a22100ee2d1380208691b71f26ad58cab3e24a3660ef60

See more details on using hashes here.

File details

Details for the file polars_h3-0.6.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polars_h3-0.6.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f6861cc9dad6b3bdd44a704770cf29aea88b1f7061d6b328e04471df53009db7
MD5 f8a384b0f124219eb113b01c926a09ff
BLAKE2b-256 dd9329effdb306cbbdc5a51f35bf31e2cddb66802b9cf5fa22b5b74c76c6293e

See more details on using hashes here.

File details

Details for the file polars_h3-0.6.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for polars_h3-0.6.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f6127576be2a6cff1544ebdb896668111f869c89ad19bb37f31d5f4b043654be
MD5 2d648c6a34f42070a24ca5fb48db2857
BLAKE2b-256 79267b5ca02c6cc698fb5715b52a13aa934d06a0ad7bf7d401b318991545669b

See more details on using hashes here.

File details

Details for the file polars_h3-0.6.1-cp38-abi3-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for polars_h3-0.6.1-cp38-abi3-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 8dd82314cf1370f5b72ec172f7e7cdfe867e574c0afe13121df95e938ec8e1df
MD5 4958e54a1434759baf346afe5146edcc
BLAKE2b-256 0e0bc42fa56fc3b68e7bcccb4cdec3e2442f89c52f8fb176439b24487dd6db0c

See more details on using hashes here.

File details

Details for the file polars_h3-0.6.1-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for polars_h3-0.6.1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf934567e6a348c4f695989b0ec437e3a94c977e2f7f517a71b8f685a0b84ce3
MD5 3ace438c2856f66ffc65a58a1f86ad01
BLAKE2b-256 c086a593519284d863ad2c20dc073194bdf186e8b4278c0a5867a9195fd04c70

See more details on using hashes here.

File details

Details for the file polars_h3-0.6.1-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for polars_h3-0.6.1-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 aed1f8582b38fe260d32889edea26b51bce1d45eb502b40f8e58dc395b9b053d
MD5 cd3523d987ba120df31f157f073f6b0f
BLAKE2b-256 c9c844fae0f0b42b085aa1cd161fea450116a8e3ae35d9307556cd3e6dd72ce2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page