lib/nswtopo/layer/raster.rb



module NSWTopo
  module Raster
    using Helpers
    def create
      Dir.mktmppath do |temp_dir|
        args = ["-t_srs", @map.projection, "-r", "bilinear", "-cutline", "GeoJSON:/vsistdin/", "-te", *@map.te, "-of", "GTiff", "-co", "TILED=YES"]
        args += ["-tr", @mm_per_px, @mm_per_px] if Numeric === @mm_per_px
        OS.gdalwarp *args, get_raster(temp_dir), "/vsistdout/" do |stdin|
          stdin.puts @map.cutline.to_json
        end.then do |tif|
          @map.write filename, tif
        end
      end
    end

    def filename
      "#{@name}.tif"
    end

    def empty?
      false
    end

    def image_element
      REXML::Element.new("image").tap do |image|
        tif = @map.read filename
        OS.gdalinfo "-json", "/vsistdin/" do |stdin|
          stdin.binmode.write tif
        end.then do |json|
          JSON.parse(json).values_at "size", "geoTransform"
        end.then do |(width, height), (_, mm_per_px, *)|
          image.add_attributes "width" => width, "height" => height, "transform" => "scale(#{mm_per_px})"
        end
        OS.gdal_translate "-of", "PNG", "-co", "ZLEVEL=9", "/vsistdin/", "/vsistdout/" do |stdin|
          stdin.binmode.write tif
        end.then do |png|
          image.add_attributes "href" => "data:image/png;base64,#{Base64.encode64 png}", "image-rendering" => "optimizeQuality"
        end
      end
    end

    def to_s
      OS.gdalinfo "-json", "/vsistdin/" do |stdin|
        stdin.binmode.write @map.read(filename)
      end.then do |json|
        JSON.parse(json).values_at "size", "geoTransform"
      end.then do |(width, height), (_, mm_per_px, *)|
        resolution, ppi = @map.to_metres(mm_per_px), 25.4 / mm_per_px
        megapixels = width * height / 1024.0 / 1024.0
        "%s: %i×%i (%.1fMpx) @ %.3gm/px (%.3g ppi)" % [@name, width, height, megapixels, resolution, ppi]
      end
    end
  end
end