PostGIS
切換黑暗/明亮/自動模式 - PostGIS 空間資料庫 切換黑暗/明亮/自動模式 - PostGIS 空間資料庫 切換黑暗/明亮/自動模式 - PostGIS 空間資料庫 返回首頁 - PostGIS 空間資料庫

使用 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。然後,你將 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_HistogramST_ValueCount 等函式來執行許多統計,因此您不必將柵格向量化即可對其執行基本統計。