You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1089 lines
51 KiB
C#
1089 lines
51 KiB
C#
using Arction.Wpf.ChartingMVVM.Maps;
|
|
using Arction.Wpf.ChartingMVVM.Views.ViewPolar;
|
|
using Arction.Wpf.ChartingMVVM;
|
|
using Newtonsoft.Json.Linq;
|
|
using Newtonsoft.Json;
|
|
using OxyPlot.Annotations;
|
|
using OxyPlot.Axes;
|
|
using OxyPlot;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Txgy.Microseismic.BaseLib.Models;
|
|
using Prism.Mvvm;
|
|
using Txgy.EWS.Client.FocalMechanism.Core;
|
|
using Txgy.EWS.Client.FocalMechanism.Model;
|
|
using Txgy.EWS.Client.Common;
|
|
using FmGrid = Txgy.EWS.Client.FocalMechanism.Model.FmGrid;
|
|
using FMStation = Txgy.EWS.Client.FocalMechanism.Model.FMStation;
|
|
using System.Windows.Threading;
|
|
using Prism.Events;
|
|
using Txgy.EWS.Client.IBLL;
|
|
using Unity;
|
|
using Txgy.EWS.Client.Common.MessageEvents;
|
|
using Txgy.EWS.Client.Entity;
|
|
|
|
namespace Txgy.EWS.Client.PageModule.ViewModels
|
|
{
|
|
public class FocalMechanismViewModel : BindableBase
|
|
{
|
|
Dispatcher _dispatcher;
|
|
IFreeSql fsqlTencent = FreeSqlTencent.tencentRemoteMySQL;
|
|
private readonly IEventAggregator _ea;
|
|
private readonly ISearchMsEventBLL searchMsEventBLL;
|
|
IFreeSql fsqlSqLite = FreeSqlLocalSqLite.freeLocalSqLite;
|
|
private string pageName= "震源机制页面";
|
|
|
|
public string PageName
|
|
{
|
|
get { return pageName; }
|
|
set
|
|
{
|
|
SetProperty(ref pageName, value);
|
|
}
|
|
}
|
|
|
|
|
|
private double _stationSize = 20;
|
|
public double StationSize
|
|
{
|
|
get { return _stationSize; }
|
|
set
|
|
{
|
|
SetProperty(ref _stationSize, value);
|
|
}
|
|
}
|
|
private System.Drawing.Color _stationColor;
|
|
public System.Drawing.Color StationColor
|
|
{
|
|
get { return _stationColor; }
|
|
set
|
|
{
|
|
SetProperty(ref _stationColor, value);
|
|
}
|
|
}
|
|
public OxyRect n1105Rect = new OxyRect(38398835.72, 4030097, 305.4, 2168);
|
|
public OxyRect n1100Rect = new OxyRect(38397556.72, 4029613, 328, 1397);
|
|
public OxyRect n1103Rect = new OxyRect(38398539.02, 4029605, 307, 1567);
|
|
|
|
private double _eAxisMin;
|
|
|
|
public double EAxisMin
|
|
{
|
|
get { return _eAxisMin; }
|
|
set
|
|
{
|
|
SetProperty(ref _eAxisMin, value);
|
|
}
|
|
}
|
|
private double _eAxisMax;
|
|
|
|
public double EAxisMax
|
|
{
|
|
get { return _eAxisMax; }
|
|
set
|
|
{
|
|
SetProperty(ref _eAxisMax, value);
|
|
}
|
|
}
|
|
private double _nAxisMin;
|
|
|
|
public double NAxisMin
|
|
{
|
|
get { return _nAxisMin; }
|
|
set
|
|
{
|
|
SetProperty(ref _nAxisMin, value);
|
|
}
|
|
}
|
|
private double _nAxisMax;
|
|
|
|
public double NAxisMax
|
|
{
|
|
get { return _nAxisMax; }
|
|
set
|
|
{
|
|
SetProperty(ref _nAxisMax, value);
|
|
}
|
|
}
|
|
public ProcessCore pCore { get; set; }
|
|
public Factory factory { get; set; }
|
|
public FMMap fmMap { get; set; }
|
|
public PlotModel PlotModel { get; set; }
|
|
public const int NumberOfItems = 10;
|
|
public int fontSize = 16;
|
|
private int _amplitudePointCount = 361;
|
|
|
|
public int AplitudePointCount
|
|
{
|
|
get { return _amplitudePointCount; }
|
|
set { _amplitudePointCount = value; }
|
|
}
|
|
private AxisPolarCollection _axisPolar;
|
|
|
|
public AxisPolarCollection AxisPolar
|
|
{
|
|
get { return _axisPolar; }
|
|
set
|
|
{
|
|
SetProperty(ref _axisPolar, value);
|
|
}
|
|
}
|
|
public FocalMechanismViewModel(IUnityContainer unityContainer, IEventAggregator ea, ISearchMsEventBLL searchMsEventBLL)
|
|
{
|
|
_dispatcher = unityContainer.Resolve<Dispatcher>();
|
|
this._ea = ea;
|
|
this.searchMsEventBLL = searchMsEventBLL;
|
|
EAxisMin = GlobalConfig.ProjectConfig.WorkArea.EMin;
|
|
EAxisMax = GlobalConfig.ProjectConfig.WorkArea.EMax;
|
|
NAxisMin = GlobalConfig.ProjectConfig.WorkArea.NMin;
|
|
NAxisMax = GlobalConfig.ProjectConfig.WorkArea.NMax;
|
|
this.PlotModel = new PlotModel();
|
|
this.PlotModel.Title = "震源机制";
|
|
var linearAxis1 = new LinearAxis();
|
|
linearAxis1.Minimum = 0;
|
|
linearAxis1.Maximum = EAxisMax - EAxisMin;
|
|
//linearAxis1.Minimum = -(EAxisMax - EAxisMin)/2;
|
|
//linearAxis1.Maximum = (EAxisMax - EAxisMin)/2;
|
|
linearAxis1.MajorGridlineColor = OxyColor.FromArgb(40, 0, 0, 139);
|
|
linearAxis1.MajorGridlineStyle = OxyPlot.LineStyle.Solid;
|
|
linearAxis1.MinorGridlineColor = OxyColor.FromArgb(20, 0, 0, 139);
|
|
linearAxis1.MinorGridlineStyle = OxyPlot.LineStyle.Solid;
|
|
linearAxis1.Position = AxisPosition.Bottom;
|
|
linearAxis1.Title = "X-axis";
|
|
this.PlotModel.Axes.Add(linearAxis1);
|
|
|
|
var linearAxis2 = new LinearAxis();
|
|
linearAxis2.Minimum = 0;
|
|
linearAxis2.Maximum = (NAxisMax - NAxisMin);
|
|
linearAxis2.MajorGridlineColor = OxyColor.FromArgb(40, 0, 0, 139);
|
|
linearAxis2.MajorGridlineStyle = OxyPlot.LineStyle.Solid;
|
|
linearAxis2.MinorGridlineColor = OxyColor.FromArgb(20, 0, 0, 139);
|
|
linearAxis2.MinorGridlineStyle = OxyPlot.LineStyle.Solid;
|
|
linearAxis2.Title = "Y-axis";
|
|
this.PlotModel.Axes.Add(linearAxis2);
|
|
SetFacotry(EAxisMax - EAxisMin, NAxisMax - NAxisMin, GlobalConfig.ProjectConfig.StationDic);
|
|
|
|
//this._ea.GetEvent<ShowWavesEvent>().Subscribe(u =>
|
|
//{
|
|
// MmEvent me;
|
|
// var lre = fsqlSqLite.Select<LocalRealtimeResultEntity>().Where(re => re.EventTime == u).First();
|
|
// if (lre == null)
|
|
// {
|
|
// //string courseSql = @"select * from " + GlobalConfig.UseResultTable + " where " + GlobalConfig.EventIDColName + "==@eid";
|
|
// var rre = this.searchMsEventBLL.GetEvent(u);
|
|
// if (rre != null)
|
|
// {
|
|
// me = new MmEvent();
|
|
// me.EventID = rre.EventID;
|
|
// me.EventTimeStr = rre.EventTimeStr;
|
|
// me.EventTime = rre.EventTime;
|
|
// me.X = rre.X;
|
|
// me.Y = rre.Y;
|
|
// me.Z = rre.Z;
|
|
// me.ML = rre.ML;
|
|
// me.LocSta = rre.LocSta;
|
|
// me.MLSta = rre.MLSta;
|
|
// me.Energy = rre.Energy;
|
|
// ShowEventFocalMechanism(me);
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// me = new MmEvent();
|
|
// me.EventID = lre.RTEventID;
|
|
// me.EventTimeStr = lre.EventTime;
|
|
// me.EventTime = DateTime.Parse(lre.EventTime);
|
|
// me.X = lre.Y;
|
|
// me.Y = lre.X;
|
|
// me.Z = lre.Z;
|
|
// me.ML = lre.ML;
|
|
// me.LocSta = lre.LocSta;
|
|
// me.MLSta = lre.MLSta;
|
|
// me.SetEnergy();
|
|
// ShowEventFocalMechanism(me);
|
|
// }
|
|
|
|
//});
|
|
}
|
|
public void SetFacotry(double XMax, double YMax, Dictionary<string, StationModel> StationDic)
|
|
{
|
|
FmGrid fmGrid = new FmGrid();
|
|
fmGrid.xmin = 0;
|
|
fmGrid.xmax = XMax;
|
|
fmGrid.ymin = 0;
|
|
fmGrid.ymax = YMax;
|
|
fmGrid.StationCount = StationDic.Count;
|
|
fmGrid.StationList = new List<FocalMechanism.Model.FMStation>();
|
|
int sc = 0;
|
|
foreach (var item in StationDic)
|
|
{
|
|
fmGrid.StationList.Add(new FMStation(sc, item.Key, XMax, YMax));
|
|
sc++;
|
|
}
|
|
fmGrid.initZeroCenter();
|
|
fmGrid.computeDistance();
|
|
pCore = new ProcessCore(fmGrid);
|
|
factory = new Factory(fmGrid);
|
|
}
|
|
private void ConverterData(object obj)
|
|
{
|
|
//AmplitudeSeries = _amplitudeModel.GenerateAmplitudeSeries(AplitudePointCount);
|
|
//OpenFileDialog ofd=new OpenFileDialog();
|
|
//ofd.Filter = "Mseed文件|*.mseed";
|
|
//if (ofd.ShowDialog()==true)
|
|
//{
|
|
// string path = Path.GetDirectoryName(ofd.FileName);
|
|
// string[] mseedFiles = Directory.GetFiles(path, "*.mseed");
|
|
// string ascPath = path + "\\txt";
|
|
// if (!Directory.Exists(ascPath))
|
|
// {
|
|
// Directory.CreateDirectory(ascPath);
|
|
// }
|
|
// for (int i = 0; i < mseedFiles.Length; i++)
|
|
// {
|
|
// string saveFn=Path.GetFileNameWithoutExtension(mseedFiles[i]) +".txt";
|
|
|
|
// Task.Factory.StartNew(() => {
|
|
// PublicConfig.MSeed2Asc(mseedFiles[i], ascPath + "\\" + saveFn);
|
|
// });
|
|
|
|
// Thread.Sleep(100);
|
|
// Console.WriteLine(i);
|
|
// }
|
|
// Dialog.Show(new TextDialog() { ShowText = "转换完成!" });
|
|
//}
|
|
}
|
|
private void CheckEventShowWave(MmEvent mmEvent)
|
|
{
|
|
string downLoadStr = mmEvent.EventTimeStr;
|
|
string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2);
|
|
string mseedStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2)
|
|
+ downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3)
|
|
+ downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString;
|
|
|
|
string mseedPath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\";
|
|
|
|
string savePath = GlobalConfig.ProjectConfig.TxtFilePath + "\\" + datePath + "\\" + mseedStr + ".txt";
|
|
if (!File.Exists(mseedPath + mseedStr + ".mseed"))
|
|
{
|
|
if (!Directory.Exists(mseedPath))
|
|
{
|
|
Directory.CreateDirectory(mseedPath);
|
|
}
|
|
this.searchMsEventBLL.DownLoadWavedata(downLoadStr, mseedPath, mseedStr, GlobalConfig.UseWaveDataTable);
|
|
if (!File.Exists(savePath))
|
|
{
|
|
if (!Directory.Exists(Path.GetDirectoryName(savePath)))
|
|
{
|
|
Directory.CreateDirectory(Path.GetDirectoryName(savePath));
|
|
}
|
|
//MSeed2Asc(mseedPath + mseedStr + ".mseed", savePath);
|
|
}
|
|
//Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "下载完成!" });
|
|
}
|
|
else
|
|
{
|
|
//if (!File.Exists(savePath))
|
|
//{
|
|
// if (!Directory.Exists(Path.GetDirectoryName(savePath)))
|
|
// {
|
|
// Directory.CreateDirectory(Path.GetDirectoryName(savePath));
|
|
// }
|
|
// MSeed2Asc(mseedPath + mseedStr + ".mseed", savePath);
|
|
//}
|
|
//Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "已存在!" });
|
|
}
|
|
}
|
|
private void ShowEventFocalMechanism(object obj)
|
|
{
|
|
double lineLen = 50;
|
|
double lineStep = 10;
|
|
FracturePoint r1 = new FracturePoint(0, 0);
|
|
FracturePoint r2 = new FracturePoint(0, 0);
|
|
this.PlotModel.Annotations.Clear();
|
|
MmEvent CurMmEvent = (MmEvent)obj;
|
|
CheckEventShowWave(CurMmEvent);
|
|
SetEventPhases(CurMmEvent);
|
|
//fmMap = CreateFM(CurMmEvent);
|
|
|
|
ComputeFM(CurMmEvent);
|
|
switch (CurMmEvent.FocalType)
|
|
{
|
|
case FocalMechanismType.strikeSlip:
|
|
FractureLine strikeSlipLine1 = new FractureLine();
|
|
strikeSlipLine1.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin));
|
|
strikeSlipLine1.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin));
|
|
r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p1, CurMmEvent.Direction);
|
|
r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p2, CurMmEvent.Direction);
|
|
|
|
strikeSlipLine1.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
strikeSlipLine1.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine1));
|
|
FractureLine strikeSlipLine2 = new FractureLine();
|
|
strikeSlipLine2.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin));
|
|
strikeSlipLine2.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin));
|
|
r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p1, CurMmEvent.Direction);
|
|
r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p2, CurMmEvent.Direction);
|
|
|
|
strikeSlipLine2.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
strikeSlipLine2.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine2));
|
|
break;
|
|
case FocalMechanismType.dipSlip:
|
|
FractureLine dipSlipLine = new FractureLine();
|
|
dipSlipLine.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - lineLen - NAxisMin));
|
|
dipSlipLine.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y + lineLen - NAxisMin));
|
|
r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), dipSlipLine.p1, CurMmEvent.Direction);
|
|
r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), dipSlipLine.p2, CurMmEvent.Direction);
|
|
|
|
dipSlipLine.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
dipSlipLine.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateDipSlipModel(dipSlipLine));
|
|
break;
|
|
case FocalMechanismType.tensile:
|
|
this.PlotModel.Annotations.Add(CreateTensileModel(CurMmEvent, EAxisMin, NAxisMin));
|
|
FractureLine tensileLine = new FractureLine();
|
|
tensileLine.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - lineLen - NAxisMin));
|
|
tensileLine.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y + lineLen - NAxisMin));
|
|
r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), tensileLine.p1, CurMmEvent.Direction);
|
|
r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), tensileLine.p2, CurMmEvent.Direction);
|
|
|
|
tensileLine.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
tensileLine.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateLineModel(tensileLine));
|
|
break;
|
|
case FocalMechanismType.unknown:
|
|
strikeSlipLine1 = new FractureLine();
|
|
strikeSlipLine1.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin));
|
|
strikeSlipLine1.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin));
|
|
r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p1, CurMmEvent.Direction);
|
|
r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p2, CurMmEvent.Direction);
|
|
|
|
strikeSlipLine1.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
strikeSlipLine1.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine1));
|
|
strikeSlipLine2 = new FractureLine();
|
|
strikeSlipLine2.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin));
|
|
strikeSlipLine2.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin));
|
|
r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p1, CurMmEvent.Direction);
|
|
r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p2, CurMmEvent.Direction);
|
|
|
|
strikeSlipLine2.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
strikeSlipLine2.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine2));
|
|
break;
|
|
default:
|
|
|
|
break;
|
|
}
|
|
CreateStationOxy(CurMmEvent);
|
|
//Console.WriteLine(r1.X.ToString() + "\t" + r1.Y.ToString() + "\t" + CurMmEvent.Direction.ToString());
|
|
//Console.WriteLine(r2.X.ToString() + "\t" + r2.Y.ToString() + "\t" + CurMmEvent.Direction.ToString());
|
|
this.PlotModel.InvalidatePlot(true);
|
|
}
|
|
public void ShowEventInfo()
|
|
{
|
|
|
|
//AllWaveDataList = PublicConfig.CreateWaveModelFromText(CurMmEvent.AsciiFile);
|
|
|
|
//this.PlotModel.Annotations.Clear();
|
|
//SetShowWaveModel(CurMmEvent);
|
|
//AmplitudeSeries = _amplitudeModel.GenerateAmplitudeSeries(showWaveDataList);
|
|
//AxisPolar = _amplitudeModel.GenerateAxes();
|
|
////Console.WriteLine(Math.Round(cm.DominantFreq, 3).ToString());
|
|
//PointLineSeries = _amplitudeModel.GenerateData(showWaveDataList);
|
|
//if (CurMmEvent == null)
|
|
//{
|
|
// System.Windows.Forms.MessageBox.Show("没有符合条件的数据");
|
|
// return;
|
|
//}
|
|
//CreateStationOxy(CurMmEvent);
|
|
//this.PlotModel.Annotations.Add(AddFocalMechaismModel(CurMmEvent));
|
|
//var arrowAnnotation1 = new ArrowAnnotation();
|
|
//arrowAnnotation1.Color = OxyColors.Green;
|
|
//arrowAnnotation1.StartPoint = new DataPoint(CurMmEvent.X - EAxisMin, CurMmEvent.Y - NAxisMin);
|
|
//arrowAnnotation1.EndPoint = new DataPoint(CurMmEvent.X - EAxisMin + 10, CurMmEvent.Y - NAxisMin + 10);
|
|
//arrowAnnotation1.Text = "StartPoint and EndPoint";
|
|
//this.PlotModel.Annotations.Add(arrowAnnotation1);
|
|
|
|
//var linearAxis1 = new LinearAxis();
|
|
//linearAxis1.Maximum = CurMmEvent.X-EAxisMin;
|
|
//linearAxis1.Minimum = CurMmEvent.Y - NAxisMax;
|
|
//linearAxis1.Position = AxisPosition.Bottom;
|
|
//this.PlotModel.Axes.Add(linearAxis1);
|
|
//计算震源机制数据
|
|
//fmMap = CreateFM(CurMmEvent);
|
|
//ComputeFM(fmMap);
|
|
this.PlotModel.InvalidatePlot(true);
|
|
}
|
|
/// <summary>
|
|
/// 以中心点旋转Angle角度
|
|
/// </summary>
|
|
/// <param name="origin">中心点</param>
|
|
/// <param name="reRotate">待旋转的点</param>
|
|
/// <param name="angle">旋转角度, 逆时针</param>
|
|
private PointF PointRotate(PointF origin, PointF rePoint, double angle)
|
|
{
|
|
float x = (float)((rePoint.X - origin.X) * Math.Cos(angle) - (rePoint.Y - origin.Y) * Math.Sin(angle) + origin.X);
|
|
float y = (float)((rePoint.X - origin.X) * Math.Sin(angle) + (rePoint.Y - origin.Y) * Math.Cos(angle) + origin.Y);
|
|
return new PointF(x, y);
|
|
}
|
|
private FracturePoint PointRotate(FracturePoint origin, FracturePoint rePoint, double angle)
|
|
{
|
|
FracturePoint rotatePoint = new FracturePoint();
|
|
double arc = angle * Math.PI / 180.0;
|
|
double x = (rePoint.X - origin.X) * Math.Cos(-arc) - (rePoint.Y - origin.Y) * Math.Sin(-arc) + origin.X;
|
|
double y = (rePoint.X - origin.X) * Math.Sin(-arc) + (rePoint.Y - origin.Y) * Math.Cos(-arc) + origin.Y;
|
|
|
|
rotatePoint.X = (float)x;
|
|
rotatePoint.Y = (float)y;
|
|
return rotatePoint;
|
|
}
|
|
|
|
public ComputationResult MmEventCalFocalMechanism(MmEvent mmEvent, double BaseX, double BaseY)
|
|
{
|
|
FMMap fmMap = new FMMap();
|
|
|
|
fmMap.X = mmEvent.X - BaseX;
|
|
fmMap.Y = mmEvent.Y - BaseY;
|
|
fmMap.R = mmEvent.RMS;
|
|
foreach (var item in mmEvent.Phases)
|
|
{
|
|
if (item.Value == -1)
|
|
{
|
|
fmMap.negStation.Add(item.Key);
|
|
}
|
|
else
|
|
{
|
|
fmMap.posStation.Add(item.Key);
|
|
}
|
|
}
|
|
//ComputationResult cr = pCore.ComputeResult(fmMap);
|
|
//if (cr == null)
|
|
// return null;
|
|
//return cr;
|
|
//mmEvent.FocalType = cr.FocalType;
|
|
//mmEvent.Direction = cr.Direction;
|
|
return null;
|
|
|
|
}
|
|
public void SetShowWaveModelFromSqLite(MmEvent cm)
|
|
{
|
|
//foreach (var item in cm.Phases)
|
|
//{
|
|
// WaveDataModel wdm = AllWaveDataList.Where(awd => awd.waveHeader.StationName
|
|
// == stationName && awd.waveHeader.Channel == "Z").First();
|
|
// DateTime dt = DateTime.Parse(phaseArr[i]["atime"].ToString());
|
|
// wdm.waveHeader.MaxValueIndex = PublicConfig.GetWaveMaxAmpIndex(wdm, dt);
|
|
// wdm.waveHeader.MaxValue = Math.Abs(wdm.Points[wdm.waveHeader.MaxValueIndex]);
|
|
// wdm.waveHeader.MaxAmp = WaveHeader.CalAmp(wdm.waveHeader.MaxValue, 4);
|
|
// wdm.waveHeader.ToEventDist = WaveHeader.CalDist(cm, stationName);
|
|
// wdm.mmEvent = cm;
|
|
// StationModel sm = PublicConfig.ProjectConfig.StationDic.First(sd => sd.Key == stationName).Value;
|
|
// PointF p1 = new PointF((float)cm.X, (float)cm.Y);
|
|
// PointF p2 = new PointF((float)sm.E, (float)sm.N);
|
|
// double angleOfLine = WaveHeader.PointsAngleTool(p1, p2);
|
|
// double realAngle = 0;
|
|
// if (angleOfLine > 0 && angleOfLine <= 90)//右
|
|
// {
|
|
// realAngle = 90 - angleOfLine;
|
|
// }
|
|
// else if (angleOfLine > 90 && angleOfLine <= 180)//左
|
|
// {
|
|
// realAngle = 450 - angleOfLine;
|
|
// }
|
|
// else if (angleOfLine >= -180 && angleOfLine <= 0)//上
|
|
// {
|
|
// realAngle = 90 - angleOfLine;
|
|
// }
|
|
|
|
// wdm.waveHeader.ToEventAngle = (int)realAngle;
|
|
// //Console.WriteLine(wdm.waveHeader.ToEventAngle);
|
|
// showWaveDataList.Add(wdm);
|
|
//}
|
|
|
|
}
|
|
|
|
public void SetShowWaveModel(MmEvent cm)
|
|
{
|
|
//using (StreamReader sr = System.IO.File.OpenText(cm.JsonFile))
|
|
//{
|
|
// JsonTextReader reader = new JsonTextReader(sr);
|
|
// JArray jArray = (JArray)JToken.ReadFrom(reader);
|
|
|
|
// JObject jobj = (JObject)jArray[0];
|
|
// JArray phaseArr = JArray.FromObject(jobj["phases"]);
|
|
// showWaveDataList = new List<WaveDataModel>();
|
|
// for (int i = 0; i < phaseArr.Count; i++)
|
|
// {
|
|
// if (phaseArr[i]["first_motion_direct"] != null)
|
|
// {
|
|
|
|
// string stationName = phaseArr[i]["id"].ToString().Substring(3, 3);
|
|
// WaveDataModel wdm = AllWaveDataList.Where(awd => awd.waveHeader.StationName
|
|
// == stationName && awd.waveHeader.Channel == "Z").First();
|
|
// DateTime dt = DateTime.Parse(phaseArr[i]["atime"].ToString());
|
|
// wdm.waveHeader.MaxValueIndex = PublicConfig.GetWaveMaxAmpIndex(wdm, dt);
|
|
// wdm.waveHeader.MaxValue = Math.Abs(wdm.Points[wdm.waveHeader.MaxValueIndex]);
|
|
// wdm.waveHeader.MaxAmp = WaveHeader.CalAmp(wdm.waveHeader.MaxValue, 4);
|
|
// wdm.waveHeader.ToEventDist = WaveHeader.CalDist(cm, stationName);
|
|
// wdm.mmEvent = cm;
|
|
// StationModel sm = PublicConfig.ProjectConfig.StationDic.First(sd => sd.Key == stationName).Value;
|
|
// PointF p1 = new PointF((float)cm.X, (float)cm.Y);
|
|
// PointF p2 = new PointF((float)sm.E, (float)sm.N);
|
|
// double angleOfLine = WaveHeader.PointsAngleTool(p1, p2);
|
|
// double realAngle = 0;
|
|
// if (angleOfLine > 0 && angleOfLine <= 90)//右
|
|
// {
|
|
// realAngle = 90 - angleOfLine;
|
|
// }
|
|
// else if (angleOfLine > 90 && angleOfLine <= 180)//左
|
|
// {
|
|
// realAngle = 450 - angleOfLine;
|
|
// }
|
|
// else if (angleOfLine >= -180 && angleOfLine <= 0)//上
|
|
// {
|
|
// realAngle = 90 - angleOfLine;
|
|
// }
|
|
|
|
// wdm.waveHeader.ToEventAngle = (int)realAngle;
|
|
// //Console.WriteLine(wdm.waveHeader.ToEventAngle);
|
|
// showWaveDataList.Add(wdm);
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
}
|
|
public void CreateStationOxy(MmEvent cm)
|
|
{
|
|
#region oxyplot
|
|
//this.PlotModel.Annotations.Clear();
|
|
RectangleAnnotation fra1100 = new RectangleAnnotation();
|
|
fra1100.MinimumX = n1100Rect.Left - EAxisMin;
|
|
fra1100.MaximumX = n1100Rect.Right - EAxisMin;
|
|
fra1100.MinimumY = n1100Rect.Bottom - NAxisMin;
|
|
fra1100.MaximumY = n1100Rect.Top - NAxisMin;
|
|
fra1100.Fill = OxyColor.FromArgb(0, 0, 0, 0);
|
|
//zra.Fill = OxyColor.FromArgb(99, 0, 0, 255);
|
|
fra1100.StrokeThickness = 2;
|
|
fra1100.Stroke = OxyColor.FromArgb(255, 255, 0, 255);
|
|
fra1100.Text = "N1100";
|
|
|
|
//zra.TextRotation = 10;
|
|
this.PlotModel.Annotations.Add(fra1100);
|
|
|
|
RectangleAnnotation fra1103 = new RectangleAnnotation();
|
|
fra1103.MinimumX = n1103Rect.Left - EAxisMin;
|
|
fra1103.MaximumX = n1103Rect.Right - EAxisMin;
|
|
fra1103.MinimumY = n1103Rect.Bottom - NAxisMin;
|
|
fra1103.MaximumY = n1103Rect.Top - NAxisMin;
|
|
fra1103.Fill = OxyColor.FromArgb(0, 0, 0, 0);
|
|
//zra.Fill = OxyColor.FromArgb(99, 0, 0, 255);
|
|
fra1103.StrokeThickness = 2;
|
|
fra1103.Stroke = OxyColor.FromArgb(255, 255, 0, 255);
|
|
fra1103.Text = "N1103";
|
|
|
|
//zra.TextRotation = 10;
|
|
this.PlotModel.Annotations.Add(fra1103);
|
|
|
|
|
|
this.PlotModel.Annotations.Add(CreateEventModelOxy(cm));
|
|
|
|
foreach (var item in cm.Phases)
|
|
{
|
|
StationModel sm;
|
|
var stationDic = GlobalConfig.ProjectConfig.StationDic.Where(sd => sd.Key == item.Key.ToUpper());
|
|
if (stationDic.Count() > 0)
|
|
{
|
|
sm = stationDic.First().Value;
|
|
if (item.Value > 0)
|
|
{
|
|
this.PlotModel.Annotations.Add(CreatePolygon(sm.Name, sm.E - EAxisMin, sm.N - NAxisMin, StationSize, OxyColors.Red));
|
|
}
|
|
else
|
|
{
|
|
this.PlotModel.Annotations.Add(CreatePolygon(sm.Name, sm.E - EAxisMin, sm.N - NAxisMin, StationSize, OxyColors.Transparent));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#endregion
|
|
}
|
|
public void CreateStationLv(MmEvent cm)
|
|
{
|
|
#region livechart
|
|
|
|
#endregion
|
|
}
|
|
/// <summary>
|
|
/// LiveCharts
|
|
/// </summary>
|
|
/// <param name="o"></param>
|
|
public void ShowStationLv(object o)
|
|
{
|
|
|
|
|
|
}
|
|
public EllipseAnnotation CreateEventModelOxy(MmEvent mm)
|
|
{
|
|
var ellipseAnnotation1 = new EllipseAnnotation();
|
|
ellipseAnnotation1.X = mm.X - EAxisMin;
|
|
ellipseAnnotation1.Y = mm.Y - NAxisMin;
|
|
ellipseAnnotation1.Width = StationSize;
|
|
ellipseAnnotation1.Height = StationSize;
|
|
ellipseAnnotation1.Fill = OxyColor.FromArgb(255, 0, 128, 0);
|
|
return ellipseAnnotation1;
|
|
}
|
|
public PolygonAnnotation CreatePolygon(string text, double x, double y, double size, OxyColor color)
|
|
{
|
|
PolygonAnnotation pa = new PolygonAnnotation();
|
|
pa.Text = text.Substring(1);
|
|
pa.TextPosition = new DataPoint(x, y);
|
|
pa.TextHorizontalAlignment = OxyPlot.HorizontalAlignment.Center;
|
|
pa.TextVerticalAlignment = OxyPlot.VerticalAlignment.Middle;
|
|
pa.FontSize = size * 0.7;
|
|
pa.Font = "Arail";
|
|
pa.Fill = color;
|
|
pa.StrokeThickness = 2;
|
|
pa.Stroke = OxyColors.Black;
|
|
pa.Points.Add(new DataPoint(x - size, y - size));
|
|
pa.Points.Add(new DataPoint(x + size, y - size));
|
|
pa.Points.Add(new DataPoint(x + size, y + size));
|
|
pa.Points.Add(new DataPoint(x - size, y + size));
|
|
return pa;
|
|
}
|
|
public PolygonAnnotation AddFocalMechaismModel(MmEvent mmEvent)
|
|
{
|
|
double x = mmEvent.X - EAxisMin;
|
|
double y = mmEvent.Y - NAxisMin;
|
|
double angle = mmEvent.Direction;
|
|
double major = 50;
|
|
double minor = 30;
|
|
return GeneratePolygonAsEllipse(x, y, angle, major, minor);
|
|
}
|
|
private PolygonAnnotation GeneratePolygonAsEllipse(double xCenter, double yCenter, double AngleOfRotation, double MajorAxisLength, double MinorAxisLength)
|
|
{
|
|
PolygonAnnotation polygonAnnotation = new PolygonAnnotation();
|
|
polygonAnnotation.Fill = OxyColor.FromArgb(0, 0, 0, 0);
|
|
polygonAnnotation.Stroke = OxyColors.Blue;
|
|
polygonAnnotation.StrokeThickness = 2;
|
|
double step = 2 * Math.PI / 200;
|
|
var h = xCenter;
|
|
var k = yCenter;
|
|
var rotation = AngleOfRotation;
|
|
var a = MajorAxisLength;
|
|
var b = MinorAxisLength;
|
|
for (double theta = 0; theta < 2 * Math.PI; theta += step)
|
|
{
|
|
var x = a * Math.Cos(rotation) * Math.Cos(theta) + b * Math.Sin(rotation) * Math.Sin(theta) + h;
|
|
var y = b * Math.Cos(rotation) * Math.Sin(theta) + a * Math.Sin(rotation) * Math.Cos(theta) + k;
|
|
polygonAnnotation.Points.Add(new DataPoint(x, y));
|
|
}
|
|
return polygonAnnotation;
|
|
}
|
|
|
|
public void DrawStrikeSlip(MmEvent CurMmEvent)
|
|
{
|
|
FractureLine strikeSlipLine1 = new FractureLine();
|
|
strikeSlipLine1.p1 = new FracturePoint((float)((float)CurMmEvent.X + 2), (float)(CurMmEvent.Y - 10));
|
|
strikeSlipLine1.p2 = new FracturePoint((float)((float)CurMmEvent.X + 2), (float)(CurMmEvent.Y + 10));
|
|
FracturePoint r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X), (float)(CurMmEvent.Y)), strikeSlipLine1.p1, CurMmEvent.Direction);
|
|
FracturePoint r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X), (float)(CurMmEvent.Y)), strikeSlipLine1.p2, CurMmEvent.Direction);
|
|
|
|
strikeSlipLine1.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
strikeSlipLine1.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine1));
|
|
FractureLine strikeSlipLine2 = new FractureLine();
|
|
strikeSlipLine2.p1 = new FracturePoint((float)((float)CurMmEvent.X - 2), (float)(CurMmEvent.Y - 10));
|
|
strikeSlipLine2.p2 = new FracturePoint((float)((float)CurMmEvent.X - 2), (float)(CurMmEvent.Y + 10));
|
|
r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X), (float)(CurMmEvent.Y)), strikeSlipLine2.p1, CurMmEvent.Direction);
|
|
r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X), (float)(CurMmEvent.Y)), strikeSlipLine2.p2, CurMmEvent.Direction);
|
|
|
|
strikeSlipLine2.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y));
|
|
strikeSlipLine2.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y));
|
|
this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine2));
|
|
}
|
|
/// <summary>
|
|
/// 绘制走滑模型,黑色双线
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public LineAnnotation CreateStrikeSlipModel(FractureLine fractureLine)
|
|
{
|
|
double slope = (fractureLine.p2.Y - fractureLine.p1.Y) / (fractureLine.p2.X - fractureLine.p1.X);
|
|
if (slope == 0)
|
|
{
|
|
slope = 0.5;
|
|
}
|
|
//Console.WriteLine(slope);
|
|
double intercept = fractureLine.p2.Y - slope * fractureLine.p2.X;
|
|
//Console.WriteLine(intercept);
|
|
LineAnnotation lineAnnotation = new LineAnnotation();
|
|
var linearAxis1 = new LinearAxis();
|
|
//Y截距
|
|
lineAnnotation.Intercept = intercept;
|
|
//斜率
|
|
lineAnnotation.Slope = slope;
|
|
lineAnnotation.Color = OxyColors.Black;
|
|
lineAnnotation.MaximumX = fractureLine.p2.X;
|
|
lineAnnotation.MinimumX = fractureLine.p1.X;
|
|
lineAnnotation.LineStyle = OxyPlot.LineStyle.Solid;
|
|
lineAnnotation.StrokeThickness = 2;
|
|
//lineAnnotation.Text = "Second";
|
|
return lineAnnotation;
|
|
}
|
|
public LineAnnotation CreateDipSlipModel(FractureLine fractureLine)
|
|
{
|
|
double slope = (fractureLine.p2.Y - fractureLine.p1.Y) / (fractureLine.p2.X - fractureLine.p1.X);
|
|
if (slope == 0)
|
|
{
|
|
slope = 0.5;
|
|
}
|
|
//Console.WriteLine(slope);
|
|
double intercept = fractureLine.p2.Y - slope * fractureLine.p2.X;
|
|
//Console.WriteLine(intercept);
|
|
LineAnnotation lineAnnotation = new LineAnnotation();
|
|
var linearAxis1 = new LinearAxis();
|
|
//Y截距
|
|
lineAnnotation.Intercept = intercept;
|
|
//斜率
|
|
lineAnnotation.Slope = slope;
|
|
lineAnnotation.Color = OxyColors.Blue;
|
|
lineAnnotation.MaximumX = fractureLine.p2.X;
|
|
lineAnnotation.MinimumX = fractureLine.p1.X;
|
|
lineAnnotation.LineStyle = OxyPlot.LineStyle.Solid;
|
|
lineAnnotation.StrokeThickness = 2;
|
|
//lineAnnotation.Text = "Second";
|
|
return lineAnnotation;
|
|
}
|
|
public EllipseAnnotation CreateTensileModel(MmEvent mmEvent, double baseX, double baseY)
|
|
{
|
|
EllipseAnnotation ellipseAnnotation = new EllipseAnnotation();
|
|
ellipseAnnotation.X = mmEvent.X - baseX;
|
|
ellipseAnnotation.Y = mmEvent.Y - baseY;
|
|
ellipseAnnotation.StrokeThickness = 2;
|
|
ellipseAnnotation.Stroke = OxyColors.Red;
|
|
ellipseAnnotation.Fill = OxyColor.FromArgb(0, 0, 0, 0);
|
|
ellipseAnnotation.Width = 10;
|
|
ellipseAnnotation.Height = 10;
|
|
return ellipseAnnotation;
|
|
}
|
|
private LineAnnotation CreateLineModel(FractureLine fractureLine)
|
|
{
|
|
double slope = (fractureLine.p2.Y - fractureLine.p1.Y) / (fractureLine.p2.X - fractureLine.p1.X);
|
|
if (slope == 0)
|
|
{
|
|
slope = 0.5;
|
|
}
|
|
//Console.WriteLine(slope);
|
|
double intercept = fractureLine.p2.Y - slope * fractureLine.p2.X;
|
|
//Console.WriteLine(intercept);
|
|
LineAnnotation lineAnnotation = new LineAnnotation();
|
|
var linearAxis1 = new LinearAxis();
|
|
//Y截距
|
|
lineAnnotation.Intercept = intercept;
|
|
//斜率
|
|
lineAnnotation.Slope = slope;
|
|
lineAnnotation.Color = OxyColors.Red;
|
|
lineAnnotation.MaximumX = fractureLine.p2.X;
|
|
lineAnnotation.MinimumX = fractureLine.p1.X;
|
|
lineAnnotation.LineStyle = OxyPlot.LineStyle.Solid;
|
|
lineAnnotation.StrokeThickness = 2;
|
|
//lineAnnotation.Text = "Second";
|
|
return lineAnnotation;
|
|
}
|
|
public void SetEventPhases(MmEvent mmEvent)
|
|
{
|
|
string downLoadStr = mmEvent.EventTimeStr;
|
|
string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2);
|
|
string jsonStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2)
|
|
+ downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3)
|
|
+ downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01"+GlobalConfig.DataTypeString+".json";
|
|
string jsonFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\" + jsonStr;
|
|
if (File.Exists(jsonFilePath))
|
|
{
|
|
using (StreamReader sr = System.IO.File.OpenText(jsonFilePath))
|
|
{
|
|
mmEvent.JsonFile = jsonFilePath;
|
|
|
|
JsonTextReader reader = new JsonTextReader(sr);
|
|
JArray jArray = (JArray)JToken.ReadFrom(reader);
|
|
//解析普通属性和数组混合的Json文件
|
|
//数组0是普通属性集合
|
|
JObject jobj = (JObject)jArray[0];
|
|
mmEvent.SetEnergy();
|
|
mmEvent.DominantFreq = 15;
|
|
mmEvent.Phases = new Dictionary<string, int>();
|
|
List<double> DominantFreqlist = new List<double>();
|
|
JArray phaseArr = JArray.FromObject(jobj["phases"]);
|
|
List<double> DominantFreqList = new List<double>();
|
|
for (int i = 0; i < phaseArr.Count; i++)
|
|
{
|
|
if (phaseArr[i]["first_motion_direct"] != null)
|
|
{
|
|
mmEvent.Phases.Add(phaseArr[i]["id"].ToString().Substring(3, 3),
|
|
int.Parse(phaseArr[i]["first_motion_direct"].ToString()));
|
|
}
|
|
if (phaseArr[i]["fmd_semi_period"] != null)
|
|
{
|
|
DominantFreqlist.Add(double.Parse(phaseArr[i]["fmd_semi_period"].ToString()));
|
|
}
|
|
}
|
|
if (DominantFreqlist.Count > 0)
|
|
{
|
|
if (DominantFreqlist.Count > 3)
|
|
{
|
|
double min = DominantFreqlist.Min();
|
|
double max = DominantFreqlist.Max();
|
|
DominantFreqlist.Remove(min);
|
|
DominantFreqlist.Remove(max);
|
|
mmEvent.DominantFreq = DominantFreqlist.Sum() / (double)DominantFreqlist.Count;
|
|
}
|
|
else
|
|
{
|
|
mmEvent.DominantFreq = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
public MmEvent Json2MmEvent(string jsonFile)
|
|
{
|
|
using (StreamReader sr = System.IO.File.OpenText(jsonFile))
|
|
{
|
|
MmEvent mmEvent = new MmEvent();
|
|
mmEvent.JsonFile = jsonFile;
|
|
string filePath = System.IO.Path.GetDirectoryName(jsonFile);
|
|
string fileName = System.IO.Path.GetFileNameWithoutExtension(jsonFile).TrimEnd('B').TrimEnd('A');
|
|
string ascName = filePath + "\\" + fileName + ".txt";
|
|
mmEvent.AsciiFile = ascName;
|
|
JsonTextReader reader = new JsonTextReader(sr);
|
|
JArray jArray = (JArray)JToken.ReadFrom(reader);
|
|
//解析普通属性和数组混合的Json文件
|
|
//数组0是普通属性集合
|
|
JObject jobj = (JObject)jArray[0];
|
|
string dateStr = jobj["otime"].ToString();
|
|
mmEvent.EventTime = DateTime.Parse(dateStr);
|
|
mmEvent.EventTimeStr = dateStr;
|
|
mmEvent.X = double.Parse(jobj["lon"].ToString());
|
|
mmEvent.Y = double.Parse(jobj["lat"].ToString());
|
|
mmEvent.Z = double.Parse(jobj["depth"].ToString());
|
|
mmEvent.ML = double.Parse(jobj["ml"].ToString());
|
|
mmEvent.RMS = double.Parse(jobj["rms"].ToString());
|
|
mmEvent.SetEnergy();
|
|
mmEvent.DominantFreq = 15;
|
|
mmEvent.Phases = new Dictionary<string, int>();
|
|
List<double> DominantFreqlist = new List<double>();
|
|
JArray phaseArr = JArray.FromObject(jobj["phases"]);
|
|
List<double> DominantFreqList = new List<double>();
|
|
for (int i = 0; i < phaseArr.Count; i++)
|
|
{
|
|
if (phaseArr[i]["first_motion_direct"] != null)
|
|
{
|
|
mmEvent.Phases.Add(phaseArr[i]["id"].ToString().Substring(3, 3),
|
|
int.Parse(phaseArr[i]["first_motion_direct"].ToString()));
|
|
}
|
|
if (phaseArr[i]["fmd_semi_period"] != null)
|
|
{
|
|
DominantFreqlist.Add(double.Parse(phaseArr[i]["fmd_semi_period"].ToString()));
|
|
}
|
|
}
|
|
if (DominantFreqlist.Count > 0)
|
|
{
|
|
if (DominantFreqlist.Count > 3)
|
|
{
|
|
double min = DominantFreqlist.Min();
|
|
double max = DominantFreqlist.Max();
|
|
DominantFreqlist.Remove(min);
|
|
DominantFreqlist.Remove(max);
|
|
mmEvent.DominantFreq = DominantFreqlist.Sum() / (double)DominantFreqlist.Count;
|
|
}
|
|
else
|
|
{
|
|
mmEvent.DominantFreq = 0;
|
|
}
|
|
}
|
|
return mmEvent;
|
|
}
|
|
//return null;
|
|
}
|
|
public MmEvent Json2MmEventWithPara(string jsonFile)
|
|
{
|
|
using (StreamReader sr = System.IO.File.OpenText(jsonFile))
|
|
{
|
|
MmEvent mmEvent = new MmEvent();
|
|
mmEvent.JsonFile = jsonFile;
|
|
string filePath = System.IO.Path.GetDirectoryName(jsonFile);
|
|
string fileName = System.IO.Path.GetFileNameWithoutExtension(jsonFile).TrimEnd('B').TrimEnd('A');
|
|
//fileName=fileName.TrimEnd('B');
|
|
//fileName.TrimEnd('A');
|
|
string ascName = filePath + "\\" + fileName + ".txt";
|
|
mmEvent.AsciiFile = ascName;
|
|
JsonTextReader reader = new JsonTextReader(sr);
|
|
JArray jArray = (JArray)JToken.ReadFrom(reader);
|
|
//解析普通属性和数组混合的Json文件
|
|
//数组0是普通属性集合
|
|
JObject jobj = (JObject)jArray[0];
|
|
string dateStr = jobj["otime"].ToString();
|
|
//LocalSqLiteServerAccess localSqLiteServerAccess = new LocalSqLiteServerAccess();
|
|
//int selectResult = localSqLiteServerAccess.SelectWithTime(dateStr);
|
|
int selectResult = 1;
|
|
if (selectResult < 1)
|
|
{
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
mmEvent.Phases = new Dictionary<string, int>();
|
|
List<double> Semiperiodlist = new List<double>();
|
|
JArray phaseArr = JArray.FromObject(jobj["phases"]);
|
|
List<double> DominantFreqList = new List<double>();
|
|
for (int i = 0; i < phaseArr.Count; i++)
|
|
{
|
|
if (phaseArr[i]["first_motion_direct"] != null)
|
|
{
|
|
mmEvent.Phases.Add(phaseArr[i]["id"].ToString().Substring(3, 3),
|
|
int.Parse(phaseArr[i]["first_motion_direct"].ToString()));
|
|
}
|
|
if (phaseArr[i]["fmd_semi_period"] != null)
|
|
{
|
|
Semiperiodlist.Add(double.Parse(phaseArr[i]["fmd_semi_period"].ToString()));
|
|
}
|
|
}
|
|
if (Semiperiodlist.Count > 0)
|
|
{
|
|
if (Semiperiodlist.Count > 3)
|
|
{
|
|
double min = Semiperiodlist.Min();
|
|
double max = Semiperiodlist.Max();
|
|
Semiperiodlist.Remove(min);
|
|
Semiperiodlist.Remove(max);
|
|
mmEvent.DominantFreq = Semiperiodlist.Sum() / (double)Semiperiodlist.Count;
|
|
}
|
|
else
|
|
{
|
|
mmEvent.DominantFreq = 0;
|
|
}
|
|
}
|
|
JArray ampsArr = JArray.FromObject(jobj["amps"]);
|
|
List<float> ampsArrList = new List<float>();
|
|
for (int i = 0; i < ampsArr.Count; i++)
|
|
{
|
|
if (ampsArr[i]["amp"] != null)
|
|
{
|
|
ampsArrList.Add(float.Parse(ampsArr[i]["amp"].ToString()));
|
|
}
|
|
}
|
|
MmEvent.SetAmp(ampsArrList);
|
|
return mmEvent;
|
|
}
|
|
}
|
|
}
|
|
public FMMap CreateFM(MmEvent mmEvent, double BaseX, double BaseY)
|
|
{
|
|
FMMap fmMap = new FMMap();
|
|
fmMap.X = mmEvent.X - BaseX;
|
|
fmMap.Y = mmEvent.Y - BaseY;
|
|
fmMap.R = mmEvent.RMS;
|
|
foreach (var item in mmEvent.Phases)
|
|
{
|
|
if (item.Value == -1)
|
|
{
|
|
fmMap.negStation.Add(item.Key);
|
|
}
|
|
else
|
|
{
|
|
fmMap.posStation.Add(item.Key);
|
|
}
|
|
}
|
|
return fmMap;
|
|
}
|
|
public PolygonAnnotation CreateStationModel(StationModel sm)
|
|
{
|
|
PolygonAnnotation pa = new PolygonAnnotation();
|
|
OxyColor oxyColor = OxyColor.FromArgb(StationColor.A, StationColor.R,
|
|
StationColor.G, StationColor.B);
|
|
pa.Text = sm.Name;
|
|
pa.TextPosition = new DataPoint(sm.E, sm.N);
|
|
pa.TextHorizontalAlignment = OxyPlot.HorizontalAlignment.Center;
|
|
pa.TextVerticalAlignment = OxyPlot.VerticalAlignment.Middle;
|
|
pa.FontSize = StationSize * 1.5;
|
|
pa.Font = "Arail";
|
|
pa.Fill = oxyColor;
|
|
pa.StrokeThickness = 2;
|
|
pa.Stroke = OxyColors.Black;
|
|
pa.Points.Add(new DataPoint(sm.E - StationSize, sm.N - StationSize));
|
|
pa.Points.Add(new DataPoint(sm.E + StationSize, sm.N - StationSize));
|
|
pa.Points.Add(new DataPoint(sm.E + StationSize, sm.N + StationSize));
|
|
pa.Points.Add(new DataPoint(sm.E - StationSize, sm.N + StationSize));
|
|
return pa;
|
|
}
|
|
public void ComputeFM(MmEvent mmEvent)
|
|
{
|
|
//fmMap = CreateFM(mmEvent, GlobalConfig.ProjectConfig.WorkArea.EMin, GlobalConfig.ProjectConfig.WorkArea.NMin);
|
|
//ComputationResult cr = pCore.ComputeResult(fmMap);
|
|
//if (cr == null)
|
|
// return;
|
|
//mmEvent.FocalType = cr.FocalType;
|
|
//mmEvent.Direction = cr.Direction;
|
|
}
|
|
//public ComputationResult MmEventCalFocalMechanism(MmEvent mmEvent)
|
|
//{
|
|
// FMMap fmMap = new FMMap();
|
|
// fmMap.X = mmEvent.X;
|
|
// fmMap.Y = mmEvent.Y;
|
|
// fmMap.R = mmEvent.RMS;
|
|
// foreach (var item in mmEvent.Phases)
|
|
// {
|
|
// if (item.Value == -1)
|
|
// {
|
|
// fmMap.negStation.Add(item.Key);
|
|
// }
|
|
// else
|
|
// {
|
|
// fmMap.posStation.Add(item.Key);
|
|
// }
|
|
// }
|
|
// ComputationResult cr = pCore.ComputeResult(fmMap);
|
|
// if (cr == null)
|
|
// return null;
|
|
// return cr;
|
|
// //mmEvent.FocalType = cr.FocalType;
|
|
// //mmEvent.Direction = cr.Direction;
|
|
|
|
//}
|
|
public void UpdateFocalMechanismWithSourceParaDirection(object o)
|
|
{
|
|
//if (ShowEvents != null)
|
|
//{
|
|
// int cnt = 0;
|
|
// foreach (var item in ShowEvents)
|
|
// {
|
|
|
|
// ComputationResult cr = MmEventCalFocalMechanism(item, GlobalConfig.ProjectConfig.WorkArea.EMin
|
|
// , GlobalConfig.ProjectConfig.WorkArea.NMin);
|
|
// if (cr != null)
|
|
// {
|
|
// item.FocalType = cr.FocalType;
|
|
// item.Direction = cr.Direction;
|
|
// //localSqLiteServerAccess.UpdataFocalMechanism(item);
|
|
// Console.WriteLine($"{++cnt}/{ShowEvents.Count}");
|
|
// }
|
|
// }
|
|
// System.Windows.Forms.MessageBox.Show("完成!");
|
|
//}
|
|
//else
|
|
//{
|
|
// System.Windows.Forms.MessageBox.Show("没有数据!");
|
|
//}
|
|
|
|
}
|
|
}
|
|
}
|