// 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));
        }
Ejemplo n.º 3
0
        /// <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.");
                }
            }
        }
Ejemplo n.º 5
0
        /// <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.");
            }
        }
Ejemplo n.º 12
0
        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);
        }