[geos-commits] r2994 - in trunk: src/io tests/unit/io
svn_geos at osgeo.org
svn_geos at osgeo.org
Fri May 28 16:32:15 EDT 2010
Author: warmerdam
Date: 2010-05-28 16:32:14 -0400 (Fri, 28 May 2010)
New Revision: 2994
Modified:
trunk/src/io/WKTReader.cpp
trunk/tests/unit/io/WKTReaderTest.cpp
Log:
add support for reading SF1.2 Z/M/ZM geometries (#347)
Modified: trunk/src/io/WKTReader.cpp
===================================================================
--- trunk/src/io/WKTReader.cpp 2010-05-19 05:22:24 UTC (rev 2993)
+++ trunk/src/io/WKTReader.cpp 2010-05-28 20:32:14 UTC (rev 2994)
@@ -110,6 +110,11 @@
if (isNumberNext(tokenizer)) {
coord.z=getNextNumber(tokenizer);
dim = 3;
+
+ // If there is a fourth value (M) read and discard it.
+ if (isNumberNext(tokenizer))
+ getNextNumber(tokenizer);
+
} else {
coord.z=DoubleNotANumber;
dim = 2;
@@ -151,10 +156,15 @@
WKTReader::getNextEmptyOrOpener(StringTokenizer *tokenizer)
{
string nextWord=getNextWord(tokenizer);
+
+ // Skip the Z, M or ZM of an SF1.2 3/4 dim coordinate.
+ if (nextWord == "Z" || nextWord == "M" || nextWord == "ZM" )
+ nextWord = getNextWord(tokenizer);
+
if (nextWord=="EMPTY" || nextWord=="(") {
return nextWord;
}
- throw ParseException("Expected 'EMPTY' or '(' but encountered ",nextWord);
+ throw ParseException("Expected 'Z', 'M', 'ZM', 'EMPTY' or '(' but encountered ",nextWord);
}
string
Modified: trunk/tests/unit/io/WKTReaderTest.cpp
===================================================================
--- trunk/tests/unit/io/WKTReaderTest.cpp 2010-05-19 05:22:24 UTC (rev 2993)
+++ trunk/tests/unit/io/WKTReaderTest.cpp 2010-05-28 20:32:14 UTC (rev 2994)
@@ -6,6 +6,7 @@
#include <tut.hpp>
// geos
#include <geos/io/WKTReader.h>
+#include <geos/io/WKTWriter.h>
#include <geos/geom/PrecisionModel.h>
#include <geos/geom/GeometryFactory.h>
#include <geos/geom/Geometry.h>
@@ -27,6 +28,7 @@
geos::geom::PrecisionModel pm;
geos::geom::GeometryFactory gf;
geos::io::WKTReader wktreader;
+ geos::io::WKTWriter wktwriter;
typedef std::auto_ptr<geos::geom::Geometry> GeomPtr;
@@ -35,7 +37,9 @@
pm(1.0),
gf(&pm),
wktreader(&gf)
- {}
+ {
+ wktwriter.setOutputDimension( 3 );
+ }
};
@@ -61,7 +65,7 @@
ensure( coords->getX(0) == -117 );
ensure( coords->getY(0) == 33 );
delete coords;
- }
+ }
// 2 - Read a point, confirm 3D.
template<>
@@ -74,7 +78,7 @@
ensure( coords->getDimension() == 3 );
ensure( coords->getOrdinate(0,geos::geom::CoordinateSequence::Z) == 10.0 );
delete coords;
- }
+ }
// 3 - Linestring dimension preserved.
template<>
@@ -87,7 +91,24 @@
ensure( coords->getDimension() == 2 );
delete coords;
- }
+ }
+ // 4 - Ensure we can read ZM geometries, just discarding the M.
+ template<>
+ template<>
+ void object::test<4>()
+ {
+ GeomPtr geom(wktreader.read("LINESTRING ZM (-117 33 2 3, -116 34 4 5)"));
+ geos::geom::CoordinateSequence *coords = geom->getCoordinates();
+
+ ensure( coords->getDimension() == 3 );
+
+ ensure_equals( wktwriter.write(geom.get()),
+ std::string("LINESTRING Z (-117.0 33.0 2.0, -116.0 34.0 4.0)") );
+
+ delete coords;
+ }
+
} // namespace tut
+
More information about the geos-commits
mailing list