QGraphicsView实现简易地图11『指定层级-定位坐标』
前文链接:QGraphicsView实现简易地图10『自适应窗口大小』
提供一个地图初始化函数,指定地图显示的中心点和地图缩放层级
能够让地图显示某一层级的瓦片,并将中心点坐标显示在视图中心。
1、动态演示效果
7级地图-大连-老虎滩 定位到 8级地图-台湾-台北
2、指定层级-定位坐标的代码
注:WHMapView继承自MapView
void WHMapView::centerAndZoom(const GeoCoord&geoCenter, int zoom)
{m_geoCoord = geoCenter;m_curLevel = zoom - 1;MapDataManager::instance()->setMapLevel(m_curLevel);double len = MapUtility::sceneSize(m_curLevel);setSceneRect(QRect(0, 0, len, len));// 经纬度坐标转场景坐标、视图定位到中心点QPointF offsetPos = QPointF(viewport()->width() / 2.0, viewport()->height() / 2.0);QPointF scenePos = MapUtility::sceneCoordFromGeoCoord(m_geoCoord, m_curLevel);horizontalScrollBar()->setValue(scenePos.x() - offsetPos.x());verticalScrollBar()->setValue(scenePos.y() - offsetPos.y());scaleScene();updateOtherItemPos();
}void MapView::scaleScene()
{// 前面省略与计算无关的代码...// 视口宽度和高度int w = viewport()->width();int h = viewport()->height();// 瓦片像素点坐标、视口坐标QPointF scenePos = MapUtility::sceneCoordFromGeoCoord(m_geoCoord, m_curLevel);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_geoCoord, m_curLevel);m_topLeftTileCoord.x = qMax(m_curTileCoord.x - leftPixmapCount, 0);m_topLeftTileCoord.y = qMax(m_curTileCoord.y - topPixmapCount, 0);if (remainLeftPixel && m_topLeftTileCoord.x > 0)m_topLeftTileCoord.x -= 1;if (remainTopPixel && m_topLeftTileCoord.y > 0)m_topLeftTileCoord.y -= 1;// 计算呈现的瓦片地图右下角的瓦片坐标int mapSideCount = MapUtility::mapSideCount(m_curLevel);m_bottomRightTileCoord.x = qMin(m_curTileCoord.x + rightPixmapCount, mapSideCount - 1);m_bottomRightTileCoord.y = qMin(m_curTileCoord.y + bottomPixmapCount, mapSideCount - 1);if (remainRightPixel && m_bottomRightTileCoord.x < mapSideCount - 1)m_bottomRightTileCoord.x += 1;if (remainBottomPixel && m_bottomRightTileCoord.y < mapSideCount - 1)m_bottomRightTileCoord.y += 1;// 计算瓦片集合,视口最小瓦片集合+周边瓦片集合vector<TileCoord> vecTileCoord;m_viewAndAroundTileRect = CommonUtility::getViewAndAroundTileCoords(m_topLeftTileCoord.y, m_topLeftTileCoord.x, m_bottomRightTileCoord.y, m_bottomRightTileCoord.x, m_curLevel, vecTileCoord);//showTileCoord();showGraticules();// 上方即为计算瓦片索引的核心代码,省略下方加载瓦片的代码...// 加载瓦片代码...
}
相关文章:

QGraphicsView实现简易地图11『指定层级-定位坐标』
前文链接:QGraphicsView实现简易地图10『自适应窗口大小』 提供一个地图初始化函数,指定地图显示的中心点和地图缩放层级 能够让地图显示某一层级的瓦片,并将中心点坐标显示在视图中心。 1、动态演示效果 7级地图-大连-老虎滩 定位到 8级地图…...

UE5 蓝图入门
基础节点创建: 常量: 按住 1 ,点击鼠标左键,创建常量 二维向量: 按住 2 ,点击鼠标左键,创建二维向量 三维向量: 按住 3 ,点击鼠标左键 乘法: 按住 m 键…...
英语单词学习
house of worship:宗教场所 dote: 喜爱 coffin:棺材 coffeine:咖啡因 expedient:权宜的 buster:破坏者 procrastinate: 拖延 gourmet:美食家 expound:阐述 narcissist:自我陶醉 assassinate:暗杀 salvage: 挽救 savage: 凶猛的 ulcer: 溃疡 obituary:讣告 arbitrary:武断的 abu…...

使用Python编写自动化测试代码规范整理
大家好,我们平时在写自动化测试脚本或者性能测试脚本时,需要注意代码规范,提高代码的可读性与维护性,之前给大家分享过pycharm的两个插件,大家可以参考:Pycharm代码规范与代码格式化插件安装 本文中主要从自…...
实验七 SJK数据库定义与操纵
实验题目 实验七 SJK数据库定义与操纵 实验时间 2023.5.17 实验地点 软件工程基础实验室 实验课时 2 实验目的 了解并掌握数据库定义与操纵的知识并能熟练应用 实验要求 熟练掌握和使用PL-SQL建立数据库基本表,使用PL/SQL developer操作数据库&a…...

