Tabla de contenidos
La extensión ráster de PostGIS almacena datos de cobertura en cuadrícula (elevación, temperatura, imágenes satelitales, …) en el tipo raster. Cada ráster tiene una o más bandas; una banda contiene un arreglo 2D de valores de píxel, una extensión espacial, un tamaño de píxel y un valor centinela opcional para datos nulos (nodata).
El operador de muestreo de ráster de MobilityDB evalúa una banda de ráster en los instantes de una trayectoria de punto móvil y devuelve un tfloat. Los instantes cuya posición cae fuera de la extensión del ráster o sobre un píxel nodata se descartan silenciosamente. Esto permite consultas como ¿qué perfil de elevación siguió cada vehículo? o ¿qué viajes entraron en una banda de umbral de temperatura?
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"
Muestrear una banda de ráster en cada instante de una trayectoria
raster_value(raster,tgeompoint,band integer DEFAULT 1) → tfloat
Evalúa el píxel de la band en cada instante de traj usando muestreo bilineal-vecino más próximo (ST_Value con resample=false). Devuelve un tfloat de conjunto de instantes cuyos valores se redondean a cuatro decimales. Devuelve NULL cuando ningún instante se interseca con el ráster.
-- Build a 3×3 synthetic elevation raster (SRID 4326, 1° pixels)
WITH rast AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(3, 3, 0.0, 3.0, 1.0, -1.0, 0.0, 0.0, 4326),
'32BF'::text, 0.0::float8, NULL::float8),
1, 1, 1,
ARRAY[[10.0::float4, 20.0::float4, 30.0::float4],
[40.0::float4, 50.0::float4, 60.0::float4],
[70.0::float4, 80.0::float4, 90.0::float4]]) AS r
)
SELECT raster_value(r,
tgeompoint 'SRID=4326;[POINT(0.5 2.5)@2000-01-01 00:00:00+00,
POINT(2.5 2.5)@2000-01-02 00:00:00+00,
POINT(0.5 0.5)@2000-01-03 00:00:00+00]')::text
FROM rast;
Aplicado al conjunto de datos de trayectorias BerlinMOD con un ráster de elevación del terreno:
-- Elevation profile per trip (requires a loaded elevation raster)
SELECT tripid, raster_value(elev, trip4326) AS elevation
FROM trips, elevation_raster;
-- Average elevation per trip
SELECT tripid, avgValue(raster_value(elev, trip4326)) AS mean_elev
FROM trips, elevation_raster;
-- Trips that crossed terrain above 200 m
SELECT tripid
FROM trips, elevation_raster
WHERE atSpan(raster_value(elev, trip4326),
floatspan '[200, 9999]') IS NOT NULL;