Example #1
0
        protected void TryGetSizeOfMultiDs()
        {
            var subDsDic      = ds.GetSubDatasets();
            var subDsPathList = ds.GetSubDatasets().Values.ToList();
            RasterSourceTypeSingleInfo info = mRasterSourceManager.GetInstance().GetInputfileRasterSourceInfo(fileName);

            if (subDsDic.Count > 0)
            {
                if (info != null)
                {
                    string name = info.defaultDisplayDataset;
                    string key  = subDsDic.Keys.FirstOrDefault(t => t.Contains(name));
                    if (!string.IsNullOrEmpty(key))
                    {
                        var subDs = Gdal.OpenShared(subDsDic[key], Access.GA_ReadOnly);
                        Width  = subDs.RasterXSize;
                        Height = subDs.RasterYSize;
                        subDs.Dispose();
                    }

                    return;
                }
                else
                {
                    for (int i = 0; i < subDsDic.Count - 1; i++)
                    {
                        using (var curDs = Gdal.Open(subDsPathList[i], Access.GA_ReadOnly))
                            using (var nextDs = Gdal.Open(subDsPathList[i + 1], Access.GA_ReadOnly))
                            {
                                if (curDs != null && nextDs != null)
                                {
                                    if (curDs.RasterXSize != nextDs.RasterXSize ||
                                        (curDs.RasterYSize != nextDs.RasterYSize))
                                    {
                                        Width = Height = 0;
                                        return;
                                    }
                                }
                            }
                    }

                    using (var rDs = Gdal.Open(subDsPathList[0], Access.GA_ReadOnly))
                    {
                        Width  = rDs.RasterXSize;
                        Height = rDs.RasterYSize;
                        return;
                    }
                }
            }
        }
