GEOS
3.3.1
|
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