SnapOverlayOp.h

00001 /**********************************************************************
00002  *
00003  * GEOS - Geometry Engine Open Source
00004  * http://geos.osgeo.org
00005  *
00006  * Copyright (C) 2009  Sandro Santilli <strk@keybit.net>
00007  *
00008  * This is free software; you can redistribute and/or modify it under
00009  * the terms of the GNU Lesser General Public Licence as published
00010  * by the Free Software Foundation. 
00011  * See the COPYING file for more information.
00012  *
00013  ***********************************************************************
00014  *
00015  * Last port: operation/overlay/snap/SnapOverlayOp.java r320 (JTS-1.12)
00016  *
00017  **********************************************************************/
00018 
00019 #ifndef GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
00020 #define GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
00021 
00022 #include <geos/operation/overlay/OverlayOp.h> // for enums 
00023 #include <geos/precision/CommonBitsRemover.h> // for dtor visibility by auto_ptr
00024 
00025 #include <memory> // for auto_ptr
00026 
00027 #ifdef _MSC_VER
00028 #pragma warning(push)
00029 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00030 #endif
00031 
00032 // Forward declarations
00033 namespace geos {
00034         namespace geom {
00035                 class Geometry;
00036                 struct GeomPtrPair;
00037         }
00038 }
00039 
00040 namespace geos {
00041 namespace operation { // geos::operation
00042 namespace overlay { // geos::operation::overlay
00043 namespace snap { // geos::operation::overlay::snap
00044 
00056 class GEOS_DLL SnapOverlayOp
00057 {
00058 
00059 public:
00060 
00061         static std::auto_ptr<geom::Geometry>
00062         overlayOp(const geom::Geometry& g0, const geom::Geometry& g1,
00063                   OverlayOp::OpCode opCode)
00064         {
00065                 SnapOverlayOp op(g0, g1);
00066                 return op.getResultGeometry(opCode);
00067         }
00068 
00069         static std::auto_ptr<geom::Geometry>
00070         intersection(const geom::Geometry& g0, const geom::Geometry& g1)
00071         {
00072                 return overlayOp(g0, g1, OverlayOp::opINTERSECTION);
00073         }
00074 
00075         static std::auto_ptr<geom::Geometry>
00076         Union(const geom::Geometry& g0, const geom::Geometry& g1)
00077         {
00078                 return overlayOp(g0, g1, OverlayOp::opUNION);
00079         }
00080 
00081         static std::auto_ptr<geom::Geometry>
00082         difference(const geom::Geometry& g0, const geom::Geometry& g1)
00083         {
00084                 return overlayOp(g0, g1, OverlayOp::opDIFFERENCE);
00085         }
00086 
00087         static std::auto_ptr<geom::Geometry>
00088         symDifference(const geom::Geometry& g0, const geom::Geometry& g1)
00089         {
00090                 return overlayOp(g0, g1, OverlayOp::opSYMDIFFERENCE);
00091         }
00092 
00093         SnapOverlayOp(const geom::Geometry& g1, const geom::Geometry& g2)
00094                 :
00095                 geom0(g1),
00096                 geom1(g2)
00097         {
00098                 computeSnapTolerance();
00099         }
00100 
00101         
00102         typedef std::auto_ptr<geom::Geometry> GeomPtr;
00103 
00104         GeomPtr getResultGeometry(OverlayOp::OpCode opCode);
00105 
00106 private:
00107 
00108         void computeSnapTolerance();
00109 
00110         void snap(geom::GeomPtrPair& ret);
00111 
00112         void removeCommonBits(const geom::Geometry& geom0,
00113                               const geom::Geometry& geom1,
00114                               geom::GeomPtrPair& ret);
00115 
00116         // re-adds common bits to the given geom
00117         void prepareResult(geom::Geometry& geom);
00118 
00119 
00120         const geom::Geometry& geom0;
00121         const geom::Geometry& geom1;
00122 
00123         double snapTolerance;
00124 
00125         std::auto_ptr<precision::CommonBitsRemover> cbr;
00126 
00127     // Declare type as noncopyable
00128     SnapOverlayOp(const SnapOverlayOp& other);
00129     SnapOverlayOp& operator=(const SnapOverlayOp& rhs);
00130 };
00131  
00132 } // namespace geos::operation::overlay::snap
00133 } // namespace geos::operation::overlay
00134 } // namespace geos::operation
00135 } // namespace geos
00136 
00137 #ifdef _MSC_VER
00138 #pragma warning(pop)
00139 #endif
00140 
00141 #endif // ndef GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H

Generated on 10 Sep 2013 for GEOS by  doxygen 1.4.7