Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
183 changes: 74 additions & 109 deletions src/gdal/ogr_file_format.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016-2020 Kai Pastor
* Copyright 2016-2020, 2025 Kai Pastor
*
* This file is part of OpenOrienteering.
*
Expand Down Expand Up @@ -1972,137 +1972,102 @@ bool OgrFileExport::exportImplementation()

// Setup style table
populateStyleTable(symbols);

auto is_point_object = [](const Object* object) {
const auto* symbol = object->getSymbol();
return symbol && symbol->getContainedTypes() & Symbol::Point;
};

auto is_text_object = [](const Object* object) {
const auto* symbol = object->getSymbol();
return symbol && symbol->getContainedTypes() & Symbol::Text;
};

auto is_line_object = [](const Object* object) {
const auto* symbol = object->getSymbol();
return symbol && (symbol->getType() == Symbol::Line
|| (symbol->getType() == Symbol::Combined && !(symbol->getContainedTypes() & Symbol::Area)));
};

auto is_area_object = [](const Object* object) {
const auto* symbol = object->getSymbol();
return symbol && symbol->getContainedTypes() & Symbol::Area;
};


enum class ExportMode
{
SingleLayer,
LayerPerSymbol,
LayerPerType
} export_mode;

OGRLayerH layer = nullptr;

if (quirks & SingleLayer)
{
auto layer = createLayer("Layer", wkbUnknown);
export_mode = ExportMode::SingleLayer;
layer = createLayer("Layer", wkbUnknown);
if (layer == nullptr)
throw FileFormatException(tr("Failed to create layer: %2").arg(QString::fromLatin1(CPLGetLastErrorMsg())));

for (auto symbol : symbols)
{
auto match_symbol = [symbol](auto object) { return object->getSymbol() == symbol; };
switch (symbol->getType())
{
case Symbol::Point:
addPointsToLayer(layer, match_symbol);
break;
case Symbol::Text:
addTextToLayer(layer, match_symbol);
break;
case Symbol::Line:
addLinesToLayer(layer, match_symbol);
break;
case Symbol::Combined:
if (!(symbol->getContainedTypes() & Symbol::Area))
{
addLinesToLayer(layer, match_symbol);
break;
}
Q_FALLTHROUGH();
case Symbol::Area:
addAreasToLayer(layer, match_symbol);
break;
case Symbol::NoSymbol:
case Symbol::AllSymbols:
Q_UNREACHABLE();
}
}
}
else if (option(QString::fromLatin1("Per Symbol Layers")).toBool())
else
{
export_mode = option(QString::fromLatin1("Per Symbol Layers")).toBool() ? ExportMode::LayerPerSymbol : ExportMode::LayerPerType;
}

// Add points, lines, areas in this order for driver compatibility (esp GPX)
if (export_mode == ExportMode::LayerPerType)
{
layer = nullptr;
layer = createLayer(QString::fromLatin1("%1_points").arg(info.baseName()).toLatin1(), wkbPoint);
}
for (auto symbol : symbols)
{
// Add points, lines, areas in this order for driver compatibility (esp GPX)
for (auto symbol : symbols)
if (symbol->getType() == Symbol::Point)
{
if (symbol->getType() == Symbol::Point)
{
auto layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbPoint);
if (layer != nullptr)
addPointsToLayer(layer, [&symbol](const Object* object) {
const auto* sym = object->getSymbol();
return sym == symbol;
});
}
else if (symbol->getType() == Symbol::Text)
if (export_mode == ExportMode::LayerPerSymbol)
{
auto layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbPoint);
if (layer != nullptr)
addTextToLayer(layer, [&symbol](const Object* object) {
const auto* sym = object->getSymbol();
return sym == symbol;
});
layer = nullptr;
layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbPoint);
}
if (layer != nullptr)
addPointsToLayer(layer, [symbol](auto object) { return object->getSymbol() == symbol; });
}

// Line symbols
for (auto symbol : symbols)
}
for (auto symbol : symbols)
{
if (symbol->getType() == Symbol::Text)
{
if (symbol->getType() == Symbol::Line
|| (symbol->getType() == Symbol::Combined && !(symbol->getContainedTypes() & Symbol::Area)))
if (export_mode == ExportMode::LayerPerSymbol)
{
auto layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbLineString);
if (layer != nullptr)
addLinesToLayer(layer, [&symbol](const Object* object) {
const auto* sym = object->getSymbol();
return sym == symbol;
});
layer = nullptr;
layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbPoint);
}
if (layer != nullptr)
addTextToLayer(layer, [symbol](auto object) { return object->getSymbol() == symbol; });
}

// Area symbols
for (auto symbol : symbols)
}

// Line symbols
if (export_mode == ExportMode::LayerPerType)
{
layer = nullptr;
layer = createLayer(QString::fromLatin1("%1_lines").arg(info.baseName()).toLatin1(), wkbLineString);
}
for (auto symbol : symbols)
{
if (symbol->getType() == Symbol::Line
|| (symbol->getType() == Symbol::Combined && !(symbol->getContainedTypes() & Symbol::Area)))
{
if (symbol->getContainedTypes() & Symbol::Area)
if (export_mode == ExportMode::LayerPerSymbol)
{
auto layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbPolygon);
if (layer != nullptr)
addAreasToLayer(layer, [&symbol](const Object* object) {
const auto* sym = object->getSymbol();
return sym == symbol;
});
layer = nullptr;
layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbLineString);
}
if (layer != nullptr)
addLinesToLayer(layer, [symbol](auto object) { return object->getSymbol() == symbol; });
}
}
else

// Area symbols
if (export_mode == ExportMode::LayerPerType)
{
// Add points, lines, areas in this order for driver compatibility (esp GPX)
auto point_layer = createLayer(QString::fromLatin1("%1_points").arg(info.baseName()).toLatin1(), wkbPoint);
if (point_layer != nullptr)
layer = nullptr;
layer = createLayer(QString::fromLatin1("%1_areas").arg(info.baseName()).toLatin1(), wkbPolygon);
}
for (auto symbol : symbols)
{
if (symbol->getContainedTypes() & Symbol::Area)
{
addPointsToLayer(point_layer, is_point_object);
addTextToLayer(point_layer, is_text_object);
if (export_mode == ExportMode::LayerPerSymbol)
{
layer = nullptr;
layer = createLayer(QString::fromUtf8("%1_%2").arg(info.baseName(), symbol->getPlainTextName()).toUtf8(), wkbPolygon);
}
if (layer != nullptr)
addAreasToLayer(layer, [symbol](auto object) { return object->getSymbol() == symbol; });
}

auto line_layer = createLayer(QString::fromLatin1("%1_lines").arg(info.baseName()).toLatin1(), wkbLineString);
if (line_layer != nullptr)
addLinesToLayer(line_layer, is_line_object);

auto area_layer = createLayer(QString::fromLatin1("%1_areas").arg(info.baseName()).toLatin1(), wkbPolygon);
if (area_layer != nullptr)
addAreasToLayer(area_layer, is_area_object);
}

return true;
}

Expand Down