# using bashisms

SHELL    = /bin/bash

# notes:
# - "75" in fact means 7.5 (30 means 30 ;-)
# - mn = mean average

SRC_GMTED2010_30     = http://igskmncngs506.cr.usgs.gov/gmted/Grid_ZipFiles/mn30_grd.zip
SRC_GMTED2010_30_MD5 = 8c7a1564b7ac516d3274203f0f4464b7
GMTED2010_30_EXTENT = -180.0001388888888888888 83.9998611111111111111 179.9998611111111111111 -90.0001388888888888888
SRC_GMTED2010_75     = http://igskmncngs506.cr.usgs.gov/gmted/Grid_ZipFiles/mn75_grd.zip
SRC_GMTED2010_75_MD5 = 06c76ac6c5c2aa026404f3a803d66600
GMTED2010_75_EXTENT = -180.0001388888888888888 83.9998611111111111111 179.9998611111111111111 -56.0001388888888888888

SRC_SRTM3 = http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/
SRC_SRTM3_MD5 = e7e821379b425d62e480bdf792439130

PACKAGE  = freedem
VERSION  = 1.1

INSTALL = install
INSTALL_DATA = $(INSTALL) -m 644

GEOTIFF_OPTIONS    = -of GTiff -co "TILED=YES" -co "COMPRESS=DEFLATE" -co "ZLEVEL=7" -co "PREDICTOR=2"
#GDAL_TRANSLATE     = CPL_DEBUG=ON time gdal_translate -a_srs epsg:4326 --debug on $(GEOTIFF_OPTIONS)
GDAL_TRANSLATE     = time gdal_translate -a_srs epsg:4326 $(GEOTIFF_OPTIONS)
GDAL_TRANSLATE_VRT = CPL_DEBUG=ON time gdal_translate --debug on -of vrt
GDAL_WARP          = CPL_DEBUG=ON time gdalwarp -multi -of vrt -overwrite
GDAL_HILLSHADE     = CPL_DEBUG=ON time gdaldem hillshade

DATAFILES = gmted2010_mn.tif.aux.xml gmted2010_mn.tif gmted2010_mn_grass.vrt gmted2010_upsampled.vrt gmted2010_mn_remote.vrt srtm3.tif.aux.xml srtm3.tif srtm3_remote.vrt freedem.tif.aux.xml freedem.tif freedem_remote.vrt freedem_grass.vrt

# to enable hill shading uncomment (not yet ready):
# DATAFILES += gmted2010_mn_hill.tif.aux.xml gmted2010_mn_hill_grass.vrt

# additional overlap
FREEDEM_OVERLAP=2

all: $(DATAFILES)

download30.stamp:
	[ "$$(md5sum mn30_grd.zip |cut -f 1 -d " ")" = "$(SRC_GMTED2010_30_MD5)" ] || { wget -nc "$(SRC_GMTED2010_30)" && [ "$$(md5sum mn30_grd.zip |cut -f 1 -d " ")" = "$(SRC_GMTED2010_30_MD5)" ] ; } && touch $@ || { echo "Checksum mismatch" >&2 ; false ; }

download75.stamp:
	[ "$$(md5sum mn75_grd.zip |cut -f 1 -d " ")" = "$(SRC_GMTED2010_75_MD5)" ] || { wget -nc "$(SRC_GMTED2010_75)" && [ "$$(md5sum mn75_grd.zip |cut -f 1 -d " ")" = "$(SRC_GMTED2010_75_MD5)" ] ; } && touch $@ || { echo "Checksum mismatch" >&2 ; false ; }

unpack30.stamp: download30.stamp
	mkdir mn30 && cd mn30 && unzip ../mn30_grd.zip && cd .. && touch $@

unpack75.stamp: download75.stamp
	mkdir mn75 && cd mn75 && unzip ../mn75_grd.zip && cd .. && touch $@

gmted2010_mn30.tif: unpack30.stamp
	$(GDAL_TRANSLATE) mn30/mn30_grd/prj.adf $@
	gdalinfo $@ | grep 'Left\|Right\|Size'
	# todo: maybe remove again / gdal is right? (i don't think so / i hate those pixel shift issues)
	# todo: pixel size is strange?!
	gdal_edit.py -a_ullr $(GMTED2010_30_EXTENT) $@
	gdalinfo $@ | grep 'Left\|Right\|Size'

