LineSequencer.h

00001 /**********************************************************************
00002  * $Id: LineSequencer.h 1820 2006-09-06 16:54:23Z mloskot $
00003  *
00004  * GEOS - Geometry Engine Open Source
00005  * http://geos.refractions.net
00006  *
00007  * Copyright (C) 2006 Refractions Research Inc.
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 #ifndef GEOS_OP_LINEMERGE_LINESEQUENCER_H
00017 #define GEOS_OP_LINEMERGE_LINESEQUENCER_H
00018 
00019 #include <geos/operation/linemerge/LineMergeGraph.h> // for composition
00020 #include <geos/geom/Geometry.h> // for inlines
00021 #include <geos/geom/LineString.h> // for inlines
00022 
00023 #include <vector>
00024 #include <list>
00025 #include <memory> // for auto_ptr
00026 
00027 // Forward declarations 
00028 namespace geos {
00029         namespace geom { 
00030                 class GeometryFactory;
00031                 class Geometry;
00032                 class LineString;
00033         }
00034         namespace planargraph { 
00035                 class DirectedEdge;
00036                 class Subgraph;
00037                 class Node;
00038         }
00039 }
00040 
00041 
00042 namespace geos {
00043 namespace operation { // geos::operation
00044 namespace linemerge { // geos::operation::linemerge
00045 
00082 class LineSequencer {
00083 
00084 private:
00085         typedef std::list<planargraph::DirectedEdge*> DirEdgeList;
00086         typedef std::vector< DirEdgeList* > Sequences;
00087 
00088         LineMergeGraph graph;
00089         const geom::GeometryFactory *factory;
00090         unsigned int lineCount;
00091         bool isRun;
00092         std::auto_ptr<geom::Geometry> sequencedGeometry;
00093         bool isSequenceableVar;
00094 
00095         void addLine(const geom::LineString *lineString);
00096         void computeSequence();
00097         Sequences* findSequences();
00098         DirEdgeList* findSequence(planargraph::Subgraph& graph);
00099 
00101         static geom::LineString* reverse(const geom::LineString *line);
00102 
00112         geom::Geometry* buildSequencedGeometry(const Sequences& sequences);
00113 
00114         static const planargraph::Node* findLowestDegreeNode(
00115                         const planargraph::Subgraph& graph);
00116 
00117         void addReverseSubpath(const planargraph::DirectedEdge *de,
00118                 DirEdgeList& deList,
00119                 DirEdgeList::iterator lit,
00120                 bool expectedClosed);
00121         
00130         static const planargraph::DirectedEdge* findUnvisitedBestOrientedDE(
00131                         const planargraph::Node* node);
00132 
00151         DirEdgeList* orient(DirEdgeList* seq);
00152 
00161         DirEdgeList* reverse(DirEdgeList& seq);
00162 
00170         bool hasSequence(planargraph::Subgraph& graph);
00171 
00172 public:
00173 
00174         LineSequencer()
00175                 :
00176                 factory(0),
00177                 lineCount(0),
00178                 isRun(false),
00179                 sequencedGeometry(0),
00180                 isSequenceableVar(false)
00181                 {}
00182 
00193         static bool isSequenced(const geom::Geometry* geom);
00194 
00201         bool isSequenceable() {
00202                 computeSequence();
00203                 return isSequenceableVar;
00204         }
00205 
00214         void add(const geom::Geometry& geometry) {
00215                 geometry.applyComponentFilter(*this);
00216         }
00217 
00222         void filter(const geom::Geometry* g)
00223         {
00224                 if (const geom::LineString *ls=dynamic_cast<const geom::LineString *>(g))
00225                 {
00226                         addLine(ls);
00227                 }
00228         }
00229 
00239         geom::Geometry*
00240         getSequencedLineStrings(bool release=1) {
00241                 computeSequence();
00242                 if (release) return sequencedGeometry.release();
00243                 else return sequencedGeometry.get();
00244         }
00245 
00246 
00247 };
00248 
00249 } // namespace geos::operation::linemerge
00250 } // namespace geos::operation
00251 } // namespace geos
00252 
00253 #endif // GEOS_OP_LINEMERGE_LINESEQUENCER_H
00254 
00255 /**********************************************************************
00256  * $Log$
00257  * Revision 1.1  2006/03/22 10:13:53  strk
00258  * opLinemerge.h split
00259  *
00260  **********************************************************************/

Generated on Fri Mar 27 04:52:50 2009 for GEOS by  doxygen 1.5.4