管道基础大数据平台系统开发-【CS】-ExportMap
1
13693261870
2024-07-23 379a98780e346a793c5dae062efae417ade0117d
SimuTools/Tools/Handle.cs
@@ -15,6 +15,7 @@
{
    public class Handle
    {
        #region 成员变量
        public static readonly int MAX = 256 * 256;
        public static readonly double WaterHeightOffset = 1.0;
@@ -22,6 +23,7 @@
        public static readonly string BaseDir = AppDomain.CurrentDomain.BaseDirectory;
        public static readonly string GdalPath = ConfigurationManager.AppSettings["gdalPath"];
        #endregion
        /// <summary>
        /// 运行
@@ -38,7 +40,7 @@
            CopeTerrain(terrainFile, outPath, layer);
            CopeWater(waterPath, outPath, layer);
            //CopeFlow(flowPath, outPath, layer);
            CopeFlow(flowPath, outPath, layer);
            CopeLayerJson(outPath, layer);
            if (Directory.Exists(temp)) Directory.Delete(temp, true);
@@ -110,7 +112,7 @@
            {
                string tif = Path.Combine(tempPath, DateTime.Now.Ticks.ToString() + ".tif");
                //Resample(ds.GetDescription(), tif, sizes[0], sizes[1]);
                Resample(ds, tif, sizes[0], sizes[1]);
                Resample(ds, tif, sizes[0], sizes[1], layer);
                if (!File.Exists(tif)) continue;
                string png = Path.Combine(terrainPath, sizes[0] + "_" + sizes[1] + ".png");
@@ -121,7 +123,7 @@
        /// <summary>
        /// 重采样
        /// </summary>
        private static void Resample(Dataset ds, string dest, int width, int height)
        private static void Resample(Dataset ds, string dest, int width, int height, Domain.Layer layer)
        {
            // https://blog.51cto.com/u_16099346/6691820
            //string args = string.Format("-t_srs {0} -ts {1} {2} -r {3} -of {4}", "EPSG:4326", width, height, "bilinear", "GTiff");
@@ -133,6 +135,11 @@
                "-ts",
                width.ToString(),
                height.ToString(),
                "-te",
                layer.extension.minx.ToString(),
                layer.extension.miny.ToString(),
                layer.extension.maxx.ToString(),
                layer.extension.maxy.ToString(),
                "-r",
                "bilinear",
                "-of",
@@ -142,57 +149,6 @@
            Dataset destDs = Gdal.Warp(dest, new Dataset[] { ds }, warpAppOptions, null, null);
            destDs.Dispose();
        }
        /// <summary>
        /// 重采样 *
        /// </summary>
        private static void Resample(string source, string dest, int width, int height)
        {
            // https://blog.51cto.com/u_16099346/6691820
            string cmd = string.Format("{0}gdalwarp.exe -t_srs {1} -ts {2} {3} -r {4} -of GTiff \"{5}\" \"{6}\"", GdalPath, "EPSG:4326", width, height, "bilinear", source, dest);
            string err = ExecExe(cmd);
        }
        /// <summary>
        /// 执行命令
        /// </summary>
        public static string ExecExe(string cmd)
        {
            string str = null;
            Process p = null;
            try
            {
                p = new Process();
                p.StartInfo.FileName = "cmd.exe";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.Start();
                StreamWriter si = p.StandardInput;
                StreamReader se = p.StandardError;
                si.AutoFlush = true;
                si.WriteLine(cmd);
                si.WriteLine("exit");
                str = se.ReadToEnd();
                se.Close();
                si.Close();
            }
            catch (Exception ex)
            {
                LogOut.Error(ex.Message + "\r\n" + ex.StackTrace);
                str = ex.Message;
            }
            finally
            {
                if (p != null) p.Close();
            }
            return str;
        }
        /// <summary>
@@ -355,7 +311,7 @@
            {
                string fileName = Path.GetFileNameWithoutExtension(ds.GetDescription()) + "_" + sizes[0] + "_" + sizes[1];
                string tif = Path.Combine(tempPath, fileName + ".tif");
                Resample(ds.GetDescription(), tif, sizes[0], sizes[1]);
                Resample(ds, tif, sizes[0], sizes[1], layer);
                if (!File.Exists(tif)) continue;
                string png = Path.Combine(waterPath, sizes[0] + "_" + sizes[1] + ".png");
@@ -420,8 +376,8 @@
            List<string> vyFiles = GetFiles(flowPath, "vy");
            if (null == vxFiles || null == vyFiles || vxFiles.Count != vyFiles.Count || vxFiles.Count != layer.waters.data.Count) return;
            //Parallel.For(0, vxFiles.Count, i =>
            for (int i = 0; i < vxFiles.Count; i++)
            Parallel.For(0, vxFiles.Count, i =>
            //for (int i = 0; i < vxFiles.Count; i++)
            {
                Dataset vxDs = null, vyDs = null;
                try
@@ -438,7 +394,7 @@
                    if (null != vxDs) vxDs.Dispose();
                    if (null != vyDs) vyDs.Dispose();
                }
            }//);
            });
        }
        /// <summary>
@@ -455,11 +411,11 @@
            {
                string vxName = Path.GetFileNameWithoutExtension(vxDs.GetDescription()) + "_" + sizes[0] + "_" + sizes[1];
                string vxTif = Path.Combine(tempPath, vxName + ".tif");
                Resample(vxDs.GetDescription(), vxTif, sizes[0], sizes[1]);
                Resample(vxDs, vxTif, sizes[0], sizes[1], layer);
                string vyName = Path.GetFileNameWithoutExtension(vyDs.GetDescription()) + "_" + sizes[0] + "_" + sizes[1];
                string vyTif = Path.Combine(tempPath, vyName + ".tif");
                Resample(vyDs.GetDescription(), vyTif, sizes[0], sizes[1]);
                Resample(vyDs, vyTif, sizes[0], sizes[1], layer);
                if (!File.Exists(vxTif) || !File.Exists(vyTif)) continue;
@@ -492,7 +448,7 @@
                double max = vxMm[1] > vyMm[1] ? vxMm[1] : vyMm[1];
                double perHeight = (max - min) / 255;
                CreateFlowPng(vxBuffer, vyBuffer, perHeight, png, width, height);
                CreateFlowPng(vxBuffer, vyBuffer, min, perHeight, png, width, height);
            }
            finally
            {
@@ -506,7 +462,7 @@
        /// <summary>
        /// 创建流速流向PNG
        /// </summary>
        private static void CreateFlowPng(float[] vxBuffer, float[] vyBuffer, double perHeight, string png, int width, int height)
        private static void CreateFlowPng(float[] vxBuffer, float[] vyBuffer, double minHeight, double perHeight, string png, int width, int height)
        {
            Bitmap image = new Bitmap(width, height);
            Graphics graphic = Graphics.FromImage(image);
@@ -520,18 +476,16 @@
                    int offset = x + y * width;
                    float fx = GetFloatValue(vxBuffer[offset]);
                    float fy = GetFloatValue(vyBuffer[offset]);
                    double rv = GetRVal(fx, fy);
                    if (double.IsNaN(rv) || rv == 0) continue;
                    double dv = GetXyValue(fx, fy);
                    double dx = float.IsNaN(fx) ? 0 : fx * 0.5 + 0.5;
                    double dy = float.IsNaN(fy) ? 0 : fy * 0.5 + 0.5;
                    int r = Convert.ToInt32(dv * 255);
                    if (r > 255)
                    {
                        r = 255;
                    }
                    int g = Convert.ToInt32(dx * 255);
                    int b = Convert.ToInt32(dy * 255);
                    double dv = GetXyValue(fx, fy, rv);
                    int r = Convert.ToInt32(dv == 0 ? 0 : (dv * 0.5 + 0.5) * 255);
                    int g = float.IsNaN(fx) ? 0 : Convert.ToInt32((fx - minHeight) / perHeight);
                    int b = float.IsNaN(fy) ? 0 : Convert.ToInt32((fy - minHeight) / perHeight);
                    if (r < 0 || r > 255) r = 255;
                    if (g < 0 || g > 255) g = 255;
                    if (b < 0 || b > 255) b = 255;
                    Color color = Color.FromArgb(127, r, g, b);
                    image.SetPixel(x, y, color);
@@ -545,33 +499,40 @@
        /// </summary>
        private static float GetFloatValue(float val)
        {
            //return (float.IsNaN(val) || val < -999) ? float.NaN : val;
            if (float.IsNaN(val) || val < -999) return float.NaN;
            //if (val > 1) return 1;
            //if (val < -1) return -1;
            return (float.IsNaN(val) || val < -999) ? float.NaN : val;
        }
            return val;
        /// <summary>
        /// 获取R值
        /// </summary>
        private static double GetRVal(float fx, float fy)
        {
            if (float.IsNaN(fx) && float.IsNaN(fy)) return double.NaN;
            if (float.IsNaN(fx)) return Math.Abs(fy);
            if (float.IsNaN(fy)) return Math.Abs(fx);
            return Math.Sqrt(Math.Pow(fx, 2) + Math.Pow(fy, 2));
        }
        /// <summary>
        /// 获取XY值
        /// </summary>
        private static double GetXyValue(float fx, float fy)
        private static double GetXyValue(float fx, float fy, double rv)
        {
            if (float.IsNaN(fx) && float.IsNaN(fy))
            {
                return 0;
            }
            if (float.IsNaN(fx))
            {
                return Math.Abs(fy);
                return fy / rv;
            }
            if (float.IsNaN(fy))
            {
                return Math.Abs(fx);
                return fx / rv;
            }
            return Math.Sqrt(Math.Pow(fx, 2) + Math.Pow(fy, 2));
            double dv = fx / rv + fy / rv;
            return dv < 0 ? -Math.Sqrt(-dv) : Math.Sqrt(dv);
        }
        #endregion
@@ -592,5 +553,58 @@
            }
        }
        #endregion
        #region 暂时不用
        /// <summary>
        /// 重采样 *
        /// </summary>
        private static void Resample(string source, string dest, int width, int height)
        {
            // https://blog.51cto.com/u_16099346/6691820
            string cmd = string.Format("{0}gdalwarp.exe -t_srs {1} -ts {2} {3} -r {4} -of GTiff \"{5}\" \"{6}\"", GdalPath, "EPSG:4326", width, height, "bilinear", source, dest);
            string err = ExecExe(cmd);
        }
        /// <summary>
        /// 执行命令
        /// </summary>
        public static string ExecExe(string cmd)
        {
            string str = null;
            Process p = null;
            try
            {
                p = new Process();
                p.StartInfo.FileName = "cmd.exe";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.Start();
                StreamWriter si = p.StandardInput;
                StreamReader se = p.StandardError;
                si.AutoFlush = true;
                si.WriteLine(cmd);
                si.WriteLine("exit");
                str = se.ReadToEnd();
                se.Close();
                si.Close();
            }
            catch (Exception ex)
            {
                LogOut.Error(ex.Message + "\r\n" + ex.StackTrace);
                str = ex.Message;
            }
            finally
            {
                if (p != null) p.Close();
            }
            return str;
        }
        #endregion
    }
}