using MoonExp.Models;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Configuration;
|
using System.Data;
|
using System.Diagnostics;
|
using System.IO;
|
using System.Linq;
|
using System.Net;
|
using System.Text;
|
using System.Web;
|
|
namespace MoonExp.cs
|
{
|
public class ExportUtil
|
{
|
/// <summary>
|
/// 最大文件数
|
/// </summary>
|
public const int MaxFileCount = 2000;
|
|
private static string sourcesPath;
|
|
/// <summary>
|
/// 获取资源目录
|
/// </summary>
|
public static string SourcesPath
|
{
|
get
|
{
|
if (string.IsNullOrEmpty(sourcesPath))
|
{
|
sourcesPath = Path.Combine(Tools.BaseDir, "Sources");
|
}
|
|
return sourcesPath;
|
}
|
}
|
|
private static string pyFile;
|
|
/// <summary>
|
/// 获取Python文件
|
/// </summary>
|
public static string PyFile
|
{
|
get
|
{
|
if (string.IsNullOrWhiteSpace(pyFile))
|
{
|
pyFile = Path.Combine(SourcesPath, "MoonExp.py");
|
}
|
|
return pyFile;
|
}
|
}
|
|
/// <summary>
|
/// 获取上期字符串
|
/// </summary>
|
public static string DateStr
|
{
|
get
|
{
|
return DateTime.Now.ToString("yyyyMMddHHmmss");
|
}
|
}
|
|
/// <summary>
|
/// 获取下载目录
|
/// </summary>
|
public static string DownloadFolder
|
{
|
get
|
{
|
return ConfigurationManager.AppSettings["downloadFolder"];
|
}
|
}
|
|
/// <summary>
|
/// 后台服务地址
|
/// </summary>
|
public static string MoonServer
|
{
|
get
|
{
|
return ConfigurationManager.AppSettings["moonServer"];
|
}
|
}
|
|
/// <summary>
|
/// 获取出图子目录
|
/// </summary>
|
public static string GetExportSubFolder()
|
{
|
string root = DownloadFolder;
|
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();
|
}
|
|
private static readonly string selectResSql = "select a.id, a.url, b.url || case when length(b.args) > 0 then '?' || b.args else '' end \"surl\" from lf.sys_layer a left join lf.sys_res b on a.resid = b.id where a.category = 3 and a.is_layer = 1 and a.id in ({0})";
|
|
public ExportUtil() { }
|
|
/// <summary>
|
/// 生成
|
/// </summary>
|
/// <param name="args">出图参数</param>
|
/// <param name="err">错误信息</param>
|
/// <returns>图片路径</returns>
|
public static string Generate(ExportArgs args, ref string err)
|
{
|
string date = DateStr;
|
string sub = GetExportSubFolder();
|
string qgz = "Moon.qgz";
|
|
args.imgPath = sub + "\\" + date + ".png";
|
args.qpt = date + ".qpt";
|
|
args.SetDefault();
|
CreateTemplate(args);
|
|
string cmd = string.Format("python \"{0}\" -qgz {1} -qpt {2}", PyFile, qgz, args.qpt);
|
err = Tools.ExecCmd(cmd, true, true);
|
|
string qptFile = Path.Combine(SourcesPath, args.qpt);
|
if (File.Exists(qptFile)) File.Delete(qptFile);
|
|
string imgPath = Path.Combine(DownloadFolder, args.imgPath);
|
bool flag = File.Exists(imgPath);
|
|
return flag ? args.imgPath : null;
|
}
|
|
/// <summary>
|
/// 转换为XYZ参数
|
/// </summary>
|
private static XYZArgs ToXYZArgs(ExportArgs ea)
|
{
|
XYZArgs args = new XYZArgs();
|
args.name = ea.title;
|
args.ids = new List<int>();
|
args.depcode = null;
|
args.dircode = null;
|
args.userId = Tools.SelectUserIdByToken(ea.token);
|
|
return args;
|
}
|
|
/// <summary>
|
/// 创建模板
|
/// </summary>
|
/// <param name="args">出图参数</param>
|
public static void CreateTemplate(ExportArgs args)
|
{
|
string imgPath = Path.Combine(DownloadFolder, args.imgPath);
|
string templateFile = Path.Combine(SourcesPath, "MoonTemplate.qpt");
|
string qptFile = Path.Combine(SourcesPath, args.qpt);
|
LogOut.Info("imgPath = " + imgPath + ", tempFile = " + templateFile + ", qptFile = " + qptFile);
|
|
string xml = File.ReadAllText(templateFile);
|
xml = xml
|
.Replace("{dpi}", args.dpi.ToString())
|
.Replace("{title}", args.title)
|
.Replace("{sourcesPath}", SourcesPath)
|
.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("{date}", DateTime.Now.ToString("yyyy.MM.dd"))
|
.Replace("{layers}", args.layers)
|
.Replace("{imgPath}", imgPath)
|
.Replace("{wmsUrl}", getWmtsUrl(args));
|
|
File.WriteAllText(qptFile, xml);
|
}
|
|
/// <summary>
|
/// 验证令牌
|
/// </summary>
|
/// <param name="token">令牌</param>
|
/// <returns>是/否有效</returns>
|
public static bool VerifyToken(string token)
|
{
|
try
|
{
|
string url = MoonServer + "/sign/check?token=" + token.Trim();
|
string json = GetData(url);
|
if (string.IsNullOrWhiteSpace(json))
|
{
|
return false;
|
}
|
|
ResponseMsg<bool> rm = JsonConvert.DeserializeObject<ResponseMsg<bool>>(json);
|
|
return rm != null && rm.code == 200 && rm.result;
|
}
|
catch
|
{
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// Get获取数据
|
/// </summary>
|
/// <param name="url">URL</param>
|
/// <returns>数据</returns>
|
public static string GetData(string url)
|
{
|
Uri uri = new Uri(url);
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
|
request.Method = "GET";
|
request.ContentType = "application/x-www-form-urlencoded";
|
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
string str = reader.ReadToEnd();
|
reader.Close();
|
|
return str;
|
}
|
|
/// <summary>
|
/// 获取WMTS地址,多个以英文逗号隔开
|
/// </summary>
|
public static string getWmtsUrl(ExportArgs args)
|
{
|
List<string> list = new List<string>();
|
foreach (int id in args.layerIds)
|
{
|
List<string> resList = SelectMapUrls(id);
|
if (null != resList && resList.Count > 0)
|
{
|
list.AddRange(resList);
|
}
|
}
|
|
if (0 == list.Count)
|
{
|
string defaultUrl = Tools.GetSetting("wmtsUrl");
|
if (!string.IsNullOrEmpty(defaultUrl)) list.Add(defaultUrl);
|
}
|
|
string wmtsUrl = string.Join(",", list);
|
|
return wmtsUrl;
|
}
|
|
/// <summary>
|
/// 查询地图Url
|
/// </summary>
|
public static List<string> SelectMapUrls(int id)
|
{
|
string sql = string.Format(selectResSql, id);
|
DataTable dt = Tools.DBHelper.GetDataTable(sql);
|
if (null == dt || 0 == dt.Rows.Count)
|
{
|
return null;
|
}
|
|
List<SysRes> resList = ModelHandler.FillModel<SysRes>(dt);
|
if (null == resList || 0 == resList.Count)
|
{
|
return null;
|
}
|
|
List<string> list = new List<string>();
|
foreach (SysRes res in resList)
|
{
|
if (!string.IsNullOrEmpty(res.surl))
|
{
|
list.Add(res.surl);
|
continue;
|
}
|
if (!string.IsNullOrEmpty(res.url))
|
{
|
list.Add(res.url);
|
}
|
}
|
|
return list;
|
}
|
}
|
}
|