# cut out needed area (Antarctic)
gmted2010_mn30_needed.vrt: gmted2010_mn30.tif
	$(GDAL_TRANSLATE_VRT) -srcwin 0 16800 43200 4080 $< $@

gmted2010_mn30_needed_left.vrt: gmted2010_mn30_needed.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin 0 0 4 4080 $< $@

gmted2010_mn30_needed_left_wrapped.vrt: gmted2010_mn30_needed_left.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ 360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

gmted2010_mn30_needed_right.vrt: gmted2010_mn30_needed.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin $$[43200-4] 0 4 4080 $< $@

gmted2010_mn30_needed_right_wrapped.vrt: gmted2010_mn30_needed_right.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ -360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

gmted2010_mn30_needed_wrapped.vrt: gmted2010_mn30_needed.vrt gmted2010_mn30_needed_left_wrapped.vrt gmted2010_mn30_needed_right_wrapped.vrt
	gdalbuildvrt $@ gmted2010_mn30_needed.vrt gmted2010_mn30_needed_left_wrapped.vrt gmted2010_mn30_needed_right_wrapped.vrt

# upsample from 30" to 7.5"
gmted2010_mn30_upsampled.vrt: gmted2010_mn30_needed_wrapped.vrt
	# todo:
	# - cubic really good idea?
	# - check input size?!
	$(GDAL_WARP) -r cubic -ts $$[(43200+4+4)*4] $$[4080*4] -dstnodata -32768 $< $@
	sed -i 's,</NoDataValue>,</NoDataValue>\n<ColorInterp>Gray</ColorInterp>,g' $@

# greenland is missing in 7.5" data => use 30" for greenland, too
gmted2010_mn30_greenland.vrt: gmted2010_mn30.tif
	$(GDAL_TRANSLATE_VRT) -projwin -73.06 83.9998611 -11.5 59.475 $< $@

gmted2010_mn75.tif: unpack75.stamp
	$(GDAL_TRANSLATE) mn75/mn75_grd/prj.adf $@
	gdalinfo $@ | grep 'Left\|Right\|Size'
	# todo: maybe remove again / gdal is right? (i don't think so / i hate those pixel shift issues)
	gdal_edit.py -a_ullr $(GMTED2010_75_EXTENT) $@
	gdalinfo $@ | grep 'Left\|Right\|Size'

gmted2010_mn75_left.vrt: gmted2010_mn75.tif
	$(GDAL_TRANSLATE_VRT) -srcwin 0 0 $$[4*4] 67200 $< $@

gmted2010_mn75_right.vrt: gmted2010_mn75.tif
	# todo: check input size?
	$(GDAL_TRANSLATE_VRT) -srcwin $$[172800-(4*4)] 0 $$[4*4] 67200 $< $@

gmted2010_mn75_left_wrapped.vrt: gmted2010_mn75_left.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ 360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

gmted2010_mn75_right_wrapped.vrt: gmted2010_mn75_right.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ -360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

gmted2010_mn75_wrapped.vrt: gmted2010_mn75.tif gmted2010_mn75_left_wrapped.vrt gmted2010_mn75_right_wrapped.vrt
	gdalbuildvrt $@  gmted2010_mn75.tif gmted2010_mn75_left_wrapped.vrt gmted2010_mn75_right_wrapped.vrt

gmted2010_mn75_greenland.vrt: gmted2010_mn75.tif
	$(GDAL_TRANSLATE_VRT) -projwin -73.06 83.9998611 -11.5 59.475 $< $@

gmted2010_mn30_greenland.tif: gmted2010_mn30_greenland.vrt gmted2010_mn75_greenland.vrt
	PATH=$$PATH:. ./extract-greenland $$PWD $^ $@

gmted2010_greenland_upsampled.vrt: gmted2010_mn30_greenland.tif
	# todo: make sure input size is correct?
	# note: cubic resampling produced artifacts
	$(GDAL_WARP) -r bilinear -ts $$[7387*4] $$[2943*4] -srcnodata -32768 -dstnodata -32768 $< $@
	sed -i 's,</NoDataValue>,</NoDataValue>\n<ColorInterp>Gray</ColorInterp>,g' $@

