[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