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