1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
//
// Test Suite for geos::algorithm::PointLocator
// Ported from JTS junit/algorithm/PointLocator.java
#include <tut/tut.hpp>
// geos
#include <geos/io/WKTReader.h>
#include <geos/algorithm/locate/SimplePointInAreaLocator.h>
#include <geos/algorithm/PointLocator.h>
#include <geos/geom/PrecisionModel.h>
#include <geos/geom/GeometryFactory.h>
#include <geos/geom/Geometry.h> // required for use in unique_ptr
#include <geos/geom/Coordinate.h>
// std
#include <string>
#include <memory>
namespace geos {
namespace geom {
class Geometry;
}
}
using namespace geos::geom; // for Location
namespace tut {
//
// Test Group
//
// dummy data, not used
struct test_pointlocator_data {};
typedef test_group<test_pointlocator_data> group;
typedef group::object object;
group test_pointlocator_group("geos::algorithm::PointLocator");
// These are static to avoid namespace pollution
// The struct test_*_data above is probably there
// for the same reason...
//
static PrecisionModel pm;
static GeometryFactory::Ptr gf = GeometryFactory::create(&pm);
static geos::io::WKTReader reader(gf.get());
typedef std::unique_ptr<Geometry> GeomPtr;
void
runPtLocator(Location expected, const Coordinate& pt,
const std::string& wkt)
{
GeomPtr geom(reader.read(wkt));
geos::algorithm::PointLocator pointLocator;
Location loc = pointLocator.locate(pt, geom.get());
ensure_equals(loc, expected);
}
void
runSimplePtLocator(Location expected, const Coordinate& pt,
const std::string& wkt)
{
GeomPtr geom(reader.read(wkt));
Location loc = geos::algorithm::locate::SimplePointInAreaLocator::locate(pt, geom.get());
ensure_equals(loc, expected);
}
//
// Test Cases
//
// 1 - Test box
template<>
template<>
void object::test<1>
()
{
runPtLocator(Location::INTERIOR, Coordinate(10, 10),
"POLYGON ((0 0, 0 20, 20 20, 20 0, 0 0))");
}
// 2 - Test complex ring
template<>
template<>
void object::test<2>
()
{
runPtLocator(Location::INTERIOR, Coordinate(0, 0),
"POLYGON ((-40 80, -40 -80, 20 0, 20 -100, 40 40, 80 -80, 100 80, 140 -20, 120 140, 40 180, 60 40, 0 120, -20 -20, -40 80))");
}
// 3 - Test PointLocator LinearRing LineString
template<>
template<>
void object::test<3>
()
{
runPtLocator(Location::BOUNDARY, Coordinate(0, 0),
"GEOMETRYCOLLECTION( LINESTRING(0 0, 10 10), LINEARRING(10 10, 10 20, 20 10, 10 10))");
}
// 4 - Test PointLocator Point inside LinearRing
template<>
template<>
void object::test<4>
()
{
runPtLocator(Location::EXTERIOR, Coordinate(11, 11),
"LINEARRING(10 10, 10 20, 20 10, 10 10)");
}
// 5 - TestPointLocator Point inside MultiPoint
template<>
template<>
void object::test<5>
()
{
runPtLocator(Location::INTERIOR, Coordinate(0, 0),
"MULTIPOINT ((1 1), (0 0))");
}
// 6 - TestPointLocator Point inside GeometryCollection containing MultiPolygon, using SimplePointInAreaLocator.
template<>
template<>
void object::test<6>
()
{
runSimplePtLocator(Location::INTERIOR, Coordinate(0, 0),
"GEOMETRYCOLLECTION (MULTIPOLYGON (((-1 -1, 1 -1, 1 1, -1 1, -1 -1))))");
}
} // namespace tut
|