Marble/DisplayGeoDataGroundOverlay: Difference between revisions

From KDE TechBase
No edit summary
 
(One intermediate revision by one other user not shown)
Line 101: Line 101:


[[Image:GroundOverlay.png]]
[[Image:GroundOverlay.png]]
The latest source code of this example can be found at [https://quickgit.kde.org/?p=marble.git&a=blob&f=examples%2Fcpp%2Foverlay-rendering%2Fmain.cpp main.cpp] and [https://quickgit.kde.org/?p=marble.git&a=blob&f=examples%2Fcpp%2Foverlay-rendering%2FCMakeLists.txt CMakeLists.txt].

Latest revision as of 21:01, 10 March 2016

Search
Tutorial Series   Marble C++ Tutorial
Previous   Tutorial 15 - Painting GeoDataLineString: Using the GeoPainter in order to paint a GeoDataLineString object
What's Next   n/a
Further Reading   n/a

In this tutorial, we'll show you how to display a ground overlay with its associated image over the Earth's surface in Marble.

GeoDataGroundOverlay is the class used in Marble to implement the features of the GroundOverlay KML element. More precisely, an instance references an icon that gets displayed on top of a certain area on the globe and a LatLonBox (GeoDataLatLonBox in Marble) describing its exact surface.

As in the tutorial for displaying placemarks, we will be using a GeoDataDocument as the the containter for our overlay. The document is afterwards exposed to Marble by having it added to the GeoDataTreeModel.

The implementation is actually pretty simple and you can have a look at it here:

#include <QDebug>
#include <QFileInfo>
#include <QApplication>
#include <QImage>

#include <marble/MarbleWidget.h>
#include <marble/GeoDataDocument.h>
#include <marble/GeoDataGroundOverlay.h>
#include <marble/GeoDataTreeModel.h>
#include <marble/MarbleModel.h>

using namespace Marble;

int main(int argc, char** argv) {

    QApplication app(argc,argv);

    QFileInfo inputFile( app.arguments().last() );
    if ( app.arguments().size() < 2 || !inputFile.exists() ) {
        qWarning() << "Usage: " << app.arguments().first() << "file.png";
        return 1;
    }

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

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

    // Create a bounding box from the given corner points
    GeoDataLatLonBox box( 55, 48, 14.5, 6, GeoDataCoordinates::Degree );
    box.setRotation( 0, GeoDataCoordinates::Degree );

    // Create an overlay and assign the image to render and its bounding box to it
    GeoDataGroundOverlay *overlay = new GeoDataGroundOverlay;
    overlay->setLatLonBox( box );
    overlay->setIcon( QImage( inputFile.absoluteFilePath() ) );

    // Create a document as a container for the overlay
    GeoDataDocument *document = new GeoDataDocument();
    document->append( overlay );

    // Add the document to MarbleWidget's tree model
    mapWidget->model()->treeModel()->addDocument( document );

    mapWidget->show();

    return app.exec();
}


Save the above code in a render.cpp file and make sure to create in the same folder a file name CMakeLists.txt looking as below:

CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
SET (TARGET render)
PROJECT (${TARGET})

FIND_PACKAGE (Qt4 4.6.0 REQUIRED QtCore QtGui)
FIND_PACKAGE (Marble REQUIRED)
INCLUDE (${QT_USE_FILE})
INCLUDE_DIRECTORIES (${MARBLE_INCLUDE_DIR})
SET (LIBS ${LIBS} ${MARBLE_LIBRARIES} ${QT_LIBRARIES})

ADD_EXECUTABLE (${TARGET} render.cpp)
TARGET_LINK_LIBRARIES (${TARGET} ${LIBS})


Assuming your Marble library is installed to ~/marble/export, you can run the following commands in the terminal to compile and run it:

cmake -DCMAKE_MODULE_PATH=~/marble/export/share/apps/cmake/modules \
      -DCMAKE_INCLUDE_PATH=~/marble/export/include \
      -DCMAKE_LIBRARY_PATH=~/marble/export/lib \
      .
make
./render your_image_file.png


If everything goes fine, you should be able to get a globe where your chosen image covers the approximate territory of Germany:

The latest source code of this example can be found at main.cpp and CMakeLists.txt.