QT使用QML实现地图绘制虚线

news2024/12/23 16:36:58

QML提供了MapPolyline用于在地图上绘制线段,该线段是实线,因此我使用Canvas自定义绘制的方式在地图上绘制线段,如图:

鼠标在地图上点击后,在点击位置添加图标 ,当有多个图标被添加到地图上后,计算各个图标间的距离,并创建一个新的虚线线段组件,连接两个图标点,显示距离数值。如果对自定义图标添加拖动属性,效果如图:

MapDashLine.qml属性:

  • beginCoordinate:线段起始经纬度坐标

  • endCoordinate:线段终点经纬度坐标

  • lineDash:虚线样式

  • lineColor:虚线颜色

  • lineWidth:虚线粗细

  • textColor:显示距离文字颜色

  • textPixelSize:字体大小

MapDashLine.qml源码(我使用的是Qt5.15):

import QtQuick 2.15
import QtPositioning 5.15
 
Item {
    id:mapDashLine
    anchors.fill: parent
    property var beginCoordinate: QtPositioning.coordinate()
    property var endCoordinate: QtPositioning.coordinate()
    property var lineDash: [4,4]
    property color lineColor: "crimson"
    property int lineWidth: 2
    property color textColor: "crimson"
    property int textPixelSize: 14
    readonly property var mapItem: mapDashLine.parent
 
 
    Canvas{
        id:myCanvas
        anchors.fill: parent
        onPaint: {
            if(!mapDashLine.beginCoordinate.isValid || !mapDashLine.endCoordinate.isValid)
                return
            var ctx = getContext("2d")
            ctx.clearRect(0,0,myCanvas.width,myCanvas.height)
            ctx.strokeStyle = mapDashLine.lineColor
            ctx.lineWidth = mapDashLine.lineWidth
            ctx.setLineDash(mapDashLine.lineDash)
            //**绘制虚线
            ctx.beginPath()
            var beginPos = mapDashLine.mapItem.fromCoordinate(mapDashLine.beginCoordinate,false)
            ctx.moveTo(beginPos.x,beginPos.y)
            var endPos = mapDashLine.mapItem.fromCoordinate(mapDashLine.endCoordinate,false)
            ctx.lineTo(endPos.x,endPos.y)
            ctx.stroke()
            ctx.save()
            //**绘制文字
            var azimuth = endCoordinate.azimuthTo(beginCoordinate)
            if(azimuth>=180)
                azimuth = azimuth - 180
            var distance = endCoordinate.distanceTo(beginCoordinate)
            var text = (distance/1000).toFixed(0)+"Km"
            ctx.fillStyle = mapDashLine.textColor
            ctx.font = mapDashLine.textPixelSize+"px Arial"
            ctx.textAlign = "center"
            var centerX =  (beginPos.x+endPos.x)/2
            var centerY = (beginPos.y+endPos.y)/2
            ctx.translate(centerX,centerY)
            ctx.rotate(azimuth*Math.PI/180-Math.PI/2)
            ctx.fillText(text,0,-mapDashLine.textPixelSize/2)
            ctx.restore()
        }
    }
 
    onBeginCoordinateChanged: {
        update()
    }
    onEndCoordinateChanged: {
        update()
    }
    onLineDashChanged: {
        update()
    }
    onLineColorChanged: {
        update()
    }
    onLineWidthChanged: {
        update()
    }
    onTextColorChanged: {
        update()
    }
    onTextPixelSizeChanged: {
        update()
    }
 
    Connections{
        target: mapDashLine.mapItem
        function onZoomLevelChanged(){
            update()
        }
        function onVisibleRegionChanged(){
            update()
        }
    }
 
    function update(){
        myCanvas.requestPaint()
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openGauss学习笔记-40 openGauss 高级数据管理-锁

文章目录 openGauss学习笔记-40 openGauss 高级数据管理-锁40.1 语法格式40.2 参数说明40.3 示例 openGauss学习笔记-40 openGauss 高级数据管理-锁 如果需要保持数据库数据的一致性,可以使用LOCK TABLE来阻止其他用户修改表。 例如,一个应用需要保证表…

MTK Android非常用分辨率修改充电动画

非标准分辨率的屏,配置MTK Android的关机充电动画. 环境 芯片 MTK 系统 Android 服务器 ubuntu 屏幕分辨率356*400,不是常见的分辨率. 原始充电动画显示异常,画面扭曲. 方法 确定使用的图片 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo 这个目录下…

05-基础入门-系统及数据库等

基础入门-系统及数据库等 一、操作系统层面1、识别操作系统常见方法2、简要两者区别及识别意义3、操作系统层面漏洞类型对应意义4、简要操作系统层面漏洞影响范围 二、数据库层面1、识别数据库类型常见方法2、数据库类型区别及识别意义3、数据库常见漏洞类型及攻击4、简要数据库…

【【STM32之GPIO】】

STM32之GPIO 学完了正点原子自带的视频课之后感觉仍然一知半解现在更新一下来自其他版本的STM32学习 GPIO 就是 General Purpose Input Output 中文名叫通用输入输出口 可配置8种输入输出模式 引脚电平 0V~3.3V 部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff…

MongoDB增删改查操作

数据库操作&#xff1a; 在MongoDB中&#xff0c;文档集合存在数据库中。 要选择使用的数据库&#xff0c;请在mongo shell程序中发出 use <db> 语句 // 查看有哪些数据库 show dbs;// 如果数据库不存在&#xff0c;则创建并切换到该数据库&#xff0c;存在则直接切换到…

CS5263 DP转HDMI 4k@60Hz转接线方案,替代IT6563 PS176方案

集睿致远/ASL推出的CS5263是一款DP转HDMI 2.0音视频转换芯片&#xff0c;主要用于设计DP转HDMI2.0音视频转换器或者DP转HDMI 4K60Hz音视频转接线等产品种适用于需要视频协议转换的电缆适配器、电视接收器、监视器和其他应用。 CS5263参数 DisplayPort输入&#xff08;接收器&a…

电脑如何快速查看系统中的驱动是否安装

第一步&#xff1a;winR 打开运行命令窗口 第二步输入&#xff1a;在打开输入框中输入driverquery&#xff0c;点击确定或按下回车键&#xff0c;命令行页面列出本机相关驱动信息。 1、driverquery 驱动查询 2、driverquery /V 驱动程序查询/ V

在 React+Typescript 项目环境中创建并使用组件

上文 ReactTypescript清理项目环境 我们将自己创建的项目环境 好好清理了一下 下面 我们来看组件的创建 组件化在这种数据响应式开发中肯定是非常重要的。 我们现在src下创建一个文件夹 叫 components 就用他专门来处理组件业务 然后 我们在下面创建一个 hello.tsx 注意 是t…

多智能体共识算法的粗略数学证明

这篇文章是对论文《Consensus and Cooperation in Networked Multi-Agent Systems》中定理一的粗略数学证明。 论文中的定理一&#xff1a; 对一个由 n 个智能体以拓扑结构 G 组成的网络&#xff0c;使用以下共识算法&#xff1a; x ˙ i ( t ) Σ j ∈ N i a i j ( x j ( t…

客户标签如何分类?

客户标签分为8大类标签 &#x1f449;客户画像类标签记录客户的基础信息&#xff01; &#x1f449;客户来源类标签记录获客途径及渠道效果&#xff01; &#x1f449;客户状态类标签描述客户的全生命周期&#xff01; &#x1f449;客户跟进类标签记录与客户链接以后的情况&am…

VVIC-商品详情

一、接口参数说明&#xff1a; item_get-根据ID取商品详情&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/vvic/item_get 名称类型必须描述keyString是调用key&#xff08;点击获取测试k…

微信小程序真机调试异常cmdId 1006, errCode-50011-已解决

cmdId 1006, errCode-50011 起因 小程序在模拟器上预览没问题,真机调试和体验版首页打不开,点展开显示cmdId 1006, errCode-50011 解决 查了下1006, 说是广告, 我没接广告,这个也不是错误码 1006广告组件被驳回你的广告正在被审核,无法展现广告后来找到几个类似的帖子…

Win10共享打印机所需要的设置(无需密码访问实现打印机共享)

为什么win10电脑已经将打印机设置为共享&#xff0c;其他朋友还是无法连接到Win10电脑共享的打印机呢&#xff0c;一般都是因为直接连接打印机的win10设置有问题。这种情况很多&#xff0c;下面的方案基本都能解决&#xff0c;本人多次亲测&#xff0c;全部成功。具体设置方法如…

【腾讯云 Cloud Studio 实战训练营】使用云IDEA,快速构建React完成点餐H5页面

文章目录 前言简介优势项目介绍 实战教学注册流程创建工作空间环境配置安装 antd-mobile安装 less 和 less-loader暴露 webpack 配置文件修改 config/webpack.config.js 文件安装 normalize 上传项目素材替换App.js主文件创建 index.less 文件 启动项目清理实验先停止项目再删除…

前后端分离------后端创建笔记(08)表单提交

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

面试之快速学习STL- vector

1. vector底层实现机制刨析&#xff1a; 简述&#xff1a;使用三个迭代器表示的&#xff1a; &#xfffc; 这也就解释了&#xff0c;为什么 vector 容器在进行扩容后&#xff0c;与其相关的指针、引用以及迭代器可能会失效的原因。 insert 整体向后移 erase 整体向前移…

pytest自动生成测试类 demo

一、 pytest自动生成测试类 demo # -*- coding:utf-8 -*- # Author: 喵酱 # time: 2023 - 08 -15 # File: test4.py # desc: import pytest import unittest# 动态生成测试类def create_test_class(class_name:str, test_cases:list) -> type:"""生成测试类…

未能为数据库对象分配空间,因为文件组primary已满

今天正式环境突发需要这种情况 原因&#xff1a;数据库磁盘已满 解决方式&#xff1a;清理掉占用磁盘空间大的表&#xff0c;清理无效的历史备份文件。

Git分布式版本控制系统基础概念

前言 我们在大学毕业写论文的时候碰到过如下的现象&#xff1a; <<毕业论文第一版.doc>> <<毕业论文第二版.doc>> <<毕业论文第三版.doc>> <<毕业论文最终版.doc>> <<毕业论文完结版.doc>> 你的论文会不断地修改…

LeetCode150道面试经典题-- 有效的括号(简单)

1.题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类…