Инструменты пользователя

Инструменты сайта


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

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

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

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

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

qlandkarte-export-full-map-to-raster.diff
Index: src/CMainWindow.cpp
===================================================================
--- src/CMainWindow.cpp	(revision 3010)
+++ src/CMainWindow.cpp	(working copy)
@@ -17,6 +17,8 @@
 
 **********************************************************************************************/
 
+#include <QtDebug>
+
 #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)
     {
-        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
     {
-        QImage img(canvas->size(), QImage::Format_ARGB32);
-        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)
+++ src/CMainWindow.h	(working copy)
@@ -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. Так вот, там описанный функционал реализован куда более адекватно и функционально. Рекомендую!

Комментарии