geos/swig/ruby/test/test_geometry.rb

281 строка
6.5 KiB
Ruby

#!/usr/bin/env ruby
require 'test/unit'
require 'geos'
class TestGeometry < Test::Unit::TestCase
def test_create_point
cs = Geos::CoordinateSequence.new(1,3)
cs.set_x(0, 7)
cs.set_y(0, 8)
cs.set_z(0, 9)
geom = Geos::create_point(cs)
assert_instance_of(Geos::Point, geom)
assert_equal('Point', geom.geom_type)
assert_equal(Geos::GEOS_POINT, geom.type_id)
assert(!geom.empty?)
assert(geom.valid?)
assert(geom.simple?)
assert(!geom.ring?)
assert(geom.has_z?)
assert_equal(1, geom.num_geometries)
coords = geom.coord_seq
assert_instance_of(Geos::CoordinateSequence, coords)
assert_equal(7, coords.get_x(0))
assert_equal(8, coords.get_y(0))
assert_equal(9, coords.get_z(0))
assert_in_delta(0, geom.area, 0.01)
assert_in_delta(0, geom.length, 0.01)
end
def test_create_point_illegal
cs = Geos::CoordinateSequence.new(0, 0)
assert_raise(RuntimeError) do
geom = Geos::create_point(cs)
end
end
def test_create_line_string
cs = Geos::CoordinateSequence.new(2,3)
cs.set_x(0, 7)
cs.set_y(0, 8)
cs.set_z(0, 9)
cs.set_x(1, 3)
cs.set_y(1, 3)
cs.set_z(1, 3)
geom = Geos::create_line_string(cs)
assert_instance_of(Geos::LineString, geom)
assert_equal('LineString', geom.geom_type)
assert_equal(Geos::GEOS_LINESTRING, geom.type_id)
assert(!geom.empty?)
assert(geom.valid?)
assert(geom.simple?)
assert(!geom.ring?)
assert(geom.has_z?)
assert_equal(1, geom.num_geometries)
coords = geom.coord_seq
assert_instance_of(Geos::CoordinateSequence, coords)
assert_equal(7, coords.get_x(0))
assert_equal(8, coords.get_y(0))
assert_equal(9, coords.get_z(0))
assert_equal(3, coords.get_x(1))
assert_equal(3, coords.get_y(1))
assert_equal(3, coords.get_z(1))
assert_in_delta(0, geom.area, 0.01)
assert_in_delta(6.40312423743285, geom.length, 0.01)
end
def test_create_line_string_illegal
cs = Geos::CoordinateSequence.new(1,0)
assert_raise(RuntimeError) do
geom = Geos::create_line_string(cs)
end
end
def test_create_linear_ring
cs = Geos::CoordinateSequence.new(4,3)
cs.set_x(0, 7)
cs.set_y(0, 8)
cs.set_z(0, 9)
cs.set_x(1, 3)
cs.set_y(1, 3)
cs.set_z(1, 3)
cs.set_x(2, 11)
cs.set_y(2, 15.2)
cs.set_z(2, 2)
cs.set_x(3, 7)
cs.set_y(3, 8)
cs.set_z(3, 9)
geom = Geos::create_linear_ring(cs)
assert_instance_of(Geos::LinearRing, geom)
assert_equal('LinearRing', geom.geom_type)
assert_equal(Geos::GEOS_LINEARRING, geom.type_id)
assert(!geom.empty?)
assert(geom.valid?)
assert(geom.simple?)
assert(geom.ring?)
assert(geom.has_z?)
assert_equal(1, geom.num_geometries)
coords = geom.coord_seq
assert_instance_of(Geos::CoordinateSequence, coords)
assert_equal(7, coords.get_x(0))
assert_equal(8, coords.get_y(0))
assert_equal(9, coords.get_z(0))
assert_equal(3, coords.get_x(1))
assert_equal(3, coords.get_y(1))
assert_equal(3, coords.get_z(1))
assert_equal(11, coords.get_x(2))
assert_equal(15.2, coords.get_y(2))
assert_equal(2, coords.get_z(2))
assert_equal(7, coords.get_x(3))
assert_equal(8, coords.get_y(3))
assert_equal(9, coords.get_z(3))
assert_in_delta(0, geom.area, 0.01)
assert_in_delta(29.228665330092, geom.length, 0.01)
end
def test_create_linear_ring_illegal
cs = Geos::CoordinateSequence.new(1,0)
assert_raise(RuntimeError) do
geom = Geos::create_linear_ring(cs)
end
end
def test_create_polygon
# Polygon shell
cs = Geos::CoordinateSequence.new(5,2)
cs.set_x(0, 0)
cs.set_y(0, 0)
cs.set_x(1, 0)
cs.set_y(1, 10)
cs.set_x(2, 10)
cs.set_y(2, 10)
cs.set_x(3, 10)
cs.set_y(3, 0)
cs.set_x(4, 0)
cs.set_y(4, 0)
shell = Geos::create_linear_ring(cs)
geom = Geos::create_polygon(shell)
assert_instance_of(Geos::Polygon, geom)
assert_equal('Polygon', geom.geom_type)
assert_equal(Geos::GEOS_POLYGON, geom.type_id)
assert(!geom.empty?)
assert(geom.valid?)
assert(geom.simple?)
assert(!geom.ring?)
assert(geom.has_z?)
assert_equal(1, geom.num_geometries)
exterior_ring = geom.exterior_ring()
assert(shell.eql?(exterior_ring))
assert_equal(0, geom.num_interior_rings)
assert_raise(RuntimeError) do
assert_equal(0, geom.interior_ring_n(1))
end
assert_in_delta(100, geom.area, 0.01)
assert_in_delta(40, geom.length, 0.01)
end
def test_create_polygon_with_holes
# Polygon shell
cs = Geos::CoordinateSequence.new(5,2)
cs.set_x(0, 0)
cs.set_y(0, 0)
cs.set_x(1, 0)
cs.set_y(1, 10)
cs.set_x(2, 10)
cs.set_y(2, 10)
cs.set_x(3, 10)
cs.set_y(3, 0)
cs.set_x(4, 0)
cs.set_y(4, 0)
shell = Geos::create_linear_ring(cs)
# Hole 1
cs = Geos::CoordinateSequence.new(5,2)
cs.set_x(0, 2)
cs.set_y(0, 2)
cs.set_x(1, 2)
cs.set_y(1, 4)
cs.set_x(2, 4)
cs.set_y(2, 4)
cs.set_x(3, 4)
cs.set_y(3, 2)
cs.set_x(4, 2)
cs.set_y(4, 2)
hole1 = Geos::create_linear_ring(cs)
# Hole 2
cs = Geos::CoordinateSequence.new(5,2)
cs.set_x(0, 6)
cs.set_y(0, 6)
cs.set_x(1, 6)
cs.set_y(1, 8)
cs.set_x(2, 8)
cs.set_y(2, 8)
cs.set_x(3, 8)
cs.set_y(3, 6)
cs.set_x(4, 6)
cs.set_y(4, 6)
hole2 = Geos::create_linear_ring(cs)
geom = Geos::create_polygon(shell, [hole1, hole2])
assert_instance_of(Geos::Polygon, geom)
assert_equal('Polygon', geom.geom_type)
assert_equal(Geos::GEOS_POLYGON, geom.type_id)
assert(!geom.empty?)
assert(geom.valid?)
assert(geom.simple?)
assert(!geom.ring?)
assert(geom.has_z?)
assert_equal(1, geom.num_geometries)
exterior_ring = geom.exterior_ring()
assert(shell.eql?(exterior_ring))
assert_equal(2, geom.num_interior_rings)
assert(hole1.eql?(geom.interior_ring_n(0)))
assert(hole2.eql?(geom.interior_ring_n(1)))
assert_in_delta(92, geom.area, 0.01)
assert_in_delta(56, geom.length, 0.01)
end
def test_distance
cs = Geos::CoordinateSequence.new(1,2)
cs.set_x(0, 0)
cs.set_y(0, 0)
geom1 = Geos::create_point(cs)
cs = Geos::CoordinateSequence.new(1,2)
cs.set_x(0, 3)
cs.set_y(0, 4)
geom2 = Geos::create_point(cs)
assert_equal(5, geom1.distance(geom2))
end
end