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