Capítulo 19. Muestreo de Ráster

Tabla de contenidos

Operador de Muestreo
Muestreo Raquet / QUADBIN
Operadores de Restricción y Predicado
Compilación e Instalación
Hoja de Ruta de Producción

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"

Operador de Muestreo

  • 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;