コード例 #1
0
        private bool AddPoint(List <PointLatLng> mapPoints, Geo.Gps.Fix lastPoint, Geo.Gps.Fix newPoint, double minimimDistance, string tagName)
        {
            double distance = GetDistance(lastPoint.Coordinate.Latitude, lastPoint.Coordinate.Longitude, newPoint.Coordinate.Latitude, newPoint.Coordinate.Longitude);

            if (options.DisconnectGapPoints && distance >= options.DisconnectTrackGapsMultiple * minimimDistance)
            {
                // start new route if point is too far away
                AddRoute(mapPoints, tagName);
                mapPoints.Clear();
                mapPoints.Add(new PointLatLng(newPoint.Coordinate.Latitude, newPoint.Coordinate.Longitude));

                return(true);
            }
            else if (distance > minimimDistance)
            {
                mapPoints.Add(new PointLatLng(newPoint.Coordinate.Latitude, newPoint.Coordinate.Longitude));
                return(true);
            }

            return(false);
        }
コード例 #2
0
        public void Run(GMapControl gMap, List <Geo.Gps.Track> tracks, TracksOptimiserOptions options)
        {
            if (tracks == null)
            {
                return;
            }
            this.gMap    = gMap;
            this.options = options;

            int minPixels = 10;

            switch (options.TracksStyles)
            {
            case TracksStyles.Simple: minPixels = 3; break;

            case TracksStyles.With_background: minPixels = 7; break;

            default: break;
            }

            double      minimimDistance = minPixels /* at least 3 pixels */ * gMap.ViewArea.WidthLng / gMap.Size.Width;
            int         oldCount = 0, newCount = 0;
            GMapOverlay tracksPolygonsOverlay  = FindOverlay(Constants.TracksPolygonsId, gMap);
            GMapOverlay tracksPolygons2Overlay = FindOverlay(Constants.TracksPolygons2Id, gMap);
            GMapOverlay tracksPolygons3Overlay = FindOverlay(Constants.TracksPolygons3Id, gMap);

            if (tracksPolygonsOverlay == null)
            {
                tracksPolygonsOverlay  = new GMapOverlay(Constants.TracksPolygonsId);
                tracksPolygons2Overlay = new GMapOverlay(Constants.TracksPolygons2Id);
                tracksPolygons3Overlay = new GMapOverlay(Constants.TracksPolygons3Id);

                gMap.Overlays.Add(tracksPolygons3Overlay);
                gMap.Overlays.Add(tracksPolygons2Overlay);
                gMap.Overlays.Add(tracksPolygonsOverlay);
            }

            tracksPolygonsOverlay.Routes.Clear();
            tracksPolygons2Overlay.Routes.Clear();
            tracksPolygons3Overlay.Routes.Clear();

            foreach (var track in tracks)
            {
                Geo.Gps.Fix lastPoint = track.GetFirstFix();
                string      tagName   = lastPoint.TimeUtc.ToShortDateString() + " " + lastPoint.TimeUtc.ToShortTimeString();
                if (track.Metadata.ContainsKey("name"))
                {
                    tagName += "; " + track.Metadata["name"].ToString();
                }
                if (track.Metadata.ContainsKey("filename"))
                {
                    tagName += "; " + track.Metadata["filename"].ToString();
                }

                // add route for each segment, segments may be separate
                foreach (var segment in track.Segments)
                {
                    List <PointLatLng> mapPoints = new List <PointLatLng>();
                    lastPoint = segment.GetFirstFix();
                    mapPoints.Add(new PointLatLng(lastPoint.Coordinate.Latitude, lastPoint.Coordinate.Longitude));

                    foreach (var point in segment.Fixes)
                    {
                        if (AddPoint(mapPoints, lastPoint, point, minimimDistance, tagName))
                        {
                            lastPoint = point;
                            newCount++;
                        }

                        oldCount++;
                    }

                    // always add last point, single gpx file may be divided by tracks
                    if (segment.GetLastFix() != lastPoint)
                    {
                        Geo.Gps.Fix newPoint = segment.GetLastFix();
                        mapPoints.Add(new PointLatLng(newPoint.Coordinate.Latitude, newPoint.Coordinate.Longitude));
                    }

                    if (mapPoints.Count > 1)
                    {
                        AddRoute(mapPoints, tagName);
                    }
                }
            }

            double ratio = (double)newCount / oldCount * 100;

            Info = "Map points: " + newCount + " (" + ratio.ToString("F0") + "%)";

            gMap.Refresh();
        }