Sha256: ff8d37e3bfd8a3c027792f57d4ce3ec8ee012f0e571597dd8b78b111fdac838f

Contents?: true

Size: 1.52 KB

Versions: 3

Compression:

Stored size: 1.52 KB

Contents

# frozen_string_literal: true

require "bundler/setup"
require "thor"
require "fileutils"
require "gdal/dataset"
require "gdal/raster_band"
require "gdal/raster_band/algorithm_extensions"

GDAL::Logger.logging_enabled = true

module Examples
  class RasterErasing < ::Thor
    desc "erase SOURCE DEST", "Erase (clip) pixels from the center of the first raster band in SOURCE to DEST"
    def erase(source_path, dest_path)
      FileUtils.cp(source_path, dest_path)
      dest_dataset = GDAL::Dataset.open(dest_path, "w")
      geo_transform = dest_dataset.geo_transform

      raster_band = dest_dataset.raster_band(1)
      extent_polygon = buffer_extent(dest_dataset.extent)

      if extent_polygon.empty?
        raise "Poorly buffered extent--you should play with these values to get this demo to work."
      end

      raster_point = OGR::Point.new
      start = Time.now

      raster_band.simple_erase! do |x, y|
        coords = geo_transform.apply_geo_transform(x, y)
        raster_point.set_point(0, coords[:x_geo], coords[:y_geo])
        !raster_point.within? extent_polygon
      end

      dest_dataset.close

      puts "Erased dataset in #{Time.now - start}s. Output at '#{dest_path}'"
    end

    private

    def buffer_extent(extent_polygon)
      buffer_size = if extent_polygon.area > 1
                      extent_polygon.area / -5000
                    else
                      extent_polygon.area / -0.5
                    end

      extent_polygon.buffer(buffer_size)
    end
  end
end

Examples::RasterErasing.start(ARGV)

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ffi-gdal-1.1.0 examples/raster_erasing.rb
ffi-gdal-1.0.4 examples/raster_erasing.rb
ffi-gdal-1.0.3 examples/raster_erasing.rb