private static BtExtent ToBrutileExtent(DsExtent extent)
 {
     return(new BtExtent(extent.MinX, extent.MinY, extent.MaxX, extent.MaxY));
 }
        /// <summary>
        /// Creates an instanc of this class using the given <paramref name="configuration"/>
        /// </summary>
        /// <param name="configuration">The configuration</param>
        public BruTileLayer(IConfiguration configuration)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            var data = base.ContextMenuItems.Find(m => m.Name == "Data");

            if (data != null)
            {
                base.ContextMenuItems.Remove(data);
            }

            /*
             * data = base.ContextMenuItems.Find(m => m.Name.StartsWith("Attrib"));
             * if (data != null) base.ContextMenuItems.Remove(data);
             */

            // Initialize the configuration prior to usage
            configuration.Initialize();

            //
            _configuration = configuration;
            var tileSource = configuration.TileSource;
            // for wmts this might be some crude value (urn)
            var authorityCode = ToAuthotityCode(tileSource.Schema.Srs);

            if (!string.IsNullOrWhiteSpace(authorityCode))
            {
                _sourceProjection = AuthorityCodeHandler.Instance[authorityCode];
            }
            else
            {
                ProjectionInfo p;
                if (!TryParseProjectionEsri(tileSource.Schema.Srs, out p))
                {
                    if (!TryParseProjectionProj4(tileSource.Schema.Srs, out p))
                    {
                        p = AuthorityCodeHandler.Instance["EPSG:3857"];
                    }
                }
                _sourceProjection = p;
            }

            if (_sourceProjection == null)
            {
                _sourceProjection = AuthorityCodeHandler.Instance["EPSG:3857"];
            }

            // WebMercator: set datum to WGS1984 for better accuracy
            if (tileSource.Schema.Srs == "EPSG:3857")
            {
                _sourceProjection.GeographicInfo.Datum = KnownCoordinateSystems.Geographic.World.WGS1984.GeographicInfo.Datum;
            }

            Projection = _sourceProjection;
            var extent = tileSource.Schema.Extent;

            MyExtent = new DsExtent(extent.MinX, extent.MinY, extent.MaxX, extent.MaxY);

            base.LegendText        = configuration.LegendText;
            base.LegendItemVisible = true;
            base.IsVisible         = base.Checked = true;

            base.LegendSymbolMode = SymbolMode.Symbol;
            LegendType            = LegendType.Custom;

            _tileFetcher = configuration.TileFetcher;
            _tileFetcher.TileReceived += HandleTileReceived;
            _tileFetcher.QueueEmpty   += HandleQueueEmpty;

            //Set the wrap mode
            _imageAttributes = new ImageAttributes();
            _imageAttributes.SetWrapMode(WrapMode.TileFlipXY);
        }