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;
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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;
            }
        }
Example #6
0
        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));
        }
Example #7
0
        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
        }
Example #10
0
        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);
        }
Example #12
0
        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();
        }
Example #14
0
        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
        }