Exemple #1
0
        public string ToXmlString()
        {
            GpxClass gpx = new GpxClass()
            {
                creator = "Blue Diamond",
                trk = new trkTypeCollection()
            };

            trkType track = new trkType()
            {
                name = Name,

            };
            track.trkseg = new trksegTypeCollection();
            trksegType segment = new trksegType()
            {
                trkpt = new wptTypeCollection()
            };
            track.trkseg.Add(segment);

            foreach(var pt in this.Points)
            {
                wptType wpt = new wptType()
                {
                    lat = (decimal)pt.Latitude,
                    lon = (decimal)pt.Longitude,
                    ele = (decimal)pt.Altitude,
                    eleSpecified = true,
                    time = pt.TimeStamp,
                };
                segment.trkpt.Add(wpt);
            }
            gpx.trk.Add(track);

            try
            {
                var gpx11 = ToGpx1_1(gpx);
                XmlSerializer serializer = new XmlSerializer(gpx11.GetType());
                Utf8StringWriter sw = new Utf8StringWriter();
                serializer.Serialize(sw, gpx11);
                return sw.ToString();
            }
            catch (Exception ex)
            {
                    Trace.TraceError("error serializing:\r\n{0}",ex);
                return null;
            }
            //return gpx.ToXml();
        }
        private void gpx_save_Click(object sender, RoutedEventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();

            saveFileDialog1.Filter = "GPX file|*.gpx";
            saveFileDialog1.Title  = "Save To GPX File";
            saveFileDialog1.ShowDialog();

            // If the file name is not an empty string open it for saving.
            if (saveFileDialog1.FileName != "")
            {
                GpxClass track = new GpxClass();

                wptTypeCollection trkpt = new wptTypeCollection();
                foreach (Location lc in gpx_locations)
                {
                    wptType wpt = new wptType();
                    wpt.lat          = (decimal)lc.Latitude;
                    wpt.lon          = (decimal)lc.Longitude;
                    wpt.ele          = (decimal)lc.Altitude;
                    wpt.eleSpecified = true;
                    trkpt.Add(wpt);
                }

                trksegType trk_seg = new trksegType();
                trk_seg.trkpt = trkpt;

                trksegTypeCollection trk_seg_cl = new trksegTypeCollection();
                trk_seg_cl.Addtrkseg(trk_seg);

                trkType trk = new trkType();
                trk.name   = DateTime.Now.ToString("MM/dd/yyyy h:mm tt");
                trk.trkseg = trk_seg_cl;

                track.trk = new trkTypeCollection();
                track.trk.Add(trk);
                track.ToFile(saveFileDialog1.FileName);

                System.Windows.Forms.MessageBox.Show("GPX file is saved!");

                // back to the teleport mode.
                cur_click_mode            = e_click_mode.teleport;
                gpx_create_button.Content = "Create GPX";
                way_points.Text           = "";
                gpx_locations.Clear();
                myMap.Children.Clear();
                gpx_save_button.IsEnabled = false;
            }
        }
Exemple #3
0
        static void Main()
        {
            try
            {
                // read a file
                GpxClass gpx = GpxClass.FromFile("Files\\All Buntzen Trails.gpx");

                gpx.rte.ForEach(x => Console.WriteLine("Route: {0}\r\n", x.name));
                gpx.wpt.ForEach(x => Console.WriteLine("Waypoint: {0}\r\n", x.name));
                gpx.trk.ForEach(x => Console.WriteLine("Track: {0}\r\n", x.name));

                // create a new file
                GpxClass newGpx = new GpxClass()
                {
                    creator = WindowsIdentity.GetCurrent().Name,
                    version = "Test",
                    wpt     = new wptTypeCollection(),
                };

                wptType waypoint = new wptType()
                {
                    name          = "Test Waypoint",
                    cmt           = "Comment",
                    desc          = "Description",
                    lat           = (Decimal)49.3402360,
                    lon           = (Decimal)(-122.8770030),
                    time          = DateTime.Now,
                    timeSpecified = true,
                    sym           = "Waypoint",
                };

                newGpx.wpt.Add(waypoint);

                newGpx.ToFile("Test.gpx");

                CreateTrack();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error processing file:\r\n{0}", ex);
            }
        }
