Skip to content

Commit 37d826e

Browse files
committed
KmzGroundOverlayExport: New feature
Add export of KML/KMZ ground overlay files, based on MapPrinter's page drawing and GDAL's vsizip virtual file system. Other than our existing output variant (raster, PDF, printing), KML needs raster images oriented to true north. Formally, this is a "KML" export, with "KMZ" being a zipped variant. Following populer recognition and usage, we prefer labelling as "KMZ". Resolves GH-138 (KMZ export).
1 parent cd77562 commit 37d826e

File tree

9 files changed

+672
-17
lines changed

9 files changed

+672
-17
lines changed

src/core/map_printer.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,12 @@ const QPrinterInfo* MapPrinter::imageTarget()
391391
return &image_target;
392392
}
393393

394+
const QPrinterInfo* MapPrinter::kmzTarget()
395+
{
396+
static QPrinterInfo kmz_target; // TODO: set name and features?
397+
return &kmz_target;
398+
}
399+
394400

395401
// QPageSize (::key(), ::name()) made this list mostly obsolete.
396402
// But we keep it in v0.9 for loading maps where we used names
@@ -454,14 +460,17 @@ void MapPrinter::setTarget(const QPrinterInfo* new_target)
454460
target = new_target;
455461
else if (new_target == imageTarget())
456462
target = new_target;
463+
else if (new_target == kmzTarget())
464+
target = new_target;
457465
else
458466
{
459467
// We don't own this target, so we need to make a copy.
460468
target_copy = *new_target;
461469
target = &target_copy;
462470
}
463471

464-
if (old_target == imageTarget() || new_target == imageTarget())
472+
if (old_target == imageTarget() || new_target == imageTarget()
473+
|| old_target == kmzTarget() || new_target == kmzTarget())
465474
{
466475
// No page margins. Will emit pageFormatChanged( ).
467476
setCustomPageSize(page_format.page_rect.size());
@@ -536,7 +545,8 @@ bool MapPrinter::isPrinter() const
536545
{
537546
bool is_printer = target
538547
&& target != imageTarget()
539-
&& target != pdfTarget();
548+
&& target != pdfTarget()
549+
&& target != kmzTarget();
540550
return is_printer;
541551
}
542552

@@ -547,7 +557,7 @@ void MapPrinter::setPrintArea(const QRectF& area)
547557
{
548558
print_area = area;
549559

550-
if (target == imageTarget() && print_area.size() != page_format.paper_dimensions)
560+
if ((target == imageTarget() || target == kmzTarget()) && print_area.size() != page_format.paper_dimensions)
551561
setCustomPageSize(print_area.size() * scale_adjustment);
552562

553563
updatePageBreaks();
@@ -627,7 +637,7 @@ void MapPrinter::setOverlap(qreal h_overlap, qreal v_overlap)
627637

628638
void MapPrinter::updatePaperDimensions()
629639
{
630-
if (target == imageTarget() && page_format.page_size == QPageSize::Custom)
640+
if ((target == imageTarget() || target == kmzTarget()) && page_format.page_size == QPageSize::Custom)
631641
{
632642
// No margins, no need to query QPrinter.
633643
page_format.page_rect = QRectF(QPointF(0.0, 0.0), page_format.paper_dimensions);
@@ -639,7 +649,7 @@ void MapPrinter::updatePaperDimensions()
639649

640650
QPrinter* printer = target ? new QPrinter(*target, QPrinter::HighResolution)
641651
: new QPrinter(QPrinter::HighResolution);
642-
if (!printer->isValid() || target == imageTarget() || target == pdfTarget())
652+
if (!printer->isValid() || target == imageTarget() || target == kmzTarget() || target == pdfTarget())
643653
printer->setOutputFormat(QPrinter::PdfFormat);
644654

645655
if (page_format.page_size == QPageSize::Custom)
@@ -657,7 +667,7 @@ void MapPrinter::updatePaperDimensions()
657667
page_format.page_rect = printer->paperRect(QPrinter::Millimeter);
658668
page_format.paper_dimensions = page_format.page_rect.size();
659669

660-
if ( target != imageTarget() && target != pdfTarget() &&
670+
if ( target != imageTarget() && target != kmzTarget() && target != pdfTarget() &&
661671
page_format.page_size != QPageSize::Custom )
662672
{
663673
page_format.page_rect = printer->pageRect(QPrinter::Millimeter);
@@ -896,7 +906,7 @@ void MapPrinter::takePrinterSettings(const QPrinter* printer)
896906
if (!printer) return;
897907

898908
MapPrinterPageFormat f(*printer);
899-
if (target == pdfTarget() || target == imageTarget())
909+
if (target == pdfTarget() || target == imageTarget() || target == kmzTarget())
900910
{
901911
f.page_rect = QRectF(QPointF(0.0, 0.0), f.paper_dimensions);
902912
}
@@ -966,7 +976,7 @@ void MapPrinter::drawPage(QPainter* device_painter, const QRectF& page_extent, c
966976
* When the target is an image, use the temporary image to enforce the given
967977
* resolution.
968978
*/
969-
const bool use_buffer_for_map = rasterModeSelected() || target == imageTarget() || engineWillRasterize();
979+
const bool use_buffer_for_map = rasterModeSelected() || target == imageTarget() || target == kmzTarget() || engineWillRasterize();
970980
bool use_page_buffer = use_buffer_for_map;
971981

972982
auto first_front_template = map.getFirstFrontTemplate();
@@ -1234,7 +1244,7 @@ void MapPrinter::drawSeparationPages(QPrinter* printer, QPainter* device_painter
12341244

12351245
// Translate and clip for margins and print area
12361246
device_painter->translate(-page_extent.left(), -page_extent.top());
1237-
device_painter->setClipRect(page_extent.intersected(print_area), Qt::ReplaceClip);
1247+
device_painter->setClipRect(page_extent.intersected(print_area).adjusted(-10, 10, 10, 10), Qt::ReplaceClip);
12381248

12391249
bool need_new_page = false;
12401250
for (int i = map.getNumColors() - 1; i >= 0; --i)

src/core/map_printer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,9 @@ Q_OBJECT
229229
/** Returns a QPrinterInfo pointer which signals printing to a raster file. */
230230
static const QPrinterInfo* imageTarget();
231231

232+
/** Returns a QPrinterInfo pointer which signals printing to a KML ground overlay. */
233+
static const QPrinterInfo* kmzTarget();
234+
232235
/** Returns a reference to a hash which maps paper sizes to names as C strings.
233236
* These strings are not translated.
234237
*

src/gdal/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ set(MAPPER_GDAL_SOURCES
3434
gdal_manager.cpp
3535
gdal_settings_page.cpp
3636
gdal_template.cpp
37+
kmz_groundoverlay_export.cpp
3738
ogr_file_format.cpp
3839
ogr_template.cpp
3940
mapper-osmconf.ini

0 commit comments

Comments
 (0)