示例#1
0
/*private*/
void
PolygonBuilder::buildMaximalEdgeRings(const vector<DirectedEdge*> *dirEdges,
  vector<MaximalEdgeRing*> &maxEdgeRings)
	// throw(const TopologyException &)
{
#if GEOS_DEBUG
	cerr<<"PolygonBuilder::buildMaximalEdgeRings got "<<dirEdges->size()<<" dirEdges"<<endl;
#endif

	vector<MaximalEdgeRing*>::size_type oldSize = maxEdgeRings.size();

	for(size_t i=0, n=dirEdges->size(); i<n; i++)
	{
		DirectedEdge *de=(*dirEdges)[i];
#if GEOS_DEBUG
	cerr << "  dirEdge " << i << endl
	     << de->printEdge() << endl
	     << " inResult:" << de->isInResult() << endl
	     << " isArea:" << de->getLabel()->isArea() << endl;
#endif
		if (de->isInResult() && de->getLabel().isArea())
		{
			// if this edge has not yet been processed
			if (de->getEdgeRing() == NULL)
			{
				MaximalEdgeRing *er;
	try
	{ // MaximalEdgeRing constructor may throw
				er=new MaximalEdgeRing(de,geometryFactory);
	}
	catch (util::GEOSException&)
	{ // cleanup if that happens (see stmlf-cases-20061020.xml)
		for(size_t i=oldSize, n=maxEdgeRings.size(); i<n; i++)
			delete maxEdgeRings[i];
		//cerr << "Exception! " << e.what() << endl;
		throw;
	}
				maxEdgeRings.push_back(er);
				er->setInResult();
				//System.out.println("max node degree=" + er.getMaxDegree());
			}
		}
	}
#if GEOS_DEBUG
	cerr<<"  pushed "<<maxEdgeRings.size()-oldSize<<" maxEdgeRings"<<endl;
#endif
}
/*private*/
void
ConnectedInteriorTester::buildEdgeRings(std::vector<EdgeEnd*> *dirEdges,
                                        std::vector<EdgeRing*>& minEdgeRings)
{
#if GEOS_DEBUG
	cerr << __FUNCTION__ << " got " << dirEdges->size() << " EdgeEnd vector" << endl;
#endif

	typedef std::vector<EdgeEnd*> EdgeEnds;

	//std::vector<MinimalEdgeRing*> minEdgeRings;
	for(EdgeEnds::size_type i=0, n=dirEdges->size(); i<n; ++i)
	{
#ifdef GEOS_CAST_PARANOIA
		assert(dynamic_cast<DirectedEdge*>((*dirEdges)[i]));
#endif
		DirectedEdge *de=static_cast<DirectedEdge*>((*dirEdges)[i]);

#if GEOS_DEBUG
		cerr << "DirectedEdge " << i << ": " << de->print() << endl;
#endif

		// if this edge has not yet been processed
		if(de->isInResult() && de->getEdgeRing()==nullptr)
		{
			MaximalEdgeRing* er = new MaximalEdgeRing(de,
			                                   geometryFactory.get());
			// We track MaximalEdgeRings allocations
			// using the private maximalEdgeRings vector
			maximalEdgeRings.push_back(er);

			er->linkDirectedEdgesForMinimalEdgeRings();
			er->buildMinimalRings(minEdgeRings);
		}
	}
/*
	std::vector<EdgeRing*> *edgeRings=new std::vector<EdgeRing*>();
	edgeRings->assign(minEdgeRings.begin(), minEdgeRings.end());
	return edgeRings;
*/
}
示例#3
0
/*private*/
void
PolygonBuilder::buildMinimalEdgeRings(
  vector<MaximalEdgeRing*> &maxEdgeRings,
	vector<EdgeRing*> &newShellList, vector<EdgeRing*> &freeHoleList,
	vector<MaximalEdgeRing*> &edgeRings)
{
	for(size_t i=0, n=maxEdgeRings.size(); i<n; ++i)
	{
		MaximalEdgeRing *er = maxEdgeRings[i];
#if GEOS_DEBUG
	cerr<<"buildMinimalEdgeRings: maxEdgeRing "<<i<<" has "<<er->getMaxNodeDegree()<<" maxNodeDegree"<<endl;
#endif
		if (er->getMaxNodeDegree()>2)
		{
			er->linkDirectedEdgesForMinimalEdgeRings();
			vector<MinimalEdgeRing*> minEdgeRings;
			er->buildMinimalRings(minEdgeRings);
			// at this point we can go ahead and attempt to place
			// holes, if this EdgeRing is a polygon
			EdgeRing *shell=findShell(&minEdgeRings);
			if(shell != NULL)
			{
				placePolygonHoles(shell, &minEdgeRings);
				newShellList.push_back(shell);
			}
			else
			{
				freeHoleList.insert(freeHoleList.end(),
						minEdgeRings.begin(),
						minEdgeRings.end() );
			}
			delete er;
		}
		else
		{
			edgeRings.push_back(er);
		}
	}
}