Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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()));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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()));
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
        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());
        }
Exemplo n.º 9
0
        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));
        }