Una celda H3 es un hexágono sobre un icosaedro, de modo que tiene vecinos a través de seis aristas, vértices compartidos con ellos y una celda base entre las 122 que lleva el icosaedro. Doce celdas de cada resolución son pentágonos. Nada de eso tiene contrapartida en una cuadrícula de cuadrados o de cuadriláteros esféricos.
MobilityDB se apoya en la extensión h3 (h3-pg) y lee su tipo h3index, de modo que toda función de h3-pg sigue disponible junto a las siguientes. Una función de MobilityDB sobre una celda H3 toma el nombre de su homóloga de h3-pg sin el prefijo h3_, una operación que comparten las tres cuadrículas toma el nombre que comparten, y una sola signatura responde a cada operación.
| h3-pg | MobilityDB |
|---|---|
h3_latlng_to_cell | latLngToCell |
h3_cell_to_geometry, h3_cell_to_latlng | cellToPoint |
h3_cell_to_boundary | cellToBoundary |
h3_cell_to_parent, h3_cell_to_children | cellToParent, cellToChildren |
h3_get_resolution, h3_is_valid_cell | getResolution, isValidCell |
h3_grid_disk | gridDisk |
h3_cell_area | cellArea |
Devolver el número de celda base temporal (0–121) de cada celda de una trayectoria
th3GetBaseCellNumber(th3index) → tint
SELECT th3GetBaseCellNumber(th3index '831c02fffffffff@2001-01-01'); -- 14@2001-01-01
Devolver un booleano temporal que indica si cada celda tiene orientación de clase III
th3IsResClassIii(th3index) → tbool
La clase III alterna con la resolución: las resoluciones impares son de clase III, las pares de clase II.
SELECT th3IsResClassIii(th3index '871fa44a8ffffff@2001-01-01'); -- t@2001-01-01
Devolver un booleano temporal que indica si cada celda es un pentágono
th3IsPentagon(th3index) → tbool
12 celdas por resolución son pentágonos, las 110 restantes de cada celda base descienden como hexágonos.
SELECT th3IsPentagon(th3index '831c00fffffffff@2001-01-01'); -- t@2001-01-01 SELECT th3IsPentagon(th3index '831c02fffffffff@2001-01-01'); -- f@2001-01-01
Devolver la celda hija central temporal en la resolución dada
th3CellToCenterChild(th3index,integer) → th3index th3CellToCenterChild(th3index) → th3index
La forma sin argumento desciende a la resolución inmediatamente más fina.
SELECT th3CellToCenterChild(th3index '871fa44a8ffffff@2001-01-01', 8); -- 881fa44a81fffff@2001-01-01 SELECT th3CellToCenterChild(th3index '871fa44a8ffffff@2001-01-01'); -- 881fa44a81fffff@2001-01-01
Devolver la posición ordinal (basada en 0) de cada celda entre los hijos de su padre en la resolución dada
th3CellToChildPos(th3index,integer) → tbigint
SELECT th3CellToChildPos(th3index '871fa44a8ffffff@2001-01-01', 6); -- 0@2001-01-01
Devolver la celda hija temporal en una posición ordinal dada del padre dado, en la resolución de hijo dada
th3ChildPosToCell(tbigint,th3index,integer) → th3index
SELECT th3ChildPosToCell(tbigint '0@2001-01-01', th3index '871fa44a8ffffff@2001-01-01', 8); -- 881fa44a81fffff@2001-01-01
Las celdas a exactamente k pasos de cuadrícula desde el origen
h3GridRing(h3index,integer) → h3indexset
Falla cerca de los pentágonos.
SELECT h3GridRing(h3index '871fa44a8ffffff', 1);
/* {"871fa44a9ffffff", "871fa44aaffffff", "871fa44abffffff", "871fa44acffffff",
"871fa44adffffff", "871fa44aeffffff"} */
El camino inclusivo de celdas entre dos celdas de la misma resolución
h3GridPathCells(h3index,h3index) → h3indexset
SELECT h3GridPathCells(h3index '871fa44a8ffffff', h3index '871fa44b1ffffff');
/* {"871fa4484ffffff", "871fa44a3ffffff", "871fa44a8ffffff", "871fa44aeffffff",
"871fa44b1ffffff"} */
Todas las aristas dirigidas salientes de una celda
h3OriginToDirectedEdges(h3index) → h3indexset
6 para un hexágono y 5 para un pentágono.
SELECT h3OriginToDirectedEdges(h3index '871fa44a8ffffff');
/* {"1171fa44a8ffffff", "1271fa44a8ffffff", "1371fa44a8ffffff", "1471fa44a8ffffff",
"1571fa44a8ffffff", "1671fa44a8ffffff"} */
Todos los vértices de una celda
h3CellToVertexes(h3index) → h3indexset
6 para un hexágono y 5 para un pentágono.
SELECT h3CellToVertexes(h3index '871fa44a8ffffff');
/* {"2071fa44a8ffffff", "2171fa44a8ffffff", "2271fa44a8ffffff", "2371fa44a8ffffff",
"2471fa44a8ffffff", "2571fa44a8ffffff"} */
Los índices de las caras del icosaedro (0..19) que interseca una celda
h3GetIcosahedronFaces(h3index) → intset
SELECT h3GetIcosahedronFaces(h3index '831c02fffffffff');
-- {6, 11}
Devolver la longitud temporal de cada arista dirigida de una trayectoria, en la unidad solicitada
th3EdgeLength(th3index) → tfloat
SELECT th3EdgeLength(th3CellsToDirectedEdge(th3index '871fa44a8ffffff@2001-01-01',
th3index '871fa44aeffffff@2001-01-01'));
-- 1.272084901305088@2001-01-01
Devolver la distancia de círculo máximo temporal entre dos puntos temporales geodésicos (no entre celdas)
greatCircleDistance(tgeogpoint,tgeogpoint) → tfloat
SELECT greatCircleDistance(tgeogpoint 'Point(0 0)@2001-01-01', tgeogpoint 'Point(1 0)@2001-01-01'); -- 111.19505197522943@2001-01-01
Devolver un booleano temporal que indica si dos celdas temporales son vecinas de cuadrícula en cada instante
th3AreNeighborCells(th3index,th3index) → tbool
SELECT th3AreNeighborCells(th3index '880326b885fffff@2001-01-01', th3index '880326b88dfffff@2001-01-01'); -- t@2001-01-01
Devolver un identificador de arista dirigida temporal a partir de un par de celdas temporales de origen y destino
th3CellsToDirectedEdge(th3index,th3index) → th3index
SELECT th3CellsToDirectedEdge(th3index '871fa44a8ffffff@2001-01-01',
th3index '871fa44aeffffff@2001-01-01');
-- 1671fa44a8ffffff@2001-01-01
Devolver un booleano temporal que indica en cada instante si el valor es una arista dirigida H3 válida
isValidDirectedEdge(tcell) → tbool
Las aristas dirigidas H3 son ellas mismas identificadores de 64 bits (codificados de forma distinta a los identificadores de celda, isValidDirectedEdge los distingue). El tipo th3index de MobilityDB lleva aristas dirigidas por convención: el mismo tipo, interpretado a través de accesores específicos de aristas.
SELECT isValidDirectedEdge(th3CellsToDirectedEdge(th3index '871fa44a8ffffff@2001-01-01',
th3index '871fa44aeffffff@2001-01-01'));
-- t@2001-01-01
SELECT isValidDirectedEdge(th3index '871fa44a8ffffff@2001-01-01');
-- f@2001-01-01
Devolver la celda de origen o de destino temporal de una arista dirigida temporal
th3GetDirectedEdgeOrigin(th3index) → th3index th3GetDirectedEdgeDestination(th3index) → th3index
SELECT th3GetDirectedEdgeOrigin(th3CellsToDirectedEdge(th3index '871fa44a8ffffff@2001-01-01', th3index '871fa44aeffffff@2001-01-01')); -- 871fa44a8ffffff@2001-01-01 SELECT th3GetDirectedEdgeDestination(th3CellsToDirectedEdge(th3index '871fa44a8ffffff@2001-01-01', th3index '871fa44aeffffff@2001-01-01')); -- 871fa44aeffffff@2001-01-01
Devolver la frontera poligonal temporal de cada arista dirigida de una trayectoria, como una geografía temporal
th3DirectedEdgeToBoundary(th3index) → tgeography
SELECT ST_NPoints(getValue(th3DirectedEdgeToBoundary(
th3CellsToDirectedEdge(th3index '871fa44a8ffffff@2001-01-01',
th3index '871fa44aeffffff@2001-01-01')))::geometry);
-- 3
Devolver el vértice H3 temporal en el número de vértice dado
th3CellToVertex(th3index,integer) → th3index
0–5 para hexágonos, 0–4 para pentágonos.
SELECT th3CellToVertex(th3index '871fa44a8ffffff@2001-01-01', 0); -- 2071fa44a8ffffff@2001-01-01
Devolver las coordenadas geodésicas temporales de cada vértice de una trayectoria
th3VertexToPoint(th3index) → tgeogpoint
SELECT asText(th3VertexToPoint(th3CellToVertex(th3index '871fa44a8ffffff@2001-01-01', 0)), 6); -- POINT(4.280027 50.807655)@2001-01-01
Devolver un booleano temporal que indica en cada instante si el valor es un vértice H3 válido
isValidVertex(tcell) → tbool
SELECT isValidVertex(th3CellToVertex(th3index '871fa44a8ffffff@2001-01-01', 0)); -- t@2001-01-01
Devolver la distancia temporal en saltos de cuadrícula (número de pasos de una sola celda) entre dos celdas temporales
th3GridDistance(th3index,th3index) → tbigint tcell <-> tcell → tbigint
De forma equivalente, el operador <-> devuelve la misma distancia.
SELECT th3index '880326b885fffff@2001-01-01' <-> th3index '880326b88dfffff@2001-01-01'; -- 1@2001-01-01
Convertir entre una celda temporal y un par de coordenadas locales (I, J) temporales relativas a una celda temporal de origen
th3CellToLocalIj(th3index,th3index) → tgeompoint th3LocalIjToCell(th3index,tgeompoint) → th3index
La coordenada local se expone como un tgeompoint con el eje I en la ranura x y J en y.
SELECT asText(th3CellToLocalIj(th3index '871fa44a8ffffff@2001-01-01',
th3index '871fa44aeffffff@2001-01-01'));
-- POINT(497 320)@2001-01-01
SELECT th3LocalIjToCell(th3index '871fa44a8ffffff@2001-01-01',
th3CellToLocalIj(th3index '871fa44a8ffffff@2001-01-01',
th3index '871fa44aeffffff@2001-01-01'));
-- 871fa44aeffffff@2001-01-01