QAD::Map:
* add MapViewTileProviderBase - base class for tile server provider * migrate OSM to new class * add MapTiler provider * add offlineMode for MapView
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
#include "mapview.h"
|
||||
|
||||
#include "osm_downloader_p.h"
|
||||
#include "mapview_tile_cache_p.h"
|
||||
#include "mapview_tile_downloader_p.h"
|
||||
#include "osm_math_p.h"
|
||||
#include "osm_tile_cache_p.h"
|
||||
#include "qad_types.h"
|
||||
|
||||
#include <QGraphicsPixmapItem>
|
||||
@@ -18,10 +18,10 @@ const int tileSize = 256;
|
||||
|
||||
|
||||
MapView::MapView(QWidget * parent): QWidget(parent) {
|
||||
downloader = new OSMDownloader(this);
|
||||
cache = new OSMTileCache(this);
|
||||
downloader = new MapViewTileDownloader(this);
|
||||
cache = new MapViewTileCache(this);
|
||||
setMouseTracking(true);
|
||||
connect(cache, &OSMTileCache::tileReady, this, [this]() {
|
||||
connect(cache, &MapViewTileCache::tileReady, this, [this]() {
|
||||
if (!is_downloading) drawBackground();
|
||||
});
|
||||
int size = 16;
|
||||
@@ -92,16 +92,34 @@ void MapView::setCachePath(const QString & p) {
|
||||
}
|
||||
|
||||
|
||||
void MapView::setOfflineMode(bool yes) {
|
||||
is_offline = yes;
|
||||
cache->setOfflineMode(yes);
|
||||
}
|
||||
|
||||
|
||||
void MapView::setTileObsoleteTime(int secs) {
|
||||
cache->setTileObsoleteTime(secs);
|
||||
}
|
||||
|
||||
|
||||
void collectDownloadIndeces(OSMTileCache * cache,
|
||||
QQueue<OSM::TileIndex> & indeces,
|
||||
OSM::TileIndex index,
|
||||
int target_zoom_level,
|
||||
bool only_new) {
|
||||
void MapView::setTileProvider(MapViewTileProviderBase * p) {
|
||||
cache->clearCache();
|
||||
downloader->setTileProvider(p);
|
||||
drawBackground();
|
||||
}
|
||||
|
||||
|
||||
MapViewTileProviderBase * MapView::tileProvider() const {
|
||||
return downloader->tileProvider();
|
||||
}
|
||||
|
||||
|
||||
void collectDownloadIndeces(MapViewTileCache * cache,
|
||||
QQueue<OSM::TileIndex> & indeces,
|
||||
OSM::TileIndex index,
|
||||
int target_zoom_level,
|
||||
bool only_new) {
|
||||
if (only_new) {
|
||||
if (!cache->isTileFileExists(index)) indeces << index;
|
||||
} else
|
||||
@@ -118,7 +136,7 @@ void collectDownloadIndeces(OSMTileCache * cache,
|
||||
}
|
||||
|
||||
|
||||
void MapView::downloadCurrentView(int target_zoom_level, bool only_new) {
|
||||
void MapView::downloadCurrentView(int target_zoom_level, bool only_new, int parallel) {
|
||||
int sx = qMax(0, (int)floor(view_rect.left() * tiles_side));
|
||||
int sy = qMax(0, (int)floor(view_rect.top() * tiles_side));
|
||||
int ex = qMin(tiles_side, (int)ceil(view_rect.right() * tiles_side));
|
||||
@@ -141,7 +159,7 @@ void MapView::downloadCurrentView(int target_zoom_level, bool only_new) {
|
||||
std::atomic_int value(0);
|
||||
auto conn = connect(
|
||||
downloader,
|
||||
&OSMDownloader::tileDone,
|
||||
&MapViewTileDownloader::tileDone,
|
||||
this,
|
||||
[this, &dialog, &indeces, &value]() {
|
||||
// qDebug() << "done";
|
||||
@@ -160,8 +178,10 @@ void MapView::downloadCurrentView(int target_zoom_level, bool only_new) {
|
||||
downloader->clearQueue();
|
||||
});
|
||||
is_downloading = true;
|
||||
for (int i = 0; i < 1; ++i)
|
||||
for (int i = 0; i < parallel; ++i) {
|
||||
if (indeces.isEmpty()) break;
|
||||
downloader->queueTile(indeces.dequeue());
|
||||
}
|
||||
// dialog.exec();
|
||||
dialog.setModal(true);
|
||||
dialog.show();
|
||||
@@ -264,11 +284,13 @@ void MapView::drawBackground() {
|
||||
QPointF offset = view_rect.topLeft() * mins * scale_;
|
||||
p.setRenderHint(QPainter::SmoothPixmapTransform);
|
||||
p.setPen(Qt::white);
|
||||
QSizeF tile_size(tileSize, tileSize);
|
||||
if (downloader->tileProvider()) tile_size = downloader->tileProvider()->tileSize();
|
||||
for (int ix = sx; ix < ex; ++ix) {
|
||||
for (int iy = sy; iy < ey; ++iy) {
|
||||
QRectF r((ix)*ts, (iy)*ts, ts, ts);
|
||||
r.translate(-offset);
|
||||
QRectF px_rct(QPointF(), QSizeF(tileSize, tileSize));
|
||||
QRectF px_rct(QPointF(), tile_size /*QSizeF(tileSize, tileSize)*/);
|
||||
auto tile = cache->getTile((OSM::TileIndex){zoom_level, ix, iy}, px_rct);
|
||||
if (!tile.isEmpty()) {
|
||||
p.drawPixmap(r, tile.pixmap, px_rct);
|
||||
|
||||
Reference in New Issue
Block a user