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;
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/62891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何搭建WordPress博客网站,并且发布至公网上?

如何搭建WordPress博客网站&#xff0c;并且发布至公网上&#xff1f; 文章目录 如何搭建WordPress博客网站&#xff0c;并且发布至公网上&#xff1f;概述前置准备1 安装数据库管理工具1.1 安装图形图数据库管理工具&#xff0c;SQL_Front 2 创建一个新数据库2.1 创建数据库2.…

(树) 剑指 Offer 32 - III. 从上到下打印二叉树 III ——【Leetcode每日一题】

❓剑指 Offer 32 - III. 从上到下打印二叉树 III 难度&#xff1a;中等 请实现一个函数按照之字形顺序打印二叉树&#xff0c;即第一行按照从左到右的顺序打印&#xff0c;第二层按照从右到左的顺序打印&#xff0c;第三行再按照从左到右的顺序打印&#xff0c;其他行以此类推…

langchain-ChatGLM源码阅读:参数设置

文章目录 上下文关联对话轮数向量匹配 top k控制生成质量的参数参数设置心得 上下文关联 上下文关联相关参数&#xff1a; 知识相关度阈值score_threshold内容条数k是否启用上下文关联chunk_conent上下文最大长度chunk_size 其主要作用是在所在文档中扩展与当前query相似度较高…

0基础学习VR全景平台篇 第78篇:全景相机-拍摄VR全景

新手入门圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享…

wordpress 打开缓慢处理

gravatar.com 头像网站被墙 追踪发现请求头像时长为21秒 解决方案一 不推荐&#xff0c;容易失效&#xff0c;网址要是要稳定为主&#xff0c;宁愿头像显示异常&#xff0c;也不能网址打不开 网上大部分搜索到的替换的CDN网址都过期了&#xff0c;例如&#xff1a;gravatar.du…

LangChain+ChatGLM整合LLaMa模型(二)

开源大模型语言LLaMa LLaMa模型GitHub地址添加LLaMa模型配置启用LLaMa模型 LangChainChatGLM大模型应用落地实践&#xff08;一&#xff09; LLaMa模型GitHub地址 git lfs clone https://huggingface.co/huggyllama/llama-7b添加LLaMa模型配置 在Langchain-ChatGLM/configs/m…

Python读取及生成pb文件,pb与jsonStr互转,pb与dictJson互转,打包.exe/.sh并转换,很完美跨平台

Python读取及生成pb文件&#xff0c;pb与jsonStr互转&#xff0c;pb与dictJson互转&#xff0c;打包.exe/.sh并转换&#xff0c;很完美跨平台 1. 效果图2. 命令行&#xff1a;proto文件转.class&#xff08;绝对路径或相对路径&#xff09;3. 序列化、反序列化api4. pb转json&a…

Python爬虫异常处理心得:应对网络故障和资源消耗

作为一名专业的爬虫代理&#xff0c;我知道在爬取数据的过程中&#xff0c;遇到网络故障和资源消耗问题是再正常不过了。今天&#xff0c;我将与大家分享一些关于如何处理这些异常情况的心得和技巧。不论你是在处理网络不稳定还是资源消耗过大的问题&#xff0c;这些技巧能够帮…

聊聊 Docker 和 Dockerfile

目录 一、前言 二、了解Dockerfile 三、Dockerfile 指令 四、多阶段构建 五、Dockerfile 高级用法 六、小结 一、前言 对于开发人员来说&#xff0c;会Docker而不知道Dockerfile等于不会Docker&#xff0c;上一篇文章带大家学习了Docker的基本使用方法&#xff1a;《一文…

vue 老项目 npm install 报错Python,c++等相关错误

​​​ 老项目npm install 下载依赖包报错 解决方法&#xff1a; //下载python 1、 npm install --global --production windows-build-tools//配置环境 &#xff1a; 也可暂时不用配置,能用就不用配置&#xff08;npm config set python "D:\Python27\python.exe&q…

一键开启ChatGPT“危险发言”

‍ ‍ 大数据文摘授权转载自学术头条 作者&#xff1a;Hazel Yan 编辑&#xff1a;佩奇 随着大模型技术的普及&#xff0c;AI 聊天机器人已成为社交娱乐、客户服务和教育辅助的常见工具之一。 然而&#xff0c;不安全的 AI 聊天机器人可能会被部分人用于传播虚假信息、操纵舆…

8.7工作总结

一、我们想自定义一个titileBar出现如下这种情况&#xff0c;发现他原来的titileBar还未隐藏。 后来我尝试修改主题使得他没有主题noActionBar发现也不行&#xff0c;后来我参考原先我看过的项目使用了如下代码 this.getActionBar().hide();发现会报这个错误java.lang.NullPoi…

HTTPS-RSA握手

RSA握手过程 HTTPS采用了公钥加密和对称加密结合的方式进行数据加密和解密 RSA握手是HTTPS连接建立过程中的一个关键步骤&#xff0c;用于确保通信双方的身份验证和生成对称加密所需的密钥 通过RSA握手过程&#xff0c;客户端和服务器可以协商出一个共享的对称密钥&#xff0c;…

使用pg_prewarm缓存PostgreSQL数据库表

pg_prewarm pg_prewarm 直接利用系统缓存的代码,对操作系统发出异步prefetch请求&#xff0c;在应用中&#xff0c;尤其在OLAP的情况下&#xff0c;对于大表的分析等等是非常耗费查询的时间的&#xff0c;而即使我们使用select table的方式&#xff0c;这张表也并不可能将所有…

SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

目录 1 微服务1.1 微服务的演变1.2 微服务1.3 SpringCloud1.4 小结 2 服务拆分及远程调用2.1 服务拆分2.2 服务拆分案例2.3 实现远程调用2.4 提供者与消费者 3 Eureka注册中心3.1 Eureka的结构和作用3.2 搭建eureka-server3.3 服务注册3.4 服务发现 4 Ribbon负载均衡4.1 负载均…

rust基础

这是笔者学习rust的学习笔记&#xff08;如有谬误&#xff0c;请君轻喷&#xff09; 参考视频&#xff1a; https://www.bilibili.com/video/BV1hp4y1k7SV参考书籍&#xff1a;rust程序设计语言&#xff1a;https://rust.bootcss.com/title-page.htmlmarkdown地址&#xff1a;h…

【雕爷学编程】Arduino动手做(192)---Air724UG Cat1 物联网4G模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

坐标转换-使用geotools读取和转换地理空间表的坐标系(sqlserver、postgresql)

前言&#xff1a; 业务上通过GIS软件将空间数据导入到数据库时&#xff0c;因为不同的数据来源和软件设置&#xff0c;可能导入到数据库的空间表坐标系是各种各样的。 如果要把数据库空间表发布到geoserver并且统一坐标系&#xff0c;只是在geoserver单纯的设置坐标系只是改了…

[PyTorch][chapter 46][LSTM -1]

前言&#xff1a; 长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种时间循环神经网络&#xff0c;是为了解决一般的RNN&#xff08;循环神经网络&#xff09;存在的长期依赖问题而专门设计出来的。 目录&#xff1a; 背景简介 LSTM C…

【windows】windows上如何使用linux命令?

前言 windows上的bat命令感觉不方便&#xff0c;想在windows上使用linux命令。 有人提供了轮子&#xff0c;本文简单介绍一些该轮子的安装与使用&#xff0c;希望能够帮助到和我有一起需求的网友。 我的答案是busybox。 1.安装busybox.exe 在这个网站上安装busybox busyb…