Win10环境下yolov8快速配置与测试-详细
0.0 说明 参考黄家驹的Win10 环境下YOLO V8部署,遇到一些问题,并解决实现,记录如下: 斜线字体是原博客中的创作 0.1 参考链接 https://blog.csdn.net/m0_72734364/article/details/128865904 1 Windows10下yolov8 tensorrt模型加速部署 …...
C++面向对象学习笔记一
本文阅读下述文章,顺手记录学习《C面向对象程序设计》✍千处细节、万字总结(建议收藏)_c面向对象程序设计千处细节-CSDN博客 目录 前言 正文 浅拷贝和深拷贝 向函数传递对象 静态数据成员和静态成员函数 友元 友元函数 1、将非成员函数声明…...

C++容器之vector类
目录 1.vector的介绍及使用1.1vector的介绍1.2vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.4 vector 增删查改1.2.5vector 迭代器失效问题1.2.6 vector 在OJ中的使用。 2.vector深度剖析及模拟实现2.1 std::vector的核心框架接口…...
什么是MVCC?
MVCC是一种数据库的并发控制策略,就是为了解决多个用户同时访问数据库修改同一数据所造成的问题,如何解决这个问题了? 就是通过创建同一个数据的不同的版本,通过创建时间的不同,最后进行数据合并,其就不用给数据库上锁了,其实数据库的锁,虽然说InnoDB已经非常牛逼了,可以使用行…...
数据结构队列学习
引入 众说周知,在队列的题目中,队头指针(front)和队尾指针(rear)有两种指示方法。 (1)队头指针 ①指向队头元素 ②指向队头元素元素的前一个位置 (2)队尾指针 ①指向队尾元素 ②指向队尾元素的后一个位置 指…...

Javaweb第五次作业
poet数据库sql语言 create table poet(id int unsigned primary key auto_increment comment ID,name varchar(10) not null comment 姓名,gender tinyint unsigned not null comment 性别, 说明: 1 男, 2 女,dynasty varchar(10) not null comment朝代,title varchar(20) not…...

BetterMouse for Mac激活版:鼠标增强软件
BetterMouse for Mac是一款鼠标增强软件,旨在取代笨重的、侵入性的和耗费资源的鼠标驱动程序,如罗技选项。它功能丰富,重量轻,效率优化,而且完全隐私安全,试图满足你在MacOS上使用第三方鼠标的所有需求。 B…...

红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)
目录 背景准备工具硬件(自己准备)软件(我会在文末提供链接) 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 B…...
MySQL中的事务隔离级别
事务隔离级别 未提交读(Read uncommitted)是最低的隔离级别。通过名字我们就可以知道,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。提交读(Read committed)也可以翻译成读已提交…...
多线程应用实战
文章目录 1、如何实现多线程交替打印字母和数字,打印效果:A1B2C3D4...AutomicBlockingQueueReentrantLockLockSupportSynchronizedWaitNotifyTransferQueueWay 2、实现多个线程顺序打印abc3、实现阻塞队列 1、如何实现多线程交替打印字母和数字ÿ…...
selenium解放双手--记某电力学校的刷课脚本
免责声明:本文仅做技术交流与学习... 重难点: 1-对目标网站的html框架具有很好的了解,定位元素,精准打击. 2-自动化过程中窗口操作的转换. 前置知识: python--selenium模块的操作使用 前端的html代码 验证码自动化操作 Chrome & Chromedriver : Chrome for Testing ava…...

JDK 17有可能代替 JDK 8 吗
不好说,去 Oracle 化是很多公司逐步推进的政策。 JVM 有 OpenJ9。很多公司可能会用 IBM 的版本。 JDK 这东西,能用就不会升级。 JDK 太基础了,决定了后面的很多 jar 的版本。 https://www.ossez.com/t/jdk-17-jdk-8/14102...
代码随想录算法训练营第36期DAY23
DAY23 530二叉搜索树的最小绝对差 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(null…...
Leetcode 3128. Right Triangles
Leetcode 3128. Right Triangles 1. 解题思路2. 代码实现 题目链接:3128. Right Triangles 1. 解题思路 这一题的话对于任意一个位置,如果该位置为1,假设其所在行中1的个数 r i r_i ri,所在列中1的个数为 c j c_j cj&#…...
力扣经典150题第五十三题:基本计算器
目录 力扣经典150题第五十六题:基本计算器示例提示解题思路 力扣经典150题第五十六题:基本计算器 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...

代理服务器-LVS的3种模式与调度算法
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件:…...