Tengo una tabla de mapas de altura de 16 bits con signo (!) (mosaicos SRTM) cargados en PostGIS. Este sitio web me mostró cómo exportar una trama como PNG a un archivo:
COPY (SELECT encode(ST_AsPNG(raster), ‘hex’) AS png FROM table_with_raster) TO ‘/tmp/myimage.hex’;
xxd -p -r /tmp/sf_colors.hex > /tmp/sf_colors.png
Sin embargo, como mis datos de imagen están en enteros con signo, ST_AsPng(rast)
falla porque se trata de enteros con signo, pero ST_AsPng()
necesita valores de 0 a 256 (8 bits, sin signo). Así que quiero reclasificar la imagen, de modo que 0 = valor mínimo y 256 = valor máximo.
Por ello, he creado una nueva tabla y he calculado las estadísticas de la imagen con ST_SummaryStatsAgg:
CREATE TABLE heightmap_data_stats as (
SELECT rast_id, (stats).min, (stats).max, rast
FROM (
SELECT ST_SummaryStatsAgg(rast, 1, true) AS stats, rast_id, rast
FROM heightmap_data GROUP BY rast_id
) AS foo
);
Ahora tengo algo así:
id min max rast
-----------------------------
0 85 1232 [data]
1 37 677 [data]
3 95 625 [data]
2 173 977 [data]
Ahora lo he intentado:
SELECT encode(ST_AsPng(
ST_Reclass(rast, 1, 'min-max:0-256', '8BUI', 0)
), 'hex') FROM extra_data.heightmap_data_stats;
... para mapear los datos de la imagen de 85..1232 -> 0..256 por ejemplo. Sin embargo, no funciona - no sé la sintaxis para decirle a PostGIS que introduzca los valores reales "min" y "max" en el argumento ST_Reclass, por lo que sólo obtengo un error "invalid reclassarg" y se devuelve el raster original.
¿Cómo puedo escribir una consulta que, para cada trama de la tabla, la reclasifique en un rango de 0 a 256?