using LFServer.Models; using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.IO; using System.Linq; using System.Web; namespace LFServer.cs { public static class ExportUtil { /// /// 基目录 /// public static readonly string BaseDir = AppDomain.CurrentDomain.BaseDirectory; /// /// 最大文件数 /// public const int MaxFileCount = 2000; private static string sourcesPath; /// /// 获取资源目录 /// public static string SourcesPath { get { if (string.IsNullOrEmpty(sourcesPath)) { sourcesPath = Path.Combine(BaseDir, "Sources"); } return sourcesPath; } } private static string pyFile; /// /// 获取Python文件 /// public static string PyFile { get { if (string.IsNullOrWhiteSpace(pyFile)) { pyFile = Path.Combine(SourcesPath, "render.py"); } return pyFile; } } /// /// 获取上期字符串 /// public static string DateStr { get { return DateTime.Now.ToString("yyyyMMddHHmmss"); } } /// /// 获取出图目录 /// public static string ExportFolder { get { return ConfigurationManager.AppSettings["exportFolder"]; } } /// /// 获取出图子目录 /// public static string GetExportSubFolder() { string root = ExportFolder; 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(); } /// /// 执行Python /// /// Python文件 /// QGIS工程 /// QGIS模板 /// 执行结果 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 (p.HasExited == false) { p.Kill(); } si.Close(); so.Close(); se.Close(); p.Close(); } catch (Exception ex) { str = ex.Message; } return str; } /// /// 生成 /// /// 出图参数 /// 图片路径 public static string Generate(ExportArgs args) { string date = DateStr; string sub = GetExportSubFolder(); string qgz = "Test.qgz"; args.imgPath = sub + "\\" + date + ".png"; args.qpt = date + ".qpt"; args.SetDefault(); CreateTemplate(args); string info = ExecPython(PyFile, qgz, args.qpt); string qptFile = Path.Combine(SourcesPath, args.qpt); if (File.Exists(qptFile)) { File.Delete(qptFile); } return args.imgPath; } /// /// 创建模板 /// /// 出图参数 public static void CreateTemplate(ExportArgs args) { string imgPath = Path.Combine(ExportFolder, args.imgPath); string templateFile = Path.Combine(SourcesPath, "Test.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("{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); } } }