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; } }
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); } }
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))); } } } }
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(); }
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)}" })); } }
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(); * }*/ } }
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"); }
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), }; }
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}"); }); }
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); }
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); }