Example #2
0
        /* public static string OverView(AbstractWarpDataset outfileRaster, int _prjPngSize)
         * {
         *   //int height = _prjPngSize;
         *   int maxWidth = _prjPngSize;
         *   int matchHeight = Convert.ToInt32(outfileRaster.Height * 1.0* _prjPngSize / outfileRaster.Width );
         *   //int width = Convert.ToInt32(outfileRaster.Width * 1.0 / outfileRaster.Height * _prjPngSize);
         *   var rLayer = LayerFactory.CreateDefaultRasterLayer(outfileRaster.ds as IRasterDataset);
         *   ILayer layer = rLayer as ILayer;
         *   mRasterRenderTool.Instance.RenderSingleRasterSource(layer, outfileRaster.fileName);
         *
         *   IDisplayTransformation disTrans = new DisplayTransformation();
         *   disTrans.Bounds = layer.Extent;
         *   disTrans.DeviceFrame = new System.Drawing.RectangleF(0, 0, maxWidth, matchHeight);
         *   disTrans.VisibleBounds = layer.Extent;
         *   disTrans.SpatialReference = outfileRaster.SpatialRef;
         *
         *   Bitmap bit = new Bitmap(maxWidth, matchHeight);
         *   Graphics graphic = Graphics.FromImage(bit);
         *   layer.Draw(graphic, disTrans, SystemUI.LayerDrawPhaseType.DPGeography, null);
         *   //bit.MakeTransparent(Color.Black);
         *   string outOverviewFile = Path.Combine(Path.GetDirectoryName(outfileRaster.fileName), Path.GetFileNameWithoutExtension(outfileRaster.fileName) + ".OverView.png");
         *   bit.Save(outOverviewFile);
         *   //根据输入影像 生成指定尺寸的png
         *   return outOverviewFile;
         * }*/

        public static string OverView(AbstractWarpDataset outfileRaster, int _prjPngSize)
        {
            int    maxWidth        = _prjPngSize;
            int    matchHeight     = Convert.ToInt32(outfileRaster.Height * 1.0 * _prjPngSize / outfileRaster.Width);
            string outOverviewFile = Path.Combine(Path.GetDirectoryName(outfileRaster.fileName),
                                                  Path.GetFileNameWithoutExtension(outfileRaster.fileName) + ".overview.png");

            RasterSourceTypeSingleInfo single =
                mRasterSourceManager.GetInstance().GetInputfileRasterSourceInfo(outfileRaster.fileName);

            int[] bandNos = new int[] { 3, 2, 1 };
            if (single != null)
            {
                var bands = single.RenderCol.Defaultband.Split(',');
                if (bands.Length == 1)
                {
                    bandNos[0] = Convert.ToInt32(bands[0]);
                    bandNos[1] = Convert.ToInt32(bands[0]);
                    bandNos[2] = Convert.ToInt32(bands[0]);
                }
                else if (bands.Length == 3)
                {
                    bandNos[0] = Convert.ToInt32(bands[0]);
                    bandNos[1] = Convert.ToInt32(bands[1]);
                    bandNos[2] = Convert.ToInt32(bands[2]);
                }
            }

            Console.WriteLine("Bands :{0} {1} {2}", bandNos[0], bandNos[1], bandNos[2]);
            var outDs = Gdal.GetDriverByName("MEM").Create("", maxWidth, matchHeight, 4, DataType.GDT_Byte, null);

            UInt16[][] buffer = new UInt16[4][];
            for (int i = 0; i < 4; i++)
            {
                buffer[i] = new UInt16[maxWidth * matchHeight];
            }


            outfileRaster.GetRasterBand(bandNos[0] - 1)
            .ReadRaster(0, 0, outfileRaster.Width, outfileRaster.Height, buffer[0], maxWidth, matchHeight, 0, 0);
            outfileRaster.GetRasterBand(bandNos[1] - 1)
            .ReadRaster(0, 0, outfileRaster.Width, outfileRaster.Height, buffer[1], maxWidth, matchHeight, 0, 0);
            outfileRaster.GetRasterBand(bandNos[2] - 1)
            .ReadRaster(0, 0, outfileRaster.Width, outfileRaster.Height, buffer[2], maxWidth, matchHeight, 0, 0);


            double offsetR = 0, offsetG = 0, offsetB = 0;
            double scaleR = 0.25, scaleG = 0.25, scaleB = 0.25;

            if (single != null)
            {
                var renderR =
                    single.RenderCol.BandRenderCol.FirstOrDefault(t => t.BandID.Contains(bandNos[0].ToString()));
                var renderG =
                    single.RenderCol.BandRenderCol.FirstOrDefault(t => t.BandID.Contains(bandNos[1].ToString()));
                var renderB =
                    single.RenderCol.BandRenderCol.FirstOrDefault(t => t.BandID.Contains(bandNos[2].ToString()));
                if (renderR != null && renderG != null && renderB != null)
                {
                    offsetR = Convert.ToDouble(renderR.RenderMin);
                    offsetG = Convert.ToDouble(renderG.RenderMin);
                    offsetB = Convert.ToDouble(renderB.RenderMin);
                    scaleR  = 250 / (Convert.ToDouble(renderR.RenderMax) - Convert.ToDouble(renderR.RenderMin));
                    scaleG  = 250 / (Convert.ToDouble(renderG.RenderMax) - Convert.ToDouble(renderG.RenderMin));
                    scaleB  = 250 / (Convert.ToDouble(renderB.RenderMax) - Convert.ToDouble(renderB.RenderMin));
                }
            }

            for (int i = 0; i < maxWidth * matchHeight; i++)
            {
                buffer[0][i] = buffer[0][i] > offsetR
                    ? Convert.ToUInt16((buffer[0][i] - offsetR) *scaleR)
                    : (ushort)0;

                buffer[1][i] = buffer[1][i] > offsetG
                    ? Convert.ToUInt16((buffer[1][i] - offsetG) *scaleG)
                    : (ushort)0;

                buffer[2][i] = buffer[2][i] > offsetB
                    ? Convert.ToUInt16((buffer[2][i] - offsetB) *scaleB)
                    : (ushort)0;

                var t = buffer[0][i] + buffer[1][i] + buffer[2][i];
                if (t <= 0 || t >= 255 * 3)
                {
                    buffer[3][i] = 0;
                }
                else
                {
                    buffer[3][i] = 255;
                }
            }

            outDs.GetRasterBand(1).WriteRaster(0, 0, maxWidth, matchHeight, buffer[0], maxWidth, matchHeight, 0, 0);
            outDs.GetRasterBand(2).WriteRaster(0, 0, maxWidth, matchHeight, buffer[1], maxWidth, matchHeight, 0, 0);
            outDs.GetRasterBand(3).WriteRaster(0, 0, maxWidth, matchHeight, buffer[2], maxWidth, matchHeight, 0, 0);
            outDs.GetRasterBand(4).WriteRaster(0, 0, maxWidth, matchHeight, buffer[3], maxWidth, matchHeight, 0, 0);


            Dataset pngDs = Gdal.GetDriverByName("PNG").CreateCopy(outOverviewFile, outDs, 0, null, null, null);

            pngDs.Dispose();

            outDs.Dispose();
            return(outOverviewFile);
        }