Commit 3f1b3bf2 authored by DonLakeFlyer's avatar DonLakeFlyer

Load KML support

parent 9c9e2d14
......@@ -56,9 +56,11 @@ const QGCMapPolygon& QGCMapPolygon::operator=(const QGCMapPolygon& other)
clear();
QVariantList vertices = other.path();
for (int i=0; i<vertices.count(); i++) {
appendVertex(vertices[i].value<QGeoCoordinate>());
QList<QGeoCoordinate> rgCoord;
foreach (const QVariant& vertexVar, vertices) {
rgCoord.append(vertexVar.value<QGeoCoordinate>());
}
appendVertices(rgCoord);
setDirty(true);
......@@ -270,7 +272,6 @@ void QGCMapPolygon::appendVertices(const QList<QGeoCoordinate>& coordinates)
emit pathChanged();
}
void QGCMapPolygon::_polygonModelDirtyChanged(bool dirty)
{
if (dirty) {
......@@ -447,9 +448,7 @@ void QGCMapPolygon::offset(double distance)
// Update internals
clear();
for (int i=0; i<rgNewPolygon.count(); i++) {
appendVertex(rgNewPolygon[i]);
}
appendVertices(rgNewPolygon);
}
bool QGCMapPolygon::loadKMLFile(const QString& kmlFile)
......
......@@ -358,13 +358,13 @@ bool QGCMapPolyline::loadKMLFile(const QString& kmlFile)
return false;
}
QDomNodeList rgNodes = doc.elementsByTagName("Polygon");
QDomNodeList rgNodes = doc.elementsByTagName("LineString");
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;
}
QDomNode coordinatesNode = rgNodes.item(0).namedItem("outerBoundaryIs").namedItem("LinearRing").namedItem("coordinates");
QDomNode coordinatesNode = rgNodes.item(0).namedItem("coordinates");
if (coordinatesNode.isNull()) {
qgcApp()->showMessage(tr("Internal error: Unable to find coordinates node in KML"));
return false;
......@@ -386,29 +386,8 @@ bool QGCMapPolyline::loadKMLFile(const QString& kmlFile)
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();
for (int i=0; i<rgCoords.count(); i++) {
appendVertex(rgCoords[i]);
}
appendVertices(rgCoords);
return true;
}
......@@ -438,3 +417,15 @@ double QGCMapPolyline::length(void) const
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:
Q_INVOKABLE void clear(void);
Q_INVOKABLE void appendVertex(const QGeoCoordinate& coordinate);
Q_INVOKABLE void removeVertex(int vertexIndex);
Q_INVOKABLE void appendVertices(const QList<QGeoCoordinate>& coordinates);
/// Adjust the value for the specified coordinate
/// @param vertexIndex Polygon point index to modify (0-based)
......
......@@ -120,13 +120,28 @@ Item {
selectExisting: true
nameFilters: [ qsTr("KML files (*.kml)") ]
onAcceptedForLoad: {
mapPolyline.loadKMLFile(file)
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 {
id: polylineComponent
......@@ -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 {
radius: width / 2
color: "white"
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