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