/// <summary> /// Creates a Point using the next token in the stream. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text /// format. The next tokens must form a <Point Text>.</param> /// <returns>Returns a Point specified by the next token in /// the stream.</returns> /// <remarks> /// ParseException is thrown if an unexpected token is encountered. /// </remarks> private static Point ReadPointText(WktStreamTokenizer tokenizer) { Point p = new Point(); string nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") { return(p); } p.X = GetNextNumber(tokenizer); p.Y = GetNextNumber(tokenizer); GetNextCloser(tokenizer); return(p); }
/// <summary> /// Creates a <see cref="GeometryCollection"/> using the next token in the stream. /// </summary> /// <param name="tokenizer"> Tokenizer over a stream of text in Well-known Text /// format. The next tokens must form a GeometryCollection Text.</param> /// <returns> /// A <see cref="GeometryCollection"/> specified by the next token in the stream.</returns> private static GeometryCollection ReadGeometryCollectionText(WktStreamTokenizer tokenizer) { GeometryCollection geometries = new GeometryCollection(); string nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken.Equals("EMPTY")) { return(geometries); } geometries.Collection.Add(ReadGeometryTaggedText(tokenizer)); nextToken = GetNextCloserOrComma(tokenizer); while (nextToken.Equals(",")) { geometries.Collection.Add(ReadGeometryTaggedText(tokenizer)); nextToken = GetNextCloserOrComma(tokenizer); } return(geometries); }
/// <summary> /// Creates a Point using the next token in the stream. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text /// format. The next tokens must form a <Point Text>.</param> /// <returns>Returns a Point specified by the next token in /// the stream.</returns> /// <remarks> /// ParseException is thrown if an unexpected token is encountered. /// </remarks> private static MultiPoint ReadMultiPointText(WktStreamTokenizer tokenizer) { MultiPoint mp = new MultiPoint(); string nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") { return(mp); } mp.Points.Add(new Point(GetNextNumber(tokenizer), GetNextNumber(tokenizer))); nextToken = GetNextCloserOrComma(tokenizer); while (nextToken == ",") { mp.Points.Add(new Point(GetNextNumber(tokenizer), GetNextNumber(tokenizer))); nextToken = GetNextCloserOrComma(tokenizer); } return(mp); }
/// <summary> /// Creates a <see cref="MultiLineString"/> using the next token in the stream. /// </summary> /// <param name="tokenizer">tokenizer over a stream of text in Well-known Text format. The next tokens must form a MultiLineString Text</param> /// <returns>a <see cref="MultiLineString"/> specified by the next token in the stream</returns> private static MultiLineString ReadMultiLineStringText(WktStreamTokenizer tokenizer) { MultiLineString lines = new MultiLineString(); string nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") { return(lines); } lines.LineStrings.Add(ReadLineStringText(tokenizer)); nextToken = GetNextCloserOrComma(tokenizer); while (nextToken == ",") { lines.LineStrings.Add(ReadLineStringText(tokenizer)); nextToken = GetNextCloserOrComma(tokenizer); } return(lines); }
/// <summary> /// Creates a Geometry using the next token in the stream. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text /// format. The next tokens must form a <Geometry Tagged Text>.</param> /// <returns>Returns a Geometry specified by the next token in the stream.</returns> /// <remarks> /// Exception is thrown if the coordinates used to create a Polygon /// shell and holes do not form closed linestrings, or if an unexpected /// token is encountered. /// </remarks> private static RGeos.Geometries.Geometry ReadGeometryTaggedText(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string type = tokenizer.GetStringValue().ToUpper(); RGeos.Geometries.Geometry geometry = null; switch (type) { case "POINT": geometry = ReadPointText(tokenizer); break; case "LINESTRING": geometry = ReadLineStringText(tokenizer); break; case "MULTIPOINT": geometry = ReadMultiPointText(tokenizer); break; case "MULTILINESTRING": geometry = ReadMultiLineStringText(tokenizer); break; case "POLYGON": geometry = ReadPolygonText(tokenizer); break; case "MULTIPOLYGON": geometry = ReadMultiPolygonText(tokenizer); break; case "GEOMETRYCOLLECTION": geometry = ReadGeometryCollectionText(tokenizer); break; default: throw new Exception(); //throw new Exception(String.Format(Map.NumberFormatEnUs, "Geometrytype '{0}' is not supported.", // type)); } return(geometry); }
/// <summary> /// Creates a Polygon using the next token in the stream. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text /// format. The next tokens must form a <Polygon Text>.</param> /// <returns>Returns a Polygon specified by the next token /// in the stream</returns> /// <remarks> /// ParseException is thown if the coordinates used to create the Polygon /// shell and holes do not form closed linestrings, or if an unexpected /// token is encountered. /// </remarks> private static Polygon ReadPolygonText(WktStreamTokenizer tokenizer) { Polygon pol = new Polygon(); string nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") { return(pol); } pol.ExteriorRing = new LinearRing(GetCoordinates(tokenizer)); nextToken = GetNextCloserOrComma(tokenizer); while (nextToken == ",") { //Add holes pol.InteriorRings.Add(new LinearRing(GetCoordinates(tokenizer))); nextToken = GetNextCloserOrComma(tokenizer); } return(pol); }
/// <summary> /// Creates a <see cref="MultiPolygon"/> using the next token in the stream. /// </summary> /// <param name="tokenizer">tokenizer over a stream of text in Well-known Text /// format. The next tokens must form a MultiPolygon.</param> /// <returns>a <code>MultiPolygon</code> specified by the next token in the /// stream, or if if the coordinates used to create the <see cref="Polygon"/> /// shells and holes do not form closed linestrings.</returns> private static MultiPolygon ReadMultiPolygonText(WktStreamTokenizer tokenizer) { MultiPolygon polygons = new MultiPolygon(); string nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") { return(polygons); } Polygon polygon = ReadPolygonText(tokenizer); polygons.Polygons.Add(polygon); nextToken = GetNextCloserOrComma(tokenizer); while (nextToken == ",") { polygon = ReadPolygonText(tokenizer); polygons.Polygons.Add(polygon); nextToken = GetNextCloserOrComma(tokenizer); } return(polygons); }
/// <summary> /// Converts a Well-known Text representation to a <see cref="RGeos.Geometries.Geometry"/>. /// </summary> /// <param name="reader">A Reader which will return a Geometry Tagged Text /// string (see the OpenGIS Simple Features Specification)</param> /// <returns>Returns a <see cref="RGeos.Geometries.Geometry"/> read from StreamReader. /// An exception will be thrown if there is a parsing problem.</returns> public static RGeos.Geometries.Geometry Parse(TextReader reader) { WktStreamTokenizer tokenizer = new WktStreamTokenizer(reader); return(ReadGeometryTaggedText(tokenizer)); }
/// <summary> /// Creates a LineString using the next token in the stream. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text format. The next /// tokens must form a LineString Text.</param> /// <returns>Returns a LineString specified by the next token in the stream.</returns> /// <remarks> /// ParseException is thrown if an unexpected token is encountered. /// </remarks> private static LineString ReadLineStringText(WktStreamTokenizer tokenizer) { return(new LineString(GetCoordinates(tokenizer))); }
/// <summary> /// Returns the next number in the stream. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known text format. The next token /// must be a number.</param> /// <returns>Returns the next number in the stream.</returns> /// <remarks> /// ParseException is thrown if the next token is not a number. /// </remarks> private static double GetNextNumber(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); return(tokenizer.GetNumericValue()); }