public override void Run(IWwtContext context) { string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); string file = "2massoctset"; string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; if (level < 8) { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(String.Format(wwtTilesDir + "\\{0}.plate", file), level, tileX, tileY); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } }
public async Task <int> DownloadPlateFileAsync(string name, Stream stream, int maxLevel, CancellationToken token) { using var file = new PlateTilePyramid(stream, maxLevel); for (int level = 0; level < maxLevel; level++) { var size = Math.Pow(2, level); _logger.LogInformation("Adding level {Level} to {Plate} ({ImageCount} images)", level, name, size * size); for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { using var tile = await _plateTiles.GetStreamAsync(string.Empty, name, level, x, y, token); await file.AddStreamAsync(tile, level, x, y, token); } } } file.UpdateHeaderAndClose(); return(file.Count); }
private async Task <bool> ProcessPlateTileAsync(string container, string plateFile, int level, int x, int y, CancellationToken token) { using var stream = PlateTilePyramid.GetFileStream(plateFile, level, x, y); if (stream != null) { return(await _pyramid.SaveStreamAsync(stream, container, level, x, y, token)); } return(false); }
public virtual async Task <Stream> GetStreamAsync(string pathPrefix, string plateName, int level, int x, int y, CancellationToken token) { var client = GetBlob(pathPrefix, plateName); try { var download = await client.OpenReadAsync(_readOptions, token).ConfigureAwait(false); return(await PlateTilePyramid.GetImageStreamAsync(download, level, x, y, token).ConfigureAwait(false)); } catch (PlateTileException e) { _logger.LogError(e, "Unexpected error accessing image in plate file"); return(null); } catch (RequestFailedException e) { _logger.LogError(e, "Unexpected error downloading {PlateName}", plateName); return(null); } }
public override void Run(IWwtContext context) { string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); string file = values[3]; string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; context.Response.AddHeader("Cache-Control", "public, max-age=31536000"); context.Response.AddHeader("Expires", "Thu, 31 Dec 2009 16:00:00 GMT"); context.Response.AddHeader("ETag", "155"); context.Response.AddHeader("Last-Modified", "Tue, 20 May 2008 22:32:37 GMT"); //context.Response.AddHeader("Cache-Control", "max-age=36000"); if (level < 8) { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(String.Format(wwtTilesDir + "\\{0}.plate", file), level, tileX, tileY); int length = (int)s.Length; if (length == 0) { context.Response.Clear(); context.Response.ContentType = "text/plain"; context.Response.Write("No image"); context.Response.End(); return; } byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } }
public Task <Stream> GetStreamAsync(string pathPrefix, string plateName, int level, int x, int y, CancellationToken token) { var result = PlateTilePyramid.GetFileStream(Path.Combine(_directory, plateName), level, x, y); return(Task.FromResult(result)); }
public IEnumerable <Func <int, int, Task> > GenerateWorkItems(string plateFile, string baseUrl, CancellationToken token) { var filepart = Path.GetFileNameWithoutExtension(plateFile); var azureContainer = Path.GetFileName(plateFile).ToLowerInvariant(); bool hasLevels = PlateTilePyramid.GetLevelCount(plateFile, out int levels); string thumbnail = GetThumbnailName(plateFile); string wtmlfile = GetWtmlName(plateFile); if (File.Exists(thumbnail)) { _logger.LogTrace("Adding task for thumbnail {Path}", thumbnail); Task UploadThumbnail(int count, int total) { return(_pyramid.SaveStreamAsync(GetFileStream(thumbnail), azureContainer, GetThumbnailBlobName(filepart), token)); } yield return(UploadThumbnail); } if (File.Exists(wtmlfile)) { string wtmlFileOut = wtmlfile.Replace(".wtml", ".azure.wtml"); string wtmldata = UpdateWtmlEntries(File.ReadAllText(wtmlfile), filepart, baseUrl, azureContainer); File.WriteAllText(wtmlFileOut, wtmldata); } if (hasLevels) { _logger.LogInformation("Found {LevelCount} levels in {File}", levels, plateFile); int maxX = 1; int maxY = 1; for (int level = 0; level < levels; level++) { for (int y = 0; y < maxY; y++) { for (int x = 0; x < maxX; x++) { token.ThrowIfCancellationRequested(); var tmpLevel = level; var tmpX = x; var tmpY = y; async Task UploadItem(int count, int total) { _logger.LogTrace("[{Count} of {Total}] Starting upload for {File} L{Level}X{X}Y{Y}", count, total, plateFile, tmpLevel, tmpX, tmpY); try { var result = await ProcessPlateTileAsync(azureContainer, plateFile, tmpLevel, tmpX, tmpY, token); if (result) { _logger.LogInformation("[{Count} of {Total}] Completed upload for {File} L{Level}X{X}Y{Y}", count, total, plateFile, tmpLevel, tmpX, tmpY); } else { _logger.LogWarning("[{Count} of {Total}] Skipped upload for {File} L{Level}X{X}Y{Y}", count, total, plateFile, tmpLevel, tmpX, tmpY); } } catch (Exception e) { _logger.LogError(e, "[{Count} of {Total}] Unexpected error uploading {File} L{Level}X{X}Y{Y}", count, total, plateFile, tmpLevel, tmpX, tmpY); } } yield return(UploadItem); } } maxX *= 2; maxY *= 2; } _logger.LogInformation("Done adding upload tasks for {File}", plateFile); } else { _logger.LogWarning("Found no levels for {File}", plateFile); } }
public override void Run(IWwtContext context) { string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); string filename; string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; if (level > 10) { context.Response.Clear(); context.Response.ContentType = "text/plain"; context.Response.Write("No image"); context.Response.End(); return; } if (level < 9) { try { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(wwtTilesDir + "\\Galex4Near_L0to8_x0_y0.plate", level, tileX, tileY); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } catch { context.Response.Clear(); context.Response.ContentType = "text/plain"; context.Response.Write("No image"); context.Response.End(); return; } } else { try { int L = level; int X = tileX; int Y = tileY; int powLev3Diff = (int)Math.Pow(2, L - 3); int X8 = X / powLev3Diff; int Y8 = Y / powLev3Diff; filename = string.Format(wwtTilesDir + @"\\Galex4Near_L3to10_x{0}_y{1}.plate", X8, Y8); int L3 = L - 3; int X3 = X % powLev3Diff; int Y3 = Y % powLev3Diff; context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(filename, L3, X3, Y3); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } catch { context.Response.Clear(); context.Response.ContentType = "text/plain"; context.Response.Write("No image"); context.Response.End(); return; } } // This file has returns which cause this warning to show in the generated files. // This should be refactored, but that will be a bigger change. #pragma warning disable 0162 }
public override void Run(IWwtContext context) { string wwtDemDir = ConfigurationManager.AppSettings["WWTDEMDir"]; string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); int octsetlevel = level; string filename; if (level > 10) { context.Response.Write("No image"); context.Response.Close(); return; } if (level < 7) { context.Response.ContentType = "application/octet-stream"; Stream s = PlateTilePyramid.GetFileStream(wwtDemDir + @"\toast\lola\L0X0Y0.plate", level, tileX, tileY); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } else { int L = level; int X = tileX; int Y = tileY; int powLev5Diff = (int)Math.Pow(2, L - 3); int X32 = X / powLev5Diff; int Y32 = Y / powLev5Diff; filename = string.Format(wwtDemDir + @"\toast\lola\L3x{0}y{1}.plate", X32, Y32); int L5 = L - 3; int X5 = X % powLev5Diff; int Y5 = Y % powLev5Diff; context.Response.ContentType = "application/octet-stream"; Stream s = PlateTilePyramid.GetFileStream(filename, L5, X5, Y5); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } // This file has returns which cause this warning to show in the generated files. // This should be refactored, but that will be a bigger change. #pragma warning disable 0162 }
public override void Run(IWwtContext context) { string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; string dsstoastpng = WWTUtil.GetCurrentConfigShare("DSSTOASTPNG", true); string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); int octsetlevel = level; string filename; if (level > 20) { context.Response.Write("No image"); context.Response.Close(); return; } if (level < 8) { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(wwtTilesDir + "\\BmngMerBase.plate", level, tileX, tileY); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } else if (level < 10) { int L = level; int X = tileX; int Y = tileY; string mime = "png"; int powLev5Diff = (int)Math.Pow(2, L - 2); int X32 = X / powLev5Diff; int Y32 = Y / powLev5Diff; filename = string.Format(wwtTilesDir + @"\BmngMerL2X{1}Y{2}.plate", mime, X32, Y32); int L5 = L - 2; int X5 = X % powLev5Diff; int Y5 = Y % powLev5Diff; context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(filename, L5, X5, Y5); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } System.Net.WebClient client = new System.Net.WebClient(); string url = String.Format("http://a{0}.ortho.tiles.virtualearth.net/tiles/a{1}.jpeg?g=15", WWTUtil.GetServerID(tileX, tileY), WWTUtil.GetTileID(tileX, tileY, level, false)); byte[] dat = client.DownloadData(url); client.Dispose(); context.Response.OutputStream.Write(dat, 0, dat.Length); }
public override void Run(IWwtContext context) { string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; string DSSTileCache = WWTUtil.GetCurrentConfigShare("DSSTileCache", true); string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); string filename = String.Format(DSSTileCache + "\\EarthBlend\\level{0}\\{2}\\{1}_{2}.jpg", level, tileX, tileY); string path = String.Format(DSSTileCache + "\\EarthBlend\\level{0}\\{2}", level, tileX, tileY); if (level > 20) { context.Response.Write("No image"); context.Response.Close(); return; } if (level < 8) { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(wwtTilesDir + "\\BmngMerBase.plate", level, tileX, tileY); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } else if (level == 8) { int L = level; int X = tileX; int Y = tileY; string mime = "png"; int powLev5Diff = (int)Math.Pow(2, L - 2); int X32 = X / powLev5Diff; int Y32 = Y / powLev5Diff; filename = string.Format(wwtTilesDir + @"\BmngMerL2X{1}Y{2}.plate", mime, X32, Y32); int L5 = L - 2; int X5 = X % powLev5Diff; int Y5 = Y % powLev5Diff; context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(filename, L5, X5, Y5); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } else if (level == 9) { if (!File.Exists(filename)) { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } int L = level; int X = tileX; int Y = tileY; string mime = "png"; int powLev5Diff = (int)Math.Pow(2, L - 2); int X32 = X / powLev5Diff; int Y32 = Y / powLev5Diff; string platefilename = string.Format(wwtTilesDir + @"\BmngMerL2X{1}Y{2}.plate", mime, X32, Y32); int L5 = L - 2; int X5 = X % powLev5Diff; int Y5 = Y % powLev5Diff; float[][] ptsArray = { new float[] { 1, 0, 0, 0, 0 }, new float[] { 0, 1, 0, 0, 0 }, new float[] { 0, 0, 1, 0, 0 }, new float[] { 0, 0, 0, 0.5f, 0 }, new float[] { 0, 0, 0, 0, 1 } }; ColorMatrix clrMatrix = new ColorMatrix(ptsArray); ImageAttributes imgAttributes = new ImageAttributes(); imgAttributes.SetColorMatrix(clrMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(platefilename, L5, X5, Y5); Bitmap bmp = new Bitmap(s); Graphics g = Graphics.FromImage(bmp); g.InterpolationMode = InterpolationMode.HighQualityBicubic; string tempName = WWTUtil.DownloadVeTile(level, tileX, tileY, false); FileInfo fi = new FileInfo(tempName); if (fi.Length != 0 && fi.Length != 1033) { Bitmap temp = new Bitmap(tempName); g.DrawImage(temp, new Rectangle(0, 0, 256, 256), 0, 0, 256, 256, GraphicsUnit.Pixel, imgAttributes); temp.Dispose(); } g.Dispose(); bmp.Save(filename, ImageFormat.Jpeg); bmp.Dispose(); } context.Response.WriteFile(filename); return; } System.Net.WebClient client = new System.Net.WebClient(); string url = String.Format("http://a{0}.ortho.tiles.virtualearth.net/tiles/a{1}.jpeg?g=15", WWTUtil.GetServerID(tileX, tileY), WWTUtil.GetTileID(tileX, tileY, level, false)); byte[] dat = client.DownloadData(url); client.Dispose(); context.Response.OutputStream.Write(dat, 0, dat.Length); }
public override void Run(IWwtContext context) { string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); string filename; string path; string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; string DSSTileCache = WWTUtil.GetCurrentConfigShare("DSSTileCache", true); filename = String.Format(DSSTileCache + "\\SDSSToast\\{0}\\{2}\\{2}_{1}.png", level, tileX, tileY); path = String.Format(DSSTileCache + "\\SDSSToast\\{0}\\{2}", level, tileX, tileY); if (level > 14) { context.Response.Write("No image"); context.Response.Close(); return; } if (level < 9) { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(wwtTilesDir + "\\sdss_8.plate", level, tileX, tileY); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } /* * if (!sdssTile ) * { * // todo return black tile * using (Bitmap bmp = Bitmap(256, 256)) * { * using (Graphics g = Graphics.FromImage(bmp)) * { * g.Clear(Color.Black); * } * bmp.Save(filename); * context.Response.WriteFile(filename); * } * return; * } */ if (File.Exists(filename)) { try { context.Response.WriteFile(filename); return; } catch { } } else { OctTileMap map = new OctTileMap(level, tileX, tileY); Int32 sqSide = 256; //Vector2d topLeft = map.PointToRaDec(new Vector2d(0, 0)) //map.PointToRaDec(new Vector2d(0, 1)) //map.PointToRaDec(new Vector2d(1, 0)) //map.PointToRaDec(new Vector2d(1, 1)) // SDSS boundaries // RA: 105 deg <-> 270 deg // DEC: -3 deg <-> + 75 deg if (!(map.raMin > 270 | map.decMax < -3 | map.raMax < 105 | map.decMin > 75)) { Bitmap bmpOutput = new Bitmap(sqSide, sqSide); FastBitmap bmpOutputFast = new FastBitmap(bmpOutput); SdssImage sdim = new SdssImage(map.raMin, map.decMax, map.raMax, map.decMin); sdim.LoadImage(); sdim.Lock(); bmpOutputFast.LockBitmap(); // Fill up bmp from sdim Vector2d vxy, vradec; unsafe { PixelData *pPixel; for (int y = 0; y < sqSide; y++) { pPixel = bmpOutputFast[0, y]; vxy.Y = (y / 255.0); for (int x = 0; x < sqSide; x++) { vxy.X = (x / 255.0); vradec = map.PointToRaDec(vxy); *pPixel = sdim.GetPixelDataAtRaDec(vradec); pPixel++; } } } bmpOutputFast.UnlockBitmap(); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } bmpOutput.Save(filename, ImageFormat.Png); bmpOutput.Dispose(); try { context.Response.WriteFile(filename); } catch { } } else { //context.Response.WriteFile(@"c:\inetpub\cache\empty.png"); context.Response.Write("No Image"); } } context.Response.End(); }
public override void Run(IWwtContext context) { if (context.Request.UserAgent.ToLower().Contains("wget")) { context.Response.Write("You are not allowed to bulk download imagery thru the tile service. Please contact [email protected] for more information."); context.Response.End(); return; } string query = context.Request.Params["Q"]; string[] values = query.Split(','); //++ // 2014-09-26 security fix. // int level = 0; int tileX = 0; int tileY = 0; try { level = Convert.ToInt32(values[0]); tileX = Convert.ToInt32(values[1]); tileY = Convert.ToInt32(values[2]); } catch { context.Response.Write("Invalid query string."); context.Response.End(); return; } string filename; string path; string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; string DSSTileCache = WWTUtil.GetCurrentConfigShare("DSSTileCache", true); filename = String.Format(DSSTileCache + "\\SDSSToast12\\{0}\\{2}\\{2}_{1}.png", level, tileX, tileY); path = String.Format(DSSTileCache + "\\SDSSToast12\\{0}\\{2}", level, tileX, tileY); if (level > 14) { context.Response.Write("No image"); context.Response.End(); return; } if (level < 8) { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(wwtTilesDir + "\\sdssdr12_7.plate", level, tileX, tileY); int length = (int)s.Length; if (length == 0) { context.Response.Clear(); context.Response.ContentType = "text/plain"; context.Response.Write("No image"); context.Response.End(); return; } byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } if (File.Exists(filename)) { try { context.Response.WriteFile(filename); return; } catch { } } else { OctTileMap map = new OctTileMap(level, tileX, tileY); Int32 sqSide = 256; Bitmap bmpOutput = new Bitmap(sqSide, sqSide); FastBitmap bmpOutputFast = new FastBitmap(bmpOutput); SdssImage sdim = new SdssImage(map.raMin, map.decMax, map.raMax, map.decMin, true); sdim.LoadImage(); if (sdim.image != null) { sdim.Lock(); bmpOutputFast.LockBitmap(); // Fill up bmp from sdim Vector2d vxy, vradec; unsafe { PixelData *pPixel; for (int y = 0; y < sqSide; y++) { pPixel = bmpOutputFast[0, y]; vxy.Y = (y / 255.0); for (int x = 0; x < sqSide; x++) { vxy.X = (x / 255.0); vradec = map.PointToRaDec(vxy); *pPixel = sdim.GetPixelDataAtRaDec(vradec); pPixel++; } } } sdim.Unlock(); sdim.image.Dispose(); bmpOutputFast.UnlockBitmap(); } if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } bmpOutput.Save(filename, ImageFormat.Png); bmpOutput.Dispose(); try { context.Response.WriteFile(filename); } catch { } } context.Response.End(); }
public override void Run(IWwtContext context) { string wwtTilesDir = ConfigurationManager.AppSettings["WWTTilesDir"]; string dsstoastpng = WWTUtil.GetCurrentConfigShare("DSSTOASTPNG", true); string query = context.Request.Params["Q"]; string[] values = query.Split(','); int level = Convert.ToInt32(values[0]); int tileX = Convert.ToInt32(values[1]); int tileY = Convert.ToInt32(values[2]); int octsetlevel = level; string filename; if (level > 12) { context.Response.Write("No image"); context.Response.Close(); return; } if (level < 8) { context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(wwtTilesDir + "\\dsstoast.plate", level, tileX, tileY); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } else { int L = level; int X = tileX; int Y = tileY; string mime = "png"; int powLev5Diff = (int)Math.Pow(2, L - 5); int X32 = X / powLev5Diff; int Y32 = Y / powLev5Diff; filename = string.Format(dsstoastpng + @"\DSS{0}L5to12_x{1}_y{2}.plate", mime, X32, Y32); int L5 = L - 5; int X5 = X % powLev5Diff; int Y5 = Y % powLev5Diff; context.Response.ContentType = "image/png"; Stream s = PlateTilePyramid.GetFileStream(filename, L5, X5, Y5); int length = (int)s.Length; byte[] data = new byte[length]; s.Read(data, 0, length); context.Response.OutputStream.Write(data, 0, length); context.Response.Flush(); context.Response.End(); return; } // This file has returns which cause this warning to show in the generated files. // This should be refactored, but that will be a bigger change. #pragma warning disable 0162 }