mirror of
git://projects.qi-hardware.com/nanomap.git
synced 2024-11-22 00:28:05 +02:00
add layer that displays points of interest from a .osm file
TODO: draw different icons
This commit is contained in:
parent
1d81db0056
commit
2d6e62a111
2
main.cpp
2
main.cpp
@ -28,7 +28,7 @@ int main(int argc, char *argv[])
|
||||
MainWidget w;
|
||||
|
||||
if (QApplication::arguments().count() > 1) {
|
||||
w.loadGpx(QApplication::arguments().at(1));
|
||||
w.loadFile(QApplication::arguments().at(1));
|
||||
}
|
||||
|
||||
QObject::connect(&w, SIGNAL(close()), &a, SLOT(quit()));
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "gpslayer.h"
|
||||
#include "gpxlayer.h"
|
||||
#include "markerlayer.h"
|
||||
#include "poilayer.h"
|
||||
#include "timelayer.h"
|
||||
|
||||
#include <QtCore/QDir>
|
||||
@ -88,12 +89,16 @@ MainWidget::~MainWidget()
|
||||
{
|
||||
}
|
||||
|
||||
void MainWidget::loadGpx(const QString &fileName)
|
||||
void MainWidget::loadFile(const QString &fileName)
|
||||
{
|
||||
if (fileName.endsWith(".gpx")) {
|
||||
AbstractLayer *l = new GpxLayer(m_map);
|
||||
l->load(fileName);
|
||||
m_map->addLayer(l, 2, "GPS-Track");
|
||||
} else if (fileName.endsWith(".osm")) {
|
||||
AbstractLayer *l = new PoiLayer(m_map);
|
||||
l->load(fileName);
|
||||
m_map->addLayer(l, 3, "Points Of Interest");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ public:
|
||||
MainWidget(QWidget *parent = 0);
|
||||
~MainWidget();
|
||||
|
||||
void loadGpx(const QString &fileName);
|
||||
void loadFile(const QString &fileName);
|
||||
|
||||
signals:
|
||||
void close();
|
||||
|
126
poilayer.cpp
Normal file
126
poilayer.cpp
Normal file
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright 2010 Niels Kummerfeldt <niels.kummerfeldt@tu-harburg.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "poilayer.h"
|
||||
|
||||
#include "mapwidget.h"
|
||||
#include "projection.h"
|
||||
|
||||
#include <QtCore/QFile>
|
||||
#include <QtXml/QXmlStreamReader>
|
||||
|
||||
PoiLayer::PoiLayer(MapWidget *map) :
|
||||
AbstractLayer(map),
|
||||
m_points(),
|
||||
m_pointsOnScreen(),
|
||||
m_icons(),
|
||||
m_pointsOffset(0, 0)
|
||||
{
|
||||
}
|
||||
|
||||
void PoiLayer::load(const QString &filename)
|
||||
{
|
||||
QFile file(filename);
|
||||
if (file.open(QIODevice::ReadOnly)) {
|
||||
QXmlStreamReader xml(&file);
|
||||
|
||||
QStringList categories;
|
||||
categories << "highway";
|
||||
categories << "traffic_calming";
|
||||
categories << "barrier";
|
||||
categories << "waterway";
|
||||
categories << "railway";
|
||||
categories << "aeroway";
|
||||
categories << "aerialway";
|
||||
categories << "power";
|
||||
categories << "man_made";
|
||||
categories << "leisure";
|
||||
categories << "amenity";
|
||||
categories << "office";
|
||||
categories << "shop";
|
||||
categories << "craft";
|
||||
categories << "emergency";
|
||||
categories << "tourism";
|
||||
categories << "historic";
|
||||
categories << "landuse";
|
||||
categories << "military";
|
||||
categories << "natural";
|
||||
categories << "geological";
|
||||
categories << "sport";
|
||||
|
||||
QHash<QString, QString> tags;
|
||||
QPointF pos;
|
||||
while (!xml.atEnd()) {
|
||||
xml.readNext();
|
||||
if (xml.isStartElement()) {
|
||||
if (xml.name() == "node") {
|
||||
float lat = xml.attributes().value("lat").toString().toFloat();
|
||||
float lon = xml.attributes().value("lon").toString().toFloat();
|
||||
|
||||
pos = QPointF(Projection::lon2rawx(lon), Projection::lat2rawy(lat));
|
||||
} else if (xml.name() == "tag") {
|
||||
tags.insert(xml.attributes().value("k").toString(),
|
||||
xml.attributes().value("v").toString());
|
||||
}
|
||||
} else if (xml.isEndElement()) {
|
||||
if (xml.name() == "node") {
|
||||
foreach (const QString &c, categories) {
|
||||
QString t = tags.value(c, "");
|
||||
if (!t.isEmpty()) {
|
||||
m_points << pos;
|
||||
m_icons << t;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tags.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
zoom(0);
|
||||
}
|
||||
}
|
||||
|
||||
void PoiLayer::zoom(int level)
|
||||
{
|
||||
if (m_points.count() > 1) {
|
||||
int scale = 1 << level;
|
||||
m_pointsOnScreen.clear();
|
||||
m_pointsOffset = map()->raw2screen(m_points.first().x(), m_points.first().y(), scale);
|
||||
m_pointsOnScreen << QPoint(0, 0);
|
||||
for (int i = 1; i < m_points.count(); ++i) {
|
||||
QPointF p = m_points.at(i);
|
||||
m_pointsOnScreen << map()->raw2screen(p.x(), p.y(), scale) - m_pointsOffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PoiLayer::pan(const QPoint &move)
|
||||
{
|
||||
m_pointsOffset += move;
|
||||
}
|
||||
|
||||
void PoiLayer::paint(QPainter *painter)
|
||||
{
|
||||
QPoint p;
|
||||
for (int i = 0; i < m_pointsOnScreen.count(); ++i) {
|
||||
p = m_pointsOnScreen.at(i);
|
||||
painter->drawEllipse(p + m_pointsOffset, 5, 5);
|
||||
}
|
||||
}
|
||||
|
48
poilayer.h
Normal file
48
poilayer.h
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright 2010 Niels Kummerfeldt <niels.kummerfeldt@tu-harburg.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef POI_LAYER_H
|
||||
#define POI_LAYER_H
|
||||
|
||||
#include "abstractlayer.h"
|
||||
|
||||
#include <QtGui/QPainter>
|
||||
|
||||
class PoiLayer : public AbstractLayer
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PoiLayer(MapWidget *map);
|
||||
|
||||
virtual void load(const QString &filename);
|
||||
virtual void zoom(int level);
|
||||
virtual void pan(const QPoint &move);
|
||||
|
||||
protected:
|
||||
virtual void paint(QPainter *painter);
|
||||
|
||||
private:
|
||||
QList<QPointF> m_points;
|
||||
QList<QPoint> m_pointsOnScreen;
|
||||
QStringList m_icons;
|
||||
QPoint m_pointsOffset;
|
||||
|
||||
};
|
||||
|
||||
#endif // POI_LAYER_H
|
Loading…
Reference in New Issue
Block a user