polygonizer.cpp
来自「一个很好的vc底层代码」· C++ 代码 · 共 279 行
CPP
279 行
/********************************************************************** * $Id: Polygonizer.cpp,v 1.6.2.1 2005/06/17 15:07:48 strk Exp $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2001-2002 Vivid Solutions Inc. * Copyright (C) 2005 Refractions Research 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/opPolygonize.h>#include <typeinfo>//#define DEBUG 1namespace geos {Polygonizer::LineStringAdder::LineStringAdder(Polygonizer *p) { pol=p;}void Polygonizer::LineStringAdder::filter_rw(Geometry *g) { LineString *ls = dynamic_cast<LineString *>(g); if ( ls ) pol->add(ls);}/* * Create a polygonizer with the same GeometryFactory * as the input Geometry */Polygonizer::Polygonizer() { lineStringAdder=new Polygonizer::LineStringAdder(this); graph=NULL; dangles=NULL; cutEdges=NULL; invalidRingLines=NULL; holeList=NULL; shellList=NULL; polyList=NULL;}Polygonizer::~Polygonizer(){ delete lineStringAdder; delete dangles; delete cutEdges; delete graph; delete holeList; delete shellList; if ( invalidRingLines ) { for (unsigned int i=0; i<invalidRingLines->size(); i++) delete (*invalidRingLines)[i]; delete invalidRingLines; } if ( polyList ) { for (unsigned int i=0; i<polyList->size(); i++) delete (*polyList)[i]; delete polyList; }}/* * Add a collection of geometries to be polygonized. * May be called multiple times. * Any dimension of Geometry may be added; * the constituent linework will be extracted and used * * @param geomList a list of {@link Geometry}s with linework to be polygonized */void Polygonizer::add(vector<Geometry*> *geomList){ for(int i=0;i<(int)geomList->size();i++) { Geometry *geometry=(*geomList)[i]; add(geometry); }}/* * Add a geometry to the linework to be polygonized. * May be called multiple times. * Any dimension of Geometry may be added; * the constituent linework will be extracted and used * * @param g a Geometry with linework to be polygonized */void Polygonizer::add(Geometry *g) { g->apply_rw(lineStringAdder);}/* * Add a linestring to the graph of polygon edges. * * @param line the LineString to add */void Polygonizer::add(LineString *line){ // create a new graph using the factory from the input Geometry if (graph==NULL) graph=new PolygonizeGraph(line->getFactory()); graph->addEdge(line);}/* * Gets the list of polygons formed by the polygonization. * @return a collection of Polygons */vector<Polygon*>*Polygonizer::getPolygons(){ polygonize(); vector<Polygon *> *ret = polyList; polyList = NULL; return ret;}/* * Get the list of dangling lines found during polygonization. * @return a collection of dangles LineStrings from input. */vector<const LineString*>*Polygonizer::getDangles(){ polygonize(); return dangles;}/* * Get the list of cut edges found during polygonization. * @return a collection of the input {@LineStrings} which are cut edges */vector<const LineString*>*Polygonizer::getCutEdges() { polygonize(); return cutEdges;}/* * Get the list of lines forming invalid rings found during polygonization. * @return a collection of the input {@LineStrings} which form invalid rings */vector<LineString*>*Polygonizer::getInvalidRingLines(){ polygonize(); vector<LineString*> *ret = invalidRingLines; invalidRingLines = NULL; return ret;}/* * Perform the polygonization, if it has not already been carried out. */voidPolygonizer::polygonize(){ // check if already computed if (polyList!=NULL) return; polyList=new vector<Polygon*>(); if (graph==NULL) // No valid geometries added { return; } dangles=graph->deleteDangles(); cutEdges=graph->deleteCutEdges(); vector<polygonizeEdgeRing*> *edgeRingList=graph->getEdgeRings();#if DEBUG cerr<<"Polygonizer::polygonize(): "<<edgeRingList->size()<<" edgeRings in graph"<<endl;#endif vector<polygonizeEdgeRing*> *validEdgeRingList=new vector<polygonizeEdgeRing*>(); invalidRingLines=new vector<LineString*>(); findValidRings(edgeRingList, validEdgeRingList, invalidRingLines);#if DEBUG cerr<<" "<<validEdgeRingList->size()<<" valid"<<endl; cerr<<" "<<invalidRingLines->size()<<" invalid"<<endl;#endif delete edgeRingList; findShellsAndHoles(validEdgeRingList);#if DEBUG cerr<<" "<<holeList->size()<<" holes"<<endl; cerr<<" "<<shellList->size()<<" shells"<<endl;#endif assignHolesToShells(holeList, shellList); for (int i=0;i<(int)shellList->size();i++) { polygonizeEdgeRing *er=(*shellList)[i]; polyList->push_back(er->getPolygon()); } delete validEdgeRingList;}voidPolygonizer::findValidRings(vector<polygonizeEdgeRing*> *edgeRingList, vector<polygonizeEdgeRing*> *validEdgeRingList, vector<LineString*> *invalidRingList){ for (int i=0;i<(int)edgeRingList->size();i++) { polygonizeEdgeRing *er=(*edgeRingList)[i]; if (er->isValid()) validEdgeRingList->push_back(er); else { invalidRingList->push_back(er->getLineString()); } }}voidPolygonizer::findShellsAndHoles(vector<polygonizeEdgeRing*> *edgeRingList){ holeList=new vector<polygonizeEdgeRing*>(); shellList=new vector<polygonizeEdgeRing*>(); for (int i=0;i<(int)edgeRingList->size();i++) { polygonizeEdgeRing *er=(*edgeRingList)[i]; if (er->isHole()) holeList->push_back(er); else shellList->push_back(er); }}voidPolygonizer::assignHolesToShells(vector<polygonizeEdgeRing*> *holeList,vector<polygonizeEdgeRing*> *shellList){ for (int i=0;i<(int)holeList->size();i++) { polygonizeEdgeRing *holeER=(*holeList)[i]; assignHoleToShell(holeER,shellList); }}voidPolygonizer::assignHoleToShell(polygonizeEdgeRing *holeER, vector<polygonizeEdgeRing*> *shellList){ polygonizeEdgeRing *shell=polygonizeEdgeRing::findEdgeRingContaining(holeER, shellList); if (shell!=NULL) shell->addHole(holeER->getRingOwnership());}} // namespace geos/********************************************************************** * $Log: Polygonizer.cpp,v $ * Revision 1.6.2.1 2005/06/17 15:07:48 strk * Polygonizer segfault fix * * Revision 1.6 2004/12/08 13:54:44 strk * gcc warnings checked and fixed, general cleanups. * * Revision 1.5 2004/10/27 13:57:07 strk * Added some debugging lines (disabled by default) * * Revision 1.4 2004/10/26 16:09:21 strk * Some more intentation and envelope equality check fix. * * Revision 1.3 2004/10/19 19:51:14 strk * Fixed many leaks and bugs in Polygonizer. * Output still bogus. * * Revision 1.2 2004/07/02 13:28:29 strk * Fixed all #include lines to reflect headers layout change. * Added client application build tips in README. * * Revision 1.1 2004/04/08 04:53:56 ybychkov * "operation/polygonize" ported from JTS 1.4 * * **********************************************************************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?