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

svn_geos at osgeo.org svn_geos at osgeo.org
Mon May 4 17:02:18 EDT 2009


Author: strk
Date: 2009-05-04 17:02:18 -0400 (Mon, 04 May 2009)
New Revision: 2461

Added:
   trunk/source/headers/geos/operation/overlay/snap/SnapOverlayOp.h
   trunk/source/operation/overlay/snap/SnapOverlayOp.cpp
Modified:
   trunk/source/headers/geos/operation/overlay/Makefile.am
   trunk/source/headers/geos/operation/overlay/snap/GeometrySnapper.h
   trunk/source/operation/overlay/Makefile.am
   trunk/source/operation/overlay/snap/GeometrySnapper.cpp
Log:
Port overlay.snap.SnapOverlayOp, update GeometrySnapper to be more useful


Modified: trunk/source/headers/geos/operation/overlay/Makefile.am
===================================================================
--- trunk/source/headers/geos/operation/overlay/Makefile.am	2009-05-04 19:54:57 UTC (rev 2460)
+++ trunk/source/headers/geos/operation/overlay/Makefile.am	2009-05-04 21:02:18 UTC (rev 2461)
@@ -25,4 +25,5 @@
 	PointBuilder.h		\
 	PolygonBuilder.h	\
 	snap/GeometrySnapper.h	\
-	snap/LineStringSnapper.h
+	snap/LineStringSnapper.h \
+	snap/SnapOverlayOp.h

Modified: trunk/source/headers/geos/operation/overlay/snap/GeometrySnapper.h
===================================================================
--- trunk/source/headers/geos/operation/overlay/snap/GeometrySnapper.h	2009-05-04 19:54:57 UTC (rev 2460)
+++ trunk/source/headers/geos/operation/overlay/snap/GeometrySnapper.h	2009-05-04 21:02:18 UTC (rev 2461)
@@ -76,11 +76,12 @@
 	 * @param g0 a geometry to snap
 	 * @param g1 a geometry to snap
 	 * @param snapTolerance the tolerance to use
-	 * @return the snapped geometries as a pair of auto_ptrs
+	 * @param ret the snapped geometries as a pair of auto_ptrs
+	 *            (output parameter)
 	 */
