Esempio n. 1
0
        /// <summary>
        /// This will update the address templates and remove empty addresses
        /// </summary>
        /// <param name="context"></param>
        private void UpdateAddressesTemplates(ImageCreationContext context)
        {
            var address = IsValidAddress(context.DataContainer.BaseLayer.Address)
                ? context.DataContainer.BaseLayer.Address
                : GetBaseAddressFromInvalidString(context.DataContainer.BaseLayer.Address);

            var addressTemplates = new List <AddressAndOpacity>
            {
                new AddressAndOpacity {
                    Address = FixAdrressTemplate(address), Opacity = context.DataContainer.BaseLayer.Opacity ?? 1.0
                }
            };

            foreach (var layerData in context.DataContainer.Overlays ?? new List <LayerData>())
            {
                if (IsValidAddress(layerData.Address) == false)
                {
                    continue;
                }
                var addressAndOpacity = new AddressAndOpacity
                {
                    Address = FixAdrressTemplate(layerData.Address),
                    Opacity = layerData.Opacity ?? 1.0
                };
                addressTemplates.Add(addressAndOpacity);
            }
            context.AddressesTemplates = addressTemplates.ToArray();
        }
Esempio n. 2
0
        private static AddressAndOpacity[] GetAddressTemplates(DataContainer dataContainer)
        {
            var address = string.IsNullOrWhiteSpace(dataContainer.BaseLayer.Address)
                ? "https://israelhiking.osm.org.il/Hebrew/tiles/{z}/{x}/{y}.png"
                : dataContainer.BaseLayer.Address;

            var addressTemplates = new List <AddressAndOpacity>
            {
                new AddressAndOpacity {
                    Address = FixAdrressTemplate(address), Opacity = dataContainer.BaseLayer.Opacity ?? 1.0
                }
            };

            foreach (var layerData in dataContainer.Overlays ?? new List <LayerData>())
            {
                if (string.IsNullOrWhiteSpace(layerData.Address))
                {
                    continue;
                }
                var addressAndOpacity = new AddressAndOpacity
                {
                    Address = FixAdrressTemplate(layerData.Address),
                    Opacity = layerData.Opacity ?? 1.0
                };
                addressTemplates.Add(addressAndOpacity);
            }
            return(addressTemplates.ToArray());
        }
Esempio n. 3
0
        /// <summary>
        /// This will update the address templates and remove empty addresses
        /// </summary>
        /// <param name="context"></param>
        private void UpdateAddressesTemplates(ImageCreationContext context)
        {
            var address = IsValidAddress(context.DataContainer.BaseLayer.Address) == false
                ? "https://israelhiking.osm.org.il/Hebrew/tiles/{z}/{x}/{y}.png"
                : context.DataContainer.BaseLayer.Address;

            var addressTemplates = new List <AddressAndOpacity>
            {
                new AddressAndOpacity {
                    Address = FixAdrressTemplate(address), Opacity = context.DataContainer.BaseLayer.Opacity ?? 1.0
                }
            };

            foreach (var layerData in context.DataContainer.Overlays ?? new List <LayerData>())
            {
                if (IsValidAddress(layerData.Address) == false)
                {
                    continue;
                }
                var addressAndOpacity = new AddressAndOpacity
                {
                    Address = FixAdrressTemplate(layerData.Address),
                    Opacity = layerData.Opacity ?? 1.0
                };
                addressTemplates.Add(addressAndOpacity);
            }
            context.AddressesTemplates = addressTemplates.ToArray();
        }
Esempio n. 4
0
        /// <summary>
        /// This method will fetch the relevant image
        /// If the required zoom is too big it will fetch and image from a lower zoom and split the relevant part of it
        /// This allow the other parts of the algorithm to be ignorat to the max zoom .
        /// </summary>
        /// <param name="topLeft">Top left corner</param>
        /// <param name="offset">Offset from corner</param>
        /// <param name="zoom">required zoom level</param>
        /// <param name="addressTemplate">The address template to fetch the file from</param>
        /// <returns></returns>
        private async Task <ImageWithOffset> GetTileImage(Point topLeft, Point offset, int zoom, AddressAndOpacity addressTemplate)
        {
            var xY             = new Point(topLeft.X + offset.X, topLeft.Y + offset.Y);
            var translatedXy   = xY;
            var zoomDifference = Math.Pow(2, zoom - MAX_ZOOM);

            if (zoomDifference > 1)
            {
                // zoom is above max native zoom
                zoom         = MAX_ZOOM;
                translatedXy = new Point
                {
                    X = (int)(xY.X / zoomDifference),
                    Y = (int)(xY.Y / zoomDifference),
                };
            }
            var file = addressTemplate.Address.Replace("{z}", "{zoom}")
                       .Replace("{zoom}", zoom.ToString())
                       .Replace("{x}", translatedXy.X.ToString())
                       .Replace("{y}", translatedXy.Y.ToString());
            var fileResponse = await _remoteFileFetcherGateway.GetFileContent(file);

            if (!fileResponse.Content.Any())
            {
                return(new ImageWithOffset
                {
                    Image = new Image <Rgba32>(TILE_SIZE, TILE_SIZE),
                    Offset = offset
                });
            }
            var image = Image.Load(fileResponse.Content);

            if (addressTemplate.Opacity < 1.0)
            {
                image.Mutate(x => x.Opacity((float)addressTemplate.Opacity));
            }
            if (zoomDifference > 1)
            {
                MagnifyImagePart(image, zoomDifference, xY, translatedXy);
            }
            return(new ImageWithOffset
            {
                Image = image,
                Offset = offset
            });
        }
Esempio n. 5
0
        private async Task <ImageWithOffset> GetTileImage(Point topLeft, Point offset, int zoom, AddressAndOpacity addressTemplate)
        {
            var file = addressTemplate.Address.Replace("{z}", zoom.ToString())
                       .Replace("{zoom}", zoom.ToString())
                       .Replace("{x}", (topLeft.X + offset.X).ToString())
                       .Replace("{y}", (topLeft.Y + offset.Y).ToString());
            var fileResponse = await _remoteFileFetcherGateway.GetFileContent(file);

            if (!fileResponse.Content.Any())
            {
                return(new ImageWithOffset
                {
                    Image = new Bitmap(TILE_SIZE, TILE_SIZE),
                    Offset = offset
                });
            }

            var image = Image.FromStream(new MemoryStream(fileResponse.Content), true);

            if (addressTemplate.Opacity < 1.0)
            {
                image = ChangeOpacity(image, addressTemplate.Opacity);
            }
            return(new ImageWithOffset
            {
                Image = image,
                Offset = offset
            });
        }