Changeset View
Changeset View
Standalone View
Standalone View
src/plugins/runner/osm/translators/OsmConverter.cpp
Context not available. | |||||
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" | ||
Context not available. | |||||
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 | } | | |||
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 | } | 66 | } | ||
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())); | ||
Context not available. | |||||
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 | | |||
Context not available. |