Skip to content

Instantly share code, notes, and snippets.

@enigmoe
Last active December 20, 2018 00:19
Show Gist options
  • Save enigmoe/20e41c471277c1192edc9f8b1ca0a678 to your computer and use it in GitHub Desktop.
Save enigmoe/20e41c471277c1192edc9f8b1ca0a678 to your computer and use it in GitHub Desktop.
GDAL Merge, clip and translate #satellite #geo #qgis
#!/bin/bash
# why the previous line? I wondered, too; here lies the answer: https://stackoverflow.com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-beginning-of-a-script-file#8967916
# Before you proceed: Make sure you have a
# directory called 'input' containing your tifs.
# You also need a directory named 'aoi' for your areas-of-interest.
# Also important and not optional:
# The .tif files have to have the or a date at the front in the
# form of YYYY-MM-DD or the script won't find them.
# config your script variables
# remove tifs after creating the jpgs?
clean_up=true
# do you want to directly resize the images to a certain size?
resize=true
target_srs=EPSG:3857
# the names of your aoi GeoJSONs
aoi_1=mobile
aoi_2=desktop
# if resize=true, set the size of one side per aoi here:
aoi_1_height=640
# aoi_1_width=\480
# aoi_2_height=\900
aoi_2_width=1440
# you can try and go down to 80 or 75
# if you're looking to reduce file size:
jpg_quality=92
echo "This may take a few minutes, depending on the amount of tifs. For 8 tifs with each at ~60MB it takes ~1 minute."
# Step Zero: Check and create directories
echo "Checking and building output directory:"
if test ! -d output/jpg/ ;
then mkdir output ;
echo "Directory 'output' does not exist; creating..." ;
fi
if test ! -d output/jpg/ ;
then mkdir output/jpg/ ;
echo "Directory 'output/jpg/' does not exist; creating..." ;
fi
if test ! -d output/tif/ ;
then mkdir output/tif/ ;
echo "Directory 'output/tif/' does not exist; creating..." ;
fi
for date in $(ls input | grep -oP "\d{4}-\d{2}-\d{2}" | uniq)
do
echo "Merging tifs for $date..."
# Step One: Merge all tiffs in the folder
gdal_merge.py -n 0 -a_nodata 0 -ot Byte -of GTiff -o output/tif/$date-merged.tif input/$date*.tif
# Step Two: Cropping to cutline; converting/translating to jpg; resizing jpg
# 1st AOI
gdalwarp -of GTiff -cutline aoi/$aoi_1.geojson -crop_to_cutline -dstnodata 0.0 -t_srs $target_srs -overwrite output/tif/$date-merged.tif output/tif/$date-$aoi_1.tif
gdal_translate -a_srs $target_srs -a_nodata 0.0 -ot Byte -of JPEG output/tif/$date-$aoi_1.tif output/jpg/$date-$aoi_1.jpg
if $resize ; then
convert -quality $jpg_quality -resize $aoi_1_width\x$aoi_1_height output/jpg/$date-$aoi_1.jpg output/jpg/$date-$aoi_1.jpg ;
fi
# 2nd AOI
gdalwarp -of GTiff -cutline aoi/$aoi_2.geojson -crop_to_cutline -dstnodata 0.0 -t_srs $target_srs -overwrite output/tif/$date-merged.tif output/tif/$date-$aoi_2.tif
gdal_translate -a_srs $target_srs -a_nodata 0.0 -ot Byte -of JPEG output/tif/$date-$aoi_2.tif output/jpg/$date-$aoi_2.jpg
if $resize ; then
convert -quality $jpg_quality -resize $aoi_2_width\x$aoi_2_height output/jpg/$date-$aoi_2.jpg output/jpg/$date-$aoi_2.jpg ;
fi
# removes the big merged tif to free space
if $clean_up ;
then rm output/tif/$date-merged.tif ;
fi
done
# Step Three: Cleaning up the working directory
if $clean_up ;
then echo "Variable 'clean_up' is set to 'true'; removing tifs..." ;
rm output/tif/*-$aoi_1.tif ;
rm output/tif/*-$aoi_2.tif ;
fi
# removes unnecessary files
echo "Removing unnecessary XML files..."
rm output/jpg/*.xml
# if you didn't comment out the output-tif-removal above,
# the following will remove the empty folder
if test ! -d output/tif/*.tif ;
then rm -r output/tif/ ;
echo "The tif directory is empty; removing it for tidyness" ;
else
echo "The tif directory is not empty; keeping it" ;
fi
echo "Yay, finished!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment