[geos-commits] r2642 - trunk/source/operation/buffer

svn_geos at osgeo.org svn_geos at osgeo.org
Thu Oct 1 02:33:43 EDT 2009


Author: strk
Date: 2009-10-01 02:33:41 -0400 (Thu, 01 Oct 2009)
New Revision: 2642

Modified:
   trunk/source/operation/buffer/BufferBuilder.cpp
Log:
Use snapped intersection between full buffer boundary and single-sided offset curves 


Modified: trunk/source/operation/buffer/BufferBuilder.cpp
===================================================================
--- trunk/source/operation/buffer/BufferBuilder.cpp	2009-09-30 22:18:38 UTC (rev 2641)
+++ trunk/source/operation/buffer/BufferBuilder.cpp	2009-10-01 06:33:41 UTC (rev 2642)
@@ -19,8 +19,6 @@
  *
  **********************************************************************/
 
-#include <geos/operation/overlay/PolygonBuilder.h> 
-#include <geos/operation/overlay/OverlayNodeFactory.h> 
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Location.h>
 #include <geos/geom/Geometry.h>
@@ -34,6 +32,9 @@
 #include <geos/operation/buffer/BufferSubgraph.h>
 #include <geos/operation/buffer/SubgraphDepthLocater.h>
 #include <geos/operation/overlay/OverlayOp.h>
+#include <geos/operation/overlay/snap/SnapOverlayOp.h> 
+#include <geos/operation/overlay/PolygonBuilder.h> 
+#include <geos/operation/overlay/OverlayNodeFactory.h> 
 #include <geos/operation/linemerge/LineMerger.h>
 #include <geos/algorithm/LineIntersector.h>
 #include <geos/noding/IntersectionAdder.h>
@@ -137,7 +138,7 @@
 
 #ifdef GEOS_DEBUG_SSB
    std::cerr << "input|" << *l << std::endl;
-   std::cerr << "fullBufferBoundary|" << *buf << std::endl;
+   std::cerr << "buffer|" << *bufLineString << std::endl;
 #endif
 
    // Then, get the raw (i.e. unnoded) single sided offset curve.
@@ -167,18 +168,23 @@
      Geometry* tmp = geomFact->createLineString(
          ( *nodedEdges )[i]->getCoordinates() );
 
-#ifdef GEOS_DEBUG_SSB
-     std::cerr << "nodedEdge" << i << "|" << *tmp << std::endl;
-#endif
-
       singleSidedNodedEdges->push_back( tmp );
    }
    Geometry* singleSided = geomFact->createMultiLineString(
       singleSidedNodedEdges );
 
+#ifdef GEOS_DEBUG_SSB
+     std::cerr << "edges|" << *singleSided << std::endl;
+#endif
+
    // Use the boolean operation intersect to obtain the line segments lying
    // on both the butt-cap buffer and this multi-line.
-   Geometry* intersectedLines = singleSided->intersection( bufLineString );
+   //Geometry* intersectedLines = singleSided->intersection( bufLineString );
+   // NOTE: we use Snapped overlay because the actual buffer boundary might
+   //       diverge from original offset curves due to the addition of
+   //       intersections with caps and joins curves
+   using geos::operation::overlay::snap::SnapOverlayOp;
+   Geometry* intersectedLines = SnapOverlayOp::overlayOp(*singleSided, *bufLineString, OverlayOp::opINTERSECTION).release();
 
 #ifdef GEOS_DEBUG_SSB
      std::cerr << "intersection" << "|" << *intersectedLines << std::endl;



More information about the geos-commits mailing list