Exemple #4
0
        private static void read_gpx_coords(string gpx_file_name, ref LocationCollection lc)
        {
            GpxClass gpx = GpxClass.FromFile(gpx_file_name);

            foreach (var wpt in gpx.wpt)
            {
                lc.Add(new Location(Convert.ToDouble(wpt.lat),
                                    Convert.ToDouble(wpt.lon),
                                    Convert.ToDouble(wpt.ele)));
            }

            foreach (var trk in gpx.trk)
            {
                foreach (var trk_seg in trk.trkseg)
                {
                    foreach (var trkpt in trk_seg.trkpt)
                    {
                        lc.Add(new Location(Convert.ToDouble(trkpt.lat),
                                            Convert.ToDouble(trkpt.lon),
                                            Convert.ToDouble(trkpt.ele)));
                    }
                }
            }
        }
Exemple #5
0
        static void Main(string[] args)
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            // Generate some FIT messages
            FileIdMesg fileIdMesg = new FileIdMesg();

            fileIdMesg.SetManufacturer(Manufacturer.Dynastream);  // Types defined in the profile are available
            fileIdMesg.SetProduct(1000);
            fileIdMesg.SetSerialNumber(12345);

            //UserProfileMesg myUserProfile = new UserProfileMesg();
            //myUserProfile.SetGender(Gender.Female);
            //float myWeight = 63.1F;
            //myUserProfile.SetWeight(myWeight);
            //myUserProfile.SetAge(99);
            //myUserProfile.SetFriendlyName(Encoding.UTF8.GetBytes("TestUser"));

            var route = GpxClass.FromFile("route.gpx");

            CourseMesg course = new CourseMesg();

            course.SetName(Encoding.UTF8.GetBytes("route from gpx"));
            course.SetSport(Sport.Cycling);

            var baseDate = route.metadata.timeSpecified ? route.metadata.time : System.DateTime.Now.AddDays(-1);

            FileStream fitDest = new FileStream("Test.fit", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);

            // Create file encode object
            Encode encodeDemo = new Encode();

            // Write our header
            encodeDemo.Open(fitDest);
            // Encode each message, a definition message is automatically generated and output if necessary
            encodeDemo.Write(fileIdMesg);
            //encodeDemo.Write(myUserProfile);

            encodeDemo.Write(course);

            var lap = new LapMesg();

            encodeDemo.Write(lap);


            var firstTrk = route.trk.First();

            var firstTrkSeg = firstTrk.trkseg.First();

            var firstPoint = firstTrkSeg.trkpt.First();

            lap.SetTimestamp(new fit.DateTime(firstPoint.time));
            lap.SetStartPositionLat(firstPoint.lat.RawInt());
            lap.SetStartPositionLong(firstPoint.lon.RawInt());

            var lastPoint = firstTrkSeg.trkpt.Last();

            lap.SetEndPositionLat(lastPoint.lat.RawInt());
            lap.SetEndPositionLong(lastPoint.lon.RawInt());

            var e = new EventMesg();

            e.SetTimestamp(new fit.DateTime(firstPoint.time));
            e.SetEventType(EventType.Start);
            e.SetEventGroup(0);
            e.SetEvent(Event.Timer);
            e.SetData(null);
            encodeDemo.Write(e);

            foreach (var point in firstTrkSeg.trkpt)
            {
                var p = new RecordMesg();
                p.SetPositionLat(point.lat.RawInt());
                p.SetPositionLong(point.lon.RawInt());
                //p.SetDistance(point. 10665.65f);
                p.SetAltitude(Convert.ToSingle(point.ele));
                p.SetTimestamp(new fit.DateTime(baseDate));

                encodeDemo.Write(p);
            }

            var eventStop = new EventMesg();

            eventStop.SetData(null);
            eventStop.SetTimestamp(new fit.DateTime(lastPoint.time));
            eventStop.SetEvent(Event.Timer);
            eventStop.SetEventType(EventType.StopDisableAll);
            encodeDemo.Write(eventStop);

            // Update header datasize and file CRC
            encodeDemo.Close();

            fitDest.Close();

            Console.WriteLine("Encoded FIT file test.fit");
            stopwatch.Stop();
            Console.WriteLine("Time elapsed: {0:0.#}s", stopwatch.Elapsed.TotalSeconds);

            Console.ReadKey();
        }
