From 0a70f99e51b0ea0c83288213e3b1f7904d78ede0 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期四, 18 七月 2024 17:52:46 +0800 Subject: [PATCH] 创建PNG --- SimuTools/Tools/GdalHelper.cs | 147 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 144 insertions(+), 3 deletions(-) diff --git a/SimuTools/Tools/GdalHelper.cs b/SimuTools/Tools/GdalHelper.cs index 96a3f4c..0a6e6ba 100644 --- a/SimuTools/Tools/GdalHelper.cs +++ b/SimuTools/Tools/GdalHelper.cs @@ -4,9 +4,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace SimuTools.Tools { @@ -21,6 +18,8 @@ public static SpatialReference sr4326 { set; get; } public static SpatialReference sr4490 { set; get; } + + public static readonly String CGCS2000 = "CGCS2000"; /// <summary> /// 鏋勯�犲嚱鏁� @@ -80,5 +79,147 @@ Ogr.RegisterAll(); Gdal.AllRegister(); } + + /// <summary> + /// 鑾峰彇Dataset鐨勬渶灏忕偣 + /// </summary> + public static Geometry GetMinPoint(Dataset ds) + { + double[] transform = new double[6]; + ds.GetGeoTransform(transform); + + double xMin = transform[0]; + double yMin = transform[3] - ds.RasterYSize * transform[1]; + + Geometry point = new Geometry(wkbGeometryType.wkbPoint); + point.AddPoint(xMin, yMin, 0); + + return Transform(ds, point); + } + + /// <summary> + /// 鑾峰彇Dataset鐨勬渶澶х偣 + /// </summary> + public static Geometry GetMaxPoint(Dataset ds) + { + /* + * transform[0] 宸︿笂瑙抶鍧愭爣 + * transform[1] 涓滆タ鏂瑰悜鍒嗚鲸鐜� + * transform[2] 鏃嬭浆瑙掑害, 0琛ㄧず鍥惧儚 "鍖楁柟鏈濅笂" + * + * transform[3] 宸︿笂瑙抷鍧愭爣 + * transform[4] 鏃嬭浆瑙掑害, 0琛ㄧず鍥惧儚 "鍖楁柟鏈濅笂" + * transform[5] 鍗楀寳鏂瑰悜鍒嗚鲸鐜� + */ + double[] transform = new double[6]; + ds.GetGeoTransform(transform); + + double xMax = transform[0] + (ds.RasterYSize * transform[1]); + double yMax = transform[3]; + + Geometry point = new Geometry(wkbGeometryType.wkbPoint); + point.AddPoint(xMax, yMax, 0); + + return Transform(ds, point); + } + + /// <summary> + /// 鍧愭爣杞崲 + /// </summary> + public static Geometry Transform(Dataset ds, Geometry point) + { + point.AssignSpatialReference(ds.GetSpatialRef()); + if (ds.GetSpatialRef().IsGeographic() > 0) + { + return point; + } + + String srsName = ds.GetSpatialRef().GetName(); + if (srsName.Contains(CGCS2000)) + { + point.TransformTo(sr4490); + } + else + { + point.TransformTo(sr4326); + } + point.SwapXY(); + + return point; + } + + /// <summary> + /// 鍒涘缓閲戝瓧濉� + /// </summary> + public static void CreatePyramid(String file) + { + Dataset ds = null; + try + { + if (!File.Exists(file)) return; + + ds = Gdal.Open(file, Access.GA_ReadOnly); + if (null == ds) return; + + OSGeo.GDAL.Band band = ds.GetRasterBand(1); + if (0 == band.GetOverviewCount()) + { + ds.BuildOverviews("nearest", new int[] { 2, 4, 6, 8, 16 }); + } + } + catch (Exception ex) + { + LogOut.Error(ex.Message); + } + finally + { + if (null != ds) ds.Dispose(); + } + } + + /// <summary> + /// 鍒涘缓PNG + /// </summary> + public void CreatePng(string filePath, int width, int height, int bands = 3) + { + // 鍒涘缓鍐呭瓨椹卞姩 + OSGeo.GDAL.Driver memDriver = Gdal.GetDriverByName("MEM"); + // 鍒涘缓鍐呭瓨鏁版嵁闆� + Dataset ds = memDriver.Create("mem::", width, height, bands, DataType.GDT_Byte, null); + + // 璁剧疆鍥惧儚淇℃伅 + for (int i = 1; i <= bands; i++) + { + Band band = ds.GetRasterBand(i); + band.SetRasterColorInterpretation((ColorInterp)i); + } + + // 濉厖鍐呭瓨鍥惧儚 + byte[] buffer = new byte[width * height * bands]; + for (int i = 0; i < buffer.Length; i++) + { + buffer[i] = (byte)(i % 256); + } + + // 鍐欏叆鍐呭瓨鍥惧儚 + for (int i = 1; i <= bands; i++) + { + Band band = ds.GetRasterBand(i); + band.WriteRaster(0, 0, width, height, buffer, width, height, 0, 0); + } + + // 鍒涘缓PNG椹卞姩 + OSGeo.GDAL.Driver pngDriver = Gdal.GetDriverByName("PNG"); + + // 淇濆瓨涓篜NG鏂囦欢 + //ds.SetProjection(Gdal.GetProjectionRef("")); + //ds.SetGeoTransform(Gdal.GetGeoTransform("")); + pngDriver.CreateCopy(filePath, ds, 0, null, null, null); + pngDriver.Dispose(); + + // 鍏抽棴鏁版嵁闆� + ds.Dispose(); + memDriver.Dispose(); + } } } -- Gitblit v1.9.3