00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef GEOS_OPLINEMERGE_H
00035 #define GEOS_OPLINEMERGE_H
00036
00037 #include <geos/platform.h>
00038 #include <geos/planargraph.h>
00039 #include <geos/geom.h>
00040 #include <vector>
00041
00042 namespace geos {
00043
00044
00045
00046
00047
00048
00049 class LineMergeEdge: public planarEdge {
00050 private:
00051 LineString *line;
00052 public:
00056 LineMergeEdge(LineString *newLine);
00060 LineString* getLine();
00061 };
00062
00063
00064
00065
00066
00067
00068
00069 class LineMergeDirectedEdge: public planarDirectedEdge {
00070 public:
00082 LineMergeDirectedEdge(planarNode *newFrom,planarNode *newTo,Coordinate& newDirectionPt,bool nEdgeDirection);
00088 LineMergeDirectedEdge* getNext();
00089 };
00090
00091
00092
00093
00094
00095
00096 class EdgeString {
00097 private:
00098 GeometryFactory *factory;
00099 vector<LineMergeDirectedEdge*> *directedEdges;
00100 CoordinateSequence *coordinates;
00101 const CoordinateSequence* getCoordinates();
00102 public:
00107 EdgeString(GeometryFactory *newFactory);
00108
00109 ~EdgeString();
00110
00114 void add(LineMergeDirectedEdge *directedEdge);
00115
00119 LineString* toLineString();
00120 };
00121
00122
00123
00124
00125
00126
00127
00128
00129 class LineMergeGraph: public planarPlanarGraph {
00130 public:
00135 void addEdge(LineString *lineString);
00136 private:
00137 planarNode* getNode(Coordinate &coordinate);
00138 };
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 class LineMerger {
00154 public:
00155 LineMerger();
00156 ~LineMerger();
00162 void add(vector<Geometry*> *geometries);
00168 void add(Geometry *geometry);
00172 vector<LineString*>* getMergedLineStrings();
00173 void add(LineString *lineString);
00174 private:
00175 LineMergeGraph *graph;
00176 vector<LineString*> *mergedLineStrings;
00177 vector<EdgeString*> *edgeStrings;
00178 GeometryFactory *factory;
00179 void merge();
00180 void buildEdgeStringsForObviousStartNodes();
00181 void buildEdgeStringsForIsolatedLoops();
00182 void buildEdgeStringsForUnprocessedNodes();
00183 void buildEdgeStringsForNonDegree2Nodes();
00184 void buildEdgeStringsStartingAt(planarNode *node);
00185 EdgeString* buildEdgeStringStartingWith(LineMergeDirectedEdge *start);
00186 };
00187
00188 class LMGeometryComponentFilter: public GeometryComponentFilter {
00189 public:
00190 LineMerger *lm;
00191 LMGeometryComponentFilter(LineMerger *newLm);
00192 virtual void filter_rw(Geometry *geom);
00193 virtual void filter_ro(const Geometry *geom){};
00194 };
00195
00196 }
00197 #endif
00198