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