private static void WriteProjectedCoordinateSystem(ProjectedCoordinateSystem projCoordSystem)
        {
            string projP4 = ProjDB.ProjectionP4ByName(projCoordSystem.Projection.Name);

            if (projP4 == String.Empty)
            {
                throw new NotImplementedException("Unknown projection " + projCoordSystem.Projection.Name);
            }

            _p4parameters.Add(new P4Parameter("+proj", projP4));

            WriteGeographicCoordinateSystem(projCoordSystem.GeographicCoordinateSystem);

            for (int i = 0; i < projCoordSystem.Projection.NumParameters; i++)
            {
                ProjectionParameter projParameter = projCoordSystem.Projection.GetParameter(i);

                switch (projParameter.Name.ToLower())
                {
                case "latitude_of_origin":
                case "latitude_of_center":
                    _p4parameters.Add(new P4Parameter("+lat_0", projParameter.Value.ToString(_nhi)));
                    break;

                case "central_meridian":
                case "longitude_of_origin":
                case "longitude_of_center":
                    _p4parameters.Add(new P4Parameter("+lon_0", projParameter.Value.ToString(_nhi)));
                    break;

                case "scale_factor":
                    _p4parameters.Add(new P4Parameter("+k", projParameter.Value.ToString(_nhi)));
                    break;

                case "false_easting":
                    _p4parameters.Add(new P4Parameter("+x_0", projParameter.Value.ToString(_nhi)));
                    break;

                case "false_northing":
                    _p4parameters.Add(new P4Parameter("+y_0", projParameter.Value.ToString(_nhi)));
                    break;

                case "azimuth":
                    _p4parameters.Add(new P4Parameter("+alpha", projParameter.Value.ToString(_nhi)));
                    break;

                case "standard_parallel_1":
                    _p4parameters.Add(new P4Parameter("+lat_1", projParameter.Value.ToString(_nhi)));
                    break;

                case "standard_parallel_2":
                    _p4parameters.Add(new P4Parameter("+lat_2", projParameter.Value.ToString(_nhi)));
                    break;
                }
            }
        }
        private static Projection ReadProjection(WktStreamTokenizer tokenizer, bool includeAuthority)
        {
            //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();
                //added by monoGIS team: parameters names may be capitalized, but the code works only with lower-case!
                paramName = paramName.ToLower();
                tokenizer.ReadToken(",");
                tokenizer.NextToken();
                double paramValue = tokenizer.GetNumericValue();
                tokenizer.ReadToken("]");
                paramList.Add(paramName, paramValue);

                if (!tokenizer.TryReadToken(","))
                {
                    break;
                }
                if (!tokenizer.TryReadToken("PARAMETER"))
                {
                    break;
                }
            }

            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.Empty;
            string     authorityCode = String.Empty;
            Projection projection    = new Projection(projectionName, paramArray, String.Empty, String.Empty, authority, authorityCode);

            return(projection);
        }