Tengo un postgre/postgis base de datos con alrededor de 120 millones de puestos de trabajo (tipo geography). Me gustaría crear un mapa de densidad (por ejemplo, un mapa de calor) y servir esto a través de geoserver.
Me hizo crear una banda de ráster. Yo bucle a través de todos los puntos y aumentar el valor de la trama elemento que contiene este punto. (véase el código de abajo) Esto lleva a mi base de datos de la explosión (querery corrió alrededor de 15 horas, de la base de datos aumentaron un 60 gigabye).
Así que necesito más rápido y más eficiente manera de hacer eso.
CREATE TABLE raster_table (
rid SERIAL PRIMARY KEY,
name VARCHAR(30),
description VARCHAR(255),
rast RASTER
);
/* insert new raster for whole germany */
DELETE FROM raster_table
WHERE name = 'test';
INSERT INTO raster_table (rid, name, description, rast)
VALUES (1, 'count', 'count raster',
ST_AddBand(ST_MakeEmptyRaster(2500, 4500, 5.5, 47, 0.004, 0.002, 0, 0, 4326), '8BUI' :: TEXT, 0));
CREATE OR REPLACE
FUNCTION update_grid()
RETURNS VOID AS $$
DECLARE
pl RECORD;
val INT;
BEGIN
FOR pl IN SELECT positions.id, positions.position
FROM positions LOOP
SELECT ST_Value(rast, 1, pl.position :: GEOMETRY)
INTO val
FROM raster_table;
val = val + 1;
UPDATE raster_table
SET rast = ST_SetValue(rast, 1, pl.position :: GEOMETRY, val)
WHERE raster_table.rid = 1;
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT update_grid();
Cuando esto se hace, me gustaría crear el mapa de colores como
INSERT INTO raster_table (rid, name, description, rast)
WITH ref AS (SELECT raster_table.rast
FROM raster_table
WHERE rid = 1)
SELECT 2, 'rgba', 'colorful map', ST_ColorMap(ref.rast, 'bluered') FROM ref;