[geos-commits] r2565 - in trunk/source: headers/geos/operation/overlay operation/overlay

svn_geos at osgeo.org svn_geos at osgeo.org
Mon Jun 8 12:26:36 EDT 2009


Author: strk
Date: 2009-06-08 12:26:36 -0400 (Mon, 08 Jun 2009)
New Revision: 2565

Modified:
   trunk/source/headers/geos/operation/overlay/LineBuilder.h
   trunk/source/operation/overlay/LineBuilder.cpp
Log:
sync LineBuilder to JTS-1.10, completing overlay port


Modified: trunk/source/headers/geos/operation/overlay/LineBuilder.h
===================================================================
--- trunk/source/headers/geos/operation/overlay/LineBuilder.h	2009-06-08 16:09:51 UTC (rev 2564)
+++ trunk/source/headers/geos/operation/overlay/LineBuilder.h	2009-06-08 16:26:36 UTC (rev 2565)
@@ -13,7 +13,7 @@
  *
  ***********************************************************************
  *
- * Last port: operation/overlay/LineBuilder.java rev. 1.13 (JTS-1.4)
+ * Last port: operation/overlay/LineBuilder.java rev. 1.15 (JTS-1.10)
  *
  **********************************************************************/
 
@@ -72,16 +72,31 @@
 	std::vector<geom::LineString*>* build(OverlayOp::OpCode opCode);
 
 	/**
-	 * Find and mark L edges which are "covered" by the result area (if any).
-	 * L edges at nodes which also have A edges can be checked by checking
-	 * their depth at that node.
-	 * L edges at nodes which do not have A edges can be checked by doing a
-	 * point-in-polygon test with the previously computed result areas.
+	 * Collect line edges which are in the result.
+	 *
+	 * Line edges are in the result if they are not part of
+	 * an area boundary, if they are in the result of the overlay operation,
+	 * and if they are not covered by a result area.
+	 *
+	 * @param de the directed edge to test. 
+	 * @param opCode the overlap operation
+	 * @param edges the list of included line edges. 
 	 */
 	void collectLineEdge(geomgraph::DirectedEdge *de,
 			OverlayOp::OpCode opCode,
 			std::vector<geomgraph::Edge*>* edges);
 
+private:
+	OverlayOp *op;
+	const geom::GeometryFactory *geometryFactory;
+	algorithm::PointLocator *ptLocator;
+	std::vector<geomgraph::Edge*> lineEdgesList;
+	std::vector<geom::LineString*>* resultLineList;
+	void findCoveredLineEdges();
+	void collectLines(OverlayOp::OpCode opCode);
+	void buildLines(OverlayOp::OpCode opCode);
+	void labelIsolatedLines(std::vector<geomgraph::Edge*> *edgesList);
+
 	/**
 	 * Collect edges from Area inputs which should be in the result but
 	 * which have not been included in a result area.
@@ -96,17 +111,6 @@
 			OverlayOp::OpCode opCode,
 			std::vector<geomgraph::Edge*>* edges);
 
-private:
-	OverlayOp *op;
-	const geom::GeometryFactory *geometryFactory;
-	algorithm::PointLocator *ptLocator;
-	std::vector<geomgraph::Edge*> lineEdgesList;
-	std::vector<geom::LineString*>* resultLineList;
-	void findCoveredLineEdges();
-	void collectLines(OverlayOp::OpCode opCode);
-	void buildLines(OverlayOp::OpCode opCode);
-	void labelIsolatedLines(std::vector<geomgraph::Edge*> *edgesList);
-
 	/**
 	 * Label an isolated node with its relationship to the target geometry.
 	 */

Modified: trunk/source/operation/overlay/LineBuilder.cpp
===================================================================
--- trunk/source/operation/overlay/LineBuilder.cpp	2009-06-08 16:09:51 UTC (rev 2564)
+++ trunk/source/operation/overlay/LineBuilder.cpp	2009-06-08 16:26:36 UTC (rev 2565)
@@ -14,7 +14,7 @@
  *
  ***********************************************************************
  *
- * Last port: operation/overlay/LineBuilder.java rev. 1.13 (JTS-1.4)
+ * Last port: operation/overlay/LineBuilder.java rev. 1.15 (JTS-1.10)
  *
  **********************************************************************/
 
@@ -151,36 +151,39 @@
 	}
 }
 
-/*
- * Collect edges from Area inputs which should be in the result but
- * which have not been included in a result area.
- * This happens ONLY:
- *  - during an intersection when the boundaries of two
- *    areas touch in a line segment
- *  - OR as a result of a dimensional collapse.
- */
+/*private*/
 void
 LineBuilder::collectBoundaryTouchEdge(DirectedEdge *de,
 		OverlayOp::OpCode opCode, vector<Edge*> *edges)
 {
-	Label *label=de->getLabel();
-	// this smells like a bit of a hack, but it seems to work...
-	if (!de->isLineEdge()
-		&& !de->isInteriorAreaEdge()  // added to handle dimensional collapses
-		&& !de->getEdge()->isInResult()
-		&& !de->isVisited()
-		&& OverlayOp::isResultOfOp(label, opCode)
-		&& opCode==OverlayOp::opINTERSECTION)
+	if (de->isLineEdge()) return;  // only interested in area edges
+	if (de->isVisited()) return;  // already processed
+
+	// added to handle dimensional collapses
+	if (de->isInteriorAreaEdge()) return;
+
+	// if the edge linework is already included, don't include it again
+	if (de->getEdge()->isInResult()) return; 
+
+	// sanity check for labelling of result edgerings
+	assert( ! ( de->isInResult() || de->getSym()->isInResult() )
+		||
+	        ! de->getEdge()->isInResult() );
+
+
+	// include the linework if it's in the result of the operation
+	Label *label = de->getLabel();
+	if ( OverlayOp::isResultOfOp(label, opCode) 
+		&& opCode == OverlayOp::opINTERSECTION )
 	{
-			edges->push_back(de->getEdge());
-			de->setVisitedEdge(true);
+		edges->push_back(de->getEdge());
+		de->setVisitedEdge(true);
 	}
 }
 
 void
 LineBuilder::buildLines(OverlayOp::OpCode /* opCode */)
 {
-	// need to simplify lines?
 	for(size_t i=0, s=lineEdgesList.size(); i<s; ++i)
 	{
 		Edge *e=lineEdgesList[i];



More information about the geos-commits mailing list