Hatred's Log Place

DON'T PANIC!

Oct 18, 2011 - 3 minute read - linux туризм maps programming

QLandkarteGT: Экспорт всей карты в растр, а не только видимой области

В QLandkarteGT есть удобная вещь - экспорт видимой области карты со всеми отображаемыми точками, треками, измерениями и т.п. в растровый (PNG) файл.

Мне же потребовалось, что бы вся карта как есть была экспортирована. Пришлось полезть в исходники. Прямого пути сделать такое не нашлось, пришлось сделать несколько костыльно (имхо), но работоспособно (ибо нужно срочно - готовить карту к предстоящим соревнованиям).

Патч подкатом.

```diff Index: src/CMainWindow.cpp

— src/CMainWindow.cpp (revision 3010) @@ -17,6 +17,8 @@

**********************************************************************************************/

+#include + #include “CMainWindow.h” #include “CMegaMenu.h” #include “CCanvas.h” @@ -557,6 +559,7 @@ menu->addSeparator(); menu->addAction(QIcon(":/icons/iconScreenshot16x16.png”),tr(“Device Screenshot …"),this,SLOT(slotScreenshot())); menu->addAction(QIcon(":/icons/iconRaster16x16.png”),tr(“Save map as image …"),this,SLOT(slotSaveImage()));

  • menu->addAction(QIcon(":/icons/iconRaster16x16.png”),tr(“Save full map as image …"),this,SLOT(slotSaveImageFull())); menu->addAction(QIcon(":/icons/iconPrint16x16.png”),tr(“Print Map …"),this,SLOT(slotPrint()), Qt::CTRL + Qt::Key_P); //menu->addAction(QIcon(":/icons/iconPrint16x16.png”),tr(“Print Diary …"),this,SLOT(slotPrintPreview())); menu->addSeparator(); @@ -1222,7 +1225,19 @@

void CMainWindow::slotSaveImage() {

  • saveImage(false); +}

+void CMainWindow::slotSaveImageFull() +{

  • saveImage(true); +}

+void CMainWindow::saveImage(bool isFullImage) +{ + QSettings cfg; QString pathData = cfg.value(“path/data”,"./").toString(); QString filter = cfg.value(“canvas/imagetype”,“Bitmap (*.png)").toString(); @@ -1247,13 +1262,87 @@

 if(map3d)
 {
  1.    map3d->slotSaveImage(filename);
    
  •    if (isFullImage == false)
    
  •    {
    
  •        map3d->slotSaveImage(filename);
    
  •    }
    
  •    else
    
  •    {
    
  •        QMessageBox::warning(this, tr("Map export"), tr("Export for full 3D Map is not implemented yet."));
    
  •    }
    
    } else #endif {
  1.    QImage img(canvas->size(), QImage::Format_ARGB32);
    
  2.    canvas->print(img);
    
  •    QImage img;
    
  •    if (isFullImage == false)
    
  •    {
    
  •        img = QImage(canvas->size(), QImage::Format_ARGB32);
    
  •        canvas->print(img);
    
  •    }
    
  •    else
    
  •    {
    
  •        IMap& map = CMapDB::self().getMap();
    
  •        // Get map dimensions
    
  •        double lon1, lat1, lon2, lat2;
    
  •        map.dimensions(lon1, lat1, lon2, lat2);
    
  •        // Convert dimensions to pixel coordinates
    
  •        double x1 = lon1, y1 = lat1, x2 = lon2, y2 = lat2;
    
  •        map.convertRad2Pt(x1, y1);
    
  •        map.convertRad2Pt(x2, y2);
    
  •        // Create Rect
    
  •        QRectF mapRectF(QPointF(x1, y1), QPointF(x2, y2));
    
  •        QRect  mapRect(QPoint(round(x1), round(y1)), QPoint(round(x2), round(y2)));
    
  •        qDebug() << "Dimensions: " << lon1 * RAD_TO_DEG << lat1 * RAD_TO_DEG << lon2 * RAD_TO_DEG << lat2 * RAD_TO_DEG;
    
  •        qDebug() << "Pixel sizes: " << x1 << y1 << x2 << y2;
    
  •        qDebug() << "Width: " << mapRectF.width() << "Height: " << mapRectF.height();
    
  •        qDebug() << "Viewport size: " << map.getSize();
    
  •        QPainter p;
    
  •        QRect imageRect(mapRect);
    
  •        img = QImage(mapRect.size(), QImage::Format_ARGB32);
    
  •        p.begin(&img);
    
  •        p.fillRect(imageRect, QBrush(Qt::transparent));
    
  •        // hack with full area-draw
    
  •        QSize oldSize = map.getSize();          // store viewport size
    
  •        qint32 zoomLevel = map.getZoomLevel();  // store zoom level
    
  •        // store local center point:
    
  •        double  xc = oldSize.width() / 2.0,
    
  •                yc = oldSize.height() / 2.0;
    
  •        // convert it to global coordinates
    
  •        map.convertPt2Rad(xc, yc);
    
  •        // Resize viewport to full map size and zoom map to it
    
  •        // TODO: use current zoom level for new map viewport
    
  •        map.resize(mapRect.size());
    
  •        map.zoom(lon1, lat1, lon2, lat2);
    
  •        // Draw map and all geodata
    
  •        bool needsRedraw = true;
    
  •        CMapDB::self().draw(p, imageRect, needsRedraw);
    
  •        CRouteDB::self().draw(p, imageRect, needsRedraw);
    
  •        CTrackDB::self().draw(p, imageRect, needsRedraw);
    
  •        COverlayDB::self().draw(p, imageRect, needsRedraw);
    
  •        CLiveLogDB::self().draw(p, imageRect, needsRedraw);
    
  •        CWptDB::self().draw(p, imageRect, needsRedraw);
    
  •        CSearchDB::self().draw(p, imageRect, needsRedraw);
    
  •        p.end();
    
  •        // set view port size, zoom level and center point back
    
  •        map.resize(oldSize);
    
  •        map.zoom(zoomLevel);
    
  •        map.convertRad2Pt(xc, yc);
    
  •        map.move(QPoint(xc, yc), QPoint(oldSize.width()/2.0, oldSize.height()/2.0));
    
  •    }
    
  •    img.save(filename);
    
    } pathData = fi.absolutePath(); Index: src/CMainWindow.h =================================================================== — src/CMainWindow.h (revision 3010) @@ -88,6 +88,7 @@ void slotSaveData(); void slotExportData(); void slotSaveImage();
  •    void slotSaveImageFull();
       void slotPrint();
       void slotModified();
       void slotDataChanged();
    

@@ -118,6 +119,8 @@ bool isGPSBabel(); QString getGeoDataFormats();

  •    void saveImage(bool isFullImage = false);
    
  •    QMenu *setupMenu;
       QMenu *groupProvidedMenu;
       /// horizontal main splitter holding the canvas and the tool view
    

В результате в меню File добавится новый пункт: "Save full map as image ..."

**UPD:** Оливер (автор программы) объявил QLGT deprecated и сейчас активно пилит замену - [QMapShack](/blog/2016/02/11/qmapshack/). Так вот, там описанный функционал реализован куда более адекватно и функционально. Рекомендую!