Marble/MarbleMarbleWidget

    From KDE TechBase
    Revision as of 20:51, 5 July 2010 by Tackat (talk | contribs)
    The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


    Editing Projects/Marble/MarbleCPlusPlus

    MarbleWidget: Changing basic map properties
    Tutorial Series   Marble C++ Tutorial
    Previous   C++, Qt
    What's Next   Tutorial 3 - Marble's GeoPainter
    Further Reading   n/a


    Creating a weather map

    Now we want to modify the map:

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

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

    By default Marble shows a few info boxes: Overview Map, Compass and ScaleBar. Due to the limited size we want to shrink the compass. We turn the Overview Map and the ScaleBar off. In the source code the class AbstractFloatItem is used to display Info Boxes:

    1. include <QtGui/QApplication>
    1. include <marble/global.h>
    2. include <marble/MarbleWidget.h>
    3. 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 OpenStreetMap 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 my_marble.cpp and compile it:

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

    If things go fine, execute ./my_marble and you end up with a fully usable OpenStreetMap application:

    Here's a little checklist to tackle some problems that might arise when compiling the code above:

    • You need Qt and Marble development packages (or comparable SVN installations)
    • If Qt headers are not installed in /usr/include/qt4 on your system, change the path in the g++ call above accordingly.
    • Likewise, add -I /path/to/marble/headers if they're not to be found in /usr/include