/// <summary> /// Query the data from the database. /// </summary> /// <param name="cnn">SQLite connection.</param> /// <param name="query">Query for the data.</param> /// <param name="magScale">Magnitude scale.</param> /// <param name="minIndex">Minimum index.</param> /// <param name="maxIndex">Maximum index.</param> /// <returns></returns> private List <ShipTrackData> QueryDataFromDb(SQLiteConnection cnn, string query, double magScale, int minIndex = 0, int maxIndex = 0) { // Init list double backupBtEast = DbDataHelper.BAD_VELOCITY; double backupBtNorth = DbDataHelper.BAD_VELOCITY; // Init the new series data List <ShipTrackData> stDataList = new List <ShipTrackData>(); //stData.MagScale = magScale; // Ensure a connection was made if (cnn == null) { return(null); } using (DbCommand cmd = cnn.CreateCommand()) { cmd.CommandText = query; // Get Result DbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { ShipTrackData stData = new ShipTrackData(); // Update the status StatusProgress++; StatusMsg = reader["EnsembleNum"].ToString(); // Get the Ensemble number and Date and time stData.DateTime = reader["DateTime"].ToString(); stData.EnsNum = reader["EnsembleNum"].ToString(); // Plot the lat/lon stData.LatLon = reader["Position"].ToString(); // Heading DbDataHelper.HPR hpr = DbDataHelper.GetHPR(reader); stData.Heading = hpr.Heading; //// Get the range bin //int rangeBin = DbDataHelper.GetRangeBin(reader); //// Get the magnitude data //string jsonEarth = reader["EarthVelocityDS"].ToString(); //if (!string.IsNullOrEmpty(jsonEarth)) //{ // // Convert to a JSON object // JObject ensEarth = JObject.Parse(jsonEarth); // // Average the data // avgMag = DbDataHelper.GetAvgMag(ensEarth, IsMarkBadBelowBottom, rangeBin, DbDataHelper.BAD_VELOCITY); // avgDir = DbDataHelper.GetAvgDir(ensEarth, IsMarkBadBelowBottom, rangeBin, DbDataHelper.BAD_VELOCITY); // //Debug.WriteLine(string.Format("Avg Dir: {0} Avg Mag: {1}", avgDir, avgMag)); //} if (IsUseGpsSpeedBackup) { // Get the GPS data from the database DbDataHelper.GpsData gpsData = DbDataHelper.GetGpsData(reader); // Check for a backup value for BT East and North speed from the GPS if a Bottom Track value is never found if (Math.Round(backupBtEast, 4) == BAD_VELOCITY && gpsData.IsBackShipSpeedGood) { backupBtEast = gpsData.BackupShipEast; backupBtNorth = gpsData.BackupShipNorth; } } // Get the velocity stData.VelMagDir = DbDataHelper.CreateVelocityVectors(reader, backupBtEast, backupBtNorth, true, true); // Get the average range stData.AvgRange = DbDataHelper.GetAverageRange(reader); // Store the backup value if (stData.VelMagDir.IsBtVelGood) { backupBtEast = stData.VelMagDir.BtEastVel; backupBtNorth = stData.VelMagDir.BtNorthVel; } // Add the data to the list stDataList.Add(stData); } } return(stDataList); }
/// <summary> /// Plot the series. This will remove all the old series. Then add the /// new series lines. /// </summary> /// <param name="stData">Ship Track data.</param> private void PlotMapData(List <ShipTrackData> stDataList) { // Init the value double avgMag = 0.0; double avgDir = 0.0; // Keep Track of previous point to draw // the ship track line //LatLon prevLatLon = new LatLon { Latitude = 0.0, Longitude = 0.0, IsGood = false }; IList <PointLatLng> points = new List <PointLatLng>(); // Last point ShipTrackData lastGoodShipTrack = null; foreach (ShipTrackData stData in stDataList) { avgMag = stData.VelMagDir.AvgMagnitude; avgDir = stData.VelMagDir.AvgDirectionYNorth; LatLon currLatLon = stData.GetLatLon(); if (currLatLon.IsGood) { // Add the point to the route points.Add(new PointLatLng(currLatLon.Latitude, currLatLon.Longitude)); // Convert the value to color from the color map System.Windows.Media.SolidColorBrush brush = new System.Windows.Media.SolidColorBrush(ColorHM.GetColorForValue(avgMag, _MinValue, _MaxValue)); // Mark GMapMarker marker = new GMapMarker(new GMap.NET.PointLatLng(currLatLon.Latitude, currLatLon.Longitude)); //System.Windows.Media.BrushConverter converter = new System.Windows.Media.BrushConverter(); if (_SelectedPlotOption == PLOT_OPTION_QUIVER) { // Degrees to radian double angle = Math.PI * avgDir / 180.0; marker.Shape = new Line { X1 = 0, Y1 = 0, X2 = (Math.Abs(avgMag) * MagScale) * Math.Cos(angle), Y2 = -((Math.Abs(avgMag) * MagScale) * Math.Sin(angle)), // Flip the sign StrokeThickness = 3, Stroke = brush, ToolTip = string.Format("[{0}] [{1}] Mag: {2} Dir: {3} Range: {4} Heading: {5}", stData.EnsNum, stData.DateTime, avgMag.ToString("0.0"), avgDir.ToString("0.0"), stData.AvgRange.ToString("0.0"), stData.Heading.ToString("0.0")), Name = string.Format("Line_{0}", stData.EnsNum) }; marker.ZIndex = (int)MapLayers.Quiver; } else if (_SelectedPlotOption == PLOT_OPTION_VELOCITY_RECTANGLE) { marker.Shape = new Rectangle { Width = 20 * MagScale, Height = 20 * MagScale, Fill = brush, Stroke = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Transparent), ToolTip = string.Format("[{0}] [{1}] Mag: {2} Dir: {3} Range: {4} Heading: {5}", stData.EnsNum, stData.DateTime, avgMag.ToString("0.0"), avgDir.ToString("0.0"), stData.AvgRange.ToString("0.0"), stData.Heading.ToString("0.0")), Name = string.Format("Rect_Vel_{0}", stData.EnsNum) }; marker.ZIndex = (int)MapLayers.Velocity_Rectangle; } else if (_SelectedPlotOption == PLOT_OPTION_BT_RANGE) { // Convert the average Range to color from the color map brush = new System.Windows.Media.SolidColorBrush(ColorHM.GetColorForValue(stData.AvgRange, _MinValue, _MaxValue)); marker.Shape = new Rectangle { Width = 20 * MagScale, Height = 20 * MagScale, Fill = brush, Stroke = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Transparent), ToolTip = string.Format("[{0}] [{1}] Mag: {2} Dir: {3} Range: {4} Heading: {5}", stData.EnsNum, stData.DateTime, avgMag.ToString("0.0"), avgDir.ToString("0.0"), stData.AvgRange.ToString("0.0"), stData.Heading.ToString("0.0")), Name = string.Format("Rect_Range_{0}", stData.EnsNum) }; marker.ZIndex = (int)MapLayers.Range_Rectangle; } // Record the last point to get a special marker lastGoodShipTrack = stData; // Add the marker to the list Markers.Add(marker); } } // Plot the path that we taken GMapRoute route = new GMapRoute(points); System.Windows.Media.SolidColorBrush routeBrush = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Red); routeBrush.Opacity = 0.4; route.Shape = new System.Windows.Shapes.Path() { StrokeThickness = 3, Stroke = routeBrush, Fill = routeBrush }; route.ZIndex = (int)MapLayers.Ship_Track_Line; Markers.Add(route); // Add a marker for the last point to know which direction it traveled if (lastGoodShipTrack != null) { LatLon lastLatLon = lastGoodShipTrack.GetLatLon(); if (lastLatLon.IsGood) { GMapMarker lastMarker = new GMapMarker(new GMap.NET.PointLatLng(lastLatLon.Latitude, lastLatLon.Longitude)); if (IsLastMarkerEllipse) { lastMarker.Shape = new Ellipse { //Points = trianglePts, RenderTransform = new System.Windows.Media.TranslateTransform(-((1 * LastMarkerScale) / 2), -((1 * LastMarkerScale) / 2)), Width = 1 * LastMarkerScale, Height = 1 * LastMarkerScale, Fill = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Yellow), Stroke = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Red), ToolTip = string.Format("[{0}] [{1}] Mag: {2} Dir: {3} Range: {4} Heading: {5}", lastGoodShipTrack.EnsNum, lastGoodShipTrack.DateTime, avgMag.ToString("0.0"), avgDir.ToString("0.0"), lastGoodShipTrack.AvgRange.ToString("0.0"), lastGoodShipTrack.Heading.ToString("0.0")) }; } else { System.Windows.Media.PointCollection trianglePts = new System.Windows.Media.PointCollection(); //trianglePts.Add(new Point(0.0, 1.0 * LastMarkerScale)); //trianglePts.Add(new Point(0.0, -1.0 * LastMarkerScale)); //trianglePts.Add(new Point(-1.0 * LastMarkerScale, 0.0)); trianglePts.Add(new Point(-1.0 * LastMarkerScale, 0.0)); trianglePts.Add(new Point(1.0 * LastMarkerScale, 0.0)); trianglePts.Add(new Point(0.0, -1.0 * LastMarkerScale)); lastMarker.Shape = new Polygon { Points = trianglePts, RenderTransform = new System.Windows.Media.RotateTransform(lastGoodShipTrack.Heading), Fill = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Yellow), Stroke = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Red), ToolTip = string.Format("[{0}] [{1}] Mag: {2} Dir: {3} Range: {4} Heading: {5}", lastGoodShipTrack.EnsNum, lastGoodShipTrack.DateTime, avgMag.ToString("0.0"), avgDir.ToString("0.0"), lastGoodShipTrack.AvgRange.ToString("0.0"), lastGoodShipTrack.Heading.ToString("0.0")) }; } // Set the zIndex so we can filter the layers lastMarker.ZIndex = (int)MapLayers.Last_Point; // Add the last point to the end Markers.Add(lastMarker); } } // Set the center position Position = GetCenterPoint(Markers); Zoom = 17; }