Exemple #6
0
        public async Task <IActionResult> GetRouteDataAsGeoJSON(int entryId)
        {
            try
            {
                var entry = await _context.Leaderboard.FindAsync(entryId);

                if (entry == null)
                {
                    throw new Exception("No data found!");
                }

                if (!string.IsNullOrEmpty(entry.RouteData))
                {
                    XDocument xml = XDocument.Parse(entry.RouteData);

                    if (xml.Document == null)
                    {
                        throw new Exception("Entry has no route data!");
                    }

                    if (entry.RouteDataType == ".gpx")
                    {
                        GpxClass gpx = new GpxClass();

                        gpx.Name = xml.Document.Descendants().FirstOrDefault(x => x.Name.LocalName == "name")?.Value ?? "";
                        gpx.Time = xml.Document.Descendants().FirstOrDefault(x => x.Name.LocalName == "time")?.Value ?? "";

                        gpx.TrkPts = xml.Document.Descendants().Where(x => x.Name.LocalName == "trkpt").Select(s => new TrkPt
                        {
                            Elevation = s.Descendants().FirstOrDefault(x => x.Name.LocalName == "ele")?.Value ?? "",
                            Lat       = s.Attribute("lat")?.Value ?? "",
                            Long      = s.Attribute("lon")?.Value ?? "",
                            Time      = s.Descendants().FirstOrDefault(x => x.Name.LocalName == "time")?.Value ?? "",
                        })
                                     .ToList();

                        return(Ok(new BasicHttpResponse <GeoJson>()
                        {
                            Ok = true, Data = gpx.ToGeoJson(entry.EntryName)
                        }));
                    }
                    else if (entry.RouteDataType == ".tcx")
                    {
                        TcxClass tcx = new TcxClass();

                        tcx.Name = xml.Document.Descendants().FirstOrDefault(x => x.Name.LocalName == "Name")?.Value ?? "";

                        tcx.Trackpoints = xml.Document.Descendants().Where(x => x.Name.LocalName == "Trackpoint").Select(s => new TrackPoint
                        {
                            Time     = s.Descendants().FirstOrDefault(x => x.Name.LocalName == "Time")?.Value ?? "",
                            Position = new TcxPosition
                            {
                                Lat  = s.Descendants().FirstOrDefault(x => x.Name.LocalName == "LatitudeDegrees")?.Value ?? "",
                                Long = s.Descendants().FirstOrDefault(x => x.Name.LocalName == "LongitudeDegrees")?.Value ?? "",
                            },
                            Altitude = s.Descendants().FirstOrDefault(x => x.Name.LocalName == "AltitudeMeters")?.Value ?? ""
                        })
                                          .ToList();

                        return(Ok(new BasicHttpResponse <GeoJson>()
                        {
                            Ok = true, Data = tcx.ToGeoJson(entry.EntryName)
                        }));
                    }

                    throw new Exception("Route data type not correct!");
                }

                throw new Exception("Nothing found!");
            }
            catch (Exception e)
            {
                return(Ok(new BasicHttpResponse <object>()
                {
                    Ok = false, Message = $"Error: {Shared.Helpers.Functions.ExceptionMessage(e)}"
                }));
            }
        }
