using ExportMap.db;
|
using ExportMap.Models;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Configuration;
|
using System.Data;
|
using System.Diagnostics;
|
using System.IO;
|
using System.Linq;
|
using System.Threading;
|
using System.Web;
|
|
namespace ExportMap.cs
|
{
|
public class SGUtils
|
{
|
/// <summary>
|
/// 廊坊数据目录
|
/// </summary>
|
public static string LFData
|
{
|
get
|
{
|
return ConfigurationManager.AppSettings["lfData"];
|
}
|
}
|
|
/// <summary>
|
/// SG的DB库
|
/// </summary>
|
public static string SGDB
|
{
|
get
|
{
|
return ConfigurationManager.AppSettings["sgDB"];
|
}
|
}
|
|
/// <summary>
|
/// 获取发布地址
|
/// </summary>
|
public static string GetReleaseUrl(SysMeta meta, Int64 sgsID)
|
{
|
switch (meta.type)
|
{
|
case "mpt":
|
return "{host}/SG/Imagery;" + sgsID + ".mpt"; // Elevation
|
case "3dml":
|
return "{host}/SG/b3dm/" + sgsID + "/tileset.json";
|
case "cpt":
|
return "{host}/SG/pnts/" + sgsID + "/tileset.json";
|
default:
|
return string.Empty;
|
}
|
}
|
|
/// <summary>
|
/// 发布数据
|
/// </summary>
|
/// <param name="args">XYZ参数</param>
|
/// <returns>行数</returns>
|
public List<int> Release(XYZArgs args, ref string err)
|
{
|
List<SysMeta> list = XYZUtils.SelectMetas(args.ids, "and type in ('mpt', '3dml', 'cpt')");
|
if (null == list || list.Count == 0) return null;
|
|
//int maxId = GetMaxId(); // maxId = 411576;
|
RomoveNoneFiles(list);
|
if (list.Count == 0) return null;
|
|
//err = LinkFiles(list);
|
Tools.SetIsModel(args, list);
|
MoveFiles(list);
|
|
SysTask task = CreateTask(args, list);
|
task.pid = 0;
|
task.id = TaskDBHelper.Insert(task);
|
|
//string names = GetNames(list);
|
string sql = getSql(list);
|
for (int i = 0; i < 61; i++)
|
{
|
Thread.Sleep(3000);
|
|
//List<SpatialItem> items = SelectItems(names);
|
List<SpatialItem> items = SelectItemsBySql(sql);
|
if (null == items || items.Count == 0) continue;
|
|
task = TaskDBHelper.SelectById(task.id);
|
if (null != task && task.status < 2)
|
{
|
task.status = 2;
|
TaskDBHelper.Update(task);
|
}
|
|
return InsertInto(list, items, args);
|
}
|
|
task = TaskDBHelper.SelectById(task.id);
|
if (null != task && task.status < 2)
|
{
|
task.status = 4;
|
task.err = "没有数据要发布";
|
TaskDBHelper.Update(task);
|
}
|
|
return null;
|
}
|
|
/// <summary>
|
/// 创建任务
|
/// </summary>
|
private SysTask CreateTask(XYZArgs args, List<SysMeta> list)
|
{
|
args.name = list[0].name;
|
for (int i = 1; i < list.Count; i++)
|
{
|
string name =args.name+ "," + list[i].name;
|
if (name.Length > 150) break;
|
|
args.name = name;
|
}
|
|
switch (list[0].type)
|
{
|
case "3dml":
|
return TaskDBHelper.CreateTask(args, "3DML", "三维模型(3DML)");
|
case "cpt":
|
return TaskDBHelper.CreateTask(args, "CPT", "点云数据(CPT)");
|
default:
|
return TaskDBHelper.CreateTask(args, "MPT", "场景数据(MPT)");
|
}
|
}
|
|
/// <summary>
|
/// 获取查询SQL
|
/// </summary>
|
private string getSql(List<SysMeta> metas)
|
{
|
List<string> list = new List<string>();
|
foreach (SysMeta meta in metas)
|
{
|
list.Add("Name like '%_" + meta.name + "'");
|
}
|
|
string filters = string.Join(" or ", list);
|
|
|
return string.Format("select id, Name, RelativePath, LayerName, DataSourceId, Description from SpatialItems where {0} order by id desc", filters);
|
}
|
|
/// <summary>
|
/// 查询SG数据项
|
/// </summary>
|
private List<SpatialItem> SelectItemsBySql(string sql)
|
{
|
DataTable dt = SQLiteHelper.GetDataTable(sql);
|
List<SpatialItem> list = ModelHandler.FillModel<SpatialItem>(dt);
|
|
return list;
|
}
|
|
/// <summary>
|
/// 移除空文件
|
/// </summary>
|
private void RomoveNoneFiles(List<SysMeta> list)
|
{
|
string uploadFolder = Tools.GetSetting("uploadFolder");
|
|
int i = 0;
|
while (i < list.Count)
|
{
|
SysMeta meta = list[i];
|
string filePath = Path.Combine(uploadFolder, meta.path);
|
if (!File.Exists(filePath))
|
{
|
list.RemoveAt(i);
|
continue;
|
}
|
|
if ("mpt".Equals(meta.type))
|
{
|
string midx = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".midx"));
|
string strmi = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".strmi"));
|
if (!File.Exists(midx) || !File.Exists(strmi))
|
{
|
list.RemoveAt(i);
|
continue;
|
}
|
}
|
|
i++;
|
}
|
}
|
|
/// <summary>
|
/// 插入数据发布表
|
/// </summary>
|
private List<int> InsertInto(List<SysMeta> list, List<SpatialItem> items, XYZArgs args)
|
{
|
List<int> ids = new List<int>();
|
foreach (SysMeta meta in list)
|
{
|
//IEnumerable<SpatialItem> iterator = from item in items where item.Name.Equals(meta.id + "_" + meta.name) select item;
|
IEnumerable<SpatialItem> iterator = from item in items where item.Name.Contains("_" + meta.name) select item;
|
if (null == iterator || 0 == iterator.Count()) return ids;
|
|
meta.verid = iterator.First().id;
|
int pubid = InsertToDB(meta, args);
|
|
if (pubid > 0) ids.Add(pubid);
|
}
|
|
return ids;
|
}
|
|
/// <summary>
|
/// 插入数据库
|
/// </summary>
|
private static int InsertToDB(SysMeta meta, XYZArgs args)
|
{
|
//if (PubDBHelper.IsPublish(meta.id)) return 1;
|
int pubid = PubDBHelper.GetPushlishId(meta.id);
|
if (pubid > 0)
|
{
|
PubDBHelper.UpdatePublish(pubid, meta.name, args.userId, null, GetReleaseUrl(meta, meta.verid));
|
return pubid;
|
}
|
|
SysPublish sys = Tools.NewPublish(meta, args, GetReleaseUrl(meta, meta.verid), meta.id + "\\" + meta.name);
|
|
pubid = PubDBHelper.InsertPublish(sys);
|
if (pubid > 0)
|
{
|
sys.id = pubid;
|
PubDBHelper.InsertLayer(sys, meta);
|
PubDBHelper.InsertMetaPub(meta.id, pubid, args.userId);
|
}
|
|
return pubid;
|
}
|
|
/// <summary>
|
/// 移动文件
|
/// </summary>
|
private static void MoveFiles(List<SysMeta> metas)
|
{
|
string uploadFolder = Tools.GetSetting("uploadFolder");
|
string sgFolder = Path.Combine(uploadFolder, "SG");
|
if (!Directory.Exists(sgFolder)) Directory.CreateDirectory(sgFolder);
|
|
List<string> list = new List<string>();
|
foreach (SysMeta meta in metas)
|
{
|
if (meta.path.IndexOf("SG\\") > -1) continue;
|
|
string source = Path.Combine(uploadFolder, meta.path);
|
string target = Path.Combine(sgFolder, meta.id + "_" + meta.name);
|
|
if (File.Exists(target)) File.Delete(target);
|
File.Move(source, target);
|
|
if ("mpt".Equals(meta.type))
|
{
|
string midx = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".midx"));
|
File.Move(midx, Path.Combine(sgFolder, meta.id + "_" + meta.name.Replace(".mpt", ".midx")));
|
|
string strmi = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".strmi"));
|
File.Move(strmi, Path.Combine(sgFolder, meta.id + "_" + meta.name.Replace(".mpt", ".strmi")));
|
}
|
|
meta.path = "SG" + "\\" + meta.id + "_" + meta.name;
|
PubDBHelper.UpdateMetaPath(meta);
|
}
|
}
|
|
#region 废弃 *
|
/// <summary>
|
/// 查询SG数据项
|
/// </summary>
|
public List<SpatialItem> SelectItems(string names)
|
{
|
string sql = string.Format("select id, Name, RelativePath, LayerName, DataSourceId, Description from SpatialItems where Name in ({0}) order by id desc", names);
|
|
DataTable dt = SQLiteHelper.GetDataTable(sql);
|
List<SpatialItem> list = ModelHandler.FillModel<SpatialItem>(dt);
|
|
return list;
|
}
|
|
/// <summary>
|
/// 获取名称字符串
|
/// </summary>
|
private string GetNames(List<SysMeta> metas)
|
{
|
List<string> list = new List<string>();
|
foreach (SysMeta meta in metas)
|
{
|
list.Add("'" + meta.id + "_" + meta.name + "'");
|
}
|
|
return string.Join(",", list);
|
}
|
#endregion
|
|
#region * 废弃 *
|
/// <summary>
|
/// 获取最大ID值
|
/// </summary>
|
public int GetMaxId()
|
{
|
Object obj = SQLiteHelper.ExecuteScalar("select max(id) from SpatialItems");
|
|
return null == obj ? 0 : Convert.ToInt32(obj);
|
}
|
|
/// <summary>
|
/// 查询SG数据项
|
/// </summary>
|
/// <param name="maxId">最大ID值</param>
|
/// <returns>SG数据项</returns>
|
public List<SpatialItem> SelectItems(int maxId)
|
{
|
string sql = string.Format("select id, Name, RelativePath, LayerName, DataSourceId, Description from SpatialItems where id > {0} order by id desc", maxId);
|
|
DataTable dt = SQLiteHelper.GetDataTable(sql);
|
List<SpatialItem> list = ModelHandler.FillModel<SpatialItem>(dt);
|
|
return list;
|
}
|
|
/// <summary>
|
/// 链接文件
|
/// </summary>
|
private string LinkFiles(List<SysMeta> metas)
|
{
|
List<string> list = new List<string>();
|
foreach (SysMeta meta in metas)
|
{
|
switch (meta.type)
|
{
|
case "3dml":
|
AddMptLinkFile(list, meta);
|
break;
|
case "mpt":
|
AddD3mlLinkFile(list, meta);
|
break;
|
}
|
|
}
|
|
if (0 == list.Count) return "没有需要更新发布的文件";
|
|
return Tools.ExecCmd(list);
|
}
|
|
/// <summary>
|
/// 添加链接文件
|
/// </summary>
|
private void AddMptLinkFile(List<string> list, SysMeta meta)
|
{
|
string uploadFolder = Tools.GetSetting("uploadFolder");
|
string d3mlFolder = Tools.GetSetting("3dmlFolder");
|
|
string targetFolder = Path.Combine(d3mlFolder, meta.id.ToString());
|
if (!Directory.Exists(targetFolder)) Directory.CreateDirectory(targetFolder);
|
|
string d3ml = Path.Combine(uploadFolder, meta.path);
|
string targetD3ml = Path.Combine(d3mlFolder, meta.id.ToString(), meta.name);
|
|
if (!File.Exists(targetD3ml)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetD3ml, d3ml)); // /H
|
}
|
|
/// <summary>
|
/// 添加链接文件
|
/// </summary>
|
private void AddD3mlLinkFile(List<string> list, SysMeta meta)
|
{
|
string uploadFolder = Tools.GetSetting("uploadFolder");
|
string mptFolder = Tools.GetSetting("mptFolder");
|
|
string targetFolder = Path.Combine(mptFolder, meta.id.ToString());
|
if (!Directory.Exists(targetFolder)) Directory.CreateDirectory(targetFolder);
|
|
string mpt = Path.Combine(uploadFolder, meta.path);
|
string targetMpt = Path.Combine(mptFolder, meta.id.ToString(), meta.name);
|
|
string midx = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".midx"));
|
string targetMidx = Path.Combine(mptFolder, meta.id.ToString(), meta.name.Replace(".mpt", ".midx"));
|
|
string strmi = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".strmi"));
|
string targetStrmi = Path.Combine(mptFolder, meta.id.ToString(), meta.name.Replace(".mpt", ".strmi"));
|
|
if (!File.Exists(targetMpt)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetMpt, mpt));
|
if (!File.Exists(targetMidx)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetMidx, midx));
|
if (!File.Exists(targetStrmi)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetStrmi, strmi));
|
}
|
#endregion
|
}
|
}
|