def geoms_to_raster(str_tree, rasterizer_config, window, extent): background_class_id = rasterizer_config.background_class_id all_touched = rasterizer_config.all_touched log.debug('Cropping shapes to window...') # Crop shapes against window, remove empty shapes, and put in window frame of # reference. window_geom = window.to_shapely() shapes = str_tree.query(window_geom) shapes = [(s, s.class_id) for s in shapes] shapes = [(s.intersection(window_geom), c) for s, c in shapes] shapes = [(s, c) for s, c in shapes if not s.is_empty] def to_window_frame(x, y, z=None): return (x - window.xmin, y - window.ymin) shapes = [(transform(to_window_frame, s), c) for s, c in shapes] log.debug('# of shapes in window: {}'.format(len(shapes))) out_shape = (window.get_height(), window.get_width()) # rasterize needs to be passed >= 1 shapes. if shapes: log.debug('rasterio.rasterize()...') raster = rasterize( shapes, out_shape=out_shape, fill=background_class_id, dtype=np.uint8, all_touched=all_touched) else: raster = np.full(out_shape, background_class_id, dtype=np.uint8) # Ensure that parts of window outside of extent have zero values which are counted as # the don't-care class for segmentation. valid_window = window_geom.intersection(extent.to_shapely()) if valid_window.is_empty: raster[:, :] = 0 else: vw = transform(to_window_frame, valid_window) vw = Box.from_shapely(vw).to_int() new_raster = np.zeros(out_shape) new_raster[vw.ymin:vw.ymax, vw.xmin:vw.xmax] = \ raster[vw.ymin:vw.ymax, vw.xmin:vw.xmax] raster = new_raster return raster
def test_from_shapely(self): shape = ShapelyBox(self.xmin, self.ymin, self.xmax, self.ymax) output_box = Box.from_shapely(shape) self.assertEqual(output_box, self.box)