private Coordinate ParseCoordinate(WktTokenQueue tokens, WktDimensions dimensions) { var token = tokens.Dequeue(WktTokenType.Number); var x = double.Parse(token.Value, CultureInfo.InvariantCulture); token = tokens.Dequeue(WktTokenType.Number); var y = double.Parse(token.Value, CultureInfo.InvariantCulture); var z = double.NaN; var m = double.NaN; var optional = ParseOptionalOrdinates(tokens); if (optional.Count > 0) { if (dimensions == WktDimensions.XYM) { m = optional[0]; } else { z = optional[0]; if (optional.Count > 1) m = optional[1]; } } if (!double.IsNaN(z) && !double.IsNaN(m)) return new CoordinateZM(y, x, z, m); if (!double.IsNaN(z)) return new CoordinateZ(y, x, z); if (!double.IsNaN(m)) return new CoordinateM(y, x, m); return new Coordinate(y, x); }
private List <LineString> ParseLineStrings(WktTokenQueue tokens, WktDimensions dimensions) { var lineStrings = new List <LineString> { ParseLineStringInner(tokens, dimensions) }; while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); lineStrings.Add(ParseLineStringInner(tokens, dimensions)); } return(lineStrings); }
private Polygon ParsePolygonInner(WktTokenQueue tokens, WktDimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(Polygon.Empty); } tokens.Dequeue(WktTokenType.LeftParenthesis); var linestrings = ParseLineStrings(tokens, dimensions); tokens.Dequeue(WktTokenType.RightParenthesis); return(new Polygon(new LinearRing(linestrings.First().Coordinates), linestrings.Skip(1).Select(x => new LinearRing(x.Coordinates)))); }
private Coordinate ParseCoordinate(WktTokenQueue tokens, WktDimensions dimensions) { var token = tokens.Dequeue(WktTokenType.Number); var x = double.Parse(token.Value, CultureInfo.InvariantCulture); token = tokens.Dequeue(WktTokenType.Number); var y = double.Parse(token.Value, CultureInfo.InvariantCulture); var z = double.NaN; var m = double.NaN; var optional = ParseOptionalOrdinates(tokens); if (optional.Count > 0) { if (dimensions == WktDimensions.XYM) { m = optional[0]; } else { z = optional[0]; if (optional.Count > 1) { m = optional[1]; } } } if (!double.IsNaN(z) && !double.IsNaN(m)) { return(new CoordinateZM(y, x, z, m)); } if (!double.IsNaN(z)) { return(new CoordinateZ(y, x, z)); } if (!double.IsNaN(m)) { return(new CoordinateM(y, x, m)); } return(new Coordinate(y, x)); }
private CoordinateSequence ParseCoordinateSequence(WktTokenQueue tokens, WktDimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return null; } tokens.Dequeue(WktTokenType.LeftParenthesis); var coordinates = new List<Coordinate> { ParseCoordinate(tokens, dimensions) }; while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); coordinates.Add(ParseCoordinate(tokens, dimensions)); } tokens.Dequeue(WktTokenType.RightParenthesis); return new CoordinateSequence(coordinates); }
private Point ParseMultiPointCoordinate(WktTokenQueue tokens, WktDimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(Point.Empty); } var parenthesis = false; if (tokens.NextTokenIs(WktTokenType.LeftParenthesis)) { tokens.Dequeue(WktTokenType.LeftParenthesis); parenthesis = true; } var coordinate = ParseCoordinate(tokens, dimensions); if (parenthesis && tokens.NextTokenIs(WktTokenType.RightParenthesis)) { tokens.Dequeue(WktTokenType.RightParenthesis); } return(new Point(coordinate)); }
private CoordinateSequence ParseCoordinateSequence(WktTokenQueue tokens, WktDimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(null); } tokens.Dequeue(WktTokenType.LeftParenthesis); var coordinates = new List <Coordinate> { ParseCoordinate(tokens, dimensions) }; while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); coordinates.Add(ParseCoordinate(tokens, dimensions)); } tokens.Dequeue(WktTokenType.RightParenthesis); return(new CoordinateSequence(coordinates)); }
private Polygon ParsePolygonInner(WktTokenQueue tokens, WktDimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return Polygon.Empty; } tokens.Dequeue(WktTokenType.LeftParenthesis); var linestrings = ParseLineStrings(tokens, dimensions); tokens.Dequeue(WktTokenType.RightParenthesis); return new Polygon(new LinearRing(linestrings.First().Coordinates), linestrings.Skip(1).Select(x => new LinearRing(x.Coordinates))); }
private Point ParseMultiPointCoordinate(WktTokenQueue tokens, WktDimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return Point.Empty; } var parenthesis = false; if (tokens.NextTokenIs(WktTokenType.LeftParenthesis)) { tokens.Dequeue(WktTokenType.LeftParenthesis); parenthesis = true; } var coordinate = ParseCoordinate(tokens, dimensions); if (parenthesis && tokens.NextTokenIs(WktTokenType.RightParenthesis)) tokens.Dequeue(WktTokenType.RightParenthesis); return new Point(coordinate); }
private List<LineString> ParseLineStrings(WktTokenQueue tokens, WktDimensions dimensions) { var lineStrings = new List<LineString> { ParseLineStringInner(tokens, dimensions) }; while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); lineStrings.Add(ParseLineStringInner(tokens, dimensions)); } return lineStrings; }
private LineString ParseLineStringInner(WktTokenQueue tokens, WktDimensions dimensions) { var coords = ParseCoordinateSequence(tokens, dimensions); return coords == null ? LineString.Empty : new LineString(coords); }
private LineString ParseLineStringInner(WktTokenQueue tokens, WktDimensions dimensions) { var coords = ParseCoordinateSequence(tokens, dimensions); return(coords == null ? LineString.Empty : new LineString(coords)); }