Exemple #7
0
        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            View          itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.activity_gpx, parent, false);
            GPXViewHolder vh       = new GPXViewHolder(itemView, OnClick);

            vh.img_more.Click += (o, e) =>
            {
                Android.Support.V7.Widget.PopupMenu popup = new Android.Support.V7.Widget.PopupMenu(parent.Context, vh.img_more);
                popup.Inflate(Resource.Menu.menu_gpx);

                popup.MenuItemClick += async(s, args) =>
                {
                    switch (args.Item.ItemId)
                    {
                    case Resource.Id.gpx_menu_followroute:
                        Log.Information($"Follow route '{vh.Name.Text}'");

                        //Get the route
                        var      route    = RouteDatabase.GetRouteAsync(vh.Id).Result;
                        GpxClass gpx      = GpxClass.FromXml(route.GPX);
                        string   mapRoute = Import.GPXtoRoute(gpx.Routes[0]).Item1;

                        //Add GPX to Map
                        Import.AddRouteToMap(mapRoute);

                        //Center on imported route
                        var   bounds = gpx.GetBounds();
                        Point p      = Utils.Misc.CalculateCenter((double)bounds.maxlat, (double)bounds.minlon, (double)bounds.minlat, (double)bounds.maxlon);
                        var   sphericalMercatorCoordinate = SphericalMercator.FromLonLat(p.X, p.Y);
                        Fragment_map.mapControl.Navigator.CenterOn(sphericalMercatorCoordinate);

                        //Zoom
                        Fragment_map.mapControl.Navigator.ZoomTo(PrefsActivity.MaxZoom);

                        //Switch to map
                        MainActivity.SwitchFragment("Fragment_map", (FragmentActivity)parent.Context);

                        //Start recording
                        RecordTrack.StartTrackTimer();
                        NavigationView nav      = MainActivity.mContext.FindViewById <NavigationView>(Resource.Id.nav_view);
                        var            item_nav = nav.Menu.FindItem(Resource.Id.nav_recordtrack);
                        item_nav.SetTitle("Stop Recording");

                        break;

                    case Resource.Id.gpx_menu_showonmap:
                        Log.Information($"Show route on map '{vh.Name.Text}'");

                        //Get the route
                        var      route_1    = RouteDatabase.GetRouteAsync(vh.Id).Result;
                        GpxClass gpx_1      = GpxClass.FromXml(route_1.GPX);
                        string   mapRoute_1 = Import.GPXtoRoute(gpx_1.Routes[0]).Item1;

                        //Add GPX to Map
                        Import.AddRouteToMap(mapRoute_1);

                        //Center on imported route
                        var   bounds_1 = gpx_1.GetBounds();
                        Point p_1      = Utils.Misc.CalculateCenter((double)bounds_1.maxlat, (double)bounds_1.minlon, (double)bounds_1.minlat, (double)bounds_1.maxlon);
                        var   sphericalMercatorCoordinate_1 = SphericalMercator.FromLonLat(p_1.X, p_1.Y);
                        Fragment_map.mapControl.Navigator.CenterOn(sphericalMercatorCoordinate_1);

                        //Zoom
                        Fragment_map.mapControl.Navigator.ZoomTo(PrefsActivity.MaxZoom);

                        //Switch to map
                        MainActivity.SwitchFragment("Fragment_map", (FragmentActivity)parent.Context);

                        break;

                    case Resource.Id.gpx_menu_deleteroute:
                        Log.Information($"Delete route '{vh.Name.Text}'");

                        Show_Dialog msg1 = new Show_Dialog(MainActivity.mContext);
                        if (await msg1.ShowDialog($"Delete", $"Delete '{vh.Name.Text}' ?", Android.Resource.Attribute.DialogIcon, true, Show_Dialog.MessageResult.YES, Show_Dialog.MessageResult.NO) == Show_Dialog.MessageResult.YES)
                        {
                            _ = Data.RouteDatabase.DeleteRouteAsync(vh.Id);
                            mGpxData.RemoveAt(vh.AdapterPosition);
                            NotifyDataSetChanged();
                        }

                        break;

                    case Resource.Id.gpx_menu_reverseroute:
                        Log.Information($"Reverse route '{vh.Name.Text}'");

                        //Get the route
                        var      route_to_reverse = RouteDatabase.GetRouteAsync(vh.Id).Result;
                        GpxClass gpx_to_reverse   = GpxClass.FromXml(route_to_reverse.GPX);
                        gpx_to_reverse.Routes[0].rtept.Reverse();

                        //Reverse and save as new entry
                        route_to_reverse.Name        += " - reversed";
                        route_to_reverse.Description += " - reversed";
                        route_to_reverse.Id           = 0;
                        route_to_reverse.GPX          = gpx_to_reverse.ToXml();
                        RouteDatabase.SaveRouteAsync(route_to_reverse).Wait();

                        //Update RecycleView with new entry
                        int i = Fragment_gpx.mAdapter.mGpxData.Add(route_to_reverse);
                        Fragment_gpx.mAdapter.NotifyItemInserted(i);

                        break;

                    case Resource.Id.gpx_menu_exportgpx:
                        Log.Information($"Export route '{vh.Name.Text}'");

                        //Get the route
                        var      route_to_export = RouteDatabase.GetRouteAsync(vh.Id).Result;
                        GpxClass gpx_to_export   = GpxClass.FromXml(route_to_export.GPX);

                        /**/    //Ask user for name and folder
                        string gpxPath = Path.Combine(MainActivity.rootPath, "Exported -" + DateTime.Now.ToString("yyyy-MM-dd HH-mm") + ".gpx");
                        gpx_to_export.ToFile(gpxPath);

                        break;

                    case Resource.Id.gpx_menu_saveofflinemap:
                        Log.Information($"Download and save offline map '{vh.Name.Text}'");
                        Toast.MakeText(parent.Context, "save offline map " + vh.AdapterPosition.ToString(), ToastLength.Short).Show();
                        break;
                    }
                };

                popup.Show();
            };

            return(vh);
        }

        private void OnClick(int obj)
        {
            ItemClick?.Invoke(this, obj);
        }

        /*public static void MAdapter_ItemClick(object sender, int e)
         * {
         *  int gpxNum = e + 1;
         *  Toast.MakeText(MainActivity.mContext, "This is route/track number " + gpxNum, ToastLength.Short).Show();
         * }*/
    }
}
Exemple #8
0
        private static void CreateTrack()
        {
            GpxClass track = new GpxClass()
            {
                metadata = new metadataType()
                {
                    author = new personType()
                    {
                        name = WindowsIdentity.GetCurrent().Name
                    },
                    link = new linkTypeCollection().AddLink(new linkType()
                    {
                        href = "www.BlueToque.ca", text = "Blue Toque Software"
                    })
                },
                trk = new trkTypeCollection()
            };

            track.trk.Add(new trkType()
            {
                name   = "11-AUG-11 18:18:27",
                trkseg = new trksegTypeCollection().Addtrkseg(
                    new trksegType()
                {
                    trkpt = new wptTypeCollection()
                            .Addwpt(new wptType()
                    {
                        lat          = (Decimal)49.706482,
                        lon          = (Decimal)(-123.111961),
                        ele          = (Decimal)38.11,
                        eleSpecified = true,
                    })
                            .Addwpt(new wptType()
                    {
                        lat          = (Decimal)49.706417,
                        lon          = (Decimal)(-123.112190),
                        ele          = (Decimal)38.11,
                        eleSpecified = true,
                    })
                            .Addwpt(new wptType()
                    {
                        lat          = (Decimal)49.706348,
                        lon          = (Decimal)(-123.112495),
                        ele          = (Decimal)76.08,
                        eleSpecified = true,
                    })
                            .Addwpt(new wptType()
                    {
                        lat          = (Decimal)49.706242,
                        lon          = (Decimal)(-123.111961),
                        ele          = (Decimal)74.16,
                        eleSpecified = true,
                    })
                            .Addwpt(new wptType()
                    {
                        lat          = (Decimal)49.705872,
                        lon          = (Decimal)(-123.111961),
                        ele          = (Decimal)38.11,
                        eleSpecified = true,
                    })
                })
            });

            track.ToFile("Test2.gpx");
        }
