| | |
| | | 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; |
| | | } |
| | | } |
| | | } |