Skip to content

Commit

Permalink
preserve dimension as part of CoordinateArraySequence and while readi…
Browse files Browse the repository at this point in the history
…ng WKT (#345)

git-svn-id: http://svn.osgeo.org/geos/trunk@2990 5242fede-7e19-0410-aef8-94bd7d2200fb
  • Loading branch information
warmerdam committed May 18, 2010
1 parent ac69c95 commit 6449265
Show file tree
Hide file tree
Showing 9 changed files with 54 additions and 35 deletions.
12 changes: 7 additions & 5 deletions include/geos/geom/CoordinateArraySequence.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ namespace geom { // geos.geom
class GEOS_DLL CoordinateArraySequence : public CoordinateSequence {
public:

CoordinateArraySequence(const CoordinateArraySequence &cl);
CoordinateArraySequence(const CoordinateArraySequence &cl);

CoordinateSequence *clone() const;

Expand All @@ -61,10 +61,11 @@ class GEOS_DLL CoordinateArraySequence : public CoordinateSequence {
CoordinateArraySequence();

/// Construct sequence taking ownership of given Coordinate vector
CoordinateArraySequence(std::vector<Coordinate> *coords);

CoordinateArraySequence(std::vector<Coordinate> *coords,
std::size_t dimension = 3);

/// Construct sequence allocating space for n coordinates
CoordinateArraySequence(std::size_t n);
CoordinateArraySequence(std::size_t n, std::size_t dimension = 3);

~CoordinateArraySequence();

Expand Down Expand Up @@ -108,7 +109,7 @@ class GEOS_DLL CoordinateArraySequence : public CoordinateSequence {

void expandEnvelope(Envelope &env) const;

size_t getDimension() const { return 3; }
std::size_t getDimension() const { return dimension; }

void apply_rw(const CoordinateFilter *filter);

Expand All @@ -118,6 +119,7 @@ class GEOS_DLL CoordinateArraySequence : public CoordinateSequence {

private:
std::vector<Coordinate> *vect;
std::size_t dimension;
};

/// This is for backward API compatibility
Expand Down
11 changes: 5 additions & 6 deletions include/geos/geom/CoordinateArraySequenceFactory.inl
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,21 @@ namespace geom { // geos::geom
INLINE CoordinateSequence*
CoordinateArraySequenceFactory::create(std::vector<Coordinate> *coords) const
{
return new CoordinateArraySequence(coords);
return new CoordinateArraySequence(coords,3);
}

INLINE CoordinateSequence *
CoordinateArraySequenceFactory::create(std::vector<Coordinate> *coords,
size_t /* dimension */) const
size_t dimension ) const
{
return new CoordinateArraySequence(coords);
return new CoordinateArraySequence(coords,dimension);
}

INLINE CoordinateSequence *
CoordinateArraySequenceFactory::create(std::size_t size, std::size_t /* dimension */)
CoordinateArraySequenceFactory::create(std::size_t size, std::size_t dimension)
const
{
/* CoordinateArraySequence only accepts 3d Coordinates */
return new CoordinateArraySequence(size);
return new CoordinateArraySequence(size,dimension);
}


Expand Down
5 changes: 3 additions & 2 deletions include/geos/geom/CoordinateSequenceFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ class GEOS_DLL CoordinateSequenceFactory {
* @param coordinates the coordinates
*/
virtual CoordinateSequence *create(
std::vector<Coordinate> *coordinates) const=0;
std::vector<Coordinate> *coordinates,
std::size_t dimension=3 ) const=0;

/** \brief
* Creates a CoordinateSequence of the specified size and dimension.
Expand All @@ -76,7 +77,7 @@ class GEOS_DLL CoordinateSequenceFactory {
* (if user-specifiable, otherwise ignored)
*/
virtual CoordinateSequence *create(std::size_t size,
size_t dimension) const=0;
std::size_t dimension) const=0;

virtual ~CoordinateSequenceFactory();
};
Expand Down
2 changes: 1 addition & 1 deletion include/geos/io/WKTReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class GEOS_DLL WKTReader {
const geom::GeometryFactory *geometryFactory;
const geom::PrecisionModel *precisionModel;

void getPreciseCoordinate(io::StringTokenizer *tokenizer, geom::Coordinate&);
void getPreciseCoordinate(io::StringTokenizer *tokenizer, geom::Coordinate&, std::size_t &dim );

bool isNumberNext(io::StringTokenizer *tokenizer);
};
Expand Down
17 changes: 11 additions & 6 deletions src/geom/CoordinateArraySequence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,26 +31,31 @@ namespace geos {
namespace geom { // geos::geom

CoordinateArraySequence::CoordinateArraySequence():
vect(new vector<Coordinate>())
vect(new vector<Coordinate>()),
dimension(3)
{
}

CoordinateArraySequence::CoordinateArraySequence(size_t n):
vect(new vector<Coordinate>(n))
CoordinateArraySequence::CoordinateArraySequence(size_t n,
size_t dimension_in ):
vect(new vector<Coordinate>(n)),
dimension(dimension_in)
{
}

CoordinateArraySequence::CoordinateArraySequence(
vector<Coordinate> *coords): vect(coords)
vector<Coordinate> *coords, size_t dimension_in )
: vect(coords), dimension(dimension_in)
{
if ( ! vect ) vect = new vector<Coordinate>();
}

CoordinateArraySequence::CoordinateArraySequence(
const CoordinateArraySequence &c)
const CoordinateArraySequence &c )
:
CoordinateSequence(c),
vect(new vector<Coordinate>(*(c.vect)))
vect(new vector<Coordinate>(*(c.vect))),
dimension(c.getDimension())
{
}

Expand Down
3 changes: 2 additions & 1 deletion src/geom/GeometryFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,8 @@ GeometryFactory::createPoint(const Coordinate& coordinate) const
if (coordinate.isNull()) {
return createPoint();
} else {
CoordinateSequence *cl=coordinateListFactory->create(new vector<Coordinate>(1, coordinate));
std::size_t dim = ISNAN(coordinate.z) ? 2 : 3;
CoordinateSequence *cl = coordinateListFactory->create(new vector<Coordinate>(1, coordinate), dim);
//cl->setAt(coordinate, 0);
Point *ret = createPoint(cl);
return ret;
Expand Down
25 changes: 18 additions & 7 deletions src/io/WKTReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,39 +72,47 @@ WKTReader::read(const string &wellKnownText)
CoordinateSequence*
WKTReader::getCoordinates(StringTokenizer *tokenizer)
{
size_t dim;
string nextToken=getNextEmptyOrOpener(tokenizer);
if (nextToken=="EMPTY") {
return geometryFactory->getCoordinateSequenceFactory()->create(NULL);
//new CoordinateArraySequence();
}
CoordinateSequence *coordinates = \
geometryFactory->getCoordinateSequenceFactory()->create(NULL);

Coordinate coord;
getPreciseCoordinate(tokenizer, coord);
getPreciseCoordinate(tokenizer, coord, dim);

CoordinateSequence *coordinates = \
geometryFactory->getCoordinateSequenceFactory()->create((size_t)0,dim);
coordinates->add(coord);
try {
nextToken=getNextCloserOrComma(tokenizer);
while (nextToken==",") {
getPreciseCoordinate(tokenizer, coord);
getPreciseCoordinate(tokenizer, coord, dim );
coordinates->add(coord);
nextToken=getNextCloserOrComma(tokenizer);
}
} catch (...) {
delete coordinates;
throw;
}

return coordinates;
}

void
WKTReader::getPreciseCoordinate(StringTokenizer *tokenizer, Coordinate& coord)
WKTReader::getPreciseCoordinate(StringTokenizer *tokenizer,
Coordinate& coord,
size_t &dim )
{
coord.x=getNextNumber(tokenizer);
coord.y=getNextNumber(tokenizer);
if (isNumberNext(tokenizer)) {
coord.z=getNextNumber(tokenizer);
dim = 3;
} else {
coord.z=DoubleNotANumber;
dim = 2;
}
precisionModel->makePrecise(coord);
}
Expand Down Expand Up @@ -221,13 +229,14 @@ WKTReader::readGeometryTaggedText(StringTokenizer *tokenizer)
Point*
WKTReader::readPointText(StringTokenizer *tokenizer)
{
size_t dim;
string nextToken=getNextEmptyOrOpener(tokenizer);
if (nextToken=="EMPTY") {
return geometryFactory->createPoint(Coordinate::getNull());
}

Coordinate coord;
getPreciseCoordinate(tokenizer, coord);
getPreciseCoordinate(tokenizer, coord, dim);
getNextCloser(tokenizer);

return geometryFactory->createPoint(coord);
Expand Down Expand Up @@ -258,14 +267,16 @@ WKTReader::readMultiPointText(StringTokenizer *tokenizer)

if ( tok == StringTokenizer::TT_NUMBER )
{
size_t dim;

// Try to parse deprecated form "MULTIPOINT(0 0, 1 1)"
const CoordinateSequenceFactory* csf = \
geometryFactory->getCoordinateSequenceFactory();
CoordinateSequence *coords = csf->create(NULL);
try {
do {
Coordinate coord;
getPreciseCoordinate(tokenizer, coord);
getPreciseCoordinate(tokenizer, coord, dim);
coords->add(coord);
nextToken=getNextCloserOrComma(tokenizer);
} while(nextToken == ",");
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/noding/BasicSegmentStringTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ namespace tut
template<>
void object::test<1>()
{
CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
CoordinateSequenceAutoPtr cs(csFactory->create((size_t)0, 2));

ensure(0 != cs.get());

Expand Down Expand Up @@ -107,7 +107,7 @@ namespace tut
template<>
void object::test<2>()
{
CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
CoordinateSequenceAutoPtr cs(csFactory->create((size_t)0, 2));

ensure(0 != cs.get());

Expand Down Expand Up @@ -143,7 +143,7 @@ namespace tut
template<>
void object::test<3>()
{
CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
CoordinateSequenceAutoPtr cs(csFactory->create((size_t)0, 2));

ensure(0 != cs.get());

Expand Down
8 changes: 4 additions & 4 deletions tests/unit/noding/NodedSegmentStringTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ namespace tut
template<>
void object::test<1>()
{
CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
CoordinateSequenceAutoPtr cs(csFactory->create((size_t)0, 2));

ensure(0 != cs.get());

Expand Down Expand Up @@ -111,7 +111,7 @@ namespace tut
template<>
void object::test<2>()
{
CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
CoordinateSequenceAutoPtr cs(csFactory->create((size_t)0, 2));

ensure(0 != cs.get());

Expand Down Expand Up @@ -148,7 +148,7 @@ namespace tut
template<>
void object::test<3>()
{
CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
CoordinateSequenceAutoPtr cs(csFactory->create((size_t)0, 2));

ensure(0 != cs.get());

Expand Down Expand Up @@ -221,7 +221,7 @@ namespace tut
geos::geom::Coordinate p1(10, 0);


CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
CoordinateSequenceAutoPtr cs(csFactory->create((size_t)0, 2));
cs->add(p0);
cs->add(p1);

Expand Down

0 comments on commit 6449265

Please sign in to comment.