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"