Skip to content

Commit ae870e2

Browse files
committed
OgrFileExport: Test for .dxf and .shp export
1 parent 870b977 commit ae870e2

3 files changed

Lines changed: 225 additions & 0 deletions

File tree

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<map xmlns="http://openorienteering.org/apps/mapper/xml/v2" version="9">
3+
<notes></notes>
4+
<georeferencing scale="10000" grid_scale_factor="0.9996" auxiliary_scale_factor="1" grivation="-0.01"><projected_crs id="UTM"><spec language="PROJ.4">+proj=utm +datum=WGS84 +zone=32</spec><parameter>32 N</parameter><ref_point x="500745.955034" y="5316300.272828"/></projected_crs><geographic_crs id="Geographic coordinates"><spec language="PROJ.4">+proj=latlong +datum=WGS84</spec><ref_point_deg lat="48" lon="9.01"/></geographic_crs></georeferencing>
5+
<colors count="4">
6+
<color priority="0" name="Black 100%" c="0" m="0" y="0" k="1" opacity="1"><spotcolors><namedcolor>BLACK</namedcolor></spotcolors><cmyk method="custom"/><rgb method="cmyk" r="0" g="0" b="0"/></color>
7+
<color priority="1" name="Green 100%" c="0.76" m="0" y="0.91" k="0" opacity="1"><spotcolors><namedcolor>GREEN</namedcolor></spotcolors><cmyk method="custom"/><rgb method="cmyk" r="0.24" g="1" b="0.09"/></color>
8+
<color priority="2" name="Brown 100%" c="0" m="0.56" y="1" k="0.18" opacity="1"><spotcolors><namedcolor>BROWN</namedcolor></spotcolors><cmyk method="custom"/><rgb method="cmyk" r="0.82" g="0.361" b="0"/></color>
9+
<color priority="3" name="Green 100% for area features" c="0.76" m="0" y="0.91" k="0" opacity="1"><spotcolors knockout="true"><component factor="1" spotcolor="1"/></spotcolors><cmyk method="spotcolor"/><rgb method="spotcolor" r="0.24" g="1" b="0.09"/></color>
10+
</colors>
11+
<barrier version="6" required="0.6.0">
12+
<symbols count="12" id="ISOM 2017-2">
13+
<symbol type="2" id="0" code="101.1" name="Line"><line_symbol color="2" line_width="210" minimum_length="0" join_style="2" cap_style="1" start_offset="0" end_offset="0" segment_length="6000" end_length="0" show_at_least_one_symbol="true" minimum_mid_symbol_count="0" minimum_mid_symbol_count_when_closed="0" dash_length="6000" break_length="1500" dashes_in_group="1" in_group_break_length="750" mid_symbols_per_spot="1" mid_symbol_distance="0"><start_symbol><symbol type="1" code="" name="Start symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></start_symbol><mid_symbol><symbol type="1" code="" name="Mid symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></mid_symbol><end_symbol><symbol type="1" code="" name="End symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></end_symbol><dash_symbol><symbol type="1" code="" name="Dash symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></dash_symbol></line_symbol></symbol>
14+
<symbol type="2" id="1" code="101.2" name="Line" is_hidden="true"><line_symbol color="2" line_width="210" minimum_length="0" join_style="2" cap_style="1" start_offset="0" end_offset="0" segment_length="6000" end_length="0" show_at_least_one_symbol="true" minimum_mid_symbol_count="0" minimum_mid_symbol_count_when_closed="0" dash_length="6000" break_length="1500" dashes_in_group="1" in_group_break_length="750" mid_symbols_per_spot="1" mid_symbol_distance="0"><start_symbol><symbol type="1" code="" name="Start symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></start_symbol><mid_symbol><symbol type="1" code="" name="Mid symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></mid_symbol><end_symbol><symbol type="1" code="" name="End symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></end_symbol><dash_symbol><symbol type="1" code="" name="Dash symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></dash_symbol></line_symbol></symbol>
15+
<symbol type="2" id="2" code="101.3" name="Line" is_helper_symbol="true"><line_symbol color="2" line_width="210" minimum_length="0" join_style="2" cap_style="1" start_offset="0" end_offset="0" segment_length="6000" end_length="0" show_at_least_one_symbol="true" minimum_mid_symbol_count="0" minimum_mid_symbol_count_when_closed="0" dash_length="6000" break_length="1500" dashes_in_group="1" in_group_break_length="750" mid_symbols_per_spot="1" mid_symbol_distance="0"><start_symbol><symbol type="1" code="" name="Start symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></start_symbol><mid_symbol><symbol type="1" code="" name="Mid symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></mid_symbol><end_symbol><symbol type="1" code="" name="End symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></end_symbol><dash_symbol><symbol type="1" code="" name="Dash symbol"><point_symbol rotatable="true" inner_radius="1000" inner_color="-1" outer_width="0" outer_color="-1" elements="0"/></symbol></dash_symbol></line_symbol></symbol>
16+
<symbol type="4" id="3" code="410.1" name="Area"><area_symbol inner_color="3" min_area="675" patterns="0"/></symbol>
17+
<symbol type="4" id="4" code="410.2" name="Area" is_hidden="true"><area_symbol inner_color="3" min_area="675" patterns="0"/></symbol>
18+
<symbol type="4" id="5" code="410.3" name="Area" is_helper_symbol="true"><area_symbol inner_color="3" min_area="675" patterns="0"/></symbol>
19+
<symbol type="1" id="6" code="526" name="Point" is_hidden="true"><point_symbol inner_radius="105" inner_color="0" outer_width="0" outer_color="-1" elements="1"><element><symbol type="1" code=""><point_symbol inner_radius="360" inner_color="-1" outer_width="240" outer_color="0" elements="0"/></symbol><object type="0"><coords count="1">0 0;</coords></object></element></point_symbol></symbol>
20+
<symbol type="1" id="7" code="530" name="Point"><point_symbol inner_radius="360" inner_color="-1" outer_width="240" outer_color="0" elements="0"/></symbol>
21+
<symbol type="1" id="8" code="531" name="Point" is_helper_symbol="true"><point_symbol inner_radius="1500" inner_color="-1" outer_width="0" outer_color="-1" elements="2"><element><symbol type="2" code=""><line_symbol color="0" line_width="240" minimum_length="0" join_style="1" cap_style="0" start_offset="0" end_offset="0" segment_length="6000" end_length="0" show_at_least_one_symbol="true" minimum_mid_symbol_count="0" minimum_mid_symbol_count_when_closed="0" dash_length="6000" break_length="1500" dashes_in_group="1" in_group_break_length="750" mid_symbols_per_spot="1" mid_symbol_distance="0"/></symbol><object type="1"><coords count="2">-516 -516;516 516;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object></element><element><symbol type="2" code=""><line_symbol color="0" line_width="240" minimum_length="0" join_style="1" cap_style="0" start_offset="0" end_offset="0" segment_length="6000" end_length="0" show_at_least_one_symbol="true" minimum_mid_symbol_count="0" minimum_mid_symbol_count_when_closed="0" dash_length="6000" break_length="1500" dashes_in_group="1" in_group_break_length="750" mid_symbols_per_spot="1" mid_symbol_distance="0"/></symbol><object type="1"><coords count="2">516 -516;-516 516;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object></element></point_symbol></symbol>
22+
<symbol type="8" id="9" code="603.1" name="Text"><text_symbol icon_text="321" rotatable="true"><font family="Sans Serif" size="3143"/><text color="0" line_spacing="1" paragraph_spacing="0" character_spacing="0" kerning="true"/></text_symbol></symbol>
23+
<symbol type="8" id="10" code="603.2" name="Text" is_hidden="true"><text_symbol icon_text="321" rotatable="true"><font family="Sans Serif" size="3143"/><text color="0" line_spacing="1" paragraph_spacing="0" character_spacing="0" kerning="true"/></text_symbol></symbol>
24+
<symbol type="8" id="11" code="603.3" name="Text" is_helper_symbol="true"><text_symbol icon_text="321" rotatable="true"><font family="Sans Serif" size="3143"/><text color="0" line_spacing="1" paragraph_spacing="0" character_spacing="0" kerning="true"/></text_symbol></symbol>
25+
</symbols>
26+
<parts count="1" current="0">
27+
<part name="default part"><objects count="12">
28+
<object type="0" symbol="7"><coords count="1">-40995 -66807;</coords></object>
29+
<object type="0" symbol="6"><coords count="1">-37893 -61525;</coords></object>
30+
<object type="0" symbol="8"><coords count="1">-35119 -56047;</coords></object>
31+
<object type="4" symbol="9" h_align="1" v_align="2"><coords count="1">-33469 -67203;</coords><text>normal</text></object>
32+
<object type="4" symbol="10" h_align="1" v_align="2"><coords count="1">-30169 -61922;</coords><text>hidden</text></object>
33+
<object type="4" symbol="11" h_align="1" v_align="2"><coords count="1">-27462 -56442;</coords><text>helper</text></object>
34+
<object type="1" symbol="5"><coords count="13">-42372 -56765 1;-42785 -55708;-42262 -54517;-41205 -54104 1;-40148 -53692;-38957 -54214;-38544 -55271 1;-38132 -56328;-38654 -57520;-39711 -57932 1;-40768 -58345;-41960 -57822;-42372 -56765 18;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object>
35+
<object type="1" symbol="4"><coords count="13">-46667 -62647 1;-47105 -61744;-46729 -60658;-45826 -60219 1;-44924 -59781;-43837 -60157;-43399 -61060 1;-42961 -61962;-43337 -63049;-44239 -63487 1;-45142 -63925;-46228 -63549;-46667 -62647 18;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object>
36+
<object type="1" symbol="3"><coords count="13">-47974 -67595 1;-48360 -66692;-47942 -65647;-47040 -65261 1;-46138 -64874;-45093 -65292;-44706 -66194 1;-44319 -67097;-44737 -68142;-45640 -68528 1;-46542 -68915;-47587 -68497;-47974 -67595 18;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object>
37+
<object type="1" symbol="0"><coords count="4">-24820 -66754;-22767 -67968;-19779 -66194;-16511 -67501;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object>
38+
<object type="1" symbol="1"><coords count="4">-23420 -60126;-20526 -61900;-17818 -59939;-14738 -61620;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object>
39+
<object type="1" symbol="2"><coords count="4">-19499 -54991;-15858 -56578;-13244 -55085;-9976 -56298;</coords><pattern rotation="0"><coord x="0" y="0"/></pattern></object>
40+
</objects></part>
41+
</parts>
42+
<templates count="0" first_front_template="0">
43+
<defaults use_meters_per_pixel="true" meters_per_pixel="0" dpi="0" scale="0"/>
44+
</templates>
45+
<view>
46+
<grid color="#646464" display="0" alignment="0" additional_rotation="0" unit="1" h_spacing="500" v_spacing="500" h_offset="0" v_offset="0" snapping_enabled="true"/>
47+
<map_view zoom="2.82843" position_x="-36397" position_y="-44815"><map opacity="1" visible="true"/><templates count="0"/></map_view>
48+
</view>
49+
</barrier>
50+
</map>

