class GDAL::GeoTransform
Attributes
@return [FFI::Pointer] C pointer to the C geo-transform.
Public Class Methods
@param [String] filename @param [String] extension The file extension to use. When nil, GDAL
will
try to derive it from the +filename+.
@return [GDAL::GeoTransform]
# File lib/gdal/geo_transform.rb, line 19 def self.from_world_file(filename, extension = nil) gt_ptr = new_pointer result = if extension FFI::GDAL::GDAL.GDALReadWorldFile(filename, extension, gt_ptr) else FFI::GDAL::GDAL.GDALLoadWorldFile(filename, gt_ptr) end return nil unless result new(gt_ptr) end
@param geo_transform [FFI::Pointer]
# File lib/gdal/geo_transform.rb, line 34 def initialize(geo_transform = nil) @c_pointer = geo_transform ? GDAL._pointer(GDAL::GeoTransform, geo_transform) : self.class.new_pointer self.pixel_width ||= 1.0 self.pixel_height ||= 1.0 self.x_rotation ||= 0.0 self.y_rotation ||= 0.0 end
@return [FFI::MemoryPointer] A pointer that can be used to hold a GeoTransform
.
# File lib/gdal/geo_transform.rb, line 8 def self.new_pointer FFI::MemoryPointer.new(:double, 6) end
Public Instance Methods
@param other [GDAL::GeoTransform] @return [Boolean]
# File lib/gdal/geo_transform.rb, line 45 def ==(other) return false unless other.is_a?(GDAL::GeoTransform) x_origin == other.x_origin && pixel_width == other.pixel_width && x_rotation == other.x_rotation && y_origin == other.y_origin && y_rotation == other.y_rotation && pixel_height == other.pixel_height end
Converts a (pixel, line) coordinate to a georeferenced (geo_x, geo_y) location. Uses the following algorithm:
geo_x = x_origin + (pixel * pixel_width) + (line * pixel_rotation) geo_y = y_origin + (pixel * y_rotation) + (line * pixel_height)
This is also the same as doing:
geo_transform.invert.world_to_pixel(pixel, line)
@param pixel [Float] Input pixel position. @param line [Float] Input line position. @return [Hash{x_geo => Float
, y_geo => Float}] :x_geo
is the # easting/longitude; :y_geo
is the northing/latitude.
# File lib/gdal/geo_transform.rb, line 164 def apply_geo_transform(pixel, line) geo_x_ptr = FFI::MemoryPointer.new(:double) geo_y_ptr = FFI::MemoryPointer.new(:double) FFI::GDAL::GDAL.GDALApplyGeoTransform(@c_pointer, pixel, line, geo_x_ptr, geo_y_ptr) { x_geo: geo_x_ptr.read_double, y_geo: geo_y_ptr.read_double } end
Composes this and the given geo_transform. The resulting GeoTransform
is equivalent to applying both GeoTransforms to a point.
@param other_geo_transform [GDAL::GeoTransform, FFI::Pointer] @return [GDAL::GeoTransform]
# File lib/gdal/geo_transform.rb, line 178 def compose(other_geo_transform) other_ptr = GDAL._pointer(GDAL::GeoTransform, other_geo_transform) raise GDAL::NullObject, "Unable to access pointer for '#{other_geo_transform}'" unless other_ptr new_gt_ptr = self.class.new_pointer FFI::GDAL::GDAL.GDALComposeGeoTransforms(@c_pointer, other_ptr, new_gt_ptr) return nil if new_gt_ptr.null? GDAL::GeoTransform.new(new_gt_ptr) end
Inverts the current 3x2 set of coefficients and returns a new GeoTransform
. Useful for converting from the GeoTransform
equation from pixel to geo to being geo to pixel.
@return [GDAL::GeoTransform]
# File lib/gdal/geo_transform.rb, line 195 def invert new_geo_transform_ptr = self.class.new_pointer success = FFI::GDAL::GDAL.GDALInvGeoTransform(@c_pointer, new_geo_transform_ptr) return nil unless success self.class.new(new_geo_transform_ptr) end
# File lib/gdal/geo_transform.rb, line 56 def null? @c_pointer.null? end
AKA Y-pixel size. In wikipedia’s World Map definition, this is “E”.
@return [Float]
# File lib/gdal/geo_transform.rb, line 139 def pixel_height return nil if null? @c_pointer[5].read_double end
@param new_pixel_height [Float]
# File lib/gdal/geo_transform.rb, line 146 def pixel_height=(new_pixel_height) @c_pointer[5].write_double(new_pixel_height) end
AKA X-pixel size. In wikipedia’s World Map definition, this is “A”.
@return [Float]
# File lib/gdal/geo_transform.rb, line 79 def pixel_width return nil if null? @c_pointer[1].read_double end
@param new_pixel_width [Float]
# File lib/gdal/geo_transform.rb, line 86 def pixel_width=(new_pixel_width) @c_pointer[1].write_double(new_pixel_width) end
@param raster_filename [String] The target raster file. @param world_extension [String] @return [Boolean]
# File lib/gdal/geo_transform.rb, line 206 def to_world_file(raster_filename, world_extension) FFI::GDAL::GDAL.GDALWriteWorldFile(raster_filename, world_extension, @c_pointer) end
X-coordinate of the center of the upper left pixel. In wikipedia’s World Map definition, this is “C”.
@return [Float]
# File lib/gdal/geo_transform.rb, line 64 def x_origin return nil if null? @c_pointer[0].read_double end
@param new_x_origin [Float]
# File lib/gdal/geo_transform.rb, line 71 def x_origin=(new_x_origin) @c_pointer[0].write_double(new_x_origin) end
Rotation about the x-axis. In wikipedia’s World File definition, this is “B”.
@return [Float]
# File lib/gdal/geo_transform.rb, line 94 def x_rotation return nil if null? @c_pointer[2].read_double end
@param new_x_rotation [Float]
# File lib/gdal/geo_transform.rb, line 101 def x_rotation=(new_x_rotation) @c_pointer[2].write_double(new_x_rotation) end
Y-coordinate of the center of the upper left pixel. In wikipedia’s World Map definition, this is “F”.
@return [Float]
# File lib/gdal/geo_transform.rb, line 109 def y_origin return nil if null? @c_pointer[3].read_double end
@param new_y_origin [Float]
# File lib/gdal/geo_transform.rb, line 116 def y_origin=(new_y_origin) @c_pointer[3].write_double(new_y_origin) end
Rotation about the y-axis. In wikipedia’s World Map definition, this is “D”.
@return [Float]
# File lib/gdal/geo_transform.rb, line 124 def y_rotation return nil if null? @c_pointer[4].read_double end
@param new_y_rotation [Float]
# File lib/gdal/geo_transform.rb, line 131 def y_rotation=(new_y_rotation) @c_pointer[4].write_double(new_y_rotation) end