File indexing completed on 2024-04-28 03:50:14

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2010 Utku Aydin <utkuaydin34@gmail.com>
0004 //
0005 
0006 #include "EarthquakeModel.h"
0007 #include "EarthquakeItem.h"
0008 
0009 #include "MarbleGlobal.h"
0010 #include "MarbleModel.h"
0011 #include "GeoDataCoordinates.h"
0012 #include "GeoDataLatLonAltBox.h"
0013 #include "MarbleDebug.h"
0014 
0015 #include <QDebug>
0016 #include <QString>
0017 #include <QUrl>
0018 #include <QJsonDocument>
0019 #include <QJsonArray>
0020 #include <QJsonObject>
0021 
0022 namespace Marble {
0023 
0024 EarthquakeModel::EarthquakeModel( const MarbleModel *marbleModel, QObject *parent )
0025     : AbstractDataPluginModel( "earthquake", marbleModel, parent ),
0026       m_minMagnitude( 0.0 ),
0027       m_startDate( QDateTime::fromString( "2006-02-04", "yyyy-MM-dd" ) ),
0028       m_endDate( QDateTime::currentDateTime() )
0029 {
0030     // nothing to do
0031 }
0032 
0033 EarthquakeModel::~EarthquakeModel()
0034 {
0035 }
0036 
0037 void EarthquakeModel::setMinMagnitude( double minMagnitude )
0038 {
0039     m_minMagnitude = minMagnitude;
0040 }
0041 
0042 void EarthquakeModel::setStartDate( const QDateTime& startDate )
0043 {
0044     m_startDate = startDate;
0045 }
0046 
0047 void EarthquakeModel::setEndDate( const QDateTime& endDate )
0048 {
0049     m_endDate = endDate;
0050 }
0051 
0052 void EarthquakeModel::getAdditionalItems( const GeoDataLatLonAltBox& box, qint32 number )
0053 {
0054     if (marbleModel()->planetId() != QLatin1String("earth")) {
0055         return;
0056     }
0057 
0058     const QString geonamesUrl( QLatin1String("http://api.geonames.org/earthquakesJSON") +
0059         QLatin1String("?north=")   + QString::number(box.north() * RAD2DEG) +
0060         QLatin1String("&south=")   + QString::number(box.south() * RAD2DEG) +
0061         QLatin1String("&east=")    + QString::number(box.east() * RAD2DEG) +
0062         QLatin1String("&west=")    + QString::number(box.west() * RAD2DEG) +
0063         QLatin1String("&date=")    + m_endDate.toString("yyyy-MM-dd") +
0064         QLatin1String("&maxRows=") + QString::number(number) +
0065         QLatin1String("&username=marble") +
0066         QLatin1String("&formatted=true"));
0067     downloadDescriptionFile( QUrl( geonamesUrl ) );
0068 }
0069 
0070 void EarthquakeModel::parseFile( const QByteArray& file )
0071 {
0072     QJsonDocument jsonDoc = QJsonDocument::fromJson(file);
0073     QJsonValue earthquakesValue = jsonDoc.object().value(QStringLiteral("earthquakes"));
0074 
0075     // Parse if any result exists
0076     if (earthquakesValue.isArray()) {
0077         // Add items to the list
0078         QList<AbstractDataPluginItem*> items;
0079 
0080         QJsonArray earthquakeArray = earthquakesValue.toArray();
0081         for (int earthquakeIndex = 0; earthquakeIndex < earthquakeArray.size(); ++earthquakeIndex) {
0082             QJsonObject levelObject = earthquakeArray[earthquakeIndex].toObject();
0083 
0084             // Converting earthquake's properties from JSON to appropriate types
0085             const QString eqid = levelObject.value(QStringLiteral("eqid")).toString(); // Earthquake's ID
0086             const double longitude = levelObject.value(QStringLiteral("lng")).toDouble();
0087             const double latitude = levelObject.value(QStringLiteral("lat")).toDouble();
0088             const double magnitude = levelObject.value(QStringLiteral("magnitude")).toDouble();
0089             const QString dateString = levelObject.value(QStringLiteral("datetime")).toString();
0090             const QDateTime date = QDateTime::fromString(dateString, QStringLiteral("yyyy-MM-dd hh:mm:ss"));
0091             const double depth = levelObject.value(QStringLiteral("depth")).toDouble();
0092 
0093             if( date <= m_endDate && date >= m_startDate && magnitude >= m_minMagnitude ) {
0094                 if( !itemExists( eqid ) ) {
0095                     // If it does not exists, create it
0096                     GeoDataCoordinates coordinates( longitude, latitude, 0.0, GeoDataCoordinates::Degree );
0097                     EarthquakeItem *item = new EarthquakeItem( this );
0098                     item->setId( eqid );
0099                     item->setCoordinate( coordinates );
0100                     item->setMagnitude( magnitude );
0101                     item->setDateTime( date );
0102                     item->setDepth( depth );
0103                     items << item;
0104                 }
0105             }
0106         }
0107 
0108         addItemsToList( items );
0109     }
0110 }
0111 
0112 
0113 }
0114 
0115 #include "moc_EarthquakeModel.cpp"