Module: OGR::GeometryTypes::Container

Included in:
OGR::GeometryCollection, MultiLineString, MultiPoint, MultiPolygon, Polygon
Defined in:
lib/ogr/geometry_types/container.rb

Instance Method Summary collapse

Instance Method Details

#add_geometry(sub_geometry) ⇒ Object

If this geometry is a container, this adds geometry to the container. If this is a Polygon, geometry must be a LinearRing. If the Polygon is empty, the first added geometry will be the exterior ring. Subsequent geometries added will be interior rings.

Parameters:

Raises:



13
14
15
16
17
18
19
# File 'lib/ogr/geometry_types/container.rb', line 13

def add_geometry(sub_geometry)
  sub_geometry_ptr = GDAL._pointer(OGR::Geometry, sub_geometry)

  OGR::ErrorHandling.handle_ogr_err("Unable to add geometry: #{sub_geometry}") do
    FFI::OGR::API.OGR_G_AddGeometry(@c_pointer, sub_geometry_ptr)
  end
end

#add_geometry_directly(sub_geometry) ⇒ Object

Parameters:

Raises:



23
24
25
26
27
28
29
# File 'lib/ogr/geometry_types/container.rb', line 23

def add_geometry_directly(sub_geometry)
  sub_geometry_ptr = GDAL._pointer(OGR::Geometry, sub_geometry, autorelease: false)

  OGR::ErrorHandling.handle_ogr_err("Unable to add geometry directly: #{sub_geometry}") do
    FFI::OGR::API.OGR_G_AddGeometryDirectly(@c_pointer, sub_geometry_ptr)
  end
end

#geometry_at(sub_geometry_index) ⇒ OGR::Geometry Also known as: geometry_ref

If this geometry is a container, this fetches the geometry at the sub_geometry_index.

Parameters:

Returns:



47
48
49
50
51
52
53
# File 'lib/ogr/geometry_types/container.rb', line 47

def geometry_at(sub_geometry_index)
  build_geometry do
    tmp_ptr = FFI::OGR::API.OGR_G_GetGeometryRef(@c_pointer, sub_geometry_index)
    tmp_ptr.autorelease = false
    tmp_ptr.null? ? nil : FFI::OGR::API.OGR_G_Clone(tmp_ptr)
  end
end

#polygon_from_edges(tolerance, auto_close: false) ⇒ OGR::Geometry

Build a ring from a bunch of arcs. The collection must be a MultiLineString or GeometryCollection.

Parameters:

  • tolerance (Float)
  • auto_close (Boolean) (defaults to: false)

Returns:

Raises:



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/ogr/geometry_types/container.rb', line 63

def polygon_from_edges(tolerance, auto_close: false)
  best_effort = false

  ogrerr_ptr = FFI::MemoryPointer.new(:pointer)

  new_geometry_ptr = FFI::OGR::API.OGRBuildPolygonFromEdges(@c_pointer,
                                                            best_effort,
                                                            auto_close,
                                                            tolerance,
                                                            ogrerr_ptr)

  OGR::ErrorHandling.handle_ogr_err("Unable to create polygon from edges") do
    FFI::OGR::Core::Err[ogrerr_ptr.read_int]
  end

  OGR::Geometry.factory(new_geometry_ptr)
end

#remove_geometry(geometry_index, delete: true) ⇒ Object

Parameters:

  • geometry_index (Integer)
  • delete (Boolean) (defaults to: true)

Raises:



34
35
36
37
38
39
40
# File 'lib/ogr/geometry_types/container.rb', line 34

def remove_geometry(geometry_index, delete: true)
  msg = "Unable to add remove geometry at index #{geometry_index} (delete? #{delete})"

  OGR::ErrorHandling.handle_ogr_err(msg) do
    FFI::OGR::API.OGR_G_RemoveGeometry(@c_pointer, geometry_index, delete)
  end
end