private TrackEditModel InitEditModel(TrackEditData track) { // prepare edit model var model = new TrackEditModel(); model.File = new FileInfo(track.Source); model.Track = track; // build fake trail data var topoTrail = new TopoTrailInfo(); var first = track.Points.FirstOrDefault(); var country = Graffiti.Geo.NearestCountry(first); if (country != null) { topoTrail.Country = country; if (country.HasRegions) { var region = Graffiti.Geo.NearestRegion(first); if (region != null && topoTrail.Timezone == null) { topoTrail.Timezone = Graffiti.Geo.GuessTimezone(region); } topoTrail.Region = region; } if (topoTrail.Timezone == null) { topoTrail.Timezone = Graffiti.Geo.GuessTimezone(country); } } if (topoTrail.Timezone == null) { topoTrail.Timezone = GeoTimezoneInfo.UTC; } // start and finish places var topoTrack = new TopoTrackInfo(topoTrail, track); topoTrack.StartPlace = _cartoPlaceService.NearestPlace(topoTrack.StartPoint); topoTrack.FinishPlace = _cartoPlaceService.NearestPlace(topoTrack.FinishPoint); model.TopoTrack = topoTrack; // discover additional places var bounds = GeoPerimeter.FromPoints(track.Points); model.NearbyPlaces = _cartoPlaceService.ListPlacesContainingBounds(bounds); model.ContainedPlaces = _cartoPlaceService.ListPlacesContainedInBounds(bounds); // default filter values var filters = new TrackEditFilter(); filters.MaximumDilution = track.Points.Max(x => _trackEditService.GetMaxDOP(x)); filters.MaximumVelocity = track.Points.Max(x => x.Speed ?? 0); filters.MinimumSatellite = track.Points.Min(x => x.Sats ?? 0); model.Filters = filters; return(model); }
public TopoStats GetTopoStats(TopoTrackInfo track) { if (!HasElevation) { return(track.Stats); } else { return(Elevation.TopoTracks.FirstOrDefault(x => x.Name == track.Name)?.Stats ?? track.Stats); } }
/// <summary> /// Updates the start and finish places on the given track /// </summary> public List <CartoPlaceInfo> UpdateTrackPlaces(TopoTrackInfo track) { var places = new List <CartoPlaceInfo>(); track.StartPlace = _cartoPlaceService.ListPlacesByContainingPoint(track.TopoPoints.First()).OrderBy(x => x.Bounds.Area).FirstOrDefault(); track.FinishPlace = _cartoPlaceService.ListPlacesByContainingPoint(track.TopoPoints.Last()).OrderBy(x => x.Bounds.Area).FirstOrDefault(); if (track.StartPlace != null) { places.Add(track.StartPlace); } if (track.FinishPlace != null && (!places.Any(x => x.Key == track.FinishPlace.Key))) { places.Add(track.FinishPlace); } return(places); }
public ActionResult Import() { // TODO: REFACTOR: move to service and fix TopoTrail.Track useage var model = InitModel(); model.Trail = _editing; model.Edit = new TopoTrailFormModel(_editing); // TODO: duplicated in GET + POST var tracks = new List <TopoTrackInfo>(); foreach (var t in _trackEditService.ListTracks()) { var track = new TopoTrackInfo(_editing, t); _topoTrailService.UpdateTrackPlaces(track); tracks.Add(track); } model.Tracks = tracks; return(View(model)); }
private OrthoTrackImportModel InitOrthoTrackImportModel(FileInfo file) { var model = new OrthoTrackImportModel(); // init model model.File = file; // load raw file data model.Data = new GpxFileInfo(file.FullName); // match with existing trail var existing = _trailDataService.FindTrackSource_TODO(file.Name); model.Trail = existing?.Trail; // build trail preview var trail = new TopoTrailInfo(); model.Preview = trail; // find intersecting places var points = model.Data.Tracks?.SelectMany(x => x.PointData); if (points != null) { var bounds = new GeoPerimeter(points.Select(x => new GeoPosition(x.Latitude, x.Longitude))); model.Places = _cartoPlaceService.ListPlacesContainingBounds(bounds).OrderBy(x => x.Bounds.Area).ToList(); model.Nearby = _cartoPlaceService.ListPlacesContainedInBounds(bounds).OrderBy(x => x.Bounds.Area).ToList(); } // set trail information var first = points?.FirstOrDefault(); if (first != null) { trail.Country = Graffiti.Geo.NearestCountry(first); trail.Region = Graffiti.Geo.NearestRegion(first); trail.Timezone = Graffiti.Geo.GuessTimezone(trail.Country); //trail.StartLocal = trail.Timezone.FromUTC(first.Timestamp.Value); // discover all regions model.Regions = Graffiti.Geo.NearbyRegions(first); foreach (var region in Graffiti.Geo.NearbyRegions(points.Last())) { if (!model.Regions.Any(x => x.RegionID == region.RegionID)) { model.Regions.Add(region); } } } // build track previews foreach (var t in model.Data.Tracks) { var track = new TopoTrackInfo(trail, t); var start = t.PointData.First(); track.StartPlace = _cartoPlaceService.ListPlacesByContainingPoint(start).OrderBy(x => x.Bounds.Area).FirstOrDefault(); var finish = t.PointData.Last(); track.FinishPlace = _cartoPlaceService.ListPlacesByContainingPoint(finish).OrderBy(x => x.Bounds.Area).FirstOrDefault(); trail.AddTrack_TODO_DEPRECATE(track); } return(model); }
public ActionResult Import(TopoTrailFormModel update) { // TODO: REFACTOR: move to service and fix TopoTrail.Track useage // validate form inputs var response = _topoTrailService.ValidateCreate(update); if (response.OK) { var key = ""; // do create if (String.IsNullOrWhiteSpace(update.Key)) { var trail = new TopoTrailInfo(update, null); foreach (var t in _trackEditService.ListTracks()) { var track = new TopoTrackInfo(trail, t); trail.AddTrack_TODO_DEPRECATE(track); } key = _topoTrailService.CreateTrail(trail); } else // do update { // replace trails on existing track var trail = _topoTrailService.GetTrail(update.Key); trail.ClearTracks_TODO_DEPRECATE(); foreach (var t in _trackEditService.ListTracks()) { var track = new TopoTrackInfo(_editing, t); trail.AddTrack_TODO_DEPRECATE(track); } key = _topoTrailService.UpdateTrail(update).Data.Key; } // show results var model = InitModel(key); model.Edit = new TopoTrailFormModel(model.Trail); model.ConfirmMessage = $"Trail imported at {DateTime.Now}"; return(View(model)); } else { var model = InitModel(); model.Trail = _editing; model.Edit = update; // TODO: duplicated in GET + POST var tracks = new List <TopoTrackInfo>(); foreach (var t in _trackEditService.ListTracks()) { var track = new TopoTrackInfo(_editing, t); _topoTrailService.UpdateTrackPlaces(track); tracks.Add(track); } model.Tracks = tracks; model.AddValidationErrors(response.ValidationErrors); return(View(model)); } }