使用ST_Clip裁剪更大栅格时为何出现nodata值?
解决ST_Clip裁剪栅格时顶部出现Nodata行的问题
这个问题是PostGIS中ST_Clip的像素边界对齐精度导致的:即使裁剪多边形在几何上完全处于原栅格范围内,若多边形的边界与原栅格的像素边界未严格对齐,ST_Clip会判定顶部行的像素仅被多边形部分覆盖,从而标记为Nodata(你的案例中是0)。
解决方案:将裁剪多边形对齐到原栅格的像素网格
先通过ST_SnapToGrid把裁剪多边形的顶点对齐到原栅格的像素边界上,确保多边形的边界完全贴合像素边缘,这样ST_Clip就会正确识别这些像素为完全覆盖。
原栅格的像素分辨率计算:
- X方向:
(175.49958333333333 - 174.99958333333333)/600 = 0.000833333333333度/像素 - Y方向:
(-40.250416666666666 - (-40.750416666666666))/600 = 0.000833333333333度/像素
修改后的SQL代码:
WITH tile AS ( SELECT ST_Clip( ST_AsRaster( ST_GeomFromText('POLYGON((174.99958333333333 -40.250416666666666,175.49958333333333 -40.250416666666666,175.49958333333333 -40.750416666666666,174.99958333333333 -40.750416666666666,174.99958333333333 -40.250416666666666))', 4326), 600, 600, '8BUI', 255, 0), -- 将裁剪多边形对齐到原栅格的像素网格 ST_SnapToGrid( ST_GeomFromText('POLYGON((175.078125 -40.71395582628603,175.078125 -40.44694705960049,175.4296875 -40.44694705960049,175.4296875 -40.71395582628603,175.078125 -40.71395582628603))', 4326), 0.000833333333333, 0.000833333333333 ) ) AS rast ) SELECT x, y, val FROM tile, ST_PixelAsPoints(tile.rast, 1, exclude_nodata_value=>FALSE) ORDER BY y ASC;
原理说明
ST_SnapToGrid会把多边形的所有顶点移动到最近的像素网格交点上,确保裁剪区域的边界完全匹配原栅格的像素边缘,这样ST_Clip在判断像素覆盖情况时,就不会误将完全覆盖的像素标记为Nodata。
执行修改后的代码后,y=0行的像素值应该全部变为255,符合预期。
内容的提问来源于stack exchange,提问作者Will S
相关产品推荐
相关产品推荐