-	static GeomPtrPair snap(const geom::Geometry& g0,
+	static void snap(const geom::Geometry& g0,
 	                        const geom::Geometry& g1,
-	                        double snapTolerance);
+	                        double snapTolerance, GeomPtrPair& ret);
 
 	/**
 	 * Creates a new snapper acting on the given geometry

Added: trunk/source/headers/geos/operation/overlay/snap/SnapOverlayOp.h
===================================================================
--- trunk/source/headers/geos/operation/overlay/snap/SnapOverlayOp.h	                        (rev 0)
+++ trunk/source/headers/geos/operation/overlay/snap/SnapOverlayOp.h	2009-05-04 21:02:18 UTC (rev 2461)
@@ -0,0 +1,140 @@
+/**********************************************************************
+ * $Id$
+ *
+ * GEOS - Geometry Engine Open Source
+ * http://geos.refractions.net
+ *
+ * Copyright (C) 2009  Sandro Santilli <strk at keybit.net>
+ *
+ * This is free software; you can redistribute and/or modify it under
+ * the terms of the GNU Lesser General Public Licence as published
+ * by the Free Software Foundation. 
+ * See the COPYING file for more information.
+ *
+ ***********************************************************************
+ *
+ * Last port: operation/overlay/snap/SnapOverlayOp.java rev 1.4 (JTS-1.10)
+ *
+ **********************************************************************/
+
+#ifndef GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
+#define GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
+
+#include <geos/operation/overlay/OverlayOp.h> // for enums 
+#include <geos/precision/CommonBitsRemover.h> // for dtor visibility by auto_ptr
+//#include <geos/geom/LineSegment.h> // for composition
+//#include <geos/geom/LineString.h> // for inlined ctor
+
+//#include <vector>
+#include <memory> // for auto_ptr
+
+// Forward declarations
+namespace geos {
+	namespace geom {
+		class Geometry;
+		//class Coordinate;
+		//class CoordinateSequence;
+	}
+}
+
+namespace geos {
+namespace operation { // geos::operation
+namespace overlay { // geos::operation::overlay
+namespace snap { // geos::operation::overlay::snap
+
+/** \brief
+ * Performs an overlay operation using snapping and enhanced precision
+ * to improve the robustness of the result.
+ *
+ * This class <i>always</i> uses snapping.
+ * This is less performant than the standard JTS overlay code,
+ * and may even introduce errors which were not present in the original data.
+ * For this reason, this class should only be used
+ * if the standard overlay code fails to produce a correct result.
+ *
+ */
+class SnapOverlayOp
+{
+
+public:
+
+	static std::auto_ptr<geom::Geometry>
+	overlayOp(const geom::Geometry& g0, const geom::Geometry& g1,
+	          OverlayOp::OpCode opCode)
+	{
+		SnapOverlayOp op(g0, g1);
+		return op.getResultGeometry(opCode);
+	}
+
+	static std::auto_ptr<geom::Geometry>
+	intersection(const geom::Geometry& g0, const geom::Geometry& g1)
+	{
+		return overlayOp(g0, g1, OverlayOp::opINTERSECTION);
+	}
+
+	static std::auto_ptr<geom::Geometry>
+	Union(const geom::Geometry& g0, const geom::Geometry& g1)
+	{
+		return overlayOp(g0, g1, OverlayOp::opUNION);
+	}
+
+	static std::auto_ptr<geom::Geometry>
+	difference(const geom::Geometry& g0, const geom::Geometry& g1)
+	{
+		return overlayOp(g0, g1, OverlayOp::opDIFFERENCE);
+	}
+
+	static std::auto_ptr<geom::Geometry>
+	symDifference(const geom::Geometry& g0, const geom::Geometry& g1)
+	{
+		return overlayOp(g0, g1, OverlayOp::opSYMDIFFERENCE);
+	}
+
+	SnapOverlayOp(const geom::Geometry& g1, const geom::Geometry& g2)
+		:
+		geom0(g1),
+		geom1(g2)
+	{
+		computeSnapTolerance();
+	}
+
+	
+	typedef std::auto_ptr<geom::Geometry> GeomPtr;
+
+	GeomPtr getResultGeometry(OverlayOp::OpCode opCode);
+
+private:
+
+	void computeSnapTolerance();
+
+	typedef std::pair<GeomPtr, GeomPtr> GeomPtrPair;
+
+	void snap(GeomPtrPair& ret);
+
+	void removeCommonBits(const geom::Geometry& geom0,
+	                      const geom::Geometry& geom1, GeomPtrPair& ret);
+
+	// re-adds common bits to the given geom
+	void prepareResult(geom::Geometry& geom);
+
+
+	const geom::Geometry& geom0;
+	const geom::Geometry& geom1;
+
+	double snapTolerance;
+
+	std::auto_ptr<precision::CommonBitsRemover> cbr;
+};
+ 
+
+} // namespace geos::operation::overlay::snap
+} // namespace geos::operation::overlay
+} // namespace geos::operation
+} // namespace geos
+
+#endif // ndef GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
+
+/**********************************************************************
+ * $Log$
+ **********************************************************************/
+

Modified: trunk/source/operation/overlay/Makefile.am
===================================================================
--- trunk/source/operation/overlay/Makefile.am	2009-05-04 19:54:57 UTC (rev 2460)
+++ trunk/source/operation/overlay/Makefile.am	2009-05-04 21:02:18 UTC (rev 2461)
@@ -19,7 +19,8 @@
 	PointBuilder.cpp \
 	PolygonBuilder.cpp \
 	snap/GeometrySnapper.cpp \
-	snap/LineStringSnapper.cpp
+	snap/LineStringSnapper.cpp \
+	snap/SnapOverlayOp.cpp
 
 libopoverlay_la_LIBADD = 
 

Modified: trunk/source/operation/overlay/snap/GeometrySnapper.cpp
===================================================================
--- trunk/source/operation/overlay/snap/GeometrySnapper.cpp	2009-05-04 19:54:57 UTC (rev 2460)
+++ trunk/source/operation/overlay/snap/GeometrySnapper.cpp	2009-05-04 21:02:18 UTC (rev 2461)
@@ -131,13 +131,12 @@
 }
 
 /* public static */
