From 5166849acf2bccaddee8860b5d23df17427180bb Mon Sep 17 00:00:00 2001 From: Alex Leith Date: Mon, 11 Nov 2024 10:42:16 +1100 Subject: [PATCH] Change order of operations for get_tiles to speed things up (#72) * Change order of operations for get_tiles to speed things up * Fix formatting * Fix bug with crs * log python versions * Remove proj:projjson, which is removed in rio-stac 0.10.0 --- .github/workflows/run-tests.yml | 1 + dep_tools/grids.py | 24 +++++++++++++++--------- dep_tools/utils.py | 2 +- tests/test_get_stac_item.py | 3 --- tests/test_grid.py | 2 -- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index a8eddc2..fbfd719 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -53,6 +53,7 @@ jobs: build-essential pip3 install --upgrade pip setuptools wheel poetry pip3 install . + pip3 freeze - name: Run tests run: | diff --git a/dep_tools/grids.py b/dep_tools/grids.py index ec5c3a8..774096e 100644 --- a/dep_tools/grids.py +++ b/dep_tools/grids.py @@ -93,6 +93,7 @@ def get_tiles( def grid( resolution: int | float = 30, + simplify_tolerance: float = 0.1, crs=PACIFIC_EPSG, return_type: Literal["GridSpec", "GeoSeries", "GeoDataFrame"] = "GridSpec", intersect_with: GeoDataFrame | None = None, @@ -121,16 +122,21 @@ def grid( return _intersect_grid(full_grid, intersect_with) else: gridspec = _gridspec(resolution, crs) - geometry = Geometry(loads(intersect_with.to_json())) - # This is a bit of a hack, but it works. Geometries that are transformed by the tiles_from_geopolygon - # are not valid, but doing the simplification and buffer fixes them. - buffer = 0.0 if buffer_distance is None else buffer_distance - fixed = ( - geometry.to_crs(PACIFIC_EPSG, check_and_fix=True, wrapdateline=True) - .simplify(0.01) - .buffer(buffer) + simplified = ( + intersect_with.to_crs(PACIFIC_EPSG) + .simplify(simplify_tolerance) + .to_frame() + .to_geo_dict() ) - return gridspec.tiles_from_geopolygon(geopolygon=fixed) + geometry = Geometry( + simplified, + crs=PACIFIC_EPSG, + ) + if buffer_distance is not None: + geometry = geometry.buffer(buffer_distance) + else: + geometry = geometry.buffer(0.0) + return gridspec.tiles_from_geopolygon(geopolygon=geometry) return { "GridSpec": _gridspec, diff --git a/dep_tools/utils.py b/dep_tools/utils.py index 43be0fe..6423153 100644 --- a/dep_tools/utils.py +++ b/dep_tools/utils.py @@ -77,7 +77,7 @@ def bbox_across_180(region: GeoDataFrame | GeoBox) -> BBOX | tuple[BBOX, BBOX]: geometry = region.to_crs(4326).geometry.make_valid().explode() geometry = geometry[ geometry.geom_type.isin(["Polygon", "MultiPolygon"]) - ].unary_union + ].union_all() geometry = _fix_geometry(geometry) bbox = antimeridian_bbox(geometry) diff --git a/tests/test_get_stac_item.py b/tests/test_get_stac_item.py index 92daef9..79e6a0a 100644 --- a/tests/test_get_stac_item.py +++ b/tests/test_get_stac_item.py @@ -1,8 +1,6 @@ import rioxarray from dep_tools.namers import LocalPath -from dep_tools.stac_utils import StacCreator -from dep_tools.writers import StacWriter from dep_tools.stac_utils import get_stac_item from pathlib import Path @@ -41,7 +39,6 @@ def test_get_stac_item_properties(stac_item): "proj:bbox", "proj:shape", "proj:transform", - "proj:projjson", ] assert all([key in properties.keys() for key in keys]) diff --git a/tests/test_grid.py b/tests/test_grid.py index 4bbcc9d..95a41cb 100644 --- a/tests/test_grid.py +++ b/tests/test_grid.py @@ -14,7 +14,6 @@ def test_get_gadm(): def test_get_tiles(): # This takes 2 minutes to retrieve all the tiles. Keep it as a generator. - print("a") tiles = get_tiles(resolution=30) # Let's just check one @@ -23,7 +22,6 @@ def test_get_tiles(): assert type(tile) is tuple assert geobox.crs == PACIFIC_EPSG - print("b") # Check the count here, shouldn't take too long tiles = list(get_tiles(resolution=30, country_codes=["FJI"])) assert len(tiles) == 27