test/file_format_t.cpp

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <stdexcept>
3030
// IWYU pragma: no_include <type_traits>
3131
#include <utility>
32+
#include <vector>
3233

3334
#include <Qt>
3435
#include <QtGlobal>
@@ -54,6 +55,7 @@
5455
#include <QSize>
5556
#include <QSizeF>
5657
#include <QString>
58+
#include <QStringList>
5759
#include <QStringRef>
5860
#include <QTemporaryDir>
5961
#include <QVariant>
@@ -1885,6 +1887,168 @@ void FileFormatTest::ocdTextSymbolTest()
18851887
}
18861888

18871889

1890+
void FileFormatTest::dxfExportTest_data()
1891+
{
1892+
QTest::addColumn<QString>("map_filepath");
1893+
QTest::addColumn<QByteArray>("ogr_format_id");
1894+
QTest::addColumn<QString>("ogr_extension");
1895+
QTest::addColumn<bool>("export_one_layer_per_symbol");
1896+
1897+
QTest::newRow("export_one_layer_per_symbol = false") << QString::fromLatin1("data:helper-hidden-symbols.omap")
1898+
<< QByteArray("OGR-export-DXF") << QString::fromLatin1("dxf")
1899+
<< false;
1900+
QTest::newRow("export_one_layer_per_symbol = true") << QString::fromLatin1("data:helper-hidden-symbols.omap")
1901+
<< QByteArray("OGR-export-DXF") << QString::fromLatin1("dxf")
1902+
<< true;
1903+
}
1904+
1905+
void FileFormatTest::dxfExportTest()
1906+
{
1907+
#ifdef MAPPER_USE_GDAL
1908+
QFETCH(QString, map_filepath);
1909+
QFETCH(QByteArray, ogr_format_id);
1910+
QFETCH(QString, ogr_extension);
1911+
QFETCH(bool, export_one_layer_per_symbol);
1912+
1913+
QTemporaryDir dir;
1914+
QVERIFY(dir.isValid());
1915+
auto const ogr_filepath = QString {dir.path() + QLatin1String("/dxfexport.") + ogr_extension};
1916+
1917+
GdalManager manager;
1918+
auto prev_export_one_layer_per_symbol = manager.isExportOptionEnabled(GdalManager::OneLayerPerSymbol);
1919+
if (prev_export_one_layer_per_symbol != export_one_layer_per_symbol)
1920+
manager.setExportOptionEnabled(GdalManager::OneLayerPerSymbol, export_one_layer_per_symbol);
1921+
1922+
Map map;
1923+
{
1924+
QVERIFY(map.loadFrom(map_filepath));
1925+
1926+
auto const* format = FileFormats.findFormat(ogr_format_id);
1927+
QVERIFY(format);
1928+
1929+
auto exporter = format->makeExporter(ogr_filepath, &map, nullptr);
1930+
QVERIFY(bool(exporter));
1931+
QVERIFY(exporter->doExport());
1932+
}
1933+
1934+
if (prev_export_one_layer_per_symbol != export_one_layer_per_symbol)
1935+
manager.setExportOptionEnabled(GdalManager::OneLayerPerSymbol, prev_export_one_layer_per_symbol);
1936+
1937+
Map imported_map;
1938+
{
1939+
auto const* format = FileFormats.findFormat("OGR");
1940+
QVERIFY(format);
1941+
1942+
auto importer = format->makeImporter(ogr_filepath, &imported_map, nullptr);
1943+
QVERIFY(bool(importer));
1944+
QVERIFY(importer->doImport());
1945+
}
1946+
1947+
// Symbols
1948+
QCOMPARE(imported_map.getNumSymbols(), 8); // 4 default symbols and 4 symbols for the imported objects
1949+
1950+
// Objects
1951+
const auto& actual_part = *map.getPart(0);
1952+
const auto& imported_part = *imported_map.getPart(0);
1953+
QCOMPARE(actual_part.getNumObjects(), 12);
1954+
QCOMPARE(imported_part.getNumObjects(), 4);
1955+
1956+
#endif // MAPPER_USE_GDAL
1957+
}
1958+
1959+
1960+
void FileFormatTest::shpExportTest_data()
1961+
{
1962+
QTest::addColumn<QString>("map_filepath");
1963+
QTest::addColumn<QByteArray>("ogr_format_id");
1964+
QTest::addColumn<QString>("ogr_extension");
1965+
QTest::addColumn<bool>("export_one_layer_per_symbol");
1966+
QTest::addColumn<QString>("name_extensions");
1967+
QTest::addColumn<std::vector<int>>("number_symbols");
1968+
QTest::addColumn<std::vector<int>>("number_objects");
1969+
1970+
1971+
QTest::newRow("export_one_layer_per_symbol = false") << QString::fromLatin1("data:helper-hidden-symbols.omap")
1972+
<< QByteArray("OGR-export-ESRI Shapefile") << QString::fromLatin1("shp")
1973+
<< false
1974+
<< QString::fromLatin1("areas lines")
1975+
<< std::vector<int>{4, 4}
1976+
<< std::vector<int>{1, 2}; // the single line is exported as two lines
1977+
QTest::newRow("export_one_layer_per_symbol = true") << QString::fromLatin1("data:helper-hidden-symbols.omap")
1978+
<< QByteArray("OGR-export-ESRI Shapefile") << QString::fromLatin1("shp")
1979+
<< true
1980+
<< QString::fromLatin1("Area Line Text")
1981+
<< std::vector<int>{4, 4, 4}
1982+
<< std::vector<int>{1, 2, 0}; // the single line is exported as two lines
1983+
}
1984+
1985+
void FileFormatTest::shpExportTest()
1986+
{
1987+
#ifdef MAPPER_USE_GDAL
1988+
QFETCH(QString, map_filepath);
1989+
QFETCH(QByteArray, ogr_format_id);
1990+
QFETCH(QString, ogr_extension);
1991+
QFETCH(bool, export_one_layer_per_symbol);
1992+
QFETCH(QString, name_extensions);
1993+
QFETCH(std::vector<int>, number_symbols);
1994+
QFETCH(std::vector<int>, number_objects);
1995+
1996+
const auto name_extension_list = name_extensions.split(QLatin1String(" "));
1997+
QVERIFY(name_extension_list.size() == (int)number_symbols.size());
1998+
QVERIFY(number_objects.size() == number_symbols.size());
1999+
2000+
QTemporaryDir dir;
2001+
QVERIFY(dir.isValid());
2002+
auto const ogr_filepath = QString {dir.path() + QLatin1String("/shpexport.") + ogr_extension};
2003+
2004+
GdalManager manager;
2005+
auto prev_export_one_layer_per_symbol = manager.isExportOptionEnabled(GdalManager::OneLayerPerSymbol);
2006+
if (prev_export_one_layer_per_symbol != export_one_layer_per_symbol)
2007+
manager.setExportOptionEnabled(GdalManager::OneLayerPerSymbol, export_one_layer_per_symbol);
2008+
2009+
Map map;
2010+
{
2011+
QVERIFY(map.loadFrom(map_filepath));
2012+
2013+
auto const* format = FileFormats.findFormat(ogr_format_id);
2014+
QVERIFY(format);
2015+
2016+
auto exporter = format->makeExporter(ogr_filepath, &map, nullptr);
2017+
QVERIFY(bool(exporter));
2018+
QVERIFY(exporter->doExport());
2019+
}
2020+
2021+
if (prev_export_one_layer_per_symbol != export_one_layer_per_symbol)
2022+
manager.setExportOptionEnabled(GdalManager::OneLayerPerSymbol, prev_export_one_layer_per_symbol);
2023+
2024+
int i = 0;
2025+
for (const auto& name_extension : name_extension_list)
2026+
{
2027+
Map imported_map;
2028+
{
2029+
auto const* format = FileFormats.findFormat("OGR");
2030+
QVERIFY(format);
2031+
2032+
auto const ogr_filepath = QString {dir.path() + QLatin1String("/shpexport_") + name_extension + QLatin1String(".") + ogr_extension};
2033+
auto importer = format->makeImporter(ogr_filepath, &imported_map, nullptr);
2034+
QVERIFY(bool(importer));
2035+
QVERIFY(importer->doImport());
2036+
}
2037+
2038+
// Symbols
2039+
QCOMPARE(imported_map.getNumSymbols(), number_symbols.at(i)); // 4 default symbols and 4 symbols for the imported objects
2040+
2041+
// Objects
2042+
const auto& actual_part = *map.getPart(0);
2043+
const auto& imported_part = *imported_map.getPart(0);
2044+
QCOMPARE(actual_part.getNumObjects(), 12);
2045+
QCOMPARE(imported_part.getNumObjects(), number_objects.at(i));
2046+
++i;
2047+
}
2048+
2049+
#endif // MAPPER_USE_GDAL
2050+
}
2051+
18882052
/*
18892053
* We don't need a real GUI window.
18902054
*

test/file_format_t.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,17 @@ private slots:
140140
void ocdTextSymbolTest_data();
141141
void ocdTextSymbolTest();
142142

143+
/**
144+
* Test DXF export and import.
145+
*/
146+
void dxfExportTest_data();
147+
void dxfExportTest();
148+
149+
/**
150+
* Test SHP export and import.
151+
*/
152+
void shpExportTest_data();
153+
void shpExportTest();
143154
};
144155

145156
#endif // OPENORIENTEERING_FILE_FORMAT_T_H

0 commit comments

Comments
 (0)