using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Net;
|
using System.Text;
|
using IStation.Model;
|
|
namespace IStation.WinFrmUI.River
|
{
|
/// <summary>
|
/// 潮汐接口
|
/// </summary>
|
public class TideFromWebHelper
|
{
|
private static readonly string _urlPrefix = "https://global-tide.nmdis.org.cn/Api/Service.ashx";
|
//"http://global-tide.nmdis.org.cn/Api/Service.ashx";//主体Url
|
|
|
/// <summary>
|
/// 获取潮汐数据
|
/// </summary>
|
static public List<Model.TileLevel> GetByDay1(
|
DateTime startday,
|
out string error)
|
{
|
string benchmark;
|
var list = ReadList(startday, out benchmark);
|
if(list == null)
|
{
|
list = GetByDayApi(startday, out benchmark, out error);
|
if (list == null)
|
{
|
return null;
|
}
|
|
SaveList(startday, benchmark, list);
|
}
|
else
|
{
|
error = null;
|
}
|
return list;
|
}
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="startday"></param>
|
/// <param name="error"></param>
|
/// <returns></returns>
|
static public List<Model.TimeWaterLevel> GetByDay2(DateTime startday, out string error)
|
{
|
var waterLevels长江 = new List<TimeWaterLevel>();
|
|
var list = GetByDay1(startday, out error);
|
if (list != null)
|
{
|
foreach (var h in list)
|
{
|
waterLevels长江.Add(
|
new TimeWaterLevel(
|
new DateTime(startday.Year, startday.Month, startday.Day, h.Hour, 0, 0), h.Level));
|
}
|
}
|
else
|
{
|
error = null;
|
}
|
return waterLevels长江;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="startday"></param>
|
/// <param name="endday"></param>
|
/// <param name="benchmark"></param>
|
/// <param name="error"></param>
|
/// <returns></returns>
|
static public List<Model.TimeWaterLevel> GetByDayRange(
|
DateTime startday, DateTime endday,
|
out string error)
|
{
|
|
error = null;
|
|
var waterLevels长江 = new List<TimeWaterLevel>();
|
for (DateTime currentDate = startday; currentDate <= endday; currentDate = currentDate.AddDays(1))
|
{
|
if (endday.Date > DateTime.Now.Date.AddDays(2))
|
{
|
break ;
|
}
|
|
var list1 = GetByDay1(startday.Date, out error);
|
if (list1 != null && list1.Count > 0)
|
{
|
for (int h = startday.Hour; h < 24; h++)
|
{
|
waterLevels长江.Add(
|
new TimeWaterLevel(
|
new DateTime(startday.Year, startday.Month, startday.Day, h, 0, 0),
|
list1[h].Level));
|
}
|
}
|
}
|
|
|
return waterLevels长江;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="day"></param>
|
/// <param name="benchmark"></param>
|
/// <param name="error"></param>
|
/// <returns></returns>
|
static private List<Model.TileLevel> GetByDayApi(
|
DateTime day,
|
out string benchmark,
|
out string error)
|
{
|
if (day > DateTime.Today.AddDays(1))
|
{
|
error = "不能查询后天的数据";
|
benchmark = "";
|
return null;
|
}
|
IStation.LogHelper.Info("read tide from web day: " + day + " start");
|
|
benchmark = "";
|
error = "";
|
IStation.CalcModel.Tide.PostParas paras = new CalcModel.Tide.PostParas();
|
paras.Data = new CalcModel.Tide.DateParas();
|
paras.Data.code = "NT1170";//static string 石洞口 = "NT1170";
|
paras.Data.date = day.ToString();
|
var url = $"{_urlPrefix}?ApiRequest={paras.ToJson()}";
|
try
|
{
|
var responseText = HttpRequest(url, "GET");
|
var result = JsonHelper.Json2Object<IStation.CalcModel.Tide.Result>(responseText);
|
if (result == null)
|
{
|
IStation.LogHelper.Error("read tide from web 1 长江水位请求失败 " );
|
error = "长江水位请求失败";
|
return null;
|
}
|
|
if (Convert.ToBoolean(result.State) && !string.IsNullOrEmpty(result.Message))
|
{
|
IStation.LogHelper.Error("read tide from web 2 长江水位请求失败 "+ result.Message);
|
error = result.Message;
|
return null;
|
}
|
if (result.Data == null)
|
{
|
IStation.LogHelper.Error("read tide from web 3 长江水位请求失败 " );
|
error = "长江水位请求失败";
|
return null;
|
}
|
|
benchmark = result.Data.Data.Benchmark;//= "在平均海面下213cm"
|
List<Model.TileLevel> list = new List<Model.TileLevel>(24);
|
list.Add(new Model.TileLevel()
|
{ Hour = 0 , Level = result.Data.SubData.a0 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 1, Level = result.Data.SubData.a1 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 2, Level = result.Data.SubData.a2 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 3, Level = result.Data.SubData.a3 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 4, Level = result.Data.SubData.a4 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 5, Level = result.Data.SubData.a5 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 6, Level = result.Data.SubData.a6 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 7, Level = result.Data.SubData.a7 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 8, Level = result.Data.SubData.a8 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 9, Level = result.Data.SubData.a9 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 10, Level = result.Data.SubData.a10 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 11, Level = result.Data.SubData.a11 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 12, Level = result.Data.SubData.a12 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 13, Level = result.Data.SubData.a13 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 14, Level = result.Data.SubData.a14 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 15, Level = result.Data.SubData.a15 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 16, Level = result.Data.SubData.a16 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 17, Level = result.Data.SubData.a17 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 18, Level = result.Data.SubData.a18 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 19, Level = result.Data.SubData.a19 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 20, Level = result.Data.SubData.a20 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 21, Level = result.Data.SubData.a21 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 22, Level = result.Data.SubData.a22 / 100 });
|
list.Add(new Model.TileLevel()
|
{ Hour = 23, Level = result.Data.SubData.a23 / 100 });
|
IStation.LogHelper.Info("read tide from web day: " + day +" success");
|
return list;
|
}
|
catch (Exception ex)
|
{
|
IStation.LogHelper.Error("read tide from web error:"+ ex);
|
error = ex.Message;
|
//IStation.Log
|
}
|
return null;
|
}
|
|
static private void SaveList(DateTime day, string benchmark, List<Model.TileLevel> list)
|
{
|
if (list == null)
|
return;
|
try
|
{
|
var folder = System.IO.Path.Combine(IStation.DataFolderHelper.GetRootPath(),
|
"Tide", "FromWeb",
|
day.Year.ToString(),
|
day.ToString("yyyy-MM"));
|
if (!System.IO.Directory.Exists(folder))
|
{
|
System.IO.Directory.CreateDirectory(folder);
|
|
}
|
var fileName = System.IO.Path.Combine(folder,
|
string.Format("{0}.csv", day.ToString("yyyy-MM-dd")));
|
|
|
StreamWriter streamWriter = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("gb2312"));
|
|
StringBuilder StringBuilder = new StringBuilder();
|
// 写出表头
|
StringBuilder.Append("总流量,长江水位差值");
|
//
|
StringBuilder.AppendLine(); StringBuilder.Append("benchmark,"); StringBuilder.Append(benchmark);
|
|
// 写出数据
|
foreach (var m in list)
|
{
|
StringBuilder.AppendLine(); StringBuilder.AppendFormat("{0},{1}", m.Hour, m.Level);
|
}
|
streamWriter.Write(StringBuilder.ToString());
|
|
streamWriter.Flush();
|
streamWriter.Close();
|
}
|
catch(Exception ex)
|
{
|
IStation.LogHelper.WriteError("write tide file error:"+ex.Message, ex);
|
return;
|
}
|
}
|
|
static private List<Model.TileLevel> ReadList(DateTime day,out string benchmark)
|
{
|
var list = new List<Model.TileLevel>();
|
benchmark = null;
|
var folder = System.IO.Path.Combine(IStation.DataFolderHelper.GetRootPath(),
|
"Tide", "FromWeb",
|
day.Year.ToString(),
|
day.ToString("yyyy-MM"));
|
if (!System.IO.Directory.Exists(folder))
|
{
|
System.IO.Directory.CreateDirectory(folder);
|
return null;
|
}
|
var fileName = System.IO.Path.Combine(folder,
|
string.Format("{0}.csv", day.ToString("yyyy-MM-dd")));
|
if (!System.IO.File.Exists(fileName))
|
{
|
return null;
|
}
|
//文件流读取
|
System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open);
|
System.IO.StreamReader sr = new System.IO.StreamReader(fs, Encoding.GetEncoding("gb2312"));
|
|
string tempText ;
|
int line = 0;
|
while ((tempText = sr.ReadLine()) != null)
|
{
|
line++;
|
string[] arr = tempText.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
|
//一般第一行为标题,所以取出来作为标头
|
if (line == 1)
|
{
|
|
}
|
else if (line == 2)
|
{
|
benchmark = arr[1];
|
}
|
else
|
{
|
list.Add(new Model.TileLevel(Convert.ToInt32(arr[0]), Convert.ToDouble(arr[1])));
|
}
|
}
|
|
//关闭流
|
sr.Close(); fs.Close();
|
|
return list;
|
}
|
|
//请求
|
private static string HttpRequest(string url, string type, string data = null )
|
{
|
ServicePointManager.Expect100Continue = true;
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
|
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
|
|
var request = (HttpWebRequest)WebRequest.Create(url);
|
request.Method = type;
|
request.ContentType = "application/json";
|
request.KeepAlive = false;
|
|
//if (version != null)
|
//{
|
// //默认是HttpVersion.Version11
|
// request.ProtocolVersion = version;
|
//}
|
|
#region 注释
|
/*request.Timeout = 10 * 1000;//请求超时时间
|
if (!string.IsNullOrEmpty(data))
|
{
|
request.ContentLength = Encoding.UTF8.GetBytes(data).Length;
|
}*/
|
#endregion
|
|
if (!string.IsNullOrEmpty(data))
|
{
|
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
|
{
|
streamWriter.Write(data);
|
streamWriter.Flush();
|
}
|
}
|
|
string responseText;
|
using (var response = (HttpWebResponse)request.GetResponse())
|
using (var reader = new StreamReader(response.GetResponseStream()))
|
{
|
responseText = reader.ReadToEnd();
|
}
|
return responseText;
|
}
|
|
|
}
|
}
|