当前位置: 首页 > news >正文

QGraphicsView实现简易地图3『局部加载-地图缩放』

前文链接:QGraphicsView实现简易地图2『瓦片经纬度』
第一篇文章提到过,当地图层级较大时,暴力全加载地图会造成程序卡顿,因此需要实现地图的局部加载。
实现思路:以地图窗口(以下称为视口)为地图展示区域,最理想情况是行列组成的瓦片地图正好与视口大小一致。然而,大多数情况下都需要行列组成的瓦片地图比视口大才能完整覆盖视口,因此需要合理计算瓦片地图的行数和列数,以最小行数和最小列数覆盖整个视口为最佳,以下将提供实现此需求的核心代码。
1、动态演示效果
在这里插入图片描述
2、静态展示图片
在这里插入图片描述

核心代码

void MapView::scaleScene()
{// 经纬度坐标转场景坐标、视图定位到鼠标中心QPointF scenePos = MapUtility::sceneCoordFromGeoCoord(m_wheelGeoCoord, m_curLevel);horizontalScrollBar()->setValue(scenePos.x() - m_offsetPos.x());verticalScrollBar()->setValue(scenePos.y() - m_offsetPos.y());// 视口宽度和高度int w = viewport()->width();int h = viewport()->height();// 瓦片像素点坐标、视口坐标QPointF pixelPos = MapUtility::tilePixelCoordFromScene(scenePos, m_curLevel);QPoint viewportPos = mapFromScene(scenePos);// 鼠标所在瓦片的四边 与 视口四边的距离int lPixel = viewportPos.x() - pixelPos.x();int rPixel = w - (viewportPos.x() + PIXMAP_SIZE - pixelPos.x());int tPixel = viewportPos.y() - pixelPos.y();int bPixel = h - (viewportPos.y() + PIXMAP_SIZE - pixelPos.y());// 计算鼠标所在瓦片的四边应该填充的完整图片数量、是否存在剩余像素int leftPixmapCount = lPixel / PIXMAP_SIZE;bool remainLeftPixel = lPixel % PIXMAP_SIZE;int rightPixmapCount = rPixel / PIXMAP_SIZE;bool remainRightPixel = rPixel % PIXMAP_SIZE;int topPixmapCount = tPixel / PIXMAP_SIZE;bool remainTopPixel = tPixel % PIXMAP_SIZE;int bottomPixmapCount = bPixel / PIXMAP_SIZE;bool remainBottomPixel = bPixel % PIXMAP_SIZE;// 计算呈现的瓦片地图左上角的瓦片坐标m_curTileCoord = MapUtility::tileCoordFromGeoCoord(m_wheelGeoCoord, m_curLevel);m_topLeftTileCoord.x = m_curTileCoord.x - leftPixmapCount;m_topLeftTileCoord.y = m_curTileCoord.y - topPixmapCount;if (remainLeftPixel && m_topLeftTileCoord.x > 0)m_topLeftTileCoord.x -= 1;if (remainTopPixel && m_topLeftTileCoord.y > 0)m_topLeftTileCoord.y -= 1;// 计算呈现的瓦片地图右下角的瓦片坐标m_bottomRightTileCoord.x = m_curTileCoord.x + rightPixmapCount;m_bottomRightTileCoord.y = m_curTileCoord.y + bottomPixmapCount;if (remainRightPixel && m_bottomRightTileCoord.x < pow(2, m_curLevel) - 1)m_bottomRightTileCoord.x += 1;if (remainBottomPixel && m_bottomRightTileCoord.y < pow(2, m_curLevel) - 1)m_bottomRightTileCoord.y += 1;// 加载瓦片QString dirPath = QString("F:/MapData/GaoDeMap/Map/MapPng/L0%1").arg(m_curLevel + 1);for (int row = m_topLeftTileCoord.y; row <= m_bottomRightTileCoord.y; ++row){for (int col = m_topLeftTileCoord.x; col <= m_bottomRightTileCoord.x; ++col){QString fileName = QString("%1/Map_%2-%3.png").arg(dirPath).arg(QString::number(row + 1).rightJustified(2, '0')).arg(QString::number(col + 1).rightJustified(2, '0'));QPixmap pixmap(fileName);QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);item->setPos(PIXMAP_SIZE * col, PIXMAP_SIZE * row);m_scene->addItem(item);m_mapItems[row][col] = item;}}
}
http://www.lryc.cn/news/111972.html

相关文章:

  • bash的特性(二)IO重定向与管道
  • elb 直接配置到后端服务器组
  • 安卓:BottomNavigationBar——底部导航栏控件
  • 十、用 ChatGPT 辅助写文章
  • 计算机毕设 深度学习猫狗分类 - python opencv cnn
  • 60多行代码仿制B站首页一个好看的卡片效果
  • Redis内网主从节点搭建
  • ESP32-C2开发板 ESP8684芯片 兼容ESP32-C3开发
  • Zebec 创始人 Sam 对话社区,“Zebec 生态发展”主题 AMA 回顾总结
  • 一台电脑给另外一台电脑共享网络
  • AAA 认证
  • jvm-程序计数器
  • NestJs Debug配置文件
  • 题解 | #C.idol!!# 2023牛客暑期多校6
  • 使用filebeat收集并解析springboot日志
  • P1993 小 K 的农场
  • Spring boot 集成 Skywalking 配置 || Skywalking 打不开【已解决】
  • 手把手教你使用 ftrace 对 Linux 系统进行 debug
  • 【练】要求定义一个全局变量 char buf[] = “1234567“,创建两个线程,不考虑退出条件,打印buf
  • iOS Viper架构(中文版)【看懂这篇就够了】
  • 深入理解缓存 TLB 原理
  • 获取k8s scale资源对象的命令
  • 基于ChatYuan-large-v2 语言模型 Fine-tuning 微调训练 广告生成 任务
  • SpringBoot集成Logback日志
  • MATLAB(R2023a)添加工具箱TooLbox的方法-以GPOPS为例
  • 助力618-Y的混沌实践之路 | 京东云技术团队
  • Python系统学习1-4-物理行、逻辑行、选择语句
  • 学习系统编程No.35【基于信号量的CP问题】
  • 词嵌入、情感分类任务
  • TypeScript使用技巧