File indexing completed on 2024-05-19 03:53:14
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2015 Stanciu Marius-Valeriu <stanciumarius94@gmail.com> 0004 // 0005 0006 //Self 0007 #include "OsmDocumentTagTranslator.h" 0008 0009 //Marble 0010 #include "OsmNodeTagWriter.h" 0011 #include "OsmWayTagWriter.h" 0012 #include "OsmElementDictionary.h" 0013 #include "GeoDataDocument.h" 0014 #include "GeoWriter.h" 0015 #include "GeoDataGeometry.h" 0016 #include "GeoDataPoint.h" 0017 #include "GeoDataPolygon.h" 0018 #include "GeoDataBuilding.h" 0019 #include "GeoDataMultiGeometry.h" 0020 #include "GeoDataPlacemark.h" 0021 #include "GeoDataLinearRing.h" 0022 #include "GeoDataTypes.h" 0023 #include "osm/OsmPlacemarkData.h" 0024 #include "osm/OsmObjectManager.h" 0025 #include "OsmRelationTagWriter.h" 0026 #include "OsmConverter.h" 0027 0028 #include <QDebug> 0029 0030 namespace Marble 0031 { 0032 0033 static GeoTagWriterRegistrar s_writerDocument( GeoTagWriter::QualifiedName( GeoDataTypes::GeoDataDocumentType, 0034 osm::osmTag_version06 ), 0035 new OsmDocumentTagTranslator() ); 0036 0037 0038 bool OsmDocumentTagTranslator::write( const GeoNode *node, GeoWriter& writer ) const 0039 { 0040 const GeoDataDocument *document = static_cast<const GeoDataDocument*>(node); 0041 0042 OsmConverter converter; 0043 converter.read(document); 0044 OsmNodeTagWriter::writeAllNodes(converter.nodes(), writer); 0045 0046 qint64 lastId = 0; 0047 for (auto const &way: converter.ways()) { 0048 if (way.second.id() != lastId) { 0049 OsmWayTagWriter::writeWay(*way.first, way.second, writer); 0050 lastId = way.second.id(); 0051 } 0052 } 0053 0054 for (auto const & relation: converter.relations()) { 0055 if (auto placemark = geodata_cast<GeoDataPlacemark>(relation.first)) { 0056 if (const auto building = geodata_cast<GeoDataBuilding>(placemark->geometry())) { 0057 auto polygon = geodata_cast<GeoDataPolygon>(&building->multiGeometry()->at(0)); 0058 Q_ASSERT(polygon); 0059 OsmRelationTagWriter::writeMultipolygon(*polygon, relation.second, writer ); 0060 } else { 0061 auto polygon = geodata_cast<GeoDataPolygon>(placemark->geometry()); 0062 Q_ASSERT(polygon); 0063 OsmRelationTagWriter::writeMultipolygon(*polygon, relation.second, writer ); 0064 } 0065 } 0066 } 0067 0068 return true; 0069 } 0070 0071 } 0072