1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-24 03:35:53 +01:00

Improve/fix GCS search

Optimize the most common search case (improves PCS loading time)
This commit is contained in:
Martin Tůma 2024-06-28 09:15:50 +02:00
parent 09833474f1
commit a4c20f8924

View File

@ -7,12 +7,16 @@ class GCS::Entry {
public: public:
Entry(int id, int gd, const QString &name, const GCS &gcs) Entry(int id, int gd, const QString &name, const GCS &gcs)
: _id(id), _gd(gd), _name(name), _gcs(gcs) {} : _id(id), _gd(gd), _name(name), _gcs(gcs) {}
Entry(int id) : _id(id) {}
int id() const {return _id;} int id() const {return _id;}
int gd() const {return _gd;} int gd() const {return _gd;}
const QString &name() const {return _name;} const QString &name() const {return _name;}
const GCS &gcs() const {return _gcs;} const GCS &gcs() const {return _gcs;}
bool operator<(const Entry &other) const
{return _id < other._id;}
private: private:
int _id, _gd; int _id, _gd;
QString _name; QString _name;
@ -59,11 +63,14 @@ QList<GCS::Entry> GCS::defaults()
GCS GCS::gcs(int id) GCS GCS::gcs(int id)
{ {
for (int i = 0; i < _gcss.size(); i++) // There are GCSs without EPSG code (id = 0) in the list!
if (_gcss.at(i).id() == id) if (!id)
return _gcss.at(i).gcs();
return GCS(); return GCS();
QList<GCS::Entry>::iterator it = std::lower_bound(
_gcss.begin(), _gcss.end(), id);
return (it == _gcss.end()) ? GCS() : it->gcs();
} }
GCS GCS::gcs(int geodeticDatum, int primeMeridian, int angularUnits) GCS GCS::gcs(int geodeticDatum, int primeMeridian, int angularUnits)
@ -220,6 +227,8 @@ bool GCS::loadList(const QString &path)
qPrintable(path), csv.line() - 1); qPrintable(path), csv.line() - 1);
} }
std::sort(_gcss.begin(), _gcss.end());
return true; return true;
} }
@ -229,7 +238,7 @@ QList<KV<int, QString> > GCS::list()
for (int i = 0; i < _gcss.size(); i++) { for (int i = 0; i < _gcss.size(); i++) {
const Entry &e = _gcss.at(i); const Entry &e = _gcss.at(i);
if (!e.id() || (i && e.id() == list.last().key())) if (!e.id() || (!list.isEmpty() && e.id() == list.last().key()))
continue; continue;
list.append(KV<int, QString>(e.id(), e.name() + " / Geographic 2D")); list.append(KV<int, QString>(e.id(), e.name() + " / Geographic 2D"));