using ExportMap.db; using ExportMap.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; namespace ExportMap.cs { public class OsgbUtils { /// /// 获取路径 /// public static string GetPath(int id) { return Path.Combine(SGUtils.LFData, "3d\\3dtiles\\osgb", id.ToString()); } /// /// 获取发布地址 /// public static string GetReleaseUrl(SysMeta meta) { return "{host}/LFData/3d/3dtiles/osgb/" + meta.id + "/tileset.json"; } /// /// 生成 /// /// XYZ参数 /// 错误信息 /// 数据发布ID集合 public static List Generate(XYZArgs args, ref string err) { try { List list = XYZUtils.SelectMetas(args.ids, "and type = 'osgb'"); if (null == list || list.Count == 0) return null; string d3tilesPath = Tools.GetSetting("d3tilesPath"); string uploadFolder = Tools.GetSetting("uploadFolder"); List ids = new List(); foreach (SysMeta meta in list) { string osgbPath = Path.Combine(uploadFolder, meta.path); if (!Directory.Exists(osgbPath)) continue; meta.ismeta = 0; // 0-倾斜摄影数据 string outPath = GetPath(meta.id); string jsonFile = Path.Combine(outPath, "tileset.json"); if (args.isNew && Directory.Exists(outPath)) Tools.DelPath(outPath); if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath); if (File.Exists(jsonFile)) File.Delete(jsonFile); string srs = findSRS(osgbPath); if (null != srs) writeSRS(osgbPath, getSRS(srs)); int idx = args.ids.IndexOf(meta.id); string cmd = string.Format("{0}\\3dtile.exe -f osgb -i \"{1}\" -o \"{2}\" -c \"{{\\\"offset\\\": {3}}}\"", d3tilesPath, osgbPath, outPath, args.zs[idx]); SysTask task = TaskDBHelper.CreateTask(args, meta, "OSGB", "倾斜数据(OSGB)"); err = Tools.ExecCmd(task, cmd, false); err = null; if (null != srs) writeSRS(osgbPath, srs); if (File.Exists(jsonFile)) { string path = jsonFile.Replace(Tools.GetSetting("lfData") + "\\", ""); int pubid = InsertToDB(meta, args, path); if (pubid > 0) ids.Add(pubid); } } return ids; } catch (Exception ex) { LogOut.Error(ex.Message + "\r\n" + ex.StackTrace); err = ex.Message; return null; } } /// /// 查找SRS /// private static string findSRS(string osgbPath) { string file = Path.Combine(osgbPath, "metadata.xml"); if (!File.Exists(file)) return null; string[] lines = File.ReadAllLines(file); foreach (string line in lines) { if (line.Contains("EPSG:") && line.Contains("+")) { return line; } } return null; } /// /// 写入SRS /// private static void writeSRS(string osgbPath, string newSRS) { string file = Path.Combine(osgbPath, "metadata.xml"); if (!File.Exists(file)) return; string[] lines = File.ReadAllLines(file); for (int i = 0, c = lines.Length; i < c; i++) { if (lines[i].Contains("EPSG:")) { lines[i] = newSRS; break; } } File.WriteAllLines(file, lines); } /// /// 获取SRS /// /// private static string getSRS(string srs) { int start = srs.IndexOf("+"); int end = srs.IndexOf(""); string other = srs.Substring(start, end - start); return srs.Replace(other, ""); } /// /// 插入数据库 /// private static int InsertToDB(SysMeta meta, XYZArgs args, string path) { //if (PubDBHelper.IsPublish(meta.id)) return 1; int pubid = PubDBHelper.GetPushlishId(meta.id); if (pubid > 0) { PubDBHelper.UpdatePublish(pubid, meta.name, args.userId, null); return pubid; } SysPublish sys = Tools.NewPublish(meta, args, GetReleaseUrl(meta), path); pubid = PubDBHelper.InsertPublish(sys); if (pubid > 0) { sys.id = pubid; PubDBHelper.InsertLayer(sys, meta); PubDBHelper.InsertMetaPub(meta.id, pubid, args.userId); } return pubid; } } }