using ExportMap.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; namespace ExportMap.cs { public class TerraUtils { private static string pyFile; /// /// 获取Python文件 /// public static string PyFile { get { if (string.IsNullOrWhiteSpace(pyFile)) { pyFile = Path.Combine(ExportUtil.SourcesPath, "merge.py"); } return pyFile; } } /// /// QGIS工程 /// public static string Qgz { get { //return Path.Combine(ExportUtil.SourcesPath, "xyz.qgz"); return "xyz.qgz"; } } /// /// bat路径 /// public static string BatPath { get { return @"C:\Program Files\QGIS 3.16\bin\"; } } /// /// 基础bat文件 /// public static string BaseBat { get { // python-qgis-ltr.bat,qgis_process-qgis-ltr.bat return @"C:\Program Files\QGIS 3.16\bin\qgis_process-qgis-ltr.bat"; } } /// /// 获取发布地址 /// public static string GetReleaseUrl(string dircode) { return "http://{host}/LFData/3d/terrain/" + dircode; } /// /// 获取地形路径 /// public static string GetTerrainPath(string dircode) { return Path.Combine(SGUtils.LFData, "3d\\terrain", dircode); } /// /// 生成 /// /// XYZ参数 /// 错误信息 /// 数据发布ID集合 public static List Generate(XYZArgs args, ref string err) { string tifFile = null; try { //tifFile = Merge(args, ref err); tifFile = Path.Combine(GetTerrainPath(args.dircode), args.dircode + ".tif"); if (!File.Exists(tifFile)) return null; Generate(args, tifFile, ref err); Save(args); return null; } catch (Exception ex) { LogOut.Error(ex.Message); err = ex.Message; return null; } finally { if (string.IsNullOrEmpty(tifFile) && File.Exists(tifFile)) { File.Delete(tifFile); } } } /// /// 合并 /// public static string Merge(XYZArgs args, ref string err) { string txtFile = null; try { List list = XYZUtils.SelectMetas(args.ids, "and type in ('tif', 'tiff')"); if (null == list || list.Count == 0) return null; txtFile = Path.Combine(Tools.TempDir, ExportUtil.DateStr + ".txt"); string dirPath = GetTerrainPath(args.dircode); if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath); string tifFile = Path.Combine(dirPath, args.dircode + ".tif"); if (File.Exists(tifFile)) File.Delete(tifFile); WriteText(txtFile, list); string cmd = string.Format("python \"{0}\" -qgz {1} -file \"{2}\" -out \"{3}\"", PyFile, Qgz, txtFile, tifFile); err = Tools.ExecCmd(cmd, true); return tifFile; } catch (Exception ex) { LogOut.Error(ex.Message); err = ex.Message; return null; } finally { if (!string.IsNullOrEmpty(txtFile) && File.Exists(txtFile)) { File.Delete(txtFile); } } } /// /// 写文本文件 /// private static void WriteText(string txtFile, List list) { string uploadFolder = Tools.GetSetting("uploadFolder"); List files = new List(); foreach (SysMeta meta in list) { string filePath = Path.Combine(uploadFolder, meta.path); if (File.Exists(filePath)) files.Add(filePath); } string str = string.Join("\n", files); File.WriteAllText(txtFile, str); } /// /// 生成高程切片 /// private static void Generate(XYZArgs args, string tifFile, ref string err) { string dirPath = GetTerrainPath(args.dircode).Replace("\\", "/"); string name = "ctb_" + ExportUtil.DateStr; string runDocker = string.Format("docker run -id --name {0} -v \"{1}\":\"/data\" tumgis/ctb-quantized-mesh", name, dirPath); string createMesh = string.Format("docker exec {0} ctb-tile -f Mesh -C -N -s {1} -e {2} -o /data /data/{3}.tif", name, args.max, args.min, args.dircode); string createLayer = string.Format("docker exec {0} ctb-tile -f Mesh -C -N -s {1} -e {2} -l -o /data /data/{3}.tif", name, args.max, args.min, args.dircode); string stop = string.Format("docker stop {0}", name); string rm = string.Format("docker rm {0}", name); List list = new List { runDocker, createMesh, createLayer, stop, rm }; err = Tools.ExecCmd(list); } /// /// 保存 /// private static void Save(XYZArgs args) { } } }