00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GEOS_OP_UNION_CASCADEDUNION_H
00021 #define GEOS_OP_UNION_CASCADEDUNION_H
00022
00023 #include <geos/export.h>
00024
00025 #include <vector>
00026 #include <algorithm>
00027
00028 #include "GeometryListHolder.h"
00029
00030
00031 namespace geos {
00032 namespace geom {
00033 class GeometryFactory;
00034 class Geometry;
00035 class Geometry;
00036 class Envelope;
00037 }
00038 namespace index {
00039 namespace strtree {
00040 class ItemsList;
00041 }
00042 }
00043 }
00044
00045 namespace geos {
00046 namespace operation {
00047 namespace geounion {
00048
00056 class GEOS_DLL CascadedUnion
00057 {
00058 private:
00059 const std::vector<geom::Geometry*>* inputGeoms;
00060 geom::GeometryFactory const* geomFactory;
00061
00069 static int const STRTREE_NODE_CAPACITY = 4;
00070
00071 public:
00072 CascadedUnion();
00073
00080 static geom::Geometry* Union(std::vector<geom::Geometry*>* geoms);
00081
00089 template <class T>
00090 static geom::Geometry* Union(T start, T end)
00091 {
00092 std::vector<geom::Geometry*> polys;
00093 for (T i=start; i!=end; ++i) {
00094 const geom::Geometry* p = dynamic_cast<const geom::Geometry*>(*i);
00095 polys.push_back(const_cast<geom::Geometry*>(p));
00096 }
00097 return Union(&polys);
00098 }
00099
00107 CascadedUnion(const std::vector<geom::Geometry*>* geoms)
00108 : inputGeoms(geoms),
00109 geomFactory(NULL)
00110 {}
00111
00118 geom::Geometry* Union();
00119
00120 private:
00121 geom::Geometry* unionTree(index::strtree::ItemsList* geomTree);
00122
00128 geom::Geometry* binaryUnion(GeometryListHolder* geoms);
00129
00139 geom::Geometry* binaryUnion(GeometryListHolder* geoms, std::size_t start,
00140 std::size_t end);
00141
00149 GeometryListHolder* reduceToGeometries(index::strtree::ItemsList* geomTree);
00150
00160 geom::Geometry* unionSafe(geom::Geometry* g0, geom::Geometry* g1);
00161
00162 geom::Geometry* unionOptimized(geom::Geometry* g0, geom::Geometry* g1);
00163
00180 geom::Geometry* unionUsingEnvelopeIntersection(geom::Geometry* g0,
00181 geom::Geometry* g1, geom::Envelope const& common);
00182
00183 geom::Geometry* extractByEnvelope(geom::Envelope const& env,
00184 geom::Geometry* geom, std::vector<geom::Geometry*>& disjointGeoms);
00185
00193 static geom::Geometry* unionActual(geom::Geometry* g0, geom::Geometry* g1);
00194 };
00195
00196 }
00197 }
00198 }
00199
00200 #endif