PostGIS
切换深色/浅色/自动模式 - PostGIS 空间数据库 切换深色/浅色/自动模式 - PostGIS 空间数据库 切换深色/浅色/自动模式 - PostGIS 空间数据库 返回主页 - PostGIS 空间数据库

获取栅格的唯一像素值和像素值计数

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_ClipST_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;