提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
一、墨卡托瓦片是什么?
墨卡托瓦片是目前常用的一种地图投影生成的金字塔结构的图片组。我们可以以此构建类似于百度地图的地理服务系统。
二、开发环境
Qt5.12.3、Qt creater4.9.0。
三、已实现功能
地图的放大、缩小、平移与鼠标拖拽。
四、源代码
1.TMSMap.h
代码如下(示例):
#define TMSMAP_H
#include <QLabel>
#include <QPointF>
#include <QMouseEvent>
#include <QWheelEvent>
#include "MainWindow.h"
class MainWindow;
class TMSMap:public QLabel
{
public:
Q_OBJECT
public:
TMSMap(QWidget *parent=nullptr);
signals:
void sig_transferLoc(double lati,double lon);
void sig_moveMap(bool enabled);
void sig_offset(double xOffst,double yOffset);
void sig_zoom(bool zoom);
protected:
virtual void mouseMoveEvent(QMouseEvent* event);
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
virtual void wheelEvent(QWheelEvent* event);
private:
double pixelToXCoord(double value);
double pixelToYCoord(double value);
private:
QPointF mMousePf;
QPointF mOffset;
};
#endif // TMSMAP_H
2.TMSMap.cpp
代码如下(示例):
#include "TMSMap.h"
#include <QtCore/qmath.h>
TMSMap::TMSMap(QWidget* parent):QLabel(parent)
{
this->setMouseTracking(true);
}
void TMSMap::mouseMoveEvent(QMouseEvent *event)
{
QLabel::mouseMoveEvent(event);
mOffset = QPointF(MainWindow::mXOffset + mMousePf.x() - event->localPos().x(),
MainWindow::mYOffset + event->localPos().y() - mMousePf.y());
emit sig_offset(mMousePf.x() - event->localPos().x(),event->localPos().y() - mMousePf.y());
mMousePf = event->localPos();
emit sig_transferLoc(pixelToXCoord(mMousePf.x()),
pixelToYCoord(mMousePf.y()));
}
void TMSMap::mousePressEvent(QMouseEvent *event)
{
QLabel::mousePressEvent(event);
emit sig_moveMap(true);
}
void TMSMap::mouseReleaseEvent(QMouseEvent *event)
{
QLabel::mouseReleaseEvent(event);
emit sig_moveMap(false);
}
void TMSMap::wheelEvent(QWheelEvent *event)
{
QLabel::wheelEvent(event);
if(event->delta() < 0 && MainWindow::mZoom > 0)
{
emit sig_zoom(false);
}
else if(event->delta() > 0 && MainWindow::mZoom < 11)
{
emit sig_zoom(true);
}
}
double TMSMap::pixelToXCoord(double value)
{
double length = pow(0.5,MainWindow::mZoom) * LENGTH_X;
double scale = length / IMAGEWIDEH;
double originX = ORIGIN_X + MainWindow::mPointX * length;
return (originX + (mOffset.x() + value) * scale) * 360.0 / LENGTH_X;
}
double TMSMap::pixelToYCoord(double value)
{
double length = pow