• 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
  • xml
XmlParser.cpp
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 #include "XmlParser.h"
12 
13 #include <QDebug>
14 
15 namespace Marble
16 {
17 
18 XmlParser::XmlParser( QObject *parent ) :
19  OsmParser( parent )
20 {
21  // nothing to do
22 }
23 
24 bool XmlParser::parse( const QFileInfo &content, int, bool &needAnotherPass )
25 {
26  needAnotherPass = false;
27 
28  QXmlSimpleReader xmlReader;
29  xmlReader.setContentHandler( this );
30  xmlReader.setErrorHandler( this );
31 
32  QFile file( content.absoluteFilePath() );
33  QXmlInputSource *source = new QXmlInputSource( &file );
34 
35  if ( !xmlReader.parse( source ) ) {
36  qCritical() << "Failed to parse " << content.absoluteFilePath();
37  return false;
38  }
39 
40  return true;
41 }
42 
43 bool XmlParser::startElement ( const QString & /*namespaceURI*/, const QString & /*localName*/, const QString & qName, const QXmlAttributes & atts )
44 {
45  if ( qName == "node" ) {
46  m_node = Node();
47  m_id = atts.value( "id" ).toInt();
48  m_node.lon = atts.value( "lon" ).toFloat();
49  m_node.lat = atts.value( "lat" ).toFloat();
50  m_element = NodeType;
51  } else if ( qName == "way" ) {
52  m_id = atts.value( "id" ).toInt();
53  m_way = Way();
54  m_element = WayType;
55  } else if ( qName == "nd" ) {
56  m_way.nodes.push_back( atts.value( "ref" ).toInt() );
57  } else if ( qName == "relation" ) {
58  m_id = atts.value( "id" ).toInt();
59  m_relation = Relation();
60  m_relation.nodes.clear();
61  m_element = RelationType;
62  } else if ( qName == "member" ) {
63  if ( atts.value( "type" ) == "node" ) {
64  m_relation.nodes.push_back( atts.value( "ref" ).toInt() );
65  } else if ( atts.value( "type" ) == "way" ) {
66  RelationRole role = None;
67  if ( atts.value( "role" ) == "outer" ) role = Outer;
68  if ( atts.value( "role" ) == "inner" ) role = Inner;
69  m_relation.ways.push_back( QPair<int, RelationRole>( atts.value( "ref" ).toInt(), role ) );
70  } else if ( atts.value( "type" ) == "relation" ) {
71  m_relation.relations.push_back( atts.value( "ref" ).toInt() );
72  } else {
73  qDebug() << "Unknown relation member type " << atts.value( "type" );
74  }
75  } else if ( qName == "tag" && m_element == RelationType ) {
76  if ( atts.value( "k" ) == "boundary" && atts.value( "v" ) == "administrative" ) {
77  m_relation.isAdministrativeBoundary = true;
78  } else if ( atts.value( "k" ) == "admin_level" ) {
79  m_relation.adminLevel = atts.value( "v" ).toInt();
80  } else if ( atts.value( "k" ) == "name" ) {
81  m_relation.name = atts.value( "v" );
82  } else if ( atts.value( "k" ) == "type" && atts.value( "v" ) == "multipolygon" ) {
83  m_relation.isMultipolygon = true;
84  }
85  } else if ( qName == "tag" && m_element == WayType ) {
86  QString const key = atts.value( "k" );
87  QString const value = atts.value( "v" );
88  if ( key == "name" ) {
89  m_way.name = value;
90  } else if ( key == "addr:street" ) {
91  m_way.street = value;
92  m_way.save = true;
93  } else if ( key == "addr:housenumber" ) {
94  m_way.houseNumber = value;
95  m_way.save = true;
96  } else if ( key == "addr:city" ) {
97  m_way.city = value;
98  m_way.save = true;
99  } else if ( key == "building" && value == "yes" ) {
100  m_way.isBuilding = true;
101  } else {
102  if ( shouldSave( WayType, key, value ) ) {
103  m_way.save = true;
104  }
105  setCategory( m_way, key, value );
106  }
107  } else if ( qName == "tag" && m_element == NodeType ) {
108  QString const key = atts.value( "k" );
109  QString const value = atts.value( "v" );
110  if ( key == "name" ) {
111  m_node.name = value;
112  } else if ( key == "addr:street" ) {
113  m_node.street = value;
114  m_node.save = true;
115  } else if ( key == "addr:housenumber" ) {
116  m_node.houseNumber = value;
117  m_node.save = true;
118  } else if ( key == "addr:city" ) {
119  m_node.city = value;
120  m_node.save = true;
121  } else {
122  if ( shouldSave( NodeType, key, value ) ) {
123  m_node.save = true;
124  }
125  setCategory( m_node, key, value );
126  }
127  }
128 
129  return true;
130 }
131 
132 bool XmlParser::endElement ( const QString & /*namespaceURI*/, const QString & /*localName*/, const QString & qName )
133 {
134  if ( qName == "node" ) {
135  m_nodes[m_id] = m_node;
136  } else if ( qName == "way" ) {
137  m_ways[m_id] = m_way;
138  } else if ( qName == "relation" ) {
139  m_relations[m_id] = m_relation;
140  }
141 
142  return true;
143 }
144 
145 }
146 
147 #include "XmlParser.moc"
Marble::Relation::nodes
QList< int > nodes
Definition: tools/osm-addresses/OsmParser.h:123
Marble::XmlParser::parse
virtual bool parse(const QFileInfo &file, int pass, bool &needAnotherPass)
Definition: XmlParser.cpp:24
Marble::OsmParser::setCategory
void setCategory(Element &element, const QString &key, const QString &value)
Definition: tools/osm-addresses/OsmParser.cpp:621
Marble::Way::nodes
QList< int > nodes
Definition: tools/osm-addresses/OsmParser.h:80
Marble::Relation::relations
QList< int > relations
Definition: tools/osm-addresses/OsmParser.h:125
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
QObject
Marble::Outer
Definition: tools/osm-addresses/OsmParser.h:41
Marble::OsmParser::m_relations
QHash< int, Relation > m_relations
Definition: tools/osm-addresses/OsmParser.h:173
Marble::None
Definition: tools/osm-addresses/OsmParser.h:40
Marble::Relation::name
QString name
Definition: tools/osm-addresses/OsmParser.h:126
Marble::Relation::ways
QList< QPair< int, RelationRole > > ways
Definition: tools/osm-addresses/OsmParser.h:124
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
Marble::WayType
Definition: tools/osm-addresses/OsmParser.h:35
Marble::OsmParser::shouldSave
bool shouldSave(ElementType type, const QString &key, const QString &value)
Definition: tools/osm-addresses/OsmParser.cpp:554
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::Node::lat
float lat
Definition: tools/osm-addresses/OsmParser.h:73
Marble::XmlParser::XmlParser
XmlParser(QObject *parent=0)
Definition: XmlParser.cpp:18
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
XmlParser.h
Marble::Element::name
QString name
Definition: tools/osm-addresses/OsmParser.h:54
Marble::Inner
Definition: tools/osm-addresses/OsmParser.h:42
Marble::OsmParser
Definition: src/plugins/runner/osm/OsmParser.h:17
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::Element::city
QString city
Definition: tools/osm-addresses/OsmParser.h:57
Marble::Element::save
bool save
Definition: tools/osm-addresses/OsmParser.h:53
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:53 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