示例#1
0
 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
                ));
 }
示例#2
0
        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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
                }
            }
        }
示例#5
0
        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);
        }
示例#6
0
        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);
            }
        }