97 lines
2.6 KiB
C++
97 lines
2.6 KiB
C++
#include <QSize>
|
|
#include <QRectF>
|
|
#include <QObject>
|
|
#include <QHash>
|
|
|
|
#include <tmslayer.h>
|
|
#include <tmsprovider.h>
|
|
#include <LAMPMainWidget.h>
|
|
#pragma execution_character_set("utf-8")
|
|
|
|
namespace LAMPMainWidget {
|
|
|
|
TmsLayer::TmsLayer(LAMPMainWidget::TmsProviders provider,
|
|
const QString& id,
|
|
LAMPMainWidget::MapCanvas* mapCanvas,
|
|
LAMPMainWidget::CRS* crs)
|
|
: MapLayer(id, crs, mapCanvas) {
|
|
setProvider(TmsProviderFactory::create(provider));
|
|
}
|
|
|
|
double TmsLayer::resolution() const {
|
|
auto pd = dynamic_cast<const TmsProvider*>(&provider());
|
|
auto sz = pd->tileSize();
|
|
double length = crs().extent().width();
|
|
double result = length / ((power2(zoomValue())) * sz.width());
|
|
|
|
#ifdef DEBUG
|
|
qDebug() << "resolution=>" << result;
|
|
#endif
|
|
|
|
return result;
|
|
}
|
|
|
|
QRectF TmsLayer::extent() const {
|
|
auto pd = dynamic_cast<const TmsProvider*>(&provider());
|
|
QSize sz = pd->tileSize();
|
|
|
|
int width = power2(zoomValue()) * sz.width();
|
|
int height = power2(zoomValue()) * sz.height();
|
|
|
|
//#ifdef DEBUG
|
|
qDebug() << "layer extent=>{width:" << width << ", height:" << height << "}";
|
|
//#endif
|
|
|
|
return { 0, 0, static_cast<qreal>(width), static_cast<qreal>(height) };
|
|
}
|
|
|
|
void TmsLayer::setZoomValue(int zoom) {
|
|
int zoomValue{};
|
|
if (zoom <= minZoom()) {
|
|
zoomValue = minZoom();
|
|
}
|
|
else if (zoom >= maxZoom()) {
|
|
zoomValue = maxZoom();
|
|
}
|
|
else {
|
|
zoomValue = zoom;
|
|
}
|
|
|
|
mZoomValue = zoomValue;
|
|
}
|
|
|
|
bool TmsLayer::parseTiles(const QRectF& rect, int zoom, QHash<QPoint, QString>& tiles, QSize& size) const {
|
|
|
|
auto pd = dynamic_cast<const TmsProvider*>(&provider());
|
|
auto tileSize = pd->tileSize();
|
|
auto resolution = mCrs->extent().width() / ((power2(zoom)) * tileSize.width());
|
|
|
|
auto crsLeftTop = mCrs->forward(PointXY(rect.topLeft()));
|
|
auto crsRightBottom = mCrs->forward(PointXY(rect.bottomRight()));
|
|
|
|
auto mapLeftTop = QPointF(crsLeftTop.x() / resolution, crsLeftTop.y() / resolution);
|
|
auto mapRightBottom = QPointF(crsRightBottom.x() / resolution, crsRightBottom.y() / resolution);
|
|
auto xMin = qFloor(mapLeftTop.x() / tileSize.width());
|
|
auto xMax = qFloor(mapRightBottom.x() / tileSize.width());
|
|
auto yMin = qFloor(mapLeftTop.y() / tileSize.height());
|
|
auto yMax = qFloor(mapRightBottom.y() / tileSize.height());
|
|
if ((xMin > xMax) || (yMin > yMax)) {
|
|
qDebug() << u8"下载区边界错误";
|
|
return false;
|
|
}
|
|
|
|
size.setWidth((xMax - xMin + 1) * tileSize.width());
|
|
size.setHeight((yMax - yMin + 1) * tileSize.height());
|
|
|
|
for (int i = xMin; i <= xMax; ++i) {
|
|
for (int j = yMin; j <= yMax; ++j) {
|
|
auto url = pd->tileUrl(PointXY(i, j), zoom);
|
|
tiles.insert(QPoint(i - xMin, j - yMin), url);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|