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;
}
}
}