PostGIS栅格求和(地图代数)


14

我有一个表示特定日期旅行时间等时线的多边形表。对于每个原点,有五个等时线几何体(存储在单独的行中)。对于每个原点,我要栅格化五个等时线(二进制NULL或1),然后将它们组合成一个栅格图层。此栅格图层需要一个简单的地图代数:sum / 5,以便最终每个原点都将与一个单独的栅格图层相关联,该栅格图层的值分别为[NULL,0.2、0.4、0.6、0.8、1],具体取决于多少组成层重叠。这是一个概率面。

我的数据全部存储在Postgres 9.3(带有PostGIS)中。我的问题是,尽管我想学习使用PostGIS栅格,但是学习曲线似乎非常陡峭,我可以找到的所有示例都涉及单个栅格图层。在示例中,该图层用作多边形叠加层的一部分,可能平均了每个多边形的栅格值。我还没有找到组合的可复制示例:a)矢量->栅格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分组,然后执行地图代数得出:

areaid    isorast (raster)
1000      aaa
1006      bbb

我没有成功将其包含到PostGIS中。我的方法是将矢量转换为栅格,将栅格转储为数组,并通过psycopg2将其与numpy数组组合,然后再将其写入GeoTIFF(可能会放回PostGIS中)。不理想,但可行。


1
很酷的问题。我分享了学习Postgis栅格感觉的真实想法,并且我确定您想要的是可能的。可悲的是,今天太忙了,不能去了。
约翰·鲍威尔

1
BostonGIS博客中,有一篇关于地图代数的硬性文章。该博客的作者还是一本非常好的书《 Postgis in Action》的作者,该书具有许多Postgis的栅格功能。抱歉,我无法提出更直接的例子。
约翰·鲍威尔

Answers:


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

这将为您提供所有具有相同区域ID的栅格的总和。您仍然需要将栅格值除以每个区域ID的观测数量。(我没有在聚合函数中包含它。您可以在此处或之后使用MapAlegbra进行操作)

确保输入栅格全部对齐,否则将无法正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.