Created
December 15, 2019 11:55
-
-
Save systemed/81f2f52a4aa8c2bd6238f378cef1466b to your computer and use it in GitHub Desktop.
Composite all hillshade layers into a single GeoTIFF
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Combine all hillshade layers into a single GeoTIFF | |
# Requires gdalcopyproj.py (which uses GDAL Python bindings) | |
require '/usr/local/share/ruby/ffi-mapnik/lib/ffi-mapnik.rb' | |
require 'nokogiri' | |
Mapnik.register_datasources("/usr/local/lib/mapnik/input") | |
Mapnik.register_fonts("/usr/local/share/maps/style/fonts") | |
# Choose directory and stylesheet paths | |
dir = "/usr/local/share/maps/relief" | |
ss = "/usr/local/share/maps/style/stylesheet.xml" | |
# Create a copy of the Mapnik style with all non-hillshade layers disabled | |
doc = Nokogiri::XML(File.open(ss)) | |
doc.search("Layer").each do |layer| | |
next if ["hillshade","relief","coloured_relief"].include?(layer['name']) | |
layer['status'] = 'off' | |
end | |
File.write("/tmp/hillshade.xml", doc.to_xml) | |
# Iterate through all files... | |
Dir.glob("#{dir}/*_hs3.tif").each do |fn| | |
puts File.basename(fn) | |
outfn = fn.gsub("_hs3.tif","_all.tif") | |
# Read image dimensions and coordinate information from original GeoTIFF | |
gdal = `gdalinfo "#{fn}"` | |
if gdal=~/Size is (\d+), (\d+)/ then width=$1.to_i; height=$2.to_i else puts "Couldn't find size"; exit end | |
if gdal=~/Upper Left .\s*([\-\d\.]+),\s*([\-\d\.]+)/ then w=$1.to_f; n=$2.to_f else puts "Couldn't find upper left "; exit end | |
if gdal=~/Lower Right .\s*([\-\d\.]+),\s*([\-\d\.]+)/ then e=$1.to_f; s=$2.to_f else puts "Couldn't find lower right"; exit end | |
puts "-- size #{width}x#{height}, bounds #{w},#{s},#{e},#{n}" | |
# Generate image with Mapnik | |
map = Mapnik::Map.new(10,10) | |
outbox = Mapnik::Bounds.new(w,s,e,n) | |
map.load("/tmp/hillshade.xml") | |
map.resize(width,height) | |
map.zoom_to(outbox) | |
map.to_file(outfn) | |
map.free | |
outbox.free | |
# Reinstate original GeoTIFF information | |
`gdalcopyproj.py "#{fn}" "#{outfn}"` | |
puts "-> #{outfn}" | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment