• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • tools
  • osm-addresses
tools/osm-addresses/OsmParser.h
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2011 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #ifndef MARBLE_OSMPARSER_H
12 #define MARBLE_OSMPARSER_H
13 
14 #include "Writer.h"
15 #include "OsmRegion.h"
16 #include "OsmPlacemark.h"
17 #include "OsmRegionTree.h"
18 
19 #include "GeoDataLineString.h"
20 #include "GeoDataPolygon.h"
21 
22 #include <QObject>
23 #include <QFileInfo>
24 #include <QMap>
25 #include <QHash>
26 #include <QList>
27 #include <QPair>
28 
29 namespace Marble
30 {
31 
32 enum ElementType {
33  NoType,
34  NodeType,
35  WayType,
36  RelationType
37 };
38 
39 enum RelationRole {
40  None,
41  Outer,
42  Inner
43 };
44 
45 struct OsmOsmRegion {
46  OsmOsmRegion* parent;
47  OsmRegion region;
48 
49  OsmOsmRegion() : parent( 0 ) {}
50 };
51 
52 struct Element {
53  bool save;
54  QString name;
55  QString street;
56  QString houseNumber;
57  QString city;
58  OsmPlacemark::OsmCategory category;
59 
60  Element() : save( false ),
61  category( OsmPlacemark::UnknownCategory ) {}
62 };
63 
64 struct Coordinate {
65  float lon;
66  float lat;
67 
68  Coordinate(float lon=0.0, float lat=0.0);
69 };
70 
71 struct Node : public Element {
72  float lon;
73  float lat;
74 
75  operator OsmPlacemark() const;
76  operator Coordinate() const;
77 };
78 
79 struct Way : public Element {
80  QList<int> nodes;
81  bool isBuilding;
82 
83  operator OsmPlacemark() const;
84  void setPosition( const QHash<int, Coordinate> &database, OsmPlacemark &placemark ) const;
85  void setRegion( const QHash<int, Node> &database, const OsmRegionTree & tree, QList<OsmOsmRegion> & osmOsmRegions, OsmPlacemark &placemark ) const;
86 };
87 
88 struct WayMerger {
89 public:
90  QList<Way> ways;
91 
92  WayMerger( const Way &way ) {
93  ways << way;
94  }
95 
96  bool compatible( const Way &aWay ) const {
97  foreach( const Way & way, ways ) {
98  if ( way.nodes.first() == aWay.nodes.first() ) return true;
99  if ( way.nodes.last() == aWay.nodes.first() ) return true;
100  if ( way.nodes.first() == aWay.nodes.last() ) return true;
101  if ( way.nodes.last() == aWay.nodes.last() ) return true;
102  }
103 
104  return false;
105  }
106 
107  bool compatible( const WayMerger &other ) const {
108  foreach( const Way & way, ways ) {
109  if ( other.compatible( way ) ) {
110  return true;
111  }
112  }
113 
114  return false;
115  }
116 
117  void merge( const WayMerger &other ) {
118  ways << other.ways;
119  }
120 };
121 
122 struct Relation : public Element {
123  QList<int> nodes;
124  QList< QPair<int, RelationRole> > ways;
125  QList<int> relations;
126  QString name;
127  bool isMultipolygon;
128  bool isAdministrativeBoundary;
129  int adminLevel;
130 
131  Relation() : isMultipolygon( false ),
132  isAdministrativeBoundary( false ),
133  adminLevel( 0 )
134  {
135  // nothing to do
136  }
137 };
138 
139 struct Statistic {
140  unsigned int mergedWays;
141  unsigned int uselessWays;
142 
143  Statistic() : mergedWays( 0 ),
144  uselessWays( 0 )
145  {}
146 };
147 
148 class OsmParser : public QObject
149 {
150  Q_OBJECT
151 public:
152  explicit OsmParser( QObject *parent = 0 );
153 
154  void addWriter( Writer* writer );
155 
156  void read( const QFileInfo &file, const QString &areaName );
157 
158  void writeKml( const QString &area, const QString &version, const QString &date, const QString &transport, const QString &payload, const QString &outputKml ) const;
159 
160 protected:
161  virtual bool parse( const QFileInfo &file, int pass, bool &needAnotherPass ) = 0;
162 
163  bool shouldSave( ElementType type, const QString &key, const QString &value );
164 
165  void setCategory( Element &element, const QString &key, const QString &value );
166 
167  QHash<int, Coordinate> m_coordinates;
168 
169  QHash<int, Node> m_nodes;
170 
171  QHash<int, Way> m_ways;
172 
173  QHash<int, Relation> m_relations;
174 
175 private:
176  GeoDataLinearRing *convexHull() const;
177 
178  void importMultipolygon( const Relation &relation );
179 
180  void importWay( QVector<Marble::GeoDataLineString> &ways, int id );
181 
182  QList< QList<Way> > merge( const QList<Way> &ways ) const;
183 
184  template<class T, class S>
185  bool contains( const T &outer, const T &inner ) const {
186  for ( int i = 0; i < inner.size(); ++i ) {
187  if ( !outer.contains( inner[i] ) ) {
188  bool onBorder = false;
189  for ( int k=0; k<outer.size(); ++k ) {
190  if ( inner[i] == outer[k] ) {
191  onBorder = true;
192  break;
193  }
194  }
195  if ( !onBorder ) {
196  return false;
197  }
198  }
199  }
200 
201  return true;
202  }
203 
204  QColor randomColor() const;
205 
206  Marble::GeoDataLineString reverse( const Marble::GeoDataLineString & string );
207 
208  QList<Writer*> m_writers;
209 
210  QList<OsmOsmRegion> m_osmOsmRegions;
211 
212  QList<OsmPlacemark> m_placemarks;
213 
214  QHash<QString, OsmPlacemark::OsmCategory> m_categoryMap;
215 
216  mutable Statistic m_statistic;
217 
218  GeoDataLinearRing* m_convexHull;
219 };
220 
221 }
222 
223 #endif // MARBLE_OSMPARSER_H
Marble::Relation::nodes
QList< int > nodes
Definition: tools/osm-addresses/OsmParser.h:123
Marble::Statistic::mergedWays
unsigned int mergedWays
Definition: tools/osm-addresses/OsmParser.h:140
Marble::Coordinate::Coordinate
Coordinate(float lon=0.0, float lat=0.0)
Definition: tools/osm-addresses/OsmParser.cpp:761
Marble::ElementType
ElementType
Definition: tools/osm-addresses/OsmParser.h:32
Marble::OsmParser::m_coordinates
QHash< int, Coordinate > m_coordinates
Definition: tools/osm-addresses/OsmParser.h:167
Marble::WayMerger
Definition: tools/osm-addresses/OsmParser.h:88
Marble::Coordinate::lon
float lon
Definition: tools/osm-addresses/OsmParser.h:65
Marble::GeoDataLinearRing
A LinearRing that allows to store a closed, contiguous set of line segments.
Definition: GeoDataLinearRing.h:68
Marble::OsmRegion
A lightweight data structure to represent administrative regions like villages, cities, states, ...
Definition: OsmRegion.h:26
Marble::OsmOsmRegion::parent
OsmOsmRegion * parent
Definition: tools/osm-addresses/OsmParser.h:46
Marble::OsmParser::setCategory
void setCategory(Element &element, const QString &key, const QString &value)
Definition: tools/osm-addresses/OsmParser.cpp:621
GeoDataPolygon.h
Marble::Way::nodes
QList< int > nodes
Definition: tools/osm-addresses/OsmParser.h:80
Marble::NoType
Definition: tools/osm-addresses/OsmParser.h:33
Marble::OsmParser::writeKml
void writeKml(const QString &area, const QString &version, const QString &date, const QString &transport, const QString &payload, const QString &outputKml) const
Definition: tools/osm-addresses/OsmParser.cpp:702
Marble::Way
Definition: tools/osm-addresses/OsmParser.h:79
Marble::Relation::relations
QList< int > relations
Definition: tools/osm-addresses/OsmParser.h:125
OsmPlacemark.h
Marble::OsmPlacemark
A lightweight data structure to represent points of interest like addresses with support for serializ...
Definition: OsmPlacemark.h:24
Marble::OsmParser::read
void read(const QFileInfo &file, const QString &areaName)
Definition: tools/osm-addresses/OsmParser.cpp:218
Marble::WayMerger::merge
void merge(const WayMerger &other)
Definition: tools/osm-addresses/OsmParser.h:117
Marble::Relation::adminLevel
int adminLevel
Definition: tools/osm-addresses/OsmParser.h:129
Marble::Element::houseNumber
QString houseNumber
Definition: tools/osm-addresses/OsmParser.h:56
Marble::Node::lon
float lon
Definition: tools/osm-addresses/OsmParser.h:72
Marble::Relation
Definition: tools/osm-addresses/OsmParser.h:122
Marble::OsmRegionTree
Definition: OsmRegionTree.h:21
Marble::OsmOsmRegion::region
OsmRegion region
Definition: tools/osm-addresses/OsmParser.h:47
QObject
Marble::Outer
Definition: tools/osm-addresses/OsmParser.h:41
Marble::OsmOsmRegion::OsmOsmRegion
OsmOsmRegion()
Definition: tools/osm-addresses/OsmParser.h:49
Marble::Coordinate::lat
float lat
Definition: tools/osm-addresses/OsmParser.h:66
Marble::OsmParser::m_relations
QHash< int, Relation > m_relations
Definition: tools/osm-addresses/OsmParser.h:173
Marble::WayMerger::compatible
bool compatible(const Way &aWay) const
Definition: tools/osm-addresses/OsmParser.h:96
Marble::None
Definition: tools/osm-addresses/OsmParser.h:40
Marble::Relation::name
QString name
Definition: tools/osm-addresses/OsmParser.h:126
OsmRegionTree.h
Marble::Relation::ways
QList< QPair< int, RelationRole > > ways
Definition: tools/osm-addresses/OsmParser.h:124
Marble::Statistic::Statistic
Statistic()
Definition: tools/osm-addresses/OsmParser.h:143
Marble::Statistic
Definition: tools/osm-addresses/OsmParser.h:139
GeoDataLineString.h
Marble::Element::street
QString street
Definition: tools/osm-addresses/OsmParser.h:55
Marble::NodeType
Definition: tools/osm-addresses/OsmParser.h:34
Marble::Node
Definition: tools/osm-addresses/OsmParser.h:71
OsmRegion.h
Marble::OsmParser::OsmParser
OsmParser()
Definition: src/plugins/runner/osm/OsmParser.cpp:21
Writer.h
Marble::WayType
Definition: tools/osm-addresses/OsmParser.h:35
Marble::Element
Definition: tools/osm-addresses/OsmParser.h:52
Marble::GeoDataLineString
A LineString that allows to store a contiguous set of line segments.
Definition: GeoDataLineString.h:75
Marble::OsmParser::shouldSave
bool shouldSave(ElementType type, const QString &key, const QString &value)
Definition: tools/osm-addresses/OsmParser.cpp:554
Marble::Statistic::uselessWays
unsigned int uselessWays
Definition: tools/osm-addresses/OsmParser.h:141
Marble::OsmParser::m_ways
QHash< int, Way > m_ways
Definition: tools/osm-addresses/OsmParser.h:171
Marble::Relation::isMultipolygon
bool isMultipolygon
Definition: tools/osm-addresses/OsmParser.h:127
Marble::OsmOsmRegion
Definition: tools/osm-addresses/OsmParser.h:45
Marble::Node::lat
float lat
Definition: tools/osm-addresses/OsmParser.h:73
Marble::OsmParser::parse
virtual bool parse(const QFileInfo &file, int pass, bool &needAnotherPass)=0
Marble::WayMerger::compatible
bool compatible(const WayMerger &other) const
Definition: tools/osm-addresses/OsmParser.h:107
Marble::Way::setPosition
void setPosition(const QHash< int, Coordinate > &database, OsmPlacemark &placemark) const
Definition: tools/osm-addresses/OsmParser.cpp:150
Marble::Way::isBuilding
bool isBuilding
Definition: tools/osm-addresses/OsmParser.h:81
Marble::OsmParser::m_nodes
QHash< int, Node > m_nodes
Definition: tools/osm-addresses/OsmParser.h:169
Marble::Coordinate
Definition: tools/osm-addresses/OsmParser.h:64
Marble::Element::name
QString name
Definition: tools/osm-addresses/OsmParser.h:54
Marble::WayMerger::WayMerger
WayMerger(const Way &way)
Definition: tools/osm-addresses/OsmParser.h:92
Marble::Inner
Definition: tools/osm-addresses/OsmParser.h:42
Marble::OsmPlacemark::OsmCategory
OsmCategory
Definition: OsmPlacemark.h:27
Marble::WayMerger::ways
QList< Way > ways
Definition: tools/osm-addresses/OsmParser.h:90
Marble::RelationType
Definition: tools/osm-addresses/OsmParser.h:36
Marble::RelationRole
RelationRole
Definition: tools/osm-addresses/OsmParser.h:39
Marble::Relation::isAdministrativeBoundary
bool isAdministrativeBoundary
Definition: tools/osm-addresses/OsmParser.h:128
Marble::OsmParser::addWriter
void addWriter(Writer *writer)
Definition: tools/osm-addresses/OsmParser.cpp:117
Marble::Element::city
QString city
Definition: tools/osm-addresses/OsmParser.h:57
Marble::Element::category
OsmPlacemark::OsmCategory category
Definition: tools/osm-addresses/OsmParser.h:58
Marble::Element::Element
Element()
Definition: tools/osm-addresses/OsmParser.h:60
Marble::Element::save
bool save
Definition: tools/osm-addresses/OsmParser.h:53
Marble::Way::setRegion
void setRegion(const QHash< int, Node > &database, const OsmRegionTree &tree, QList< OsmOsmRegion > &osmOsmRegions, OsmPlacemark &placemark) const
Definition: tools/osm-addresses/OsmParser.cpp:181
Marble::Relation::Relation
Relation()
Definition: tools/osm-addresses/OsmParser.h:131
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:52 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal