H3 インデックス
H3 は、地球の表面を同じ大きさの六角形セルのグリッドに分割する地理空間インデックスシステムです。このシステムは階層構造になっており、最上位レベルの各六角形(「親」)は、同じ形状でより小さい 7 個の六角形(「子」)に分割され、その先も同様に続きます。
この階層のレベルは resolution と呼ばれ、0 から 15 までの値を取ります。0 は最も大きく粗いセルを持つ base レベルです。
緯度と経度のペアは、グリッドセルを識別する 64 ビットの H3 インデックスに変換できます。
H3 インデックスは主に、位置情報のバケット分けやその他の地理空間処理に使用されます。
H3 システムの詳細な説明は Uber Engineering サイト にあります。
h3IsValid
数値が有効な H3 インデックスかどうかを検証します。
構文
パラメーター
戻り値
- 1 — 数値が有効な H3 インデックスである。UInt8。
- 0 — 数値が有効な H3 インデックスではない。UInt8。
例
クエリ:
SELECT h3IsValid(630814730351855103) AS h3IsValid;
結果:
┌─h3IsValid─┐
│ 1 │
└───────────┘
h3GetResolution
指定された H3 インデックスの解像度を返します。
構文
パラメーター
h3index — 六角形のインデックス番号。UInt64。
返される値
例
クエリ:
SELECT h3GetResolution(639821929606596015) AS resolution;
結果:
┌─resolution─┐
│ 14 │
└────────────┘
h3EdgeAngle
H3 六角形の辺の平均角度をグラード単位で計算します。
構文
パラメーター
resolution — インデックスの解像度。UInt8。範囲: [0, 15]。
戻り値
例
クエリ:
SELECT h3EdgeAngle(10) AS edgeAngle;
結果:
┌───────h3EdgeAngle(10)─┐
│ 0.0005927224846720883 │
└───────────────────────┘
h3EdgeLengthM
H3 六角形の辺の平均長をメートル単位で計算します。
構文
h3EdgeLengthM(resolution)
パラメータ
resolution — インデックスの解像度。UInt8。範囲: [0, 15]。
戻り値
例
クエリ:
SELECT h3EdgeLengthM(15) AS edgeLengthM;
結果:
┌─edgeLengthM─┐
│ 0.509713273 │
└─────────────┘
h3EdgeLengthKm
H3 六角形セルの一辺の平均の長さをキロメートル単位で計算します。
構文
h3EdgeLengthKm(resolution)
パラメータ
resolution — インデックスの解像度。UInt8。範囲:[0, 15]。
返される値
例
クエリ:
SELECT h3EdgeLengthKm(15) AS edgeLengthKm;
結果:
┌─edgeLengthKm─┐
│ 0.000509713 │
└──────────────┘
geoToH3
指定した解像度で、(lat, lon) を表す H3 インデックスを返します。
構文
geoToH3(lat, lon, resolution)
引数
戻り値
注:ClickHouse v25.4 以前では、geoToH3() は (lon, lat) の順で値を受け取ります。ClickHouse v25.5 以降では、入力値は (lat, lon) の順になります。以前の動作は、設定 geotoh3_argument_order = 'lon_lat' を用いることで復元できます。
例
クエリ:
SELECT geoToH3(55.71290588, 37.79506683, 15) AS h3Index;
結果:
┌────────────h3Index─┐
│ 644325524701193974 │
└────────────────────┘
h3ToGeo
指定された H3 インデックスに対応する中心点の緯度と経度を返します。
構文
引数
戻り値
注意: ClickHouse v24.12 以前では、h3ToGeo() は (lon, lat) の順序で値を返します。ClickHouse v25.1 以降では、戻り値は (lat, lon) の順序になります。以前の動作は、設定 h3togeo_lon_lat_result_order = true を使用することで再現できます。
例
クエリ:
SELECT h3ToGeo(644325524701193974) AS coordinates;
結果:
┌─coordinates───────────────────────────┐
│ (55.71290243145668,37.79506616830252) │
└───────────────────────────────────────┘
h3ToGeoBoundary
指定された H3 インデックスの境界を表す (lat, lon) のペアからなる配列を返します。
構文
引数
戻り値
例
クエリ:
SELECT h3ToGeoBoundary(644325524701193974) AS coordinates;
結果:
┌─h3ToGeoBoundary(599686042433355775)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [(37.2713558667319,-121.91508032705622),(37.353926450852256,-121.8622232890249),(37.42834118609435,-121.92354999630156),(37.42012867767779,-122.03773496427027),(37.33755608435299,-122.090428929044),(37.26319797461824,-122.02910130919001)] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
h3kRing
指定された六角形から半径 k の範囲内にあるすべての H3 六角形を、ランダムな順序で列挙します。
構文
引数
戻り値
例
クエリ:
SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index;
結果:
┌────────────h3index─┐
│ 644325529233966508 │
│ 644325529233966497 │
│ 644325529233966510 │
│ 644325529233966504 │
│ 644325529233966509 │
│ 644325529233966355 │
│ 644325529233966354 │
└────────────────────┘
h3PolygonToCells
指定した解像度で、指定されたジオメトリ(リングまたは(マルチ)ポリゴン)の内部に含まれる六角形セルを返します。
構文
h3PolygonToCells(geometry, resolution)
引数
geometry — 次のいずれかの Geo データ型 またはそれらの下位プリミティブ型:
resolution — インデックス解像度。範囲: [0, 15]。UInt8。
返り値
例
クエリ:
SELECT h3PolygonToCells([(-122.4089866999972145,37.813318999983238),(-122.3544736999993603,37.7198061999978478),(-122.4798767000009008,37.8151571999998453)], 7) AS h3index;
結果:
┌────────────h3index─┐
│ 608692970769612799 │
│ 608692971927240703 │
│ 608692970585063423 │
│ 608692970819944447 │
│ 608692970719281151 │
│ 608692970752835583 │
│ 608692972027903999 │
└────────────────────┘
h3GetBaseCell
H3 インデックスのベースセル番号を返します。
構文
パラメーター
戻り値
例
クエリ:
SELECT h3GetBaseCell(612916788725809151) AS basecell;
結果:
┌─basecell─┐
│ 12 │
└──────────┘
h3HexAreaM2
指定した解像度における六角形の平均面積(平方メートル単位)を返します。
構文
パラメータ
resolution — インデックスの解像度。範囲: [0, 15]。UInt8。
戻り値
例
クエリ:
SELECT h3HexAreaM2(13) AS area;
結果:
┌─エリア─┐
│ 43.9 │
└──────┘
h3HexAreaKm2
指定した解像度における六角形の平均面積を平方キロメートル単位で返します。
構文
パラメーター
resolution — インデックスの解像度。範囲: [0, 15]。UInt8。
戻り値
例
クエリ:
SELECT h3HexAreaKm2(13) AS area;
結果:
┌──────area─┐
│ 0.0000439 │
└───────────┘
h3IndexesAreNeighbors
指定された H3 インデックス同士が隣接しているかどうかを返します。
構文
h3IndexesAreNeighbors(index1, index2)
引数
戻り値
1 — インデックスが隣接している。UInt8。
0 — インデックスが隣接していない。UInt8。
例
クエリ:
SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n;
結果:
h3ToChildren
指定された H3 インデックスに対応する子インデックスの配列を返します。
構文
h3ToChildren(index, resolution)
引数
index — 六角形インデックス番号。UInt64。
resolution — インデックスの解像度。範囲: [0, 15]。UInt8。
戻り値
例
クエリ:
SELECT h3ToChildren(599405990164561919, 6) AS children;
結果:
┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
h3ToParent
指定された H3 インデックスを含む親(より粗い解像度の)インデックスを返します。
構文
h3ToParent(index, resolution)
引数
index — 六角形インデックス番号。UInt64。
resolution — インデックス解像度。範囲: [0, 15]。UInt8。
返される値
例
クエリ:
SELECT h3ToParent(599405990164561919, 3) AS parent;
結果:
┌─────────────parent─┐
│ 590398848891879423 │
└────────────────────┘
h3ToString
インデックスを表す H3Index を文字列表現に変換します。
パラメータ
戻り値
例
クエリ:
SELECT h3ToString(617420388352917503) AS h3_string;
結果:
┌─h3_string───────┐
│ 89184926cdbffff │
└─────────────────┘
stringToH3
文字列表現を H3Index (UInt64) 表現に変換します。
構文
パラメータ
index_str — H3 インデックスの文字列表現。String。
戻り値
- 六角形インデックス番号。エラー時には 0 を返します。UInt64。
例
クエリ:
SELECT stringToH3('89184926cc3ffff') AS index;
結果:
┌──────────────index─┐
│ 617420388351344639 │
└────────────────────┘
h3GetResolution
H3 インデックスの解像度を返します。
構文
パラメーター
返される値
- インデックスの解像度。範囲:
[0, 15]。UInt8。
例
クエリ:
SELECT h3GetResolution(617420388352917503) AS res;
結果:
h3IsResClassIII
H3 インデックスの解像度が Class III の向きにあるかどうかを返します。
構文
パラメーター
戻り値
1 — インデックスの解像度は Class III 向きです。UInt8。
0 — インデックスの解像度は Class III 向きではありません。UInt8。
例
クエリ:
SELECT h3IsResClassIII(617420388352917503) AS res;
結果:
h3IsPentagon
この H3 インデックスが五角形のセルを表しているかどうかを返します。
構文
パラメータ
戻り値
1 — インデックスが五角形セルを表す。UInt8
0 — インデックスが五角形セルを表さない。UInt8
例
クエリ:
SELECT h3IsPentagon(644721767722457330) AS pentagon;
結果:
┌─五角形─┐
│ 0 │
└──────────┘
h3GetFaces
指定された H3 インデックスと交差する正二十面体の面を返します。
構文
パラメーター
戻り値
例
クエリ:
SELECT h3GetFaces(599686042433355775) AS faces;
結果:
┌─faces─┐
│ [7] │
└───────┘
h3CellAreaM2
指定された H3 インデックスに対応するセルの正確な面積を、平方メートル単位で返します。
構文
パラメータ
戻り値
例
クエリ:
SELECT h3CellAreaM2(579205133326352383) AS area;
結果:
┌───────────────area─┐
│ 4106166334463.9233 │
└────────────────────┘
h3CellAreaRads2
指定された入力 H3 インデックスに対応する特定のセルの正確な面積を、平方ラジアンで返します。
構文
パラメーター
戻り値
例
クエリ:
SELECT h3CellAreaRads2(579205133326352383) AS area;
結果:
┌────────────────area─┐
│ 0.10116268528089567 │
└─────────────────────┘
h3ToCenterChild
指定した解像度で、指定した H3 インデックスに含まれる中心の(より細かい) H3 インデックスを返します。
構文
h3ToCenterChild(index, resolution)
パラメータ
index — 六角形インデックス番号。UInt64。
resolution — インデックスの解像度。範囲:[0, 15]。UInt8。
返される値
- 指定された解像度において、与えられた H3 インデックスに含まれる中心の子の H3 インデックス。UInt64。
例
クエリ:
SELECT h3ToCenterChild(577023702256844799,1) AS centerToChild;
結果:
┌──────centerToChild─┐
│ 581496515558637567 │
└────────────────────┘
h3ExactEdgeLengthM
入力された h3 インデックスで表される単方向エッジの正確な長さをメートル単位で返します。
構文
h3ExactEdgeLengthM(index)
パラメータ
戻り値
例
クエリ:
SELECT h3ExactEdgeLengthM(1310277011704381439) AS exactEdgeLengthM;;
結果:
┌───exactEdgeLengthM─┐
│ 195449.63163407316 │
└────────────────────┘
h3ExactEdgeLengthKm
入力された h3 インデックスに対応する一方向エッジの厳密な辺長を、キロメートル単位で返します。
構文
h3ExactEdgeLengthKm(index)
パラメーター
戻り値
例
クエリ:
SELECT h3ExactEdgeLengthKm(1310277011704381439) AS exactEdgeLengthKm;;
結果:
┌──exactEdgeLengthKm─┐
│ 195.44963163407317 │
└────────────────────┘
h3ExactEdgeLengthRads
指定された h3 インデックスで表される単方向エッジの正確なエッジ長をラジアン単位で返します。
構文
h3ExactEdgeLengthRads(index)
パラメーター
戻り値
例
クエリ:
SELECT h3ExactEdgeLengthRads(1310277011704381439) AS exactEdgeLengthRads;;
結果:
┌──exactEdgeLengthRads─┐
│ 0.030677980118976447 │
└──────────────────────┘
h3NumHexagons
指定した解像度における一意な H3 インデックスの数を返します。
構文
h3NumHexagons(resolution)
パラメーター
resolution — インデックスの解像度。範囲: [0, 15]。 UInt8。
戻り値
例
クエリ:
SELECT h3NumHexagons(3) AS numHexagons;
結果:
┌─numHexagons─┐
│ 41162 │
└─────────────┘
h3PointDistM
GeoCoord の点(緯度/経度)ペア間の「大円」または「haversine」距離をメートル単位で返します。
構文
h3PointDistM(lat1, lon1, lat2, lon2)
引数
lat1, lon1 — 地点1の緯度・経度(単位は度)。Float64。
lat2, lon2 — 地点2の緯度・経度(単位は度)。Float64。
戻り値
例
クエリ:
SELECT h3PointDistM(-10.0 ,0.0, 10.0, 0.0) AS h3PointDistM;
結果:
┌──────h3PointDistM─┐
│ 2223901.039504589 │
└───────────────────┘
h3PointDistKm
GeoCoord ポイント(緯度/経度)ペア間の「大円」または「ハバーサイン(haversine)」距離をキロメートル単位で返します。
構文
h3PointDistKm(lat1, lon1, lat2, lon2)
引数
lat1, lon1 — 点1 の緯度および経度(度単位)。Float64。
lat2, lon2 — 点2 の緯度および経度(度単位)。Float64。
戻り値
- Haversine または大円距離(キロメートル単位)。Float64。
例
クエリ:
SELECT h3PointDistKm(-10.0 ,0.0, 10.0, 0.0) AS h3PointDistKm;
結果:
┌─────h3PointDistKm─┐
│ 2223.901039504589 │
└───────────────────┘
h3PointDistRads
GeoCoord 座標(緯度/経度)のペア間の「大円距離」または「haversine 距離」をラジアン単位で返します。
構文
h3PointDistRads(lat1, lon1, lat2, lon2)
引数
lat1, lon1 — 点1 の緯度と経度(度単位)。Float64。
lat2, lon2 — 点2 の緯度と経度(度単位)。Float64。
返される値
例
クエリ:
SELECT h3PointDistRads(-10.0 ,0.0, 10.0, 0.0) AS h3PointDistRads;
結果:
┌────h3PointDistRads─┐
│ 0.3490658503988659 │
└────────────────────┘
h3GetRes0Indexes
解像度0のすべての H3 インデックスを要素とする配列を返します。
構文
返される値
例
クエリ:
SELECT h3GetRes0Indexes AS indexes ;
結果:
┌─indexes─────────────────────────────────────┐
│ [576495936675512319,576531121047601151,....]│
└─────────────────────────────────────────────┘
h3GetPentagonIndexes
指定した解像度におけるすべての五角形の H3 インデックスを返します。
構文
h3GetPentagonIndexes(resolution)
パラメーター
resolution — インデックス解像度。範囲: [0, 15]。UInt8。
戻り値
例
クエリ:
SELECT h3GetPentagonIndexes(3) AS indexes;
結果:
┌─indexes────────────────────────────────────────────────────────┐
│ [590112357393367039,590464201114255359,590816044835143679,...] │
└────────────────────────────────────────────────────────────────┘
h3Line
指定された 2 つのインデックス間にあるインデックスの列を返します。
構文
パラメーター
start — 開始点を表すヘキサゴンインデックス番号。UInt64。
end — 終了点を表すヘキサゴンインデックス番号。UInt64。
戻り値
指定された 2 つのインデックス間の経路を表す H3 インデックスの配列。Array(UInt64)。
例
クエリ:
SELECT h3Line(590080540275638271,590103561300344831) AS indexes;
結果:
┌─indexes────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [590080540275638271,590080471556161535,590080883873021951,590106516237844479,590104385934065663,590103630019821567,590103561300344831] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
h3Distance
指定された 2 つのインデックス間の距離を、グリッドセル単位で返します。
構文
パラメーター
start — 開始点を表す六角形インデックス番号。UInt64。
end — 終了点を表す六角形インデックス番号。UInt64。
返される値
距離の算出に失敗した場合は負の数を返します。
例
クエリ:
SELECT h3Distance(590080540275638271,590103561300344831) AS distance;
結果:
┌─distance─┐
│ 7 │
└──────────┘
h3HexRing
指定された origin h3Index を中心とし、距離 k の六角形リングに含まれるインデックスを返します。
五角形による歪みが発生しなかった場合は 0 を返します。
構文
パラメータ
返される値
例
クエリ:
SELECT h3HexRing(590080540275638271, toUInt16(1)) AS hexRing;
結果:
┌─hexRing─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [590080815153545215,590080471556161535,590080677714591743,590077585338138623,590077447899185151,590079509483487231] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
h3GetUnidirectionalEdge
指定された始点と終点に基づいて単方向エッジの H3 インデックスを返し、エラーが発生した場合は 0 を返します。
構文
h3GetUnidirectionalEdge(originIndex, destinationIndex)
パラメーター
originIndex — 始点となる Hexagon のインデックス番号。UInt64。
destinationIndex — 終点となる Hexagon のインデックス番号。UInt64。
返り値
- 単方向エッジ Hexagon のインデックス番号。UInt64。
例
クエリ:
SELECT h3GetUnidirectionalEdge(599686042433355775, 599686043507097599) AS edge;
結果:
┌────────────────edge─┐
│ 1248204388774707199 │
└─────────────────────┘
h3UnidirectionalEdgeIsValid
指定された H3Index が有効な単方向エッジインデックスかどうかを判定します。単方向エッジであれば 1、それ以外の場合は 0 を返します。
構文
h3UnidirectionalEdgeisValid(index)
パラメーター
戻り値
- 1 — H3 インデックスが有効な単方向エッジである。UInt8。
- 0 — H3 インデックスが有効な単方向エッジではない。UInt8。
例
クエリ:
SELECT h3UnidirectionalEdgeIsValid(1248204388774707199) AS validOrNot;
結果:
┌─validOrNot─┐
│ 1 │
└────────────┘
h3GetOriginIndexFromUnidirectionalEdge
単方向エッジの H3Index から始点の六角形インデックスを返します。
構文
h3GetOriginIndexFromUnidirectionalEdge(edge)
パラメーター
edge — 単方向エッジを表す六角形インデックス番号。UInt64。
戻り値
例
クエリ:
SELECT h3GetOriginIndexFromUnidirectionalEdge(1248204388774707197) AS origin;
結果:
┌─────────────origin─┐
│ 599686042433355773 │
└────────────────────┘
h3GetDestinationIndexFromUnidirectionalEdge
単方向エッジを表す H3Index から、終点の六角形インデックスを返します。
構文
h3GetDestinationIndexFromUnidirectionalEdge(edge)
パラメーター
edge — 単方向エッジを表す六角形インデックス番号。UInt64。
戻り値
例
クエリ:
SELECT h3GetDestinationIndexFromUnidirectionalEdge(1248204388774707197) AS destination;
結果:
┌────────destination─┐
│ 599686043507097597 │
└────────────────────┘
h3GetIndexesFromUnidirectionalEdge
指定された単方向エッジ H3Index から、起点と終点の六角形インデックスを返します。
構文
h3GetIndexesFromUnidirectionalEdge(edge)
パラメーター
edge — 単方向エッジを表す Hexagon インデックス番号。UInt64。
返される値
tuple(origin,destination) という 2 つの値からなるタプルを返します。
origin — 起点の Hexagon インデックス番号。UInt64。
destination — 終点の Hexagon インデックス番号。UInt64。
指定された入力が無効な場合は (0,0) を返します。
例
クエリ:
SELECT h3GetIndexesFromUnidirectionalEdge(1248204388774707199) AS indexes;
結果:
┌─indexes─────────────────────────────────┐
│ (599686042433355775,599686043507097599) │
└─────────────────────────────────────────┘
h3GetUnidirectionalEdgesFromHexagon
指定された H3Index から、すべての単方向エッジを取得します。
構文
h3GetUnidirectionalEdgesFromHexagon(index)
パラメータ
index — 単方向エッジを表す六角形インデックス番号。UInt64。
戻り値
各単方向エッジを表す h3 インデックスの配列。Array(UInt64)。
例
クエリ:
SELECT h3GetUnidirectionalEdgesFromHexagon(1248204388774707199) AS edges;
結果:
┌─edges─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [1248204388774707199,1320261982812635135,1392319576850563071,1464377170888491007,1536434764926418943,1608492358964346879] │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
h3GetUnidirectionalEdgeBoundary
単方向エッジを定義する座標を返します。
構文
h3GetUnidirectionalEdgeBoundary(index)
パラメーター
index — 単方向エッジを表すヘキサゴンインデックス番号。UInt64。
返される値
例
クエリ:
SELECT h3GetUnidirectionalEdgeBoundary(1248204388774707199) AS boundary;
結果:
┌─boundary────────────────────────────────────────────────────────────────────────┐
│ [(37.42012867767779,-122.03773496427027),(37.33755608435299,-122.090428929044)] │
└─────────────────────────────────────────────────────────────────────────────────┘