public UtmPosition GetStart(UtmBounds pBounds) { return(new Maps.UtmPosition( 33, Map.EastOrigin + Math.Floor((pBounds.NorthWest.Easting - Map.EastOrigin) / TileSizeInMeters) * TileSizeInMeters, Map.NorthOrigin + Math.Floor((pBounds.SouthEast.Northing - Map.NorthOrigin) / TileSizeInMeters) * TileSizeInMeters )); }
public int CountTiles(UtmBounds pBounds) { var vStart = GetStart(pBounds); int vHorizontalCount = (int)Math.Floor(((pBounds.SouthEast.Easting + TileSizeInMeters - vStart.Easting) / TileSizeInMeters)); int vVerticalCount = (int)Math.Floor(((pBounds.NorthWest.Northing + TileSizeInMeters - vStart.Northing) / TileSizeInMeters)); return(vHorizontalCount * vVerticalCount); }
public void DrawPreview(Graphics vGraphics, Rectangle vImageRect, float pPreviewZoom) { var vCenter33 = PositionUtm32.Transform(33); var vOrigoUtm33 = vCenter33.Move(-vImageRect.Width / 2.0 / Setup.PixelsPerMeter * pPreviewZoom, vImageRect.Height / 2.0 / Setup.PixelsPerMeter * pPreviewZoom); var vBottomRightUtm33 = vCenter33.Move(vImageRect.Width / 2.0 / Setup.PixelsPerMeter * pPreviewZoom, -vImageRect.Height / 2.0 / Setup.PixelsPerMeter * pPreviewZoom); var vBounds = new UtmBounds( vOrigoUtm33, vBottomRightUtm33 ); var vTask = DownloadAllImagesAsync(vBounds); DrawMap(vGraphics, pPreviewZoom, vBounds); vGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; vGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; vGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; SizeF vLabelRectSizeUtm = new SizeF(30F, 20F); SizeF vLabelRectSizeLatLong = new SizeF(40F, 20F); if (Setup.ShowUtmGrid) { DrawUtmGrid(vGraphics, vOrigoUtm33, vBottomRightUtm33, pPreviewZoom, vLabelRectSizeUtm); } if (Setup.ShowLatLonGrid) { DrawLatLongGrid(vGraphics, vOrigoUtm33, vBottomRightUtm33, pPreviewZoom, vLabelRectSizeLatLong); } RectangleF vPaperRect = new RectangleF(); vPaperRect.Size = GetImageSize(); vPaperRect.Width /= (float)pPreviewZoom; vPaperRect.Height /= (float)pPreviewZoom; vPaperRect.Offset((vImageRect.Width - vPaperRect.Width) / 2F, (vImageRect.Height - vPaperRect.Height) / 2F); var vPaperPen = new Pen(Color.Green, 5F); vGraphics.DrawRectangle(vPaperPen, vPaperRect.X, vPaperRect.Y, vPaperRect.Width, vPaperRect.Height); if (Setup.ShowCrossHair) { DrawCrossHair(vGraphics, vCenter33, vOrigoUtm33, pPreviewZoom); } if (Setup.RadiusR25.HasValue) { DrawRadius(vGraphics, vCenter33, vOrigoUtm33, Setup.RadiusR25.Value, pPreviewZoom); } if (Setup.RadiusR50.HasValue) { DrawRadius(vGraphics, vCenter33, vOrigoUtm33, Setup.RadiusR50.Value, pPreviewZoom); } }
private void DrawMap(Graphics vGraphics, float pPreviewZoom, UtmBounds pBounds) { var vStart = Setup.GetStart(pBounds); int vTotalCount = Setup.CountTiles(pBounds); int vProcessed = 0; for (double x = vStart.Easting; x <= pBounds.SouthEast.Easting + Setup.TileSizeInMeters; x += Setup.TileSizeInMeters) { for (double y = vStart.Northing; y <= pBounds.NorthWest.Northing + Setup.TileSizeInMeters; y += Setup.TileSizeInMeters) { UtmPosition vImagePosition = new UtmPosition(33, x, y); var vLocationInBitmap = Utm33ToBitmapPosition(vImagePosition, pBounds.NorthWest); string vFilename = GetFilename(vImagePosition, Setup.TileSizeInMeters, Setup.Map.TileSize); if (File.Exists(vFilename)) { try { using (Bitmap vTile = new Bitmap(vFilename)) { vGraphics.DrawImage(vTile, (int)(vLocationInBitmap.X / pPreviewZoom), (int)(vLocationInBitmap.Y / pPreviewZoom), (int)(vTile.Width / pPreviewZoom), (int)(vTile.Height / pPreviewZoom)); } } catch (ArgumentException ex) { try { File.Delete(vFilename); } catch { } } } OnCreateBitmapProgress(vTotalCount, ++vProcessed); } } }
public async Task <Bitmap> CreateBitmapAsync(UtmBounds pBounds) { await DownloadAllImagesAsync(pBounds); // new UtmBounds(OrigoUtm33, BottomRigthUtm33)); var vResult = await Task <Bitmap> .Run(() => { var vImageSize = new Size((int)((BottomRigthUtm33.Easting - OrigoUtm33.Easting + Setup.TileSizeInMeters) * Setup.PixelsPerMeter), (int)((OrigoUtm33.Northing - BottomRigthUtm33.Northing) * Setup.PixelsPerMeter)); // GetImageSize(); Bitmap vBitmap = new Bitmap(vImageSize.Width, vImageSize.Height); Graphics vGraphics = Graphics.FromImage(vBitmap); vGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; vGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; vGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; DrawMap(vGraphics); vGraphics.Dispose(); var vRescaledSize = GetImageSize(); Bitmap vRescaledBitmap = new Bitmap(vRescaledSize.Width, vRescaledSize.Height); Graphics vRescaledGraphics = Graphics.FromImage(vRescaledBitmap); vRescaledGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; vRescaledGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; vRescaledGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; vRescaledGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; var vCenterUtm33 = PositionUtm32.Transform(33); var vNewOrigo = vCenterUtm33.Move(-vRescaledSize.Width / Setup.PixelsPerMeter / 2.0, vRescaledSize.Height / Setup.PixelsPerMeter / 2.0); var vNewBottomRight = vCenterUtm33.Move(vRescaledSize.Width / Setup.PixelsPerMeter / 2.0, -vRescaledSize.Height / Setup.PixelsPerMeter / 2.0); var vOffset = Utm33ToBitmapPosition(vNewOrigo, OrigoUtm33); vRescaledGraphics.DrawImage(vBitmap, -vOffset.X, -vOffset.Y); vBitmap.Dispose(); SizeF vLabelRectSizeUtm = new SizeF((float)(Setup.PixelsPerMeter * 30.0 * Setup.ScaleAndTileSize.Scale / 5000.0), (float)(Setup.PixelsPerMeter * 20.0 * Setup.ScaleAndTileSize.Scale / 5000.0)); SizeF vLabelRectSizeLatLong = new SizeF((float)(Setup.PixelsPerMeter * 40.0 * Setup.ScaleAndTileSize.Scale / 5000.0), (float)(Setup.PixelsPerMeter * 20.0 * Setup.ScaleAndTileSize.Scale / 5000.0)); if (Setup.ShowUtmGrid) { DrawUtmGrid(vRescaledGraphics, vNewOrigo, vNewBottomRight, 1F, vLabelRectSizeUtm); } if (Setup.ShowLatLonGrid) { DrawLatLongGrid(vRescaledGraphics, vNewOrigo, vNewBottomRight, 1F, vLabelRectSizeLatLong); } var vNewCenter = new UtmPosition(33, vNewOrigo.Easting + (vNewBottomRight.Easting - vNewOrigo.Easting) / 2.0, vNewBottomRight.Northing + (vNewOrigo.Northing - vNewBottomRight.Northing) / 2.0); if (Setup.RadiusR25.HasValue) { DrawRadius(vRescaledGraphics, vNewCenter, vNewOrigo, Setup.RadiusR25.Value, 1f); } if (Setup.RadiusR50.HasValue) { DrawRadius(vRescaledGraphics, vNewCenter, vNewOrigo, Setup.RadiusR50.Value, 1f); } if (Setup.ShowCrossHair) { DrawCrossHair(vRescaledGraphics, vNewCenter, vNewOrigo, 1f); } vRescaledGraphics.DrawRectangle(Pens.Black, 0f, 0f, vRescaledSize.Width - 1f, vRescaledSize.Height - 1f); return(vRescaledBitmap); }); return(vResult); }
private async Task DownloadAllImagesAsync(UtmBounds pBounds) { Dictionary <Task <WebResponse>, string> vDownloadTasks = new Dictionary <Task <WebResponse>, string>(); List <string> vFilesToDownload = new List <string>(); TaskFactory vTaskFactory = new TaskFactory(); var vStart = Setup.GetStart(pBounds); for (double x = vStart.Easting; x <= pBounds.SouthEast.Easting; x += Setup.TileSizeInMeters) { for (double y = vStart.Northing; y <= pBounds.NorthWest.Northing + Setup.TileSizeInMeters; y += Setup.TileSizeInMeters) { UtmPosition vImagePosition = new UtmPosition(33, x, y); string vFilename = GetFilename(vImagePosition, Setup.TileSizeInMeters, Setup.Map.TileSize); if (!File.Exists(vFilename) && !gDownloadList.Contains(vFilename)) { gDownloadList.Add(vFilename); CancellationTokenSource vCancellationSource = new CancellationTokenSource(); CancellationToken vCancellationToken = vCancellationSource.Token; System.Net.WebRequest vRequest = WebRequest.Create(Setup.Map.GetUrl(x, y - Setup.TileSizeInMeters, x + Setup.TileSizeInMeters, y)); vDownloadTasks.Add(Task <WebResponse> .Factory.FromAsync(vRequest.BeginGetResponse, vRequest.EndGetResponse, vRequest), vFilename); } } } // Remove any incomplete task, which is not a part of this batch //var vTasksToCancel = gDownloadList.Where(v => !vFilesToDownload.Contains(v.Key)); //foreach (var vTask in vTasksToCancel.ToArray()) //{ // if (!vTask.Value.IsCancellationRequested) // { // vTask.Value.Cancel(); // vTask.Value.Dispose(); // gDownloadList.Remove(vTask.Key); // } //} int vTotalFiles = gDownloadList.Count; while (vDownloadTasks.Count > 0) { var vCompleted = await Task.WhenAny(vDownloadTasks.Keys); var vFilename = vDownloadTasks[vCompleted]; vDownloadTasks.Remove(vCompleted); if (vCompleted.Status == TaskStatus.RanToCompletion && vCompleted.Result != null) { if (!File.Exists(vFilename)) { using (var vFile = File.OpenWrite(vFilename)) { using (var vResponse = vCompleted.Result.GetResponseStream()) { await vResponse.CopyToAsync(vFile); vResponse.Close(); vFile.Close(); } } } } gDownloadList.Remove(vFilename); OnDownloadProgress(vTotalFiles, vTotalFiles - gDownloadList.Count); } }