/// <summary>
        ///
        /// </summary>
        /// <param name="tokenizer"></param>
        /// <returns></returns>
        private static GeoAPI.CoordinateSystems.IProjection ReadProjection(GisSharpBlog.NetTopologySuite.IO.WktStreamTokenizer tokenizer)
        {
            //tokenizer.NextToken();// PROJECTION
            tokenizer.ReadToken("PROJECTION");
            tokenizer.ReadToken("[");//[
            string projectionName = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken("]"); //]
            tokenizer.ReadToken(","); //,
            tokenizer.ReadToken("PARAMETER");
            List <GeoAPI.CoordinateSystems.ProjectionParameter> paramList = new List <GeoAPI.CoordinateSystems.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 GeoAPI.CoordinateSystems.ProjectionParameter(paramName, paramValue));
                tokenizer.NextToken();
            }

            string authority     = String.Empty;
            long   authorityCode = -1;

            GeoAPI.CoordinateSystems.IProjection projection = new Projection(projectionName, paramList, String.Empty, authority, authorityCode, String.Empty, String.Empty, string.Empty);
            return(projection);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="tokenizer"></param>
        /// <returns></returns>
        private static GeoAPI.CoordinateSystems.IHorizontalDatum ReadHorizontalDatum(GisSharpBlog.NetTopologySuite.IO.WktStreamTokenizer tokenizer)
        {
            //DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]]TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6277"]]

            tokenizer.ReadToken("[");
            string name = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.ReadToken("SPHEROID");
            GeoAPI.CoordinateSystems.IEllipsoid ellipsoid = ReadEllipsoid(tokenizer);
            tokenizer.ReadToken(",");
            GeoAPI.CoordinateSystems.Wgs84ConversionInfo wgsInfo = new GeoAPI.CoordinateSystems.Wgs84ConversionInfo();
            if (tokenizer.GetStringValue() == "TOWGS84")
            {
                tokenizer.ReadToken("TOWGS84");
                wgsInfo = ReadWGS84ConversionInfo(tokenizer);
                tokenizer.ReadToken(",");
            }
            string authority     = String.Empty;
            long   authorityCode = -1;

            tokenizer.ReadAuthority(ref authority, ref authorityCode);
            // make an assumption about the datum type.
            GeoAPI.CoordinateSystems.IHorizontalDatum horizontalDatum = new HorizontalDatum(ellipsoid, wgsInfo, GeoAPI.CoordinateSystems.DatumType.HD_Geocentric, name, authority, authorityCode, String.Empty, String.Empty, String.Empty);
            tokenizer.ReadToken("]");
            return(horizontalDatum);
        }
        /// <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 GeoAPI.CoordinateSystems.IInfo Parse(string wkt)
        {
            GeoAPI.CoordinateSystems.IInfo returnObject = null;
            StringReader reader = new StringReader(wkt);

            GisSharpBlog.NetTopologySuite.IO.WktStreamTokenizer tokenizer = new GisSharpBlog.NetTopologySuite.IO.WktStreamTokenizer(reader);
            tokenizer.NextToken();
            string objectName = tokenizer.GetStringValue();

            switch (objectName)
            {
            case "UNIT":
                returnObject = ReadUnit(tokenizer);
                break;

            //case "VERT_DATUM":
            //    IVerticalDatum verticalDatum = ReadVerticalDatum(tokenizer);
            //    returnObject = verticalDatum;
            //    break;
            case "SPHEROID":
                returnObject = ReadEllipsoid(tokenizer);
                break;

            case "DATUM":
                returnObject = ReadHorizontalDatum(tokenizer);;
                break;

            case "PRIMEM":
                returnObject = ReadPrimeMeridian(tokenizer);
                break;

            //case "VERT_CS":
            //    IVerticalCoordinateSystem verticalCS = ReadVerticalCoordinateSystem(tokenizer);
            //    returnObject = verticalCS;
            //    break;
            case "GEOGCS":
                returnObject = ReadGeographicCoordinateSystem(tokenizer);
                break;

            case "PROJCS":
                returnObject = ReadProjectedCoordinateSystem(tokenizer);
                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 ArgumentException(String.Format("'{0'} is not recongnized.", objectName));
            }
            reader.Close();
            return(returnObject);
        }