Raquet es un formato ráster nativo en la nube que almacena teselas ráster como filas en un archivo Apache Parquet. Cada fila contiene los bytes de píxel de una tesela Web-Mercator junto con su identificador de celda QUADBIN — un entero de 64 bits que codifica el nivel de zoom y las coordenadas x/y intercaladas mediante Morton. No se requieren metadatos espaciales adicionales: el rectángulo delimitador y el mapeo de píxel a coordenadas quedan completamente determinados por el valor QUADBIN.
El patrón de consulta típico une una trayectoria con una tabla Raquet en dos pasos:
-- Step 1: identify which tiles the trajectory overlaps
SELECT DISTINCT q
FROM unnest(trajectory_quadbins(traj, 8)) AS q;
-- Step 2: sample each matching tile
SELECT raster_tile_value_quadbin(
band_data, width, height, quadbin, 'FLOAT32', nodata, true, traj)
FROM elevation_raquet
WHERE quadbin = ANY(trajectory_quadbins(traj, 8));
Devolver las celdas QUADBIN distintas en un nivel de zoom cubiertas por una trayectoria
trajectory_quadbins(tgeompoint,integer) → bigint[]
Devuelve el conjunto de celdas QUADBIN únicas (deduplicadas) cuyas envolventes de tesela Web-Mercator contienen al menos un instante de traj. El resultado es adecuado como clave de unión en la cláusula WHERE contra una tabla Raquet. El parámetro zoom debe estar en [0, 15].
-- Three instants spanning three tiles at zoom 3
SELECT trajectory_quadbins(
tgeompointFromText('SRID=4326;{Point(-60 45)@2024-01-01,
Point(0 45)@2024-01-02,
Point(60 45)@2024-01-03}'), 3);
-- Count of Raquet tiles a ship trajectory overlaps at zoom 8
SELECT array_length(trajectory_quadbins(trip4326, 8), 1) AS tile_count
FROM trips
ORDER BY tile_count DESC;
Muestrear un chip ráster de Raquet a lo largo de una trayectoria usando una celda QUADBIN para la georreferenciación
raster_tile_value_quadbin(bytea,integer,integer,bigint,text,float8,boolean,tgeompoint) → tfloat
Evalúa un arreglo de píxeles de banda única en orden de fila mayor en cada instante de traj (SRID 4326). La georreferenciación de la tesela (rectángulo delimitador, mapeo de píxel a coordenadas) se deriva únicamente de quadbin mediante la transformada de tesela deslizante Web-Mercator. El argumento pixtype debe ser uno de UINT8, INT16, INT32, FLOAT32 o FLOAT64. Cuando has_nodata es verdadero, los instantes cuyo píxel equivale a nodata se descartan silenciosamente. Devuelve NULL cuando ningún instante sobrevive.
-- Sample elevation tiles from a Raquet Parquet table
-- for all ship trajectories
SELECT t.tripid,
raster_tile_value_quadbin(
r.band_data, r.width, r.height, r.quadbin,
'FLOAT32', r.nodata, true, t.trip4326)
FROM trips t
JOIN elevation_raquet r
ON r.quadbin = ANY(trajectory_quadbins(t.trip4326, 8));
-- Average sea-surface temperature per trajectory
SELECT t.tripid,
avgValue(raster_tile_value_quadbin(
r.band_data, 256, 256, r.quadbin,
'INT16', -9999, true, t.trip4326)) AS mean_sst
FROM trips t
JOIN sst_raquet r
ON r.quadbin = ANY(trajectory_quadbins(t.trip4326, 6));
Construir una tesela ráster Raquet a partir de sus bytes de píxeles, dimensiones, celda QUADBIN y tipo de píxel
raquet(bytea,integer,integer,bigint,text,float8) → raquet
Empaqueta un arreglo de píxeles pixels de banda única en orden de fila mayor de width × height píxeles de tipo pixtype (uno de UINT8, INT16, INT32, FLOAT32 o FLOAT64), georreferenciado por la celda quadbin, en un único valor raquet autodescriptivo. El argumento nodata es opcional; cuando se omite (NULL) la tesela no lleva valor centinela de nodata. Se genera un error cuando el arreglo pixels es menor que width × height × el tamaño del píxel. Un raquet es un valor de longitud variable, libre de GDAL, con una representación portátil en texto Hex-WKB y binaria, distinto de y coexistente con el tipo raster de PostGIS usado por raster_value.
-- Empaquetar las columnas sueltas de una tabla Raquet en valores raquet
SELECT raquet(band_data, width, height, quadbin, 'FLOAT32', nodata) AS tile
FROM elevation_raquet;
-- Una tesela UINT8 de 2 x 2 sin nodata
SELECT raquet('\x01020304'::bytea, 2, 2, 5193776270265024512, 'UINT8');
Decodificar un archivo ráster en memoria en una tesela ráster Raquet mediante GDAL
raquet_read(bytea,bigint) → raquet
Lee los bytes de rasterfile — un ráster en cualquier formato compatible con GDAL (GeoTIFF, PNG, …) — a través del sistema de archivos virtual /vsimem/ de GDAL, y empaqueta su primera banda, en orden de fila mayor, en un único valor raquet autodescriptivo georreferenciado por la celda quadbin. El tipo de datos de la banda debe ser uno de Byte, Int16, Int32, Float32 o Float64; el valor de nodata de la banda, cuando está definido, se traslada a la tesela. Como el archivo se suministra como bytes, no se requiere acceso a archivos del lado del servidor. GDAL realiza la decodificación, por lo que el controlador de formato del ráster debe estar permitido por la configuración postgis.gdal_enabled_drivers de PostGIS (que deshabilita todos los controladores de forma predeterminada); habilítelo con, por ejemplo, SET postgis.gdal_enabled_drivers = 'ENABLE_ALL'. Esta es la contraparte de ingesta del constructor raquet, que construye una tesela a partir de bytes de píxeles ya decodificados.
Cuando se omite quadbin o es NULL, el identificador de la tesela se deriva de la georreferenciación del ráster: el ráster debe llevar una referencia espacial EPSG:3857 (Web-Mercator) y una geotransformación alineada con los ejes que describa una única tesela QUADBIN. Un ráster sin referencia espacial, uno que no esté en EPSG:3857, o una geotransformación rotada o no alineada con la cuadrícula de teselas provoca un error en lugar de ser forzado.
-- Decodificar un GeoTIFF almacenado en una columna bytea en una tesela raquet SELECT raquet_read(file_bytes, quadbin) AS tile FROM elevation_files; -- Derivar la celda QUADBIN de la georreferenciación de un GeoTIFF EPSG:3857 SELECT raquet_read(file_bytes) AS tile FROM elevation_files;
Muestrear una tesela ráster raquet a lo largo de una trayectoria
raster_tile_value(raquet,tgeompoint) → tfloat
Evalúa la tesela en cada instante de traj (SRID 4326), devolviendo los valores de píxel muestreados como un tfloat. Es el equivalente tipado de raster_tile_value_quadbin: las dimensiones, la celda QUADBIN, el tipo de píxel y el tratamiento de nodata se toman del valor raquet en lugar de argumentos separados. Devuelve NULL cuando ningún instante cae dentro de la tesela o sobrevive al filtrado de nodata.
-- Muestrear teselas raquet preempaquetadas a lo largo de trayectorias de barcos SELECT t.tripid, raster_tile_value(r.tile, t.trip4326) FROM trips t JOIN elevation_tiles r ON r.quadbin = ANY(trajectory_quadbins(t.trip4326, 8));