@@ -3235,22 +3235,19 @@ def compute_transform_inverse(prm, dem,
32353235 margin = 10 * max (dx , dy )
32363236 polygon = polygon .buffer (margin )
32373237
3238- # Rasterize polygon to valid mask
3239- from rasterio .features import rasterize
3240- from rasterio .transform import from_bounds
3241-
3242- # Create affine transform for output grid
3243- transform = from_bounds (out_x [0 ] - dx / 2 , out_y [- 1 ] - dy / 2 ,
3244- out_x [- 1 ] + dx / 2 , out_y [0 ] + dy / 2 , n_x , n_y )
3245-
3246- # Rasterize polygon
3247- valid_mask = rasterize (
3248- [(polygon , 1 )],
3249- out_shape = (n_y , n_x ),
3250- transform = transform ,
3251- fill = 0 ,
3252- dtype = np .uint8
3253- ).astype (bool )
3238+ # Fast path: if polygon covers entire grid, all pixels are valid (skip cv2 import)
3239+ grid_box = shapely .box (out_x [0 ], out_y [0 ], out_x [- 1 ], out_y [- 1 ])
3240+ if polygon .contains (grid_box ):
3241+ valid_mask = np .ones ((n_y , n_x ), dtype = bool )
3242+ else :
3243+ # Rasterize polygon to valid mask (cv2, no rasterio/GDAL to avoid fork deadlocks)
3244+ import cv2
3245+ poly_coords = np .array (polygon .exterior .coords )
3246+ px = ((poly_coords [:, 0 ] - out_x [0 ]) / (out_x [- 1 ] - out_x [0 ]) * (n_x - 1 )).astype (np .int32 )
3247+ py = ((poly_coords [:, 1 ] - out_y [0 ]) / (out_y [- 1 ] - out_y [0 ]) * (n_y - 1 )).astype (np .int32 )
3248+ valid_mask = np .zeros ((n_y , n_x ), dtype = np .uint8 )
3249+ cv2 .fillPoly (valid_mask , [np .column_stack ([px , py ])], 1 )
3250+ valid_mask = valid_mask .astype (bool )
32543251
32553252 n_valid = valid_mask .sum ()
32563253
0 commit comments