1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-30 22:51:16 +01:00

POI loading optimization

This commit is contained in:
Martin Tůma 2016-10-08 14:53:10 +02:00
parent 434df521fb
commit f02ff1fa01
6 changed files with 131 additions and 75 deletions

View File

@ -250,7 +250,8 @@ void GUI::createActions()
tr("Show POIs"), this); tr("Show POIs"), this);
_showPOIAction->setCheckable(true); _showPOIAction->setCheckable(true);
_showPOIAction->setShortcut(SHOW_POI_SHORTCUT); _showPOIAction->setShortcut(SHOW_POI_SHORTCUT);
connect(_showPOIAction, SIGNAL(triggered(bool)), this, SLOT(showPOI(bool))); connect(_showPOIAction, SIGNAL(triggered(bool)), _pathView,
SLOT(showPOI(bool)));
addAction(_showPOIAction); addAction(_showPOIAction);
createPOIFilesActions(); createPOIFilesActions();
@ -463,6 +464,8 @@ void GUI::createPathView()
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
_pathView->setFrameShape(QFrame::NoFrame); _pathView->setFrameShape(QFrame::NoFrame);
#endif // Q_OS_WIN32 #endif // Q_OS_WIN32
_pathView->setPOI(&_poi);
} }
void GUI::createGraphTabs() void GUI::createGraphTabs()
@ -622,8 +625,6 @@ bool GUI::loadFile(const QString &fileName)
_tabs.at(i)->loadGPX(gpx, paths); _tabs.at(i)->loadGPX(gpx, paths);
updateGraphTabs(); updateGraphTabs();
_pathView->setHidden(false); _pathView->setHidden(false);
if (_showPOIAction->isChecked())
_pathView->loadPOI(_poi);
for (int i = 0; i < gpx.tracks().count(); i++) { for (int i = 0; i < gpx.tracks().count(); i++) {
_trackDistance += gpx.tracks().at(i)->distance(); _trackDistance += gpx.tracks().at(i)->distance();
@ -679,8 +680,9 @@ bool GUI::openPOIFile(const QString &fileName)
return false; return false;
} else { } else {
_pathView->setPOI(&_poi);
_pathView->showPOI(true);
_showPOIAction->setChecked(true); _showPOIAction->setChecked(true);
_pathView->loadPOI(_poi);
QAction *action = createPOIFileAction(_poi.files().indexOf(fileName)); QAction *action = createPOIFileAction(_poi.files().indexOf(fileName));
action->setChecked(true); action->setChecked(true);
_poiFilesMenu->addAction(action); _poiFilesMenu->addAction(action);
@ -697,7 +699,7 @@ void GUI::closePOIFiles()
delete _poiFilesActions[i]; delete _poiFilesActions[i];
_poiFilesActions.clear(); _poiFilesActions.clear();
_pathView->clearPOI(); _pathView->setPOI(0);
_poi.clear(); _poi.clear();
} }
@ -853,14 +855,6 @@ void GUI::closeAll()
updateTrackView(); updateTrackView();
} }
void GUI::showPOI(bool checked)
{
if (checked)
_pathView->loadPOI(_poi);
else
_pathView->clearPOI();
}
void GUI::showMap(bool checked) void GUI::showMap(bool checked)
{ {
if (checked) if (checked)
@ -1007,9 +1001,7 @@ void GUI::poiFileChecked(int index)
_poi.enableFile(_poi.files().at(index), _poi.enableFile(_poi.files().at(index),
_poiFilesActions.at(index)->isChecked()); _poiFilesActions.at(index)->isChecked());
_pathView->clearPOI(); _pathView->setPOI(&_poi);
if (_showPOIAction->isChecked())
_pathView->loadPOI(_poi);
} }
void GUI::sliderPositionChanged(qreal pos) void GUI::sliderPositionChanged(qreal pos)
@ -1311,6 +1303,8 @@ void GUI::readSettings()
_showPOILabelsAction->setChecked(true); _showPOILabelsAction->setChecked(true);
if (settings.value(SHOW_POI_SETTING, false).toBool() == true) if (settings.value(SHOW_POI_SETTING, false).toBool() == true)
_showPOIAction->setChecked(true); _showPOIAction->setChecked(true);
else
_pathView->showPOI(false);
for (int i = 0; i < _poiFilesActions.count(); i++) for (int i = 0; i < _poiFilesActions.count(); i++)
_poiFilesActions.at(i)->setChecked(true); _poiFilesActions.at(i)->setChecked(true);
int size = settings.beginReadArray(DISABLED_POI_FILE_SETTINGS_PREFIX); int size = settings.beginReadArray(DISABLED_POI_FILE_SETTINGS_PREFIX);

View File

