1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-10-07 07:13:21 +02:00
GPXSee/src/poi.cpp

178 lines
3.2 KiB
C++
Raw Normal View History

2015-10-05 01:43:48 +02:00
#include <QFile>
#include <QSet>
#include <QList>
2016-10-08 14:53:10 +02:00
#include "pathitem.h"
#include "waypointitem.h"
2015-10-05 01:43:48 +02:00
#include "ll.h"
2016-10-23 11:09:20 +02:00
#include "data.h"
2015-10-05 01:43:48 +02:00
#include "poi.h"
2016-10-09 23:46:30 +02:00
POI::POI(QObject *parent) : QObject(parent)
{
_errorLine = 0;
_radius = 0.01;
}
2015-10-05 01:43:48 +02:00
bool POI::loadFile(const QString &fileName)
{
2016-10-23 11:09:20 +02:00
Data data;
FileIndex index;
2016-10-23 11:09:20 +02:00
_errorString.clear();
_errorLine = 0;
index.enabled = true;
index.start = _data.size();
2015-10-05 01:43:48 +02:00
2016-10-23 11:09:20 +02:00
if (!data.loadFile(fileName)) {
_errorString = data.errorString();
_errorLine = data.errorLine();
2015-10-05 01:43:48 +02:00
return false;
}
2016-10-23 11:09:20 +02:00
for (int i = 0; i < data.waypoints().size(); i++)
_data.append(data.waypoints().at(i));
index.end = _data.size() - 1;
2015-10-05 01:43:48 +02:00
for (int i = index.start; i <= index.end; i++) {
const QPointF &p = _data.at(i).coordinates();
2015-10-05 01:43:48 +02:00
qreal c[2];
2016-03-19 09:06:43 +01:00
c[0] = p.x();
c[1] = p.y();
_tree.Insert(c, c, i);
2015-10-05 01:43:48 +02:00
}
_files.append(fileName);
_indexes.append(index);
2016-10-23 11:09:20 +02:00
emit pointsChanged();
2015-10-05 01:43:48 +02:00
return true;
}
static bool cb(size_t data, void* context)
2015-10-05 01:43:48 +02:00
{
QSet<int> *set = (QSet<int>*) context;
set->insert((int)data);
2015-10-05 01:43:48 +02:00
return true;
}
2016-10-09 23:46:30 +02:00
QVector<Waypoint> POI::points(const PathItem *path) const
{
QVector<Waypoint> ret;
QSet<int> set;
qreal min[2], max[2];
2016-10-08 14:53:10 +02:00
const QPainterPath &pp = path->path();
2016-10-08 14:53:10 +02:00
for (int i = 0; i < pp.elementCount(); i++) {
QPointF p = mercator2ll(pp.elementAt(i));
2016-10-09 23:46:30 +02:00
min[0] = p.x() - _radius;
min[1] = -p.y() - _radius;
max[0] = p.x() + _radius;
max[1] = -p.y() + _radius;
_tree.Search(min, max, cb, &set);
}
QSet<int>::const_iterator i = set.constBegin();
while (i != set.constEnd()) {
ret.append(_data.at(*i));
++i;
}
return ret;
}
2016-10-09 23:46:30 +02:00
QVector<Waypoint> POI::points(const QList<WaypointItem*> &list)
const
2015-10-05 01:43:48 +02:00
{
2016-02-19 21:42:54 +01:00
QVector<Waypoint> ret;
QSet<int> set;
2015-10-05 01:43:48 +02:00
qreal min[2], max[2];
for (int i = 0; i < list.count(); i++) {
const QPointF &p = list.at(i)->waypoint().coordinates();
2016-10-09 23:46:30 +02:00
min[0] = p.x() - _radius;
min[1] = p.y() - _radius;
max[0] = p.x() + _radius;
max[1] = p.y() + _radius;
2015-10-05 01:43:48 +02:00
_tree.Search(min, max, cb, &set);
}
QSet<int>::const_iterator i = set.constBegin();
2015-10-05 01:43:48 +02:00
while (i != set.constEnd()) {
ret.append(_data.at(*i));
++i;
2015-10-05 01:43:48 +02:00
}
return ret;
}
2016-10-09 23:46:30 +02:00
QVector<Waypoint> POI::points(const QList<Waypoint> &list) const
2016-10-08 14:53:10 +02:00
{
QVector<Waypoint> ret;
QSet<int> set;
qreal min[2], max[2];
for (int i = 0; i < list.count(); i++) {
const QPointF &p = list.at(i).coordinates();
2016-10-09 23:46:30 +02:00
min[0] = p.x() - _radius;
min[1] = p.y() - _radius;
max[0] = p.x() + _radius;
max[1] = p.y() + _radius;
2016-10-08 14:53:10 +02:00
_tree.Search(min, max, cb, &set);
}
QSet<int>::const_iterator i = set.constBegin();
while (i != set.constEnd()) {
ret.append(_data.at(*i));
++i;
}
return ret;
}
void POI::enableFile(const QString &fileName, bool enable)
{
int i;
i = _files.indexOf(fileName);
Q_ASSERT(i >= 0);
_indexes[i].enabled = enable;
_tree.RemoveAll();
for (int i = 0; i < _indexes.count(); i++) {
FileIndex idx = _indexes.at(i);
if (!idx.enabled)
continue;
for (int j = idx.start; j <= idx.end; j++) {
2016-03-19 09:06:43 +01:00
const QPointF &p = _data.at(j).coordinates();
qreal c[2];
2016-03-19 09:06:43 +01:00
c[0] = p.x();
c[1] = p.y();
_tree.Insert(c, c, j);
}
}
2016-10-09 23:46:30 +02:00
2016-10-11 00:19:42 +02:00
emit pointsChanged();
}
2015-10-05 01:43:48 +02:00
void POI::clear()
{
_tree.RemoveAll();
_data.clear();
_files.clear();
_indexes.clear();
2016-10-09 23:46:30 +02:00
2016-10-11 00:19:42 +02:00
emit pointsChanged();
2016-10-09 23:46:30 +02:00
}
void POI::setRadius(qreal radius)
{
_radius = radius;
2016-10-11 00:19:42 +02:00
emit pointsChanged();
2015-10-05 01:43:48 +02:00
}