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;
|
|
/// <summary>
|
/// 获取Python文件
|
/// </summary>
|
public static string PyFile
|
{
|
get
|
{
|
if (string.IsNullOrWhiteSpace(pyFile))
|
{
|
pyFile = Path.Combine(ExportUtil.SourcesPath, "merge.py");
|
}
|
|
return pyFile;
|
}
|
}
|
|
/// <summary>
|
/// QGIS工程
|
/// </summary>
|
public static string Qgz
|
{
|
get
|
{
|
//return Path.Combine(ExportUtil.SourcesPath, "xyz.qgz");
|
return "xyz.qgz";
|
}
|
}
|
|
/// <summary>
|
/// bat路径
|
/// </summary>
|
public static string BatPath
|
{
|
get
|
{
|
return @"C:\Program Files\QGIS 3.16\bin\";
|
}
|
}
|
|
/// <summary>
|
/// 基础bat文件
|
/// </summary>
|
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";
|
}
|
}
|
|
/// <summary>
|
/// 获取发布地址
|
/// </summary>
|
public static string GetReleaseUrl(string dircode)
|
{
|
return "http://{host}/LFData/3d/terrain/" + dircode;
|
}
|
|
/// <summary>
|
/// 获取地形路径
|
/// </summary>
|
public static string GetTerrainPath(string dircode)
|
{
|
return Path.Combine(SGUtils.LFData, "3d\\terrain", dircode);
|
}
|
|
/// <summary>
|
/// 生成
|
/// </summary>
|
/// <param name="args">XYZ参数</param>
|
/// <param name="err">错误信息</param>
|
/// <returns>数据发布ID集合</returns>
|
public static List<int> 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);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 合并
|
/// </summary>
|
public static string Merge(XYZArgs args, ref string err)
|
{
|
string txtFile = null;
|
try
|
{
|
List<SysMeta> 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);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 写文本文件
|
/// </summary>
|
private static void WriteText(string txtFile, List<SysMeta> list)
|
{
|
string uploadFolder = Tools.GetSetting("uploadFolder");
|
|
List<string> files = new List<string>();
|
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);
|
}
|
|
/// <summary>
|
/// 生成高程切片
|
/// </summary>
|
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 -it --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/{2}.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<string> list = new List<string> { runDocker, createMesh, createLayer, stop, rm };
|
err = Tools.ExecCmd(list);
|
}
|
|
/// <summary>
|
/// 保存
|
/// </summary>
|
private static void Save(XYZArgs args)
|
{
|
|
}
|
}
|
}
|