// Reads either 3, 6 or 7 parameter Bursa-Wolf values from TOWGS84 token private static Wgs84ConversionInfo ReadWGS84ConversionInfo(WktStreamTokenizer tokenizer) { //TOWGS84[0,0,0,0,0,0,0] tokenizer.ReadToken("["); var info = new Wgs84ConversionInfo(); tokenizer.NextToken(); info.Dx = tokenizer.GetNumericValue(); tokenizer.ReadToken(","); tokenizer.NextToken(); info.Dy = tokenizer.GetNumericValue(); tokenizer.ReadToken(","); tokenizer.NextToken(); info.Dz = tokenizer.GetNumericValue(); tokenizer.NextToken(); if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); info.Ex = tokenizer.GetNumericValue(); tokenizer.ReadToken(","); tokenizer.NextToken(); info.Ey = tokenizer.GetNumericValue(); tokenizer.ReadToken(","); tokenizer.NextToken(); info.Ez = tokenizer.GetNumericValue(); tokenizer.NextToken(); if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); info.Ppm = tokenizer.GetNumericValue(); } } if (tokenizer.GetStringValue() != "]") { tokenizer.ReadToken("]"); } return(info); }
/// <summary> /// Returns a <see cref="AngularUnit"/> given a piece of WKT. /// </summary> /// <param name="tokenizer">WktStreamTokenizer that has the WKT.</param> /// <returns>An object that implements the IUnit interface.</returns> private static AngularUnit ReadAngularUnit(WktStreamTokenizer tokenizer) { tokenizer.ReadToken("["); string unitName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double unitsPerUnit = tokenizer.GetNumericValue(); string authority = string.Empty; long authorityCode = -1; tokenizer.NextToken(); if (tokenizer.GetStringValue() == ",") { tokenizer.ReadAuthority(out authority, out authorityCode); tokenizer.ReadToken("]"); } return(new AngularUnit(unitsPerUnit, unitName, authority, authorityCode, string.Empty, string.Empty, string.Empty)); }
/// <summary> /// Reads math transform from using current token from the specified tokenizer /// </summary> /// <param name="tokenizer"></param> /// <returns></returns> internal static MathTransform ReadMathTransform(WktStreamTokenizer tokenizer) { if (tokenizer.GetStringValue() != "PARAM_MT") { tokenizer.ReadToken("PARAM_MT"); } tokenizer.ReadToken("["); string transformName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); switch (transformName.ToUpperInvariant()) { case "AFFINE": return(ReadAffineTransform(tokenizer)); default: throw new NotSupportedException("Transform not supported '" + transformName + "'"); } }
/// <summary> /// Reads and parses a WKT-formatted projection string. /// </summary> /// <param name="wkt">String containing WKT.</param> /// <returns>Object representation of the WKT.</returns> /// <exception cref="System.ArgumentException">If a token is not recognized.</exception> public static IInfo Parse(string wkt) { if (string.IsNullOrWhiteSpace(wkt)) { throw new ArgumentNullException("wkt"); } using (TextReader reader = new StringReader(wkt)) { var tokenizer = new WktStreamTokenizer(reader); tokenizer.NextToken(); string objectName = tokenizer.GetStringValue(); switch (objectName) { case "UNIT": return(ReadUnit(tokenizer)); case "SPHEROID": return(ReadEllipsoid(tokenizer)); case "DATUM": return(ReadHorizontalDatum(tokenizer)); case "PRIMEM": return(ReadPrimeMeridian(tokenizer)); case "VERT_CS": case "GEOGCS": case "PROJCS": case "COMPD_CS": case "GEOCCS": case "FITTED_CS": case "LOCAL_CS": return(ReadCoordinateSystem(wkt, tokenizer)); default: throw new ArgumentException($"'{objectName}' is not recognized."); } } }
/// <summary> /// Reads and parses a WKT-formatted projection string. /// </summary> /// <param name="wkt">String containing WKT.</param> /// <returns>Object representation of the WKT.</returns> /// <exception cref="System.ArgumentException">If a token is not recognised.</exception> public static MathTransform Parse(string wkt) { if (string.IsNullOrWhiteSpace(wkt)) { throw new ArgumentNullException("wkt"); } using (TextReader reader = new StringReader(wkt)) { var tokenizer = new WktStreamTokenizer(reader); tokenizer.NextToken(); string objectName = tokenizer.GetStringValue(); switch (objectName) { case "PARAM_MT": return(ReadMathTransform(tokenizer)); default: throw new ArgumentException($"'{objectName}' is not recognized."); } } }
private static IProjection ReadProjection(WktStreamTokenizer tokenizer) { if (tokenizer.GetStringValue() != "PROJECTION") { tokenizer.ReadToken("PROJECTION"); } tokenizer.ReadToken("[");//[ string projectionName = tokenizer.ReadDoubleQuotedWord(); string authority = string.Empty; long authorityCode = -1L; tokenizer.NextToken(true); if (tokenizer.GetStringValue() == ",") { tokenizer.ReadAuthority(out authority, out authorityCode); tokenizer.ReadToken("]"); } tokenizer.ReadToken(",");//, tokenizer.ReadToken("PARAMETER"); var paramList = new List <ProjectionParameter>(); while (tokenizer.GetStringValue() == "PARAMETER") { tokenizer.ReadToken("["); string paramName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double paramValue = tokenizer.GetNumericValue(); tokenizer.ReadToken("]"); tokenizer.ReadToken(","); paramList.Add(new ProjectionParameter(paramName, paramValue)); tokenizer.NextToken(); } var projection = new Projection(projectionName, paramList, projectionName, authority, authorityCode, string.Empty, string.Empty, string.Empty); return(projection); }
private static PrimeMeridian ReadPrimeMeridian(WktStreamTokenizer tokenizer) { //PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]] tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double longitude = tokenizer.GetNumericValue(); tokenizer.NextToken(); string authority = string.Empty; long authorityCode = -1; if (tokenizer.GetStringValue() == ",") { tokenizer.ReadAuthority(out authority, out authorityCode); tokenizer.ReadToken("]"); } // make an assumption about the Angular units - degrees. var primeMeridian = new PrimeMeridian(longitude, AngularUnit.Degrees, name, authority, authorityCode, string.Empty, string.Empty, string.Empty); return(primeMeridian); }
private static GeographicCoordinateSystem ReadGeographicCoordinateSystem(WktStreamTokenizer tokenizer) { /* * GEOGCS["OSGB 1936", * DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6277"]] * PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]] * AXIS["Geodetic latitude","NORTH"] * AXIS["Geodetic longitude","EAST"] * AUTHORITY["EPSG","4277"] * ] */ tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.ReadToken("DATUM"); var horizontalDatum = ReadHorizontalDatum(tokenizer); tokenizer.ReadToken(","); tokenizer.ReadToken("PRIMEM"); var primeMeridian = ReadPrimeMeridian(tokenizer); tokenizer.ReadToken(","); tokenizer.ReadToken("UNIT"); var angularUnit = ReadAngularUnit(tokenizer); string authority = string.Empty; long authorityCode = -1; tokenizer.NextToken(); var info = new List <AxisInfo>(2); if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); while (tokenizer.GetStringValue() == "AXIS") { info.Add(ReadAxis(tokenizer)); tokenizer.NextToken(); if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); } } if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); } if (tokenizer.GetStringValue() == "AUTHORITY") { tokenizer.ReadAuthority(out authority, out authorityCode); tokenizer.ReadToken("]"); } } //This is default axis values if not specified. if (info.Count == 0) { info.Add(new AxisInfo("Lon", AxisOrientationEnum.East)); info.Add(new AxisInfo("Lat", AxisOrientationEnum.North)); } var geographicCS = new GeographicCoordinateSystem(angularUnit, horizontalDatum, primeMeridian, info, name, authority, authorityCode, string.Empty, string.Empty, string.Empty); return(geographicCS); }
private static GeocentricCoordinateSystem ReadGeocentricCoordinateSystem(WktStreamTokenizer tokenizer) { /* * GEOCCS["<name>", <datum>, <prime meridian>, <linear unit> {,<axis>, <axis>, <axis>} {,<authority>}] */ tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.ReadToken("DATUM"); var horizontalDatum = ReadHorizontalDatum(tokenizer); tokenizer.ReadToken(","); tokenizer.ReadToken("PRIMEM"); var primeMeridian = ReadPrimeMeridian(tokenizer); tokenizer.ReadToken(","); tokenizer.ReadToken("UNIT"); var linearUnit = ReadLinearUnit(tokenizer); string authority = string.Empty; long authorityCode = -1; tokenizer.NextToken(); var info = new List <AxisInfo>(3); if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); while (tokenizer.GetStringValue() == "AXIS") { info.Add(ReadAxis(tokenizer)); tokenizer.NextToken(); if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); } } if (tokenizer.GetStringValue() == ",") { tokenizer.NextToken(); } if (tokenizer.GetStringValue() == "AUTHORITY") { tokenizer.ReadAuthority(out authority, out authorityCode); tokenizer.ReadToken("]"); } } //This is default axis values if not specified. if (info.Count == 0) { info.Add(new AxisInfo("Geocentric X", AxisOrientationEnum.Other)); info.Add(new AxisInfo("Geocentric Y", AxisOrientationEnum.Other)); info.Add(new AxisInfo("Geocentric Z", AxisOrientationEnum.North)); } return(new GeocentricCoordinateSystem(horizontalDatum, linearUnit, primeMeridian, info, name, authority, authorityCode, string.Empty, string.Empty, string.Empty)); }
private static ProjectedCoordinateSystem ReadProjectedCoordinateSystem(WktStreamTokenizer tokenizer) { /*PROJCS[ * "OSGB 1936 / British National Grid", * GEOGCS[ * "OSGB 1936", * DATUM[...] * PRIMEM[...] * AXIS["Geodetic latitude","NORTH"] * AXIS["Geodetic longitude","EAST"] * AUTHORITY["EPSG","4277"] * ], * PROJECTION["Transverse Mercator"], * PARAMETER["latitude_of_natural_origin",49], * PARAMETER["longitude_of_natural_origin",-2], * PARAMETER["scale_factor_at_natural_origin",0.999601272], * PARAMETER["false_easting",400000], * PARAMETER["false_northing",-100000], * AXIS["Easting","EAST"], * AXIS["Northing","NORTH"], * AUTHORITY["EPSG","27700"] * ] */ tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.ReadToken("GEOGCS"); var geographicCS = ReadGeographicCoordinateSystem(tokenizer); tokenizer.ReadToken(","); IProjection projection = null; IUnit unit = null; var axes = new List <AxisInfo>(2); string authority = string.Empty; long authorityCode = -1; var ct = tokenizer.NextToken(); while (ct != TokenType.Eol && ct != TokenType.Eof) { switch (tokenizer.GetStringValue()) { case ",": case "]": break; case "PROJECTION": projection = ReadProjection(tokenizer); ct = tokenizer.GetTokenType(); continue; //break; case "UNIT": unit = ReadLinearUnit(tokenizer); break; case "AXIS": axes.Add(ReadAxis(tokenizer)); tokenizer.NextToken(); break; case "AUTHORITY": tokenizer.ReadAuthority(out authority, out authorityCode); //tokenizer.ReadToken("]"); break; } ct = tokenizer.NextToken(); } //This is default axis values if not specified. if (axes.Count == 0) { axes.Add(new AxisInfo("X", AxisOrientationEnum.East)); axes.Add(new AxisInfo("Y", AxisOrientationEnum.North)); } var projectedCS = new ProjectedCoordinateSystem(geographicCS.HorizontalDatum, geographicCS, unit as LinearUnit, projection, axes, name, authority, authorityCode, string.Empty, string.Empty, string.Empty); return(projectedCS); }
private static CoordinateSystem ReadCoordinateSystem(string coordinateSystem, WktStreamTokenizer tokenizer) { switch (tokenizer.GetStringValue()) { case "GEOGCS": return(ReadGeographicCoordinateSystem(tokenizer)); case "PROJCS": return(ReadProjectedCoordinateSystem(tokenizer)); case "FITTED_CS": return(ReadFittedCoordinateSystem(tokenizer)); case "GEOCCS": return(ReadGeocentricCoordinateSystem(tokenizer)); case "COMPD_CS": case "VERT_CS": case "LOCAL_CS": throw new NotSupportedException($"{coordinateSystem} coordinate system is not supported."); default: throw new InvalidOperationException($"{coordinateSystem} coordinate system is not recognized."); } }
private static MathTransform ReadAffineTransform(WktStreamTokenizer tokenizer) { /* * PARAM_MT[ * "Affine", * PARAMETER["num_row",3], * PARAMETER["num_col",3], * PARAMETER["elt_0_0", 0.883485346527455], * PARAMETER["elt_0_1", -0.468458794848877], * PARAMETER["elt_0_2", 3455869.17937689], * PARAMETER["elt_1_0", 0.468458794848877], * PARAMETER["elt_1_1", 0.883485346527455], * PARAMETER["elt_1_2", 5478710.88035753], * PARAMETER["elt_2_2", 1] * ] */ //tokenizer stands on the first PARAMETER if (tokenizer.GetStringValue() != "PARAMETER") { tokenizer.ReadToken("PARAMETER"); } var paramInfo = ReadParameters(tokenizer); //manage required parameters - row, col var rowParam = paramInfo.GetParameterByName("num_row"); var colParam = paramInfo.GetParameterByName("num_col"); if (rowParam == null) { throw new ArgumentNullException(nameof(rowParam), "Affine transform does not contain 'num_row' parameter"); } if (colParam == null) { throw new ArgumentNullException(nameof(colParam), "Affine transform does not contain 'num_col' parameter"); } int rowVal = (int)rowParam.Value; int colVal = (int)colParam.Value; if (rowVal <= 0) { throw new ArgumentException("Affine transform contains invalid value of 'num_row' parameter"); } if (colVal <= 0) { throw new ArgumentException("Affine transform contains invalid value of 'num_col' parameter"); } //creates working matrix; double[,] matrix = new double[rowVal, colVal]; //simply process matrix values - no elt_ROW_COL parsing foreach (var param in paramInfo.Parameters) { if (param == null || param.Name == null) { continue; } switch (param.Name) { case "num_row": case "num_col": break; case "elt_0_0": matrix[0, 0] = param.Value; break; case "elt_0_1": matrix[0, 1] = param.Value; break; case "elt_0_2": matrix[0, 2] = param.Value; break; case "elt_0_3": matrix[0, 3] = param.Value; break; case "elt_1_0": matrix[1, 0] = param.Value; break; case "elt_1_1": matrix[1, 1] = param.Value; break; case "elt_1_2": matrix[1, 2] = param.Value; break; case "elt_1_3": matrix[1, 3] = param.Value; break; case "elt_2_0": matrix[2, 0] = param.Value; break; case "elt_2_1": matrix[2, 1] = param.Value; break; case "elt_2_2": matrix[2, 2] = param.Value; break; case "elt_2_3": matrix[2, 3] = param.Value; break; case "elt_3_0": matrix[3, 0] = param.Value; break; case "elt_3_1": matrix[3, 1] = param.Value; break; case "elt_3_2": matrix[3, 2] = param.Value; break; case "elt_3_3": matrix[3, 3] = param.Value; break; } } //read rest of WKT if (tokenizer.GetStringValue() != "]") { tokenizer.ReadToken("]"); } //use "matrix" constructor to create transformation matrix var affineTransform = new AffineTransform(matrix); return(affineTransform); }