class Geos::Polygon

Public Instance Methods

dump_points(cur_path = []) click to toggle source
# File lib/ffi-geos/polygon.rb, line 36
def dump_points(cur_path = [])
  points = [exterior_ring.dump_points]

  interior_rings.each do |ring|
    points.push(ring.dump_points)
  end

  cur_path.concat(points)
end
exterior_ring() click to toggle source
# File lib/ffi-geos/polygon.rb, line 21
def exterior_ring
  cast_geometry_ptr(
    FFIGeos.GEOSGetExteriorRing_r(Geos.current_handle_pointer, ptr),
    auto_free: false,
    srid_copy: srid,
    parent: self
  )
end
interior_ring(n)
Alias for: interior_ring_n
interior_ring_n(n) click to toggle source
# File lib/ffi-geos/polygon.rb, line 9
def interior_ring_n(n)
  raise Geos::IndexBoundsError if n.negative? || n >= num_interior_rings

  cast_geometry_ptr(
    FFIGeos.GEOSGetInteriorRingN_r(Geos.current_handle_pointer, ptr, n),
    auto_free: false,
    srid_copy: srid,
    parent: self
  )
end
Also aliased as: interior_ring
interior_rings() click to toggle source
# File lib/ffi-geos/polygon.rb, line 30
def interior_rings
  num_interior_rings.times.collect do |n|
    interior_ring_n(n)
  end
end
num_interior_rings() click to toggle source
# File lib/ffi-geos/polygon.rb, line 5
def num_interior_rings
  FFIGeos.GEOSGetNumInteriorRings_r(Geos.current_handle_pointer, ptr)
end
snap_to_grid(*args) click to toggle source
# File lib/ffi-geos/polygon.rb, line 73
def snap_to_grid(*args)
  ret = dup.snap_to_grid!(*args)
  ret.srid = pick_srid_according_to_policy(srid)
  ret
end
snap_to_grid!(*args) click to toggle source
# File lib/ffi-geos/polygon.rb, line 46
def snap_to_grid!(*args)
  unless empty?
    exterior_ring = self.exterior_ring.coord_seq.snap_to_grid!(*args)

    if exterior_ring.empty?
      @ptr = Geos.create_empty_polygon(srid: srid).ptr
    elsif exterior_ring.length < 4
      raise Geos::InvalidGeometryError, "snap_to_grid! produced an invalid number of points in exterior ring - found #{exterior_ring.length} - must be 0 or >= 4"
    else
      interior_rings = []

      num_interior_rings.times do |i|
        interior_ring = interior_ring_n(i).coord_seq.snap_to_grid!(*args)

        interior_rings << interior_ring unless interior_ring.length < 4
      end

      interior_rings.compact!

      polygon = Geos.create_polygon(exterior_ring, interior_rings, srid: srid)
      @ptr = polygon.ptr
    end
  end

  self
end