0

我目前正在使用 Postgres 9.1

我的目标是用多边形剪辑 PostGIS 栅格。然后我想要一个 postgres 数组或包含在该多边形中的每个光栅像素的分隔值集。这是我到目前为止得到的查询:

SELECT  p.gid, (ST_ValueCount(ST_Clip(r.rast, p.geom))).value AS fval
FROM temp_raster AS r, temp_shapefile AS p
WHERE (r.start_time = 1384516800) 
GROUP BY gid, fval;

这将输出:

 gid | fcstval 
-----+---------
   1 |       0
   1 |       2
   2 |       0
   2 |       2
   3 |       5
   4 |       0
   4 |       1
   4 |       2
   4 |       3
   4 |       5

这个数据很好,但我想为每个 gid 设置一组值,如下所示:

 gid |  fcstval 
-----+----------
   1 |       0,2
   2 |       0,2
   3 |         5
   4 | 0,1,2,3,5

我遇到的麻烦是尝试将这些值聚合到数组或分隔字符串中。这是我对数组的尝试:

SELECT  p.gid, array_agg((ST_ValueCount(ST_Clip(r.rast, p.geom))).value) AS fval
FROM temp_raster AS r, temp_shapefile AS p
WHERE (r.start_time = 1384516800)
GROUP BY gid;

这不起作用,并提供错误:

ERROR:  set-valued function called in context that cannot accept a set

我的猜测是这是因为我不能以这种方式调用 array_agg。我很难弄清楚如何做到这一点。也许是一个子查询?我还没有想出任何东西来让它工作。

谢谢你的帮助!

4

1 回答 1

0

好的,我想我想出了数组。如果我想要它在一个字符串中,我可以将我的数组转换为一个字符串。但是,如果有人对清理有任何建议,我将不胜感激,因为这似乎不是最简单的标记

SELECT p.gid, array_agg((subquery).tempval) as fcstval 
FROM pih_raster AS r, hwy_pih_vertex_buf AS p, 
( 
    SELECT p.gid AS tempgid, (ST_ValueCount(ST_Clip(r.rast, p.geom))).value AS tempval 
    FROM pih_raster AS r, hwy_pih_vertex_buf AS p 
    WHERE (r.start_time <= 1384624800) GROUP BY tempgid, tempval
) AS subquery
WHERE (r.start_time <= 1384624800) AND ((subquery).tempgid = gid) GROUP BY p.gid;

这是输出:

 gid |   fcstval   
-----+-------------
   1 | {0,2}
   2 | {0,2}
   3 | {5}
   4 | {0,1,2,3,5}
于 2013-11-15T18:11:10.810 回答