private static string GetNextEmptyOrOpener(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string nextWord = tokenizer.GetStringValue(); if (nextWord == "EMPTY" || nextWord == "(") { return(nextWord); } throw new Exception("Expected 'EMPTY' or '(' but encountered '" + nextWord + "'"); }
private static Polygon ReadPolygonText(WktStreamTokenizer tokenizer) { //var pol = new Polygon(new List<LineString> //{ // new LineString(new List<GeographicPosition>() // { // new GeographicPosition(0,0), // new GeographicPosition(1,1), // new GeographicPosition(0,0) // }) //}); var nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") { return(null); } var aneis = new List <LineString>(); do { var ring = GetCoordinates(tokenizer); var max = ring.Count; var vertices = new List <GeographicPosition>(); for (var i = 0; i < max; i++) { var lng = ring[i]; var lat = ring[i + 1]; var coord = new GeographicPosition(lat, lng); i++; vertices.Add(coord); } aneis.Add(new LineString(vertices)); nextToken = GetNextCloserOrComma(tokenizer); } while (nextToken == ","); var pol = new Polygon( new List <LineString>(aneis) ); return(pol); }
private static Point ReadPointText(WktStreamTokenizer tokenizer) { var p = new Point(new GeographicPosition(0, 0)); var nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") { return(p); } var longitude = GetNextNumber(tokenizer); var latitude = GetNextNumber(tokenizer); p = new Point(new GeographicPosition(latitude, longitude)); GetNextCloser(tokenizer); return(p); }
private static GeoJSONObject ReadGeometryTaggedText(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); var type = tokenizer.GetStringValue().ToUpper(); GeoJSONObject 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); //geometry = ReadMultiPolygonText(tokenizer); break; /*case "GEOMETRYCOLLECTION": * geometry = ReadGeometryCollectionText(tokenizer); * break;*/ default: throw new Exception(String.Format(new CultureInfo("en-US", false).NumberFormat, "Geometrytype '{0}' is not supported.", type)); } return(geometry); }
/*private static CellGeom ReadMultiPointText(WktStreamTokenizer tokenizer) * { * CellGeom mp = new CellGeom(); * mp.coordinates = new List<List<Coordinate>>(); * * List<Coordinate> ring = new List<Coordinate>(); * * string nextToken = GetNextEmptyOrOpener(tokenizer); * if (nextToken == "EMPTY") * return mp; * * Coordinate coord = new Coordinate(); * coord.lng = Convert.ToString(GetNextNumber(tokenizer)); * coord.lat = Convert.ToString(GetNextNumber(tokenizer)); * ring.Add(coord); * mp.coordinates.Add(ring); * * nextToken = GetNextCloserOrComma(tokenizer); * while (nextToken == ",") * { * List<Coordinate> newRing = new List<Coordinate>(); * Coordinate newCoord = new Coordinate(); * newCoord.lng = Convert.ToString(GetNextNumber(tokenizer)); * newCoord.lat = Convert.ToString(GetNextNumber(tokenizer)); * newRing.Add(newCoord); * mp.coordinates.Add(newRing); * * nextToken = GetNextCloserOrComma(tokenizer); * } * return mp; * }*/ /*private static CellGeom ReadMultiLineStringText(WktStreamTokenizer tokenizer) * { * CellGeom lines = new CellGeom(); * 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; * }*/ private static GeoJSONObject ReadLineStringText(WktStreamTokenizer tokenizer) { var ring = GetCoordinates(tokenizer); var max = ring.Count; var vertices = new List <GeographicPosition>(); for (var i = 0; i < max; i++) { var lng = ring[i]; var lat = ring[i + 1]; var coord = new GeographicPosition(lat, lng); i++; vertices.Add(coord); } var line = new LineString(vertices); return(line); }
private static double GetNextNumber(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); return(tokenizer.GetNumericValue()); }
public static GeoJSONObject Parse(TextReader reader) { var tokenizer = new WktStreamTokenizer(reader); return(ReadGeometryTaggedText(tokenizer)); }