- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List

# LineSequencer.h

    00001 /**********************************************************************
    00002  * $Id: LineSequencer.h 3309 2011-04-27 15:47:14Z strk $
    00003  *
    00004  * GEOS - Geometry Engine Open Source
    00005  * http://geos.refractions.net
    00006  *
    00007  * Copyright (C) 2011 Sandro Santilli <strk@keybit.net>
    00008  * Copyright (C) 2006 Refractions Research Inc.
    00009  *
    00010  * This is free software; you can redistribute and/or modify it under
    00011  * the terms of the GNU Lesser General Public Licence as published
    00012  * by the Free Software Foundation.
    00013  * See the COPYING file for more information.
    00014  *
    00015  **********************************************************************
    00016  *
    00017  * Last port: operation/linemerge/LineSequencer.java r378 (JTS-1.12)
    00018  *
    00019  **********************************************************************/
    00020
    00021 #ifndef GEOS_OP_LINEMERGE_LINESEQUENCER_H
    00022 #define GEOS_OP_LINEMERGE_LINESEQUENCER_H
    00023
    00024 #include <geos/export.h>
    00025
    00026 #include <geos/operation/linemerge/LineMergeGraph.h> // for composition
    00027 #include <geos/geom/Geometry.h> // for inlines
    00028 #include <geos/geom/LineString.h> // for inlines
    00029
    00030 #include <vector>
    00031 #include <list>
    00032 #include <memory> // for auto_ptr
    00033
    00034 #ifdef _MSC_VER
    00035 #pragma warning(push)
    00036 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
    00037 #endif
    00038
    00039 // Forward declarations
    00040 namespace geos {
    00041         namespace geom {
    00042                 class GeometryFactory;
    00043                 class Geometry;
    00044                 class LineString;
    00045         }
    00046         namespace planargraph {
    00047                 class DirectedEdge;
    00048                 class Subgraph;
    00049                 class Node;
    00050         }
    00051 }
    00052
    00053
    00054 namespace geos {
    00055 namespace operation { // geos::operation
    00056 namespace linemerge { // geos::operation::linemerge
    00057
    00100 class GEOS_DLL LineSequencer {
    00101
    00102 private:
    00103         typedef std::list<planargraph::DirectedEdge*> DirEdgeList;
    00104         typedef std::vector< DirEdgeList* > Sequences;
    00105
    00106         LineMergeGraph graph;
    00107         const geom::GeometryFactory *factory;
    00108         unsigned int lineCount;
    00109         bool isRun;
    00110         std::auto_ptr<geom::Geometry> sequencedGeometry;
    00111         bool isSequenceableVar;
    00112
    00113         void addLine(const geom::LineString *lineString);
    00114         void computeSequence();
    00115         Sequences* findSequences();
    00116         DirEdgeList* findSequence(planargraph::Subgraph& graph);
    00117
    00118         void delAll( Sequences& );
    00119
    00121         static geom::LineString* reverse(const geom::LineString *line);
    00122
    00135         geom::Geometry* buildSequencedGeometry(const Sequences& sequences);
    00136
    00137         static const planargraph::Node* findLowestDegreeNode(
    00138                         const planargraph::Subgraph& graph);
    00139
    00140         void addReverseSubpath(const planargraph::DirectedEdge *de,
    00141                 DirEdgeList& deList,
    00142                 DirEdgeList::iterator lit,
    00143                 bool expectedClosed);
    00144
    00153         static const planargraph::DirectedEdge* findUnvisitedBestOrientedDE(
    00154                         const planargraph::Node* node);
    00155
    00174         DirEdgeList* orient(DirEdgeList* seq);
    00175
    00184         DirEdgeList* reverse(DirEdgeList& seq);
    00185
    00193         bool hasSequence(planargraph::Subgraph& graph);
    00194
    00195 public:
    00196
    00197         static geom::Geometry* sequence(const geom::Geometry& geom)
    00198         {
    00199                 LineSequencer sequencer;
    00200                 sequencer.add(geom);
    00201                 return sequencer.getSequencedLineStrings();
    00202         }
    00203
    00204         LineSequencer()
    00205                 :
    00206                 factory(0),
    00207                 lineCount(0),
    00208                 isRun(false),
    00209                 sequencedGeometry(0),
    00210                 isSequenceableVar(false)
    00211                 {}
    00212
    00223         static bool isSequenced(const geom::Geometry* geom);
    00224
    00231         bool isSequenceable() {
    00232                 computeSequence();
    00233                 return isSequenceableVar;
    00234         }
    00235
    00244         void add(const geom::Geometry& geometry) {
    00245                 geometry.applyComponentFilter(*this);
    00246         }
    00247
    00248   template <class TargetContainer>
    00249   void add(TargetContainer& geoms)
    00250   {
    00251     for (typename TargetContainer::const_iterator i = geoms.begin(),
    00252          e = geoms.end(); i != e; ++i)
    00253     {
    00254       const geom::Geometry* g = *i;
    00255       add(*g);
    00256     }
    00257   }
    00258
    00263         void filter(const geom::Geometry* g)
    00264         {
    00265                 if (const geom::LineString *ls=dynamic_cast<const geom::LineString *>(g))
    00266                 {
    00267                         addLine(ls);
    00268                 }
    00269         }
    00270
    00280         geom::Geometry*
    00281         getSequencedLineStrings(bool release=1) {
    00282                 computeSequence();
    00283                 if (release) return sequencedGeometry.release();
    00284                 else return sequencedGeometry.get();
    00285         }
    00286 };
    00287
    00288 } // namespace geos::operation::linemerge
    00289 } // namespace geos::operation
    00290 } // namespace geos
    00291
    00292 #ifdef _MSC_VER
    00293 #pragma warning(pop)
    00294 #endif
    00295
    00296 #endif // GEOS_OP_LINEMERGE_LINESEQUENCER_H
    00297
    00298 /**********************************************************************
    00299  * $Log$
    00300  * Revision 1.1  2006/03/22 10:13:53  strk
    00301  * opLinemerge.h split
    00302  *
    00303  **********************************************************************/