/// <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;
        }