PostgreSQLraster(柵格資料)st_value優化舉例

德哥發表於2018-02-28

標籤

PostgreSQL , postgis , 柵格 , 波段 , st_value , raster , 優化 , st_intersects , gist 索引 , arcgis


背景

柵格資料是由點陣組成的影像化資料,點陣具備空間屬性(邊界)。點陣由畫素組成,所以每個畫素也具備空間屬性,同時每個畫素內填充數值,數值可以代表溫度、灰度、顏色系數、屬性、溼度等等。

pic

每個柵格中可以有多個波段,每個波段可以代表一個圖層,多個波段可以組合疊加計算。

pic

pic

pic

pic

使用柵格資料,可以實現具備空間、業務屬性的資料分析,視覺化等。

例如熱力圖、綠化率圖、道路、溫度分佈等等。

arcgis柵格資料組織形式:

任何有效的柵格格式  
  
畫素陣列  
  
一個或多個波段  
  
以檔案形式儲存在磁碟或地理資料庫中  
  
70 多種支援的格式  
  
可用作影像服務  
  
可在許多地理處理和分析工具中用作資料來源  
  
可在“影像分析”視窗中使用  

由於柵格資料可大可小,當提取某個畫素的VALUE時,可能會有一定的效能問題。

使用st_value提取raster指定畫素VALUE

https://postgis.net/docs/RT_ST_Value.html

當柵格檔案非常大時,st_value可能要執行很長時間,雖然只提取一個畫素的值。(此效能與柵格檔案本身的資料組織,檢索方法有關。)

使用st_setvalue設定raster指定畫素value

http://postgis.net/docs/RT_ST_SetValue.html

柵格背景知識

可以從arcgis或postgis的手冊中,學習柵格的知識。

http://resources.arcgis.com/zh-cn/help/main/10.2/#/na/009t00000004000000/

http://resources.arcgis.com/zh-cn/help/main/10.2/index.html#//009t00000007000000

優化方法

業務層優化

1、切割raster,將一個大的raster,切割為若干小的raster

2、邊界轉geometry, 建立邊界的表示式索引

3、判斷輸入的geometry point是否與被查詢raster相交(st_intersects),相交則求st_value,否則不計算st_value

資料庫核心層優化

4、當然,還有一種優化方法是對柵格檔案本身建立較好的資料模型,便於快速檢索。這種方法對業務透明

小結

優化思路:

1、降低計算量,使用切割的方法。

2、降低計算量或IO放大,使用表示式索引。

3、降低精度,對raster進行分層,類似這樣的思路

SELECT   
  ST_AsText(ST_Union(pixpolyg)) As shadow  
FROM   
(  
SELECT         ST_Translate(  
                  ST_MakeEnvelope(  
		        ST_UpperLeftX(rast),   
			ST_UpperLeftY(rast),  
			ST_UpperLeftX(rast) + ST_ScaleX(rast)*2,  
			ST_UpperLeftY(rast) + ST_ScaleY(rast)*2,   
			0  
		  ),   
		  ST_ScaleX(rast)*x,   
		  ST_ScaleY(rast)*y  
	       ) As pixpolyg,   
	       ST_Value(rast, 2, x, y) As b2val  
FROM   
  dummy_rast   
CROSS JOIN  
  generate_series(1,1000,2) As x   
CROSS JOIN   
  generate_series(1,1000,2) As y  
WHERE rid =  2  
  AND x <= ST_Width(rast)    
  AND y <= ST_Height(rast)    
) As foo  
WHERE  
ST_Intersects(   
  pixpolyg,  
  ST_GeomFromText(`POLYGON((3427928 5793244,3427927.75 5793243.75,3427928 5793243.75,3427928 5793244))`,0)  
)   
AND b2val != 254;  

pic

參考

https://stackoverflow.com/questions/31799824/optimizing-st-intersects-in-postgresqlpostgis

http://postgis.17.x6.nabble.com/raster-loading-and-ST-Value-performance-td4999924.html

http://postgis.net/docs/RT_ST_SetValue.html

https://postgis.net/docs/RT_ST_Value.html

http://postgis.17.x6.nabble.com/ST-value-slow-td5010865.html

http://resources.arcgis.com/zh-cn/help/main/10.2/#/na/009t00000005000000/

http://resources.arcgis.com/zh-cn/help/main/10.2/index.html#//009t00000007000000

http://postgis.net/docs/manual-2.4/RT_reference.html

《PostgreSQL multipolygon 空間索引查詢過濾精簡優化 – IO,CPU放大優化》

《PostgreSQL 空間切割(st_split, ST_Subdivide)功能擴充套件 – 空間物件網格化 (多邊形GiST優化)》

《PostgreSQL 空間st_contains,st_within空間包含搜尋優化 – 降IO和降CPU(bound box) (多邊形GiST優化)》


相關文章