# Functions for Working with H3 Indexes

H3 is a geographical indexing system where Earth’s surface divided into a grid of even hexagonal cells. This system is hierarchical, i. e. each hexagon on the top level ("parent") can be splitted into seven even but smaller ones ("children"), and so on.

The level of the hierarchy is called `resolution` and can receive a value from `0` till `15`, where `0` is the `base` level with the largest and coarsest cells.

A latitude and longitude pair can be transformed to a 64-bit H3 index, identifying a grid cell.

The H3 index is used primarily for bucketing locations and other geospatial manipulations.

The full description of the H3 system is available at the Uber Engeneering site.

## h3IsValid

Verifies whether the number is a valid H3 index.

Syntax

``````h3IsValid(h3index)
``````

Parameter

• `h3index` — Hexagon index number. Type: UInt64.

Returned values

• 1 — The number is a valid H3 index.
• 0 — The number is not a valid H3 index.

Type: UInt8.

Example

Query:

``````SELECT h3IsValid(630814730351855103) as h3IsValid;
``````

Result:

``````┌─h3IsValid─┐
│         1 │
└───────────┘
``````

## h3GetResolution

Defines the resolution of the given H3 index.

Syntax

``````h3GetResolution(h3index)
``````

Parameter

• `h3index` — Hexagon index number. Type: UInt64.

Returned values

• Index resolution. Range: `[0, 15]`.
• If the index is not valid, the function returns a random value. Use h3IsValid to verify the index.

Type: UInt8.

Example

Query:

``````SELECT h3GetResolution(639821929606596015) as resolution;
``````

Result:

``````┌─resolution─┐
│         14 │
└────────────┘
``````

## h3EdgeAngle

Calculates the average length of the H3 hexagon edge in grades.

Syntax

``````h3EdgeAngle(resolution)
``````

Parameter

• `resolution` — Index resolution. Type: UInt8. Range: `[0, 15]`.

Returned values

• The average length of the H3 hexagon edge in grades. Type: Float64.

Example

Query:

``````SELECT h3EdgeAngle(10) as edgeAngle;
``````

Result:

``````┌───────h3EdgeAngle(10)─┐
│ 0.0005927224846720883 │
└───────────────────────┘
``````

## h3EdgeLengthM

Calculates the average length of the H3 hexagon edge in meters.

Syntax

``````h3EdgeLengthM(resolution)
``````

Parameter

• `resolution` — Index resolution. Type: UInt8. Range: `[0, 15]`.

Returned values

• The average length of the H3 hexagon edge in meters. Type: Float64.

Example

Query:

``````SELECT h3EdgeLengthM(15) as edgeLengthM;
``````

Result:

``````┌─edgeLengthM─┐
│ 0.509713273 │
└─────────────┘
``````

## geoToH3

Returns H3 point index `(lon, lat)` with specified resolution.

Syntax

``````geoToH3(lon, lat, resolution)
``````

Arguments

• `lon` — Longitude. Type: Float64.
• `lat` — Latitude. Type: Float64.
• `resolution` — Index resolution. Range: `[0, 15]`. Type: UInt8.

Returned values

• Hexagon index number.
• 0 in case of error.

Type: UInt64.

Example

Query:

``````SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index;
``````

Result:

``````┌────────────h3Index─┐
│ 644325524701193974 │
└────────────────────┘
``````

## h3ToGeo

Returns `(lon, lat)` that corresponds to the provided H3 index.

Syntax

``````h3ToGeo(h3Index)
``````

Arguments

• `h3Index` — H3 Index. Type: UInt64.

Returned values

• `lon` — Longitude. Type: Float64.
• `lat` — Latitude. Type: Float64.

Example

Query:

``````SELECT h3ToGeo(644325524701193974) coordinates;
``````

Result:

``````┌─coordinates───────────────────────────┐
│ (37.79506616830252,55.71290243145668) │
└───────────────────────────────────────┘
``````

## h3kRing

Lists all the H3 hexagons in the raduis of `k` from the given hexagon in random order.

Syntax

``````h3kRing(h3index, k)
``````

Arguments

• `h3index` — Hexagon index number. Type: UInt64.
• `k` — Raduis. Type: integer

Returned values