# note: we want to align to srtm3 grid!
gmted2010_upsampled.vrt: gmted2010_mn.tif.aux.xml
	$(GDAL_WARP) -r cubic -te -180.000416666666666666666666666666666666666 -90.000416666666666666666666666666666666666 180.000416666666666666666666666666666666666  83.999583333333333333333333333333333333333 -tr 0.00083333333333333333333333333333 -0.00083333333333333333333333333333 -dstnodata -32768 gmted2010_mn.tif $@
	sed -i 's,</NoDataValue>,</NoDataValue>\n<ColorInterp>Gray</ColorInterp>,g' $@

gmted2010_upsampled_left.vrt: gmted2010_upsampled.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin 1 0 $$[1+20] 208800 $< $@

gmted2010_upsampled_left_wrapped.vrt: gmted2010_upsampled_left.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ 360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

gmted2010_upsampled_right.vrt: gmted2010_upsampled.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin $$[432001-20-1] 0 20 208800 $< $@

gmted2010_upsampled_right_wrapped.vrt: gmted2010_upsampled_right.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ -360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

gmted2010_upsampled_wrapped.vrt: gmted2010_upsampled.vrt gmted2010_upsampled_left_wrapped.vrt gmted2010_upsampled_right_wrapped.vrt
	gdalbuildvrt $@ gmted2010_upsampled.vrt gmted2010_upsampled_left_wrapped.vrt  gmted2010_upsampled_right_wrapped.vrt

