More track data.
[utils] / gps / src / main / java / org / wamblee / gps / track / TrackImpl.java
1 package org.wamblee.gps.track;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.wamblee.gps.geometry.Point;
8
9 public class TrackImpl implements Track {
10
11     private String _description; 
12     private List<TrackSegment> _segments; 
13     
14     public TrackImpl(String aDescription) { 
15         _description = aDescription;
16         _segments = new ArrayList<TrackSegment>();
17     }
18     
19     public void addSegment(TrackSegment aSegment) { 
20         _segments.add(aSegment);
21     }
22     
23     @Override
24     public String getDescription() {
25         return _description;
26     }
27     
28     @Override
29     public Point getPoint(int aIndex) {
30         int localIndex = aIndex; 
31         Iterator<TrackSegment> i = _segments.iterator(); 
32         while (i.hasNext()) { 
33             TrackSegment segment = i.next();
34             if ( localIndex < segment.size() ) { 
35                 return segment.getPoint(localIndex);
36             }
37             localIndex -= segment.size();
38         }
39         throw new IndexOutOfBoundsException("" + aIndex);  
40     }
41     
42     @Override
43     public double getMinCoordinate(int i) {
44         if ( size() == 0 ) { 
45             throw new IllegalArgumentException("empty track");
46         }
47         double result = Double.MAX_VALUE;
48         for (TrackSegment segment: _segments) { 
49             if ( segment.size() > 0 ) { 
50                 result = Math.min(result, segment.getMinCoordinate(i));
51             }
52         }
53         return 0;
54     }
55     
56     @Override
57     public double getMaxCoordinate(int i) {
58         if ( size() == 0 ) { 
59             throw new IllegalArgumentException("empty track");
60         }
61         double result = Double.MIN_VALUE;
62         for (TrackSegment segment: _segments) { 
63             if ( segment.size() > 0 ) { 
64                 result = Math.max(result, segment.getMaxCoordinate(i));
65             }
66         }
67         return 0;
68     }
69     
70     @Override
71     public List<TrackSegment> getSegments() {
72         return _segments; 
73     }
74     
75     @Override
76     public int size() {
77         int result = 0; 
78         for (TrackSegment segment: _segments) { 
79             result += segment.size();
80         }
81         return result; 
82     }
83 }