1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-03-14 11:07:45 +01:00
GPXSee/src/map/IMG/mapdata.h

166 lines
3.6 KiB
C
Raw Normal View History

2021-04-10 15:27:40 +02:00
#ifndef IMG_MAPDATA_H
#define IMG_MAPDATA_H
2020-02-09 23:24:48 +01:00
#include <QList>
#include <QPointF>
#include <QCache>
#include <QMutex>
2020-02-09 23:24:48 +01:00
#include <QDebug>
#include "common/rectc.h"
#include "common/rtree.h"
#include "common/range.h"
#include "common/hash.h"
2020-02-09 23:24:48 +01:00
#include "label.h"
#include "raster.h"
#include "zoom.h"
2021-04-10 15:27:40 +02:00
namespace IMG {
2020-02-09 23:24:48 +01:00
class Style;
class SubDiv;
class SubFile;
class VectorTile;
class MapData
{
public:
struct Poly {
Poly() : oneway(false) {}
2020-02-09 23:24:48 +01:00
/* QPointF insted of Coordinates for performance reasons (no need to
duplicate all the vectors for drawing). Note, that we do not want to
2020-11-10 20:14:59 +01:00
ll2xy() the points in the MapData class as this can not be done in
2020-02-09 23:24:48 +01:00
parallel. */
QVector<QPointF> points;
Label label;
Raster raster;
2020-02-09 23:24:48 +01:00
quint32 type;
RectC boundingRect;
bool oneway;
2020-02-09 23:24:48 +01:00
bool operator<(const Poly &other) const
{return type > other.type;}
};
struct Point {
Point() : id(0), classLabel(false) {}
2020-02-09 23:24:48 +01:00
Coordinates coordinates;
Label label;
quint32 type;
quint64 id;
bool classLabel;
2020-02-09 23:24:48 +01:00
bool operator<(const Point &other) const
{return id < other.id;}
};
2021-10-02 09:24:00 +02:00
MapData(const QString &fileName);
virtual ~MapData();
2020-02-09 23:24:48 +01:00
const QString &name() const {return _name;}
const RectC &bounds() const {return _bounds;}
const Range &zooms() const {return _zoomLevels;}
2020-02-09 23:24:48 +01:00
const Style *style() const {return _style;}
void polys(const RectC &rect, int bits, QList<Poly> *polygons,
QList<Poly> *lines);
void points(const RectC &rect, int bits, QList<Point> *points);
void load();
void clear();
2021-10-02 09:24:00 +02:00
const QString &fileName() const {return _fileName;}
2020-02-09 23:24:48 +01:00
bool isValid() const {return _valid;}
QString errorString() const {return _errorString;}
protected:
typedef RTree<VectorTile*, double, 2> TileTree;
void computeZooms();
2021-10-02 09:24:00 +02:00
QString _fileName;
2020-02-09 23:24:48 +01:00
QString _name;
RectC _bounds;
SubFile *_typ;
Style *_style;
TileTree _tileTree;
QList<Zoom> _zooms;
Range _zoomLevels;
2020-02-09 23:24:48 +01:00
bool _valid;
QString _errorString;
private:
2020-11-10 20:14:59 +01:00
struct Polys {
Polys() {}
Polys(const QList<Poly> &polygons, const QList<Poly> &lines)
: polygons(polygons), lines(lines) {}
QList<Poly> polygons;
QList<Poly> lines;
};
typedef QCache<const SubDiv*, Polys> PolyCache;
typedef QCache<const SubDiv*, QList<Point> > PointCache;
2021-04-10 15:27:40 +02:00
struct PolyCTX
{
PolyCTX(const RectC &rect, const Zoom &zoom,
2021-04-10 15:27:40 +02:00
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
2023-05-21 09:14:19 +02:00
PolyCache *polyCache, QMutex *lock)
: rect(rect), zoom(zoom), polygons(polygons), lines(lines),
2023-05-21 09:14:19 +02:00
polyCache(polyCache), lock(lock) {}
2021-04-10 15:27:40 +02:00
const RectC &rect;
const Zoom &zoom;
2021-04-10 15:27:40 +02:00
QList<MapData::Poly> *polygons;
QList<MapData::Poly> *lines;
PolyCache *polyCache;
2023-05-21 09:14:19 +02:00
QMutex *lock;
2021-04-10 15:27:40 +02:00
};
struct PointCTX
{
PointCTX(const RectC &rect, const Zoom &zoom,
2023-05-21 09:14:19 +02:00
QList<MapData::Point> *points, PointCache *pointCache, QMutex *lock)
: rect(rect), zoom(zoom), points(points), pointCache(pointCache),
lock(lock) {}
2021-04-10 15:27:40 +02:00
const RectC &rect;
const Zoom &zoom;
2021-04-10 15:27:40 +02:00
QList<MapData::Point> *points;
PointCache *pointCache;
2023-05-21 09:14:19 +02:00
QMutex *lock;
2021-04-10 15:27:40 +02:00
};
const Zoom &zoom(int bits) const;
2021-04-10 15:27:40 +02:00
static bool polyCb(VectorTile *tile, void *context);
static bool pointCb(VectorTile *tile, void *context);
PolyCache _polyCache;
PointCache _pointCache;
QMutex _lock;
2020-11-10 20:14:59 +01:00
friend class VectorTile;
2020-02-09 23:24:48 +01:00
};
2021-04-10 15:27:40 +02:00
}
2020-02-09 23:24:48 +01:00
#ifndef QT_NO_DEBUG
2021-04-10 15:27:40 +02:00
inline QDebug operator<<(QDebug dbg, const IMG::MapData::Point &point)
2020-02-09 23:24:48 +01:00
{
dbg.nospace() << "Point(" << point.type << ", " << point.label << ")";
2020-02-09 23:24:48 +01:00
return dbg.space();
}
2021-04-10 15:27:40 +02:00
inline QDebug operator<<(QDebug dbg, const IMG::MapData::Poly &poly)
2020-02-09 23:24:48 +01:00
{
dbg.nospace() << "Poly(" << poly.type << ", " << poly.label << ")";
2020-02-09 23:24:48 +01:00
return dbg.space();
}
#endif // QT_NO_DEBUG
2021-04-10 15:27:40 +02:00
#endif // IMG_MAPDATA_H