Exemple #1
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #6
0
        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));
            }
        }