module OGR::Geometry::ClassMethods

Public Instance Methods

create(type) click to toggle source
# File lib/ogr/geometry.rb, line 9
def create(type)
  geometry_pointer = FFI::OGR::API.OGR_G_CreateGeometry(type)
  return if geometry_pointer.null?

  geometry_pointer.autorelease = false

  factory(geometry_pointer)
end
create_from_gml(gml_data) click to toggle source

@param gml_data [String] @return [OGR::Geometry]

# File lib/ogr/geometry.rb, line 100
def create_from_gml(gml_data)
  geometry_pointer = FFI::OGR::API.OGR_G_CreateFromGML(gml_data)

  _ = factory(geometry_pointer)
end
create_from_json(json_data) click to toggle source

@param json_data [String] @return [OGR::Geometry]

# File lib/ogr/geometry.rb, line 108
def create_from_json(json_data)
  geometry_pointer = FFI::OGR::API.OGR_G_CreateGeometryFromJson(json_data)

  factory(geometry_pointer)
end
create_from_wkb(wkb_data, spatial_ref = nil) click to toggle source

@param wkb_data [String] Binary string of WKB. @param spatial_ref [OGR::SpatialReference] @return [OGR::Geometry]

# File lib/ogr/geometry.rb, line 82
def create_from_wkb(wkb_data, spatial_ref = nil)
  wkb_data_pointer = FFI::MemoryPointer.new(:char, wkb_data.length)
  wkb_data_pointer.put_bytes(0, wkb_data)

  spatial_ref_pointer = GDAL._pointer(OGR::SpatialReference, spatial_ref) if spatial_ref

  geometry_ptr_ptr = GDAL._pointer_pointer(:pointer)

  byte_count = wkb_data.length
  FFI::OGR::API.OGR_G_CreateFromWkb(wkb_data_pointer, spatial_ref_pointer, geometry_ptr_ptr, byte_count)

  return if geometry_ptr_ptr.null? || geometry_ptr_ptr.read_pointer.null?

  factory(geometry_ptr_ptr.read_pointer)
end
create_from_wkt(wkt_data, spatial_ref = nil) click to toggle source

@param wkt_data [String] @param spatial_ref [FFI::Pointer] Optional spatial reference

to assign to the new geometry.

@return [OGR::Geometry]

# File lib/ogr/geometry.rb, line 60
def create_from_wkt(wkt_data, spatial_ref = nil)
  wkt_data_pointer = FFI::MemoryPointer.from_string(wkt_data)
  wkt_pointer_pointer = FFI::MemoryPointer.new(:pointer)
  wkt_pointer_pointer.write_pointer(wkt_data_pointer)

  spatial_ref_pointer = GDAL._pointer(OGR::SpatialReference, spatial_ref) if spatial_ref

  geometry_ptr = FFI::MemoryPointer.new(:pointer)
  geometry_ptr_ptr = FFI::MemoryPointer.new(:pointer)
  geometry_ptr_ptr.write_pointer(geometry_ptr)

  FFI::OGR::API.OGR_G_CreateFromWkt(wkt_pointer_pointer,
                                    spatial_ref_pointer, geometry_ptr_ptr)

  return if geometry_ptr_ptr.null? || geometry_ptr_ptr.read_pointer.null?

  factory(geometry_ptr_ptr.read_pointer)
end
factory(geometry) click to toggle source

Creates a new Geometry using the class of the geometry that the type represents.

@param geometry [OGR::Geometry, FFI::Pointer] @return [OGR::Geometry]

# File lib/ogr/geometry.rb, line 23
def factory(geometry)
  geometry = OGR::UnknownGeometry.new(geometry) unless geometry.is_a?(OGR::Geometry)

  new_pointer = geometry.c_pointer
  return if new_pointer.nil? || new_pointer.null?

  case geometry.type
  when :wkbPoint then OGR::Point.new(new_pointer)
  when :wkbPoint25D then OGR::Point25D.new(new_pointer)
  when :wkbLineString
    if /^LINEARRING/.match?(geometry.to_wkt)
      OGR::LinearRing.new(new_pointer)
    else
      OGR::LineString.new(new_pointer)
    end
  when :wkbLineString25D then OGR::LineString25D.new(new_pointer)
  when :wkbLinearRing then OGR::LinearRing.new(new_pointer)
  when :wkbPolygon then OGR::Polygon.new(new_pointer)
  when :wkbPolygon25D then OGR::Polygon25D.new(new_pointer)
  when :wkbMultiPoint then OGR::MultiPoint.new(new_pointer)
  when :wkbMultiPoint25D then OGR::MultiPoint25D.new(new_pointer)
  when :wkbMultiLineString then OGR::MultiLineString.new(new_pointer)
  when :wkbMultiLineString25D then OGR::MultiLineString25D.new(new_pointer)
  when :wkbMultiPolygon then OGR::MultiPolygon.new(new_pointer)
  when :wkbMultiPolygon25D then OGR::MultiPolygon25D.new(new_pointer)
  when :wkbGeometryCollection then OGR::GeometryCollection.new(new_pointer)
  when :wkbGeometryCollection25D then OGR::GeometryCollection25D.new(new_pointer)
  when :wkbNone then OGR::NoneGeometry.new(new_pointer)
  else
    geometry
  end
end
merge_geometry_types(main, extra) click to toggle source

Finds the most specific common geometry type from the two given types. Useful when trying to figure out what geometry type to report for an entire layer, when the layer uses multiple types.

@param main [FFI::OGR::WKBGeometryType] @param extra [FFI::OGR::WKBGeometryType] @return [FFI::OGR::WKBGeometryType] Returns :wkbUnknown when there is

no type in common.
# File lib/ogr/geometry.rb, line 133
def merge_geometry_types(main, extra)
  FFI::OGR::Core.OGRMergeGeometryTypes(main, extra)
end
release(pointer) click to toggle source

@param pointer [FFI::Pointer]

# File lib/ogr/geometry.rb, line 138
def release(pointer)
  return unless pointer && !pointer.null?

  FFI::OGR::API.OGR_G_DestroyGeometry(pointer)
end
type_to_name(type) click to toggle source

The human-readable string for the geometry type.

@param type [FFI::OGR::WKBGeometryType] @return [String]

# File lib/ogr/geometry.rb, line 118
def type_to_name(type)
  name, ptr = FFI::OGR::Core.OGRGeometryTypeToName(type)
  ptr.autorelease = false

  name
end