Sommatoria raster PostGIS (mappa algebra)


14

Ho una tabella di poligoni che rappresentano isocronici del tempo di viaggio in determinati giorni. Per ogni punto di origine, ci sono cinque geometrie isochrone (memorizzate in file separate). Per ogni punto di origine, desidero rasterizzare i cinque isocroni (un NULL binario o 1), quindi combinarli in un singolo livello raster. Questo livello raster richiede una semplice algebra della mappa: somma / 5, in modo che ciascuna origine alla fine sia associata a un singolo livello raster che abbia valori in [NULL, 0.2, 0.4, 0.6, 0.8, 1] a seconda di quante gli strati costituenti si sovrappongono. È una superficie di probabilità.

I miei dati sono tutti archiviati in Postgres 9.3 (con PostGIS). Il mio problema è che mentre voglio imparare a usare PostGIS raster, sembra avere una curva di apprendimento molto ripida e tutti gli esempi che posso trovare riguardano un singolo livello raster. Negli esempi, questo livello viene utilizzato come parte di una sovrapposizione di poligoni, forse mediando il valore del raster per ciascun poligono. Non ho trovato un esempio replicabile per combinare: a) vector -> raster b) map algebra; e c) attributo GROUP BY secondo il mio primo paragrafo.

Sto bene usando GDAL o GRASS se devo per svolgere questo compito, ma questo sembra qualcosa che PostGIS dovrebbe essere in grado di gestire; sarebbe conveniente farlo dato che i miei dati di input sono già geometria PostGIS; e voglio davvero venire a patti con PostGIS raster.

Qualche struttura di dati di esempio:

areaid    time        date          isogeom (polygon)
1000      07:15:00    2014-05-05    xxx
1000      07:15:00    2014-05-06    xxy
...
1006      07:15:00    2014-05-05    zzz

Voglio rasterizzare, raggruppare per areaid, quindi eseguire l'algebra della mappa per arrivare a:

areaid    isorast (raster)
1000      aaa
1006      bbb

Non sono riuscito a contenerlo a PostGIS. Il mio approccio è stato quello di convertire il vettore in raster, scaricare i raster in array ed eseguire la combinazione con array intorpiditi tramite psycopg2, prima di scriverli su un GeoTIFF (forse per essere rimesso in PostGIS). Non ideale, ma fattibile.


1
Bella domanda. Condivido davvero dovrei imparare il sentimento post-raster e sono sicuro che ciò che vuoi è possibile. Purtroppo è troppo occupato oggi per provare.
John Powell,

1
C'è un articolo abbastanza hardcore sull'algebra delle mappe in questo blog BostonGIS . L'autore di questo blog è anche l'autore dell'eccellente libro Postgis in Action, che ha molte capacità raster di Postgis. Mi dispiace, non ho potuto trovare un esempio più diretto.
John Powell,

Risposte:


3

Dovrai scrivere la tua funzione aggregata:

CREATE OR REPLACE function sum_raster_state(raster, raster)
returns raster
language sql
as $f$

SELECT
CASE $1
WHEN NULL THEN
      $2
ELSE
    ST_MapAlgebra(
        $1, 
        $2, 
        '([rast1] + [rast2])', 
        NULL, 
        'UNION', 
        '[rast2]', 
        '[rast1]', 
        NULL)
END;
$f$;

CREATE OR REPLACE FUNCTION sum_raster_final(raster)
returns raster
language sql
as $f$
SELECT 
   $1
$f$;

create aggregate sum_raster(raster) (
    SFUNC = sum_raster_state,
    STYPE = raster,
    FINALFUNC = sum_raster_final
);

dopo puoi chiamarlo così

SELECT areaid, sum_raster(st_asraster(isogeom, ...)) FROM isochrone GROUP BY areaid

Questo ti dà la somma di tutti i tuoi raster con lo stesso ID area. Sarà comunque necessario dividere i valori raster per il numero di osservazioni per ciascun ID area. (Non l'ho incluso nella funzione aggregata. Puoi farlo qui o successivamente usando MapAlegbra)

Assicurati che i raster di input siano tutti allineati, altrimenti non funzionerà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.