Skip to content

Instantly share code, notes, and snippets.

@systemed
Created December 15, 2019 11:55
Show Gist options
  • Select an option

  • Save systemed/81f2f52a4aa8c2bd6238f378cef1466b to your computer and use it in GitHub Desktop.

Select an option

Save systemed/81f2f52a4aa8c2bd6238f378cef1466b to your computer and use it in GitHub Desktop.

Revisions

  1. systemed created this gist Dec 15, 2019.
    48 changes: 48 additions & 0 deletions merge_mapnik.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,48 @@

    # 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