Cosmetics
[GPXSee.git] / src / poi.cpp
blob7ea9ff41d8a5775635daabd5de3afaf3940a8e63
1 #include <QFile>
2 #include <QSet>
3 #include <QList>
4 #include "pathitem.h"
5 #include "waypointitem.h"
6 #include "data.h"
7 #include "poi.h"
10 POI::POI(QObject *parent) : QObject(parent)
12 _errorLine = 0;
13 _radius = 1000;
16 bool POI::loadFile(const QString &fileName)
18 Data data;
19 FileIndex index;
21 _errorString.clear();
22 _errorLine = 0;
24 index.enabled = true;
25 index.start = _data.size();
27 if (!data.loadFile(fileName)) {
28 _errorString = data.errorString();
29 _errorLine = data.errorLine();
30 return false;
33 for (int i = 0; i < data.waypoints().size(); i++)
34 _data.append(data.waypoints().at(i));
35 index.end = _data.size() - 1;
37 for (int i = index.start; i <= index.end; i++) {
38 const Coordinates &p = _data.at(i).coordinates();
39 qreal c[2];
40 c[0] = p.lon();
41 c[1] = p.lat();
42 _tree.Insert(c, c, i);
45 _files.append(fileName);
46 _indexes.append(index);
48 emit pointsChanged();
50 return true;
53 static bool cb(size_t data, void* context)
55 QSet<int> *set = (QSet<int>*) context;
56 set->insert((int)data);
58 return true;
61 QVector<Waypoint> POI::points(const Path &path) const
63 QVector<Waypoint> ret;
64 QSet<int> set;
65 qreal min[2], max[2];
67 for (int i = 0; i < path.count(); i++) {
68 const Coordinates &c = path.at(i).coordinates();
69 QPair<Coordinates, Coordinates> br = c.boundingRect(_radius);
70 min[0] = br.first.lon();
71 min[1] = br.first.lat();
72 max[0] = br.second.lon();
73 max[1] = br.second.lat();
75 _tree.Search(min, max, cb, &set);
78 QSet<int>::const_iterator i = set.constBegin();
79 while (i != set.constEnd()) {
80 ret.append(_data.at(*i));
81 ++i;
84 return ret;
87 QVector<Waypoint> POI::points(const QList<WaypointItem*> &list)
88 const
90 QVector<Waypoint> ret;
91 QSet<int> set;
92 qreal min[2], max[2];
94 for (int i = 0; i < list.count(); i++) {
95 const Coordinates &p = list.at(i)->waypoint().coordinates();
97 QPair<Coordinates, Coordinates> br = p.boundingRect(_radius);
98 min[0] = br.first.lon();
99 min[1] = br.first.lat();
100 max[0] = br.second.lon();
101 max[1] = br.second.lat();
103 _tree.Search(min, max, cb, &set);
106 QSet<int>::const_iterator i = set.constBegin();
107 while (i != set.constEnd()) {
108 ret.append(_data.at(*i));
109 ++i;
112 return ret;
115 QVector<Waypoint> POI::points(const QList<Waypoint> &list) const
117 QVector<Waypoint> ret;
118 QSet<int> set;
119 qreal min[2], max[2];
121 for (int i = 0; i < list.count(); i++) {
122 const Coordinates &p = list.at(i).coordinates();
124 QPair<Coordinates, Coordinates> br = p.boundingRect(_radius);
125 min[0] = br.first.lon();
126 min[1] = br.first.lat();
127 max[0] = br.second.lon();
128 max[1] = br.second.lat();
130 _tree.Search(min, max, cb, &set);
133 QSet<int>::const_iterator i = set.constBegin();
134 while (i != set.constEnd()) {
135 ret.append(_data.at(*i));
136 ++i;
139 return ret;
142 void POI::enableFile(const QString &fileName, bool enable)
144 int i;
146 i = _files.indexOf(fileName);
147 Q_ASSERT(i >= 0);
148 _indexes[i].enabled = enable;
150 _tree.RemoveAll();
151 for (int i = 0; i < _indexes.count(); i++) {
152 FileIndex idx = _indexes.at(i);
153 if (!idx.enabled)
154 continue;
156 for (int j = idx.start; j <= idx.end; j++) {
157 const Coordinates &p = _data.at(j).coordinates();
158 qreal c[2];
159 c[0] = p.lon();
160 c[1] = p.lat();
161 _tree.Insert(c, c, j);
165 emit pointsChanged();
168 void POI::clear()
170 _tree.RemoveAll();
171 _data.clear();
172 _files.clear();
173 _indexes.clear();
175 emit pointsChanged();
178 void POI::setRadius(unsigned radius)
180 _radius = radius;
182 emit pointsChanged();