QT之QtLocaton采用QML技术实现轨迹导航(轨迹采集绘制参考上篇文章)

 

1.在Map中增加轨迹图层MapPolyline 

.......
         // 飞机图标(你可以使用任何图片作为飞机图标)
         Image {
             id: planeIcon
             source: "qrc:/../../bin/Img/home0.png" // 替换为你的飞机图标路径
             width: 50; height: 50 // 根据需要调整大小
             visible: true
         }

         // 飞机位置标记
         MapQuickItem {
             id: planeMarker
             //coordinate: QtPositioning.coordinate(30.66, 104.11) // 飞机的初始位置
             anchorPoint: Qt.point(planeIcon.width / 2, planeIcon.height / 2 +15) // 使图标中心对齐标记中心
             sourceItem: planeIcon // 设置图标为标记的源项
         }

2.在Map_Navigation.qml中增加如

import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls 2.12
import QtLocation 5.12
import QtPositioning 5.12
import MyModel 1.0
import QtQuick.Dialogs 1.2

Canvas {
     id: canvas
     anchors.fill: parent
     anchors.margins: 1

     FileDialog{
         id: pathtxt_dailog
         visible: false
         title: "打开轨迹文件"

         onAccepted: {
             //此处轨迹文件直接从文件读取。如果不想从文件读取,可参考上篇文章轨迹绘制,直接从coordinatesModel获取即可
             file.source =pathtxt_dailog.fileUrl;
             console.log("File selected:", pathtxt_dailog.fileUrl) // 获取选择的文件路径
             // 这里可以将fileDialog.fileUrl传递给其他函数或直接处理文件
         }
         onRejected: {
             console.log("Canceled") // 用户取消了选择
         }
         Component.onCompleted: visible = false // 默认不显示对话框,由Button触发显示
     }

     File {
        id: file
        source: "D:/M.txt";
     }

     /*
     //用来页面显示dd数值
     Text {
         text: dd
         font.pixelSize: 32
         anchors.centerIn: parent
     }
     */

     ListModel {
         id: coordinateModel
         ListElement { Latitude: 0.00000000; Longitude: 0.00000000} // Initial point if needed
         // 添加更多坐标点
     }

     /*
     QtObject {
         Component.onCompleted: {
            //requestshot();
             source: "D:/M.txt";
         }
     }
     */

     property var tmpData : file.text;           //从文件中抽取所有字符到var字符串
     property var lines : tmpData.split("\n");   //先按行读取字符串
     onPaint: {
         var var1="";  // 用于存储第一个元素
         var var2="";  // 用于存储第二个元素等
         for (var i = 0; i < lines.length; i++) {      //接下来按行进行处理
             //console.log("xxx---" + lines[i]);

             //逗号分割纬、经度
             var parts = lines[i].split(","); // 分割字符串

             //得到了对应的,示例:“{Latitude:30.100241237281463”、“Longitude:124.3352980367739}”字符串,接下来继续提取
             var1  = parts[0];  //获取Latitude

             if(var1.length>0)  //如果能获取到Latitude再继续
             {
                 var1 = var1.substring(var1.indexOf(":") + 1)   //把字符1部分的,“:”之前的全去掉

                 var2  = parts[1];  //获取Longitude

                 var2 = var2.substring(var2.indexOf(":") + 1)   //把字符2部分的,“:”之前的全去掉
                 var2= var2.replace("}", "");                   // 删除字符串2结尾的“}”

                 //生成点位坐标
                 var nextPosition = QtPositioning.coordinate(var1, var2);
                 //console.log("ddd---" + var1, var2)

                 //开始画轨迹线
                 trackLine.addCoordinate(nextPosition);

                 //将当前点位坐标存入ListModel
                 coordinateModel.append({"Latitude": Number(var1), "Longitude": Number(var2)})
             }
         }

         /*
         for (var kk = 0; kk < coordinateModel.count; kk++) {
             //var element = coordinateModel.get(kk);
             var element = "Point: (" + coordinateModel.get(kk).Latitude + ", " + coordinateModel.get(kk).Longitude + ")"
             console.log(element);
         }*/

         onClicked: {
             //requestshot();
             timer1.running=true;
             if(bearing_timer.visible == true)
             {
                 bearing_timer.visible = false
             }else
             {
                 bearing_timer.visible = true;
             }
         }
    }

     function requestshot(){
         pathtxt_dailog.open();
     }

     Timer {
         id: timer1
         interval: bearing_timer.value // 每秒更新一次位置
         running: false // 自动开始计时器
         repeat: true // 重复运行计时器
         property int dd: 0
         onTriggered: {
             var index =  coordinateModel.count; // 循环获取坐标索引
             if(index >0){
                 //开始探寻轨迹
                 //to: QtPositioning.coordinate(30.66, 104.11) // 新中心点坐标

                 //trackLine2.addCoordinate(QtPositioning.coordinate(coordinateModel.get(dd).Latitude, coordinateModel.get(dd).Longitude)); //  更新地图中心点,更新飞机位置标记的坐标

                 planeMarker.coordinate = QtPositioning.coordinate(coordinateModel.get(dd).Latitude, coordinateModel.get(dd).Longitude); //  更新地图中心点,更新飞机位置标记的坐标

                 //coordinateModel.move(index, 1, 0); // 将当前坐标移到数组末尾,以便下次触发时取下一个坐标
                 //console.log(dd, +" "+ coordinateModel.get(dd).Latitude, coordinateModel.get(dd).Longitude)

                 //判断一下,别越界
                 if(dd <index-1)
                 {
                    dd++;
                 }else
                 {
                    dd=0;   //归零之后继续循环寻轨
                 }
            }
         }
     }
 }

3.实现效果:

Map地图QtLocation实现轨迹导航,时间轴控制速度

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

caoyin1234

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

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

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

打赏作者

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

抵扣说明:

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

余额充值