Devolver la celda temporal en la resolución dada que contiene cada punto de un punto temporal geodésico o plano
th3index(tpoint,integer,borderInc boolean=true) → th3index tquadbin(tpoint,integer,borderInc boolean=true) → tquadbin ts2cell(tpoint,integer,borderInc boolean=true) → ts2cell
El SRID debe ser 4326 para las sobrecargas de tgeompoint. El constructor sobre un punto temporal se presenta para todas las cuadrículas, sobre un punto geodésico y uno plano.
Una trayectoria que no indica nada entre sus instantes, discreta o escalonada, produce las celdas que los contienen y conserva su interpolación; una que se desplaza entre ellos produce todas las celdas que atraviesa por el camino, ya que el segmento se recorre celda a celda en lugar de muestrearse. El segmento se recorre a lo largo del camino que sigue su punto: el círculo máximo de un tgeogpoint, de modo que una trayectoria que cruza el antimeridiano o pasa cerca de un polo produce las celdas de su ruta más corta, y la recta en longitud y latitud de un tgeompoint. Un círculo máximo se curva hacia el polo en longitud y latitud, de modo que el arco entre dos posiciones de una misma tesela QUADBIN puede salir de la tesela y volver a ella. Una arista de celda S2 es un arco de círculo máximo, que una recta en longitud y latitud no es, de modo que esa recta entre dos posiciones de una misma celda S2 también puede salir de la celda y volver a ella. Para th3index y ts2cell, cada instante del resultado marca el momento en que la trayectoria entró en esa celda, y la última celda se mantiene hasta el final de la trayectoria, de modo que el resultado abarca su período. Con un límite superior exclusivo, una celda que la trayectoria alcanza solo en su final, sin mantenerla ningún tiempo, no forma parte del resultado. Dos cruces que caen en el mismo microsegundo, la menor separación que indica una marca de tiempo, dejan la celda en la que se entra en ese instante: una celda que se abandona antes de mantenerla ningún tiempo no forma parte del resultado. Un cruce en un extremo de un segmento se indica en el instante de ese extremo, como la división en el espacio de spaceSplit indica la tesela de una esquina, por lo que la cobertura de una trayectoria cortada en periodos semiabiertos sucesivos se fusiona en la cobertura de la trayectoria completa. Las celdas distintas del resultado, que devuelve getValues, son las teselas que cubre una trayectoria, la clave de combinación de una tabla Raquet, donde una tesela que el viaje cruza y la clave omite es una tesela que la combinación nunca lee.
La cobertura QUADBIN indica el teselado multidimensional de la trayectoria que spaceSplit indica sobre teselas de la misma cuadrícula. Una tesela contiene sus bordes oeste y norte, de modo que cada posición pertenece a la única tesela que la contiene, y un camino que pasa por el punto donde se encuentran cuatro teselas ocupa la tesela al este del meridiano y al sur del paralelo que se cruzan allí en el instante en que pasa por él. El instante de un cruce pertenece a la tesela que contiene la posición del cruce: la tesela en la que entra la trayectoria cuando se desplaza hacia el este o el sur, y la tesela que abandona cuando se desplaza hacia el oeste o el norte, donde el resultado es un conjunto de secuencias cuya secuencia siguiente comienza después de ese instante. Un cruce se fecha como lo fecha la restricción de la trayectoria a una tesela, truncando su parámetro al microsegundo, y cuando varios cruces caen en un mismo microsegundo, la última tesela alcanzada lo ocupa. El argumento opcional borderInc indica, como para spaceSplit, si se incluye el borde superior de la extensión de la trayectoria: sin él, una tesela que no contiene de la trayectoria más que ese borde, en su meridiano este o en su paralelo sur, no forma parte del resultado. Para th3index y ts2cell, cuyas celdas no tienen un eje alineado con la extensión, la malla asigna una posición en el borde de una celda a una de las celdas que se encuentran allí, y la celda en la que la trayectoria entra en su último instante es la única celda que ocupa solo en el borde superior de su extensión: borderInc indica si esa celda forma parte del resultado, y sin él la celda ocupada antes se mantiene hasta el final de la trayectoria con un límite exclusivo.
SELECT getResolution(th3index(tgeogpoint 'POINT(-73.96 40.78)@2001-01-01', 9));
-- 9@2001-01-01
SELECT getResolution(th3index(tgeompoint
'SRID=4326;POINT(-73.96 40.78)@2001-01-01', 9));
-- 9@2001-01-01
SELECT getResolution(tquadbin(tgeompoint
'SRID=4326;POINT(-73.96 40.78)@2001-01-01', 9));
-- 9@2001-01-01
SELECT getResolution(tquadbin(tgeogpoint 'POINT(-73.96 40.78)@2001-01-01', 9));
-- 9@2001-01-01
SELECT numInstants(tquadbin(tgeogpoint
'[POINT(-170 65)@2001-01-01, POINT(-100 65)@2001-01-02]', 2));
-- 5
SELECT tquadbin(tgeompoint
'SRID=4326;[Point(0 0)@2001-01-01, Point(45 33.3)@2001-01-03]', 2);
-- {[482cffffffffffff@2001-01-01], (4826ffffffffffff@2001-01-01,
-- 4826ffffffffffff@2001-01-03]}
SELECT tquadbin(tgeompoint
'SRID=4326;[Point(0 0)@2001-01-01, Point(45 33.3)@2001-01-03]', 2, false);
-- (4826ffffffffffff@2001-01-01, 4826ffffffffffff@2001-01-03]
SELECT getResolution(ts2cell(tgeogpoint 'POINT(-73.96 40.78)@2001-01-01', 9));
-- 9@2001-01-01
SELECT getResolution(ts2cell(tgeompoint
'SRID=4326;POINT(-73.96 40.78)@2001-01-01', 9));
-- 9@2001-01-01
SELECT numInstants(ts2cell(tgeompoint
'SRID=4326;[POINT(-15 44.5)@2001-01-01, POINT(15 44.5)@2001-01-02]', 0));
-- 4
Dividir un punto temporal en las celdas QUADBIN que atraviesa
quadbinSplit(tpoint,integer,borderInc boolean=true) → {(cell,tpoint)}
La cobertura indica qué celda ocupa una trayectoria y cuándo. La división indica las mismas celdas y, junto a cada una, la trayectoria sobre los períodos que la cobertura indica para esa celda, de modo que un valor indexado por celda se lee en una sola pasada donde la cobertura por sí sola exige una restricción por celda. Las celdas de una división son las celdas de la cobertura, el fragmento de una celda es la trayectoria restringida a los períodos que la cobertura indica para ella, y los fragmentos se fusionan en la trayectoria. Una trayectoria que alcanza una celda en su último instante, o que pasa por la esquina que contiene una celda, la ocupa allí durante un instante, y la división indica ese fragmento sobre ese instante. El argumento opcional borderInc es el de tquadbin.
El segmento se recorre a lo largo del camino que sigue su punto, de modo que una trayectoria geodésica se divide en las celdas que atraviesan sus círculos máximos y una planar en las celdas que atraviesa su línea recta en longitud y latitud. El período de un fragmento es el que responde getTime para él, de modo que la división no lleva un período propio.
SELECT (s).cell, asText((s).tpoint, 6) AS tpoint
FROM (SELECT quadbinSplit(tgeompoint
'SRID=4326;[Point(-135 -10)@2001-01-01, Point(-45 10)@2001-01-03]', 2) AS s) t;
-- 4823ffffffffffff | {(POINT(-90 0)@2001-01-02, POINT(-45 10)@2001-01-03]}
-- 4828ffffffffffff | {[POINT(-135 -10)@2001-01-01, POINT(-90 0)@2001-01-02)}
-- 4829ffffffffffff | {[POINT(-90 0)@2001-01-02]}
SELECT count(*) FROM quadbinSplit(tgeogpoint
'[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 2);
-- 2
SELECT count(*) FROM quadbinSplit(tgeompoint
'SRID=4326;[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 2);
-- 1
Dividir un punto temporal en las celdas H3 que atraviesa
h3Split(tpoint,integer,borderInc boolean=true) → {(cell,tpoint)}
La cobertura indica qué celda ocupa una trayectoria y cuándo. La división indica las mismas celdas y, junto a cada una, la trayectoria sobre los períodos que la cobertura indica para esa celda, de modo que un valor indexado por celda se lee en una sola pasada donde la cobertura por sí sola exige una restricción por celda. Las celdas de una división son las celdas de la cobertura, el fragmento de una celda es la trayectoria restringida a los períodos que la cobertura indica para ella, y los fragmentos se fusionan en la trayectoria. El período de un fragmento es el que responde getTime para él, de modo que la división no lleva un período propio. El argumento opcional borderInc es el de la cobertura, de modo que sin él la celda en la que la trayectoria entra en su último instante no tiene fragmento.
El segmento se recorre a lo largo del camino que sigue su punto, de modo que una trayectoria geodésica se divide en las celdas que atraviesan sus círculos máximos y una planar en las celdas que atraviesa su línea recta en longitud y latitud. Una celda H3 es un hexágono sobre la esfera, y un círculo máximo es el camino más corto entre dos posiciones sobre ella, de modo que una trayectoria geodésica no atraviesa más de esas celdas que la línea recta en longitud y latitud entre las mismas posiciones.
SELECT (s).cell, asText((s).tpoint, 6) AS tpoint
FROM (SELECT h3Split(tgeompoint
'SRID=4326;[Point(-0.1 51.5)@2001-01-01, Point(0.1 51.5)@2001-01-02]', 4) AS s) t;
-- 84194adffffffff | {[POINT(-0.1 51.5)@2001-01-01, POINT(0.004068 51.5)@2001-01-01 12:29:17.362145)}
-- 84194e7ffffffff | {[POINT(0.004068 51.5)@2001-01-01 12:29:17.362145, POINT(0.1 51.5)@2001-01-02]}
SELECT count(*) FROM h3Split(tgeogpoint
'[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 2);
-- 14
SELECT count(*) FROM h3Split(tgeompoint
'SRID=4326;[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 2);
-- 16
Dividir un punto temporal en las celdas S2 que atraviesa
s2Split(tpoint,integer,borderInc boolean=true) → {(cell,tpoint)}
La cobertura indica qué celda ocupa una trayectoria y cuándo. La división indica las mismas celdas y, junto a cada una, la trayectoria sobre los períodos que la cobertura indica para esa celda, de modo que un valor indexado por celda se lee en una sola pasada donde la cobertura por sí sola exige una restricción por celda. Las celdas de una división son las celdas de la cobertura, el fragmento de una celda es la trayectoria restringida a los períodos que la cobertura indica para ella, y los fragmentos se fusionan en la trayectoria. El período de un fragmento es el que responde getTime para él, de modo que la división no lleva un período propio. El argumento opcional borderInc es el de la cobertura, de modo que sin él la celda en la que la trayectoria entra en su último instante no tiene fragmento.
El segmento se recorre a lo largo del camino que sigue su punto, de modo que una trayectoria geodésica se divide en las celdas que atraviesan sus círculos máximos y una planar en las celdas que atraviesa su línea recta en longitud y latitud. Los dos caminos atraviesan celdas distintas, y su número es una propiedad de la trayectoria y no de la cuadrícula: el arco de longitud -170 a -100 sobre la latitud 65 atraviesa tantas celdas S2 como la línea recta entre las mismas posiciones, mientras que las celdas mismas difieren.
SELECT count(*) FROM s2Split(tgeogpoint
'[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 6);
-- 29
SELECT count(*) FROM s2Split(tgeompoint
'SRID=4326;[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 6);
-- 29
SELECT getValues(ts2cell(tgeogpoint
'[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 6))
= getValues(ts2cell(tgeompoint
'SRID=4326;[Point(-170 65)@2001-01-01, Point(-100 65)@2001-01-02]', 6));
-- f
Devolver el centroide de una celda, o de cada celda de una trayectoria
cellToPoint({h3index,quadbin}) → geometry
cellToPoint(s2cell) → geography
cellToPoint({th3index,ts2cell}) → tgeogpoint
cellToPoint(tquadbin) → tgeompoint
tgeompoint(th3index) → tgeompoint
El centroide está en el SRID 4326, y su tipo depende de la cuadrícula. Una celda S2 responde un punto geodésico, ya que sus aristas son arcos de círculo máximo, y una tesela QUADBIN uno plano, ya que la tesela es un rectángulo en longitud y latitud. Una celda H3 responde un punto plano y una celda H3 temporal uno geodésico, y tgeompoint responde el mismo centroide como un punto plano, de modo que H3 es la única cuadrícula que publica ambas formas para una trayectoria. La operación se llama cellToPoint para todas las cuadrículas, siendo la ranura cell_to_point del descriptor lo que lo fija.
SELECT ST_AsText(cellToPoint(h3index '871fa44a8ffffff'), 6); -- POINT(4.297401 50.8043) SELECT asText(cellToPoint(th3index '871fa44a8ffffff@2001-01-01'), 6); -- POINT(4.297401 50.8043)@2001-01-01 SELECT asText(tgeompoint(th3index '871fa44a8ffffff@2001-01-01'), 6); -- POINT(4.297401 50.8043)@2001-01-01 SELECT ST_AsText(cellToPoint(quadbin '48a6227affffffff'), 6); -- POINT(4.394531 50.847573) SELECT asText(cellToPoint(tquadbin '48a6227affffffff@2001-01-01'), 6); -- POINT(4.394531 50.847573)@2001-01-01 SELECT ST_AsText(cellToPoint(s2cell '47c3c'), 6); -- POINT(4.222019 50.936164) SELECT asText(cellToPoint(ts2cell '47c3c@2001-01-01'), 6); -- POINT(4.222019 50.936164)@2001-01-01
Devolver la frontera poligonal de una celda, o de cada celda de una trayectoria
cellToBoundary({h3index,quadbin}) → geometry
cellToBoundary(s2cell) → geography
cellToBoundary({th3index,ts2cell}) → tgeography
cellToBoundary(tquadbin) → tgeometry
La frontera está en el SRID 4326, y su tipo depende de la cuadrícula como el centroide de cellToPoint: una geografía para S2, una geometría para QUADBIN y, para H3, una geometría para una celda y una geografía para una trayectoria. El anillo se cierra sobre su primer vértice, de modo que un hexágono H3 lleva siete puntos y un cuadrado QUADBIN o un cuadrilátero esférico S2 cinco.
SELECT ST_NPoints(cellToBoundary(h3index '871fa44a8ffffff')); -- 7 SELECT ST_GeometryType(getValue(cellToBoundary(th3index '871fa44a8ffffff@2001-01-01'))::geometry); -- ST_Polygon SELECT ST_NPoints(getValue(cellToBoundary(th3index '871fa44a8ffffff@2001-01-01'))::geometry); -- 7 SELECT ST_GeometryType(getValue(cellToBoundary(tquadbin '48a6227affffffff@2001-01-01'))::geometry); -- ST_Polygon SELECT ST_NPoints(getValue(cellToBoundary(tquadbin '48a6227affffffff@2001-01-01'))::geometry); -- 5 SELECT ST_GeometryType(getValue(cellToBoundary(ts2cell '47c3c@2001-01-01'))::geometry); -- ST_Polygon SELECT ST_NPoints(getValue(cellToBoundary(ts2cell '47c3c@2001-01-01'))::geometry); -- 5