/// <summary> /// Creates the appropriate object given a string containing XML. /// </summary> /// <param name="wkt">String containing XML.</param> /// <returns>Object representation of the XML.</returns> /// <exception cref="ParseException">If a token is not recognised.</exception> public static object Create(string wkt) { object returnObject = null; StringReader reader = new StringReader(wkt); WktStreamTokenizer tokenizer = new WktStreamTokenizer(reader); tokenizer.NextToken(); string objectName=tokenizer.GetStringValue(); switch (objectName) { case "UNIT": IUnit unit = ReadUnit(tokenizer); returnObject = unit; break; case "VERT_DATUM": IVerticalDatum verticalDatum = ReadVerticalDatum(tokenizer); returnObject = verticalDatum; break; case "SPHEROID": IEllipsoid ellipsoid = ReadEllipsoid(tokenizer); returnObject = ellipsoid; break; case "TOWGS84": WGS84ConversionInfo wgsInfo = ReadWGS84ConversionInfo(tokenizer); returnObject = wgsInfo; break; case "DATUM": IHorizontalDatum horizontalDatum = ReadHorizontalDatum(tokenizer); returnObject = horizontalDatum; break; case "PRIMEM": IPrimeMeridian primeMeridian = ReadPrimeMeridian(tokenizer); returnObject = primeMeridian; break; case "VERT_CS": IVerticalCoordinateSystem verticalCS = ReadVerticalCoordinateSystem(tokenizer); returnObject = verticalCS; break; case "GEOGCS": IGeographicCoordinateSystem geographicCS = ReadGeographicCoordinateSystem(tokenizer); returnObject = geographicCS; break; case "PROJCS": IProjectedCoordinateSystem projectedCS = ReadProjectedCoordinateSystem(tokenizer); returnObject = projectedCS; break; case "COMPD_CS": ICompoundCoordinateSystem compoundCS = ReadCompoundCoordinateSystem(tokenizer); returnObject = compoundCS; break; case "GEOCCS": case "FITTED_CS": case "LOCAL_CS": throw new NotSupportedException(String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} is not implemented.",objectName)); default: throw new ParseException(String.Format(System.Globalization.CultureInfo.InvariantCulture, "'{0'} is not recongnized.",objectName)); } reader.Close(); return returnObject; }
/// <summary> /// Returns the next ")" or "," in the stream. /// </summary> /// <param name="tokenizer">tokenizer over a stream of text in Well-known Text /// format. The next token must be ")" or ",".</param> /// <returns>Returns the next ")" or "," in the stream.</returns> /// <remarks> /// ParseException is thrown if the next token is not ")" or ",". /// </remarks> private string GetNextCloserOrComma(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string nextWord = tokenizer.GetStringValue(); if (nextWord == "," || nextWord == ")") { return(nextWord); } throw new ParseException("Expected ')' or ',' but encountered '" + nextWord + "'"); }
/// <summary> /// Returns the next "EMPTY" or "(" in the stream as uppercase text. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text /// format. The next token must be "EMPTY" or "(".</param> /// <returns>the next "EMPTY" or "(" in the stream as uppercase /// text.</returns> /// <remarks> /// ParseException is thrown if the next token is not "EMPTY" or "(". /// </remarks> private string GetNextEmptyOrOpener(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string nextWord = tokenizer.GetStringValue(); if (nextWord == "EMPTY" || nextWord == "(") { return(nextWord); } throw new ParseException("Expected 'EMPTY' or '(' but encountered '" + nextWord + "'"); }
private static ICompoundCoordinateSystem ReadCompoundCoordinateSystem(WktStreamTokenizer tokenizer) { /* * COMPD_CS[ * "OSGB36 / British National Grid + ODN", * PROJCS[] * VERT_CS[] * AUTHORITY["EPSG","7405"] * ]*/ //TODO add a ReadCoordinateSystem - that determines the correct coordinate system to //read. Right now this hard coded for a projected and a vertical coord sys - so the UK //national grid works. tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); string headCSCode = tokenizer.GetStringValue(); ICoordinateSystem headCS = ReadCoordinateSystem(headCSCode, tokenizer); tokenizer.ReadToken(","); tokenizer.NextToken(); string tailCSCode = tokenizer.GetStringValue(); ICoordinateSystem tailCS = ReadCoordinateSystem(tailCSCode, tokenizer); tokenizer.ReadToken(","); string authority = ""; string authorityCode = ""; tokenizer.ReadAuthority(ref authority, ref authorityCode); tokenizer.ReadToken("]"); ICompoundCoordinateSystem compoundCS = new CompoundCoordinateSystem(headCS, tailCS, "", authority, authorityCode, name, "", ""); return(compoundCS); }
private static IProjection ReadProjection(WktStreamTokenizer tokenizer) { //tokenizer.NextToken();// PROJECTION tokenizer.ReadToken("PROJECTION"); tokenizer.ReadToken("["); //[ string projectionName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken("]"); //] tokenizer.ReadToken(","); //, tokenizer.ReadToken("PARAMETER"); ParameterList paramList = new ParameterList(); while (tokenizer.GetStringValue() == "PARAMETER") { tokenizer.ReadToken("["); string paramName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double paramValue = tokenizer.GetNumericValue(); tokenizer.ReadToken("]"); tokenizer.ReadToken(","); paramList.Add(paramName, paramValue); tokenizer.NextToken(); } ProjectionParameter[] paramArray = new ProjectionParameter[paramList.Count]; int i = 0; foreach (string key in paramList.Keys) { ProjectionParameter param = new ProjectionParameter(); param.Name = key; param.Value = (double)paramList[key]; paramArray[i] = param; i++; } string authority = ""; string authorityCode = ""; IProjection projection = new Projection(projectionName, paramArray, "", "", authority, authorityCode); return(projection); }
private static IVerticalDatum ReadVerticalDatum(WktStreamTokenizer tokenizer) { //VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["5101","EPSG"]] tokenizer.ReadToken("["); string datumName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); string datumTypeNumber = tokenizer.GetStringValue(); tokenizer.ReadToken(","); string authority = ""; string authorityCode = ""; tokenizer.ReadAuthority(ref authority, ref authorityCode); DatumType datumType = (DatumType)Enum.Parse(typeof(DatumType), datumTypeNumber); IVerticalDatum verticalDatum = new VerticalDatum(datumType, "", authorityCode, authority, datumName, "", ""); tokenizer.ReadToken("]"); return(verticalDatum); }
/// <summary> /// Creates the appropriate object given a string containing XML. /// </summary> /// <param name="wkt">String containing XML.</param> /// <returns>Object representation of the XML.</returns> /// <exception cref="ParseException">If a token is not recognised.</exception> public static object Create(string wkt) { object returnObject = null; StringReader reader = new StringReader(wkt); WktStreamTokenizer tokenizer = new WktStreamTokenizer(reader); tokenizer.NextToken(); string objectName = tokenizer.GetStringValue(); switch (objectName) { case "UNIT": IUnit unit = ReadUnit(tokenizer); returnObject = unit; break; case "VERT_DATUM": IVerticalDatum verticalDatum = ReadVerticalDatum(tokenizer); returnObject = verticalDatum; break; case "SPHEROID": IEllipsoid ellipsoid = ReadEllipsoid(tokenizer); returnObject = ellipsoid; break; case "TOWGS84": WGS84ConversionInfo wgsInfo = ReadWGS84ConversionInfo(tokenizer); returnObject = wgsInfo; break; case "DATUM": IHorizontalDatum horizontalDatum = ReadHorizontalDatum(tokenizer); returnObject = horizontalDatum; break; case "PRIMEM": IPrimeMeridian primeMeridian = ReadPrimeMeridian(tokenizer); returnObject = primeMeridian; break; case "VERT_CS": IVerticalCoordinateSystem verticalCS = ReadVerticalCoordinateSystem(tokenizer); returnObject = verticalCS; break; case "GEOGCS": IGeographicCoordinateSystem geographicCS = ReadGeographicCoordinateSystem(tokenizer); returnObject = geographicCS; break; case "PROJCS": IProjectedCoordinateSystem projectedCS = ReadProjectedCoordinateSystem(tokenizer); returnObject = projectedCS; break; case "COMPD_CS": ICompoundCoordinateSystem compoundCS = ReadCompoundCoordinateSystem(tokenizer); returnObject = compoundCS; break; case "GEOCCS": case "FITTED_CS": case "LOCAL_CS": throw new NotSupportedException(String.Format("{0} is not implemented.", objectName)); default: throw new ParseException(String.Format("'{0'} is not recongnized.", objectName)); } reader.Close(); return(returnObject); }
private static IVerticalDatum ReadVerticalDatum(WktStreamTokenizer tokenizer) { //VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["5101","EPSG"]] tokenizer.ReadToken("["); string datumName=tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); string datumTypeNumber = tokenizer.GetStringValue(); tokenizer.ReadToken(","); string authority=""; string authorityCode=""; tokenizer.ReadAuthority(ref authority, ref authorityCode); DatumType datumType = (DatumType)Enum.Parse(typeof(DatumType),datumTypeNumber); IVerticalDatum verticalDatum = new VerticalDatum(datumType,"",authorityCode,authority,datumName,"",""); tokenizer.ReadToken("]"); return verticalDatum; }
private static IProjection ReadProjection(WktStreamTokenizer tokenizer) { //tokenizer.NextToken();// PROJECTION tokenizer.ReadToken("PROJECTION"); tokenizer.ReadToken("[");//[ string projectionName=tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken("]");//] tokenizer.ReadToken(",");//, tokenizer.ReadToken("PARAMETER"); ParameterList paramList = new ParameterList(); while (tokenizer.GetStringValue()=="PARAMETER") { tokenizer.ReadToken("["); string paramName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double paramValue = tokenizer.GetNumericValue(); tokenizer.ReadToken("]"); tokenizer.ReadToken(","); paramList.Add(paramName,paramValue); tokenizer.NextToken(); } ProjectionParameter[] paramArray = new ProjectionParameter[paramList.Count]; int i=0; foreach(string key in paramList.Keys) { ProjectionParameter param= new ProjectionParameter(); param.Name=key; param.Value=(double)paramList[key]; paramArray[i]=param; i++; } string authority=""; string authorityCode=""; IProjection projection = new Projection(projectionName, paramArray,"", "",authority, authorityCode); return projection; }
private static ICompoundCoordinateSystem ReadCompoundCoordinateSystem(WktStreamTokenizer tokenizer) { /* COMPD_CS[ "OSGB36 / British National Grid + ODN", PROJCS[] VERT_CS[] AUTHORITY["EPSG","7405"] ]*/ //TODO add a ReadCoordinateSystem - that determines the correct coordinate system to //read. Right now this hard coded for a projected and a vertical coord sys - so the UK //national grid works. tokenizer.ReadToken("["); string name=tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); string headCSCode = tokenizer.GetStringValue(); ICoordinateSystem headCS = ReadCoordinateSystem(headCSCode,tokenizer); tokenizer.ReadToken(","); tokenizer.NextToken(); string tailCSCode = tokenizer.GetStringValue(); ICoordinateSystem tailCS = ReadCoordinateSystem(tailCSCode,tokenizer); tokenizer.ReadToken(","); string authority=""; string authorityCode=""; tokenizer.ReadAuthority(ref authority, ref authorityCode); tokenizer.ReadToken("]"); ICompoundCoordinateSystem compoundCS = new CompoundCoordinateSystem(headCS,tailCS,"",authority,authorityCode,name,"",""); return compoundCS; }
private Geometry ReadGeometryTaggedText(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string type = tokenizer.GetStringValue().ToUpper(); switch (type) { case "POINT": return this.ReadPointText(tokenizer); case "LINESTRING": return this.ReadLineStringText(tokenizer); case "MULTIPOINT": return this.ReadMultiPointText(tokenizer); case "MULTILINESTRING": return this.ReadMultiLineStringText(tokenizer); case "POLYGON": return this.ReadPolygonText(tokenizer); case "MULTIPOLYGON": return this.ReadMultiPolygonText(tokenizer); case "GEOMETRYCOLLECTION": return this.ReadGeometryCollectionText(tokenizer); default: throw new ParseException(String.Format(System.Globalization.CultureInfo.InvariantCulture, "'{0}' is not WKT.", type)); } }
private string GetNextWord(WktStreamTokenizer tokenizer) { TokenType type = tokenizer.NextToken(); string token = tokenizer.GetStringValue(); if (type == TokenType.Number) { throw new ParseException("Expected a number but got "+token); } else if (type == TokenType.Word) { return token.ToUpper(); } else if (token == "(") { return "("; } else if (token == ")") { return ")"; } else if (token == ",") { return ","; } throw new ParseException("Not a valid symbol in WKT format."); }
private string GetNextEmptyOrOpener(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string nextWord = tokenizer.GetStringValue(); if ((nextWord == "EMPTY") || (nextWord == "(")) { return nextWord; } throw new ParseException("Expected 'EMPTY' or '(' but encountered '" + nextWord + "'"); }
private string GetNextCloserOrComma(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string nextWord = tokenizer.GetStringValue(); if ((nextWord == ",") || (nextWord == ")")) { return nextWord; } throw new ParseException("Expected ')' or ',' but encountered '" + nextWord + "'"); }
/// <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> /// ParseException 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 Geometry ReadGeometryTaggedText(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string type = tokenizer.GetStringValue().ToUpper(); Geometry geometry = null; switch (type) { case "POINT": geometry = ReadPointText(tokenizer); break; case "LINESTRING": geometry = ReadLineStringText(tokenizer); break; case "MULTIPOINT": geometry = this.ReadMultiPointText(tokenizer); break; case "MULTILINESTRING": geometry = this.ReadMultiLineStringText(tokenizer); break; case "POLYGON": geometry = ReadPolygonText(tokenizer); break; case "MULTIPOLYGON": geometry = ReadMultiPolygonText(tokenizer); break; case "GEOMETRYCOLLECTION": geometry = ReadGeometryCollectionText(tokenizer); break; default: throw new ParseException(String.Format("{0} is not WKT.", type)); } return(geometry); /* * String type = getNextWord(tokenizer); * if (type.equals("POINT")) { * return readPointText(tokenizer); * } * else if (type.equals("LINESTRING")) { * return readLineStringText(tokenizer); * } * else if (type.equals("POLYGON")) { * return readPolygonText(tokenizer); * } * else if (type.equals("MULTIPOINT")) { * return readMultiPointText(tokenizer); * } * else if (type.equals("MULTILINESTRING")) { * return readMultiLineStringText(tokenizer); * } * else if (type.equals("MULTIPOLYGON")) { * return readMultiPolygonText(tokenizer); * } * else if (type.equals("GEOMETRYCOLLECTION")) { * return readGeometryCollectionText(tokenizer); * }*/ }