@ -45,7 +45,6 @@ private slots:
void reloadFile(); void reloadFile();
void openPOIFile(); void openPOIFile();
void closePOIFiles(); void closePOIFiles();
void showPOI(bool checked);
void showMap(bool checked); void showMap(bool checked);
void showGraphs(bool checked); void showGraphs(bool checked);
void showToolbars(bool checked); void showToolbars(bool checked);

View File

@ -34,6 +34,7 @@ PathView::PathView(QWidget *parent)
_zoom = ZOOM_MAX; _zoom = ZOOM_MAX;
_scale = mapScale(_zoom); _scale = mapScale(_zoom);
_map = 0; _map = 0;
_poi = 0;
_units = Metric; _units = Metric;
@ -41,6 +42,7 @@ PathView::PathView(QWidget *parent)
_showRoutes = true; _showRoutes = true;
_showWaypoints = true; _showWaypoints = true;
_showWaypointLabels = true; _showWaypointLabels = true;
_showPOI = true;
_showPOILabels = true; _showPOILabels = true;
_overlapPOIs = true; _overlapPOIs = true;
_showRouteWaypoints = true; _showRouteWaypoints = true;
@ -70,6 +72,9 @@ PathItem *PathView::addTrack(const Track &track)
ti->setVisible(_showTracks); ti->setVisible(_showTracks);
_scene->addItem(ti); _scene->addItem(ti);
if (_poi)
addPOI(_poi->points(ti));
return ti; return ti;
} }
@ -91,6 +96,9 @@ PathItem *PathView::addRoute(const Route &route)
ri->showWaypointLabels(_showWaypointLabels); ri->showWaypointLabels(_showWaypointLabels);
_scene->addItem(ri); _scene->addItem(ri);
if (_poi)
addPOI(_poi->points(ri));
return ri; return ri;
} }
@ -109,6 +117,9 @@ void PathView::addWaypoints(const QList<Waypoint> &waypoints)
_waypoints.append(wi); _waypoints.append(wi);
} }
if (_poi)
addPOI(_poi->points(waypoints));
_zoom = qMin(_zoom, scale2zoom(waypointScale())); _zoom = qMin(_zoom, scale2zoom(waypointScale()));
_scale = mapScale(_zoom); _scale = mapScale(_zoom);
} }
@ -131,6 +142,8 @@ QList<PathItem *> PathView::loadGPX(const GPX &gpx)
if ((_tracks.size() + _routes.size() > 1 && _zoom < zoom) if ((_tracks.size() + _routes.size() > 1 && _zoom < zoom)
|| (_waypoints.size() && _zoom < zoom)) || (_waypoints.size() && _zoom < zoom))
rescale(_scale); rescale(_scale);
else
updatePOIVisibility();
QRectF br = trackBoundingRect() | routeBoundingRect() QRectF br = trackBoundingRect() | routeBoundingRect()
| waypointBoundingRect(); | waypointBoundingRect();
@ -258,21 +271,31 @@ qreal PathView::mapScale(int zoom) const
return ((360.0/(qreal)(1<<zoom))/(qreal)TILE_SIZE); return ((360.0/(qreal)(1<<zoom))/(qreal)TILE_SIZE);
} }
void PathView::checkPOIOverlap() void PathView::updatePOIVisibility()
{ {
QHash<Waypoint, WaypointItem*>::const_iterator it, jt; QHash<Waypoint, WaypointItem*>::const_iterator it, jt;
if (!_showPOI)
return;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->show();
if (!_overlapPOIs) {
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) { for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
for (jt = _pois.constBegin(); jt != _pois.constEnd(); jt++) { for (jt = _pois.constBegin(); jt != _pois.constEnd(); jt++) {
if (it != jt && it.value()->isVisible() && jt.value()->isVisible() if (it.value()->isVisible() && jt.value()->isVisible()
&& it.value()->collidesWithItem(jt.value())) && it != jt && it.value()->collidesWithItem(jt.value()))
jt.value()->hide(); jt.value()->hide();
} }
} }
}
} }
void PathView::rescale(qreal scale) void PathView::rescale(qreal scale)
{ {
_scale = scale;
for (int i = 0; i < _tracks.size(); i++) for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setScale(1.0/scale); _tracks.at(i)->setScale(1.0/scale);
@ -283,15 +306,44 @@ void PathView::rescale(qreal scale)
_waypoints.at(i)->setScale(1.0/scale); _waypoints.at(i)->setScale(1.0/scale);
QHash<Waypoint, WaypointItem*>::const_iterator it; QHash<Waypoint, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) { for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setScale(1.0/scale); it.value()->setScale(1.0/scale);
it.value()->show();
updatePOIVisibility();
}
void PathView::setPOI(POI *poi)
{
_poi = poi;
clearPOI();
loadPOI();
}
void PathView::loadPOI()
{
if (!_poi)
return;
for (int i = 0; i < _tracks.size(); i++)
addPOI(_poi->points(_tracks.at(i)));
for (int i = 0; i < _routes.size(); i++)
addPOI(_poi->points(_routes.at(i)));
addPOI(_poi->points(_waypoints));
updatePOIVisibility();
}
void PathView::clearPOI()
{
QHash<Waypoint, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
_scene->removeItem(it.value());
delete it.value();
} }
if (!_overlapPOIs) _pois.clear();
checkPOIOverlap();
_scale = scale;
} }
void PathView::addPOI(const QVector<Waypoint> &waypoints) void PathView::addPOI(const QVector<Waypoint> &waypoints)
@ -306,27 +358,13 @@ void PathView::addPOI(const QVector<Waypoint> &waypoints)
pi->setScale(1.0/_scale); pi->setScale(1.0/_scale);
pi->setZValue(1); pi->setZValue(1);
pi->showLabel(_showPOILabels); pi->showLabel(_showPOILabels);
pi->setVisible(_showPOI);
_scene->addItem(pi); _scene->addItem(pi);
_pois.insert(w, pi); _pois.insert(w, pi);
} }
} }
void PathView::loadPOI(const POI &poi)
{
if (!_tracks.size() && !_routes.size() && !_waypoints.size())
return;
for (int i = 0; i < _tracks.size(); i++)
addPOI(poi.points(_tracks.at(i)->path()));
for (int i = 0; i < _routes.size(); i++)
addPOI(poi.points(_routes.at(i)->path()));
addPOI(poi.points(_waypoints));
if (!_overlapPOIs)
checkPOIOverlap();
}
void PathView::setMap(Map *map) void PathView::setMap(Map *map)
{ {
_map = map; _map = map;
@ -454,18 +492,6 @@ void PathView::plot(QPainter *painter, const QRectF &target)
setUpdatesEnabled(true); setUpdatesEnabled(true);
} }
void PathView::clearPOI()
{
QHash<Waypoint, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
_scene->removeItem(it.value());
delete it.value();
}
_pois.clear();
}
void PathView::clear() void PathView::clear()
{ {
if (_mapScale->scene() == _scene) if (_mapScale->scene() == _scene)
@ -527,6 +553,17 @@ void PathView::showRouteWaypoints(bool show)
_routes.at(i)->showWaypoints(show); _routes.at(i)->showWaypoints(show);
} }
void PathView::showPOI(bool show)
{
_showPOI = show;
QHash<Waypoint, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setVisible(show);
updatePOIVisibility();
}
void PathView::showPOILabels(bool show) void PathView::showPOILabels(bool show)
{ {
_showPOILabels = show; _showPOILabels = show;
@ -535,19 +572,14 @@ void PathView::showPOILabels(bool show)
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->showLabel(show); it.value()->showLabel(show);
setPOIOverlap(_overlapPOIs); updatePOIVisibility();
} }
void PathView::setPOIOverlap(bool overlap) void PathView::setPOIOverlap(bool overlap)
{ {
_overlapPOIs = overlap; _overlapPOIs = overlap;
if (_overlapPOIs) { updatePOIVisibility();
QHash<Waypoint, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->show();
} else
checkPOIOverlap();
} }
void PathView::drawBackground(QPainter *painter, const QRectF &rect) void PathView::drawBackground(QPainter *painter, const QRectF &rect)

