/**************************************************************************** * * (c) 2009-2016 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #include "KMLFileHelper.h" #include #include QDomDocument KMLFileHelper::loadFile(const QString& kmlFile, QString& errorString) { QFile file(kmlFile); errorString.clear(); if (!file.exists()) { errorString = tr("File not found: %1").arg(kmlFile); return QDomDocument(); } if (!file.open(QIODevice::ReadOnly)) { errorString = tr("Unable to open file: %1 error: $%2").arg(kmlFile).arg(file.errorString()); return QDomDocument(); } QDomDocument doc; QString errorMessage; int errorLine; if (!doc.setContent(&file, &errorMessage, &errorLine)) { errorString = tr("Unable to parse KML file: %1 error: %2 line: %3").arg(kmlFile).arg(errorMessage).arg(errorLine); return QDomDocument(); } return doc; } QVariantList KMLFileHelper::determineFileContents(const QString& kmlFile) { QString errorString; KMLFileContents fileContents = determineFileContents(kmlFile, errorString); QVariantList varList; varList.append(QVariant::fromValue(fileContents)); varList.append(QVariant::fromValue(errorString)); return varList; } KMLFileHelper::KMLFileContents KMLFileHelper::determineFileContents(const QString& kmlFile, QString& errorString) { QDomDocument domDocument = KMLFileHelper::loadFile(kmlFile, errorString); if (!errorString.isEmpty()) { return Error; } QDomNodeList rgNodes = domDocument.elementsByTagName("Polygon"); if (rgNodes.count()) { return Polygon; } rgNodes = domDocument.elementsByTagName("LineString"); if (rgNodes.count()) { return Polyline; } errorString = tr("No known type found in KML file."); return Error; } bool KMLFileHelper::loadPolygonFromFile(const QString& kmlFile, QList& vertices, QString& errorString) { errorString.clear(); vertices.clear(); QDomDocument domDocument = KMLFileHelper::loadFile(kmlFile, errorString); if (!errorString.isEmpty()) { return false; } QDomNodeList rgNodes = domDocument.elementsByTagName("Polygon"); if (rgNodes.count() == 0) { errorString = tr("Unable to find Polygon node in KML"); return false; } QDomNode coordinatesNode = rgNodes.item(0).namedItem("outerBoundaryIs").namedItem("LinearRing").namedItem("coordinates"); if (coordinatesNode.isNull()) { errorString = tr("Internal error: Unable to find coordinates node in KML"); return false; } QString coordinatesString = coordinatesNode.toElement().text().simplified(); QStringList rgCoordinateStrings = coordinatesString.split(" "); QList rgCoords; for (int i=0; i rgReversed; for (int i=0; i& coords, QString& errorString) { errorString.clear(); coords.clear(); QDomDocument domDocument = KMLFileHelper::loadFile(kmlFile, errorString); if (!errorString.isEmpty()) { return false; } QDomNodeList rgNodes = domDocument.elementsByTagName("LineString"); if (rgNodes.count() == 0) { errorString = tr("Unable to find LineString node in KML"); return false; } QDomNode coordinatesNode = rgNodes.item(0).namedItem("coordinates"); if (coordinatesNode.isNull()) { errorString = tr("Internal error: Unable to find coordinates node in KML"); return false; } QString coordinatesString = coordinatesNode.toElement().text().simplified(); QStringList rgCoordinateStrings = coordinatesString.split(" "); QList rgCoords; for (int i=0; i