#include #include #include #include #include #include #include #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(&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(&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(width), static_cast(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& tiles, QSize& size) const { auto pd = dynamic_cast(&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() << "下载区边界错误"; 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; } }