1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/**********************************************************************
* $Id: EdgeString.cpp 1820 2006-09-06 16:54:23Z mloskot $
*
* GEOS - Geometry Engine Open Source
* http://geos.refractions.net
*
* Copyright (C) 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/EdgeString.h>
#include <geos/operation/linemerge/LineMergeEdge.h>
#include <geos/operation/linemerge/LineMergeDirectedEdge.h>
#include <geos/geom/GeometryFactory.h>
#include <geos/geom/CoordinateSequenceFactory.h>
#include <geos/geom/CoordinateSequence.h>
#include <geos/geom/LineString.h>
#include <vector>
#include <cassert>
using namespace std;
using namespace geos::geom;
namespace geos {
namespace operation { // geos.operation
namespace linemerge { // geos.operation.linemerge
/**
* Constructs an EdgeString with the given factory used to convert
* this EdgeString to a LineString
*/
EdgeString::EdgeString(const GeometryFactory *newFactory):
factory(newFactory),
directedEdges(new vector<LineMergeDirectedEdge*>()),
coordinates(NULL)
{
}
EdgeString::~EdgeString() {
delete directedEdges;
}
/**
* Adds a directed edge which is known to form part of this line.
*/
void
EdgeString::add(LineMergeDirectedEdge *directedEdge)
{
directedEdges->push_back(directedEdge);
}
CoordinateSequence *
EdgeString::getCoordinates()
{
if (coordinates==NULL) {
int forwardDirectedEdges = 0;
int reverseDirectedEdges = 0;
coordinates=factory->getCoordinateSequenceFactory()->create(NULL);
for (int i=0;i<(int)directedEdges->size();i++) {
LineMergeDirectedEdge* directedEdge=(*directedEdges)[i];
if (directedEdge->getEdgeDirection()) {
forwardDirectedEdges++;
} else {
reverseDirectedEdges++;
}
assert(dynamic_cast<LineMergeEdge*>(directedEdge->getEdge()));
LineMergeEdge* lme=static_cast<LineMergeEdge*>(
directedEdge->getEdge());
coordinates->add(lme->getLine()->getCoordinatesRO(),
false,
directedEdge->getEdgeDirection());
}
if (reverseDirectedEdges > forwardDirectedEdges) {
CoordinateSequence::reverse(coordinates);
}
}
return coordinates;
}
/*
* Converts this EdgeString into a new LineString.
*/
LineString*
EdgeString::toLineString()
{
return factory->createLineString(getCoordinates());
}
} // namespace geos.operation.linemerge
} // namespace geos.operation
} // namespace geos
/**********************************************************************
* $Log$
* Revision 1.10 2006/03/22 10:13:54 strk
* opLinemerge.h split
*
**********************************************************************/
|