private CoordinateInfo[] ParseCoordinateSequence(WktTokenQueue tokens, Dimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(new CoordinateInfo[0]); } tokens.Dequeue(WktTokenType.LeftParenthesis); var coordinates = new List <CoordinateInfo> { ParseCoordinate(tokens, dimensions) }; while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); coordinates.Add(ParseCoordinate(tokens, dimensions)); } tokens.Dequeue(WktTokenType.RightParenthesis); return(coordinates.ToArray()); }
private object ParseGeometryCollection(WktTokenQueue tokens) { tokens.Dequeue("GEOMETRYCOLLECTION"); ParseDimensions(tokens); if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(_shapeConverter.ToGeometryCollection(new object[0])); } tokens.Dequeue(WktTokenType.LeftParenthesis); var geometries = new List <object>(); geometries.Add(ParseGeometry(tokens)); while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); geometries.Add(ParseGeometry(tokens)); } tokens.Dequeue(WktTokenType.RightParenthesis); return(_shapeConverter.ToGeometryCollection(geometries.ToArray())); }
private List <double> ParseOptionalOrdinates(WktTokenQueue tokens) { var attempt = true; var doubles = new List <double>(); while (attempt) { if (tokens.NextTokenIs(WktTokenType.Number)) { var token = tokens.Dequeue(WktTokenType.Number); doubles.Add(double.Parse(token.Value, CultureInfo.InvariantCulture)); } else if (tokens.NextTokenIs(double.NaN.ToString(CultureInfo.InvariantCulture))) { //TODO: Review this tokens.Dequeue(WktTokenType.String); doubles.Add(double.NaN); } else { attempt = false; } } return(doubles); }
private object ParseMultiPolygon(WktTokenQueue tokens) { tokens.Dequeue("MULTIPOLYGON"); var dimensions = ParseDimensions(tokens); if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(_shapeConverter.ToMultiPolygon(new CoordinateInfo[0][][])); } tokens.Dequeue(WktTokenType.LeftParenthesis); var polygons = new List <CoordinateInfo[][]> { ParseLineStrings(tokens, dimensions) }; while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); polygons.Add(ParseLineStrings(tokens, dimensions)); } tokens.Dequeue(WktTokenType.RightParenthesis); return(_shapeConverter.ToMultiPolygon(polygons.ToArray())); }
private object ParsePolygonInner(WktTokenQueue tokens, Dimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(_shapeConverter.FromPolygon(new CoordinateInfo[0][][])); } var linestrings = ParseLineStrings(tokens, dimensions); return(_shapeConverter.ToPolygon(linestrings)); }
private CoordinateInfo ParseMultiPointCoordinate(WktTokenQueue tokens, Dimensions dimensions) { if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(null); } 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(coordinate); }
private object ParseMultiLineString(WktTokenQueue tokens) { tokens.Dequeue("multilinestring"); var dimensions = ParseDimensions(tokens); if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(_shapeConverter.ToMultiLineString(new CoordinateInfo[0][])); } var lineStrings = ParseLineStrings(tokens, dimensions); return(_shapeConverter.ToMultiLineString(lineStrings)); }
private CoordinateInfo[][] ParseLineStrings(WktTokenQueue tokens, Dimensions dimensions) { tokens.Dequeue(WktTokenType.LeftParenthesis); var lineStrings = new List <CoordinateInfo[]> { ParseCoordinateSequence(tokens, dimensions) }; while (tokens.NextTokenIs(WktTokenType.Comma)) { tokens.Dequeue(); lineStrings.Add(ParseCoordinateSequence(tokens, dimensions)); } tokens.Dequeue(WktTokenType.RightParenthesis); return(lineStrings.ToArray()); }
private object ParsePoint(WktTokenQueue tokens) { tokens.Dequeue("POINT"); var dimensions = ParseDimensions(tokens); if (tokens.NextTokenIs("EMPTY")) { tokens.Dequeue(); return(_shapeConverter.ToPoint(null)); } tokens.Dequeue(WktTokenType.LeftParenthesis); var coordinate = ParseCoordinate(tokens, dimensions); tokens.Dequeue(WktTokenType.RightParenthesis); return(_shapeConverter.ToPoint(coordinate)); }