Exemple #9
0
 internal BlueToque.GpxLib.GPX1_1.gpxType ToGpx1_1(GpxClass gpx)
 {
     return new BlueToque.GpxLib.GPX1_1.gpxType()
     {
         creator = gpx.creator,
         extensions = gpx.extensions,
         metadata = gpx.metadata,
         version = gpx.version,
         rte = gpx.rte == null ? new BlueToque.GpxLib.GPX1_1.rteTypeCollection() : new BlueToque.GpxLib.GPX1_1.rteTypeCollection(gpx.rte),
         trk = gpx.trk == null ? new BlueToque.GpxLib.GPX1_1.trkTypeCollection() : new BlueToque.GpxLib.GPX1_1.trkTypeCollection(gpx.trk),
         wpt = gpx.wpt == null ? new BlueToque.GpxLib.GPX1_1.wptTypeCollection() : new BlueToque.GpxLib.GPX1_1.wptTypeCollection(gpx.wpt),
     };
 }
Exemple #10
0
        static void Main(string[] args)
        {
            Logger logger = LogManager.GetCurrentClassLogger();

            Parser.Default.ParseArguments <Options>(args)
            .WithParsed <Options>(o =>
            {
                if (!Directory.Exists(o.InputFolder))
                {
                    logger.Error("Input folder does not exist... skipping");
                    return;
                }

                if (!Directory.Exists(o.Destination))
                {
                    logger.Info("output folder does not exist, creating");
                    Directory.CreateDirectory(o.Destination);
                }

                string[] gpsFiles = Directory.GetFiles(o.InputFolder, "*.gps", SearchOption.AllDirectories);
                logger.Info($"found {gpsFiles.Length} files");

                DateTime maxSpeedDate  = new DateTime();
                DateTime currentDate   = new DateTime();
                DateTime lastDate      = new DateTime();
                bool dateSet           = false;
                long maxSpeedKnots     = 0;
                double longitude       = 0;
                double latitude        = 0;
                double alt             = 0;
                bool latSet            = false;
                bool longSet           = false;
                bool altSet            = false;
                int dayCount           = 0;
                wptTypeCollection coll = new wptTypeCollection();
                string gpxFileLocation = string.Empty;
                GpxClass track         = new GpxClass();

                List <wptType> waypoints = new List <wptType>();

                for (int i = 0; i < gpsFiles.Length; i++)
                {
                    string f = gpsFiles[i];
                    logger.Info($"Parsing {f}");
                    string[] lines = File.ReadAllLines(f);
                    logger.Debug($"found {lines.Length} in {f}");
                    foreach (var readLine in lines)
                    {
                        DateTime internalDate = new DateTime();
                        string message        = "";
                        if (readLine.StartsWith("["))
                        {
                            long epoc    = Convert.ToInt64(readLine.Split('[', ']')[1]);
                            message      = Regex.Replace(readLine, "\\[.*?\\]", "");
                            internalDate = UnixEPOCtoDateTime((double)epoc);
                            if (currentDate.Date != internalDate.Date)
                            {
                                logger.Debug($"Date Change. old Date {currentDate} new Date {internalDate}");
                                currentDate = new DateTime(internalDate.Year, internalDate.Month, internalDate.Day);
                            }
                            if (!dateSet)
                            {
                                lastDate = currentDate;
                                dateSet  = true;
                            }
                        }

                        if (message.StartsWith("$GPRMC") || message.StartsWith("$GNRMC"))    //recomended minimum data for GPS
                        {
                            try
                            {
                                Rmc rmc   = (Rmc)NmeaMessage.Parse(message);
                                latitude  = rmc.Latitude;
                                longitude = rmc.Longitude;

                                if ((double)maxSpeedKnots < rmc.Speed)
                                {
                                    maxSpeedKnots = (long)rmc.Speed;
                                    maxSpeedDate  = internalDate;
                                }
                            }
                            catch (Exception ex)
                            {
                                logger.Warn($"GPRMC: {ex.Message}");
                            }
                        }
                        else if (message.StartsWith("$GPVTG") || message.StartsWith("$GNVTG"))    // vector track and speed over ground
                        {
                            try
                            {
                                Vtg vtg = (Vtg)NmeaMessage.Parse(message);
                                if ((double)maxSpeedKnots < vtg.SpeedKnots)
                                {
                                    maxSpeedKnots = (long)vtg.SpeedKnots;
                                    maxSpeedDate  = internalDate;
                                }
                            }
                            catch (Exception ex)
                            {
                                logger.Warn($"$GPVTG: {ex.Message}");
                            }
                        }
                        else if (message.StartsWith("$GPGGA") || message.StartsWith("$GNGGA"))    // fix information
                        {
                            try
                            {
                                Gga gga   = (Gga)NmeaMessage.Parse(message);
                                alt       = gga.Altitude;
                                longitude = gga.Longitude;
                                latitude  = gga.Latitude;
                                latSet    = true;
                                longSet   = true;
                                altSet    = true;
                            }
                            catch (Exception ex)
                            {
                                logger.Warn("GPGGA:" + ex.Message);
                            }
                        }
                        else if (message.StartsWith("$GPGSA") || message.StartsWith("$GNGSA"))    //overall satelite data
                        {
                            try
                            {
                                Gsa gsa = (Gsa)NmeaMessage.Parse(message);
                            }
                            catch (Exception ex)
                            {
                                logger.Warn("GPGSA:" + ex.Message);
                            }
                        }
                        else if (message.StartsWith("$GPGSV") || message.StartsWith("$GNGSV"))
                        {
                            try
                            {
                                Gsv gsv = (Gsv)NmeaMessage.Parse(message);
                            }
                            catch (Exception ex)
                            {
                                logger.Warn("GPGSV:" + ex.Message);
                            }
                        }
                        else if (message.StartsWith("$GPGLL") || message.StartsWith("$GNGLL"))
                        {
                            try
                            {
                                Gll gll   = (Gll)NmeaMessage.Parse(message);
                                longitude = gll.Longitude;
                                latitude  = gll.Latitude;
                                latSet    = true;
                                longSet   = true;
                            }
                            catch (Exception ex)
                            {
                                logger.Warn("GPGLL:" + ex.Message);
                            }
                        }

                        if (latSet && longSet && altSet && CheckDouble(longitude) && CheckDouble(latitude) && CheckDouble(alt))
                        {
                            waypoints.Add(new wptType(latitude, longitude, alt, internalDate));
                            latSet  = false;
                            longSet = false;
                            altSet  = false;

                            if (lastDate.Date != currentDate.Date)
                            {
                                coll = new wptTypeCollection();
                                coll.AddRange(waypoints);
                                track = new GpxClass();
                                track.Tracks.Add(new trkType()
                                {
                                    name   = currentDate.ToString(),
                                    trkseg = new trksegTypeCollection().AddItem(
                                        new trksegType()
                                    {
                                        trkpt = coll
                                    })
                                });
                                gpxFileLocation = Path.Combine(o.Destination, $"{lastDate.Date.ToString("yyyyMMdd")}.gpx");
                                track.ToFile(gpxFileLocation);
                                waypoints = new List <wptType>();
                                dayCount++;
                                lastDate = currentDate.Date;
                            }
                        }
                    }
                }

                coll = new wptTypeCollection();
                coll.AddRange(waypoints);
                track = new GpxClass();
                track.Tracks.Add(new trkType()
                {
                    name   = currentDate.ToString(),
                    trkseg = new trksegTypeCollection().AddItem(
                        new trksegType()
                    {
                        trkpt = coll
                    })
                });
                gpxFileLocation = Path.Combine(o.Destination, $"{lastDate.Date.ToString("yyyyMMdd")}.gpx");
                track.ToFile(gpxFileLocation);


                Console.WriteLine($"Max speed: {maxSpeedKnots * 1.852}KM/h at {maxSpeedDate}");
            });
        }
