Skip to content
Snippets Groups Projects
ShapeFileHelper.cc 3.22 KiB
Newer Older
  • Learn to ignore specific revisions
  • /****************************************************************************
     *
     *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
     *
     * QGroundControl is licensed according to the terms in the file
     * COPYING.md in the root of the source code directory.
     *
     ****************************************************************************/
    
    #include "ShapeFileHelper.h"
    #include "AppSettings.h"
    #include "KMLFileHelper.h"
    #include "SHPFileHelper.h"
    
    #include <QFile>
    #include <QVariant>
    
    const char* ShapeFileHelper::_errorPrefix = QT_TR_NOOP("Shape file load failed. %1");
    
    QVariantList ShapeFileHelper::determineShapeType(const QString& file)
    {
        QString errorString;
        ShapeType shapeType = determineShapeType(file, errorString);
    
        QVariantList varList;
        varList.append(QVariant::fromValue(shapeType));
        varList.append(QVariant::fromValue(errorString));
    
        return varList;
    }
    
    bool ShapeFileHelper::_fileIsKML(const QString& file, QString& errorString)
    {
        errorString.clear();
    
        if (file.endsWith(AppSettings::kmlFileExtension)) {
            return true;
        } else if (file.endsWith(AppSettings::shpFileExtension)) {
            return false;
        } else {
            errorString = QString(_errorPrefix).arg(tr("Unsupported file type. Only .%1 and .%2 are supported.").arg(AppSettings::kmlFileExtension).arg(AppSettings::shpFileExtension));
        }
    
        return true;
    }
    
    ShapeFileHelper::ShapeType ShapeFileHelper::determineShapeType(const QString& file, QString& errorString)
    {
        ShapeType shapeType = Error;
    
        errorString.clear();
    
        bool fileIsKML = _fileIsKML(file, errorString);
        if (errorString.isEmpty()) {
            if (fileIsKML) {
                shapeType = KMLFileHelper::determineShapeType(file, errorString);
            } else {
                shapeType = SHPFileHelper::determineShapeType(file, errorString);
            }
        }
    
        return shapeType;
    }
    
    bool ShapeFileHelper::loadPolygonFromFile(const QString& file, QList<QGeoCoordinate>& vertices, QString& errorString)
    {
        bool success = false;
    
        errorString.clear();
        vertices.clear();
    
        bool fileIsKML = _fileIsKML(file, errorString);
        if (errorString.isEmpty()) {
            if (fileIsKML) {
                success = KMLFileHelper::loadPolygonFromFile(file, vertices, errorString);
            } else {
                success = SHPFileHelper::loadPolygonFromFile(file, vertices, errorString);
            }
        }
    
        return success;
    }
    
    bool ShapeFileHelper::loadPolylineFromFile(const QString& file, QList<QGeoCoordinate>& coords, QString& errorString)
    {
        errorString.clear();
        coords.clear();
    
        bool fileIsKML = _fileIsKML(file, errorString);
        if (errorString.isEmpty()) {
            if (fileIsKML) {
                KMLFileHelper::loadPolylineFromFile(file, coords, errorString);
            } else {
                errorString = QString(_errorPrefix).arg(tr("Polyline not support from SHP files."));
            }
        }
    
        return errorString.isEmpty();
    }
    
    QStringList ShapeFileHelper::fileDialogKMLFilters(void) const
    {
        return QStringList(tr("KML Files (*.%1)").arg(AppSettings::kmlFileExtension));
    }
    
    QStringList ShapeFileHelper::fileDialogKMLOrSHPFilters(void) const
    {
        return QStringList(tr("KML/SHP Files (*.%1 *.%2)").arg(AppSettings::kmlFileExtension).arg(AppSettings::shpFileExtension));
    }