Skip to content

Commit de9b337

Browse files
authored
Merge GH-1522 (template georeferencing setup)
2 parents 4b1116b + a7c0ca1 commit de9b337

File tree

10 files changed

+233
-178
lines changed

10 files changed

+233
-178
lines changed

src/gdal/gdal_image_reader.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019 Kai Pastor
2+
* Copyright 2019, 2020 Kai Pastor
33
*
44
* This file is part of OpenOrienteering.
55
*
@@ -284,12 +284,11 @@ TemplateImage::GeoreferencingOption GdalImageReader::readGeoTransform()
284284
auto const result = GDALGetGeoTransform(dataset, geo_transform.data());
285285
if (result == CE_None)
286286
{
287-
georef.type = TemplateImage::Georeferencing_GDAL;
288-
georef.source = GDALGetDriverShortName(GDALGetDatasetDriver(dataset));
289287
georef.crs_spec = toProjSpec(GDALGetProjectionRef(dataset));
290-
georef.pixel_to_world = { geo_transform[1], geo_transform[2],
291-
geo_transform[4], geo_transform[5],
292-
geo_transform[0], geo_transform[3] };
288+
georef.transform.source = GDALGetDriverShortName(GDALGetDatasetDriver(dataset));
289+
georef.transform.pixel_to_world = { geo_transform[1], geo_transform[2],
290+
geo_transform[4], geo_transform[5],
291+
geo_transform[0], geo_transform[3] };
293292
}
294293
}
295294
return georef;