• Array of H3 indexes.

Type: Array(UInt64).

Example

Query:

``````SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index;
``````

Result:

``````┌────────────h3index─┐
│ 644325529233966508 │
│ 644325529233966497 │
│ 644325529233966510 │
│ 644325529233966504 │
│ 644325529233966509 │
│ 644325529233966355 │
│ 644325529233966354 │
└────────────────────┘
``````

## h3GetBaseCell

Returns the base cell number of the H3 index.

Syntax

``````h3GetBaseCell(index)
``````

Parameter

• `index` — Hexagon index number. Type: UInt64.

Returned value

• Hexagon base cell number.

Type: UInt8.

Example

Query:

``````SELECT h3GetBaseCell(612916788725809151) as basecell;
``````

Result:

``````┌─basecell─┐
│       12 │
└──────────┘
``````

## h3HexAreaM2

Returns average hexagon area in square meters at the given resolution.

Syntax

``````h3HexAreaM2(resolution)
``````

Parameter

• `resolution` — Index resolution. Range: `[0, 15]`. Type: UInt8.

Returned value

• Area in square meters.

Type: Float64.

Example

Query:

``````SELECT h3HexAreaM2(13) as area;
``````

Result:

``````┌─area─┐
│ 43.9 │
└──────┘
``````

## h3IndexesAreNeighbors

Returns whether or not the provided H3 indexes are neighbors.

Syntax

``````h3IndexesAreNeighbors(index1, index2)
``````

Arguments

• `index1` — Hexagon index number. Type: UInt64.
• `index2` — Hexagon index number. Type: UInt64.

Returned value

• `1` — Indexes are neighbours.
• `0` — Indexes are not neighbours.

Type: UInt8.

Example

Query:

``````SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n;
``````

Result:

``````┌─n─┐
│ 1 │
└───┘
``````

## h3ToChildren

Returns an array of child indexes for the given H3 index.

Syntax

``````h3ToChildren(index, resolution)
``````

Arguments

• `index` — Hexagon index number. Type: UInt64.
• `resolution` — Index resolution. Range: `[0, 15]`. Type: UInt8.

Returned values

• Array of the child H3-indexes.

Type: Array(UInt64).

Example

Query:

``````SELECT h3ToChildren(599405990164561919, 6) AS children;
``````

Result:

``````┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
``````

## h3ToParent

Returns the parent (coarser) index containing the given H3 index.

Syntax

``````h3ToParent(index, resolution)
``````

Arguments

• `index` — Hexagon index number. Type: UInt64.
• `resolution` — Index resolution. Range: `[0, 15]`. Type: UInt8.

Returned value

• Parent H3 index.

Type: UInt64.

Example

Query:

``````SELECT h3ToParent(599405990164561919, 3) as parent;
``````

Result:

``````┌─────────────parent─┐
│ 590398848891879423 │
└────────────────────┘
``````

## h3ToString

Converts the `H3Index` representation of the index to the string representation.

``````h3ToString(index)
``````

Parameter

• `index` — Hexagon index number. Type: UInt64.

Returned value

• String representation of the H3 index.

Type: String.

Example

Query:

``````SELECT h3ToString(617420388352917503) as h3_string;
``````

Result:

``````┌─h3_string───────┐
│ 89184926cdbffff │
└─────────────────┘
``````

## stringToH3

Converts the string representation to the `H3Index` (UInt64) representation.

Syntax

``````stringToH3(index_str)
``````

Parameter

• `index_str` — String representation of the H3 index. Type: String.

Returned value

• Hexagon index number. Returns 0 on error. Type: UInt64.

Example

Query:

``````SELECT stringToH3('89184926cc3ffff') as index;
``````

Result:

``````┌──────────────index─┐
│ 617420388351344639 │
└────────────────────┘
``````

## h3GetResolution

Returns the resolution of the H3 index.

Syntax

``````h3GetResolution(index)
``````

Parameter

• `index` — Hexagon index number. Type: UInt64.

Returned value

• Index resolution. Range: `[0, 15]`. Type: UInt8.

Example

Query:

``````SELECT h3GetResolution(617420388352917503) as res;
``````

Result:

``````┌─res─┐
│   9 │
└─────┘
``````