В QLandkarteGT есть удобная вещь - экспорт видимой области карты со всеми отображаемыми точками, треками, измерениями и т.п. в растровый (PNG) файл.
Мне же потребовалось, что бы вся карта как есть была экспортирована. Пришлось полезть в исходники. Прямого пути сделать такое не нашлось, пришлось сделать несколько костыльно (имхо), но работоспособно (ибо нужно срочно - готовить карту к предстоящим соревнованиям).
Патч подкатом.
```diff
Index: src/CMainWindow.cpp
— src/CMainWindow.cpp (revision 3010) @@ -17,6 +17,8 @@
**********************************************************************************************/
+#include
- 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));
-
}
-
} pathData = fi.absolutePath(); Index: src/CMainWindow.h =================================================================== — src/CMainWindow.h (revision 3010) @@ -88,6 +88,7 @@ void slotSaveData(); void slotExportData(); void slotSaveImage();img.save(filename);
-
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/). Так вот, там описанный функционал реализован куда более адекватно и функционально. Рекомендую!