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 }
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); }
/// <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); //} } } } } }
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(); } }