2 #include "common/csv.h"
3 #include "conversion.h"
5 static bool parameter(int key
, double val
, int units
, Projection::Setup
&setup
)
12 {AngularUnits
au(units
);
15 setup
.setLatitudeOrigin(au
.toDegrees(val
));}
21 {AngularUnits
au(units
);
24 setup
.setLongitudeOrigin(au
.toDegrees(val
));}
34 {LinearUnits
lu(units
);
37 setup
.setFalseEasting(lu
.toMeters(val
));}
42 {LinearUnits
lu(units
);
45 setup
.setFalseNorthing(lu
.toMeters(val
));}
50 {AngularUnits
au(units
);
53 setup
.setStandardParallel1(au
.toDegrees(val
));}
58 {AngularUnits
au(units
);
61 setup
.setStandardParallel2(au
.toDegrees(val
));}
68 static int projectionSetup(const QByteArrayList
&list
, Projection::Setup
&setup
)
72 for (int i
= 5; i
< 26; i
+= 3) {
73 const QByteArray
&ks
= list
.at(i
);
77 int key
= ks
.toInt(&r1
);
78 double val
= list
.at(i
+1).toDouble(&r2
);
79 int un
= list
.at(i
+2).toInt(&r3
);
80 if (!r1
|| !r2
|| !r3
)
83 if (!parameter(key
, val
, un
, setup
))
90 QMap
<int, Conversion::Entry
> Conversion::_conversions
= defaults();
92 QMap
<int, Conversion::Entry
> Conversion::defaults()
94 QMap
<int, Conversion::Entry
> map
;
95 map
.insert(3856, Entry("Popular Visualisation Pseudo-Mercator", 1024,
96 Projection::Setup(), 9001, 4400));
100 Conversion
Conversion::conversion(int id
)
102 QMap
<int, Entry
>::const_iterator
it(_conversions
.find(id
));
104 if (it
== _conversions
.constEnd())
107 const Entry
&e
= it
.value();
108 return Conversion(e
.method(), e
.setup(), e
.units(), e
.cs());
112 bool Conversion::loadList(const QString
&path
)
116 QByteArrayList entry
;
119 if (!file
.open(QFile::ReadOnly
)) {
120 qWarning("Error opening projections file: %s: %s", qPrintable(path
),
121 qPrintable(file
.errorString()));
125 while (!csv
.atEnd()) {
126 if (!csv
.readEntry(entry
) || entry
.size() < 26) {
127 qWarning("%s:%d: Parse error", qPrintable(path
), csv
.line());
131 QString
name(entry
.at(0));
132 int proj
= entry
.at(1).toInt(&res
);
134 qWarning("%s:%d: Invalid projection code", qPrintable(path
),
138 int units
= entry
.at(2).toInt(&res
);
140 qWarning("%s:%d: Invalid linear units code", qPrintable(path
),
144 int transform
= entry
.at(3).toInt(&res
);
146 qWarning("%s:%d: Invalid coordinate transformation code",
147 qPrintable(path
), csv
.line());
150 int cs
= entry
.at(4).toInt(&res
);
152 qWarning("%s:%d: Invalid coordinate system code",
153 qPrintable(path
), csv
.line());
157 if (!LinearUnits(units
).isValid()) {
158 qWarning("%s:%d: Unknown linear units code", qPrintable(path
),
162 if (!Projection::Method(transform
).isValid()) {
163 qWarning("%s:%d: Unknown coordinate transformation code",
164 qPrintable(path
), csv
.line());
167 if (!CoordinateSystem(cs
).isValid()) {
168 qWarning("%s:%d: Unknown coordinate system code", qPrintable(path
),
173 Projection::Setup setup
;
174 int pn
= projectionSetup(entry
, setup
);
176 qWarning("%s: %d: Invalid projection parameter #%d",
177 qPrintable(path
), csv
.line(), pn
);
181 _conversions
.insert(proj
, Entry(name
, transform
, setup
, units
, cs
));
187 QList
<KV
<int, QString
> > Conversion::list()
189 QList
<KV
<int, QString
> > list
;
191 for (QMap
<int, Entry
>::const_iterator it
= _conversions
.constBegin();
192 it
!= _conversions
.constEnd(); ++it
)
193 list
.append(KV
<int, QString
>(it
.key(), it
.value().name()));
199 QDebug
operator<<(QDebug dbg
, const Conversion
&conversion
)
201 dbg
.nospace() << "Conversion(" << conversion
.method() << ", "
202 << conversion
.units() << ", " << conversion
.setup() << ")";
205 #endif // QT_NO_DEBUG