Changeset View
Changeset View
Standalone View
Standalone View
src/plugins/runner/osm/translators/OsmConverter.cpp
Show All 17 Lines | |||||
18 | #include "GeoDataDocument.h" | 18 | #include "GeoDataDocument.h" | ||
19 | #include "GeoWriter.h" | 19 | #include "GeoWriter.h" | ||
20 | #include "GeoDataPlacemark.h" | 20 | #include "GeoDataPlacemark.h" | ||
21 | #include "GeoDataGeometry.h" | 21 | #include "GeoDataGeometry.h" | ||
22 | #include "GeoDataPoint.h" | 22 | #include "GeoDataPoint.h" | ||
23 | #include "GeoDataPolygon.h" | 23 | #include "GeoDataPolygon.h" | ||
24 | #include "GeoDataRelation.h" | 24 | #include "GeoDataRelation.h" | ||
25 | #include "GeoDataLinearRing.h" | 25 | #include "GeoDataLinearRing.h" | ||
26 | #include "GeoDataBuilding.h" | ||||
27 | #include "GeoDataMultiGeometry.h" | ||||
26 | #include "osm/OsmPlacemarkData.h" | 28 | #include "osm/OsmPlacemarkData.h" | ||
27 | #include "osm/OsmObjectManager.h" | 29 | #include "osm/OsmObjectManager.h" | ||
28 | #include "OsmRelationTagWriter.h" | 30 | #include "OsmRelationTagWriter.h" | ||
29 | 31 | | |||
30 | #include <QDebug> | 32 | #include <QDebug> | ||
31 | 33 | | |||
32 | namespace Marble | 34 | namespace Marble | ||
33 | { | 35 | { | ||
Show All 14 Lines | 45 | if (auto placemark = geodata_cast<GeoDataPlacemark>(feature)) { | |||
48 | if (geodata_cast<GeoDataPoint>(placemark->geometry())) { | 50 | if (geodata_cast<GeoDataPoint>(placemark->geometry())) { | ||
49 | m_nodes << OsmConverter::Node(placemark->coordinate(), osmData); | 51 | m_nodes << OsmConverter::Node(placemark->coordinate(), osmData); | ||
50 | } else if (const auto lineString = geodata_cast<GeoDataLineString>(placemark->geometry())) { | 52 | } else if (const auto lineString = geodata_cast<GeoDataLineString>(placemark->geometry())) { | ||
51 | for (auto const &coordinates: *lineString) { | 53 | for (auto const &coordinates: *lineString) { | ||
52 | m_nodes << OsmConverter::Node(coordinates, osmData.nodeReference(coordinates)); | 54 | m_nodes << OsmConverter::Node(coordinates, osmData.nodeReference(coordinates)); | ||
53 | } | 55 | } | ||
54 | m_ways << OsmConverter::Way(lineString, osmData); | 56 | m_ways << OsmConverter::Way(lineString, osmData); | ||
55 | } else if (const auto linearRing = geodata_cast<GeoDataLinearRing>(placemark->geometry())) { | 57 | } else if (const auto linearRing = geodata_cast<GeoDataLinearRing>(placemark->geometry())) { | ||
56 | for (auto const &coordinates: *linearRing) { | 58 | processLinearRing(linearRing, osmData); | ||
57 | m_nodes << OsmConverter::Node(coordinates, osmData.nodeReference(coordinates)); | | |||
58 | } | | |||
59 | m_ways << OsmConverter::Way(linearRing, osmData); | | |||
60 | } else if (const auto polygon = geodata_cast<GeoDataPolygon>(placemark->geometry())) { | 59 | } else if (const auto polygon = geodata_cast<GeoDataPolygon>(placemark->geometry())) { | ||
61 | int index = -1; | 60 | processPolygon(polygon, osmData, placemark); | ||
62 | 61 | } else if (const auto building = geodata_cast<GeoDataBuilding>(placemark->geometry())) { | |||
63 | // Writing all the outerRing's nodes | 62 | if (const auto linearRing = geodata_cast<GeoDataLinearRing>(&building->multiGeometry()->at(0))) { | ||
64 | const GeoDataLinearRing &outerRing = polygon->outerBoundary(); | 63 | processLinearRing(linearRing, osmData); | ||
65 | const OsmPlacemarkData outerRingOsmData = osmData.memberReference( index ); | 64 | } else if (const auto polygon = geodata_cast<GeoDataPolygon>(&building->multiGeometry()->at(0))) { | ||
66 | for (auto const &coordinates: outerRing) { | 65 | processPolygon(polygon, osmData, placemark); | ||
67 | m_nodes << OsmConverter::Node(coordinates, outerRingOsmData.nodeReference(coordinates)); | | |||
68 | } | 66 | } | ||
69 | m_ways << OsmConverter::Way(&outerRing, outerRingOsmData); | | |||
70 | | ||||
71 | // Writing all nodes for each innerRing | | |||
72 | for (auto const &innerRing: polygon->innerBoundaries() ) { | | |||
73 | ++index; | | |||
74 | const OsmPlacemarkData innerRingOsmData = osmData.memberReference( index ); | | |||
75 | for (auto const &coordinates: innerRing) { | | |||
76 | m_nodes << OsmConverter::Node(coordinates, innerRingOsmData.nodeReference(coordinates)); | | |||
77 | } | | |||
78 | m_ways << OsmConverter::Way(&innerRing, innerRingOsmData); | | |||
79 | } | | |||
80 | m_relations.append(OsmConverter::Relation(placemark, osmData)); | | |||
81 | } | 67 | } | ||
82 | } else if (const auto placemark = geodata_cast<GeoDataRelation>(feature)) { | 68 | } else if (const auto placemark = geodata_cast<GeoDataRelation>(feature)) { | ||
83 | m_relations.append(OsmConverter::Relation(placemark, placemark->osmData())); | 69 | m_relations.append(OsmConverter::Relation(placemark, placemark->osmData())); | ||
84 | } | 70 | } | ||
85 | } | 71 | } | ||
86 | 72 | | |||
87 | // Sort by id ascending since some external tools rely on that | 73 | // Sort by id ascending since some external tools rely on that | ||
88 | std::sort(m_nodes.begin(), m_nodes.end(), [] (const Node &a, const Node &b) { return a.second.id() < b.second.id(); }); | 74 | std::sort(m_nodes.begin(), m_nodes.end(), [] (const Node &a, const Node &b) { return a.second.id() < b.second.id(); }); | ||
Show All 11 Lines | 85 | { | |||
100 | return m_ways; | 86 | return m_ways; | ||
101 | } | 87 | } | ||
102 | 88 | | |||
103 | const OsmConverter::Relations &OsmConverter::relations() const | 89 | const OsmConverter::Relations &OsmConverter::relations() const | ||
104 | { | 90 | { | ||
105 | return m_relations; | 91 | return m_relations; | ||
106 | } | 92 | } | ||
107 | 93 | | |||
94 | void OsmConverter::processLinearRing(GeoDataLinearRing *linearRing, | ||||
95 | const OsmPlacemarkData& osmData) | ||||
96 | { | ||||
97 | for (auto const &coordinates: *linearRing) { | ||||
98 | m_nodes << OsmConverter::Node(coordinates, osmData.nodeReference(coordinates)); | ||||
99 | } | ||||
100 | m_ways << OsmConverter::Way(linearRing, osmData); | ||||
101 | } | ||||
102 | | ||||
103 | void OsmConverter::processPolygon(GeoDataPolygon *polygon, | ||||
104 | const OsmPlacemarkData& osmData, | ||||
105 | GeoDataPlacemark* placemark) | ||||
106 | { | ||||
107 | int index = -1; | ||||
108 | | ||||
109 | // Writing all the outerRing's nodes | ||||
110 | const GeoDataLinearRing &outerRing = polygon->outerBoundary(); | ||||
111 | const OsmPlacemarkData outerRingOsmData = osmData.memberReference( index ); | ||||
112 | for (auto const &coordinates: outerRing) { | ||||
113 | m_nodes << OsmConverter::Node(coordinates, outerRingOsmData.nodeReference(coordinates)); | ||||
114 | } | ||||
115 | m_ways << OsmConverter::Way(&outerRing, outerRingOsmData); | ||||
116 | | ||||
117 | // Writing all nodes for each innerRing | ||||
118 | for (auto const &innerRing: polygon->innerBoundaries() ) { | ||||
119 | ++index; | ||||
120 | const OsmPlacemarkData innerRingOsmData = osmData.memberReference( index ); | ||||
121 | for (auto const &coordinates: innerRing) { | ||||
122 | m_nodes << OsmConverter::Node(coordinates, innerRingOsmData.nodeReference(coordinates)); | ||||
123 | } | ||||
124 | m_ways << OsmConverter::Way(&innerRing, innerRingOsmData); | ||||
125 | } | ||||
126 | m_relations.append(OsmConverter::Relation(placemark, osmData)); | ||||
127 | } | ||||
128 | | ||||
108 | } | 129 | } | ||
109 | 130 | |