module NSWTopo::GDALGlob

Public Instance Methods

gdal_raster?(format) click to toggle source
# File lib/nswtopo/gis/gdal_glob.rb, line 3
def gdal_raster?(format)
  @gdal_formats ||= OS.gdalinfo("--formats").each_line.drop(1).map do |line|
    line.strip.split(?\s).first
  end - %w[PDF]
  @gdal_formats.include? format
end
gdal_rasters(path) { |index| ... } click to toggle source
# File lib/nswtopo/gis/gdal_glob.rb, line 10
def gdal_rasters(path)
  paths = Array(path).flat_map do |path|
    Pathname.glob Pathname(path).expand_path
  end

  total = nil
  Enumerator.new do |yielder|
    while path = paths.pop
      OS.gdalmanage("identify", "-r", "-u", path).each_line.map do |line|
        line.chomp.split ": "
      end.each do |component, format|
        case
        when gdal_raster?(format) then yielder << component
        when path == component 
        when component !~ /\.zip$/
        else paths << "/vsizip/#{component}"
        end
      end
    end
  end.entries.tap do |paths|
    total = paths.length
  end.map.with_index do |path, index|
    yield [index + 1, total] if block_given?
    info = JSON.parse OS.gdalinfo("-json", path)
    next unless info["geoTransform"]
    next unless wkt = info.dig("coordinateSystem", "wkt")
    next path, info
  rescue JSON::ParserError
  end.compact
end