Пример #1
0
        void IMapControl.ShowTileGridLines(object go, DrawTile tilePoint)
        {
#if DEBUG_TILE_COORDS
            Graphics g = (Graphics)go;

            // show tile grid lines
            g.DrawRectangle(EmptyTileBorders, (int)fCore.TileRect.X, (int)fCore.TileRect.Y,
                            (int)fCore.TileRect.Width, (int)fCore.TileRect.Height);
            g.DrawString(
                (tilePoint.PosXY == fCore.CenterTileXYLocation ? "CENTER: " : "TILE: ") + tilePoint,
                MissingDataFont, Brushes.DimGray,
                new RectangleF(fCore.TileRect.X, fCore.TileRect.Y, fCore.TileRect.Width, fCore.TileRect.Height),
                CenterFormat);
#endif
        }
Пример #2
0
        public DrawTile GetDrawTile(Tile t)
        {
            DrawTile dt = null;

            if (t != null)
            {
                TilesUpdateLock.AcquireReaderLock(-1);
                try
                {
                    DicDrawTile.TryGetValue(t, out dt);
                }
                finally
                {
                    TilesUpdateLock.ReleaseReaderLock();
                }
            }
            return(dt);
        }
Пример #3
0
        /// <summary>
        /// 绘制单块瓦片
        /// </summary>
        /// <param name="rt"></param>
        /// <param name="g"></param>
        private void DrawMapTile(DrawTile rt, Graphics g, Point offset)
        {
            if (rt != null)
            {
                //var p = rt.DrawPosition.GetOffSet(0 - map.TilesArea.LeftTop.X, 0 - map.TilesArea.LeftTop.Y).ToPoint();
                var p = rt.DrawPosition.ToPoint();//绘图位置
                if (!offset.IsEmpty)
                {
                    p.Offset(offset);
                }

                if (rt.Tile != null && !rt.Tile.IsEmpty)
                {
                    rt.Tile.DrawTime = DateTime.Now;
                    //rt.Tile.DrawCount++;
                    if (rt.Tile.TileImg != null)
                    {
                        g.DrawImage(rt.Tile.TileImg, p);
                    }
                    else
                    {
                        //没图片
                        using (var f = new Font("宋体", 11))
                        {
                            p.X += 5;
                            p.Y += 5;
                            g.DrawString(rt.Tile.ToString(), f, new SolidBrush(GridLineColor), p);

                            //if (rt.Tile.IsLoading)
                            //{
                            //    p.Offset(0, 30);
                            //    g.DrawString("Loading...", f, new SolidBrush(GridLineColor), p);
                            //}
                            //else if (!string.IsNullOrWhiteSpace(rt.Tile.ErrorMsg))
                            //{
                            //    p.Offset(0, 30);
                            //    g.DrawString(rt.Tile.ErrorMsg, f, new SolidBrush(Color.FromArgb(0x88, 0xff, 0, 0)), p);
                            //}
                        }
                    }
                }
            }
        }
