第10章 使用 PostGIS ST_Reclass 函数高效筛选特定值范围像素
使用 ST_Reclass 选择特定值范围像素
第10章:使用 ST_Reclass 筛选特定值范围内的像素
这个栅格问题在 PostGIS 邮件列表和 Stack Overflow 上经常出现,最优解通常借助于 ST_Reclass 函数。该函数自 PostGIS 2.0 起就已存在,却常被遗忘。大家往往转而使用速度慢得多但更灵活的 ST_MapAlgebra,或者将栅格导出为带像素值的 Polygon 再用 WHERE val > 90 进行过滤。而 ST_Reclass 能做到同样的事,速度却快几个数量级。
问题通常是这样描述: “我有一个栅格,其第 1 波段中的像素值代表氨的污染物浓度。我想按低(0)、中(1)、高(2)来分级污染程度。 之后,我希望计算这些污染区域的面积,或对其执行其他复杂的几何操作。”
基本策略是将原始栅格简化为只包含 0、1、2 的新栅格,其中 0 被标记为 nodata。最后得到的是一张结构简单的栅格,既方便矢量化,也可以保留为栅格格式进行统计分析。
例如,这里我们使用 ST_Reclass 将所有像素值 ≥ 0 且 ≤ 90 的重新分类为 0,> 90 且 < 100 的归为 1,100 到 1000 的归为 2。最后一个参数将 0 的值定义为 nodata。
SELECT ST_Reclass(rast, 1, '[0-90]:0,(90-100):1,[100-1000):2', '4BUI', 0) As rast FROM sometable WHERE filename = '123.tif';
这将返回一组新的栅格,其像素值为 1、2 和 nodata。
接下来,问题延伸为如何对这组新栅格执行几何运算,例如计算每个毒性等级区域的质心。
WITH cgeoms AS ( SELECT ST_DumpAsPolygons( ST_Reclass(rast, 1, '[0-90]:0,(90-100):1,[100-1000):2', '4BUI', 0), 1 ) AS gval FROM sometable WHERE filename = '123.tif' ) SELECT ST_Centroid( ST_Union( (gval).geom ) ) As geom, (gval).val FROM cgeoms GROUP BY (gval).val;
此外,还可以使用 ST_Histogram 和 ST_ValueCount 等函数进行许多统计操作,因此不必将栅格矢量化就能完成基础统计分析。