Un valor tcell comparte la misma representación en disco que tbigint, y una celda la misma representación que bigint. Una conversión entre ellos es una conversión de asignación: se aplica en una asignación, como al insertar un tbigint en una columna tcell, y en los demás casos una consulta escribe ::, de modo que las funciones específicas de celdas no puedan invocarse silenciosamente sobre enteros arbitrarios.
Una tesela se convierte en la caja espaciotemporal de su huella, que es lo que da un índice espacial a una tabla de teselas.
Convertir entre un tcell y un tbigint
{bigint,quadbin}::{quadbin,bigint}
{bigint,s2cell}::{s2cell,bigint}
{tbigint,tcell}::{tcell,tbigint}
La conversión desde un tipo de celda es una coerción binaria, ya que toda celda es un entero. La conversión hacia un tipo de celda comprueba cada valor como lo hace la entrada de texto del tipo y provoca un error en caso contrario, como lo hacen las entradas MF-JSON y WKB del tipo: un valor S2 debe ser una celda de su cuadrícula, un valor QUADBIN un índice bien formado de cualquier modo, como los que contiene el tipo quadbin, y un valor H3 una celda, una arista dirigida o un vértice, ya que un índice H3 nombra los tres. El tipo h3index y sus conversiones desde y hacia bigint son los de la extensión H3. La conversión da la vuelta completa: convertir una celda a un entero y de vuelta devuelve la celda de la que se partió.
SELECT (tbigint '590464338553208831@2001-01-01')::th3index; -- 831c02fffffffff@2001-01-01 SELECT (tbigint '5234909528541102079@2001-01-01')::tquadbin; -- 48a6227affffffff@2001-01-01 SELECT (tbigint '5171187903383994368@2001-01-01')::ts2cell; -- 47c3c@2001-01-01 SELECT 5234909528541102079::bigint::quadbin; -- 48a6227affffffff SELECT (tbigint '42@2001-01-01')::tquadbin; -- ERROR: The value 42 does not encode a valid quadbin index
Convertir una celda temporal en un punto temporal geodésico o plano de centroides de celda
th3index::{tgeogpoint,tgeompoint}
tquadbin::tgeompoint
ts2cell::tgeogpoint
La conversión de una celda QUADBIN responde un punto del plano Web-Mercator sobre el que se define la cuadrícula, mientras que la conversión de una celda S2 responde uno geodésico; cada cuadrícula declara la única conversión que exige su propia definición. H3 declara ambas, de modo que es la única cuadrícula en la que quien llama elige entre la representación geodésica y la plana en SRID 4326.
SELECT asText((th3index '831c02fffffffff@2001-01-01')::tgeogpoint, 6); -- POINT(-144.523991 49.716503)@2001-01-01 SELECT asText((th3index '831c02fffffffff@2001-01-01')::tgeompoint, 6); -- POINT(-144.523991 49.716503)@2001-01-01 SELECT asText((tquadbin '48a6227affffffff@2001-01-01')::tgeompoint, 6); -- POINT(4.394531 50.847573)@2001-01-01 SELECT asText((ts2cell '47c3c@2001-01-01')::tgeogpoint, 6); -- POINT(4.222019 50.936164)@2001-01-01
Convierte una tesela Raquet en una caja espaciotemporal
stbox(raquet) → stbox
Devuelve la huella de la tesela: la envolvente de longitud y latitud de su celda QUADBIN, en SRID 4326 y sin dimensión temporal. La huella se deriva únicamente de la celda, por lo que teselas que difieren en píxeles, dimensiones o tipo de píxel la comparten. La conversión también está disponible como conversión de tipo.
-- The footprint of a tile covering the north-eastern quadrant at zoom 1
SELECT round(stbox(raquet('\x01020304'::bytea, 2, 2, quadbin '4817ffffffffffff',
'uint8')), 6);
-- SRID=4326;STBOX X((0,0),(180,85.051129))
-- Keep the tiles whose footprint overlaps a region of interest
SELECT * FROM elevation_tiles WHERE tile::stbox && stbox 'SRID=4326;
STBOX X((0,0),(30,30))';
La huella admite los operadores, agregados y clases de operadores de stbox, por lo que una tabla de teselas se consulta por solapamiento espacial en cualquier nivel de zoom en lugar de por una prueba de igualdad sobre la celda QUADBIN en uno fijo. Indexar la conversión dota a la tabla de teselas de un índice espacial, y la extensión de un conjunto de teselas es la extensión de sus huellas.
-- A spatial index over the tile footprints CREATE INDEX elevation_tiles_gist ON elevation_tiles USING gist (stbox(tile)); CREATE INDEX elevation_tiles_spgist ON elevation_tiles USING spgist (stbox(tile)); -- The extent covered by a set of tiles SELECT extent(stbox(tile)) FROM elevation_tiles; -- Tiles a trajectory passes through, at whatever zoom levels the table holds SELECT t.tripid, r.tile FROM trips t, elevation_tiles r WHERE stbox(r.tile) && stbox(t.trip);
Convierte un ráster en una caja espaciotemporal
stbox(raster) → stbox
Devuelve la extensión del ráster en el sistema de referencia que el propio ráster declara, sin dimensión temporal. Esta es la única forma de un raster de PostGIS que la extensión declara, porque PostGIS no tiene stbox: el ancho, el alto, la georreferenciación y las propiedades de las bandas se leen con los accesores propios de PostGIS, que aquí no se repiten. La conversión también está disponible como una conversión de tipo.
WITH rast AS ( SELECT ST_MakeEmptyRaster(3, 3, 0.0, 3.0, 1.0, -1.0, 0.0, 0.0, 4326) AS r ) SELECT stbox(r) AS box, stbox(r) = r::stbox AS cast_agrees FROM rast; -- SRID=4326;STBOX X((0,0),(3,3)) | t -- The box states the reference system of the raster, not a fixed one SELECT stbox(ST_MakeEmptyRaster(2, 2, 0.0, 2.0, 1.0, -1.0, 0.0, 0.0, 3857)); -- SRID=3857;STBOX X((0,0),(2,2))
La extensión lleva la rotación de la geotransformación, de modo que un ráster sesgado responde la caja que contiene sus cuatro esquinas rotadas y no la que daría su escala por sí sola.
WITH plain AS ( SELECT ST_MakeEmptyRaster(2, 2, 0.0, 2.0, 1.0, -1.0, 0.0, 0.0, 4326) AS r ), skewed AS ( SELECT ST_MakeEmptyRaster(2, 2, 0.0, 2.0, 1.0, -1.0, 1.0, 0.0, 4326) AS r ) SELECT stbox((SELECT r FROM plain)) AS plain_box, stbox((SELECT r FROM skewed)) AS skewed_box; -- SRID=4326;STBOX X((0,0),(2,2)) | SRID=4326;STBOX X((0,0),(4,2))
La extensión lleva los operadores, las agregaciones y las clases de operadores de stbox, de modo que una tabla de rásteres se consulta por solapamiento espacial y se indexa sobre la conversión.
SELECT stbox(ST_MakeEmptyRaster(3, 3, 0.0, 3.0, 1.0, -1.0, 0.0, 0.0, 4326)) && stbox 'SRID=4326;STBOX X((1,1),(2,2))'; -- t