Пример #4
0
        public void UpdateDrawTiles()
        {
            IsTilesUpdating = true;
            TilesUpdateLock.AcquireWriterLock(1000);
            try
            {
                if (ScreenArea != null)
                {
                    var width  = TilesArea.Width;
                    var height = TilesArea.Height;



                    var pointLeftTopPix = TileCenterPix.GetOffSet(-width / 2, -height / 2); //左上角像素坐标
                    var tileXYLeftTop   = MercatorHelper.PixelToTileXY(pointLeftTopPix);    //左上角的瓦片索引
                    var tilePixLeftTop  = MercatorHelper.TileXYToPixel(tileXYLeftTop);      //左上角瓦片像素坐标
                    //var tileDrawPositionLeftTop = new PointInt((int)(tilePixLeftTop.X - pointLeftTopPix.X + 0.5), (int)(tilePixLeftTop.Y - pointLeftTopPix.Y + 0.5));//屏幕坐标系下左上角瓦片的屏幕坐标
                    var tileDrawPositionLeftTop = TilesArea.LeftTop.GetOffSet((int)(tilePixLeftTop.X - pointLeftTopPix.X), (int)(tilePixLeftTop.Y - pointLeftTopPix.Y));

                    var tileXYCenter = MercatorHelper.PixelToTileXY(TileCenterPix);//中心瓦片索引
                    //var tilePixCenter = MercatorHelper.TileXYToPixel(tileXYCenter);//中心瓦片左上角所在像素坐标

                    var xCount = (int)Math.Ceiling((double)width / TileSize.Width) + 1;   //X方向的瓦片数量
                    var yCount = (int)Math.Ceiling((double)height / TileSize.Height) + 1; //Y方向的瓦片数量

                    RectTilesBitmap         = new RectInt(tileDrawPositionLeftTop, xCount * TileSize.Width, yCount * TileSize.Height);
                    tileDrawPositionLeftTop = new PointInt(0, 0);
                    GridInfo = new DrawGrid
                    {
                        GridSize    = TileSize,
                        LeftTop     = RectTilesBitmap.LeftTop,
                        RightBottom = RectTilesBitmap.RightBottom,
                        XCount      = xCount,
                        YCount      = yCount,
                    };

                    //计算要显示的绘图瓦片
                    if (DicDrawTile == null)
                    {
                        DicDrawTile = new Dictionary <Tile, DrawTile>();
                    }
                    DicDrawTile.Clear();

                    var             minTileIndex  = MapHelper.GetTileMatrixMinXY(Zoom);
                    var             maxTileIndex  = MapHelper.GetTileMatrixMaxXY(Zoom);
                    List <Tile>     lstWantToLoad = new List <Tile>();
                    List <DrawTile> lstDrawTile   = new List <DrawTile>();
                    //DateTime rt = DateTime.Now;
                    for (int x = 0; x < xCount; x++)
                    {
                        for (int y = 0; y < yCount; y++)
                        {
                            var drawPostiton = tileDrawPositionLeftTop.GetOffSet(x * TileSize.Width, y * TileSize.Height);
                            //Tile t = new Tile(tileXYLeftTop.X + x, tileXYLeftTop.Y + y, Zoom);
                            Tile t = TileManager.Singleton.GetTile(Zoom, new PointInt64(tileXYLeftTop.X + x, tileXYLeftTop.Y + y));
                            if (t == null)
                            {
                                t = new Tile(tileXYLeftTop.X + x, tileXYLeftTop.Y + y, Zoom);
                            }
                            if (t.TileIndex.X >= minTileIndex.Width && t.TileIndex.Y >= minTileIndex.Height &&
                                t.TileIndex.X <= maxTileIndex.Width && t.TileIndex.Y <= maxTileIndex.Height)   //范围判断
                            {
                                var rt = new DrawTile()
                                {
                                    DrawPosition = drawPostiton,
                                    Tile         = t
                                };
                                lstDrawTile.Add(rt);
                                ////if (RotationAngle == 0 || MapHelper.CheckTileCrossRect(new RectInt(dt.DrawPosition.GetOffSet(TilesArea.LeftTop.X, TilesArea.LeftTop.Y), TileSize.Width, TileSize.Height), ScreenArea, RotationAngle))
                                //{
                                //    //DicDrawTile.Add(t, rt);
                                //    lstDrawTile.Add(rt);
                                //    //if (t.TileImg == null)
                                //    //{
                                //    //    lstWantToLoad.Add(t);

                                //    //}
                                //}
                            }
                        }
                    }
                    lstDrawTile = lstDrawTile.OrderBy(d => Math.Abs(d.Tile.TileIndex.X - tileXYCenter.X) + Math.Abs(d.Tile.TileIndex.Y - tileXYCenter.Y)).ToList();
                    foreach (var item in lstDrawTile)
                    {
                        if (item.Tile.State == TileState.New)
                        {
                            TileManager.Singleton.AddTile(item.Tile);
                        }
                        if (item.Tile.TileImg == null)
                        {
                            lstWantToLoad.Add(item.Tile);
                        }
                        item.Tile.ReadTime = DateTime.Now;
                        DicDrawTile.Add(item.Tile, item);
                    }



                    lstWantToLoad.ForEach(a => { TileManager.Singleton.LoadTile(a); });

                    //_lastTilesRect = tilesRect;
                    //TileDrawOffset = new PointInt(0,0);

                    if (TilesUpdateComplete != null)
                    {
                        TilesUpdateComplete(DicDrawTile);
                    }
                }
            }
            finally
            {
                IsTilesUpdating = false;
                TilesUpdateLock.ReleaseWriterLock();
            }
        }