Commit 3f1b3bf2 authored by DonLakeFlyer's avatar DonLakeFlyer

Load KML support

parent 9c9e2d14
...@@ -56,9 +56,11 @@ const QGCMapPolygon& QGCMapPolygon::operator=(const QGCMapPolygon& other) ...@@ -56,9 +56,11 @@ const QGCMapPolygon& QGCMapPolygon::operator=(const QGCMapPolygon& other)
clear(); clear();
QVariantList vertices = other.path(); QVariantList vertices = other.path();
for (int i=0; i<vertices.count(); i++) { QList<QGeoCoordinate> rgCoord;
appendVertex(vertices[i].value<QGeoCoordinate>()); foreach (const QVariant& vertexVar, vertices) {
rgCoord.append(vertexVar.value<QGeoCoordinate>());
} }
appendVertices(rgCoord);
setDirty(true); setDirty(true);
...@@ -270,7 +272,6 @@ void QGCMapPolygon::appendVertices(const QList<QGeoCoordinate>& coordinates) ...@@ -270,7 +272,6 @@ void QGCMapPolygon::appendVertices(const QList<QGeoCoordinate>& coordinates)
emit pathChanged(); emit pathChanged();
} }
void QGCMapPolygon::_polygonModelDirtyChanged(bool dirty) void QGCMapPolygon::_polygonModelDirtyChanged(bool dirty)
{ {
if (dirty) { if (dirty) {
...@@ -447,9 +448,7 @@ void QGCMapPolygon::offset(double distance) ...@@ -447,9 +448,7 @@ void QGCMapPolygon::offset(double distance)
// Update internals // Update internals
clear(); clear();
for (int i=0; i<rgNewPolygon.count(); i++) { appendVertices(rgNewPolygon);
appendVertex(rgNewPolygon[i]);
}
} }
bool QGCMapPolygon::loadKMLFile(const QString& kmlFile) bool QGCMapPolygon::loadKMLFile(const QString& kmlFile)
......
...@@ -358,13 +358,13 @@ bool QGCMapPolyline::loadKMLFile(const QString& kmlFile) ...@@ -358,13 +358,13 @@ bool QGCMapPolyline::loadKMLFile(const QString& kmlFile)
return false; return false;
} }
QDomNodeList rgNodes = doc.elementsByTagName("Polygon"); QDomNodeList rgNodes = doc.elementsByTagName("LineString");
if (rgNodes.count() == 0) { if (rgNodes.count() == 0) {
qgcApp()->showMessage(tr("Unable to find Polygon node in KML")); qgcApp()->showMessage(tr("Unable to find LineString node in KML"));
return false; return false;
} }
QDomNode coordinatesNode = rgNodes.item(0).namedItem("outerBoundaryIs").namedItem("LinearRing").namedItem("coordinates"); QDomNode coordinatesNode = rgNodes.item(0).namedItem("coordinates");
if (coordinatesNode.isNull()) { if (coordinatesNode.isNull()) {
qgcApp()->showMessage(tr("Internal error: Unable to find coordinates node in KML")); qgcApp()->showMessage(tr("Internal error: Unable to find coordinates node in KML"));
return false; return false;
...@@ -386,29 +386,8 @@ bool QGCMapPolyline::loadKMLFile(const QString& kmlFile) ...@@ -386,29 +386,8 @@ bool QGCMapPolyline::loadKMLFile(const QString& kmlFile)
rgCoords.append(coord); rgCoords.append(coord);
} }
// Determine winding, reverse if needed
double sum = 0;
for (int i=0; i<rgCoords.count(); i++) {
QGeoCoordinate coord1 = rgCoords[i];
QGeoCoordinate coord2 = (i == rgCoords.count() - 1) ? rgCoords[0] : rgCoords[i+1];
sum += (coord2.longitude() - coord1.longitude()) * (coord2.latitude() + coord1.latitude());
}
bool reverse = sum < 0.0;
if (reverse) {
QList<QGeoCoordinate> rgReversed;
for (int i=0; i<rgCoords.count(); i++) {
rgReversed.prepend(rgCoords[i]);
}
rgCoords = rgReversed;
}
clear(); clear();
for (int i=0; i<rgCoords.count(); i++) { appendVertices(rgCoords);
appendVertex(rgCoords[i]);
}
return true; return true;
} }
...@@ -438,3 +417,15 @@ double QGCMapPolyline::length(void) const ...@@ -438,3 +417,15 @@ double QGCMapPolyline::length(void) const
return length; return length;
} }
void QGCMapPolyline::appendVertices(const QList<QGeoCoordinate>& coordinates)
{
QList<QObject*> objects;
foreach (const QGeoCoordinate& coordinate, coordinates) {
objects.append(new QGCQGeoCoordinate(coordinate, this));
_polylinePath.append(QVariant::fromValue(coordinate));
}
_polylineModel.append(objects);
emit pathChanged();
}
...@@ -34,6 +34,7 @@ public: ...@@ -34,6 +34,7 @@ public:
Q_INVOKABLE void clear(void); Q_INVOKABLE void clear(void);
Q_INVOKABLE void appendVertex(const QGeoCoordinate& coordinate); Q_INVOKABLE void appendVertex(const QGeoCoordinate& coordinate);
Q_INVOKABLE void removeVertex(int vertexIndex); Q_INVOKABLE void removeVertex(int vertexIndex);
Q_INVOKABLE void appendVertices(const QList<QGeoCoordinate>& coordinates);
/// Adjust the value for the specified coordinate /// Adjust the value for the specified coordinate
/// @param vertexIndex Polygon point index to modify (0-based) /// @param vertexIndex Polygon point index to modify (0-based)
......
...@@ -120,13 +120,28 @@ Item { ...@@ -120,13 +120,28 @@ Item {
selectExisting: true selectExisting: true
nameFilters: [ qsTr("KML files (*.kml)") ] nameFilters: [ qsTr("KML files (*.kml)") ]
onAcceptedForLoad: { onAcceptedForLoad: {
mapPolyline.loadKMLFile(file) mapPolyline.loadKMLFile(file)
close() close()
} }
} }
Menu {
id: menu
property int removeVertex
MenuItem {
text: qsTr("Remove vertex" )
onTriggered: mapPolyline.removeVertex(parent.removeVertex)
}
MenuItem {
text: qsTr("Load KML...")
onTriggered: kmlLoadDialog.openForLoad()
}
}
Component { Component {
id: polylineComponent id: polylineComponent
...@@ -227,7 +242,15 @@ Item { ...@@ -227,7 +242,15 @@ Item {
} }
} }
onClicked: mapPolyline.removeVertex(polylineVertex) onClicked: {
if (polylineVertex == 0) {
menu.removeVertex = polylineVertex
menu.popup()
} else {
mapPolyline.removeVertex(polylineVertex)
}
}
} }
} }
...@@ -249,6 +272,14 @@ Item { ...@@ -249,6 +272,14 @@ Item {
radius: width / 2 radius: width / 2
color: "white" color: "white"
opacity: .90 opacity: .90
QGCLabel {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
text: "..."
color: "black"
visible: polylineVertex == 0
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment