[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