#include "GeoArea.h" #include "snake.h" #include "QGCLoggingCategory.h" #include "QGCQGeoCoordinate.h" #include QGC_LOGGING_CATEGORY(GeoAreaLog, "GeoAreaLog") const char *GeoArea::wimaAreaName = "GeoArea"; const char *GeoArea::areaTypeName = "AreaType"; const char *GeoArea::settingsGroup = "GeoArea"; // Constructors GeoArea::GeoArea(QObject *parent) : QGCMapPolygon(parent) { init(); } GeoArea::GeoArea(const GeoArea &other, QObject *parent) : QGCMapPolygon(other, parent), _errorString(other._errorString) { init(); } GeoArea &GeoArea::operator=(const GeoArea &other) { QGCMapPolygon::operator=(other); return *this; } void GeoArea::saveToJson(QJsonObject &json) { this->QGCMapPolygon::saveToJson(json); } bool GeoArea::loadFromJson(const QJsonObject &json, QString &errorString) { if (!this->QGCMapPolygon::loadFromJson(json, false /*no poly required*/, errorString)) { qWarning() << errorString; return false; } return true; } bool GeoArea::isCorrect() { if (this->pathModel().count() >= 3) { auto origin = this->pathModel().value(0)->coordinate(); snake::FPolygon polygonENU; snake::areaToEnu(origin, this->pathModel(), polygonENU); std::string msg; if (bg::is_valid(polygonENU, msg)) { return true; } else { qCWarning(GeoAreaLog) << msg.c_str(); qCWarning(GeoAreaLog) << "origin: " << origin; std::stringstream ss; ss << bg::wkt(polygonENU); qCWarning(GeoAreaLog) << "polygonENU: " << ss.str().c_str(); setErrorString(tr("Area invalid. Area must be a simple polygon.")); } } return false; } QString GeoArea::errorString() const { return this->_errorString; } void GeoArea::init() { this->setObjectName(wimaAreaName); } void GeoArea::setErrorString(const QString &str) { this->_errorString = str; emit errorStringChanged(); } void GeoArea::setErrorString(const string &str) { this->_errorString = str.c_str(); emit errorStringChanged(); } bool copyAreaList(const QmlObjectListModel &from, QmlObjectListModel &to, QObject *parent) { // Check if elements are valid. for (int i = 0; i < from.count(); ++i) { auto obj = from[i]; auto area = qobject_cast(obj); if (area == nullptr) { return false; } } // Clone elements. for (int i = 0; i < from.count(); ++i) { auto obj = from[i]; auto area = qobject_cast(obj); to.append(area->clone(parent)); } return true; }