00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GEOS_OP_UNION_UNARYUNION_H
00021 #define GEOS_OP_UNION_UNARYUNION_H
00022
00023 #include <memory>
00024 #include <vector>
00025
00026 #include <geos/export.h>
00027 #include <geos/geom/GeometryFactory.h>
00028 #include <geos/geom/BinaryOp.h>
00029 #include <geos/geom/Point.h>
00030 #include <geos/geom/LineString.h>
00031 #include <geos/geom/Polygon.h>
00032 #include <geos/geom/util/GeometryExtracter.h>
00033 #include <geos/operation/overlay/OverlayOp.h>
00034
00035
00036 #ifdef _MSC_VER
00037 #pragma warning(push)
00038 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00039 #endif
00040
00041
00042 namespace geos {
00043 namespace geom {
00044 class GeometryFactory;
00045 class Geometry;
00046 }
00047 }
00048
00049 namespace geos {
00050 namespace operation {
00051 namespace geounion {
00052
00086 class GEOS_DLL UnaryUnionOp
00087 {
00088 public:
00089
00090 template <typename T>
00091 static std::auto_ptr<geom::Geometry> Union(const T& geoms)
00092 {
00093 UnaryUnionOp op(geoms);
00094 return op.Union();
00095 }
00096
00097 template <class T>
00098 static std::auto_ptr<geom::Geometry> Union(const T& geoms,
00099 geom::GeometryFactory& geomFact)
00100 {
00101 UnaryUnionOp op(geoms, geomFact);
00102 return op.Union();
00103 }
00104
00105 static std::auto_ptr<geom::Geometry> Union(const geom::Geometry& geom)
00106 {
00107 UnaryUnionOp op(geom);
00108 return op.Union();
00109 }
00110
00111 template <class T>
00112 UnaryUnionOp(const T& geoms, geom::GeometryFactory& geomFactIn)
00113 :
00114 geomFact(&geomFactIn)
00115 {
00116 extractGeoms(geoms);
00117 }
00118
00119 template <class T>
00120 UnaryUnionOp(const T& geoms)
00121 :
00122 geomFact(0)
00123 {
00124 extractGeoms(geoms);
00125 }
00126
00127 UnaryUnionOp(const geom::Geometry& geom)
00128 :
00129 geomFact(geom.getFactory())
00130 {
00131 extract(geom);
00132 }
00133
00144 std::auto_ptr<geom::Geometry> Union();
00145
00146 private:
00147
00148 template <typename T>
00149 void extractGeoms(const T& geoms)
00150 {
00151 for (typename T::const_iterator
00152 i=geoms.begin(),
00153 e=geoms.end();
00154 i!=e;
00155 ++i)
00156 {
00157 const geom::Geometry* geom = *i;
00158 extract(*geom);
00159 }
00160 }
00161
00162 void extract(const geom::Geometry& geom)
00163 {
00164 using namespace geom::util;
00165
00166 if ( ! geomFact ) geomFact = geom.getFactory();
00167
00168 GeometryExtracter::extract<geom::Polygon>(geom, polygons);
00169 GeometryExtracter::extract<geom::LineString>(geom, lines);
00170 GeometryExtracter::extract<geom::Point>(geom, points);
00171 }
00172
00185 std::auto_ptr<geom::Geometry> unionNoOpt(const geom::Geometry& g0)
00186 {
00187 using geos::operation::overlay::OverlayOp;
00188
00189
00190 if ( ! empty.get() ) {
00191 empty.reset( geomFact->createEmptyGeometry() );
00192 }
00193
00194 return BinaryOp(&g0, empty.get(), overlay::overlayOp(OverlayOp::opUNION));
00195 }
00196
00206 std::auto_ptr<geom::Geometry> unionWithNull(std::auto_ptr<geom::Geometry> g0,
00207 std::auto_ptr<geom::Geometry> g1);
00208
00209 std::vector<const geom::Polygon*> polygons;
00210 std::vector<const geom::LineString*> lines;
00211 std::vector<const geom::Point*> points;
00212
00213 const geom::GeometryFactory* geomFact;
00214
00215 std::auto_ptr<geom::Geometry> empty;
00216 };
00217
00218
00219 }
00220 }
00221 }
00222
00223 #ifdef _MSC_VER
00224 #pragma warning(pop)
00225 #endif
00226
00227 #endif