private static string ToString(Resolution r)
 {
     var sb = new StringBuilder("{" + r.Id);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.UnitsPerPixel);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.ScaleDenominator);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.Left);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.Top);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.MatrixWidth);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.MatrixHeight);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.TileWidth);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.TileHeight);
     sb.AppendFormat(NumberFormatInfo.InvariantInfo, ";{0}", r.ScaleDenominator);
     sb.Append("}");
     return sb.ToString();
 }
 // Methods
 public ArcGISTileSchema(string FilePath)
 {
     Resolution resolution2;
     this.url = @"C:\arcgisserver\arcgiscache\GZMap\Layers\conf.xml";
     this.url = FilePath;
     XmlDocument document = new XmlDocument();
     document.Load(this.url);
     XmlNode documentElement = document.DocumentElement;
     XmlNodeList elementsByTagName = document.GetElementsByTagName("LODInfo");
     List<LODInfo> list2 = new List<LODInfo>();
     foreach (XmlNode node2 in elementsByTagName)
     {
     string innerText = node2["LevelID"].InnerText;
     string str2 = node2["Scale"].InnerText;
     string str3 = node2["Resolution"].InnerText;
     LODInfo item = new LODInfo();
     item.LevelID = Convert.ToInt32(innerText);
     item.Scale = Convert.ToDouble(str2);
     item.Resolution = Convert.ToDouble(str3);
     list2.Add(item);
     }
     foreach (LODInfo info2 in list2)
     {
     resolution2 = new Resolution();
     Resolution resolution = resolution2;
     resolution.Id = info2.LevelID.ToString();
     resolution.UnitsPerPixel = info2.Resolution;
     base.Resolutions.Add(resolution);
     }
     base.Height = 0x100;
     base.Width = 0x100;
     base.Extent = new Extent(-180.0, -90.0, 180.0, 90.0);
     XmlNodeList list3 = document.GetElementsByTagName("SpatialReference");
     base.OriginX = Convert.ToDouble(list3[0]["XOrigin"].InnerText);
     base.OriginY = Convert.ToDouble(list3[0]["YOrigin"].InnerText);
     list3 = document.GetElementsByTagName("TileCols");
     base.Width = Convert.ToInt32(list3[0].InnerText);
     list3 = document.GetElementsByTagName("TileRows");
     base.Height = Convert.ToInt32(list3[0].InnerText);
     base.Axis = AxisDirection.InvertedY;
     list3 = document.GetElementsByTagName("TileOrigin");
     base.OriginX = Convert.ToDouble(list3[0].FirstChild.InnerText);
     base.OriginY = Convert.ToDouble(list3[0].LastChild.InnerText);
     base.Name = "ArcGISTileCache";
     base.Format = "png";
     base.Srs = "UnKnown";
     DirectoryInfo info3 = new DirectoryInfo(Path.GetDirectoryName(FilePath) + @"\_alllayers\L00");
     BoundingBox box = null;
     foreach (DirectoryInfo info4 in info3.GetDirectories())
     {
     int row = RowToHex(info4.Name);
     int level = 0;
     foreach (FileInfo info5 in info4.GetFiles())
     {
         if (info5.FullName.EndsWith(base.Format))
         {
             BoundingBox box2;
             int col = ColumnToHex(info5.Name);
             TileInfo info6 = new TileInfo();
             info6.Extent = this.TileToWorld(new TileRange(col, row), level, this);
             resolution2 = base.Resolutions[level];
             info6.Index = new TileIndex(col, row, resolution2.Id);
             try
             {
                 box2 = new BoundingBox(info6.Extent.MinX, info6.Extent.MinY, info6.Extent.MaxX, info6.Extent.MaxY);
             }
             catch (Exception)
             {
                 box2 = new BoundingBox(-180.0, -90.0, 180.0, 90.0);
             }
             if (box2 != null)
             {
                 box = (box == null) ? box2 : box.Join(box2);
             }
         }
     }
     }
     if (box != null)
     {
     base.Extent = new Extent(box.Min.X, box.Min.Y, box.Max.X, box.Max.Y);
     }
 }
        // Methods
        public ArcGISTileCompactSchema(string FilePath)
        {
            Resolution resolution2;
            this.url = @"C:\arcgisserver\arcgiscache\GZMap\Layers\conf.xml";
            this.url = FilePath;
            string cdiFile = string.Format(@"{0}\conf.cdi", Path.GetDirectoryName(FilePath));
            XmlDocument document = new XmlDocument();
            document.Load(this.url);
            XmlNode documentElement = document.DocumentElement;
            XmlNodeList elementsByTagName = document.GetElementsByTagName("LODInfo");
            List<LODInfo> list2 = new List<LODInfo>();
            foreach (XmlNode node2 in elementsByTagName)
            {
            string innerText = node2["LevelID"].InnerText;
            string str2 = node2["Scale"].InnerText;
            string str3 = node2["Resolution"].InnerText;
            LODInfo item = new LODInfo();
            item.LevelID = Convert.ToInt32(innerText);
            item.Scale = Convert.ToDouble(str2);
            item.Resolution = Convert.ToDouble(str3);
            list2.Add(item);
            }
            foreach (LODInfo info2 in list2)
            {
            resolution2 = new Resolution();
            Resolution resolution = resolution2;
            resolution.Id = info2.LevelID.ToString();
            resolution.UnitsPerPixel = info2.Resolution;
            base.Resolutions.Add(resolution);
            }
            base.Height = 0x100;
            base.Width = 0x100;
            base.Extent = new Extent(-180.0, -90.0, 180.0, 90.0);
            XmlNodeList list3 = document.GetElementsByTagName("SpatialReference");
            base.OriginX = Convert.ToDouble(list3[0]["XOrigin"].InnerText);
            base.OriginY = Convert.ToDouble(list3[0]["YOrigin"].InnerText);
            list3 = document.GetElementsByTagName("TileCols");
            base.Width = Convert.ToInt32(list3[0].InnerText);
            list3 = document.GetElementsByTagName("TileRows");
            base.Height = Convert.ToInt32(list3[0].InnerText);
            base.Axis = AxisDirection.InvertedY;
            list3 = document.GetElementsByTagName("TileOrigin");
            base.OriginX = Convert.ToDouble(list3[0].FirstChild.InnerText);
            base.OriginY = Convert.ToDouble(list3[0].LastChild.InnerText);
            base.Name = "ArcGISTileCache";
            base.Format = "png";
            base.Srs = "UnKnown";
            DirectoryInfo info3 = new DirectoryInfo(Path.GetDirectoryName(FilePath) + @"\_alllayers\L00");
            BoundingBox box = null;
            //foreach (FileInfo infoBundle in info3.GetFiles())
            //{
            //    if (infoBundle.FullName.EndsWith("bundle"))
            //    {
            //        BoundingBox box2;
            //        //int row = RowToHex(infoBundle.Name.Substring(1, 4));
            //        int row = RowToHex(infoBundle.Name);
            //        int level = 0;
            //        //int col = ColumnToHex(infoBundle.Name.Substring(6, 4));
            //        int col = ColumnToHex(infoBundle.Name);
            //        TileInfo infoTile = new TileInfo();
            //        infoTile.Extent = this.TileToWorld(new TileRange(col, row), level, this);
            //        resolution2 = base.Resolutions[level];
            //        infoTile.Index = new TileIndex(col, row, resolution2.Id);
            //        try
            //        {
            //            box2 = new BoundingBox(infoTile.Extent.MinX, infoTile.Extent.MinY, infoTile.Extent.MaxX, infoTile.Extent.MaxY);
            //        }
            //        catch (Exception)
            //        {
            //            box2 = new BoundingBox(-180,-90,180,90);
            //        }
            //        if (box2!=null)
            //        {
            //            box = (box == null) ? box2 : box.Join(box2);
            //        }
            //    }
            //}
            //foreach (DirectoryInfo info4 in info3.GetDirectories())
            //{
            //    int row = RowToHex(info4.Name);
            //    int level = 0;
            //    foreach (FileInfo info5 in info4.GetFiles())
            //    {
            //        if (info5.FullName.EndsWith(base.Format))
            //        {
            //            BoundingBox box2;
            //            int col = ColumnToHex(info5.Name);
            //            TileInfo info6 = new TileInfo();
            //            info6.Extent = this.TileToWorld(new TileRange(col, row), level, this);
            //            resolution2 = base.Resolutions[level];
            //            info6.Index = new TileIndex(col, row, resolution2.Id);
            //            try
            //            {
            //                box2 = new BoundingBox(info6.Extent.MinX, info6.Extent.MinY, info6.Extent.MaxX, info6.Extent.MaxY);
            //            }
            //            catch (Exception)
            //            {
            //                box2 = new BoundingBox(-180.0, -90.0, 180.0, 90.0);
            //            }
            //            if (box2 != null)
            //            {
            //                box = (box == null) ? box2 : box.Join(box2);
            //            }
            //        }
            //    }
            //}
            //if (box != null)
            //{
            //    base.Extent = new Extent(box.Min.X, box.Min.Y, box.Max.X, box.Max.Y);
            //}
            try
            {
            XDocument xDoc = XDocument.Load(cdiFile);

            var fullExtent = (from a in xDoc.Descendants("EnvelopeN")
                              select new Extent
                              (
                                    a.Element("XMin") == null ? double.NaN : double.Parse(a.Element("XMin").Value),
                                    a.Element("YMin") == null ? double.NaN : double.Parse(a.Element("YMin").Value),
                                    a.Element("XMax") == null ? double.NaN : double.Parse(a.Element("XMax").Value),
                                    a.Element("YMax") == null ? double.NaN : double.Parse(a.Element("YMax").Value)
                              )).First();
            //{ SpatialReference = this.SpatialReference }).First();

            base.Extent = fullExtent;

            }
            catch (Exception ex)
            {

            }
            //if (box != null)
            //{
            //    base.Extent = new Extent(box.Min.X, box.Min.Y, box.Max.X, box.Max.Y);
            //}
        }
        private void DrawTile(MapArgs args, TileInfo info, Resolution resolution, byte[] buffer, TileReprojector tr = null)
        {
            if (buffer == null || buffer.Length == 0)
                return;

            tr = tr ?? new TileReprojector(args, _projection, _targetProjection);

            using (var bitmap = (Bitmap)Image.FromStream(new MemoryStream(buffer)))
            {
                var inWorldFile = new Reprojection.WorldFile(resolution.UnitsPerPixel, 0, 
                                                0, -resolution.UnitsPerPixel,
                                                info.Extent.MinX, info.Extent.MaxY);

                Reprojection.WorldFile outWorldFile;
                Bitmap outBitmap;


                tr.Reproject(inWorldFile, bitmap, out outWorldFile, out outBitmap);
                if (outWorldFile == null) return;

                var lt = args.ProjToPixel(outWorldFile.ToGround(0, 0));
                var rb = args.ProjToPixel(outWorldFile.ToGround(outBitmap.Width, outBitmap.Height));
                var rect = new Rectangle(lt, Size.Subtract(new Size(rb), new Size(lt)));

                args.Device.DrawImage(outBitmap, rect, 0, 0, outBitmap.Width, outBitmap.Height,
                    GraphicsUnit.Pixel, _imageAttributes);

                if (outBitmap != bitmap) outBitmap.Dispose();
                if (FrameTile)
                {
                    if (FramePen != null)
                        args.Device.DrawRectangle(FramePen, rect);
                }
            }
        }