Растрове підсумовування PostGIS (алгебра карти)


14

У мене є таблиця полігонів, що представляють ізохрони часу подорожі в конкретні дні. Для кожної точки початку існує п’ять ізохронних геометрій (зберігаються в окремих рядках). Для кожної точки початку я хочу растеризувати п'ять ізохронів (двійковий NULL або 1), а потім об'єднати їх в один растровий шар. Цей растровий шар вимагає простої алгебри карти: sum / 5, так що кожне джерело буде врешті-решт асоційоване з одним растровим шаром, який має значення [NULL, 0,2, 0,4, 0,6, 0,8, 1] залежно від кількості складові шари перекриваються. Це поверхня ймовірності.

Усі мої дані зберігаються в Postgres 9.3 (разом із PostGIS). Моя проблема полягає в тому, що, хоча я хочу навчитися використовувати растр PostGIS, у нього, здається, є дуже крута крива навчання, і всі приклади, які я можу знайти, мають справу з одним растровим шаром. У прикладах цей шар використовується як частина багатокутного накладання, можливо, усереднюючи значення растра для кожного багатокутника. Я не знайшов повторюваного прикладу поєднання: а) вектор -> растровий b) алгебра карти; і c) атрибут GROUP BY відповідно до мого першого абзацу.

Я все в порядку, використовуючи GDAL або GRASS, якщо мені доведеться виконувати це завдання, але це здається, що PostGIS повинен мати можливість впоратися; було б зручно це зробити, враховуючи мої вхідні дані - це вже геометрія PostGIS; і мені дуже хочеться погодитися з растром PostGIS.

Деякі структури даних вибірки:

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

Я хочу розтерзати, згрупувати по області, а потім виконати алгебру карти, щоб прийти:

areaid    isorast (raster)
1000      aaa
1006      bbb

Я не мав успіху, що містив це в PostGIS. Мій підхід полягає в перетворенні вектора в растровий, скиданні растрових масивів і виконанні комбінації з нумеровими масивами через psycopg2, перед тим, як записати їх у GeoTIFF (щоб, можливо, повернути їх у PostGIS). Не ідеально, але можливо.


1
Класне питання. Я поділяю дійсно слід навчитися почуттів растрового посту, і я впевнений, що ви хочете, що це можливо. На жаль занадто зайнятий сьогодні, щоб поїхати.
Джон Пауелл

1
У цьому блозі BostonGIS є досить жорстка стаття про алгебру карт . Автор цього блогу також є автором чудової книги «Постгіс в дії», яка має багато растрових можливостей Постгіса. Вибачте, я не міг придумати більш прямого прикладу.
Джон Пауелл

Відповіді:


3

Вам потрібно буде написати власну сукупну функцію:

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

згодом ви можете назвати це так

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

Це дає вам суму всіх ваших растратів з тим самим ідентифікатором області. Вам все одно потрібно буде розділити значення растру на кількість спостережень для кожного ідентифікатора області. (Я не включив її до функції сукупності. Ви можете це зробити тут або згодом за допомогою MapAlegbra)

Переконайтеся, що ваші вхідні растри вирівняні, інакше це не буде працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.