docs/h3-pg-skill/SKILL.md
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
npx skillsauth add postgis/h3-pg h3-pgInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Two extensions:
CREATE EXTENSION h3 — Core H3 bindings (indexing, traversal, hierarchy, inspection, <-> operator). No PostGIS dependency.CREATE EXTENSION h3_postgis — PostGIS integration (geometry/geography casts, @ operator, polygon fill, raster helpers). Requires postgis and optionally postgis_raster.These exist only in h3-pg, not other H3 language bindings.
Direct casts (h3_postgis):
h3index::geometry → cell centroid as POINT, SRID 4326h3index::geography → cell centroid as POINT, SRID 4326Operators:
a <-> b — grid distance in cells between two h3index values (h3)geom @ resolution — index geometry/geography at resolution (h3_postgis)Inspection and construction helpers (h3):
h3_get_index_digit(cell, resolution) — inspect the digit at a 1-based resolution steph3_construct_cell(resolution, base_cell_number, digits[]) — rebuild a cell from explicit componentsh3_is_valid_index(index) — validate any H3 index mode: cell, directed edge, or vertexDirected edge convenience (h3):
h3_reverse_directed_edge(edge) — returns the same directed edge with origin and destination reversedOperator classes for h3index: BTREE, HASH, BRIN, SP-GIST (h3)
Boundary helpers (h3_postgis):
h3_cell_to_boundary_geometry(h3index) → polygon with SRID 4326, splits at antimeridianh3_cell_to_boundary_geography(h3index) → geography polygon, splits at antimeridianPolygon fill (h3_postgis):
h3_polygon_to_cells(geometry, resolution) → SETOF h3indexh3_polygon_to_cells(geography, resolution) → SETOF h3indexRaster integration (h3_postgis, requires postgis_raster):
h3_raster_summary(raster, resolution, [band]) — per-cell stats (count, sum, mean, stddev, min, max)h3_raster_summary_clip(...) — clips raster by cell boundariesh3_raster_summary_centroids(...) — uses cell centroids, avoids pentagon edge casesh3_raster_summary_subpixel(...) — for cells smaller than pixelsh3_raster_class_summary*(...) — discrete class counts per cellTile helper (h3_postgis):
h3_get_resolution_from_tile_zoom(z, [max_h3_resolution=15], [min_h3_resolution], [hex_edge_pixels=44], [tile_size=512]) — returns optimal H3 resolution for XYZ tile zoom level z, targeting hexagons approximately hex_edge_pixels wide on screen| Pattern | DO NOT | DO |
|---------|--------|----|
| Get centroid | ST_Centroid(h3_cell_to_boundary_geometry(h3)) | h3::geometry |
| Get boundary with SRID | h3_cell_to_boundary(h3)::geometry | h3_cell_to_boundary_geometry(h3) |
| Distance check (meters) | ST_Distance(a.h3::geography, b.h3::geography) <= N | ST_DWithin(a.h3::geography, b.h3::geography, N) |
| Grid distance (cells) | h3_distance(a, b) | a <-> b |
Antimeridian gotcha: Cells crossing 180° are split into valid polygons. ST_Centroid of a split polygon may fall outside the cell — use h3::geometry for centroids instead.
Ring traversal gotcha: Prefer h3_grid_ring(origin, k) for rings because it handles pentagon distortion internally. Use h3_grid_ring_unsafe(origin, k) only when fail-fast behavior or ring-walk ordering matters.
| v3 Name (DO NOT USE) | v4 Replacement |
|---------------------|----------------|
| h3_geo_to_h3 | h3_latlng_to_cell |
| h3_to_geo | h3_cell_to_latlng |
| h3_to_geo_boundary | h3_cell_to_boundary |
| h3_k_ring | h3_grid_disk |
| h3_k_ring_distances | h3_grid_disk_distances |
| h3_hex_ring | h3_grid_ring_unsafe |
| h3_line | h3_grid_path_cells |
| h3_distance | h3_grid_distance |
| h3_to_parent | h3_cell_to_parent |
| h3_to_children | h3_cell_to_children |
| h3_compact | h3_compact_cells |
| h3_uncompact | h3_uncompact_cells |
| h3_polyfill | h3_polygon_to_cells |
| h3_indexes_are_neighbors | h3_are_neighbor_cells |
| h3_hex_area | h3_get_hexagon_area_avg |
| h3_hex_area_km2 / h3_hex_area_m2 | h3_get_hexagon_area_avg(res, unit) |
| h3_edge_length_km / h3_edge_length_m | h3_get_hexagon_edge_length_avg(res, unit) |
Unit parameters (v4): Area and length functions now take a unit text parameter:
h3_get_hexagon_area_avg(resolution, [unit = 'km^2']) — use 'km^2' or 'm^2'h3_get_hexagon_edge_length_avg(resolution, [unit = 'km']) — use 'km' or 'm'h3_cell_area(cell, [unit = 'km^2']) — exact area for specific cellh3_edge_length(edge, [unit = 'km']) — exact length for specific edgeSpelling change (v4.2.3+): Prefer h3_latlng_to_cell over h3_lat_lng_to_cell (underscore version deprecated). Same for h3_cell_to_latlng, h3_vertex_to_latlng.
development
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.