Skip to content

Marble C++ Tutorial Part 2

Saturday, 14 August 2010  |  torsten rahn

Marble 0.10.0 has been released as a major update last week together with KDE SC 4.5. As a user you might be interested in our Visual ChangeLog which is also available in spanish over at muylinux.com.

But Marble is also a library. So it can be used as a widget in other applications. Today I'd like to show you how.

In our previous tutorial I already introduced you to the very first steps of Qt Programming and Marble Programming. Now the last few Summer days in Germany have been rather rainy. So in the second part of our tutorial I'd like to show you how to create a weather map!

Creating a weather map


We'd like to display a small weather map. So we need to modify the map defaults of MarbleWidget. And we need to turn on the satellite view, enable the clouds and enable the country border lines.

Again MarbleWidget provides a convenient way to make these changes to the overall look and feel of the map.

By default Marble shows a few info boxes: Overview Map, Compass and ScaleBar. But the size for the widget is very limited. Therefore we want to shrink the compass. And we want to get rid of all the clutter, so we turn off the Overview Map and the ScaleBar. In the source code the class AbstractFloatItem is used to display all kinds of Info Boxes. All the Info Boxes are derived from the AbstractFloatItem class. Now we get a list of all the float items that are known to MarbleWidget and we go through it. Once we reach the float item which has got the name id compass we make all the changes we want to it (this has been simplified in Marble pre-0.11.0 where you will be able to access AbstractFloatItems directly via their nameId):

#include

#include <marble/global.h> #include <marble/MarbleWidget.h> #include <marble/AbstractFloatItem.h>

using namespace Marble;

int main(int argc, char** argv) { QApplication app(argc,argv);

// Create a Marble QWidget without a parent
MarbleWidget *mapWidget = new MarbleWidget();

// Load the Satellite View map
mapWidget->setMapThemeId("earth/bluemarble/bluemarble.dgml");

mapWidget->setProjection( Mercator ); 

// Enable the cloud cover and enable the country borders
mapWidget->setShowClouds( true );
mapWidget->setShowBorders( true );

// Hide the FloatItems: Compass and StatusBar
mapWidget->setShowOverviewMap(false);
mapWidget->setShowScaleBar(false);

foreach ( AbstractFloatItem * floatItem, mapWidget->floatItems() )
    if ( floatItem && floatItem->nameId() == "compass" ) {
        
        // Put the compass onto the left hand side
        floatItem->setPosition( QPoint( 10, 10 ) );
        // Make the content size of the compass smaller
        floatItem->setContentSize( QSize( 50, 50 ) );
    }

mapWidget->resize( 400, 300 );
mapWidget->show();

return app.exec();

}


Save the code above as marble_weather.cpp and compile it:

g++ -I /usr/include/qt4/ -o marble_weather marble_weather.cpp -lmarblewidget -lQtGui


Instead of calling the compiler directly you can also create a qmake project file:

TEMPLATE = app TARGET = marble_weather DEPENDPATH += . INCLUDEPATH += . SOURCES += marble_weather.cpp LIBS += -lmarblewidget


Store it as marble_weather.pro in the same directory and call

qmake marble_weather.pro make


If things go fine, execute ./marble_weather and you end up with a map application that displays clouds on top of a flat map:


That's all for today. In our third chapter we'll show how to load KML and GPX files into Marble. So stay tuned. If you need help join us on our mailing list marble-devel@kde.org or on #marble (IRC on Freenode). If you want to obtain the latest Marble source code have a look at Marble's website.

If you are interested in more news about Marble then join us and feel welcome in our Marble Facebook Group!