diff --git a/water-bodies/command-line-tools/norm_diff/Dockerfile b/water-bodies/command-line-tools/norm_diff/Dockerfile index 8a92115..b064600 100644 --- a/water-bodies/command-line-tools/norm_diff/Dockerfile +++ b/water-bodies/command-line-tools/norm_diff/Dockerfile @@ -1,21 +1,9 @@ -FROM mambaorg/micromamba +FROM docker.io/python:3.10-slim -USER root +RUN pip install --no-cache-dir rasterio click loguru && \ + python -c "import rasterio" -ENV PATH=/opt/conda/envs/env_norm_diff/bin:$PATH - -RUN apt-get update -y && \ - apt-get upgrade -y && \ - apt-get install -y --no-install-recommends \ - ca-certificates \ - curl gcc build-essential && \ - apt-get clean - -RUN mkdir -p /app && chown -R mambauser:mambauser /app - -USER mambauser +ADD app.py /app/app.py -RUN micromamba create -n env_norm_diff -c conda-forge gdal click loguru && \ - micromamba clean -a +ENTRYPOINT [] -ADD app.py /app/app.py diff --git a/water-bodies/command-line-tools/norm_diff/app.py b/water-bodies/command-line-tools/norm_diff/app.py index e1bec7a..b409dfe 100644 --- a/water-bodies/command-line-tools/norm_diff/app.py +++ b/water-bodies/command-line-tools/norm_diff/app.py @@ -1,10 +1,11 @@ """Normalized difference""" import click +import rasterio import numpy as np -from osgeo import gdal from loguru import logger -gdal.UseExceptions() +np.seterr(divide="ignore", invalid="ignore") + @click.command( short_help="Normalized difference", @@ -16,35 +17,18 @@ def normalized_difference(rasters): logger.info(f"Processing the normalized image with {rasters[0]} and {rasters[1]}") - # Allow division by zero - np.seterr(divide="ignore", invalid="ignore") - - ds1 = gdal.Open(rasters[0]) - ds2 = gdal.Open(rasters[1]) - - driver = gdal.GetDriverByName("GTiff") - - dst_ds = driver.Create( - "norm_diff.tif", - ds1.RasterXSize, - ds1.RasterYSize, - 1, - gdal.GDT_Float32, - options=["TILED=YES", "COMPRESS=DEFLATE", "INTERLEAVE=BAND"], - ) - - dst_ds.SetGeoTransform(ds1.GetGeoTransform()) - dst_ds.SetProjection(ds1.GetProjectionRef()) - - array1 = ds1.GetRasterBand(1).ReadAsArray().astype(float) - array2 = ds2.GetRasterBand(1).ReadAsArray().astype(float) + with rasterio.open(rasters[0]) as ds1: + array1 = ds1.read(1) + out_meta = ds1.meta.copy() - norm_diff = (array1 - array2) / (array1 + array2) + with rasterio.open(rasters[0]) as ds2: + array2 = ds2.read(1) - dst_ds.GetRasterBand(1).WriteArray(norm_diff) + out_meta.update({'dtype': "float32"}) - dst_ds = None - ds1 = ds2 = None + with rasterio.open("norm_diff.tif", 'w', **out_meta) as dst_dataset: + logger.info(f"Write norm_diff.tif") + dst_dataset.write((array1 - array2) / (array1 + array2), indexes=1) logger.info("Done!") diff --git a/water-bodies/command-line-tools/otsu/Dockerfile b/water-bodies/command-line-tools/otsu/Dockerfile index aaf53f7..5d7d878 100644 --- a/water-bodies/command-line-tools/otsu/Dockerfile +++ b/water-bodies/command-line-tools/otsu/Dockerfile @@ -1,20 +1,8 @@ -FROM mambaorg/micromamba +FROM docker.io/python:3.10-slim -USER root - -ENV PATH=/opt/conda/envs/env_otsu/bin:$PATH - -RUN apt-get update -y && \ - apt-get upgrade -y && \ - apt-get install -y --no-install-recommends \ - ca-certificates \ - curl gcc build-essential && \ - apt-get clean - -RUN mkdir -p /app && chown -R mambauser:mambauser /app - -USER mambauser - -RUN micromamba create -n env_otsu -c conda-forge gdal scikit-image click loguru +RUN pip install --no-cache-dir rasterio scikit-image click loguru && \ + python -c "import rasterio" ADD app.py /app/app.py + +ENTRYPOINT [] diff --git a/water-bodies/command-line-tools/otsu/app.py b/water-bodies/command-line-tools/otsu/app.py index 2c40f7d..08ad10b 100644 --- a/water-bodies/command-line-tools/otsu/app.py +++ b/water-bodies/command-line-tools/otsu/app.py @@ -1,12 +1,10 @@ """Command line tool to apply the Otsu threshold to a raster""" import click +import rasterio import numpy as np -from osgeo import gdal from skimage.filters import threshold_otsu from loguru import logger -gdal.UseExceptions() - def threshold(data): """Returns the Otsu threshold of a numpy array""" return data > threshold_otsu(data[np.isfinite(data)]) @@ -20,30 +18,15 @@ def threshold(data): def otsu(raster): """Applies the Otsu threshold""" - logger.info(f"Applying the Otsu threshold to {raster}") - ds = gdal.Open(raster) - - driver = gdal.GetDriverByName("GTiff") - - dst_ds = driver.Create( - "otsu.tif", - ds.RasterXSize, - ds.RasterYSize, - 1, - gdal.GDT_Byte, - options=["TILED=YES", "COMPRESS=DEFLATE", "INTERLEAVE=BAND"], - ) + with rasterio.open(raster) as ds: + array = ds.read(1) + out_meta = ds.meta.copy() - dst_ds.SetGeoTransform(ds.GetGeoTransform()) - dst_ds.SetProjection(ds.GetProjectionRef()) - - array = ds.GetRasterBand(1).ReadAsArray().astype(float) - - dst_ds.GetRasterBand(1).WriteArray(threshold(array)) - dst_ds.GetRasterBand(1).SetNoDataValue(0) + logger.info(f"Applying the Otsu threshold to {raster}") - dst_ds = None - ds = None + with rasterio.open("otsu.tif", 'w', **out_meta) as dst_dataset: + logger.info(f"Write otsu.tif") + dst_dataset.write(threshold(array), indexes=1) logger.info("Done!") diff --git a/water-bodies/command-line-tools/stac/Dockerfile b/water-bodies/command-line-tools/stac/Dockerfile index 0cfad77..c48d697 100644 --- a/water-bodies/command-line-tools/stac/Dockerfile +++ b/water-bodies/command-line-tools/stac/Dockerfile @@ -1,21 +1,8 @@ -FROM mambaorg/micromamba +FROM docker.io/python:3.10-slim -USER root - -ENV PATH=/opt/conda/envs/env_stac/bin:$PATH - -RUN apt-get update -y && \ - apt-get upgrade -y && \ - apt-get install -y --no-install-recommends \ - ca-certificates \ - curl gcc build-essential && \ - apt-get clean - -USER mambauser - -RUN micromamba create -n env_stac -c conda-forge pystac python=3.9 pip loguru && \ - /opt/conda/envs/env_stac/bin/pip install rio_stac +RUN pip install --no-cache-dir pystac rio_stac loguru click && \ + python -c "import rio_stac" ADD app.py /app/app.py -WORKDIR /home/mambauser +ENTRYPOINT [] \ No newline at end of file