Exemple #11
0
        public static ILayer GetRoute()
        {
            var strRoute = string.Empty;

            MainThread.BeginInvokeOnMainThread(async() =>
            {
                bool DownloadOfflineMap = false;
                GpxClass gpxData        = await PickAndParse();

                if (gpxData == null)
                {
                    return;
                }

                //Does the user want maps downloaded for offline usage?
                Show_Dialog msg1 = new Show_Dialog(MainActivity.mContext);
                if (await msg1.ShowDialog($"Offline Map", $"Download map for offline usage?", Android.Resource.Attribute.DialogIcon, true, Show_Dialog.MessageResult.YES, Show_Dialog.MessageResult.NO) == Show_Dialog.MessageResult.YES)
                {
                    DownloadOfflineMap = true;
                }

                foreach (rteType route in gpxData.Routes)
                {
                    //Get Route and distance from GPX
                    var t               = GPXtoRoute(route);
                    string mapRoute     = t.Item1;
                    float mapDistanceKm = t.Item2;

                    //Create a standalone GPX
                    var newGPX = new GpxClass()
                    {
                        Metadata = new metadataType()
                        {
                            name = route.name,
                            desc = route.desc,
                        },
                    };
                    newGPX.Routes.Add(route);

                    //Add to route DB
                    var r = new Route
                    {
                        Name        = route.name,
                        Distance    = mapDistanceKm,
                        Ascent      = 0, /**///Fix this
                        Description = route.desc,
                        GPX         = newGPX.ToXml(),
                    };
                    RouteDatabase.SaveRouteAsync(r).Wait();

                    //Update RecycleView with new entry
                    int i = Fragment_gpx.mAdapter.mGpxData.Add(r);
                    Fragment_gpx.mAdapter.NotifyItemInserted(i);

                    //Does the user want the maps downloaded?
                    if (DownloadOfflineMap)
                    {
                        var bounds = route.GetBounds();
                        //map.BoundsLeft = -37.5718; map.BoundsRight = -37.5076; map.BoundsBottom = 145.5424; map.BoundsTop = 145.5189;
                        //Left: -10.2455, Top:  110.5426 Right: -43.2748, Bottom:  154.3179

                        Models.Map map = new Models.Map
                        {
                            Name         = Regex.Replace(route.name, @"[^\u0000-\u007F]+", ""), //Removes non-ascii characters from filename
                            ZoomMin      = PrefsActivity.MinZoom,
                            ZoomMax      = PrefsActivity.MaxZoom,
                            BoundsLeft   = (double)bounds.minlat,
                            BoundsBottom = (double)bounds.maxlon,
                            BoundsRight  = (double)bounds.maxlat,
                            BoundsTop    = (double)bounds.minlon
                        };

                        //Download map
                        await DownloadRasterImageMap.DownloadMap(map);

                        //Load map
                        string dbPath = MainActivity.rootPath + "/MBTiles/" + map.Name + ".mbtiles";
                        Log.Information($"Loading '{dbPath}' as layer name '{map.Name}'");
                        Fragment_map.map.Layers.Add(OfflineMaps.CreateMbTilesLayer(dbPath, map.Name));
                    }

                    //Add to map
                    AddRouteToMap(mapRoute);

                    /*var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString(file, true), null, MbTilesType.Overlay, true, true);
                     * var mbTilesLayer = new TileLayer(mbTilesTileSource) { Name = file };
                     * MainActivity.map.Layers.Add(mbTilesLayer);*/
                }

                Show_Dialog msg3 = new Show_Dialog(MainActivity.mContext);
                await msg3.ShowDialog($"Done", $"GPX Import Completed", Android.Resource.Attribute.DialogIcon, true, Show_Dialog.MessageResult.NONE, Show_Dialog.MessageResult.OK);
            });

            return(null);
        }
