private void PopulatDeploymentsToPlot() { DeploymentsToPlot.Items.Clear(); PicesSipperDeploymentList deployments = mainWinConn.SipperDeploymentLoad(cruiseName, ""); if (deployments == null) { return; } stations = mainWinConn.SipperStationLoad(cruiseName); cruiseAdjGpsToActTime = new TimeSpan(0, 0, 0); long adjGpsToActTime = 0; foreach (PicesSipperDeployment deployment in deployments) { long deploymentAdjGpsToAct = deployment.SyncTimeStampGPS.ToFileTimeUtc() - deployment.SyncTimeStampActual.ToFileTimeUtc(); if (deploymentAdjGpsToAct != adjGpsToActTime) { adjGpsToActTime = deploymentAdjGpsToAct; cruiseAdjGpsToActTime = deployment.SyncTimeStampActual - deployment.SyncTimeStampGPS; } DeploymentsToPlot.Items.Add(deployment, true); } }
private void LoadStations() { station = null; PicesSipperStationList stations = mainWinConn.SipperStationLoad(cruise.CruiseName); if (stations == null) { return; } StationField.Items.Clear(); foreach (PicesSipperStation s in stations) { StationField.Items.Add(s); if (s.StationName.Equals(stationName, StringComparison.InvariantCultureIgnoreCase)) { station = s; } } if (station == null) { stationName = ""; } else { StationField.SelectedItem = station; } }
} /* AddSeriesToChart */ private void AddStationsToChart(PicesSipperStationList stationsToPlot, ref double minX, ref double maxX, ref double minY, ref double maxY ) { Series s = new Series("Stations"); s.MarkerSize = 20; s.MarkerStyle = MarkerStyle.Star5; s.ChartType = SeriesChartType.Point; s.ChartArea = "ChartArea1"; s.Name = ""; s.XAxisType = AxisType.Primary; s.Legend = ""; s.Points.Clear(); foreach (PicesSipperStation station in stationsToPlot) { double lat = station.Latitude; double lon = station.Longitude; if ((lat == 0.0) && (lon == 0.0)) { continue; } if (lat < minY) { minY = lat; } if (lat > maxY) { maxY = lat; } if (lon < minX) { minX = lon; } if (lon > maxX) { maxX = lon; } DataPoint dataPoint = new DataPoint(lon, lat); dataPoint.Label = station.StationName; dataPoint.Font = new Font(FontFamily.GenericSerif, 12.0f); s.Points.Add(dataPoint); } ProfileChart.Series.Add(s); } /* AddStationsToChart */
} /* EnableFields*/ private void LoadCruiseDetails() { CruiseDetials.Nodes.Clear(); GC.Collect(); if (!addingNewCruise) { PicesSipperStationList stations = DbConn().SipperStationLoad(cruise.CruiseName); foreach (PicesSipperStation station in stations) { CruiseDetials.Nodes.Add(new TreeNodeStation(dbConn, runLog, station)); } } } /* LoadCruiseDetails */
private void LoadStationDetails() { this.Nodes.Clear(); PicesSipperStationList stations = dbConn.SipperStationLoad(cruise.CruiseName); if (stations == null) { return; } foreach (PicesSipperStation station in stations) { this.Nodes.Add(new TreeNodeStation(dbConn, runLog, station)); } } /* LoadStationDetails */
} /* 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 */