/// <summary>
        /// Parses a Layer element
        /// </summary>
        /// <param name="sr">A text reader</param>
        /// <param name="m">The map</param>
        /// <param name="shapePath">Path to the geodata file</param>
        private static void ParseLayer(TextReader sr, Map m, string shapePath)
        {
            string line;
            double maxScale = double.MaxValue;
            double minScale = double.MinValue;

            string connType             = "local";
            string name                 = "";
            string data                 = "";
            string type                 = "";
            string classItem            = "";
            List <ClassElement> classes = new List <ClassElement>();

            while ((line = sr.ReadLine()) != null)
            {
                line = TrimFixLine(line);

                string[] parts = ParseLine(line);
                if (parts != null && parts.Length > 0)
                {
                    if (string.Compare(parts[0], "CLASS", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        classes.Add(ParseClass(sr));
                    }
                    else if (string.Compare(parts[0], "CLASSITEM", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        classItem = parts[1];
                    }
                    else if (string.Compare(parts[0], "END", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        var lay = new VectorLayer(name);
                        lay.MaxVisible = maxScale;
                        lay.MinVisible = minScale;

                        if (connType == "local")
                        {
                            if (!Path.HasExtension(data))
                            {
                                data = data + ".shp";
                            }
                            Data.Providers.ShapeFile sf = new Data.Providers.ShapeFile(data, true);
                            lay.DataSource = sf;
                        }

                        ApplyStyling(lay, classes, classItem, type);

                        m.Layers.Add(lay);
                        return;
                    }
                    else if (string.Compare(parts[0], "MAXSCALEDENOM", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        maxScale = Convert.ToDouble(parts[1], CultureInfo.InvariantCulture);
                    }
                    else if (string.Compare(parts[0], "TYPE", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        type = parts[1];
                    }
                    else if (string.Compare(parts[0], "MINSCALEDENOM", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        minScale = Convert.ToDouble(parts[1], CultureInfo.InvariantCulture);
                    }
                    else if (string.Compare(parts[0], "NAME", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        name = parts[1];
                    }
                    else if (string.Compare(parts[0], "OPACITY", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        minScale = Convert.ToDouble(parts[1], CultureInfo.InvariantCulture);
                    }
                    else if (string.Compare(parts[0], "DATA", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        data = parts[1];
                        if (!Path.IsPathRooted(data))
                        {
                            data = Path.Combine(shapePath, data);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Parses a Layer element
        /// </summary>
        /// <param name="sr"></param>
        /// <param name="m"></param>
        private static void ParseLayer(StreamReader sr, Map m, string shapePath)
        {
            string line;
            double maxScale = double.MaxValue;
            double minScale = double.MinValue;

            string connType = "local";
            string name = "";
            string data = "";
            string type = "";
            string classItem = "";
            List<ClassElement> classes = new List<ClassElement>();
            while ((line = sr.ReadLine()) != null)
            {
                line = TrimFixLine(line);

                string[] parts = ParseLine(line);
                if (parts != null && parts.Length > 0)
                {

                    if (string.Compare(parts[0], "CLASS", true) == 0)
                    {
                        classes.Add(ParseClass(sr, m));
                    }
                    else if (string.Compare(parts[0], "CLASSITEM", true) == 0)
                    {
                        classItem = parts[1];
                    }
                    else if (string.Compare(parts[0], "END", true) == 0)
                    {
                        ILayer lay = new VectorLayer(name);
                        lay.MaxVisible = maxScale;
                        lay.MinVisible = minScale;

                        if (connType == "local")
                        {
                            if (!Path.HasExtension(data))
                                data = data + ".shp";
                            SharpMap.Data.Providers.ShapeFile sf = new Data.Providers.ShapeFile(data, true);
                            (lay as VectorLayer).DataSource = sf;
                        }

                        ApplyStyling(lay, classes,classItem, type);

                        m.Layers.Add(lay);
                        return;
                    }
                    else if (string.Compare(parts[0], "MAXSCALEDENOM", true) == 0)
                    {
                        maxScale = Convert.ToDouble(parts[1], CultureInfo.InvariantCulture);
                    }
                    else if (string.Compare(parts[0], "TYPE", true) == 0)
                    {
                        type = parts[1];
                    }
                    else if (string.Compare(parts[0], "MINSCALEDENOM", true) == 0)
                    {
                        minScale = Convert.ToDouble(parts[1], CultureInfo.InvariantCulture);
                    }
                    else if (string.Compare(parts[0], "NAME", true) == 0)
                    {
                        name = parts[1];
                    }
                    else if (string.Compare(parts[0], "OPACITY", true) == 0)
                    {
                        minScale = Convert.ToDouble(parts[1], CultureInfo.InvariantCulture);
                    }
                    else if (string.Compare(parts[0], "DATA", true) == 0)
                    {
                        data = parts[1];
                        if (!Path.IsPathRooted(data))
                        {
                            data = Path.Combine(shapePath, data);
                        }


                    }
                }
            }
        }