Operaciones específicas de ráster

Las secciones anteriores enuncian lo que un ráster comparte con las demás teselaciones. Las operaciones siguientes son propias del ráster: una celda de ráster lleva un valor donde una celda H3, QUADBIN o S2 lleva solo identidad, de modo que una trayectoria leída contra un ráster responde un tfloat en lugar de una celda temporal.

El operador de muestreo de ráster de MobilityDB lee una banda de ráster a lo largo de una trayectoria de punto móvil y devuelve un tfloat. Una posición fuera de la extensión del ráster o sobre un píxel nodata no lleva valor. Los operadores de muestreo son de valor doble sea cual sea el tipo de píxel de la banda, de modo que un tipo de píxel pertenece a la superficie de muestreo cuando todo valor que puede contener es exactamente representable en un número de doble precisión. Eso es lo que permite muestrear una banda de cualquier tipo en un único tfloat, y que una columna con teselas de varios tipos de píxel se lea con una sola consulta. Un tipo de píxel también se acepta con el nombre que le da el ráster de PostGIS, de modo que el tipo de banda que informa una llamada a ST_BandPixelType (8BUI, 16BSI, 32BF, …) se pasa a los constructores de teselas tal cual. El ráster de PostGIS no lleva flotantes de 16 bits ni enteros de 64 bits, así que float16, int64 y uint64 toman la grafía que da su gramática, 16BF, 64BSI y 64BUI. Sus tipos 1BB, 2BUI y 4BUI acotan un píxel a menos de un byte mientras que PostGIS almacena cada uno de ellos a un byte por píxel, de modo que tal banda ya son los bytes de una banda de 8 bits sin signo y los constructores la leen como uint8; la cota es lo único que añade el nombre, y una tesela no la lleva. El nombre que informa una tesela es el que la especificación RaQuet da al tipo. Los tipos uint64 e int64 contienen valores fuera de ese dominio: una tesela de cualquiera de ellos se almacena y se vuelve a leer exactamente, mientras que muestrear un píxel cuyo valor ningún número de doble precisión nombra genera un error en lugar de responder con un valor vecino. Esto permite consultas como ¿qué perfil de elevación siguió cada vehículo? o ¿qué viajes entraron en una banda de umbral de temperatura?

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(quadbins(traj, 8)) AS q;
-- Step 2: sample each matching tile
SELECT rasterTileValueQuadbin(traj, band_data, width, height, quadbin, 'float32', nodata,
  true) FROM elevation_raquet WHERE quadbin = ANY(quadbins(traj, 8));

Los operadores de restricción y predicado que cierran la sección componen rasterValue con las funciones estándar de restricción temporal y predicado de MobilityDB. Aceptan un argumento opcional band (por defecto 1) e invocan rasterValue exactamente una vez por invocación.

Una función de ráster toma el nombre de su homóloga del ráster de PostGIS sin el prefijo ST_, y los nombres y los valores por defecto de sus argumentos. Una sola signatura responde a cada operación, de modo que una forma de PostGIS que solo fija un argumento de otra se escribe mediante esa otra forma. Un nombre que el estándar SQL reserva toma el tipo como prefijo, de modo que ST_Value es rasterValue, y las funciones de Well-Known Binary toman los nombres que toma todo tipo de MobilityDB.

Ráster de PostGISMobilityDB
ST_ValuerasterValue
ST_Clipclip
ST_Transformtransform
ST_Rescalerescale
ST_Reclassreclass
ST_SummaryStatssummaryStats
ST_DumpAsPolygonsdumpAsPolygons
ST_NumBands, ST_Width, ST_Height, ST_SRIDnumBands, width, height, SRID
ST_UpperLeftX, ST_UpperLeftY, ST_ScaleX, ST_ScaleY, ST_SkewX, ST_SkewYupperLeftX, upperLeftY, scaleX, scaleY, skewX, skewY
ST_BandPixelType, ST_BandNoDataValuebandPixelType, bandNoDataValue
ST_AsBinary, ST_AsHexWKBasBinary, asHexWKB
ST_RastFromWKB, ST_RastFromHexWKBrasterFromBinary, rasterFromHexWKB

asBinary y asHexWKB toman un orden de bytes donde PostGIS toma outasin, y sin él devuelven los bytes de ST_AsBinary y ST_AsHexWKB.

Para usar los operadores descritos aquí, MobilityDB debe ser compilado con -DRASTER=ON. En tal compilación, el archivo mobilitydb.control generado declara requires = 'postgis, postgis_raster', por lo que un único CASCADE crea la pila completa:

CREATE EXTENSION mobilitydb CASCADE;
-- NOTICE:  installing required extension "postgis"
-- NOTICE:  installing required extension "postgis_raster"

El ráster de PostGIS forma parte del paquete estándar postgresql-N-postgis-3 en Debian/Ubuntu; no se requiere ningún paquete adicional. Pase -DRASTER=ON a CMake:

cmake -DRASTER=ON ..
make -j$(nproc)
sudo make install

Para incluir el ráster en la compilación de cobertura de CI junto con otras familias opcionales, añada -DRASTER=ON a la invocación de cmake en .github/workflows/pgversion.yml.