private void labDSMin_TextChanged(object sender, EventArgs e) { if (labDSMin.Text != "") { OSGeo.GDAL.Gdal.AllRegister(); OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(labDSMin.Text, OSGeo.GDAL.Access.GA_ReadOnly); double[] a = new double[6]; ds.GetGeoTransform(a); double xx = a[0]; double yy = a[3]; double size = a[1]; double xSixe = ds.RasterXSize; double ySixe = ds.RasterYSize; labInFileInfo.Text += labDSMin.Text + ":\r" + "\r\n" + "左上角X坐标:" + xx.ToString() + "\r" + "左上角Y坐标:" + yy.ToString() + "\r" + "像元尺寸:" + size.ToString() + "\r" + "图像大小:" + xSixe.ToString() + "*" + ySixe.ToString(); ds.Dispose(); } else { labInFileInfo.Text = ""; } }
/// <summary> /// 距离倒数权重插值。 /// </summary> /// <param name="ds">要重采样到的数据集。</param> /// <param name="band">要重采样到数据集的波段。</param> /// <param name="x">被插值的像元在数据集中的x坐标。</param> /// <param name="y">被插值的像元在数据集中的y坐标。</param> /// <returns>插值结果</returns> public double IDW(OSGeo.GDAL.Dataset ds, int band, double x, double y) { int Width = ds.RasterXSize; int Height = ds.RasterYSize; if (x < 0 || x > Width - 1 || y < 0 || y > Height - 1) { throw new IndexOutOfRangeException("待计算像元的行列号超出影像边界。期望的参数为:0<=x<=" + (Width - 1).ToString() + ",0<=y<=" + (Height - 1).ToString() + ",输入的参数为:x=" + x.ToString() + ",y=" + y.ToString()); } double tmpDistance = 0.0, sumPiZi = 0.0, sumPi = 0.0; tmpDistance = Distanse(x, y, Math.Ceiling(x), Math.Ceiling(y)); sumPi += 1.0 / tmpDistance; sumPiZi += GetDN(ds, band, (int)Math.Ceiling(x), (int)Math.Ceiling(y)) / tmpDistance; tmpDistance = Distanse(x, y, Math.Ceiling(x), Math.Floor(y)); sumPi += 1.0 / tmpDistance; sumPiZi += GetDN(ds, band, (int)Math.Ceiling(x), (int)Math.Floor(y)) / tmpDistance; tmpDistance = Distanse(x, y, Math.Floor(x), Math.Ceiling(y)); sumPi += 1.0 / tmpDistance; sumPiZi += GetDN(ds, band, (int)Math.Floor(x), (int)Math.Ceiling(y)) / tmpDistance; tmpDistance = Distanse(x, y, Math.Floor(x), Math.Floor(y)); sumPi += 1.0 / tmpDistance; sumPiZi += GetDN(ds, band, (int)Math.Floor(x), (int)Math.Floor(y)) / tmpDistance; return(sumPiZi / sumPi); }
/// <summary> /// 获取Feature的最大值和最小值 范围不准 /// </summary> /// <param name="dsmDs"></param> /// <param name="oriFeat"></param> /// <param name="bufFeat"></param> /// <param name="subRasterOff_Size"></param> private static void getMaxMinValue(OSGeo.GDAL.Dataset dsmDs, OSGeo.OGR.Feature oriFeat, OSGeo.OGR.Feature bufFeat, int[] subRasterOff_Size) { //拿到当前Feature对应的栅格值(数组) double[] rastValue = new double[subRasterOff_Size[2] * subRasterOff_Size[3]]; //把SUBimg的值读进数组 lock (dsmDs) { dsmDs.GetRasterBand(1).ReadRaster( subRasterOff_Size[0], subRasterOff_Size[1], subRasterOff_Size[2], subRasterOff_Size[3], rastValue, subRasterOff_Size[2], subRasterOff_Size[3], 0, 0); } double max = rastValue.Max(); double min = rastValue.Min(); double cay = max - min; oriFeat.SetField("TEMP", max - min); oriFeat.SetField("MIN", 0); oriFeat.SetField("MAX", min); oriFeat.SetField("HIGHT", max); }
/// <summary> /// 创建slopeMap,设置无效值 /// </summary> /// <param name="DemPath"></param> /// <param name="OutSlpPath"></param> static void CreateSlopeMap() { double dsm_NoDataValue; int dsm_HasNoDataValue; OSGeo.GDAL.Band dsmBand = dsmDataset.GetRasterBand(1); dsmBand.GetNoDataValue(out dsm_NoDataValue, out dsm_HasNoDataValue); //调用GDal创建slope影像 if (File.Exists(slopePath)) { gdalDriver.Delete(slopePath); } slopeDataSet = gdalDriver.Create(slopePath, dsm_Xsize, dsm_Ysize, 1, OSGeo.GDAL.DataType.GDT_Float32, null); slopeDataSet.SetProjection(dsmDataset.GetProjection()); slopeDataSet.SetGeoTransform(dsm_Transform); OSGeo.GDAL.Band slopeBand = slopeDataSet.GetRasterBand(1); //设置无效值 if (dsm_HasNoDataValue == 0) //dsm没有无效值 { //把DSM和SLOPE全设置成用户指定的值 dsmBand.SetNoDataValue(imgNodata); slopeBand.SetNoDataValue(imgNodata); } else //DSM有无效值时 { //把SLOPE和全局变量设置成DSM的无效值 imgNodata = dsm_NoDataValue; slopeBand.SetNoDataValue(dsm_NoDataValue); } // BufferOnePixel(slopeBand); }
/// <summary> /// Initialise ImageStore with a GDAL dataset /// </summary> /// <param name="dataset">Dataset in EPSG:4326</param> public GDALImageStore( string dataSetName, string sourcefilename, OSGeo.GDAL.Dataset dataset, string format) { //TODO: Allow serialization and deserialization of this class for persistency m_dataSetName = dataSetName; m_dataset = dataset; m_sourcefilename = sourcefilename; dataset.GetGeoTransform(m_transform); m_lines = dataset.RasterYSize; m_pixels = dataset.RasterXSize; m_imageFileExtension = "png"; m_bands = dataset.RasterCount; if (format.Equals("jpg")) { m_imageFileExtension = "jpg"; //m_tileformat = ImageFileFormat.Jpg; } else if (format.Equals("bmp")) { m_imageFileExtension = "bmp"; //m_tileformat = ImageFileFormat.Bmp; } else if (format.Equals("dds")) { m_imageFileExtension = "dds"; //m_tileformat = ImageFileFormat.Dds; } }
/// <summary> /// 是否被释放 /// </summary> /// <param name="myDS"></param> /// <returns></returns> public static bool IsDispose(this OSGeo.GDAL.Dataset myDS) { try { int e = myDS.RasterCount; return(false); } catch { return(true); } }
public void Dispose() { GC.SuppressFinalize(this); if (_gDS != null) { _gDS.Dispose(); _gDS = null; } }
/// <summary> /// Gdal to DotSpatial at Raster Level /// </summary> /// <param name="dataset">Gdal Dataset</param> /// <param name="bandIndex">Index of Band</param> /// <returns>Dotspatial Raster</returns> public static DotSpatial.Data.IRaster Gdal2DSRaster(OSGeo.GDAL.Dataset dataset, int bandIndex) { DotSpatial.Data.IRaster result = null; OSGeo.GDAL.Band band = dataset.GetRasterBand(bandIndex); if (dataset != null) { switch (band.DataType) { case OSGeo.GDAL.DataType.GDT_Byte: result = new GdalRaster <byte>(dataset, band); break; case OSGeo.GDAL.DataType.GDT_CFloat32: case OSGeo.GDAL.DataType.GDT_CFloat64: case OSGeo.GDAL.DataType.GDT_CInt16: case OSGeo.GDAL.DataType.GDT_CInt32: break; case OSGeo.GDAL.DataType.GDT_Float32: result = new GdalRaster <float>(dataset, band); break; case OSGeo.GDAL.DataType.GDT_Float64: result = new GdalRaster <double>(dataset, band); break; case OSGeo.GDAL.DataType.GDT_Int16: result = new GdalRaster <short>(dataset, band); break; case OSGeo.GDAL.DataType.GDT_UInt16: case OSGeo.GDAL.DataType.GDT_Int32: result = new GdalRaster <int>(dataset, band); break; case OSGeo.GDAL.DataType.GDT_TypeCount: break; case OSGeo.GDAL.DataType.GDT_UInt32: result = new GdalRaster <long>(dataset, band); break; case OSGeo.GDAL.DataType.GDT_Unknown: break; default: break; } } if (result != null) { (result as DotSpatial.Data.Raster).Open(); } return(result); }
/************************************ 生成等值线 **********************************************/ public static string dzx(string filePath) { Console.WriteLine("开始创建等值线!"); OSGeo.OGR.Ogr.RegisterAll(); OSGeo.GDAL.Gdal.AllRegister(); //无效值 double noDataValue; //0不使用无效值,1使用无效值 int hasDataValue; //读入数据源 OSGeo.GDAL.Dataset inData = OSGeo.GDAL.Gdal.Open(filePath, OSGeo.GDAL.Access.GA_ReadOnly); //分析数据源 inData.GetRasterBand(1).GetNoDataValue(out noDataValue, out hasDataValue); double min, max, mean, std; inData.GetRasterBand(1).GetStatistics(0, 1, out min, out max, out mean, out std); int jianG = 2; int count = Convert.ToInt32((max - min) / jianG + 0.5); double[] shu = new double[count]; for (int i = 0; i < count; i++) { shu[i] = min + jianG * i; } //创建空的SHP OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); string a = StaticTools.tempFilePath("shp", "原始等值线"); OSGeo.OGR.DataSource ds = dr.CreateDataSource(a, null); OSGeo.OGR.Layer dzxLayer = ds.CreateLayer("", null, OSGeo.OGR.wkbGeometryType.wkbMultiLineString, null); OSGeo.OGR.FieldDefn fieldDf0 = new OSGeo.OGR.FieldDefn("LID", OSGeo.OGR.FieldType.OFTInteger); OSGeo.OGR.FieldDefn fieldDf1 = new OSGeo.OGR.FieldDefn("EVE", OSGeo.OGR.FieldType.OFTReal); dzxLayer.CreateField(fieldDf0, 1); //ID dzxLayer.CreateField(fieldDf1, 1); //Value //Band(1), 间隔, 起始高度, 分段数量, 分段值数组, 是否有无效值, 无效值, 预置图层. ID字段, 高度值字段, null , null OSGeo.GDAL.Gdal.ContourGenerate(inData.GetRasterBand(1), jianG, min, count, shu, hasDataValue, noDataValue, dzxLayer, 0, 1, null, null); if (dzxLayer.GetFeatureCount(0) > 0) { Console.WriteLine("等值线创建完成!"); } else { Console.WriteLine("等值线创建失败!"); } ds.Dispose(); inData.Dispose(); return(a); }
/// <summary> /// 和GetData功能相同,但是使用GDAL直接从文件中读取数据。 /// </summary> /// <param name="fileName">文件名字</param> /// <param name="width">ref用于返回数据的宽度</param> /// <param name="height">ref用于返回数据的高度</param> /// <returns>一维数据数组,按行优先</returns> private double[] GdalGetData(string fileName, ref int width, ref int height) { OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(fileName, OSGeo.GDAL.Access.GA_ReadOnly); width = dataset.RasterXSize; height = dataset.RasterYSize; double[] imageBuffer = new double[width * height]; OSGeo.GDAL.Band b = dataset.GetRasterBand(1); b.ReadRaster(0, 0, width, height, imageBuffer, width, height, 0, 0); return(imageBuffer); }
/// <summary> /// Constructor /// </summary> /// <param name="gdalDataSet">The gdal data set</param> public GeoTransform(OSGeo.GDAL.Dataset gdalDataSet) { if (gdalDataSet == null) { throw new ArgumentException("GeoTransform constructor invoked with null dataset.", nameof(gdalDataSet)); } gdalDataSet.GetGeoTransform(_transform); ComputeInverse(); }
//返回值是函数的系数 //例如:y=a0+a1*x 返回值则为a0 a1 //例如:y=a0+a1*x+a2*x*x 返回值则为a0 a1 a2 #endregion /*************************************************************************************************/ /************************************ 生成等值线 **********************************************/ public static string dzxPath(string filePath) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.GDAL.Gdal.AllRegister(); //无效值 double noDataValue; //0不使用无效值,1使用无效值 int hasDataValue; //读入数据源 OSGeo.GDAL.Dataset inData = OSGeo.GDAL.Gdal.Open(filePath, OSGeo.GDAL.Access.GA_ReadOnly); //分析数据源 inData.GetRasterBand(1).GetNoDataValue(out noDataValue, out hasDataValue); double min, max, mean, std; inData.GetRasterBand(1).GetStatistics(0, 1, out min, out max, out mean, out std); int jianG = 2; int count = Convert.ToInt32((max - min) / jianG + 0.5); double[] shu = new double[count]; for (int i = 0; i < count; i++) { shu[i] = min + jianG * i; } //创建空的SHP string dzSavePath = filePath.Substring(0, filePath.LastIndexOf(".")) + "_dzx.shp"; OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); if (System.IO.File.Exists(dzSavePath)) { System.IO.File.Delete(dzSavePath); } OSGeo.OGR.DataSource ds = dr.CreateDataSource(dzSavePath, null); OSGeo.OGR.Layer dzxLayer = ds.CreateLayer("等值线", null, OSGeo.OGR.wkbGeometryType.wkbMultiLineString, null); OSGeo.OGR.FieldDefn fieldDf0 = new OSGeo.OGR.FieldDefn("LID", OSGeo.OGR.FieldType.OFTInteger); OSGeo.OGR.FieldDefn fieldDf1 = new OSGeo.OGR.FieldDefn("EVE", OSGeo.OGR.FieldType.OFTReal); dzxLayer.CreateField(fieldDf0, 1); //ID dzxLayer.CreateField(fieldDf1, 1); //Value //Band(1), 间隔, 起始高度, 分段数量, 分段值数组, 是否有无效值, 无效值, 预置图层. ID字段, 高度值字段, null , null OSGeo.GDAL.Gdal.ContourGenerate(inData.GetRasterBand(1), jianG, min, count, shu, hasDataValue, noDataValue, dzxLayer, 0, 1, null, null); dzxLayer.Dispose(); ds.Dispose(); return(dzSavePath); }
public static bool FT(OSGeo.GDAL.Dataset InputDS, OSGeo.GDAL.DataType OutDataType, string OutPath) { try { if (InputDS == null) { throw new ArgumentNullException("输入数据集为空。"); } if (String.IsNullOrWhiteSpace(OutPath.Trim())) { throw new ArgumentNullException("输出路径为空或非法。"); } OSGeo.GDAL.Driver Dri = OSGeo.GDAL.Gdal.GetDriverByName("Gtiff"); if (Dri == null) { throw new Exception("无法获取GDAL Driver。"); } int xSize = InputDS.RasterXSize; int ySize = InputDS.RasterYSize; OSGeo.GDAL.Dataset DS = Dri.Create(OutPath, xSize, ySize, InputDS.RasterCount, OutDataType, null); Tools.Common.CopyMetadata(InputDS, DS); //Matrix<Complex32> M = new Matrix<Complex32>; //for (int i = 0; i < InputDS.RasterCount; i++) //{ for (int Row = 0; Row < ySize; Row++) { float[] Values = new float[xSize]; Complex32[] c = new Complex32[xSize]; //读取DN到数组 InputDS.GetRasterBand(1).ReadRaster(0, Row, xSize, 1, Values, xSize, 1, 0, 0); for (int Col = 0; Col < xSize; Col++) { c[Col] = new Complex32(Values[Col], 0); } //M.Add(c); //写结果到新栅格 //DS.GetRasterBand(1).WriteRaster(0, Row, xSize, 1, Values, xSize, 1, 0, 0); DS.FlushCache(); Thread.Sleep(1); } //} Dri.Dispose(); DS.Dispose(); return(true); } catch (Exception err) { MessageBox.Show(err.ToString()); return(false); } }
/// <summary> /// Constructor /// </summary> /// <param name="gdalDataset">The gdal dataset</param> public GeoTransform(OSGeo.GDAL.Dataset gdalDataset) { if (gdalDataset == null) { throw new ArgumentException("GeoTransform constructor invoked with null dataset.", "gdalDataset"); } var array = new double[6]; gdalDataset.GetGeoTransform(array); _transform = array; ComputeInverse(); }
/// <summary> /// 模拟结束事件监听辅助函数 /// </summary> protected void SimulateEndHelper(BaseCa ca) { // 将模拟结果添加到系统中 double[] buffer = ca.BeginBuffer; int width = ca.Width; int height = ca.Height; //var map = GIS.FrameWork.Application.App.Map; // 保存输出结果 var path = Application.StartupPath + @"\log"; if (!Directory.Exists(path)) //如果不存在就创建file文件夹 { Directory.CreateDirectory(path); //创建该文件夹 } var outputPath = path + @"\" + (dateNow.ToString("MMddyyhhmmss")) + (this.uuid++) + ".tif"; OSGeo.GDAL.Driver driverSave = OSGeo.GDAL.Gdal.GetDriverByName("GTiff"); OSGeo.GDAL.Dataset datasetSave = driverSave.Create(outputPath, width, height, 1, OSGeo.GDAL.DataType.GDT_Byte, null); datasetSave.WriteRaster(0, 0, width, height, buffer, width, height, 1, new int[1] { 1 }, 0, 0, 0); datasetSave.SetProjection(ca.projStr); datasetSave.SetGeoTransform(ca.geoTransform); datasetSave.GetRasterBand(1).SetNoDataValue(ca.noDataVal); datasetSave.FlushCache(); datasetSave.Dispose(); driverSave.Dispose(); //// 翻转图像 ? //buffer = InvertImage(buffer, width, height); MessageBox.Show("模拟结束, 输出文件:" + outputPath); //// 新建 GDAL dataset //OSGeo.GDAL.Driver driver = OSGeo.GDAL.Gdal.GetDriverByName("MEM"); //OSGeo.GDAL.Dataset dataset = driver.Create("", width, height, 1, OSGeo.GDAL.DataType.GDT_Float64, null); //dataset.WriteRaster(0, 0, width, height, buffer, width, height, 1, new int[1] { 1 }, 0, 0, 0); //// 将GDAL dataset转化为IRaster数据集 //DotSpatial.Data.IRaster raster = GIS.GDAL.RasterConverter.Gdal2DSRaster(dataset, 1); //raster.Name = "Result"; //map.Layers.Add(raster); }
public override void Run() { OpenFileDialog openTiffDialog = new OpenFileDialog(); if (openTiffDialog.ShowDialog() == DialogResult.OK) { var tiffName = openTiffDialog.FileName; OSGeo.GDAL.Dataset tiffDataset = OSGeo.GDAL.Gdal.Open(tiffName, OSGeo.GDAL.Access.GA_ReadOnly); OSGeo.GDAL.Band band = tiffDataset.GetRasterBand(1); DotSpatial.Data.IRaster raster = GIS.GDAL.RasterConverter.Gdal2DSRaster(tiffDataset, 1); FileInfo fileInfo = new FileInfo(tiffName); raster.Name = fileInfo.Name; GIS.FrameWork.Application.App.Map.Layers.Add(raster); } }
public void LoadAffineTransform(string filename) { using (OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(filename, OSGeo.GDAL.Access.GA_ReadOnly)) { AffineTransform = new double[6]; dataset.GetGeoTransform(AffineTransform); string targetProjection = "GEOGCS[\"Moon 2000\", DATUM[\"D_Moon_2000\", SPHEROID[\"Moon_2000_IAU_IAG\",1737400.0,0.0]], PRIMEM[\"Greenwich\",0], UNIT[\"Decimal_Degree\",0.0174532925199433]]"; var src = new OSGeo.OSR.SpatialReference(dataset.GetProjectionRef()); var dst = new OSGeo.OSR.SpatialReference(targetProjection); pixelToLatLon = new OSGeo.OSR.CoordinateTransformation(src, dst); latLonToPixel = new OSGeo.OSR.CoordinateTransformation(dst, src); } }
public MemoryMappedInt16Terrain(string referenceImage) { Open(TerrainImageFile); using (OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(referenceImage, OSGeo.GDAL.Access.GA_ReadOnly)) { _affineTransform = new double[6]; dataset.GetGeoTransform(_affineTransform); string projection = dataset.GetProjectionRef(); var src = new OSGeo.OSR.SpatialReference(projection); var dst = new OSGeo.OSR.SpatialReference(PolarStereographic); _pixelToLineSample = new OSGeo.OSR.CoordinateTransformation(src, dst); } }
private IRasterSet GetRasterSet(string fileName, OSGeo.GDAL.Dataset dataset) { IRasterSet rasterSet = null; if (dataset != null && dataset.RasterCount > 0) { using var band = dataset.GetRasterBand(1); if (band == null) { return(null); } switch (band.DataType) { case OSGeo.GDAL.DataType.GDT_Byte: rasterSet = new GdalRasterSet <byte>(fileName, dataset); break; case OSGeo.GDAL.DataType.GDT_Int16: rasterSet = new GdalRasterSet <short>(fileName, dataset); break; case OSGeo.GDAL.DataType.GDT_UInt16: rasterSet = new GdalRasterSet <ushort>(fileName, dataset); break; case OSGeo.GDAL.DataType.GDT_Int32: rasterSet = new GdalRasterSet <int>(fileName, dataset); break; case OSGeo.GDAL.DataType.GDT_UInt32: rasterSet = new GdalRasterSet <uint>(fileName, dataset); break; case OSGeo.GDAL.DataType.GDT_CFloat32: rasterSet = new GdalRasterSet <float>(fileName, dataset); break; case OSGeo.GDAL.DataType.GDT_CFloat64: rasterSet = new GdalRasterSet <double>(fileName, dataset); break; default: throw new NotImplementedException(); } } return(rasterSet); }
IRasterSet IRasterDriver.Open(string fileName, bool update) { OSGeo.GDAL.Dataset dataset = null; var access = update ? OSGeo.GDAL.Access.GA_Update : OSGeo.GDAL.Access.GA_ReadOnly; try { dataset = OSGeo.GDAL.Gdal.Open(fileName, access); } catch (Exception e) { Debug.WriteLine($"打开“{fileName}”失败,错误信息:{e}"); } IRasterSet rasterSet = GetRasterSet(fileName, dataset); return(rasterSet); }
protected override void SolveInstance(IGH_DataAccess DA) { string output = ""; try { GdalConfiguration.ConfigureOgr(); GdalConfiguration.ConfigureGdal(); output = "It works!"; } catch (Exception e) { output = "{0} Exception caught. " + e; } string input = ""; DA.GetData(0, ref input); string file = input; int pickBand = 1; DA.GetData(1, ref pickBand); OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(file, OSGeo.GDAL.Access.GA_ReadOnly); var band = ds.GetRasterBand(pickBand); var bandXSize = band.XSize; var bandYSize = band.YSize; var data = new float[bandXSize * bandYSize]; band.ReadRaster(0, 0, bandXSize, bandYSize, data, bandXSize, bandYSize, 0, 0); ds.GetMetadata(output); ds = null; DA.SetData(0, output); DA.SetDataList(1, data); }
private void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (_GdalDataset != null) { try { _GdalDataset.Dispose(); } finally { _GdalDataset = null; } } } disposed = true; } }
private void openFileDSM_FileOk(object sender, CancelEventArgs e) { labDSMin.Text = openFileDSM.FileName; OSGeo.GDAL.Gdal.AllRegister(); OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(openFileDSM.FileName, OSGeo.GDAL.Access.GA_ReadOnly); double[] a = new double[6]; ds.GetGeoTransform(a); double xx = a[0]; double yy = a[3]; double size = a[1]; double xSixe = ds.RasterXSize; double ySixe = ds.RasterYSize; labInFileInfo.Text += openFileDSM.SafeFileName + ":\r" + "\r\n" + "左上角X坐标:" + xx.ToString() + "\r" + "左上角Y坐标:" + yy.ToString() + "\r" + "像元尺寸:" + size.ToString() + "\r" + "图像大小:" + xSixe.ToString() + "*" + ySixe.ToString(); ds.Dispose(); }
/// <summary> /// initialize a Gdal based raster layer /// </summary> /// <param name="strLayerName">Name of layer</param> /// <param name="imageFilename">location of image</param> public GdalRasterLayer(string strLayerName, string imageFilename) { this.LayerName = strLayerName; this.Filename = imageFilename; disposed = false; OSGeo.GDAL.Gdal.AllRegister(); try { _GdalDataset = OSGeo.GDAL.Gdal.Open(_Filename, OSGeo.GDAL.Access.GA_ReadOnly); imagesize = new Size(_GdalDataset.RasterXSize, _GdalDataset.RasterYSize); _Envelope = this.GetExtent(); } catch (Exception ex) { _GdalDataset = null; throw new Exception("Couldn't load dataset. " + ex.Message + ex.InnerException); } }
protected override void SolveInstance(IGH_DataAccess DA) { GdalConfiguration.ConfigureOgr(); GdalConfiguration.ConfigureGdal(); string input = ""; DA.GetData(0, ref input); string file = @"C:\Users\Paula\Desktop\Felipe\New\multi_1.20181031.grb2"; OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(file, OSGeo.GDAL.Access.GA_ReadOnly); //string output = ds.GetProjectionRef(); string output = file; DA.SetData(0, output); }
private List <double[]> readImageCoordinatesBoundsInLonLat(OSGeo.GDAL.Dataset imageDataset) { var band = imageDataset.GetRasterBand(1); if (band == null) { return(null); } var width = band.XSize; var height = band.YSize; double[] geoTransformerData = new double[6]; imageDataset.GetGeoTransform(geoTransformerData); SpatialReference currentReference = new SpatialReference(imageDataset.GetProjectionRef()); SpatialReference newReference = GdalUtilities.getWgs84Reference(); CoordinateTransformation ct = new CoordinateTransformation(currentReference, newReference); double[] northWestPoint = new double[2] { geoTransformerData[0], geoTransformerData[3] }; ct.TransformPoint(northWestPoint); double[] southEastPoint = new double[2] { geoTransformerData[0] + geoTransformerData[1] * width, geoTransformerData[3] + geoTransformerData[5] * height }; ct.TransformPoint(southEastPoint); return(new List <double[]> { northWestPoint, southEastPoint }); }
//𝐿_𝑇=𝑎+𝑏*cos(𝑖) //𝐿_𝐻=𝐿_𝑇+(cos(𝜃𝑠)+𝑎/𝑏)/(cos(𝑖)+𝑎/𝑏) //cos𝑖=cos(𝜃𝑠)*cos𝑆+sin(𝜃𝑠) cos(𝜑𝑠−𝐴) public static OSGeo.GDAL.Dataset CCorrectionn(OSGeo.GDAL.Dataset InputDS, OSGeo.GDAL.DataType OutputDataType, string OutPath) { return(null); }
public RasterClass(IRasterDataset dataset, string filename, IPolygon polygon) { try { FileInfo fi = new FileInfo(filename); _title = fi.Name; _filename = filename; _dataset = dataset; OSGeo.GDAL.Gdal.AllRegister(); _gDS = OSGeo.GDAL.Gdal.Open(fi.FullName, 0); if (_gDS == null && _gDS.RasterCount == 0) { _valid = false; return; } _iWidth = _gDS.RasterXSize; _iHeight = _gDS.RasterYSize; switch (fi.Extension.ToLower()) { case ".adf": case ".gsd": _type = RasterType.grid; break; //case ".jp2": // _type = RasterType.wavelet; // break; } using (OSGeo.GDAL.Band band = _gDS.GetRasterBand(1)) { if (_gDS.RasterCount == 1) { if (band.DataType != OSGeo.GDAL.DataType.GDT_Byte) { _type = RasterType.grid; } } band.GetMinimum(out _min, out _hasNoDataVal); band.GetMaximum(out _max, out _hasNoDataVal); band.GetNoDataValue(out _nodata, out _hasNoDataVal); } OSGeo.GDAL.Driver driver = _gDS.GetDriver(); double[] tfw = new double[6]; _gDS.GetGeoTransform(tfw); string tfwFilename = fi.FullName.Substring(0, fi.FullName.Length - fi.Extension.Length); switch (fi.Extension.ToLower()) { case ".jpg": case ".jpeg": tfwFilename += ".jgw"; break; case ".jp2": tfwFilename += ".j2w"; break; case ".tif": case ".tiff": tfwFilename += ".tfw"; break; case ".ecw": tfwFilename += ".eww"; break; default: break; } FileInfo tfwInfo = new FileInfo(tfwFilename); _tfw = new TFWFile(tfw[0], tfw[3], tfw[1], tfw[2], tfw[4], tfw[5]); if (tfwInfo.Exists) { _tfw.Filename = tfwFilename; } if (_tfw.X == 0.0 && _tfw.Y == 0.0 && Math.Abs(_tfw.dx_X) == 1.0 && _tfw.dx_Y == 0.0 && Math.Abs(_tfw.dy_Y) == 1.0 && _tfw.dy_X == 0.0 && driver != null) { if (tfwInfo.Exists) { _tfw = new TFWFile(tfwFilename); } else { _tfw.isValid = false; } } else { // Bei dem Driver schein es nicht Pixelmitte sein, oder ist das bei GDAL generell //if (driver.ShortName.ToLower() == "jp2openjpeg") { _tfw.X += (_tfw.dx_X / 2.0D + _tfw.dx_Y / 2.0D); _tfw.Y += (_tfw.dy_X / 2.0D + _tfw.dy_Y / 2.0D); } } FileInfo fiPrj = new FileInfo(fi.FullName.Substring(0, fi.FullName.Length - fi.Extension.Length) + ".prj"); if (fiPrj.Exists) { StreamReader sr = new StreamReader(fiPrj.FullName); string wkt = sr.ReadToEnd(); sr.Close(); _sRef = gView.Framework.Geometry.SpatialReference.FromWKT(wkt); } else { fiPrj = new FileInfo(fi.FullName.Substring(0, fi.FullName.Length - fi.Extension.Length) + ".wkt"); if (fiPrj.Exists) { StreamReader sr = new StreamReader(fiPrj.FullName); string wkt = sr.ReadToEnd(); sr.Close(); _sRef = gView.Framework.Geometry.SpatialReference.FromWKT(wkt); } } if (polygon != null) { _polygon = polygon; } else { calcPolygon(); } } catch (Exception ex) { string errMsg = ex.Message; _valid = false; } }
/// <summary> /// 辐射定标。 /// </summary> /// <param name="InputDS">输入的栅格数据集。</param> /// <param name="OutDataType">输出的数据类型。</param> /// <param name="Gain">增益倍数。</param> /// <param name="Offset">偏移量。</param> /// <param name="OutPath">输出栅格数据集的位置。</param> /// <returns>返回操作成功或失败。</returns> public static bool ApplyGainAndOffset(OSGeo.GDAL.Dataset InputDS, OSGeo.GDAL.DataType OutDataType, List <double> Gain, List <double> Offset, string OutPath) { try { if (InputDS == null) { throw new ArgumentNullException("输入数据集为空。"); } if (String.IsNullOrWhiteSpace(OutPath.Trim())) { throw new ArgumentNullException("输出路径为空或非法。"); } if ((Gain.Count != InputDS.RasterCount) || (Offset.Count != InputDS.RasterCount)) { throw new IndexOutOfRangeException("增益数据或偏移数据与输入数据集波段数不符。"); } OSGeo.GDAL.Driver Dri = OSGeo.GDAL.Gdal.GetDriverByName("Gtiff"); if (Dri == null) { throw new Exception("无法获取GDAL Driver。"); } FrmProgress FP = new FrmProgress() { Text = "正在进行辐射定标...", }; Thread t = new Thread(() => { FP.ShowDialog(); }); t.SetApartmentState(ApartmentState.STA); t.Start(); int xSize = InputDS.RasterXSize; int ySize = InputDS.RasterYSize; OSGeo.GDAL.Dataset DS = Dri.Create(OutPath, xSize, ySize, InputDS.RasterCount, OutDataType, null); FP.Output("已创建输出数据集\"" + OutPath + "\",数据类型为" + OutDataType.ToString() + "。"); Tools.Common.CopyMetadata(InputDS, DS); for (int i = 0; i < InputDS.RasterCount; i++) //遍历每个波段 { FP.SetProgress2("正在处理波段:", i + 1, InputDS.RasterCount, ""); for (int Row = 0; Row < ySize; Row++) //遍历每一行(y) { FP.SetProgress1("正在处理:", Row + 1, ySize, "行"); double[] Values = new double[xSize]; //读取DN到数组 InputDS.GetRasterBand(i + 1).ReadRaster(0, Row, xSize, 1, Values, xSize, 1, 0, 0); for (int Col = 0; Col < xSize; Col++) //对每一个值进行计算 { Values[Col] = GainOffset(Values[Col], Gain[i], Offset[i]); } //写结果到新栅格 DS.GetRasterBand(i + 1).WriteRaster(0, Row, xSize, 1, Values, xSize, 1, 0, 0); DS.FlushCache(); Thread.Sleep(1); if (FP.Canceled) { Thread.Sleep(500); FP.Finish(); throw new OperationCanceledException("操作被用户取消。"); } } } FP.Finish(); Dri.Dispose(); DS.Dispose(); return(true); } catch (Exception err) { MessageBox.Show(err.ToString()); return(false); } }
private void GetPreview(OSGeo.GDAL.Dataset dataset, System.Drawing.Size size, Graphics g, SharpMap.Geometries.BoundingBox bbox) { double[] geoTrans = new double[6]; dataset.GetGeoTransform(geoTrans); GeoTransform GT = new GeoTransform(geoTrans); int DsWidth = dataset.RasterXSize; int DsHeight = dataset.RasterYSize; Bitmap bitmap = new Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb); int iPixelSize = 3; //Format24bppRgb = byte[b,g,r] if (dataset != null) { /* * if ((float)size.Width / (float)size.Height > (float)DsWidth / (float)DsHeight) * size.Width = size.Height * DsWidth / DsHeight; * else * size.Height = size.Width * DsHeight / DsWidth; */ double left = Math.Max(bbox.Left, _Envelope.Left); double top = Math.Min(bbox.Top, _Envelope.Top); double right = Math.Min(bbox.Right, _Envelope.Right); double bottom = Math.Max(bbox.Bottom, _Envelope.Bottom); int x1 = (int)GT.PixelX(left); int y1 = (int)GT.PixelY(top); int x1width = (int)GT.PixelXwidth(right - left); int y1height = (int)GT.PixelYwidth(bottom - top); bitmap = new Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb); BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, size.Width, size.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); try { unsafe { for (int i = 1; i <= (dataset.RasterCount > 3 ? 3 : dataset.RasterCount); ++i) { byte[] buffer = new byte[size.Width * size.Height]; OSGeo.GDAL.Band band = dataset.GetRasterBand(i); //band.ReadRaster(x1, y1, x1width, y1height, buffer, size.Width, size.Height, (int)GT.HorizontalPixelResolution, (int)GT.VerticalPixelResolution); band.ReadRaster(x1, y1, x1width, y1height, buffer, size.Width, size.Height, 0, 0); int p_indx = 0; int ch = 0; //#warning Check correspondance between enum and integer values if (band.GetRasterColorInterpretation() == OSGeo.GDAL.ColorInterp.GCI_BlueBand) { ch = 0; } if (band.GetRasterColorInterpretation() == OSGeo.GDAL.ColorInterp.GCI_GreenBand) { ch = 1; } if (band.GetRasterColorInterpretation() == OSGeo.GDAL.ColorInterp.GCI_RedBand) { ch = 2; } if (band.GetRasterColorInterpretation() != OSGeo.GDAL.ColorInterp.GCI_PaletteIndex) { for (int y = 0; y < size.Height; y++) { byte *row = (byte *)bitmapData.Scan0 + (y * bitmapData.Stride); for (int x = 0; x < size.Width; x++, p_indx++) { row[x * iPixelSize + ch] = buffer[p_indx]; } } } else //8bit Grayscale { for (int y = 0; y < size.Height; y++) { byte *row = (byte *)bitmapData.Scan0 + (y * bitmapData.Stride); for (int x = 0; x < size.Width; x++, p_indx++) { row[x * iPixelSize] = buffer[p_indx]; row[x * iPixelSize + 1] = buffer[p_indx]; row[x * iPixelSize + 2] = buffer[p_indx]; } } } } } } finally { bitmap.UnlockBits(bitmapData); } } g.DrawImage(bitmap, new System.Drawing.Point(0, 0)); }
private void Dispose(bool disposing) { if (!disposed) { if (disposing) if (_GdalDataset != null) { try { _GdalDataset.Dispose(); } finally { _GdalDataset = null; } } disposed = true; } }