管道基础大数据平台系统开发-【CS】-ExportMap
1
13693261870
2022-12-21 b93b3a846468f0031a49d7689b645b894268f787
ExportMap/cs/ExportUtil.cs
@@ -1,49 +1,295 @@
using System;
using ExportMap.cs;
using LFServer.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
namespace LFServer.cs
{
    public class ExportUtil
    public static class ExportUtil
    {
        /// <summary>
        /// 基目录
        /// </summary>
        public static readonly string BaseDir = AppDomain.CurrentDomain.BaseDirectory;
        private static string py;
        /// <summary>
        /// 最大文件数
        /// </summary>
        public const int MaxFileCount = 2000;
        public string GetPy
        private static string sourcesPath;
        /// <summary>
        /// 获取资源目录
        /// </summary>
        public static string SourcesPath
        {
            get
            {
                if (py == null) py = Path.Combine(BaseDir, "Sources\\render.py");
                if (string.IsNullOrEmpty(sourcesPath))
                {
                    sourcesPath = Path.Combine(BaseDir, "Sources");
                }
                return py;
                return sourcesPath;
            }
        }
        public static void ExecPython(string py, string qgz, string qpt)
        private static string pyFile;
        /// <summary>
        /// 获取Python文件
        /// </summary>
        public static string PyFile
        {
            get
            {
                if (string.IsNullOrWhiteSpace(pyFile))
                {
                    pyFile = Path.Combine(SourcesPath, "render.py");
                }
                return pyFile;
            }
        }
        /// <summary>
        /// 获取上期字符串
        /// </summary>
        public static string DateStr
        {
            get
            {
                return DateTime.Now.ToString("yyyyMMddHHmmss");
            }
        }
        /// <summary>
        /// 获取下载目录
        /// </summary>
        public static string DownloadFolder
        {
            get
            {
                return ConfigurationManager.AppSettings["downloadFolder"];
            }
        }
        /// <summary>
        /// 后台服务地址
        /// </summary>
        public static string LFServer
        {
            get
            {
                return ConfigurationManager.AppSettings["lfServer"];
            }
        }
        /// <summary>
        /// 获取出图子目录
        /// </summary>
        public static string GetExportSubFolder()
        {
            string root = DownloadFolder;
            if (!Directory.Exists(root))
            {
                Directory.CreateDirectory(root);
            }
            int i = 1;
            while (true)
            {
                string subFolder = Path.Combine(root, i.ToString());
                if (!Directory.Exists(subFolder))
                {
                    Directory.CreateDirectory(subFolder);
                    break;
                }
                DirectoryInfo dir = new DirectoryInfo(subFolder);
                FileInfo[] files = dir.GetFiles();
                if (files == null || files.Length < MaxFileCount)
                {
                    break;
                }
                i++;
            }
            return i.ToString();
        }
        /// <summary>
        /// 执行Python
        /// </summary>
        /// <param name="py">Python文件</param>
        /// <param name="qgz">QGIS工程</param>
        /// <param name="qpt">QGIS模板</param>
        /// <returns>执行结果</returns>
        public static string ExecPython(string py, string qgz, string qpt)
        {
            string str = null;
            try
            {
                string cmdText = string.Format("python {0} -qgz {1} -qpt {2}", py, qgz, qpt);
                Process 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 so = p.StandardOutput; // 标准输出流
                StreamReader se = p.StandardError; // 标准错误流
                si.AutoFlush = true;
                si.WriteLine(cmdText);
                si.WriteLine("exit");
                string info = so.ReadToEnd();
                str = se.ReadToEnd();
                if (!string.IsNullOrEmpty(info)) LogOut.Debug(info);
                if (!string.IsNullOrEmpty(str)) LogOut.Error(str);
                if (p.HasExited == false) p.Kill();
                si.Close();
                so.Close();
                se.Close();
                p.Close();
            }
            catch (Exception ex)
            {
                LogOut.Error(ex.StackTrace);
                str = ex.Message;
            }
            return str;
        }
        /// <summary>
        /// 生成
        /// </summary>
        /// <param name="args">出图参数</param>
        /// <param name="err">错误信息</param>
        /// <returns>图片路径</returns>
        public static string Generate(ExportArgs args, ref string err)
        {
            string date = DateStr;
            string sub = GetExportSubFolder();
            string qgz = "Test.qgz";
            args.imgPath = sub + "\\" + date + ".png";
            args.qpt = date + ".qpt";
            args.SetDefault();
            CreateTemplate(args);
            err = ExecPython(PyFile, qgz, args.qpt);
            string qptFile = Path.Combine(SourcesPath, args.qpt);
            if (File.Exists(qptFile))
            {
                File.Delete(qptFile);
            }
            string imgPath = Path.Combine(DownloadFolder, args.imgPath);
            bool flag = File.Exists(imgPath);
            return flag ? args.imgPath : null;
        }
        /// <summary>
        /// 创建模板
        /// </summary>
        /// <param name="args">出图参数</param>
        public static void CreateTemplate(ExportArgs args)
        {
            string imgPath = Path.Combine(DownloadFolder, args.imgPath);
            string templateFile = Path.Combine(SourcesPath, "Template.qpt");
            string qptFile = Path.Combine(SourcesPath, args.qpt);
            if (File.Exists(qptFile))
            {
                File.Delete(qptFile);
            }
            string xml = File.ReadAllText(templateFile);
            xml = xml
                .Replace("{dpi}", args.dpi.ToString())
                .Replace("{title}", args.title)
                .Replace("{sourcesPath}", SourcesPath)
                .Replace("{rotation}", args.rotation.ToString())
                .Replace("{xmin}", args.xmin.ToString())
                .Replace("{ymin}", args.ymin.ToString())
                .Replace("{ymax}", args.ymax.ToString())
                .Replace("{xmax}", args.xmax.ToString())
                .Replace("{province}", args.province)
                .Replace("{scale}", args.scale)
                .Replace("{resolution}", args.resolution)
                .Replace("{date}", args.date)
                .Replace("{layers}", args.layers)
                .Replace("{imgPath}", imgPath);
            File.WriteAllText(qptFile, xml);
        }
        /// <summary>
        /// 验证令牌
        /// </summary>
        /// <param name="token">令牌</param>
        /// <returns>是/否有效</returns>
        public static bool VerifyToken(string token)
        {
            try
            {
                string args = string.Format("{0} -qgz {1} -qpt {2}", py, qgz, qpt);
                string url = LFServer + "/sign/check?token=" + token.Trim();
                string json = GetData(url);
                if (string.IsNullOrWhiteSpace(json))
                {
                    return false;
                }
                Process p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.ErrorDialog = true;
                p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                p.StartInfo.RedirectStandardError = false;
                p.StartInfo.FileName = "python";
                p.StartInfo.Arguments = args;
                p.StartInfo.CreateNoWindow = true;
                ResponseMsg<bool> rm = JsonConvert.DeserializeObject<ResponseMsg<bool>>(json);
                p.Start();
                return rm != null && rm.code == 200 && rm.result;
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// Get获取数据
        /// </summary>
        /// <param name="url">URL</param>
        /// <returns>数据</returns>
        public static string GetData(string url)
        {
            Uri uri = new Uri(url);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "GET";
            request.ContentType = "application/x-www-form-urlencoded";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            string str = reader.ReadToEnd();
            reader.Close();
            return str;
        }
    }
}