5 #include <QSqlDatabase>
7 #include <QImageReader>
10 #include <QtConcurrent>
16 MBTile(int zoom
, int overzoom
, int scaledSize
, const QPoint
&xy
,
17 const QByteArray
&data
, const QString
&key
) : _zoom(zoom
),
18 _overzoom(overzoom
), _scaledSize(scaledSize
), _xy(xy
), _data(data
),
21 const QPoint
&xy() const {return _xy
;}
22 const QString
&key() const {return _key
;}
23 const QPixmap
&pixmap() const {return _pixmap
;}
26 QByteArray
format(_overzoom
27 ? QByteArray::number(_zoom
) + ';' + QByteArray::number(_overzoom
)
28 : QByteArray::number(_zoom
));
29 QBuffer
buffer(&_data
);
30 QImageReader
reader(&buffer
, format
);
32 reader
.setScaledSize(QSize(_scaledSize
, _scaledSize
));
33 _pixmap
= QPixmap::fromImage(reader
.read());
46 class MBTilesMapJob
: public QObject
51 MBTilesMapJob(const QList
<MBTile
> &tiles
) : _tiles(tiles
) {}
55 connect(&_watcher
, &QFutureWatcher
<void>::finished
, this,
56 &MBTilesMapJob::handleFinished
);
57 _future
= QtConcurrent::map(_tiles
, &MBTile::load
);
58 _watcher
.setFuture(_future
);
60 void cancel(bool wait
)
64 _future
.waitForFinished();
66 const QList
<MBTile
> &tiles() const {return _tiles
;}
69 void finished(MBTilesMapJob
*job
);
72 void handleFinished() {emit
finished(this);}
75 QFutureWatcher
<void> _watcher
;
76 QFuture
<void> _future
;
80 class MBTilesMap
: public Map
85 MBTilesMap(const QString
&fileName
, QObject
*parent
= 0);
87 QString
name() const {return _name
;}
90 RectC
llBounds() {return _bounds
;}
91 qreal
resolution(const QRectF
&rect
);
93 int zoom() const {return _zi
;}
94 void setZoom(int zoom
) {_zi
= zoom
;}
95 int zoomFit(const QSize
&size
, const RectC
&rect
);
99 QPointF
ll2xy(const Coordinates
&c
);
100 Coordinates
xy2ll(const QPointF
&p
);
102 void draw(QPainter
*painter
, const QRectF
&rect
, Flags flags
);
104 void load(const Projection
&in
, const Projection
&out
, qreal deviceRatio
,
108 bool isValid() const {return _valid
;}
109 QString
errorString() const {return _errorString
;}
111 static Map
*create(const QString
&path
, const Projection
&proj
, bool *isDir
);
114 void jobFinished(MBTilesMapJob
*job
);
118 Zoom() : z(-1), base(-1) {}
119 Zoom(int z
, int base
) : z(z
), base(base
) {}
125 bool getMinZoom(int &zoom
);
126 bool getMaxZoom(int &zoom
);
130 void getTileFormat();
131 void getTilePixelRatio();
133 qreal
tileSize() const;
134 qreal
coordinatesRatio() const;
135 qreal
imageRatio() const;
136 QByteArray
tileData(int zoom
, const QPoint
&tile
) const;
137 void drawTile(QPainter
*painter
, QPixmap
&pixmap
, QPointF
&tp
);
138 bool isRunning(const QString
&key
) const;
139 void runJob(MBTilesMapJob
*job
);
140 void removeJob(MBTilesMapJob
*job
);
141 void cancelJobs(bool wait
);
142 QPointF
tilePos(const QPointF
&tl
, const QPoint
&tc
, const QPoint
&tile
,
143 unsigned overzoom
) const;
145 friend QDebug
operator<<(QDebug dbg
, const Zoom
&zoom
);
151 QVector
<Zoom
> _zooms
, _zoomsBase
;
154 qreal _mapRatio
, _tileRatio
;
158 QList
<MBTilesMapJob
*> _jobs
;
161 QString _errorString
;
164 #endif // MBTILESMAP_H