using Newtonsoft.Json;
using OSGeo.GDAL;
using OSGeo.OGR;
using SimuTools.Domain;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SimuTools.Tools
{
public class Handle
{
public static readonly string BaseDir = AppDomain.CurrentDomain.BaseDirectory;
///
/// 运行
///
public static void Run(string terrainFile, string waterPath, string flowPath, string outPath)
{
Domain.Layer layer = new Domain.Layer();
layer.duration = new Duration();
layer.waters = new Water();
CopeTerrain(terrainFile, outPath, layer);
CopeWater(waterPath, outPath, layer);
CopeFlow(flowPath, outPath, layer);
CopeLayerJson(outPath, layer);
}
///
/// 处理地形
///
private static void CopeTerrain(string terrainFile, string outPath, Domain.Layer layer)
{
Dataset ds = null;
try
{
ds = Gdal.Open(terrainFile, Access.GA_ReadOnly);
if (null == ds || 0 == ds.RasterCount || null == ds.GetSpatialRef()) return;
SetTerrainInfo(ds, layer);
}
finally
{
if (null != ds) ds.Dispose();
}
}
///
/// 设置地形信息
///
private static void SetTerrainInfo(Dataset ds, Domain.Layer layer)
{
Geometry minPoint = GdalHelper.GetMinPoint(ds);
Geometry maxPoint = GdalHelper.GetMaxPoint(ds);
layer.extension = new Extension(minPoint.GetX(0), minPoint.GetY(0), maxPoint.GetX(0), maxPoint.GetY(0));
Band band = ds.GetRasterBand(1);
double[] mm = new double[2];
band.ComputeRasterMinMax(mm, 0);
layer.extension.SetHeight(mm[0], mm[1]);
}
///
/// 处理水面
///
private static void CopeWater(string waterPath, string outPath, Domain.Layer layer)
{
}
///
/// 处理流速流向
///
private static void CopeFlow(string flowPath, string outPath, Domain.Layer layer)
{
}
///
/// 处理元数据
///
private static void CopeLayerJson(string outPath, Domain.Layer layer)
{
if (null == layer) return;
String json = JsonConvert.SerializeObject(layer);
string filePath = Path.Combine(outPath, "layer.json");
using (StreamWriter sw = new StreamWriter(filePath))
{
sw.Write(json);
}
}
}
}