src/gdal/gdal_template.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019 Kai Pastor
2+
* Copyright 2019, 2020 Kai Pastor
33
*
44
* This file is part of OpenOrienteering.
55
*
@@ -85,7 +85,7 @@ bool GdalTemplate::loadTemplateFileImpl(bool configuring)
8585
available_georef = findAvailableGeoreferencing(reader.readGeoTransform());
8686
if (!configuring && is_georeferenced)
8787
{
88-
if (available_georef.front().type == Georeferencing_None)
88+
if (!isGeoreferencingUsable())
8989
{
9090
// Image was georeferenced, but georeferencing info is gone -> deny to load template
9191
setErrorString(::OpenOrienteering::TemplateImage::tr("Georeferencing not found"));

src/gui/select_crs_dialog.cpp

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2012, 2013 Thomas Schöps
3-
* Copyright 2012-2015 Kai Pastor
3+
* Copyright 2012-2020 Kai Pastor
44
*
55
* This file is part of OpenOrienteering.
66
*
@@ -41,9 +41,10 @@ namespace OpenOrienteering {
4141
namespace {
4242

4343
enum SpecialCRS {
44-
SameAsMap = 1,
45-
Local = 2,
46-
Geographic = 3
44+
SameAsMap = 1,
45+
Local = 2,
46+
Geographic = 3,
47+
TemplateFile = 4,
4748
};
4849

4950

@@ -52,34 +53,30 @@ enum SpecialCRS {
5253

5354

5455
SelectCRSDialog::SelectCRSDialog(
56+
const TemplateImage::GeoreferencingOptions& options,
5557
const Georeferencing& georef,
5658
QWidget* parent,
57-
GeorefAlternatives alternatives,
5859
const QString& description )
5960
: QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
61+
, options(options)
6062
, georef(georef)
6163
{
6264
setWindowModality(Qt::WindowModal);
6365
setWindowTitle(tr("Select coordinate reference system"));
6466

6567
crs_selector = new CRSSelector(georef, nullptr);
6668
if (georef.isLocal())
67-
crs_selector->clear();
68-
69-
if (alternatives.testFlag(TakeFromMap) && !georef.isLocal())
70-
{
71-
crs_selector->addCustomItem(tr("Same as map"), SpecialCRS::SameAsMap);
72-
crs_selector->setCurrentIndex(0); // TakeFromMap
73-
}
74-
75-
if (alternatives.testFlag(Local) || georef.isLocal())
7669
{
70+
crs_selector->clear();
7771
crs_selector->addCustomItem(tr("Local"), SpecialCRS::Local);
78-
crs_selector->setCurrentIndex(0); // TakeFromMap or Local, both is fine.
7972
}
80-
81-
if (alternatives.testFlag(Geographic) && !georef.isLocal())
73+
else
74+
{
75+
if (!options.template_file.crs_spec.isEmpty())
76+
crs_selector->addCustomItem(tr("From template file"), SpecialCRS::TemplateFile );
77+
crs_selector->addCustomItem(tr("Same as map"), SpecialCRS::SameAsMap);
8278
crs_selector->addCustomItem(tr("Geographic coordinates (WGS84)"), SpecialCRS::Geographic);
79+
}
8380

8481
status_label = new QLabel();
8582
button_box = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
@@ -95,6 +92,20 @@ SelectCRSDialog::SelectCRSDialog(
9592
form_layout->addItem(Util::SpacerItem::create(this));
9693
crs_selector->setDialogLayout(form_layout);
9794

95+
auto const& crs_spec = options.effective.crs_spec;
96+
if (georef.isLocal())
97+
crs_selector->setCurrentIndex(0);
98+
else if (crs_spec.isEmpty())
99+
crs_selector->setCurrentIndex(crs_selector->findData(SpecialCRS::SameAsMap));
100+
else if (crs_spec == options.template_file.crs_spec)
101+
crs_selector->setCurrentIndex(crs_selector->findData(SpecialCRS::TemplateFile));
102+
else if (crs_spec == georef.getProjectedCRSSpec())
103+
crs_selector->setCurrentIndex(crs_selector->findData(SpecialCRS::SameAsMap));
104+
else if (crs_spec == Georeferencing::geographic_crs_spec)
105+
crs_selector->setCurrentIndex(crs_selector->findData(SpecialCRS::Geographic));
106+
else
107+
crs_selector->setCurrentCRS(CRSTemplateRegistry().find(QString::fromLatin1("PROJ.4")), { crs_spec });
108+
98109
auto layout = new QVBoxLayout();
99110
layout->addLayout(form_layout, 1);
100111
layout->addWidget(button_box, 0);
@@ -121,6 +132,9 @@ QString SelectCRSDialog::currentCRSSpec() const
121132
case SpecialCRS::Geographic:
122133
spec = Georeferencing::geographic_crs_spec;
123134
break;
135+
case SpecialCRS::TemplateFile:
136+
spec = options.template_file.crs_spec;
137+
break;
124138
default:
125139
spec = crs_selector->currentCRSSpec();
126140
}

src/gui/select_crs_dialog.h

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2012, 2013 Thomas Schöps
3-
* Copyright 2012-2015 Kai Pastor
3+
* Copyright 2012-2020 Kai Pastor
44
*
55
* This file is part of OpenOrienteering.
66
*
@@ -27,6 +27,8 @@
2727
#include <QObject>
2828
#include <QString>
2929

30+
#include "templates/template_image.h"
31+
3032
class QDialogButtonBox;
3133
class QLabel;
3234
class QWidget;
@@ -42,19 +44,6 @@ class SelectCRSDialog : public QDialog
4244
{
4345
Q_OBJECT
4446
public:
45-
46-
/**
47-
* Georeferencing alternatives
48-
*/
49-
enum GeorefAlternative
50-
{
51-
TakeFromMap = 1 << 0,
52-
Local = 1 << 1,
53-
Geographic = 1 << 2,
54-
None = 0
55-
};
56-
Q_DECLARE_FLAGS(GeorefAlternatives, GeorefAlternative)
57-
5847
/**
5948
* Creates a SelectCRSDialog.
6049
*
@@ -65,9 +54,9 @@ Q_OBJECT
6554
* Should explain what the selected CRS will be used for.
6655
*/
6756
SelectCRSDialog(
57+
const TemplateImage::GeoreferencingOptions& options,
6858
const Georeferencing& georef,
6959
QWidget* parent,
70-
GeorefAlternatives alternatives,
7160
const QString& description = QString()
7261
);
7362

@@ -83,6 +72,7 @@ Q_OBJECT
8372
void updateWidgets();
8473

8574
private:
75+
const TemplateImage::GeoreferencingOptions& options;
8676
const Georeferencing& georef;
8777
CRSSelector* crs_selector;
8878
QLabel* status_label;
@@ -92,8 +82,4 @@ Q_OBJECT
9282

9383
} // namespace OpenOrienteering
9484

95-
96-
Q_DECLARE_OPERATORS_FOR_FLAGS(OpenOrienteering::SelectCRSDialog::GeorefAlternatives)
97-
98-
9985
#endif

src/gui/widgets/template_list_widget.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2012, 2013 Thomas Schöps
3-
* Copyright 2012-2019 Kai Pastor
3+
* Copyright 2012-2020 Kai Pastor
44
*
55
* This file is part of OpenOrienteering.
66
*
@@ -1102,10 +1102,10 @@ void TemplateListWidget::changeGeorefClicked()
11021102
if (position_action->isChecked())
11031103
position_action->trigger();
11041104
}
1105-
if (templ->trySetTemplateGeoreferenced(new_value, this) != new_value)
1105+
if (!templ->trySetTemplateGeoreferenced(new_value, this))
11061106
{
11071107
QMessageBox::warning(this, tr("Error"), tr("Cannot change the georeferencing state."));
1108-
georef_action->setChecked(false);
1108+
georef_action->setChecked(templ->isTemplateGeoreferenced());
11091109
}
11101110
updateButtons();
11111111
}

src/templates/template.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2012, 2013 Thomas Schöps
3-
* Copyright 2013-2019 Kai Pastor
3+
* Copyright 2013-2020 Kai Pastor
44
*
55
* This file is part of OpenOrienteering.
66
*
@@ -676,9 +676,9 @@ bool Template::canChangeTemplateGeoreferenced()
676676
}
677677

678678
// virtual
679-
bool Template::trySetTemplateGeoreferenced(bool /*value*/, QWidget* /*dialog_parent*/)
679+
bool Template::trySetTemplateGeoreferenced(bool value, QWidget* /*dialog_parent*/)
680680
{
681-
return is_georeferenced;
681+
return isTemplateGeoreferenced() == value;
682682
}
683683

684684

src/templates/template.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2012, 2013 Thomas Schöps
3-
* Copyright 2012-2019 Kai Pastor
3+
* Copyright 2012-2020 Kai Pastor
44
*
55
* This file is part of OpenOrienteering.
66
*
@@ -518,12 +518,11 @@ Q_OBJECT
518518
* Tries to change the usage of georeferencing data.
519519
*
520520
* If supported by the actual template, this function tries to switch the
521-
* state between non-georeferenced and georeferenced. It returns the final
522-
* state which may be the same as before if the change is not implemented
523-
* or fails for other reasons.
521+
* state between non-georeferenced and georeferenced. It returns false when
522+
* an error occurred, and true if the change was successful or if it was
523+
* explicitly cancelled by the user.
524524
*
525-
* The default implementation changes nothing, and it just returns the
526-
* current state.
525+
* The default implementation returns true iff the state matches the value.
527526
*/
528527
virtual bool trySetTemplateGeoreferenced(bool value, QWidget* dialog_parent);
529528

0 commit comments

Comments
 (0)