2 #include "common/csv.h"
8 Entry(int id
, int gd
, const QString
&name
, const GCS
&gcs
)
9 : _id(id
), _gd(gd
), _name(name
), _gcs(gcs
) {}
11 int id() const {return _id
;}
12 int gd() const {return _gd
;}
13 const QString
&name() const {return _name
;}
14 const GCS
&gcs() const {return _gcs
;}
22 static int parameter(const QByteArray
&str
, bool *res
)
29 return str
.toInt(res
);
32 static double parameterd(const QByteArray
&str
, bool *res
)
39 return str
.toDouble(res
);
43 QList
<GCS::Entry
> GCS::_gcss
= defaults();
45 const GCS
&GCS::WGS84()
47 static GCS
g(Datum::WGS84(), 8901, 9122);
51 QList
<GCS::Entry
> GCS::defaults()
53 QList
<GCS::Entry
> list
;
54 list
.append(GCS::Entry(4326, 6326, "WGS 1984", WGS84()));
55 list
.append(GCS::Entry(4326, 6326, "WGS 84", WGS84()));
56 list
.append(GCS::Entry(4326, 6326, "WGS84", WGS84()));
62 for (int i
= 0; i
< _gcss
.size(); i
++)
63 if (_gcss
.at(i
).id() == id
)
64 return _gcss
.at(i
).gcs();
69 GCS
GCS::gcs(int geodeticDatum
, int primeMeridian
, int angularUnits
)
71 for (int i
= 0; i
< _gcss
.size(); i
++) {
72 const Entry
&e
= _gcss
.at(i
);
73 if (e
.gd() == geodeticDatum
&& e
.gcs().primeMeridian() == primeMeridian
74 && e
.gcs().angularUnits() == angularUnits
)
81 GCS
GCS::gcs(const QString
&name
)
83 for (int i
= 0; i
< _gcss
.size(); i
++)
84 if (_gcss
.at(i
).name() == name
)
85 return _gcss
.at(i
).gcs();
90 bool GCS::loadList(const QString
&path
)
97 if (!file
.open(QFile::ReadOnly
)) {
98 qWarning("Error opening GCS file: %s: %s", qPrintable(path
),
99 qPrintable(file
.errorString()));
103 while (!csv
.atEnd()) {
104 if (!csv
.readEntry(entry
) || entry
.size() < 14) {
105 qWarning("%s:%d: Parse error", qPrintable(path
), csv
.line());
109 int id
= parameter(entry
.at(1), &res
);
111 qWarning("%s:%d: Invalid GCS code", qPrintable(path
), csv
.line());
114 int gd
= parameter(entry
.at(2), &res
);
116 qWarning("%s:%d: Invalid geodetic datum code", qPrintable(path
),
120 int au
= entry
.at(3).toInt(&res
);
122 qWarning("%s:%d: Invalid angular units code", qPrintable(path
),
126 int el
= entry
.at(4).toInt(&res
);
128 qWarning("%s:%d: Invalid ellipsoid code", qPrintable(path
),
132 int pm
= entry
.at(5).toInt(&res
);
134 qWarning("%s:%d: Invalid prime meridian code", qPrintable(path
),
138 int ct
= entry
.at(6).toInt(&res
);
140 qWarning("%s:%d: Invalid coordinates transformation code",
141 qPrintable(path
), csv
.line());
144 double dx
= entry
.at(7).toDouble(&res
);
146 qWarning("%s:%d: Invalid dx", qPrintable(path
), csv
.line());
149 double dy
= entry
.at(8).toDouble(&res
);
151 qWarning("%s:%d: Invalid dy", qPrintable(path
), csv
.line());
154 double dz
= entry
.at(9).toDouble(&res
);
156 qWarning("%s:%d: Invalid dz", qPrintable(path
), csv
.line());
159 double rx
= parameterd(entry
.at(10), &res
);
161 qWarning("%s:%d: Invalid rx", qPrintable(path
), csv
.line());
164 double ry
= parameterd(entry
.at(11), &res
);
166 qWarning("%s:%d: Invalid ry", qPrintable(path
), csv
.line());
169 double rz
= parameterd(entry
.at(12), &res
);
171 qWarning("%s:%d: Invalid rz", qPrintable(path
), csv
.line());
174 double ds
= parameterd(entry
.at(13), &res
);
176 qWarning("%s:%d: Invalid ds", qPrintable(path
), csv
.line());
180 const Ellipsoid
&e
= Ellipsoid::ellipsoid(el
);
182 qWarning("%s:%d: Unknown ellipsoid code", qPrintable(path
),
190 datum
= Datum(e
, dx
, dy
, dz
);
193 datum
= Datum(e
, dx
, dy
, dz
, -rx
, -ry
, -rz
, ds
);
196 datum
= Datum(e
, dx
, dy
, dz
, rx
, ry
, rz
, ds
);
199 qWarning("%s:%d: Unknown coordinates transformation method",
200 qPrintable(path
), csv
.line());
203 if (!datum
.isValid()) {
204 qWarning("%s:%d: Invalid coordinates transformation parameters",
205 qPrintable(path
), csv
.line());
209 GCS
gcs(datum
, pm
, au
);
211 _gcss
.append(Entry(id
, gd
, entry
.at(0), gcs
));
213 qWarning("%s:%d: Unknown prime meridian/angular units code",
214 qPrintable(path
), csv
.line());
220 Coordinates
GCS::toWGS84(const Coordinates
&c
) const
222 return datum().toWGS84(Coordinates(_primeMeridian
.toGreenwich(c
.lon()),
226 Coordinates
GCS::fromWGS84(const Coordinates
&c
) const
228 Coordinates
ds(datum().fromWGS84(c
));
229 return Coordinates(_primeMeridian
.fromGreenwich(ds
.lon()), ds
.lat());
232 QList
<KV
<int, QString
> > GCS::list()
234 QList
<KV
<int, QString
> > list
;
236 for (int i
= 0; i
< _gcss
.size(); i
++) {
237 const Entry
&e
= _gcss
.at(i
);
238 if (!e
.id() || (i
&& e
.id() == list
.last().key()))
241 list
.append(KV
<int, QString
>(e
.id(), e
.name() + " / Geographic 2D"));
247 QList
<KV
<int, QString
> > GCS::WGS84List()
249 QList
<KV
<int, QString
> > list
;
250 list
.append(KV
<int, QString
>(4326, "Geographic 2D"));
255 QDebug
operator<<(QDebug dbg
, const GCS
&gcs
)
257 dbg
.nospace() << "GCS(" << gcs
.datum() << ", " << gcs
.primeMeridian()
258 << ", " << gcs
.angularUnits() << ")";
261 #endif // QT_NO_DEBUG