QML地图自定义矢量路径图组件

15 篇文章 35 订阅
本文介绍了一款名为MyMapVectorLine的Qml组件,它扩展了MapPolyline功能,允许在地图上绘制带有方向指示的路线。用户可以自定义路径颜色、线宽、标志图片样式及大小,并动态调整颜色。组件能根据添加或移除的数据自动计算标志朝向。示例代码和Demo已提供,方便开发者使用。
摘要由CSDN通过智能技术生成

        Qml地图中提供了MapPolyline用于在地图上绘制路线,但是该控件无法显示目标的方位矢量,因此我在MapPolyline的基础上制作了MyMapVectorLine,该控件可自定义矢量标志图片样式,并根据存入数据自动计算标志方位朝向,组件颜色和标志可动态设置,效果如图:

MyMapVectorLine属性:

color:路径和标志颜色

lineWidth:路径线宽度

markWidth:标志的宽

markHeight:设置标志的高

markSource:设置标志的图片源

MyMapVectorLine方法:

appendPoint(coordinate c):往矢量路径中添加经纬度数据,数据添加后组件会根据最新数据方位设置标志朝向

removePoint():从矢量路径中移除最后一个数据,该数据移除后组件会根据最新数据方位设置标志朝向

clear():清空矢量路径中的所有数据

Demo地址(MyMapVectorLine.qml组件已在Demo中加载):

MyMapVectorLinehttps://github.com/zjgo007/QmlDemo/tree/master/MyMapVectorLine

MyMapVectorLine源码:

import QtQuick 2.9
import QtLocation 5.9
import QtQml 2.9
import QtGraphicalEffects 1.0

MapItemGroup{
    id:vectorLine
    property color color: "green"
    property int lineWidth: 2
    property int markWidth: 24
    property int markHeight: 24
    property string markSource: ""
    MapPolyline{
        id:line
        line.width: lineWidth
        line.color: color
    }
    MapQuickItem {
        id:mark
        width: markWidth
        height: markHeight
        anchorPoint.x: markWidth/2
        anchorPoint.y: markHeight/2
        visible: false


        sourceItem: Image {
            id:image
            source: markSource
            sourceSize.width: markWidth
            sourceSize.height: markHeight
            ColorOverlay {
                anchors.fill: image
                source: image
                color: vectorLine.color
            }
        }
    }

    function appendPoint(coordinate){
        line.addCoordinate(coordinate)
        updateMarkRotation()
    }

    function removePoint(){
        var index = line.pathLength()-1
        line.removeCoordinate(index)
        updateMarkRotation()
    }

    function clear(){
        line.path = []
        updateMarkRotation()
    }

    function updateMarkRotation(){
        var size = line.pathLength()
        if(size<2){
            mark.visible = false
            return
        }
        var cCoordinate = line.coordinateAt(size-1)
        var lCoordinate = line.coordinateAt(size-2)
        mark.visible = true
        mark.coordinate = cCoordinate
        var rotation = lCoordinate.azimuthTo(cCoordinate)
        mark.rotation = rotation
    }

}

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵叫的猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值