RasterProcessTool/RasterMainWidgetGUI/RasterMainWidget/tmsprovider.h

182 lines
3.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include <QtMath>
#include <QSize>
#include <QString>
#include <QRunnable>
#include <QByteArray>
#include <QPointF>
#include <QImage>
#include <QObject>
#include <QSqlDatabase>
#include <layerprovider.h>
#include <pointxy.h>
namespace LAMPMainWidget
{
/*
* 瓦片的信息描述,用于在线程之间传递瓦片数据
*/
struct TileInfo
{
QPointF index;
QPoint position;
int zoom;
QPoint coord;
QString url;
QByteArray data;
};
// 在结构体定义后声明
Q_DECLARE_METATYPE(TileInfo);
/*
* 异步执行的瓦片下载任务
*/
class TileDownloadTask : public QObject, public QRunnable
{
Q_OBJECT
signals:
void tileReady(TileInfo tile);
public:
using tileReadyCallback = std::function<void( TileInfo )>;
explicit TileDownloadTask(TileInfo tile, tileReadyCallback=nullptr, QObject* parent = nullptr);
TileDownloadTask(const TileDownloadTask& other) = delete;
TileDownloadTask(TileDownloadTask&& other) = delete;
TileDownloadTask& operator=(const TileDownloadTask& other) = delete;
TileDownloadTask& operator=(TileDownloadTask&& other) = delete;
~TileDownloadTask() override = default;
public:
void run() override;
protected:
TileInfo mTile;
private:
tileReadyCallback mCallback;
};
class TmsProvider : public LayerProvider
{
Q_OBJECT
public:
explicit TmsProvider(QObject* parent = nullptr);
~TmsProvider() override;
public:
/*
* 获取瓦片的像素大小
* @return 瓦片大小一般为256*256
*/
virtual const QSize tileSize() const = 0;
/*
* 获取瓦片的url
* @param pos 瓦片的坐标
* @param zoom zoom值
* @return 瓦片的url失败时则为空字符串
*/
virtual QString tileUrl(const PointXY& pos, int zoom) const = 0;
/*
* 返回可显示的图像内容
* @return 图像对象
*/
const QImage preparedImage() const override { return *mImage; }
/*
* 判断是否有可显示图像内容
* @return 有则为true否则false
*/
bool hasContent() const override { return static_cast<bool>(mImage); }
/*
* 获取tms提供者的名称
* @return
*/
virtual const QString& id() const = 0;
public slots:
/*
* 创建下载任务
* @param rect 下载区域
* @param zoom zoom值
*/
void createTask(const QRectF& rect, int zoom) override;
/*
* 瓦片下载成功时处理函数
* @param tile 瓦片对象
*/
void tileReady(TileInfo tile);
protected:
/*
* 创建一个新的绘制对象
* @param rect
*/
void newImage(const QRectF& rect);
/*
* 从文件缓存获取瓦片
* @param pos 瓦片位置
* @param zoom 瓦片zoom值
* @return 瓦片数据
*/
virtual QByteArray getCache(const QPoint& pos, int zoom);
/*
* 添加瓦片进文件缓存
* @param pos 瓦片位置
* @param zoom 瓦片zoom值
* @return 是否成功
*/
virtual bool addCache(const QPoint& pos, int zoom, QByteArray data);
/*
* 判断缓存是否存在指定的瓦片数据
* @param pos 瓦片位置
* @param zoom zoom值
* @return 是否存在true则存在否则false
*/
virtual bool cacheContains(const QPoint& pos, int zoom);
/*
* 初始化文件缓存数据库
*/
virtual bool initCache();
protected:
/*
* 瓦片渲染对象,每次新建任务时都会重新构建该对象
*/
QImage* mImage;
/*
* 缓存数据库名称
*/
const QString mDbName{"LAMPMainWidget.sqlite"};
/*
* 缓存表名称
*/
const QString mTableName{"tiles"};
/*
* 缓存数据库的连接
*/
QSqlDatabase mDbConn;
};
}
inline uint qHash(const QPoint& p)
{
return qHash(qPow(p.x(), p.y()));
}