public static void ReadFile(string file, out Bitmap image) { FileStream fs = new FileStream(file, FileMode.Open); int nRows = 6000; int nCols = 4800; int sampleRate = 5; int spr = nCols / sampleRate; int spc = nRows / sampleRate; image = new Bitmap(spr, spc); HeightBandRange hbr = new HeightBandRange(); hbr.AddBand(-0.1f, Color.Red); hbr.AddBand(0.0f, Color.DarkBlue); hbr.AddBand(0.01f, Color.DarkGreen); hbr.AddBand(0.2f, Color.LightGreen); hbr.AddBand(0.5f, Color.SlateGray); hbr.AddBand(1.0f, Color.White); // read a row at a time byte[] data = new byte[2]; byte[] dataRev = new byte[2]; for (int row = 0; row < spc; row++) { long pos = row * nCols * 2 * sampleRate; fs.Seek(pos, SeekOrigin.Begin); for (int col = 0; col < spr; col++) { int avrValue = 0; for (int i = 0; i < sampleRate; i++) { fs.Read(data, 0, 2); dataRev[0] = data[1]; dataRev[1] = data[0]; int value = BitConverter.ToInt16(dataRev, 0); if (value != -9999) { avrValue += value; } } avrValue /= sampleRate; if (avrValue == 0) { image.SetPixel(col, row, Color.Blue); } else { // encode to greyscale /*byte clr = (byte)((avrValue * 0.05f) + 32); * image.SetPixel(col, row, Color.FromArgb(255, clr, clr, clr));*/ image.SetPixel(col, row, hbr[avrValue / 5000f]); } //fs.Seek((col * 2 * sampleRate) + pos, SeekOrigin.Begin); } } }
public static void ReadFile(string file, out Bitmap image) { FileStream fs = new FileStream(file, FileMode.Open); int nRows = 6000; int nCols = 4800; int sampleRate = 5; int spr = nCols / sampleRate; int spc = nRows / sampleRate; image = new Bitmap(spr, spc); HeightBandRange hbr = new HeightBandRange(); hbr.AddBand(-0.1f, Color.Red); hbr.AddBand(0.0f, Color.DarkBlue); hbr.AddBand(0.01f, Color.DarkGreen); hbr.AddBand(0.2f, Color.LightGreen); hbr.AddBand(0.5f, Color.SlateGray); hbr.AddBand(1.0f, Color.White); // read a row at a time byte[] data = new byte[2]; byte[] dataRev = new byte[2]; for (int row = 0; row < spc; row++) { long pos = row * nCols * 2 * sampleRate; fs.Seek(pos, SeekOrigin.Begin); for (int col = 0; col < spr; col++) { int avrValue = 0; for (int i = 0; i < sampleRate; i++) { fs.Read(data, 0, 2); dataRev[0] = data[1]; dataRev[1] = data[0]; int value = BitConverter.ToInt16(dataRev, 0); if (value != -9999) avrValue += value; } avrValue /= sampleRate; if (avrValue == 0) image.SetPixel(col, row, Color.Blue); else { // encode to greyscale /*byte clr = (byte)((avrValue * 0.05f) + 32); image.SetPixel(col, row, Color.FromArgb(255, clr, clr, clr));*/ image.SetPixel(col, row, hbr[avrValue / 5000f]); } //fs.Seek((col * 2 * sampleRate) + pos, SeekOrigin.Begin); } } }
/// <summary> /// Initializes a new instance of the HeightBandDEMSampler class. /// </summary> /// <param name="heightBand"></param> public HeightBandDEMSampler(HeightBandRange heightBand) { this.heightBand = heightBand; }
public void LoadVisualization(DataProfile dataProfile, DataProfile.SubProfile subProfile, IDataSourceReader dataSrcReader, DataSourceInfo dataSrcInfo) { renderFrame = true; renderingThread.Start(); controlStatus = ControlStatus.Loading; rContext.LoadingLayer.SetProgress(0); rContext.LoadingLayer.SetText("Loading... DEM Geometry"); rContext.LoadingLayer.Visible = true; Render(); // load data from dlg into database database = new RasterDatabase.RasterDatabase(); object filteredData = subProfile.Filter.FilterData(dataSrcReader); if (filteredData is byte[]) { DataLayer dataLayer = new DataLayer("DEM", 8, "byte"); dataLayer.AddArea(new ByteArea(new Rectangle(new Point(), dataSrcReader.Info.Resolution), new RectangleF(0, 0, 1, 1), (byte[])filteredData, dataSrcReader.Info.Resolution)); database.AddLayer(dataLayer); } else if (filteredData is float[]) { DataLayer dataLayer = new DataLayer("DEM", 32, "float"); dataLayer.AddArea(new FloatArea(new Rectangle(new Point(), dataSrcReader.Info.Resolution), new RectangleF(0, 0, 1, 1), (float[])filteredData, dataSrcReader.Info.Resolution)); database.AddLayer(dataLayer); } // load data source(s) DataSourceItem item = new DataSourceItem(dataSrcInfo.BppType, (Bitmap)PreviewRasterizer.DrawRotatedBandPreview(dataSrcInfo.Bands, 64, dataSrcInfo)); heightDataSrcs.Add(item); // load diffuse sources // grey-scale for height GreyScaleDEMSampler srcImgSampler = new GreyScaleDEMSampler(); Bitmap srcImg = srcImgSampler.GenerateBitmap(new Size(64, 64), database.Layers[0].Areas[0]); item = new DataSourceItem("Height", srcImg); item.DEMSampler = srcImgSampler; //(Bitmap)PreviewRasterizer.DrawRotatedBandPreview(new DataSourceInfo.DataBandInfo[] { new DataSourceInfo.DataBandInfo("Source", srcImg) }, //64, null)); diffuseDataSrcs.Add(item); // load colour image if possible as other source (i.e the original if an RGB img) if (dataSrcReader.Info.SupportsRGB()) { item = new DataSourceItem("SourceRGB", SourceDataDiffuseSampler.SampleRGBDiffuseMap((GDALReader)dataSrcReader, new Size(64, 64))); diffuseDataSrcs.Add(item); reader = (GDALReader)dataSrcReader; } // height band range HeightBandRange hbr = new HeightBandRange(); hbr.AddBand(0, Color.DarkGreen); hbr.AddBand(0.25f, Color.Blue); hbr.AddBand(0.4f, Color.DarkGreen); hbr.AddBand(0.5f, Color.Green); hbr.AddBand(0.8f, Color.Gray); hbr.AddBand(1, Color.White); HeightBandDEMSampler hBandSampler = new HeightBandDEMSampler(hbr); item = new DataSourceItem("HeightBands", hBandSampler.GenerateBitmap(new Size(64, 64), database.Layers[0].Areas[0])); item.DEMSampler = hBandSampler; diffuseDataSrcs.Add(item); // load database into visualization dem = new DigitalElevationMap(database.Area.Size, database, rContext.DevIf, (GDALReader)dataSrcReader/*, * hBandSampler.GenerateBitmap(new Size(512, 512), * database.Layers[0].Areas[0])*/ ); rContext.SetDEM(dem); // setup geometry layers geometryLayers.Add(new GeometryVisLayer("Diffuse", item.Thumbnail, true)); geometryLayers.Add(new GeometryVisLayer("Overlay Grid", null, true)); rContext.DevIf.LocalSettings["GeometryVisLayer.Diffuse"] = geometryLayers[0]; rContext.DevIf.LocalSettings["GeometryVisLayer.Overlay"] = geometryLayers[1]; // now load default texture SetDiffuseSource(0); rContext.LoadingLayer.SetProgress(100); Render(); Thread.Sleep(500); rContext.LoadingLayer.Visible = false; controlStatus = ControlStatus.Idle; Render(); }