В 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/). Так вот, там описанный функционал реализован куда более адекватно и функционально. Рекомендую!