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 { /// /// 廊坊数据目录 /// public static string LFData { get { return ConfigurationManager.AppSettings["lfData"]; } } /// /// SG的DB库 /// public static string SGDB { get { return ConfigurationManager.AppSettings["sgDB"]; } } /// /// 获取发布地址 /// 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; } } /// /// 发布数据 /// /// XYZ参数 /// 行数 public List Release(XYZArgs args, ref string err) { List 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 items = SelectItems(names); List 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; } /// /// 创建任务 /// private SysTask CreateTask(XYZArgs args, List 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)"); } } /// /// 获取查询SQL /// private string getSql(List metas) { List list = new List(); 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); } /// /// 查询SG数据项 /// private List SelectItemsBySql(string sql) { DataTable dt = SQLiteHelper.GetDataTable(sql); List list = ModelHandler.FillModel(dt); return list; } /// /// 移除空文件 /// private void RomoveNoneFiles(List 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++; } } /// /// 插入数据发布表 /// private List InsertInto(List list, List items, XYZArgs args) { List ids = new List(); foreach (SysMeta meta in list) { //IEnumerable iterator = from item in items where item.Name.Equals(meta.id + "_" + meta.name) select item; IEnumerable 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; } /// /// 插入数据库 /// 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; } /// /// 移动文件 /// private static void MoveFiles(List metas) { string uploadFolder = Tools.GetSetting("uploadFolder"); string sgFolder = Path.Combine(uploadFolder, "SG"); if (!Directory.Exists(sgFolder)) Directory.CreateDirectory(sgFolder); List list = new List(); 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 废弃 * /// /// 查询SG数据项 /// public List 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 list = ModelHandler.FillModel(dt); return list; } /// /// 获取名称字符串 /// private string GetNames(List metas) { List list = new List(); foreach (SysMeta meta in metas) { list.Add("'" + meta.id + "_" + meta.name + "'"); } return string.Join(",", list); } #endregion #region * 废弃 * /// /// 获取最大ID值 /// public int GetMaxId() { Object obj = SQLiteHelper.ExecuteScalar("select max(id) from SpatialItems"); return null == obj ? 0 : Convert.ToInt32(obj); } /// /// 查询SG数据项 /// /// 最大ID值 /// SG数据项 public List 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 list = ModelHandler.FillModel(dt); return list; } /// /// 链接文件 /// private string LinkFiles(List metas) { List list = new List(); 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); } /// /// 添加链接文件 /// private void AddMptLinkFile(List 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 } /// /// 添加链接文件 /// private void AddD3mlLinkFile(List 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 } }