%.stats: %.tif.aux.xml
	gosh -u sxml.sxpath -u sxml.ssax -u sxml.serializer -e '(print (srl:sxml->xml-noindent `(*TOP* ,((car-sxpath '\''(// Metadata)) (ssax:xml->sxml (current-input-port) '\''())))))' < $< > $@

gmted2010_mn_remote.vrt: gmted2010_mn.tif.aux.xml gmted2010_mn.stats
	# todo:
	# - why does it loose statistics?
	# - how to include histogram in vrt?
	gdalbuildvrt $@ gmted2010_mn.tif
	sed -i '-e s,SourceFilename relativeToVRT="1">gmted2010_mn.tif</SourceFilename,SourceFilename>/vsicurl/http://karme.de/freedem/data/gmted2010_mn.tif</SourceFilename,g' -e 's,<VRTRasterBand dataType="Int16" band="1">,<VRTRasterBand dataType="Int16" band="1">\n'"$$(cat gmted2010_mn.stats)"',g' $@

# todo: use $^ ?
gmted2010_mn.vrt: gmted2010_mn75_wrapped.vrt gmted2010_mn30_upsampled.vrt gmted2010_greenland_upsampled.vrt
	gdalbuildvrt $@ gmted2010_mn75_wrapped.vrt gmted2010_mn30_upsampled.vrt gmted2010_greenland_upsampled.vrt

download_srtm3.stamp:
	wget --mirror --limit-rate=1m -A .hgt.zip -np "$(SRC_SRTM3)" && touch $@

# srtm3 specific stuff

srtm3.md5: download_srtm3.stamp
	find -wholename "*/SRTM3/*.hgt.zip" -exec md5sum \{\} \+ | sort > $@

srtm3_checksum.stamp: srtm3.md5
	[ "$$(md5sum $< |cut -f 1 -d " ")" = "$(SRC_SRTM3_MD5)" ] || { echo "Checksum mismatch" >&2 ; false ; }

srtm3.vrt: srtm3_checksum.stamp
	gdalbuildvrt $@ -input_file_list <(for i in $$(find -wholename "*/SRTM3/*.hgt.zip"); do b=$$(basename "$$i"); echo /vsizip/$$i/$$(echo $${b%*.zip}| sed -e s/N24e012.hgt/n24e012.hgt/ -e s/S17w069.hgt/s17w069.hgt/) ; done)

# todo: duplicate
srtm3_remote.vrt: srtm3.tif.aux.xml srtm3.stats
	gdalbuildvrt $@ srtm3.tif
	sed -i '-e s,SourceFilename relativeToVRT="1">srtm3.tif</SourceFilename,SourceFilename>/vsicurl/http://karme.de/freedem/data/srtm3.tif</SourceFilename,g' -e 's,<VRTRasterBand dataType="Int16" band="1">,<VRTRasterBand dataType="Int16" band="1">\n'"$$(cat srtm3.stats)"',g' $@

# combine srtm3 and gmted2010
freedem1.vrt: gmted2010_upsampled.vrt srtm3.tif.aux.xml
	gdalbuildvrt $@ gmted2010_upsampled.vrt srtm3.tif

freedem_left.vrt: freedem1.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin 1 0 $(FREEDEM_OVERLAP) 208800 $< $@

freedem_left_wrapped.vrt: freedem_left.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ 360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

freedem_right.vrt: freedem1.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin $$[432001-$(FREEDEM_OVERLAP)-1] 0 $(FREEDEM_OVERLAP) 208800 $< $@

freedem_right_wrapped.vrt: freedem_right.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ -360 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

freedem2.vrt: freedem1.vrt freedem_left_wrapped.vrt freedem_right_wrapped.vrt
	gdalbuildvrt $@ freedem1.vrt freedem_left_wrapped.vrt freedem_right_wrapped.vrt

# didn't work because gdalbuildvrt does not support positive NS resolution"
#freedem_down_left_wrapped.vrt: freedem_down_left.vrt
#	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-matrix-mul $@ 1 0 180 0 -1 -180  1 0 0 0 1 0 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

# 432005
freedem_down_left1.vrt: freedem2.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin $$[0+2] $$[208800-1-1] $$[432005/2+1] 1 $< $@

freedem_down_right1.vrt: freedem2.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin $$[432005/2-2] $$[208800-1-1] $$[432005/2+1] 1 $< $@

freedem_down_left1_wrapped.vrt: freedem_down_left1.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ 180 -0.0016666666666666666666666666666666666666 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

freedem_down_right1_wrapped.vrt: freedem_down_right1.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ -180 -0.0016666666666666666666666666666666666666 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

freedem_down_left2.vrt: freedem2.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin $$[0+2] $$[208800-2-1] $$[432005/2+1] 1 $< $@

freedem_down_right2.vrt: freedem2.vrt
	$(GDAL_TRANSLATE_VRT) -srcwin $$[432005/2-2] $$[208800-2-1] $$[432005/2+1] 1 $< $@

freedem_down_left2_wrapped.vrt: freedem_down_left2.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ 180 -0.0033333333333333333333333333333333333333 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

freedem_down_right2_wrapped.vrt: freedem_down_right2.vrt
	cp -v $< $@ && gdalinfo $@ | grep 'Left\|Right\|Size' && ./gdal-offset $@ -180 -0.0033333333333333333333333333333333333333 && gdalinfo $@ | grep 'Left\|Right\|Size' || { rm -v $@ ; false ; }

freedem_down_wrapped.vrt: freedem_down_left1_wrapped.vrt freedem_down_right1_wrapped.vrt freedem_down_left2_wrapped.vrt freedem_down_right2_wrapped.vrt
	gdalbuildvrt $@ freedem_down_left1_wrapped.vrt freedem_down_right1_wrapped.vrt freedem_down_left2_wrapped.vrt freedem_down_right2_wrapped.vrt

freedem.vrt: freedem2.vrt freedem_down_wrapped.vrt
	gdalbuildvrt $@ freedem2.vrt freedem_down_wrapped.vrt

# todo: duplicate
freedem_remote.vrt: freedem.tif.aux.xml freedem.stats
	gdalbuildvrt $@ freedem.tif
	sed -i '-e s,SourceFilename relativeToVRT="1">freedem.tif</SourceFilename,SourceFilename>/vsicurl/http://karme.de/freedem/data/freedem.tif</SourceFilename,g' -e 's,<VRTRasterBand dataType="Int16" band="1">,<VRTRasterBand dataType="Int16" band="1">\n'"$$(cat freedem.stats)"',g' $@

%.tif.aux.xml: %.tif
	GDAL_TIFF_OVR_BLOCKSIZE=256 time gdaladdo -r average $< 2 4 8 16 32 64 128 256 512
	# force recalculation
	test -f $@ && rm -v $@ || true
	# this calculates statistics (gdal_tranlate can do this, too!)
	time gdalinfo -stats $<
	# only reports?
	time gdalinfo -mm $<
	# only reports?
	time gdalinfo -hist $<

%.tif : %.vrt
	$(GDAL_TRANSLATE) -co "BIGTIFF=YES" $< $@

# for testing
greenland.tif: gmted2010_mn.vrt
	$(GDAL_TRANSLATE) -projwin -73.06 83.9998611 -11.5 59.475 $< $@

foo.tif: gmted2010_mn75.tif
	$(GDAL_TRANSLATE) -projwin -43.43 60.07 -42.96 59.81 $< $@

%.right1.tif : %.vrt
	$(GDAL_TRANSLATE) -projwin 179.9 67 $$(gdalinfo $<|grep '^Upper Right'|sed 's/Upper Right (\([^,]*\),.*/\1/') 66 $< $@

%.right1.shifted.tif : %.right1.tif
	cp -v $< $@ && ./gdal-offset $@ -10

%.right2.tif : %.vrt
	$(GDAL_TRANSLATE) -projwin 179.9 -84 $$(gdalinfo $<|grep '^Upper Right'|sed 's/Upper Right (\([^,]*\),.*/\1/') -85 $< $@

%.right2.shifted.tif : %.right2.tif
	cp -v $< $@ && ./gdal-offset $@ -10

%.vtk: %.tif
	PATH=$$PATH:. ./tif2vtk $$PWD $< $@

# note: hill shading / huge and slow
# todo: maybe split into overlaping tiles, hillshade, combine
gmted2010_mn_hill_uncompressed.tif: gmted2010_mn.tif.aux.xml
	$(GDAL_HILLSHADE) gmted2010_mn.tif $@ -s 111120 -co "BIGTIFF=YES"

gmted2010_mn_hill.tif: gmted2010_mn_hill_uncompressed.tif
	$(GDAL_TRANSLATE) $< $@

# grass doesn't like sub-pixel extent overlap
# (s.a. http://trac.osgeo.org/grass/ticket/1734)
# todo: statistics? not used by grass anyway?
gmted2010_mn_grass.vrt: gmted2010_mn.tif.aux.xml
	# todo: check size?! 172800 83520
	$(GDAL_TRANSLATE_VRT) -srcwin 1 0 $$[172800-1] $$[83520-1] gmted2010_mn.tif $@

gmted2010_mn_hill_grass.vrt: gmted2010_mn_hill.tif.aux.xml
	$(GDAL_TRANSLATE_VRT) -srcwin 1 0 $$[172800-1] $$[83520-1] gmted2010_mn_hill.tif $@

# grass doesn't like sub-pixel extent overlap
# (s.a. http://trac.osgeo.org/grass/ticket/1734)
# todo: statistics? not used by grass anyway?
freedem_grass.vrt: freedem.tif.aux.xml
	# todo: check size?!
	$(GDAL_TRANSLATE_VRT) -srcwin $$[1+$(FREEDEM_OVERLAP)] 0 $$[432001-2-(2*$(FREEDEM_OVERLAP))] $$[208800-1] freedem.tif $@

# todo: include those?

gmted2010_mn_color.vrt : gmted2010_mn.tif.aux.xml
	gdaldem color-relief gmted2010_mn.tif /usr/lib/grass64/etc/colors/srtm gmted2010_mn_color.vrt -of vrt

# create contour shape? todo: really simplify?!
gmted2010_mn_contour.shp: gmted2010_mn.tif.aux.xml
	time gdal_contour gmted2010_mn.tif delme.shp -i 100 -a z
	time ogr2ogr -simplify 0.0005 $@ delme.shp
	rm -v delme.*

clean:
	rm -vf $(DATAFILES)
	rm -vf *.stamp *~ gmted2010*.tif gmted2010*.vrt *.stats *.aux.xml srtm3.md5
	rm -rvf mn30 mn75

dist-clean: clean
	rm -vf *.zip
	rm -rfv dds.cr.usgs.gov

installdirs:
	$(INSTALL) -d $(DESTDIR)/usr/share/freedem
	$(INSTALL) -d $(DESTDIR)/usr/share/doc/$(PACKAGE)

install: installdirs
	$(INSTALL_DATA) $(DATAFILES) $(DESTDIR)/usr/share/freedem
	$(INSTALL_DATA) README COPYING ChangeLog $(DESTDIR)/usr/share/doc/$(PACKAGE)

dist:
	mkdir $(PACKAGE)-$(VERSION) && cp -v Makefile README INSTALL COPYING TODO ChangeLog grass-script gdal-offset extract-greenland tif2vtk $(PACKAGE)-$(VERSION) && tar czvf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION) && rm -rf $(PACKAGE)-$(VERSION)
