Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | Related Pages

SnapOverlayOp.h

00001 /**********************************************************************
00002  * $Id: SnapOverlayOp.h 3255 2011-03-01 17:56:10Z mloskot $
00003  *
00004  * GEOS - Geometry Engine Open Source
00005  * http://geos.refractions.net
00006  *
00007  * Copyright (C) 2009  Sandro Santilli <strk@keybit.net>
00008  *
00009  * This is free software; you can redistribute and/or modify it under
00010  * the terms of the GNU Lesser General Public Licence as published
00011  * by the Free Software Foundation. 
00012  * See the COPYING file for more information.
00013  *
00014  ***********************************************************************
00015  *
00016  * Last port: operation/overlay/snap/SnapOverlayOp.java r320 (JTS-1.12)
00017  *
00018  **********************************************************************/
00019 
00020 #ifndef GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
00021 #define GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
00022 
00023 #include <geos/operation/overlay/OverlayOp.h> // for enums 
00024 #include <geos/precision/CommonBitsRemover.h> // for dtor visibility by auto_ptr
00025 
00026 #include <memory> // for auto_ptr
00027 
00028 #ifdef _MSC_VER
00029 #pragma warning(push)
00030 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00031 #endif
00032 
00033 // Forward declarations
00034 namespace geos {
00035         namespace geom {
00036                 class Geometry;
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         typedef std::pair<GeomPtr, GeomPtr> GeomPtrPair;
00111 
00112         void snap(GeomPtrPair& ret);
00113 
00114         void removeCommonBits(const geom::Geometry& geom0,
00115                               const geom::Geometry& geom1, GeomPtrPair& ret);
00116 
00117         // re-adds common bits to the given geom
00118         void prepareResult(geom::Geometry& geom);
00119 
00120 
00121         const geom::Geometry& geom0;
00122         const geom::Geometry& geom1;
00123 
00124         double snapTolerance;
00125 
00126         std::auto_ptr<precision::CommonBitsRemover> cbr;
00127 
00128     // Declare type as noncopyable
00129     SnapOverlayOp(const SnapOverlayOp& other);
00130     SnapOverlayOp& operator=(const SnapOverlayOp& rhs);
00131 };
00132  
00133 } // namespace geos::operation::overlay::snap
00134 } // namespace geos::operation::overlay
00135 } // namespace geos::operation
00136 } // namespace geos
00137 
00138 #ifdef _MSC_VER
00139 #pragma warning(pop)
00140 #endif
00141 
00142 #endif // ndef GEOS_OP_OVERLAY_SNAP_SNAPOVERLAYOP_H
00143 
00144 /**********************************************************************
00145  * $Log$
00146  **********************************************************************/
00147 

Generated on Sun Aug 21 22:58:55 2011 for GEOS by  doxygen 1.3.9.1