-GeometrySnapper::GeomPtrPair
+void
 GeometrySnapper::snap(const geom::Geometry& g0,
                       const geom::Geometry& g1,
-                      double snapTolerance)
+                      double snapTolerance,
+                      GeometrySnapper::GeomPtrPair& snapGeom)
 {
-	GeometrySnapper::GeomPtrPair snapGeom;
-
 	GeometrySnapper snapper0(g0);
 	snapGeom.first = snapper0.snapTo(g1, snapTolerance);
 
@@ -153,7 +152,7 @@
 //	cout << *snapGeom.first << endl;
 //	cout << *snapGeom.second << endl;
 
-	return snapGeom;
+	//return snapGeom;
 }
 
 /*public*/

Added: trunk/source/operation/overlay/snap/SnapOverlayOp.cpp
===================================================================
--- trunk/source/operation/overlay/snap/SnapOverlayOp.cpp	                        (rev 0)
+++ trunk/source/operation/overlay/snap/SnapOverlayOp.cpp	2009-05-04 21:02:18 UTC (rev 2461)
@@ -0,0 +1,111 @@
+/**********************************************************************
+ * $Id$
+ *
+ * GEOS - Geometry Engine Open Source
+ * http://geos.refractions.net
+ *
+ * Copyright (C) 2009  Sandro Santilli <strk at keybit.net>
+ *
+ * This is free software; you can redistribute and/or modify it under
+ * the terms of the GNU Lesser General Public Licence as published
+ * by the Free Software Foundation. 
+ * See the COPYING file for more information.
+ *
+ ***********************************************************************
+ *
+ * Last port: operation/overlay/snap/SnapOverlayOp.java rev 1.4 (JTS-1.10)
+ *
+ **********************************************************************/
+
+#include <geos/operation/overlay/snap/SnapOverlayOp.h>
+#include <geos/operation/overlay/snap/GeometrySnapper.h>
+#include <geos/precision/CommonBitsRemover.h>
+//#include <geos/geom/CoordinateSequence.h> 
+
+#include <cassert>
+#include <limits> // for numeric_limits
+#include <memory> // for auto_ptr
+
+#ifndef GEOS_DEBUG
+#define GEOS_DEBUG 0
+#endif
+
+using namespace std;
+using namespace geos::geom;
+
+namespace geos {
+namespace operation { // geos.operation
+namespace overlay { // geos.operation.overlay
+namespace snap { // geos.operation.overlay.snap
+
+/* private */
+void
+SnapOverlayOp::computeSnapTolerance()
+{
+	snapTolerance = GeometrySnapper::computeOverlaySnapTolerance(geom0,
+	                                                             geom1);
+
+	// cout << "Snap tol = " <<  snapTolerance << endl;
+}
+
+/* public */
+auto_ptr<Geometry>
+SnapOverlayOp::getResultGeometry(OverlayOp::OpCode opCode)
+{
+	GeomPtrPair prepGeom;
+	snap(prepGeom);
+	GeomPtr result ( OverlayOp::overlayOp(prepGeom.first.get(),
+	                                      prepGeom.second.get(), opCode) );
+	prepareResult(*result);
+	return result;
+}
+
+/* private */
+void
+SnapOverlayOp::snap(SnapOverlayOp::GeomPtrPair& snapGeom)
+{
+	GeomPtrPair remGeom;
+	removeCommonBits(geom0, geom1, remGeom);
+
+	GeometrySnapper::snap(*remGeom.first, *remGeom.second,
+	                      snapTolerance, snapGeom);
+
+    // MD - may want to do this at some point, but it adds cycles
+//    checkValid(snapGeom[0]);
+//    checkValid(snapGeom[1]);
+
+    /*
+    System.out.println("Snapped geoms: ");
+    System.out.println(snapGeom[0]);
+    System.out.println(snapGeom[1]);
+    */
+
+}
+
+/* private */
+void
+SnapOverlayOp::removeCommonBits(const geom::Geometry& geom0,
+                                const geom::Geometry& geom1,
+				SnapOverlayOp::GeomPtrPair& remGeom)
+{
+	cbr.reset(new precision::CommonBitsRemover());
+	cbr->add(&geom0);
+	cbr->add(&geom1);
+
+	remGeom.first.reset( cbr->removeCommonBits(geom0.clone()) );
+	remGeom.second.reset( cbr->removeCommonBits(geom1.clone()) );
+}
+
+/*private*/
+void
+SnapOverlayOp::prepareResult(geom::Geometry& geom)
+{
+    cbr->addCommonBits(&geom);
+}
+
+
+} // namespace geos.operation.snap
+} // namespace geos.operation.overlay
+} // namespace geos.operation
+} // namespace geos
+



More information about the geos-commits mailing list