def test_gridspec_upperleft(): """ Test to ensure grid indexes can be counted correctly from bottom left or top left """ tile_bbox = geometry.BoundingBox(left=1934400.0, top=2414800.0, right=2084400.000, bottom=2264800.000) bbox = geometry.BoundingBox(left=1934615, top=2379460, right=1937615, bottom=2376460) # Upper left - validated against WELD product tile calculator # http://globalmonitoring.sdstate.edu/projects/weld/tilecalc.php gs = GridSpec(crs=geometry.CRS('EPSG:5070'), tile_size=(-150000, 150000), resolution=(-30, 30), origin=(3314800.0, -2565600.0)) cells = {index: geobox for index, geobox in list(gs.tiles(bbox))} assert set(cells.keys()) == {(30, 6)} assert cells[(30, 6)].extent.boundingbox == tile_bbox gs = GridSpec(crs=geometry.CRS('EPSG:5070'), tile_size=(150000, 150000), resolution=(-30, 30), origin=(14800.0, -2565600.0)) cells = {index: geobox for index, geobox in list(gs.tiles(bbox))} assert set(cells.keys()) == { (30, 15) } # WELD grid spec has 21 vertical cells -- 21 - 6 = 15 assert cells[(30, 15)].extent.boundingbox == tile_bbox
class AfricaGeobox: """ generate the geobox for each tile according to the longitude ande latitude bounds. """ def __init__(self, resolution: Tuple[int, int] = (-20, 20), crs: str = "epsg:6933"): target_crs = CRS(crs) self.albers_africa_N = GridSpec( crs=target_crs, tile_size=(96_000.0, 96_000.0), # default resolution=resolution, ) africa = box(-18, -38, 60, 30, "epsg:4326") self.africa_projected = africa.to_crs(crs, resolution=math.inf) def tile_geobox(self, tile_index: Tuple[int, int]) -> GeoBox: return self.albers_africa_N.tile_geobox(tile_index) @property def geobox_dict(self) -> Dict: return dict( self.albers_africa_N.tiles(self.africa_projected.boundingbox))