📄 linemerger.cpp
字号:
/********************************************************************** * $Id: LineMerger.cpp 1820 2006-09-06 16:54:23Z mloskot $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2005-2006 Refractions Research Inc. * Copyright (C) 2001-2002 Vivid Solutions Inc. * * This is free software; you can redistribute and/or modify it under * the terms of the GNU Lesser General Public Licence as published * by the Free Software Foundation. * See the COPYING file for more information. * **********************************************************************/#include <geos/operation/linemerge/LineMerger.h>#include <geos/operation/linemerge/LineMergeDirectedEdge.h>#include <geos/operation/linemerge/EdgeString.h>#include <geos/planargraph/DirectedEdge.h>#include <geos/planargraph/Edge.h>#include <geos/planargraph/Node.h>#include <geos/geom/GeometryComponentFilter.h>#include <geos/geom/LineString.h>#include <cassert>#include <functional>#include <vector>using namespace std;using namespace geos::planargraph;using namespace geos::geom;#ifndef GEOS_DEBUG#define GEOS_DEBUG 0#endifnamespace geos {namespace operation { // geos.operationnamespace linemerge { // geos.operation.linemergevoidLineMerger::add(vector<Geometry*> *geometries){ for(size_t i=0, n=geometries->size(); i<n; i++) { Geometry *geometry=(*geometries)[i]; add(geometry); }}LineMerger::LineMerger(): mergedLineStrings(NULL), factory(NULL){}LineMerger::~LineMerger(){ for (size_t i=0, n=edgeStrings.size(); i<n; ++i) { delete edgeStrings[i]; }}struct LMGeometryComponentFilter: public GeometryComponentFilter { LineMerger *lm; LMGeometryComponentFilter(LineMerger *newLm): lm(newLm) {} void filter(const Geometry *geom) { const LineString *ls = dynamic_cast<const LineString *>(geom); if ( ls ) lm->add(ls); }};/** * Adds a Geometry to be processed. May be called multiple times. * Any dimension of Geometry may be added; the constituent linework will be * extracted. */ voidLineMerger::add(const Geometry *geometry){ LMGeometryComponentFilter lmgcf(this); geometry->applyComponentFilter(lmgcf);}voidLineMerger::add(const LineString *lineString){ if (factory==NULL) factory=lineString->getFactory(); graph.addEdge(lineString);}voidLineMerger::merge(){ if (mergedLineStrings!=NULL) return; buildEdgeStringsForObviousStartNodes(); buildEdgeStringsForIsolatedLoops(); unsigned numEdgeStrings = edgeStrings.size(); mergedLineStrings=new vector<LineString*>(numEdgeStrings); for (size_t i=0; i<numEdgeStrings; ++i) { EdgeString *edgeString=edgeStrings[i]; (*mergedLineStrings)[i]=edgeString->toLineString(); } }voidLineMerger::buildEdgeStringsForObviousStartNodes(){ buildEdgeStringsForNonDegree2Nodes();}voidLineMerger::buildEdgeStringsForIsolatedLoops(){ buildEdgeStringsForUnprocessedNodes();} voidLineMerger::buildEdgeStringsForUnprocessedNodes(){#if GEOS_DEBUG cerr<<__FUNCTION__<<endl;#endif vector<Node*> *nodes=graph.getNodes(); for (size_t i=0; i<nodes->size(); ++i) { Node *node=(*nodes)[i];#if GEOS_DEBUG cerr<<"Node "<<i<<": "<<*node<<endl;#endif if (!node->isMarked()) { assert(node->getDegree()==2); buildEdgeStringsStartingAt(node); node->setMarked(true);#if GEOS_DEBUG cerr<<" setMarked(true) : "<<*node<<endl;#endif } } delete nodes;}voidLineMerger::buildEdgeStringsForNonDegree2Nodes(){#if GEOS_DEBUG cerr<<__FUNCTION__<<endl;#endif vector<Node*> *nodes=graph.getNodes(); size_t size=nodes->size(); for (size_t i=0; i<size; i++) { Node *node=(*nodes)[i];#if GEOS_DEBUG cerr<<"Node "<<i<<": "<<*node<<endl;#endif if (node->getDegree()!=2) { buildEdgeStringsStartingAt(node); node->setMarked(true);#if GEOS_DEBUG cerr<<" setMarked(true) : "<<*node<<endl;#endif } } delete nodes;}voidLineMerger::buildEdgeStringsStartingAt(Node *node){ vector<planargraph::DirectedEdge*> &edges=node->getOutEdges()->getEdges(); size_t size = edges.size(); for (size_t i=0; i<size; i++) { assert(dynamic_cast<LineMergeDirectedEdge*>(edges[i])); LineMergeDirectedEdge *directedEdge=\ static_cast<LineMergeDirectedEdge*> (edges[i]); if (directedEdge->getEdge()->isMarked()) { continue; } edgeStrings.push_back(buildEdgeStringStartingWith(directedEdge)); }}EdgeString*LineMerger::buildEdgeStringStartingWith(LineMergeDirectedEdge *start){ EdgeString *edgeString = new EdgeString(factory); LineMergeDirectedEdge *current=start; do { edgeString->add(current); current->getEdge()->setMarked(true); current=current->getNext(); } while (current!=NULL && current!=start); return edgeString;}/** * Returns the LineStrings built by the merging process. */vector<LineString*>*LineMerger::getMergedLineStrings(){ merge(); return mergedLineStrings;}} // namespace geos.operation.linemerge} // namespace geos.operation} // namespace geos/********************************************************************** * $Log$ * Revision 1.15 2006/06/12 11:29:24 strk * unsigned int => size_t * * Revision 1.14 2006/03/22 10:13:54 strk * opLinemerge.h split * * Revision 1.13 2006/03/21 21:42:54 strk * planargraph.h header split, planargraph:: classes renamed to match JTS symbols * **********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -