/// <summary>
        /// Parses the entire projection from an esri string.  In some cases, this will have
        /// default projection information since only geographic information is obtained.
        /// </summary>
        /// <param name="esriString">The ESRI string to parse</param>
        public void ReadEsriString(string esriString)
        {
            if (esriString.Contains("PROJCS") == false)
            {
                _geographicInfo.ReadEsriString(esriString);
                _isLatLon  = true;
                _transform = new LongLat();
                _transform.Init(this);
                return;
            }
            int iStart = esriString.IndexOf(@""",");

            _name = esriString.Substring(8, iStart - 9);
            int    iEnd = esriString.IndexOf("PARAMETER");
            string gcs  = esriString.Substring(iStart + 1, iEnd - (iStart + 2));

            _geographicInfo.ReadEsriString(gcs);

            _falseEasting      = GetParameter("False_Easting", esriString);
            _falseNorthing     = GetParameter("False_Northing", esriString);
            _centralMeridian   = GetParameter("Central_Meridian", esriString);
            _standardParallel1 = GetParameter("Standard_Parallel_1", esriString);
            _standardParallel2 = GetParameter("Standard_Parallel_2", esriString);
            _scaleFactor       = GetParameter("Scale_Factor", esriString);
            _longitudeOf1st    = GetParameter("Longitude_Of_1st", esriString);
            _longitudeOf2nd    = GetParameter("Longitude_Of_2nd", esriString);
            _latitudeOfOrigin  = GetParameter("Latitude_Of_Origin", esriString);
            iStart             = esriString.LastIndexOf("UNIT");
            string unit = esriString.Substring(iStart, esriString.Length - iStart);

            _unit.ReadEsriString(unit);

            if (esriString.Contains("PROJECTION"))
            {
                iStart = esriString.IndexOf("PROJECTION") + 12;
                iEnd   = esriString.IndexOf("]", iStart) - 1;
                string projection = esriString.Substring(iStart, iEnd - iStart);
                _transform = TransformManager.DefaultTransformManager.GetProjection(projection);
                _transform.Init(this);
            }

            UpdateParam();
        }
        /// <summary>
        /// Parses the entire projection from an esri string.  In some cases, this will have
        /// default projection information since only geographic information is obtained.
        /// </summary>
        /// <param name="esriString">The ESRI string to parse</param>
        public void ReadEsriString(string esriString)
        {
            if(esriString.Contains("PROJCS") == false)
            {
                _geographicInfo.ReadEsriString(esriString);
                _isLatLon = true;
                _transform = new LongLat();
                _transform.Init(this);
                return;
            }
            int iStart = esriString.IndexOf(@""",");
            _name = esriString.Substring(8, iStart - 8);
            int iEnd = esriString.IndexOf("PARAMETER");
            string gcs = esriString.Substring(iStart+1,iEnd-(iStart+2));
            _geographicInfo.ReadEsriString(gcs);
            
            _falseEasting = GetParameter("False_Easting", esriString);
            _falseNorthing = GetParameter("False_Northing", esriString);
            _centralMeridian = GetParameter("Central_Meridian", esriString);
            _longitudeOfCenter = GetParameter("Longitude_Of_Center", esriString);
            _standardParallel1 = GetParameter("Standard_Parallel_1", esriString);
            _standardParallel2 = GetParameter("Standard_Parallel_2", esriString);
            _scaleFactor = GetParameter("Scale_Factor", esriString);
            _azimuth = GetParameter("Azimuth", esriString);
            _longitudeOf1st = GetParameter("Longitude_Of_1st", esriString);
            _longitudeOf2nd = GetParameter("Longitude_Of_2nd", esriString);
            _latitudeOfOrigin = GetParameter("Latitude_Of_Origin", esriString) ??
                                GetParameter("Latitude_Of_Center", esriString);
            iStart = esriString.LastIndexOf("UNIT");
            string unit = esriString.Substring(iStart, esriString.Length - iStart);
            _unit.ReadEsriString(unit);

            if (esriString.Contains("PROJECTION"))
            {
                iStart = esriString.IndexOf("PROJECTION") + 12;
                iEnd = esriString.IndexOf("]", iStart) - 1;
                string projection = esriString.Substring(iStart, iEnd - iStart);
                _transform = TransformManager.DefaultTransformManager.GetProjection(projection);
                _transform.Init(this);
            }
            
            
        }
        /// <summary>
        /// Attempts to parse known parameters from the set of proj4 parameters
        /// </summary>
        /// <param name="proj4string"></param>
        public void ReadProj4String(string proj4string)
        {
            string[] paramList = proj4string.Split('+');
            foreach (string s in paramList)
            {
                if (s == "")
                {
                    continue;
                }
                if (s == "no_defs")
                {
                    continue;
                }
                string[] temp  = s.Split('=');
                string   name  = temp[0].Trim();
                string   value = "";
                if (temp.Length > 1)
                {
                    value = temp[1];
                    if (value != null)
                    {
                        value = value.Trim();
                    }
                }

                if (_parameters.ContainsKey(name))
                {
                    // some "+to" parameters exist... but I'm not sure what to do with them
                    // asside from the fact that they seem to specify a second projection?
                }
                else
                {
                    _parameters.Add(name, value);
                }
            }
            GeographicInfo.ReadProj4Parameters(_parameters);

            if (_parameters.ContainsKey("x_0"))
            {
                _falseEasting = double.Parse(_parameters["x_0"]);
            }
            if (_parameters.ContainsKey("y_0"))
            {
                _falseNorthing = double.Parse(_parameters["y_0"]);
            }
            if (_parameters.ContainsKey("k"))
            {
                _scaleFactor = double.Parse(_parameters["k"]);
            }
            if (_parameters.ContainsKey("k_0"))
            {
                _scaleFactor = double.Parse(_parameters["k_0"]);
            }
            if (_parameters.ContainsKey("lat_0"))
            {
                _latitudeOfOrigin = double.Parse(_parameters["lat_0"]);
            }
            if (_parameters.ContainsKey("lat_1"))
            {
                _standardParallel1 = double.Parse(_parameters["lat_1"]);
            }
            if (_parameters.ContainsKey("lat_ts"))
            {
                _standardParallel1 = double.Parse(_parameters["lat_ts"]);
            }
            if (_parameters.ContainsKey("lat_2"))
            {
                _standardParallel2 = double.Parse(_parameters["lat_2"]);
            }
            if (_parameters.ContainsKey("lon_0"))
            {
                _centralMeridian = double.Parse(_parameters["lon_0"]);
            }
            if (_parameters.ContainsKey("south"))
            {
                _south = true;
            }
            if (_parameters.ContainsKey("zone"))
            {
                _zone = int.Parse(_parameters["zone"]);
            }

            if (_parameters.ContainsKey("geoc"))
            {
                _geoc = bool.Parse(_parameters["geoc"]) && (GeographicInfo.Datum.Spheroid.EccentricitySquared() != 0);
            }
            if (_parameters.ContainsKey("over"))
            {
                _over = bool.Parse(_parameters["over"]);
            }
            if (_parameters.ContainsKey("proj"))
            {
                _transform = TransformManager.DefaultTransformManager.GetProj4(_parameters["proj"]);
                _transform.Init(this);

                //switch (_transform.ProjectionName)
                //{
                //    case ProjectionNames.North_Polar_Stereographic:
                //    case ProjectionNames.South_Polar_Stereographic:
                //        if (_standardParallel1 != null)
                //        {
                //            _scaleFactor = Proj.CalScaleFactorFromStandardParallel((double)_standardParallel1);
                //            _standardParallel1 = null;
                //        }
                //        break;
                //}
            }

            UpdateParam();
        }
     /// <summary>
     /// Attempts to parse known parameters from the set of proj4 parameters
     /// </summary>
     /// <param name="proj4string"></param>
     public void ReadProj4String(string proj4string)
     {
         string[] paramList = proj4string.Split('+');
         foreach (string s in paramList)
         {
             if (s == "") continue;
             if (s == "no_defs") continue;
             string[] temp = s.Split('=');
             string name = temp[0].Trim();
             string value = "";
             if (temp.Length > 1)
             {
                 value = temp[1];
                 if (value != null) value = value.Trim();
             }
             
             if(_parameters.ContainsKey(name))
             {
                 // some "+to" parameters exist... but I'm not sure what to do with them
                 // asside from the fact that they seem to specify a second projection?
             }
             else
             {
                 _parameters.Add(name, value);
             }
             
         }
         GeographicInfo.ReadProj4Parameters(_parameters);
         if(_parameters.ContainsKey("lonc"))
         {
             _longitudeOfCenter = double.Parse(_parameters["lonc"]);   
         }
         if(_parameters.ContainsKey("alhpa"))
         {
             _azimuth = double.Parse(_parameters["alpha"]);
         }
         if (_parameters.ContainsKey("x_0"))
         {
             _falseEasting = double.Parse(_parameters["x_0"]);
         }
         if (_parameters.ContainsKey("y_0"))
         {
             _falseNorthing = double.Parse(_parameters["y_0"]);
         }
         if (_parameters.ContainsKey("k"))
         {
             _scaleFactor = double.Parse(_parameters["k"]);
         }
         if (_parameters.ContainsKey("lat_0"))
         {
             _latitudeOfOrigin = double.Parse(_parameters["lat_0"]);
         }
         if(_parameters.ContainsKey("lat_1"))
         {
             _standardParallel1 = double.Parse(_parameters["lat_1"]);
         }
         if (_parameters.ContainsKey("lat_ts"))
         {
             _standardParallel1 = double.Parse(_parameters["lat_ts"]);
         }
         if (_parameters.ContainsKey("lat_2"))
         {
             _standardParallel2 = double.Parse(_parameters["lat_2"]);
         }
         if (_parameters.ContainsKey("lon_0"))
         {
             _centralMeridian = double.Parse(_parameters["lon_0"]);
         }
         if (_parameters.ContainsKey("south"))
         {
             _south = true;
         }
         if (_parameters.ContainsKey("zone"))
         {
             _zone = int.Parse(_parameters["zone"]);
         }
         
         if (_parameters.ContainsKey("geoc"))
         {
             _geoc = bool.Parse(_parameters["geoc"]) && (GeographicInfo.Datum.Spheroid.EccentricitySquared() != 0);
         }
         if (_parameters.ContainsKey("over"))
         {
             _over = bool.Parse(_parameters["over"]);
         }
         if (_parameters.ContainsKey("proj"))
         {
             _transform = TransformManager.DefaultTransformManager.GetProj4(_parameters["proj"]);
             _transform.Init(this);
         }
 
     }