Merge pull request #202 from mkaravel/fix/is_simple_closed_linestrings

Fix/is simple closed linestrings
This commit is contained in:
Adam Wulkiewicz
2015-01-28 23:21:59 +01:00
3 changed files with 25 additions and 0 deletions

View File

@@ -54,6 +54,7 @@
* Bug in buffers for joins with a imited number of points
* Bug in buffers for joins with large buffer distances
* Bug in closing iterator not working properly when the input range is empty
* Bug in is_simple, not handling properly closed simple linestrings within multilinestrings
[/=================]
[heading Boost 1.57]

View File

@@ -93,6 +93,19 @@ private:
|| geometry::equals(point, range::back(linestring)) );
}
template <typename Point, typename Linestring>
static inline bool is_closing_point_of(Point const& point,
Linestring const& linestring)
{
BOOST_ASSERT( boost::size(linestring) > 1 );
return
geometry::equals(range::front(linestring),
range::back(linestring))
&&
geometry::equals(range::front(linestring), point)
;
}
template <typename Linestring1, typename Linestring2>
static inline bool have_same_boundary_points(Linestring1 const& ls1,
Linestring2 const& ls2)
@@ -130,6 +143,13 @@ private:
range::at(m_multilinestring,
turn.operations[1].seg_id.multi_index);
if (turn.operations[0].seg_id.multi_index
== turn.operations[1].seg_id.multi_index)
{
BOOST_ASSERT(is_closing_point_of(turn.point, ls1));
return true;
}
return
is_boundary_point_of(turn.point, ls1)
&& is_boundary_point_of(turn.point, ls2)

View File

@@ -161,6 +161,7 @@ BOOST_AUTO_TEST_CASE( test_is_simple_linestring )
// simple closed linestrings
test_simple(from_wkt<G>("LINESTRING(0 0,1 0,1 1,0 0)"), true);
test_simple(from_wkt<G>("LINESTRING(0 0,1 0,1 1,0 1,0 0)"), true);
test_simple(from_wkt<G>("LINESTRING(0 0,10 0,10 10,0 10,0 0)"), true);
// non-simple linestrings
test_simple(from_wkt<G>("LINESTRING(0 0,1 0,0 0)"), false);
@@ -173,6 +174,7 @@ BOOST_AUTO_TEST_CASE( test_is_simple_linestring )
test_simple(from_wkt<G>("LINESTRING(0 0,3 0,5 0,4 0,2 0)"), false);
test_simple(from_wkt<G>("LINESTRING(0 0,3 0,2 0,5 0)"), false);
test_simple(from_wkt<G>("LINESTRING(0 0,2 0,2 2,1 0,0 0)"), false);
test_simple(from_wkt<G>("LINESTRING(0 0,0 10,5 10,0 0,10 10,10 5,10 0,0 0)"), false);
}
BOOST_AUTO_TEST_CASE( test_is_simple_multilinestring )
@@ -208,6 +210,7 @@ BOOST_AUTO_TEST_CASE( test_is_simple_multilinestring )
true);
test_simple(from_wkt<G>("MULTILINESTRING((0 0,1 0),(0 0,0 1),(0 0,-1 0),(0 0,0 -1))"),
true);
test_simple(from_wkt<G>("MULTILINESTRING((0 0,10 0,10 10,0 10,0 0))"), true);
// non-simple multilinestrings
test_simple(from_wkt<G>("MULTILINESTRING((0 0,2 2),(0 0,2 2))"), false);
@@ -246,6 +249,7 @@ BOOST_AUTO_TEST_CASE( test_is_simple_multilinestring )
false);
test_simple(from_wkt<G>("MULTILINESTRING((0 0,1 0,1 1,0 1,0 0),(-1 -1,-1 0,0 0,0 -1,-1 -1))"),
false);
test_simple(from_wkt<G>("MULTILINESTRING((0 0,0 10,5 10,0 0,10 10,10 5,10 0,0 0))"), false);
}
BOOST_AUTO_TEST_CASE( test_is_simple_areal )