获取栅格的唯一像素值和像素值计数
PostGIS 栅格具有许多函数,并且可能至少有 10 种方法可以比其他方法慢得多地执行某些操作。假设您有一个栅格,或者您有一个感兴趣的栅格区域——例如高程栅格,并且您想了解该区域中唯一的像素值。最容易想到的是使用栅格中的 ST_Value
函数,但有一个效率更高的函数可以使用,那就是 ST_ValueCount
函数。
ST_ValueCount
函数是 PostGIS 2.0+ 中可用的许多统计栅格函数之一。它是一个集合返回函数,为每一行返回 2 个值:像素值(值)和栅格中具有该值的像素计数(计数)。它还具有允许您过滤特定像素值的变体。
此提示是由 stackexchange 上的问题 如何从 PostGIS 栅格中提取所有唯一值? 引发的。
示例
获取所有栅格切片的波段 1 的唯一像素值列表
指定波段号是可选的,如果未指定,则默认为 1。我喜欢指定它,因为我经常使用多波段栅格。在这种情况下,我只有一个名为 dem 的数字高程数据表。
SELECT DISTINCT (pvc).value
FROM (SELECT ST_ValueCount(dem.rast,1) As pvc
FROM dem) As f
ORDER BY (pvc).value;
现在,如果您使用的是 PostgreSQL 9.3+,您可以通过使用 LATERAL 子句使它更短(因为在大多数情况下 LATERAL 关键字是可选的,您可以跳过 LATERAL 并像这样编写它)
SELECT DISTINCT (pvc).value
FROM dem, ST_ValueCount(dem.rast,1) As pvc
ORDER BY (pvc).value;
获取感兴趣区域的波段 1 的像素值列表和总像素
现在,如果您有很大的覆盖范围,那么您可能只关心特定区域,而不是您拥有的 300 万个切片。您可能还想了解该值在您的感兴趣区域中出现的次数,因此您真的想将您的武器库与 ST_Clip
和 ST_Intersects
结合起来。这里我使用 9.3 LATERAL 简写
SELECT (pvc).value, SUM((pvc).count) As tot_pix
FROM dem
INNER JOIN
ST_GeomFromText('LINESTRING(-87.627 41.8819,
-87.629 41.8830)'
, 4326) As geom
ON ST_Intersects(dem.rast, geom),
ST_ValueCount(ST_Clip(dem.rast,geom),1) As pvc
GROUP BY (pvc).value
ORDER BY (pvc).value;