[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