/// <summary> /// 生成占用度和最大值、均值数据 /// </summary> /// <param name="dicFreqStatModel">原始数据分析后统计数据</param> /// <param name="bandwidth"></param> private void ctrlStatDataForAll(Dictionary <double, FreqStatModel> dicFreqStatModel, FreqNavBar freqNavBar) { var listCreat = GetAnalysList(decimal.Parse(freqNavBar.FreqStart), decimal.Parse(freqNavBar.FreqStop), decimal.Parse(freqNavBar.BandWidth) / 1000); ChartSeriesPoints csps = new ChartSeriesPoints(); List <AnalysisResult> freqOccupancyDegreeDic = new List <AnalysisResult>(); int signalLimit = string.IsNullOrEmpty(freqNavBar.SignalLimit) ? 45 : Convert.ToInt16(freqNavBar.SignalLimit); int occuDegreeLimit = string.IsNullOrEmpty(freqNavBar.OccuDegreeLimit) ? 90 : Convert.ToInt16(freqNavBar.OccuDegreeLimit); if (listCreat != null) { PointPairList occupyValues = new PointPairList(); foreach (var item in listCreat) { double trueFreq = item.Frequency; double tempFreq; int occupyValueCount = 0; var list = dicFreqStatModel.Where((obj) => obj.Key >= item.StartFreq * 1000 && obj.Key < item.EndFreq * 1000).ToList(); List <AnalysisResult> tmpList = new List <AnalysisResult>(); PointPairList tmpOccupyValues = new PointPairList(); foreach (KeyValuePair <double, FreqStatModel> kvp in list) { PointPair spOccupy = new PointPair(); tempFreq = kvp.Key; int overSignalLimit = kvp.Value.DicAmplitudeCount.Where(x => x.Key > signalLimit).Select(x => x.Value).Sum(); int sum = kvp.Value.DicAmplitudeCount.Values.Sum(); double occpy = ((double)overSignalLimit / (double)sum) * 100; double maxValue = kvp.Value.DicAmplitudeCount.Keys.Max(); double AverageValue = kvp.Value.DicAmplitudeCount.Select(x => x.Key).Average(); spOccupy.X = tempFreq / 1000; spOccupy.Y = Convert.ToInt16(occpy); AnalysisResult tmpItem = Mapper <AnalysisResult, AnalysisResult>(item); tmpItem.Occupy = Convert.ToInt16(occpy); tmpItem.AmplitudeMidValue = Convert.ToInt16(AverageValue); tmpItem.AmplitudeMaxValue = Convert.ToInt16(maxValue); //如果不是第一次 if (occupyValueCount >= 1) { //如果占用度列表的上一个频率 + 带宽大于等于当前频率 if (tmpOccupyValues[occupyValueCount - 1].X + Convert.ToDouble(freqNavBar.BandWidth) / 1000 >= tempFreq / 1000) { //如果占用度列表的上一个占用度小于当前占用度 if (tmpOccupyValues[occupyValueCount - 1].Y < occpy) { //占用度列表的上一个占用度重新赋值 tmpOccupyValues[occupyValueCount - 1].X = tempFreq / 1000; tmpOccupyValues[occupyValueCount - 1].Y = occpy; //返回结果列表重新赋值 tmpList[occupyValueCount - 1].Frequency = tempFreq / 1000; tmpList[occupyValueCount - 1].Occupy = Convert.ToInt16(occpy); tmpList[occupyValueCount - 1].AmplitudeMidValue = Convert.ToInt16(AverageValue); tmpList[occupyValueCount - 1].AmplitudeMaxValue = Convert.ToInt16(maxValue); } } else { tmpOccupyValues.Add(spOccupy); tmpList.Add(tmpItem); occupyValueCount++; } } else { tmpOccupyValues.Add(spOccupy); tmpList.Add(tmpItem); occupyValueCount++; } } if (tmpList.Count > 0) { int occupyMax = tmpList.Max(obj => obj.Occupy); int amplitudeMax = tmpList.Max(obj => obj.AmplitudeMaxValue); int amplitudeMid = tmpList.Max(obj => obj.AmplitudeMidValue); item.Occupy = occupyMax; item.Frequency = trueFreq; item.AmplitudeMaxValue = amplitudeMax; item.AmplitudeMidValue = amplitudeMid; } freqOccupancyDegreeDic.Add(item); if (tmpOccupyValues.Count > 0) { var spOcp = new PointPair(); spOcp.X = trueFreq; spOcp.Y = tmpOccupyValues[0].Y; occupyValues.Add(spOcp); } } csps.OccupyPointPairList = occupyValues; } csps.MinFreq = Convert.ToDouble(freqNavBar.FreqStart); csps.MaxFreq = Convert.ToDouble(freqNavBar.FreqStop); csps.SignalLimit = signalLimit; csps.OccuDegreeLimit = occuDegreeLimit; //refreshChartFreqStatDelete(dicFreqStatModel, csps);//绘制统计图形 compareStationInfoForAll(freqOccupancyDegreeDic, freqNavBar); }
private void setChartDataSouce(ChartSeriesPoints chartSeriesPoints) { //zedGraphControl.GraphPane.CurveList.Clear(); //zedGraphControlOccpy.GraphPane.CurveList.Clear(); ////****************winform control //this.zedGraphControl.GraphPane.XAxis.Scale.Max = chartSeriesPoints.MidPointPairList[chartSeriesPoints.MidPointPairList.Count - 1].X; //this.zedGraphControl.GraphPane.XAxis.Scale.MajorStep = 0.0275; //this.zedGraphControl.GraphPane.XAxis.Scale.Min = chartSeriesPoints.MidPointPairList[0].X; //this.zedGraphControlOccpy.GraphPane.XAxis.Scale.Max = chartSeriesPoints.MidPointPairList[chartSeriesPoints.MidPointPairList.Count - 1].X; //this.zedGraphControlOccpy.GraphPane.XAxis.Scale.MajorStep = 0.0275; //this.zedGraphControlOccpy.GraphPane.XAxis.Scale.Min = chartSeriesPoints.MidPointPairList[0].X; //this.zedGraphControlOccpy.GraphPane.YAxis.Scale.Max = 100; //this.zedGraphControlOccpy.GraphPane.YAxis.Scale.MajorStep = 20; //this.zedGraphControlOccpy.GraphPane.YAxis.Scale.Min = 0; //GraphPane myPane = this.zedGraphControl.GraphPane; //GraphPane myPane1 = this.zedGraphControlOccpy.GraphPane; //// 创建红色的菱形曲线 //// 标记, 图中的 "Porsche" //myCurve = myPane.AddCurve("最大值", chartSeriesPoints.MaxPointPairList, System.Drawing.Color.Red, SymbolType.None); //// 创建蓝色的圆形曲线 //// 标记, 图中的 "Piper" //myCurve2 = myPane.AddCurve("平均值", chartSeriesPoints.MidPointPairList, System.Drawing.Color.Blue, SymbolType.None); //BarItem myBar = myPane1.AddBar("占用度", chartSeriesPoints.OccupyPointPairList, System.Drawing.Color.Red); //myPane1.BarSettings.ClusterScaleWidth = 0.5; //// 在数据变化时绘制图形 //myPane.AxisChange(zedGraphControl.CreateGraphics()); //myPane1.AxisChange(zedGraphControlOccpy.CreateGraphics()); //*************************************** //**********************dev control //maxSeriesPointCollection = chartSeriesPoints.MaxValueCollection; //midSeriesPointCollection = chartSeriesPoints.MidValueCollection; //this.chart.Dispatcher.Invoke( //new Action( // delegate // { // maxSeries.Points.Clear(); // foreach (SeriesPoint sp in maxSeriesPointCollection) // { // maxSeries.Points.Add(sp); // } // //maxSeries.Points.AddRange(maxSeriesPointCollection); // //midSeries.Points.Clear(); // //midSeries.Points.AddRange(midSeriesPointCollection); // } // ) //); //this.midSeries.Dispatcher.Invoke( //new Action( // delegate // { // try // { // } // catch (Exception e) // { // } // } // ) //); //************************************ }
/// <summary> /// 生成占用度和最大值、均值数据 /// </summary> /// <param name="dicFreqStatModel">原始数据分析后统计数据</param> /// <param name="bandwidth"></param> private void ctrlStatData(Dictionary <double, FreqStatModel> dicFreqStatModel, FreqNavBar freqNavBar) { var listCreat = GetAnalysList(decimal.Parse(freqNavBar.FreqStart), decimal.Parse(freqNavBar.FreqStop), decimal.Parse(freqNavBar.BandWidth) / 1000); ChartSeriesPoints csps = new ChartSeriesPoints(); List <AnalysisResult> freqOccupancyDegreeDic = new List <AnalysisResult>(); int signalLimit = string.IsNullOrEmpty(freqNavBar.SignalLimit) ? 45 : Convert.ToInt16(freqNavBar.SignalLimit); int occuDegreeLimit = string.IsNullOrEmpty(freqNavBar.OccuDegreeLimit) ? 90 : Convert.ToInt16(freqNavBar.OccuDegreeLimit); if (listCreat != null) { //PointPairList maxValues = new PointPairList(); //PointPairList midValues = new PointPairList(); PointPairList occupyValues = new PointPairList(); foreach (var item in listCreat) { double trueFreq = item.Frequency; double tempFreq; int occupyValueCount = 0; var list = dicFreqStatModel.Where((obj) => obj.Key >= item.StartFreq * 1000 && obj.Key < item.EndFreq * 1000).ToList(); List <AnalysisResult> tmpList = new List <AnalysisResult>(); PointPairList tmpOccupyValues = new PointPairList(); foreach (KeyValuePair <double, FreqStatModel> kvp in list) { PointPair spOccupy = new PointPair(); tempFreq = kvp.Key; int overSignalLimit = kvp.Value.DicAmplitudeCount.Where(x => x.Key > signalLimit).Select(x => x.Value).Sum(); int sum = kvp.Value.DicAmplitudeCount.Values.Sum(); double occpy = ((double)overSignalLimit / (double)sum) * 100; double maxValue = kvp.Value.DicAmplitudeCount.Keys.Max(); double AverageValue = kvp.Value.DicAmplitudeCount.Select(x => x.Key).Average(); spOccupy.X = tempFreq / 1000; spOccupy.Y = Convert.ToInt16(occpy); AnalysisResult tmpItem = Mapper <AnalysisResult, AnalysisResult>(item); tmpItem.Occupy = Convert.ToInt16(occpy); tmpItem.AmplitudeMidValue = Convert.ToInt16(AverageValue); tmpItem.AmplitudeMaxValue = Convert.ToInt16(maxValue); //如果不是第一次 if (occupyValueCount >= 1) { //如果占用度列表的上一个频率 + 带宽大于等于当前频率 if (tmpOccupyValues[occupyValueCount - 1].X + Convert.ToDouble(freqNavBar.BandWidth) / 1000 >= tempFreq / 1000) { //如果占用度列表的上一个占用度小于当前占用度 if (tmpOccupyValues[occupyValueCount - 1].Y < occpy) { //占用度列表的上一个占用度重新赋值 tmpOccupyValues[occupyValueCount - 1].X = tempFreq / 1000; tmpOccupyValues[occupyValueCount - 1].Y = occpy; //返回结果列表重新赋值 tmpList[occupyValueCount - 1].Frequency = tempFreq / 1000; tmpList[occupyValueCount - 1].Occupy = Convert.ToInt16(occpy); tmpList[occupyValueCount - 1].AmplitudeMidValue = Convert.ToInt16(AverageValue); tmpList[occupyValueCount - 1].AmplitudeMaxValue = Convert.ToInt16(maxValue); } } else { tmpOccupyValues.Add(spOccupy); tmpList.Add(tmpItem); occupyValueCount++; } } else { tmpOccupyValues.Add(spOccupy); tmpList.Add(tmpItem); occupyValueCount++; } } if (tmpList.Count > 0) { int occupyMax = tmpList.Max(obj => obj.Occupy); int amplitudeMax = tmpList.Max(obj => obj.AmplitudeMaxValue); int amplitudeMid = tmpList.Max(obj => obj.AmplitudeMidValue); item.Occupy = occupyMax; item.Frequency = trueFreq; item.AmplitudeMaxValue = amplitudeMax; item.AmplitudeMidValue = amplitudeMid; } freqOccupancyDegreeDic.Add(item); if (tmpOccupyValues.Count > 0) { var spOcp = new PointPair(); spOcp.X = trueFreq; spOcp.Y = tmpOccupyValues[0].Y; occupyValues.Add(spOcp); } //occupyValues.Add(tmpOccupyValues); } csps.OccupyPointPairList = occupyValues; } #region 2016年10月26日修改 //if (dicFreqStatModel != null) //{ // //***** 1 // PointPairList maxValues = new PointPairList(); // PointPairList midValues = new PointPairList(); // PointPairList occupyValues = new PointPairList(); // //****** 2 // //SeriesPointCollection maxValues = new SeriesPointCollection(); // //SeriesPointCollection midValues = new SeriesPointCollection(); // //AmplitudeMaxValue = new List<short>(); // //AmplitudeAverageValue = new List<short>(); // double tempFreq; // int occupyValueCount = 0; // int Prec = GetPrec(decimal.Parse(freqNavBar.BandWidth) / 1000) + 1; // foreach (KeyValuePair<double, FreqStatModel> kvp in dicFreqStatModel) // { // //PointPair spMax = new PointPair(); // //PointPair spMid = new PointPair(); // PointPair spOccupy = new PointPair(); // //Visifire.Charts.DataPoint dpMax = new Visifire.Charts.DataPoint(); // //SeriesPoint spMax = new SeriesPoint(); // //SeriesPoint spMid = new SeriesPoint(); // tempFreq = kvp.Key; // int overSignalLimit = kvp.Value.DicAmplitudeCount.Where(x => x.Key > signalLimit).Select(x => x.Value).Sum(); // int sum = kvp.Value.DicAmplitudeCount.Values.Sum(); // double occpy = ((double)overSignalLimit / (double)sum) * 100; // double maxValue = kvp.Value.DicAmplitudeCount.Keys.Max(); // //AmplitudeMaxValue.Add(Convert.ToInt16(maxValue)); // //dpMax.XValue = tempFreq / 1000; // //dpMax.YValue = Convert.ToInt16(maxValue); // //spMax.X = tempFreq / 1000; // //spMax.Y = Convert.ToInt16(maxValue); // //maxValues.Add(spMax); // //maxPoints.Add(dpMax); // double AverageValue = kvp.Value.DicAmplitudeCount.Select(x => x.Key).Average(); // //spMid.X = tempFreq / 1000; // //spMid.Y = Convert.ToInt16(AverageValue); // //AmplitudeAverageValue.Add(Convert.ToInt16(AverageValue)); // //midValues.Add(spMid); // //if (occpy > occuDegreeLimit) // //{ // spOccupy.X = tempFreq / 1000; // spOccupy.Y = occpy; // AnalysisResult ar = new AnalysisResult(); // ar.Frequency = Math.Round(tempFreq / 1000, Prec); // ar.Occupy = Convert.ToInt16(occpy); // ar.AmplitudeMidValue = Convert.ToInt16(AverageValue); // ar.AmplitudeMaxValue = Convert.ToInt16(maxValue); // if (occupyValueCount >= 1) // { // if (occupyValues[occupyValueCount - 1].X + Convert.ToDouble(freqNavBar.BandWidth) / 1000 >= tempFreq / 1000) // { // if (occupyValues[occupyValueCount - 1].Y < occpy) // { // occupyValues[occupyValueCount - 1].X = tempFreq / 1000; // occupyValues[occupyValueCount - 1].Y = occpy; // freqOccupancyDegreeDic[occupyValueCount - 1].Frequency = tempFreq / 1000; // freqOccupancyDegreeDic[occupyValueCount - 1].Occupy = Convert.ToInt16(occpy); // freqOccupancyDegreeDic[occupyValueCount - 1].AmplitudeMidValue = Convert.ToInt16(AverageValue); // freqOccupancyDegreeDic[occupyValueCount - 1].AmplitudeMaxValue = Convert.ToInt16(maxValue); // } // } // else // { // occupyValues.Add(spOccupy); // freqOccupancyDegreeDic.Add(ar); // occupyValueCount++; // } // } // else // { // occupyValues.Add(spOccupy); // freqOccupancyDegreeDic.Add(ar); // occupyValueCount++; // } // } // //} // //csps.MaxPointPairList = maxValues; // //csps.MidPointPairList = midValues; // csps.OccupyPointPairList = occupyValues; //} #endregion csps.MinFreq = Convert.ToDouble(freqNavBar.FreqStart); csps.MaxFreq = Convert.ToDouble(freqNavBar.FreqStop); csps.SignalLimit = signalLimit; csps.OccuDegreeLimit = occuDegreeLimit; //refreshChartResultDelete(csps); refreshChartFreqStatDelete(dicFreqStatModel, csps); compareStationInfo(freqOccupancyDegreeDic); }
//绘制占用度和谱图 private void setFreqStatDataSouce(Dictionary <double, FreqStatModel> dicFreqStatModel, ChartSeriesPoints chartSeriesPoints) { ObservableDataSource <Point> maxDataSource = new ObservableDataSource <Point>(); ObservableDataSource <Point> midDataSource = new ObservableDataSource <Point>(); if (dicFreqStatModel != null) { double tempFreq; foreach (KeyValuePair <double, FreqStatModel> kvp in dicFreqStatModel) { Point dpMax = new Point(); Point dpMid = new Point(); tempFreq = kvp.Key; int overSignalLimit = kvp.Value.DicAmplitudeCount.Where(x => x.Key > chartSeriesPoints.SignalLimit).Select(x => x.Value).Sum(); int sum = kvp.Value.DicAmplitudeCount.Values.Sum(); double occpy = (double)overSignalLimit / (double)sum; if (occpy > 0.9) { } double maxValue = kvp.Value.DicAmplitudeCount.Keys.Max(); dpMax.X = tempFreq / 1000; dpMax.Y = Convert.ToInt16(maxValue); maxDataSource.AppendAsync(plotter.Dispatcher, dpMax); double AverageValue = kvp.Value.DicAmplitudeCount.Select(x => x.Key).Average(); dpMid.X = tempFreq / 1000; dpMid.Y = Convert.ToInt16(AverageValue); midDataSource.AppendAsync(plotter.Dispatcher, dpMid); } } plotter.Dispatcher.Invoke( new Action( delegate { List <LineGraph> temp = new List <LineGraph>(); foreach (var obj in plotter.Children) { if (typeof(LineGraph).IsAssignableFrom(obj.GetType())) { temp.Add((LineGraph)obj); } } if (temp.Count > 0) { foreach (LineGraph rh in temp) { plotter.Children.Remove(rh); } } plotter.AddLineGraph(maxDataSource, Colors.Red, 1, "最大值"); plotter.AddLineGraph(midDataSource, Colors.LightBlue, 1, "中值"); plotter.Visible = new Microsoft.Research.DynamicDataDisplay.DataRect(new Rect(chartSeriesPoints.MinFreq, 0, chartSeriesPoints.MaxFreq - chartSeriesPoints.MinFreq, 100)); //linegraphMax.DataSource = maxDataSource; } ) ); // linegraphMid.Dispatcher.Invoke( // new Action( // delegate // { // linegraphMid.DataSource = midDataSource; // plotter.Visible = new Microsoft.Research.DynamicDataDisplay.DataRect(new Rect(chartSeriesPoints.MinFreq, 0, chartSeriesPoints.MaxFreq - chartSeriesPoints.MinFreq, 100)); // } // ) //); BarPlotter.Dispatcher.Invoke( new Action( delegate { List <RectangleHighlight> temp = new List <RectangleHighlight>(); foreach (var obj in BarPlotter.Children) { if (typeof(RectangleHighlight).IsAssignableFrom(obj.GetType())) { temp.Add((RectangleHighlight)obj); } } if (temp.Count > 0) { foreach (RectangleHighlight rh in temp) { BarPlotter.Children.Remove(rh); } } foreach (PointPair pp in chartSeriesPoints.OccupyPointPairList) { if (pp.Y >= chartSeriesPoints.OccuDegreeLimit) { RectangleHighlight rh = new RectangleHighlight(); rh.Bounds = new Microsoft.Research.DynamicDataDisplay.DataRect(new Rect(pp.X, 0, 0, pp.Y)); rh.Stroke = Brushes.Yellow; rh.StrokeThickness = 10; rh.ToolTip = pp.X.ToString("0.0000") + "MHz"; BarPlotter.Children.Add(rh); } } BarPlotter.Visible = new Microsoft.Research.DynamicDataDisplay.DataRect(new Rect(chartSeriesPoints.MinFreq, 0, chartSeriesPoints.MaxFreq - chartSeriesPoints.MinFreq, 100)); //ObservableDataSource<Point> standDataSource = new ObservableDataSource<Point>(); //standDataSource.AppendAsync(BarPlotter.Dispatcher, new Point(chartSeriesPoints.MinFreq, 0)); //standDataSource.AppendAsync(BarPlotter.Dispatcher, new Point(chartSeriesPoints.MinFreq, 100)); //standDataSource.AppendAsync(BarPlotter.Dispatcher, new Point(chartSeriesPoints.MaxFreq, 100)); //standDataSource.AppendAsync(BarPlotter.Dispatcher, new Point(chartSeriesPoints.MaxFreq, 0)); //linegraphStand.DataSource = standDataSource; } ) ); //this.freqDataSeries.Dispatcher.Invoke( // new Action( // delegate // { // freqDataSeries.DataPoints.Clear(); // if (dicFreqStatModel != null) // { // double tempFreq; // foreach (KeyValuePair<double, FreqStatModel> kvp in dicFreqStatModel) // { // Visifire.Charts.DataPoint dpMax = new Visifire.Charts.DataPoint(); // tempFreq = kvp.Key; // int overSignalLimit = kvp.Value.DicAmplitudeCount.Where(x => x.Key > 45).Select(x => x.Value).Sum(); // int sum = kvp.Value.DicAmplitudeCount.Values.Sum(); // double occpy = (double)overSignalLimit / (double)sum; // if (occpy > 0.9) // { // } // double maxValue = kvp.Value.DicAmplitudeCount.Keys.Max(); // //AmplitudeMaxValue.Add(Convert.ToInt16(maxValue)); // dpMax.XValue = tempFreq / 1000; // dpMax.YValue = Convert.ToInt16(maxValue); // //spMax.X = tempFreq / 1000; // //spMax.Y = Convert.ToInt16(maxValue); // //maxValues.Add(spMax); // freqDataSeries.DataPoints.Add(dpMax); // double AverageValue = kvp.Value.DicAmplitudeCount.Select(x => x.Key).Average(); // } // } // } // ) //); }