Hatred's Log Place

DON'T PANIC!

Oct 18, 2011 - 3 minute read - Comments - 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);
  2. if (isFullImage == false)
  3. {
  4. map3d->slotSaveImage(filename);
  5. }
  6. else
  7. {
  8. QMessageBox::warning(this, tr(“Map export”), tr(“Export for full 3D Map is not implemented yet.”));
  9. } } else #endif {
  10. QImage img(canvas->size(), QImage::Format_ARGB32);
  11. canvas->print(img);
  12. QImage img;
  13. if (isFullImage == false)
  14. {
  15. img = QImage(canvas->size(), QImage::Format_ARGB32);
  16. canvas->print(img);
  17. }
  18. else
  19. {
  20. IMap& map = CMapDB::self().getMap(); +
  21. // Get map dimensions
  22. double lon1, lat1, lon2, lat2;
  23. map.dimensions(lon1, lat1, lon2, lat2); +
  24. // Convert dimensions to pixel coordinates
  25. double x1 = lon1, y1 = lat1, x2 = lon2, y2 = lat2;
  26. map.convertRad2Pt(x1, y1);
  27. map.convertRad2Pt(x2, y2); +
  28. // Create Rect
  29. QRectF mapRectF(QPointF(x1, y1), QPointF(x2, y2));
  30. QRect mapRect(QPoint(round(x1), round(y1)), QPoint(round(x2), round(y2))); +
  31. qDebug() << “Dimensions: “ << lon1 * RAD_TO_DEG << lat1 * RAD_TO_DEG << lon2 * RAD_TO_DEG << lat2 * RAD_TO_DEG;
  32. qDebug() << “Pixel sizes: “ << x1 << y1 << x2 << y2;
  33. qDebug() << “Width: “ << mapRectF.width() << “Height: “ << mapRectF.height();
  34. qDebug() << “Viewport size: “ << map.getSize(); +
  35. QPainter p; +
  36. QRect imageRect(mapRect);
  37. img = QImage(mapRect.size(), QImage::Format_ARGB32); +
  38. p.begin(&img);
  39. p.fillRect(imageRect, QBrush(Qt::transparent)); +
  40. // hack with full area-draw
  41. QSize oldSize = map.getSize(); // store viewport size
  42. qint32 zoomLevel = map.getZoomLevel(); // store zoom level
  43. // store local center point:
  44. double xc = oldSize.width() / 2.0,
  45. yc = oldSize.height() / 2.0;
  46. // convert it to global coordinates
  47. map.convertPt2Rad(xc, yc); +
  48. // Resize viewport to full map size and zoom map to it
  49. // TODO: use current zoom level for new map viewport
  50. map.resize(mapRect.size());
  51. map.zoom(lon1, lat1, lon2, lat2); +
  52. // Draw map and all geodata
  53. bool needsRedraw = true;
  54. CMapDB::self().draw(p, imageRect, needsRedraw);
  55. CRouteDB::self().draw(p, imageRect, needsRedraw);
  56. CTrackDB::self().draw(p, imageRect, needsRedraw);
  57. COverlayDB::self().draw(p, imageRect, needsRedraw);
  58. CLiveLogDB::self().draw(p, imageRect, needsRedraw);
  59. CWptDB::self().draw(p, imageRect, needsRedraw);
  60. CSearchDB::self().draw(p, imageRect, needsRedraw); +
  61. p.end(); +
  62. // set view port size, zoom level and center point back
  63. map.resize(oldSize);
  64. map.zoom(zoomLevel);
  65. map.convertRad2Pt(xc, yc);
  66. map.move(QPoint(xc, yc), QPoint(oldSize.width()/2.0, oldSize.height()/2.0));
  67. } + 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();
  68. 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. Так вот, там описанный функционал реализован куда более адекватно и функционально. Рекомендую!