QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
KMLDomDocument.cc
Go to the documentation of this file.
1#include "KMLDomDocument.h"
3
4#include <QtGui/QColor>
5#include <QtPositioning/QGeoCoordinate>
6
7QGC_LOGGING_CATEGORY(KMLDomDocumentLog, "Utilities.KMLDomDocument")
8
9KMLDomDocument::KMLDomDocument(const QString &name)
10{
11 const QDomProcessingInstruction header = createProcessingInstruction(QStringLiteral("xml"), QStringLiteral("version=\"1.0\" encoding=\"UTF-8\""));
12 (void) appendChild(header);
13
14 QDomElement kmlElement = createElement(QStringLiteral("kml"));
15 kmlElement.setAttribute(QStringLiteral("xmlns"), kmlNamespace);
16 kmlElement.setAttribute(QStringLiteral("xmlns:xsi"), xsiNamespace);
17 kmlElement.setAttribute(QStringLiteral("xsi:schemaLocation"),
18 QStringLiteral("%1 %2").arg(kmlNamespace, kmlSchemaLocation));
19
20 _rootDocumentElement = createElement(QStringLiteral("Document"));
21 (void) kmlElement.appendChild(_rootDocumentElement);
22 (void) appendChild(kmlElement);
23
24 addTextElement(_rootDocumentElement, "name", name);
25 addTextElement(_rootDocumentElement, "open", "1");
26
27 _addStandardStyles();
28}
29
30QString KMLDomDocument::kmlCoordString(const QGeoCoordinate &coord)
31{
32 const double altitude = qIsNaN(coord.altitude()) ? 0 : coord.altitude();
33 return QStringLiteral("%1,%2,%3").arg(QString::number(coord.longitude(), 'f', 7), QString::number(coord.latitude(), 'f', 7), QString::number(altitude, 'f', 2));
34}
35
36QString KMLDomDocument::kmlColorString(const QColor &color, double opacity)
37{
38 return QStringLiteral("%1%2%3%4").arg(static_cast<int>(255.0 * opacity), 2, 16, QChar('0')).arg(color.blue(), 2, 16, QChar('0')).arg(color.green(), 2, 16, QChar('0')).arg(color.red(), 2, 16, QChar('0'));
39}
40
41void KMLDomDocument::_addStandardStyles()
42{
43 QDomElement styleElementForBalloon = createElement("Style");
44 styleElementForBalloon.setAttribute("id", balloonStyleName);
45 QDomElement balloonStyleElement = createElement("BalloonStyle");
46 addTextElement(balloonStyleElement, "text", "$[description]");
47 (void) styleElementForBalloon.appendChild(balloonStyleElement);
48 (void) _rootDocumentElement.appendChild(styleElementForBalloon);
49}
50
51void KMLDomDocument::addTextElement(QDomElement &parentElement, const QString &name, const QString &value)
52{
53 QDomElement textElement = createElement(name);
54 (void) textElement.appendChild(createTextNode(value));
55 (void) parentElement.appendChild(textElement);
56}
57
58void KMLDomDocument::addLookAt(QDomElement &parentElement, const QGeoCoordinate &coord)
59{
60 QDomElement lookAtElement = createElement("LookAt");
61 addTextElement(lookAtElement, "latitude", QString::number(coord.latitude(), 'f', 7));
62 addTextElement(lookAtElement, "longitude", QString::number(coord.longitude(), 'f', 7));
63 const double altitude = qIsNaN(coord.altitude()) ? 0 : coord.altitude();
64 addTextElement(lookAtElement, "altitude", QString::number(altitude, 'f', 2));
65 addTextElement(lookAtElement, "heading", "-100");
66 addTextElement(lookAtElement, "tilt", "45");
67 addTextElement(lookAtElement, "range", "2500");
68 (void) parentElement.appendChild(lookAtElement);
69}
70
71QDomElement KMLDomDocument::addPlacemark(const QString &name, bool visible)
72{
73 QDomElement placemarkElement = createElement("Placemark");
74 (void) _rootDocumentElement.appendChild(placemarkElement);
75
76 addTextElement(placemarkElement, "name", name);
77 addTextElement(placemarkElement, "visibility", visible ? "1" : "0");
78
79 return placemarkElement;
80}
81
82void KMLDomDocument::appendChildToRoot(const QDomNode &child)
83{
84 (void) _rootDocumentElement.appendChild(child);
85}
86
87QDomElement KMLDomDocument::addFolder(const QString &name)
88{
89 QDomElement folderElement = createElement("Folder");
90 addTextElement(folderElement, "name", name);
91 (void) _rootDocumentElement.appendChild(folderElement);
92 return folderElement;
93}
94
95void KMLDomDocument::addDescription(QDomElement &parent, const QString &content)
96{
97 QDomElement descriptionElement = createElement("description");
98 QDomCDATASection cdataSection = createCDATASection(content);
99 (void) descriptionElement.appendChild(cdataSection);
100 (void) parent.appendChild(descriptionElement);
101}
102
103QDomElement KMLDomDocument::addStyle(const QString &id)
104{
105 QDomElement styleElement = createElement("Style");
106 styleElement.setAttribute("id", id);
107 (void) _rootDocumentElement.appendChild(styleElement);
108 return styleElement;
109}
110
111void KMLDomDocument::addLineStyle(QDomElement &styleElement, const QColor &color, int width, double opacity)
112{
113 QDomElement lineStyleElement = createElement("LineStyle");
114 addTextElement(lineStyleElement, "color", kmlColorString(color, opacity));
115 addTextElement(lineStyleElement, "width", QString::number(width));
116 (void) styleElement.appendChild(lineStyleElement);
117}
118
119void KMLDomDocument::addPolyStyle(QDomElement &styleElement, const QColor &color, double opacity)
120{
121 QDomElement polyStyleElement = createElement("PolyStyle");
122 addTextElement(polyStyleElement, "color", kmlColorString(color, opacity));
123 (void) styleElement.appendChild(polyStyleElement);
124}
125
126QDomElement KMLDomDocument::addPoint(QDomElement &parent, const QGeoCoordinate &coord,
127 const QString &altitudeMode, bool extrude)
128{
129 QDomElement pointElement = createElement("Point");
130 addTextElement(pointElement, "altitudeMode", altitudeMode);
131 addTextElement(pointElement, "coordinates", kmlCoordString(coord));
132 addTextElement(pointElement, "extrude", extrude ? "1" : "0");
133 (void) parent.appendChild(pointElement);
134 return pointElement;
135}
136
137QDomElement KMLDomDocument::addLineString(QDomElement &parent, const QList<QGeoCoordinate> &coords,
138 const QString &altitudeMode, bool extrude, bool tessellate)
139{
140 QDomElement lineStringElement = createElement("LineString");
141 addTextElement(lineStringElement, "extrude", extrude ? "1" : "0");
142 addTextElement(lineStringElement, "tessellate", tessellate ? "1" : "0");
143 addTextElement(lineStringElement, "altitudeMode", altitudeMode);
144
145 QString coordString;
146 for (const QGeoCoordinate &coord : coords) {
147 coordString += QStringLiteral("%1\n").arg(kmlCoordString(coord));
148 }
149 addTextElement(lineStringElement, "coordinates", coordString);
150
151 (void) parent.appendChild(lineStringElement);
152 return lineStringElement;
153}
154
155QDomElement KMLDomDocument::addPolygon(QDomElement &parent, const QList<QGeoCoordinate> &coords,
156 const QString &altitudeMode)
157{
158 QDomElement polygonElement = createElement("Polygon");
159 addTextElement(polygonElement, "altitudeMode", altitudeMode);
160
161 QDomElement outerBoundaryIs = createElement("outerBoundaryIs");
162 QDomElement linearRing = createElement("LinearRing");
163
164 QString coordString;
165 for (const QGeoCoordinate &coord : coords) {
166 coordString += QStringLiteral("%1\n").arg(kmlCoordString(coord));
167 }
168 // Close the ring by repeating the first coordinate
169 if (!coords.isEmpty()) {
170 coordString += QStringLiteral("%1\n").arg(kmlCoordString(coords.first()));
171 }
172 addTextElement(linearRing, "coordinates", coordString);
173
174 (void) outerBoundaryIs.appendChild(linearRing);
175 (void) polygonElement.appendChild(outerBoundaryIs);
176 (void) parent.appendChild(polygonElement);
177 return polygonElement;
178}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Used to convert a Plan to a KML document.
void addPolyStyle(QDomElement &styleElement, const QColor &color, double opacity=1.0)
void addLineStyle(QDomElement &styleElement, const QColor &color, int width=1, double opacity=1.0)
void addLookAt(QDomElement &parentElement, const QGeoCoordinate &coord)
QDomElement addPolygon(QDomElement &parent, const QList< QGeoCoordinate > &coords, const QString &altitudeMode=QLatin1String("clampToGround"))
static QString kmlCoordString(const QGeoCoordinate &coord)
static QString kmlColorString(const QColor &color, double opacity=1)
void appendChildToRoot(const QDomNode &child)
QDomElement _rootDocumentElement
QDomElement addFolder(const QString &name)
QDomElement addLineString(QDomElement &parent, const QList< QGeoCoordinate > &coords, const QString &altitudeMode=QLatin1String("absolute"), bool extrude=true, bool tessellate=true)
QDomElement addPoint(QDomElement &parent, const QGeoCoordinate &coord, const QString &altitudeMode=QLatin1String("absolute"), bool extrude=true)
void addTextElement(QDomElement &parentElement, const QString &name, const QString &value)
void addDescription(QDomElement &parent, const QString &content)
static constexpr const char * balloonStyleName
QDomElement addPlacemark(const QString &name, bool visible)
QDomElement addStyle(const QString &id)