Exemple #12
0
        private static async Task <GpxClass> PickAndParse()
        {
            try
            {
                var options = new PickOptions
                {
                    PickerTitle = "Please select a GPX file",
                    FileTypes   = new FilePickerFileType(new Dictionary <DevicePlatform, IEnumerable <string> >
                    {
                        /**///What is mime type for GPX files?!?
                        //{ DevicePlatform.Android, new string[] { "gpx/gpx"} },
                        { DevicePlatform.Android, null },
                    })
                };

                var result = await FilePicker.PickAsync(options);

                if (result == null)
                {
                    return(null);
                }

                Console.WriteLine("FileName: " + result.FileName + ", FilePath: " + result.FullPath);
                if (result.FileName.EndsWith("gpx", StringComparison.OrdinalIgnoreCase) == false)
                {
                    return(null);
                }

                var stream = await result.OpenReadAsync();

                string contents = string.Empty;
                using (var reader = new StreamReader(stream))
                {
                    contents = reader.ReadToEnd();
                }

                GpxClass gpx    = GpxClass.FromXml(contents);
                var      bounds = gpx.GetBounds();

                Console.WriteLine("Waypoints.Count: " + gpx.Waypoints.Count.ToString());
                Console.WriteLine("Routes.Count: " + gpx.Routes.Count.ToString());
                Console.WriteLine("Track.Count: " + gpx.Tracks.Count.ToString());
                Console.WriteLine("Lower Left - MinLat: " + bounds.minlat.ToString() + ", MaxLon: " + bounds.maxlon.ToString());
                Console.WriteLine("Top Right  - MaxLat: " + bounds.maxlat.ToString() + ", MinLon: " + bounds.minlon.ToString());

                string r = "routes";
                if (gpx.Routes.Count == 1)
                {
                    r = "route";
                }

                string t = "tracks";
                if (gpx.Tracks.Count == 1)
                {
                    t = "track";
                }

                Show_Dialog msg1 = new Show_Dialog(MainActivity.mContext);
                if (await msg1.ShowDialog($"{result.FileName}", $"Found {gpx.Routes.Count} {r} and {gpx.Tracks.Count} {t}. Import?", Android.Resource.Attribute.DialogIcon, true, Show_Dialog.MessageResult.YES, Show_Dialog.MessageResult.NO) != Show_Dialog.MessageResult.YES)
                {
                    return(null);
                }

                return(gpx);
            }
            catch (Exception)
            {
                // The user canceled or something went wrong
            }

            return(null);
        }