• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • plugins
  • render
  • weather
GeoNamesWeatherService.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2011 Valery Kharitonov <kharvd@gmail.com>
9 //
10 
11 #include "GeoNamesWeatherService.h"
12 
13 #include "WeatherData.h"
14 #include "GeoNamesWeatherItem.h"
15 #include "GeoDataLatLonAltBox.h"
16 #include "MarbleModel.h"
17 #include "MarbleDebug.h"
18 
19 #include <QUrl>
20 #include <QDateTime>
21 #include <QScriptEngine>
22 #include <QScriptValue>
23 #include <QScriptValueIterator>
24 
25 #if QT_VERSION >= 0x050000
26  #include <QUrlQuery>
27 #endif
28 
29 using namespace Marble;
30 
31 QHash<QString, WeatherData::WeatherCondition> GeoNamesWeatherService::dayConditions
32  = QHash<QString, WeatherData::WeatherCondition>();
33 QVector<WeatherData::WindDirection> GeoNamesWeatherService::windDirections
34  = QVector<WeatherData::WindDirection>(16);
35 
36 GeoNamesWeatherService::GeoNamesWeatherService( const MarbleModel *model, QObject *parent ) :
37  AbstractWeatherService( model, parent )
38 {
39  GeoNamesWeatherService::setupHashes();
40 }
41 
42 GeoNamesWeatherService::~GeoNamesWeatherService()
43 {
44 }
45 
46 void GeoNamesWeatherService::getAdditionalItems( const GeoDataLatLonAltBox& box,
47  qint32 number )
48 {
49  if( marbleModel()->planetId() != "earth" ) {
50  return;
51  }
52 
53  QUrl geonamesUrl( "http://ws.geonames.org/weatherJSON" );
54 #if QT_VERSION < 0x050000
55  geonamesUrl.addQueryItem( "north", QString::number( box.north( GeoDataCoordinates::Degree ) ) );
56  geonamesUrl.addQueryItem( "south", QString::number( box.south( GeoDataCoordinates::Degree ) ) );
57  geonamesUrl.addQueryItem( "east", QString::number( box.east( GeoDataCoordinates::Degree ) ) );
58  geonamesUrl.addQueryItem( "west", QString::number( box.west( GeoDataCoordinates::Degree ) ) );
59  geonamesUrl.addQueryItem( "maxRows", QString::number( number ) );
60  geonamesUrl.addQueryItem( "username", "marble" );
61 #else
62  QUrlQuery urlQuery;
63  urlQuery.addQueryItem( "north", QString::number( box.north( GeoDataCoordinates::Degree ) ) );
64  urlQuery.addQueryItem( "south", QString::number( box.south( GeoDataCoordinates::Degree ) ) );
65  urlQuery.addQueryItem( "east", QString::number( box.east( GeoDataCoordinates::Degree ) ) );
66  urlQuery.addQueryItem( "west", QString::number( box.west( GeoDataCoordinates::Degree ) ) );
67  urlQuery.addQueryItem( "maxRows", QString::number( number ) );
68  urlQuery.addQueryItem( "username", "marble" );
69  geonamesUrl.setQuery( urlQuery );
70 #endif
71 
72  emit downloadDescriptionFileRequested( geonamesUrl );
73 }
74 
75 void GeoNamesWeatherService::getItem( const QString &id )
76 {
77  if( marbleModel()->planetId() != "earth" ) {
78  return;
79  }
80 
81  if ( id.startsWith(QLatin1String("geonames_") ) ) {
82  QUrl geonamesUrl( "http://ws.geonames.org/weatherIcaoJSON" );
83 #if QT_VERSION < 0x050000
84  geonamesUrl.addQueryItem( "ICAO", id.mid( 9 ) );
85  geonamesUrl.addQueryItem( "username", "marble" );
86 #else
87  QUrlQuery urlQuery;
88  urlQuery.addQueryItem( "ICAO", id.mid( 9 ) );
89  urlQuery.addQueryItem( "username", "marble" );
90  geonamesUrl.setQuery( urlQuery );
91 #endif
92  emit downloadDescriptionFileRequested( geonamesUrl );
93  }
94 }
95 
96 void GeoNamesWeatherService::parseFile( const QByteArray& file )
97 {
98  QScriptValue data;
99  QScriptEngine engine;
100 
101  // Qt requires parentheses around json code
102  data = engine.evaluate( '(' + QString( file ) + ')' );
103 
104  // Parse if any result exists
105  QList<AbstractDataPluginItem*> items;
106  if ( data.property( "weatherObservations" ).isArray() ) {
107  QScriptValueIterator iterator( data.property( "weatherObservations" ) );
108  // Add items to the list
109  while ( iterator.hasNext() ) {
110  iterator.next();
111  AbstractDataPluginItem* item = parse( iterator.value() );
112  if ( item ) {
113  items << item;
114  }
115  }
116  } else {
117  AbstractDataPluginItem* item = parse( data.property( "weatherObservation" ) );
118  if ( item ) {
119  items << item;
120  }
121  }
122 
123  emit createdItems( items );
124 }
125 
126 AbstractDataPluginItem *GeoNamesWeatherService::parse( const QScriptValue &value )
127 {
128  QString condition = value.property( "weatherCondition" ).toString();
129  QString clouds = value.property( "clouds" ).toString();
130  int windDirection = value.property( "windDirection" ).toInteger();
131  QString id = value.property( "ICAO" ).toString();
132  int temperature = value.property( "temperature" ).toInteger();
133  int windSpeed = value.property( "windSpeed" ).toInteger();
134  int humidity = value.property( "humidity" ).toInteger();
135  double pressure = value.property( "seaLevelPressure" ).toNumber();
136  QString name = value.property( "stationName" ).toString();
137  QDateTime date = QDateTime::fromString(
138  value.property( "datetime" ).toString(), "yyyy-MM-dd hh:mm:ss" );
139  double longitude = value.property( "lng" ).toNumber();
140  double latitude = value.property( "lat" ).toNumber();
141 
142  if ( !id.isEmpty() ) {
143  WeatherData data;
144 
145  // Weather condition
146  if ( clouds != "n/a" && condition != "n/a" ) {
147  if ( dayConditions.contains( condition ) ) {
148  data.setCondition( dayConditions[condition] );
149  } else {
150  mDebug() << "UNHANDLED GEONAMES WEATHER CONDITION, PLEASE REPORT: " << condition;
151  }
152  } else {
153  if ( dayConditions.contains( clouds ) ) {
154  data.setCondition( dayConditions[clouds] );
155  } else {
156  mDebug() << "UNHANDLED GEONAMES CLOUDS CONDITION, PLEASE REPORT: " << clouds;
157  }
158  }
159 
160  // Wind direction. Finds the closest direction from windDirections array.
161  if ( windDirection >= 0 ) {
162  double tickSpacing = 360.0 / windDirections.size();
163  data.setWindDirection( windDirections[int(( windDirection / tickSpacing ) + 0.5)
164  % windDirections.size()] );
165  }
166 
167  // Wind speed
168  if ( windSpeed != 0 ) {
169  data.setWindSpeed( windSpeed, WeatherData::knots );
170  }
171 
172  // Temperature
173  data.setTemperature( temperature, WeatherData::Celsius );
174 
175  // Humidity
176  data.setHumidity( humidity );
177 
178  // Pressure
179  if ( pressure != 0.0 ) {
180  data.setPressure( pressure, WeatherData::HectoPascal );
181  }
182 
183  // Date
184  data.setDataDate( date.date() );
185  data.setPublishingTime( date );
186 
187  // ID
188  id = "geonames_" + id;
189 
190  GeoDataCoordinates coordinates( longitude, latitude, 0.0, GeoDataCoordinates::Degree );
191  GeoNamesWeatherItem *item = new GeoNamesWeatherItem( this );
192  item->setMarbleWidget( marbleWidget() );
193  item->setId( id );
194  item->setCoordinate( coordinates );
195  item->setTarget( "earth" );
196  item->setPriority( 0 );
197  item->setStationName( name );
198  item->setCurrentWeather( data );
199  return item;
200  } else {
201  return 0;
202  }
203 }
204 
205 void GeoNamesWeatherService::setupHashes()
206 {
207  if( !( ( dayConditions.isEmpty() )
208  || ( windDirections.isEmpty() ) ) )
209  {
210  return;
211  }
212 
213  dayConditions["sunny"] = WeatherData::ClearDay;
214  dayConditions["clear"] = WeatherData::ClearDay;
215  dayConditions["clear sky"] = WeatherData::ClearDay;
216  dayConditions["sunny intervals"] = WeatherData::FewCloudsDay;
217  dayConditions["few clouds"] = WeatherData::FewCloudsDay;
218  dayConditions["scattered clouds"] = WeatherData::FewCloudsDay;
219  dayConditions["partly cloudy"] = WeatherData::PartlyCloudyDay;
220  dayConditions["broken clouds"] = WeatherData::PartlyCloudyDay;
221  dayConditions["white cloud"] = WeatherData::Overcast;
222  dayConditions["overcast"] = WeatherData::Overcast;
223  dayConditions["grey cloud"] = WeatherData::Overcast;
224  dayConditions["cloudy"] = WeatherData::Overcast;
225  dayConditions["drizzle"] = WeatherData::LightRain;
226  dayConditions["light drizzle"] = WeatherData::LightRain;
227  dayConditions["misty"] = WeatherData::Mist;
228  dayConditions["mist"] = WeatherData::Mist;
229  dayConditions["fog"] = WeatherData::Mist;
230  dayConditions["foggy"] = WeatherData::Mist;
231  dayConditions["dense fog"] = WeatherData::Mist;
232  dayConditions["Thick Fog"] = WeatherData::Mist;
233  dayConditions["tropical storm"] = WeatherData::Thunderstorm;
234  dayConditions["thunderstorm"] = WeatherData::Thunderstorm;
235  dayConditions["hazy"] = WeatherData::Mist;
236  dayConditions["haze"] = WeatherData::Mist;
237  dayConditions["in vicinity: showers "] = WeatherData::ShowersDay;
238  dayConditions["light shower"] = WeatherData::LightShowersDay;
239  dayConditions["light rain shower"] = WeatherData::LightShowersDay;
240  dayConditions["light showers"] = WeatherData::LightShowersDay;
241  dayConditions["light rain"] = WeatherData::ShowersDay;
242  dayConditions["heavy rain"] = WeatherData::Rain;
243  dayConditions["heavy showers"] = WeatherData::Rain;
244  dayConditions["heavy shower"] = WeatherData::Rain;
245  dayConditions["heavy rain shower"] = WeatherData::Rain;
246  dayConditions["thundery shower"] = WeatherData::Thunderstorm;
247  dayConditions["thunderstorm"] = WeatherData::Thunderstorm;
248  dayConditions["thunder storm"] = WeatherData::Thunderstorm;
249  dayConditions["cloudy with sleet"] = WeatherData::RainSnow;
250  dayConditions["sleet shower"] = WeatherData::RainSnow;
251  dayConditions["sleet showers"] = WeatherData::RainSnow;
252  dayConditions["sleet"] = WeatherData::RainSnow;
253  dayConditions["cloudy with hail"] = WeatherData::Hail;
254  dayConditions["hail shower"] = WeatherData::Hail;
255  dayConditions["hail showers"] = WeatherData::Hail;
256  dayConditions["hail"] = WeatherData::Hail;
257  dayConditions["light snow"] = WeatherData::LightSnow;
258  dayConditions["light snow shower"] = WeatherData::ChanceSnowDay;
259  dayConditions["light snow showers"] = WeatherData::ChanceSnowDay;
260  dayConditions["cloudy with light snow"] = WeatherData::LightSnow;
261  dayConditions["heavy snow"] = WeatherData::Snow;
262  dayConditions["heavy snow shower"] = WeatherData::Snow;
263  dayConditions["heavy snow showers"] = WeatherData::Snow;
264  dayConditions["cloudy with heavy snow"] = WeatherData::Snow;
265  dayConditions["sandstorm"] = WeatherData::SandStorm;
266  dayConditions["na"] = WeatherData::ConditionNotAvailable;
267  dayConditions["n/a"] = WeatherData::ConditionNotAvailable;
268 
269  windDirections[0] = WeatherData::N;
270  windDirections[1] = WeatherData::NNE;
271  windDirections[2] = WeatherData::NE;
272  windDirections[3] = WeatherData::ENE;
273  windDirections[4] = WeatherData::E;
274  windDirections[5] = WeatherData::ESE;
275  windDirections[6] = WeatherData::SE;
276  windDirections[7] = WeatherData::SSE;
277  windDirections[8] = WeatherData::S;
278  windDirections[9] = WeatherData::SSW;
279  windDirections[10] = WeatherData::SW;
280  windDirections[11] = WeatherData::WSW;
281  windDirections[12] = WeatherData::W;
282  windDirections[13] = WeatherData::WNW;
283  windDirections[14] = WeatherData::NW;
284  windDirections[15] = WeatherData::NNW;
285 }
286 
287 #include "GeoNamesWeatherService.moc"
Marble::WeatherData::Rain
Definition: WeatherData.h:46
Marble::WeatherData::NW
Definition: WeatherData.h:75
Marble::GeoNamesWeatherService::~GeoNamesWeatherService
~GeoNamesWeatherService()
Definition: GeoNamesWeatherService.cpp:42
Marble::AbstractDataPluginItem::setTarget
void setTarget(const QString &target)
Definition: AbstractDataPluginItem.cpp:66
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::WeatherData::setCondition
void setCondition(WeatherData::WeatherCondition condition)
Definition: WeatherData.cpp:348
Marble::GeoNamesWeatherItem
Definition: GeoNamesWeatherItem.h:19
QScriptValueIterator::next
void next()
Marble::WeatherData::Hail
Definition: WeatherData.h:51
QUrl::setQuery
void setQuery(const QString &txt)
Marble::WeatherData::setPressure
void setPressure(qreal pressure, WeatherData::PressureUnit format=WeatherData::HectoPascal)
Definition: WeatherData.cpp:721
QByteArray
Marble::AbstractDataPluginItem
Definition: AbstractDataPluginItem.h:28
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::AbstractDataPluginItem::setId
void setId(const QString &id)
Definition: AbstractDataPluginItem.cpp:86
Marble::WeatherData::SW
Definition: WeatherData.h:79
QScriptValue
Marble::WeatherData::LightShowersDay
Definition: WeatherData.h:41
QScriptEngine::evaluate
QScriptValue evaluate(const QString &program, const QString &fileName, int lineNumber)
Marble::WeatherData::ConditionNotAvailable
Definition: WeatherData.h:32
Marble::AbstractWeatherService
Definition: AbstractWeatherService.h:27
QScriptValueIterator
MarbleDebug.h
QScriptValue::toString
QString toString() const
Marble::GeoDataCoordinates::Degree
Definition: GeoDataCoordinates.h:66
Marble::WeatherData::Mist
Definition: WeatherData.h:57
Marble::WeatherData::WNW
Definition: WeatherData.h:76
Marble::WeatherData
Definition: WeatherData.h:26
Marble::GeoDataLatLonBox::north
qreal north(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
Get the northern boundary of the bounding box.
Definition: GeoDataLatLonBox.cpp:93
Marble::AbstractWeatherService::marbleModel
const MarbleModel * marbleModel() const
Definition: AbstractWeatherService.cpp:34
QScriptEngine
QObject::name
const char * name() const
Marble::GeoDataLatLonBox::east
qreal east(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
Get the eastern boundary of the bounding box.
Definition: GeoDataLatLonBox.cpp:135
QString::number
QString number(int n, int base)
Marble::WeatherData::setWindSpeed
void setWindSpeed(qreal speed, WeatherData::SpeedUnit format=WeatherData::mps)
Definition: WeatherData.cpp:536
Marble::WeatherData::LightRain
Definition: WeatherData.h:45
QHash
Marble::WeatherItem::setStationName
void setStationName(const QString &name)
Definition: WeatherItem.cpp:384
Marble::WeatherData::SSW
Definition: WeatherData.h:78
QObject
Marble::WeatherData::setDataDate
void setDataDate(const QDate &date)
Set the date the data is meant for.
Definition: WeatherData.cpp:332
Marble::GeoNamesWeatherService::getItem
void getItem(const QString &id)
Definition: GeoNamesWeatherService.cpp:75
Marble::WeatherData::ClearDay
Definition: WeatherData.h:33
Marble::WeatherItem::setPriority
void setPriority(quint8 priority)
Definition: WeatherItem.cpp:460
Marble::WeatherData::NE
Definition: WeatherData.h:67
Marble::AbstractWeatherService::createdItems
void createdItems(QList< AbstractDataPluginItem * > items)
Marble::WeatherData::Celsius
Definition: WeatherData.h:110
Marble::WeatherData::Overcast
Definition: WeatherData.h:39
QString
QList< AbstractDataPluginItem * >
QScriptValue::property
QScriptValue property(const QString &name, const ResolveFlags &mode) const
Marble::WeatherData::SandStorm
Definition: WeatherData.h:58
Marble::WeatherData::W
Definition: WeatherData.h:77
Marble::WeatherData::N
Definition: WeatherData.h:65
QUrl
Marble::WeatherData::ChanceSnowDay
Definition: WeatherData.h:52
QDateTime::fromString
QDateTime fromString(const QString &string, Qt::DateFormat format)
Marble::WeatherData::HectoPascal
Definition: WeatherData.h:116
Marble::WeatherData::WSW
Definition: WeatherData.h:80
GeoNamesWeatherItem.h
Marble::WeatherData::setTemperature
void setTemperature(qreal temp, WeatherData::TemperatureUnit format=WeatherData::Kelvin)
Definition: WeatherData.cpp:621
Marble::GeoDataLatLonBox::west
qreal west(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
Get the western boundary of the bounding box.
Definition: GeoDataLatLonBox.cpp:156
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:97
Marble::AbstractWeatherService::marbleWidget
MarbleWidget * marbleWidget()
Definition: AbstractWeatherService.cpp:39
Marble::WeatherData::Thunderstorm
Definition: WeatherData.h:50
QDateTime::date
QDate date() const
QVector
Marble::WeatherData::ENE
Definition: WeatherData.h:68
QLatin1String
Marble::WeatherData::PartlyCloudyDay
Definition: WeatherData.h:37
GeoDataLatLonAltBox.h
Marble::GeoDataLatLonBox::south
qreal south(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
Get the southern boundary of the bounding box.
Definition: GeoDataLatLonBox.cpp:114
Marble::WeatherData::SSE
Definition: WeatherData.h:70
Marble::GeoNamesWeatherService::parseFile
void parseFile(const QByteArray &file)
Definition: GeoNamesWeatherService.cpp:96
Marble::WeatherData::setHumidity
void setHumidity(qreal humidity)
Definition: WeatherData.cpp:810
QScriptValue::toInteger
qsreal toInteger() const
Marble::WeatherData::SE
Definition: WeatherData.h:71
Marble::AbstractWeatherService::downloadDescriptionFileRequested
void downloadDescriptionFileRequested(const QUrl &)
QUrl::addQueryItem
void addQueryItem(const QString &key, const QString &value)
Marble::WeatherItem::setMarbleWidget
void setMarbleWidget(MarbleWidget *widget)
Definition: WeatherItem.cpp:478
GeoNamesWeatherService.h
Marble::WeatherData::Snow
Definition: WeatherData.h:55
Marble::WeatherData::LightSnow
Definition: WeatherData.h:54
Marble::WeatherData::S
Definition: WeatherData.h:73
Marble::WeatherData::RainSnow
Definition: WeatherData.h:56
Marble::BillboardGraphicsItem::setCoordinate
void setCoordinate(const GeoDataCoordinates &coordinates)
Definition: BillboardGraphicsItem.cpp:98
Marble::WeatherData::ESE
Definition: WeatherData.h:72
Marble::WeatherData::setPublishingTime
void setPublishingTime(const QDateTime &dateTime)
Set the time when the data was published.
Definition: WeatherData.cpp:316
Marble::GeoNamesWeatherService::getAdditionalItems
void getAdditionalItems(const GeoDataLatLonAltBox &box, qint32 number=10)
Definition: GeoNamesWeatherService.cpp:46
Marble::WeatherData::ShowersDay
Definition: WeatherData.h:43
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
WeatherData.h
QScriptValue::isArray
bool isArray() const
Marble::GeoDataLatLonAltBox
A class that defines a 3D bounding box for geographic data.
Definition: GeoDataLatLonAltBox.h:49
Marble::WeatherData::knots
Definition: WeatherData.h:105
Marble::GeoNamesWeatherService::GeoNamesWeatherService
GeoNamesWeatherService(const MarbleModel *model, QObject *parent)
Definition: GeoNamesWeatherService.cpp:36
Marble::WeatherData::NNE
Definition: WeatherData.h:66
Marble::WeatherData::NNW
Definition: WeatherData.h:74
QDateTime
Marble::WeatherData::FewCloudsDay
Definition: WeatherData.h:35
Marble::WeatherData::setWindDirection
void setWindDirection(WeatherData::WindDirection direction)
Definition: WeatherData.cpp:437
Marble::WeatherItem::setCurrentWeather
void setCurrentWeather(const WeatherData &weather)
Definition: WeatherItem.cpp:400
QScriptValue::toNumber
qsreal toNumber() const
Marble::WeatherData::E
Definition: WeatherData.h:69
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:39 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal