我有一个包含以下列的表:
(ID, row_num, col_num, pix_centroid, pix_val1).
我有1000多张唱片。我正在插入我的数据,使用:
insert into pixelbased (row_num, col_num, pix_centroid, pix_val)
select
(ST_PixelAsPolygons(rast, 1)).x as X,
(ST_PixelAsPolygons(rast, 1)).y as Y,
(ST_Centroid((ST_PixelAsPolygons(rast, 1)).geom)) as geom,
(ST_PixelAsPolygons(rast, 1)).val as pix_val1
from mytable
where rid=1`
现在我试着将所有其他记录作为一个列插入,而“pix”列对我很重要。所有其他列将保持不变。换句话说,我希望最后一个表包含以下列:
(ID, row_num, col_num, pix_centroid, pix_val1, pix_val2, pix_val3, ....)
有办法吗?
最佳答案
如果可能的话,我想将这些数据作为位图存储在bytea中。以下是如何获取一系列字节值并将其转换为byte a:
WITH bytes(b) AS (SELECT x % 256 FROM generate_series(1,53000) x)
SELECT ('\x'||string_agg(lpad(to_hex(b),2,'0'),''))::bytea FROM bytes;
您可以使用
substr
函数访问字节数组的字段或范围。这个bytea是以线性像素数组的形式组织的,但是您可能会发现将它组织成更传统的位图格式更有用。此外,如果像素超过一个字节,则可能需要处理大端与小端。在SQL中可以做到这一点,但在PL/Perl这样的过程语言中可能要容易得多。否则,多维数组将是一个比较合理的选择。
使用
generate_series
语句替换pix_val
字段以方便测试,此查询使用两个聚合过程生成二维整数数组:SELECT ('{'||string_agg(subarray, ',')||'}')::integer[] AS arr
FROM (
SELECT array_agg(x order by x)::text
FROM generate_series(1,53000) x
GROUP BY width_bucket(x, 1, 53001, 100)
) a(subarray);
由于
array_agg
无法聚合数组,因此必须不幸地使用二维数组的字符串文本形式。在我看来,这是PostgreSQL中的一个真正缺点;通常,它的多维数组使用起来很奇怪,并且与大多数应用程序和语言实现数组的方式不一致。通过对数组进行索引,可以从数组中获取字段。例子:
regress=> SELECT ('{'||string_agg(subarray, ',')||'}')::integer[] AS arr INTO test FROM (SELECT array_agg(x order by x)::text from generate_series(1,53000) x GROUP BY width_bucket(x, 1, 53001, 100)) a(subarray);
regress=> \d test
Table "public.test"
Column | Type | Modifiers
--------+-----------+-----------
arr | integer[] |
test
包含一个二维数组:regress=> \x
regress=> select array_dims(test.arr), array_ndims(test.arr), array_length(test.arr,1), array_length(test.arr,2) FROM test;
-[ RECORD 1 ]+---------------
array_dims | [1:100][1:530]
array_ndims | 2
array_length | 100
array_length | 530
我可以得到两级索引的元素:
regress=> SELECT test.arr[4][4] FROM test;
arr
------
1594
(1 row)
或一个“列”与切片:
regress=> SELECT test.arr[4:4][1:530] FROM test;
奇怪的是,这仍然是一个二维数组,顶部的维度只有一个元素深。如果需要,可以使用
unnest
和array_agg
将其展平(效率低下)。PostgreSQL中的二维数组有点奇怪,正如你所看到的,但是你所要做的也是如此。
关于postgresql - 栅格记录的像素值将作为列插入表中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13146046/