Marble

KmlFeatureTagWriter.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2013 Dennis Nienhüser <[email protected]>
4 //
5 
6 #include "KmlFeatureTagWriter.h"
7 
8 #include "GeoDataOverlay.h"
9 #include "GeoDataTimeStamp.h"
10 #include "GeoDataTimeSpan.h"
11 #include "GeoDataDocument.h"
12 #include "GeoDataStyle.h"
13 #include "GeoDataStyleMap.h"
14 #include "GeoDataExtendedData.h"
15 #include "GeoDataLookAt.h"
16 #include "GeoDataPlacemark.h"
17 #include "GeoDataCamera.h"
18 #include "GeoWriter.h"
19 #include "GeoDataRegion.h"
20 #include "GeoDataLatLonAltBox.h"
21 #include "KmlElementDictionary.h"
22 #include "KmlObjectTagWriter.h"
23 #include "KmlOsmPlacemarkDataTagWriter.h"
24 #include "OsmPlacemarkData.h"
25 
26 #include <QDateTime>
27 
28 namespace Marble
29 {
30 
31 KmlFeatureTagWriter::KmlFeatureTagWriter(const QString &elementName)
32  : m_elementName( elementName )
33 {
34  // nothing to do
35 }
36 
37 bool KmlFeatureTagWriter::write( const Marble::GeoNode *node, GeoWriter &writer ) const
38 {
39  const GeoDataFeature *feature = static_cast<const GeoDataFeature*>(node);
40 
41  if (const GeoDataDocument *document = geodata_cast<GeoDataDocument>(feature)) {
42  // when a document has only one feature and no styling
43  // the document tag is excused
44  if( (document->id().isEmpty())
45  && (document->name().isEmpty())
46  && (document->targetId().isEmpty())
47  && (document->styles().count() == 0)
48  && (document->styleMaps().count() == 0)
49  && (document->extendedData().isEmpty())
50  && (document->featureList().count() == 1) ) {
51  writeElement( document->featureList()[0], writer );
52  return true;
53  }
54  }
55 
56  writer.writeStartElement( m_elementName );
57 
58  KmlObjectTagWriter::writeIdentifiers( writer, feature );
59 
60  writer.writeOptionalElement( kml::kmlTag_name, feature->name() );
61  writer.writeOptionalElement( kml::kmlTag_visibility, QString::number( feature->isVisible() ), "1" );
62  writer.writeOptionalElement( "address", feature->address() );
63 
64  if( !feature->description().isEmpty() ) {
65  writer.writeStartElement( "description" );
66  if( feature->descriptionIsCDATA() ) {
67  writer.writeCDATA( feature->description() );
68  } else {
69  writer.writeCharacters( feature->description() );
70  }
71  writer.writeEndElement();
72  }
73 
74  GeoDataLookAt const * lookAt = dynamic_cast<const GeoDataLookAt*>( feature->abstractView() );
75  if ( lookAt ) {
76  writeElement( lookAt, writer );
77  }
78  GeoDataCamera const * camera = dynamic_cast<const GeoDataCamera*>( feature->abstractView() );
79  if ( camera ) {
80  writeElement( camera, writer );
81  }
82 
83  if( feature->timeStamp().when().isValid() ) {
84  writeElement( &feature->timeStamp(), writer );
85  }
86 
87  if( feature->timeSpan().isValid() ) {
88  writeElement( &feature->timeSpan(), writer );
89  }
90 
91  if ( !feature->region().latLonAltBox().isNull() ) {
92  writeElement( &feature->region(), writer );
93  }
94 
95  bool const result = writeMid( node, writer );
96 
97  if (geodata_cast<GeoDataPlacemark>(feature)) {
98  KmlOsmPlacemarkDataTagWriter::write(feature, writer);
99  }
100 
101  if( !feature->extendedData().isEmpty() ) {
102  writeElement( &feature->extendedData(), writer );
103  }
104 
105  writer.writeEndElement();
106  return result;
107 }
108 
109 }
Q_SCRIPTABLE QString camera()
QString number(int n, int base)
A shared base class for all classes that are mapped to a specific tag (ie.
Definition: GeoDocument.h:34
static bool write(const GeoDataFeature *feature, GeoWriter &writer)
write function writes a custom XML schema made to store OsmPlacemarkData in a valid KML context
Binds a QML item to a specific geodetic location in screen coordinates.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Sep 21 2023 04:12:27 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.