using ExportMap.db; using ExportMap.Models; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.Web; namespace ExportMap.cs { public class XYZUtils { private static string pyFile; /// /// 获取Python文件 /// public static string PyFile { get { if (string.IsNullOrWhiteSpace(pyFile)) { pyFile = Path.Combine(ExportUtil.SourcesPath, "xyz2.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"; } } /// /// 获取发布地址:http://localhost/ExportMap/tile0/{z}/{x}/{y}.png?path=2d\tiles\0102 /// public static string GetReleaseUrl(string dircode) { //return "http://{host}/LFData/2d/tiles/" + dircode + "/{z}/{x}/{y}.png"; return "{host}/ExportMap/tile0/{z}/{x}/{y}.png?path=2d/tiles/" + dircode; } /// /// 生成 /// /// XYZ参数 /// 错误信息 /// 数据发布ID集合 public static List Generate(XYZArgs args, ref string err) { List list = SelectMetas(args.ids, "and type in ('tif', 'tiff', 'img', 'png', 'jpg')"); if (null == list || list.Count == 0) return null; string dateStr = ExportUtil.DateStr; //string batFile = Path.Combine(BatPath, dateStr + ".bat"); string txtFile = Path.Combine(Tools.TempDir, ExportUtil.DateStr + ".txt"); string xyzPath = Path.Combine(SGUtils.LFData, "2d\\tiles", args.dircode); //if (args.isNew && Directory.Exists(xyzPath)) Tools.DelPath(xyzPath); // 已存在的,删除 if (!Directory.Exists(xyzPath)) Directory.CreateDirectory(xyzPath); int pubid = PubDBHelper.GetPushlishId(args.dircode, "DOM"); List mids = PubDBHelper.GetPublishMetaId(pubid); WriteText(txtFile, list, mids); string cmd = string.Format("python \"{0}\" -qgz {1} -file \"{2}\" -out \"{3}\" -min {4} -max {5} -noData {6}", PyFile, Qgz, txtFile, xyzPath, args.min, args.max, args.noData); SysTask task = TaskDBHelper.CreateTask(args, "DOM", "影像数据(DOM)"); err = Tools.ExecCmd(task, cmd, true); //if (File.Exists(batFile)) File.Delete(batFile); if (File.Exists(txtFile)) File.Delete(txtFile); List ids = new List(); string viewFile = Path.Combine(xyzPath, "view.html"); if (File.Exists(viewFile)) { string path = "2d\\tiles" + "\\" + args.dircode; pubid = InsertToDB(list, args, path); if (pubid > 0) ids.Add(pubid); } return ids; } /// /// 查询元数据 /// public static List SelectMetas(List ids, string types = "") { string sql = string.Format("select a.*, fn_get_fullname(dircode, 2) dirname from lf.sys_meta a where id in ({0}) {1} order by id desc", string.Join(",", ids), types); DataTable dt = Tools.DBHelper.GetDataTable(sql); List list = ModelHandler.FillModel(dt); return list; } /// /// 根据ID查询元数据 /// public static SysMeta SelectMeta(int id) { string sql = string.Format("select a.*, fn_get_fullname(dircode, 2) dirname from lf.sys_meta a where id = {0}", id); DataTable dt = Tools.DBHelper.GetDataTable(sql); List list = ModelHandler.FillModel(dt); return null == list || list.Count == 0 ? null : list[0]; } /// /// 写文本文件 /// private static void WriteText(string file, List list, List mids) { 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)) continue; bool exists = mids.Contains(meta.id); files.Add(string.Format("{0},{1}", filePath, exists ? 1 : 0)); } //files.Add(@"E:\01.Data\33.DOM\2.大庆DOM\5154.50-415.50.tif"); //files.Add(@"E:\01.Data\33.DOM\2.大庆DOM\5154.50-416.00.tif"); string str = string.Join("\r\n", files); File.WriteAllText(file, str); } /// /// 插入数据库 /// private static int InsertToDB(List metas, XYZArgs args, string path) { //if (PubDBHelper.IsPublish(args.dircode, "DOM")) return 1; int pubid = PubDBHelper.GetPushlishId(args.dircode, "DOM"); if (pubid > 0) // 更新发布 { List ids = PubDBHelper.GetPublishMetaId(pubid); foreach (SysMeta m in metas) { if (!ids.Contains(m.id)) PubDBHelper.InsertMetaPub(m.id, pubid, args.userId); } string geom = GetPointZ(args); PubDBHelper.UpdatePublish(pubid, args.name, args.userId, geom); return pubid; } SysMeta meta = metas[0]; meta.type = "DOM"; meta.name = args.name; meta.dircode = args.dircode; SysPublish sys = Tools.NewPublish(meta, args, GetReleaseUrl(args.dircode), path); sys.geom = GetPointZ(args); pubid = PubDBHelper.InsertPublish(sys); if (pubid > 0) { sys.id = pubid; PubDBHelper.InsertLayer(sys, new SysMeta() { name = args.name, type = meta.type, dirname = meta.dirname }); foreach (SysMeta m in metas) { PubDBHelper.InsertMetaPub(m.id, pubid, args.userId); } } return pubid; } /// /// 获取中心点 /// private static string GetPointZ(XYZArgs args) { string viewFile = Path.Combine(SGUtils.LFData, "2d\\tiles", args.dircode, "view.html"); if (!File.Exists(viewFile)) return null; string str = File.ReadAllText(viewFile); int start = str.IndexOf(".setView([") + ".setView([".Length; int end = str.IndexOf(");", start); string coords = str.Substring(start, end - start).Replace("]", "").Replace(" ", ""); string[] strs = coords.Split(new char[] { ',' }); return string.Format("ST_GeomFromText('POINT Z ({0} {1} {2})')", strs[0], strs[1], strs[2]); } } }