} /* AddStationsToChart */ private void UpdateChartAreas() { goalie.StartBlock(); double minX = double.MaxValue; double maxX = double.MinValue; double minY = double.MaxValue; double maxY = double.MinValue; DateTime minGpsDateTime = DateTime.MaxValue; DateTime maxGpsDateTime = DateTime.MinValue; timeInterval = (int)TimeInterval.Value; //String plotAction = PlotAction.SelectedText; PicesSipperDeploymentList selectedDeployments = CurrentlySelectedDeployments(); String titleLine = "Station: " + stationName; titleLine += " Time-Interval: " + timeInterval; ProfileChart.Titles.Clear(); ProfileChart.Titles.Add(new Title(titleLine, Docking.Top, titleFont, Color.Black)); if (series.Count < 1) { ProfileChart.Series.Clear(); goalie.EndBlock(); return; } ChartArea ca = ProfileChart.ChartAreas[0]; ca.AxisX.TitleFont = axisTitleFont; ca.AxisY.TitleFont = axisTitleFont; ProfileChart.Series.Clear(); // First we will plot cruise level series; that is series that are not ties to a specific deployment. foreach (DataSeriesToPlot dstp in series) { if (dstp.deployment == null) { AddSeriesToChart(dstp, ref minX, ref maxX, ref minY, ref maxY, ref minGpsDateTime, ref maxGpsDateTime); } } PicesSipperStationList stationsToPlot = new PicesSipperStationList(); Dictionary <String, PicesSipperStation> stationsPlotted = new Dictionary <string, PicesSipperStation> (); // Second we plot series that is specific to a deployment. foreach (DataSeriesToPlot dstp in series) { PicesSipperDeployment d = dstp.deployment; AddSeriesToChart(dstp, ref minX, ref maxX, ref minY, ref maxY, ref minGpsDateTime, ref maxGpsDateTime); if (!stationsPlotted.ContainsKey(d.StationName)) { PicesSipperStation stationToPlot = mainWinConn.SipperStationLoad(d.CruiseName, d.StationName); stationsPlotted.Add(d.StationName, stationToPlot); stationsToPlot.Add(stationToPlot); } } // Third we add stations that were not in one of the specified deployments but awe in the area of the deployments. // Find other stations in plot area. // Degrees/Kilo-Meter = 1/111 There are 111 Km/Degree of latitude double paddingKms = (double)PaddingKms.Value; double latPadding = paddingKms * (1.0 / 111.0); // Will add 5km's of padding to latitude. double degreesToRads = Math.PI / 180.0; double kmsPerDegLong = 111.6 * Math.Cos((minY + maxY) / 2.0 * degreesToRads); double longPadding = paddingKms * (1.0 / (kmsPerDegLong)); // PicesSipperStationList stationsInRange = mainWinConn.SipperStationsLoadByGpsRange(minY - latPadding, maxY + latPadding, minX - longPadding, maxX + longPadding); if (stationsInRange != null) { foreach (PicesSipperStation stationToPlot in stationsInRange) { if (!stationsPlotted.ContainsKey(stationToPlot.StationName)) { stationsPlotted.Add(stationToPlot.StationName, stationToPlot); stationsToPlot.Add(stationToPlot); } } } // Forth We add the stations to the Plot. AddStationsToChart(stationsToPlot, ref minX, ref maxX, ref minY, ref maxY); double latitudeMid = (maxY + minY) / 2.0; float plotAreaHeight = ProfileChart.ChartAreas[0].InnerPlotPosition.Height; float plotAreaWidth = ProfileChart.ChartAreas[0].InnerPlotPosition.Width; double yRangeDegs = maxY - minY; double xRangeDegs = maxX - minX; double yRangeKms = yRangeDegs * 111.0; double longKmsPerDeg = 111.6 * Math.Cos(latitudeMid * degToRad); double xRangeKms = xRangeDegs * longKmsPerDeg; double yDensity = yRangeKms / plotAreaHeight; double xDenisty = xRangeKms / plotAreaWidth; if (xDenisty > yDensity) { double newYRangeKms = xDenisty * plotAreaHeight; double newYRageDegs = newYRangeKms / 111.0; double deltaYRange = newYRageDegs - yRangeDegs; minY = minY - deltaYRange / 2.0; maxY = maxY + deltaYRange / 2.0; } else { double newXRangeKms = yDensity * plotAreaWidth; double newXRangeDegs = newXRangeKms / longKmsPerDeg; double deltaXRange = newXRangeDegs - xRangeDegs; minX = minX - (deltaXRange / 2.0); maxX = maxX + (deltaXRange / 2.0); } { // X Axis Custom Labels ca.AxisX.CustomLabels.Clear(); double delta = (maxX - minX) / 5.0; char d = (char)176; string dStr = d.ToString(); double fromPos = minX; for (int xx = 0; xx < 5; ++xx) { double toPos = fromPos + delta; double midPos = (toPos + fromPos) / 2.0; double midPosAbs = Math.Abs(midPos); double degs = Math.Floor(midPosAbs); double mins = (midPosAbs - degs) * 60.0; string s = degs.ToString() + dStr + ":" + mins.ToString("00.00") + "'" + ((midPos < 0.0) ? "W" : "E"); CustomLabel cl = new CustomLabel(fromPos, toPos, s, 0, LabelMarkStyle.LineSideMark, GridTickTypes.Gridline); ca.AxisX.CustomLabels.Add(cl); fromPos = toPos; } ca.AxisX.LabelStyle.Font = axisLabelFont; } { // Y Axis Custom Labels ca.AxisY.CustomLabels.Clear(); double delta = (maxY - minY) / 5.0; char d = (char)176; string dStr = d.ToString(); double fromPos = minY; for (int xx = 0; xx < 5; ++xx) { double toPos = fromPos + delta; double midPos = (toPos + fromPos) / 2.0; double midPosAbs = Math.Abs(midPos); double degs = Math.Floor(midPosAbs); double mins = (midPosAbs - degs) * 60.0; string s = degs.ToString() + dStr + ":" + mins.ToString("00.00") + "'" + ((midPos < 0.0) ? "S" : "N"); CustomLabel cl = new CustomLabel(fromPos, toPos, s, 0, LabelMarkStyle.LineSideMark, GridTickTypes.Gridline); ca.AxisY.CustomLabels.Add(cl); fromPos = toPos; } ca.AxisY.LabelStyle.Font = axisLabelFont; } ca.AxisX.Minimum = minX; ca.AxisX.Maximum = maxX; ca.AxisY.Minimum = minY; ca.AxisY.Maximum = maxY; ProfileChart.ChartAreas[0].RecalculateAxesScale(); goalie.EndBlock(); } /* UpdateChartAreas */
} /* AddStationsToChart */ private void UpdateChartAreas() { goalie.StartBlock(); double minX = double.MaxValue; double maxX = double.MinValue; double minY = double.MaxValue; double maxY = double.MinValue; DateTime minGpsDateTime = DateTime.MaxValue; DateTime maxGpsDateTime = DateTime.MinValue; timeInterval = (int)TimeInterval.Value; //String plotAction = PlotAction.SelectedText; PicesSipperDeploymentList selectedDeployments = CurrentlySelectedDeployments(); String titleLine = "Cruise: " + cruiseName; titleLine += " Time-Interval: " + timeInterval; ProfileChart.Titles.Clear(); ProfileChart.Titles.Add(titleLine); if (series.Count < 1) { ProfileChart.Series.Clear(); goalie.EndBlock(); return; } ChartArea ca = ProfileChart.ChartAreas[0]; //ca.AxisY.Title = "Latitude"; //ca.AxisX.Title = "Longitude"; Font f = new Font(ca.AxisX.TitleFont.FontFamily, 10); ca.AxisX.TitleFont = f; f = new Font(ca.AxisY.TitleFont.FontFamily, 10); ca.AxisY.TitleFont = f; ProfileChart.Series.Clear(); // First we will plot cruise level series; that is series that are not ties to a specific deployment. foreach (DataSeriesToPlot dstp in series) { if (dstp.deployment == null) { AddSeriesToChart(dstp, ref minX, ref maxX, ref minY, ref maxY, ref minGpsDateTime, ref maxGpsDateTime); } } Dictionary <String, PicesSipperStation> stationsPlotted = new Dictionary <string, PicesSipperStation> (); PicesSipperDeploymentList deploymentsPlotted = new PicesSipperDeploymentList(); // Second we plot series that is specific to a deployment. foreach (DataSeriesToPlot dstp in series) { if (dstp.deployment != null) { String stationName = dstp.deployment.StationName; AddSeriesToChart(dstp, ref minX, ref maxX, ref minY, ref maxY, ref minGpsDateTime, ref maxGpsDateTime); deploymentsPlotted.Add(dstp.deployment); } } String[] stationNamesToPlot = deploymentsPlotted.ExtractStationNames(); PicesSipperStationList stationsToPlot = new PicesSipperStationList(); foreach (String stationName in stationNamesToPlot) { PicesSipperStation stationToPlot = stations.LookUpByStationName(stationName); if (stationToPlot != null) { stationsToPlot.Add(stationToPlot); stationsPlotted.Add(stationToPlot.StationName, stationToPlot); } } // Third we add stations that were not in one of the specified deployments but awe in the area of the deployments. // Find other stations in plot area. // Degrees/Kilo-Meter = 1/111 There are 111 Km/Degree of latitude double paddingKms = (double)PaddingKms.Value; double latPadding = paddingKms * (1.0 / 111.0); // Will add 5km's of padding to latitude. double degreesToRads = Math.PI / 180.0; double kmsPerDegLong = 111.6 * Math.Cos((minY + maxY) / 2.0 * degreesToRads); double longPadding = paddingKms * (1.0 / (kmsPerDegLong)); PicesSipperStationList stationsInRange = mainWinConn.SipperStationsLoadByGpsRange(minY - latPadding, maxY + latPadding, minX - longPadding, maxX + longPadding); if (stationsInRange != null) { foreach (PicesSipperStation stationToPlot in stationsInRange) { if (!stationsPlotted.ContainsKey(stationToPlot.StationName)) { stationsPlotted.Add(stationToPlot.StationName, stationToPlot); stationsToPlot.Add(stationToPlot); } } } AddStationsToChart(stationsToPlot, ref minX, ref maxX, ref minY, ref maxY); double latitudeMid = (maxY + minY) / 2.0; float plotAreaHeight = ProfileChart.Height; float plotAreaWidth = ProfileChart.Width; double xRange = maxX - minX; double yRange = maxY - minY; double xRangeAdj = xRange * Math.Cos(latitudeMid * degToRad); double yDensity = yRange / plotAreaHeight; double xDenisty = xRangeAdj / plotAreaWidth; if (xDenisty > yDensity) { yRange = xDenisty * plotAreaHeight; double leftOver = yRange - (maxY - minY); minY = minY - leftOver / 2.0; maxY = maxY + leftOver / 2.0; } else { xRangeAdj = yDensity * plotAreaWidth; xRange = xRangeAdj / Math.Cos(latitudeMid * degToRad); double leftOver = xRange - (maxX - minX); minX = minX - leftOver / 2.0; maxX = maxX + leftOver / 2.0; } ca.AxisX.Minimum = minX; ca.AxisX.Maximum = maxX; ca.AxisY.Minimum = minY; ca.AxisY.Maximum = maxY; ProfileChart.ChartAreas[0].RecalculateAxesScale(); goalie.EndBlock(); } /* UpdateChartAreas */