[geos-commits] r3142 - in trunk: include/geos/operation/overlay/snap
src/operation/overlay/snap tests/unit/operation/overlay/snap
svn_geos at osgeo.org
svn_geos at osgeo.org
Thu Dec 2 05:32:06 EST 2010
Author: strk
Date: 2010-12-02 02:32:06 -0800 (Thu, 02 Dec 2010)
New Revision: 3142
Modified:
trunk/include/geos/operation/overlay/snap/LineStringSnapper.h
trunk/src/operation/overlay/snap/LineStringSnapper.cpp
trunk/tests/unit/operation/overlay/snap/LineStringSnapperTest.cpp
Log:
Bring LineStringSnapper forward to r309 (JTS-1.11+): avoid snapping final point of closed rings.
Modified: trunk/include/geos/operation/overlay/snap/LineStringSnapper.h
===================================================================
--- trunk/include/geos/operation/overlay/snap/LineStringSnapper.h 2010-12-02 09:38:28 UTC (rev 3141)
+++ trunk/include/geos/operation/overlay/snap/LineStringSnapper.h 2010-12-02 10:32:06 UTC (rev 3142)
@@ -4,7 +4,7 @@
* GEOS - Geometry Engine Open Source
* http://geos.refractions.net
*
- * Copyright (C) 2009 Sandro Santilli <strk at keybit.net>
+ * Copyright (C) 2009-2010 Sandro Santilli <strk at keybit.net>
* Copyright (C) 2006 Refractions Research Inc.
*
* This is free software; you can redistribute and/or modify it under
@@ -14,7 +14,7 @@
*
***********************************************************************
*
- * Last port: operation/overlay/snap/lineStringSnapper.java rev 1.5 (JTS-1.10)
+ * Last port: operation/overlay/snap/LineStringSnapper.java r309 (JTS-1.11+)
*
**********************************************************************/
@@ -67,7 +67,7 @@
snapTolerance(nSnapTol)
{
size_t s = srcPts.size();
- isClosed = ( s < 2 || srcPts[0].equals2D(srcPts[s-1]) );
+ isClosed = s < 2 ? false : srcPts[0].equals2D(srcPts[s-1]);
}
// Snap points are assumed to be all distinct points (a set would be better, uh ?)
Modified: trunk/src/operation/overlay/snap/LineStringSnapper.cpp
===================================================================
--- trunk/src/operation/overlay/snap/LineStringSnapper.cpp 2010-12-02 09:38:28 UTC (rev 3141)
+++ trunk/src/operation/overlay/snap/LineStringSnapper.cpp 2010-12-02 10:32:06 UTC (rev 3142)
@@ -4,7 +4,7 @@
* GEOS - Geometry Engine Open Source
* http://geos.refractions.net
*
- * Copyright (C) 2009 Sandro Santilli <strk at keybit.net>
+ * Copyright (C) 2009-2010 Sandro Santilli <strk at keybit.net>
* Copyright (C) 2006 Refractions Research Inc.
*
* This is free software; you can redistribute and/or modify it under
@@ -14,7 +14,7 @@
*
***********************************************************************
*
- * Last port: operation/overlay/snap/lineStringSnapper.java rev 1.5 (JTS-1.10)
+ * Last port: operation/overlay/snap/LineStringSnapper.java r309 (JTS-1.11+)
*
**********************************************************************/
@@ -68,10 +68,11 @@
geom::Coordinate::ConstVect::const_iterator not_found = snapPts.end();
// try snapping vertices
- // assume src list has a closing point (is a ring)
+ // if src is a ring then don't snap final vertex
CoordinateList::iterator it = srcCoords.begin();
CoordinateList::iterator end = srcCoords.end();
CoordinateList::iterator last = end; --last;
+ if ( isClosed ) --end;
for ( ; it != end; ++it )
{
Coordinate& srcPt = *it;
Modified: trunk/tests/unit/operation/overlay/snap/LineStringSnapperTest.cpp
===================================================================
--- trunk/tests/unit/operation/overlay/snap/LineStringSnapperTest.cpp 2010-12-02 09:38:28 UTC (rev 3141)
+++ trunk/tests/unit/operation/overlay/snap/LineStringSnapperTest.cpp 2010-12-02 10:32:06 UTC (rev 3142)
@@ -67,6 +67,7 @@
CoordsVectAptr ret(snapper.snapTo(snpCoords));
// both points should have been snapped
+ ensure_equals(ret->size(), 2u);
ensure_equals(ret->operator[](0), snp_a);
ensure_equals(ret->operator[](1), snp_b);
@@ -111,5 +112,111 @@
}
+ // Test vertices snapping in a closed ring
+ template<>
+ template<>
+ void object::test<3>()
+ {
+ using geos::geom::Coordinate;
+ using geos::operation::overlay::snap::LineStringSnapper;
+ typedef std::auto_ptr<Coordinate::Vect> CoordsVectAptr;
+
+
+ // source coordinates
+
+ Coordinate src_a(0, 0);
+ Coordinate src_b(10, 10);
+ Coordinate src_c(0, 10);
+
+ Coordinate::Vect srcCoords;
+ srcCoords.push_back( src_a );
+ srcCoords.push_back( src_b );
+ srcCoords.push_back( src_c );
+ srcCoords.push_back( src_a );
+
+ // snap coordinates
+
+ Coordinate snp_a(0.1, 0);
+ Coordinate snp_b(10, 10.1);
+
+ Coordinate::ConstVect snpCoords;
+ snpCoords.push_back( &snp_a );
+ snpCoords.push_back( &snp_b );
+
+ LineStringSnapper snapper(srcCoords, 0.4);
+
+ CoordsVectAptr ret(snapper.snapTo(snpCoords));
+
+ // Points A and B should be snapped
+ ensure_equals(ret->size(), 4u);
+ ensure_equals(ret->operator[](0), snp_a);
+ ensure_equals(ret->operator[](1), snp_b);
+ ensure_equals(ret->operator[](2), src_c);
+ ensure_equals(ret->operator[](3), snp_a);
+
+ }
+
+ // Test vertices snapping in a short sequence
+ template<>
+ template<>
+ void object::test<4>()
+ {
+ using geos::geom::Coordinate;
+ using geos::operation::overlay::snap::LineStringSnapper;
+
+ typedef std::auto_ptr<Coordinate::Vect> CoordsVectAptr;
+
+
+ // source coordinates
+
+ Coordinate src_a(0, 0);
+ Coordinate::Vect srcCoords;
+ srcCoords.push_back( src_a );
+
+ // snap coordinates
+
+ Coordinate snp_a(0.1, 0);
+ Coordinate::ConstVect snpCoords;
+ snpCoords.push_back( &snp_a );
+
+ LineStringSnapper snapper(srcCoords, 0.4);
+
+ CoordsVectAptr ret(snapper.snapTo(snpCoords));
+
+ ensure_equals(ret->size(), 1u);
+ ensure_equals(ret->operator[](0), snp_a);
+
+ }
+
+ // Test vertices snapping in an empty sequence
+ template<>
+ template<>
+ void object::test<5>()
+ {
+ using geos::geom::Coordinate;
+ using geos::operation::overlay::snap::LineStringSnapper;
+
+ typedef std::auto_ptr<Coordinate::Vect> CoordsVectAptr;
+
+
+ // source coordinates
+
+ Coordinate src_a(0, 0);
+ Coordinate::Vect srcCoords;
+
+ // snap coordinates
+
+ Coordinate snp_a(0.1, 0);
+ Coordinate::ConstVect snpCoords;
+
+ LineStringSnapper snapper(srcCoords, 0.4);
+
+ CoordsVectAptr ret(snapper.snapTo(snpCoords));
+
+ ensure_equals(ret->size(), 0u);
+
+ }
+
+
} // namespace tut
More information about the geos-commits
mailing list