1 #include "dem.h"
2 #include "route.h"
3 
4 bool Route::_useDEM = false;
5 bool Route::_show2ndElevation = false;
6 
Route(const RouteData & data)7 Route::Route(const RouteData &data) : _data(data)
8 {
9 	qreal dist = 0;
10 
11 	_distance.append(0);
12 
13 	for (int i = 1; i < _data.count(); i++) {
14 		dist += _data.at(i).coordinates().distanceTo(_data.at(i-1).coordinates());
15 		_distance.append(dist);
16 	}
17 }
18 
path() const19 Path Route::path() const
20 {
21 	Path ret;
22 	ret.append(PathSegment());
23 	PathSegment &ps = ret.last();
24 
25 	for (int i = 0; i < _data.size(); i++)
26 		ps.append(PathPoint(_data.at(i).coordinates(), _distance.at(i)));
27 
28 	return ret;
29 }
30 
gpsElevation() const31 Graph Route::gpsElevation() const
32 {
33 	Graph graph;
34 	graph.append(GraphSegment());
35 	GraphSegment &gs = graph.last();
36 
37 	for (int i = 0; i < _data.size(); i++)
38 		if (_data.at(i).hasElevation())
39 			gs.append(GraphPoint(_distance.at(i), NAN, _data.at(i).elevation()));
40 
41 	return graph;
42 }
43 
demElevation() const44 Graph Route::demElevation() const
45 {
46 	Graph graph;
47 	graph.append(GraphSegment());
48 	GraphSegment &gs = graph.last();
49 
50 	for (int i = 0; i < _data.size(); i++) {
51 		qreal dem = DEM::elevation(_data.at(i).coordinates());
52 		if (!std::isnan(dem))
53 			gs.append(GraphPoint(_distance.at(i), NAN, dem));
54 	}
55 
56 	return graph;
57 }
58 
elevation() const59 GraphPair Route::elevation() const
60 {
61 	if (_useDEM) {
62 		Graph dem(demElevation());
63 		if (dem.isValid())
64 			return GraphPair(dem, _show2ndElevation ? gpsElevation() : Graph());
65 		else
66 			return GraphPair(gpsElevation(), Graph());
67 	} else {
68 		Graph gps(gpsElevation());
69 		if (gps.isValid())
70 			return GraphPair(gps, _show2ndElevation ? demElevation() : Graph());
71 		else
72 			return GraphPair(demElevation(), Graph());
73 	}
74 }
75 
distance() const76 qreal Route::distance() const
77 {
78 	return (_distance.isEmpty()) ? 0 : _distance.last();
79 }
80