Example #1
0
        public static ReportInfo GetRDLRouteMap(IUnitOfWork uow, RouteList routeList, bool batchPrint)
        {
            string documentName = "RouteMap";

            XmlDocument         rdlText    = new XmlDocument();
            XmlNamespaceManager namespaces = new XmlNamespaceManager(rdlText.NameTable);

            namespaces.AddNamespace("r", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
            rdlText.Load(Path.Combine(Environment.CurrentDirectory, "Reports/Logistic/" + documentName + ".rdl"));
            var imageData = rdlText.DocumentElement.SelectSingleNode("/r:Report/r:EmbeddedImages/r:EmbeddedImage[@Name=\"map\"]/r:ImageData", namespaces);

            var map = new GMapControl
            {
                MapProvider    = GMapProviders.OpenCycleMap,
                MaxZoom        = 18,
                RoutesEnabled  = true,
                MarkersEnabled = true
            };

            GMapOverlay routeOverlay = new GMapOverlay("route");

            using (var calc = new RouteGeometryCalculator(DistanceProvider.Osrm))
            {
                MapDrawingHelper.DrawRoute(routeOverlay, routeList, calc);
            }

            GMapOverlay addressesOverlay = new GMapOverlay("addresses");

            MapDrawingHelper.DrawAddressesOfRoute(addressesOverlay, routeList);
            map.Overlays.Add(routeOverlay);
            map.Overlays.Add(addressesOverlay);
            map.SetFakeAllocationSize(new Gdk.Rectangle(0, 0, 900, 900));
            map.ZoomAndCenterRoutes("route");
            byte[] img;
            using (var bitmap = map.ToBitmap((int count) => _logger.Info("Загружаем плитки карты(осталось {0})...", count), !batchPrint))
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                    img = stream.ToArray();
                }
            }

            string base64image = Convert.ToBase64String(img);

            imageData.InnerText = base64image;

            return(new ReportInfo
            {
                Title = $"Карта маршрута № { routeList.Id }",
                Source = rdlText.InnerXml,
                Parameters = new Dictionary <string, object>
                {
                    { "route_id", routeList.Id }
                }
            });
        }