View File

@ -30,10 +30,7 @@ public:
QList<PathItem*> loadGPX(const GPX &gpx); QList<PathItem*> loadGPX(const GPX &gpx);
void loadPOI(const POI &poi); void setPOI(POI *poi);
void clearPOI();
void clear();
void setMap(Map *map); void setMap(Map *map);
void setUnits(enum Units units); void setUnits(enum Units units);
@ -43,9 +40,12 @@ public:
int routeCount() const {return _routes.count();} int routeCount() const {return _routes.count();}
int waypointCount() const {return _waypoints.count();} int waypointCount() const {return _waypoints.count();}
void clear();
public slots: public slots:
void redraw(); void redraw();
void showPOI(bool show);
void setPOIOverlap(bool overlap); void setPOIOverlap(bool overlap);
void showWaypointLabels(bool show); void showWaypointLabels(bool show);
void showPOILabels(bool show); void showPOILabels(bool show);
@ -59,6 +59,8 @@ private:
PathItem *addRoute(const Route &route); PathItem *addRoute(const Route &route);
void addWaypoints(const QList<Waypoint> &waypoints); void addWaypoints(const QList<Waypoint> &waypoints);
void addPOI(const QVector<Waypoint> &waypoints); void addPOI(const QVector<Waypoint> &waypoints);
void loadPOI();
void clearPOI();
QRectF trackBoundingRect() const; QRectF trackBoundingRect() const;
QRectF routeBoundingRect() const; QRectF routeBoundingRect() const;
@ -70,7 +72,7 @@ private:
void rescale(qreal scale); void rescale(qreal scale);
void rescale(); void rescale();
void zoom(int z, const QPointF &pos); void zoom(int z, const QPointF &pos);
void checkPOIOverlap(); void updatePOIVisibility();
void wheelEvent(QWheelEvent *event); void wheelEvent(QWheelEvent *event);
void keyPressEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event);
@ -79,13 +81,14 @@ private:
void paintEvent(QPaintEvent *e); void paintEvent(QPaintEvent *e);
QGraphicsScene *_scene; QGraphicsScene *_scene;
ScaleItem *_mapScale;
QList<TrackItem*> _tracks; QList<TrackItem*> _tracks;
QList<RouteItem*> _routes; QList<RouteItem*> _routes;
QList<WaypointItem*> _waypoints; QList<WaypointItem*> _waypoints;
QHash<Waypoint, WaypointItem*> _pois; QHash<Waypoint, WaypointItem*> _pois;
Map *_map; Map *_map;
ScaleItem *_mapScale; POI *_poi;
Palette _palette; Palette _palette;
@ -98,6 +101,7 @@ private:
bool _showRoutes; bool _showRoutes;
bool _showWaypoints; bool _showWaypoints;
bool _showWaypointLabels; bool _showWaypointLabels;
bool _showPOI;
bool _showPOILabels; bool _showPOILabels;
bool _overlapPOIs; bool _overlapPOIs;
bool _showRouteWaypoints; bool _showRouteWaypoints;

