[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