Hi Tom,

you're right, the addGeoDataFile() method is a convenience method doing several things at once:
- load the file in some thread in the background
- when the data is extracted successfully, show it
- center the view on the bounding area of the data

Since you'd rather have synchronous loading and specify the map center and zoom values on your own, it's better to use different API methods for parsing the file and showing it: ParsingRunnerManager to load and GeoDataTreeModel for rendering. The modified example below does that.

Regards,
Dennis

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

#include <QtGui/QApplication>

#include <iostream>

using namespace Marble;

int main(int argc, char** argv)
{
    if (argc < 2)
    {
std::cerr << "Usage: " << argv[0] << " file.kml|file.kmz" << std::endl;
      return 0;
    }

    QApplication app(argc, argv);
    MarbleWidget *mapWidget = new MarbleWidget;

    // Open KML document
    ParsingRunnerManager parser(mapWidget->model()->pluginManager());
    GeoDataDocument* document = parser.openFile(argv[1]);
    if (!document)
    {
      std::cerr << "Failed to open " << argv[1] << std::endl;
      return 1;
    }

    // Have Marble render the KML document
    mapWidget->model()->treeModel()->addDocument(document);

    mapWidget->resize(800,600);
    mapWidget->setWindowTitle("DXCC Map");
    mapWidget->setMapThemeId("earth/bluemarble/bluemarble.dgml");
    mapWidget->setZoom(1100);
GeoDataCoordinates const position(8.545486, 53.106076, 0.0, GeoDataCoordinates::Degree);
    mapWidget->centerOn(position);
    mapWidget->show();
    return app.exec();
}

Am 27.09.2014 15:51, schrieb Thomas 'Tom' Malkus:
Hi,

I have found a solution. Could it been, that the view is reseted after
loading the KML data and the data is loading as a own thread in the
background?

If I add a delay of 1 second before calling show() the view is correct
zoomed and positioned.

Is there a possibilty to get a message, if the KML data is complete loaded?

#include <QtGui/QApplication>
#include <QtCore/QFileInfo>
#include <QtCore/QDebug>
#include <marble/MarbleWidget.h>
#include <marble/GeoDataDocument.h>
#include <marble/GeoDataTreeModel.h>
#include <marble/MarbleModel.h>

using namespace Marble;

void delay()
{
    QTime dieTime= QTime::currentTime().addSecs(1);
    while( QTime::currentTime() < dieTime )
    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

int main(int argc, char** argv)
{
    QApplication app(argc,argv);
    MarbleWidget *mapWidget = new MarbleWidget();

    mapWidget->resize(800,600);
    mapWidget->setWindowTitle("CQRLOG DXCC Map");
    mapWidget->setMapThemeId("earth/bluemarble/bluemarble.dgml");

mapWidget->model()->addGeoDataFile("/home/tom/projects/Qt/dxcc/dxcc.kml");


    delay();

    mapWidget->setZoom(1200);
    GeoDataCoordinates
position(8.545486,53.106076,0.0,GeoDataCoordinates::Degree);
    mapWidget->centerOn(position);

    mapWidget->show();
    return app.exec();
}

Thanks,
Tom
_______________________________________________
Marble-devel mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/marble-devel

Reply via email to