View File

@ -1,7 +1,7 @@
#include <QFile> #include <QFile>
#include <QSet> #include <QSet>
#include <QList> #include <QList>
#include <QPainterPath> #include "pathitem.h"
#include "waypointitem.h" #include "waypointitem.h"
#include "ll.h" #include "ll.h"
#include "gpx.h" #include "gpx.h"
@ -145,14 +145,15 @@ static bool cb(size_t data, void* context)
return true; return true;
} }
QVector<Waypoint> POI::points(const QPainterPath &path, qreal radius) const QVector<Waypoint> POI::points(const PathItem *path, qreal radius) const
{ {
QVector<Waypoint> ret; QVector<Waypoint> ret;
QSet<int> set; QSet<int> set;
qreal min[2], max[2]; qreal min[2], max[2];
const QPainterPath &pp = path->path();
for (int i = 0; i < path.elementCount(); i++) { for (int i = 0; i < pp.elementCount(); i++) {
QPointF p = mercator2ll(path.elementAt(i)); QPointF p = mercator2ll(pp.elementAt(i));
min[0] = p.x() - radius; min[0] = p.x() - radius;
min[1] = -p.y() - radius; min[1] = -p.y() - radius;
max[0] = p.x() + radius; max[0] = p.x() + radius;
@ -194,6 +195,30 @@ QVector<Waypoint> POI::points(const QList<WaypointItem*> &list, qreal radius)
return ret; return ret;
} }
QVector<Waypoint> POI::points(const QList<Waypoint> &list, qreal radius) const
{
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();
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;
}
void POI::enableFile(const QString &fileName, bool enable) void POI::enableFile(const QString &fileName, bool enable)
{ {
int i; int i;

View File

@ -8,7 +8,7 @@
#include "waypoint.h" #include "waypoint.h"
#include "rtree.h" #include "rtree.h"
class QPainterPath; class PathItem;
class WaypointItem; class WaypointItem;
#define POI_RADIUS 0.01 #define POI_RADIUS 0.01
@ -21,10 +21,12 @@ public:
const QString &errorString() const {return _error;} const QString &errorString() const {return _error;}
int errorLine() const {return _errorLine;} int errorLine() const {return _errorLine;}
QVector<Waypoint> points(const QPainterPath &path, QVector<Waypoint> points(const PathItem *path,
qreal radius = POI_RADIUS) const; qreal radius = POI_RADIUS) const;
QVector<Waypoint> points(const QList<WaypointItem*> &list, QVector<Waypoint> points(const QList<WaypointItem*> &list,
qreal radius = POI_RADIUS) const; qreal radius = POI_RADIUS) const;
QVector<Waypoint> points(const QList<Waypoint> &list,
qreal radius = POI_RADIUS) const;
const QStringList &files() const {return _files;} const QStringList &files() const {return _files;}
void enableFile(const QString &fileName, bool enable); void enableFile(const QString &fileName, bool enable);