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