QML Map

一直想做地图,找不到资料,尤其是C++的,今天已经读到gpx文件的经纬度了,下一步要画在地图上了。
https://blog.csdn.net/gongjianbo1992/article/details/103624656
qmlscene main.qml 报错: 
Extra characters after test expression.
放在Qt工程里用 QQmlApplicationEngine 加载成功
加入全局变量,替代固定的经纬度,只需要改这2个值就可以定位到自己所在的城市了。
property double lat : 26.9
property double lon : 112.6
import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtPositioning 5.2
import QtLocation 5.2
 
Window {
    visible: true
    width: 800
    height: 600
    title: qsTr("地图")
    property double lat : 26.9
    property double lon : 112.6
 
    Slider{
        id: bearing_slider
        height: 20
        width: parent.width
        from: 0
        to: 360
        value: 0
    }
    
    //拖动窗口大小图元位置不能实时跟随,做此下策
    onWidthChanged: item_map.zoomLevel += 0.000001
    onHeightChanged: item_map.zoomLevel -= 0.000001
 
    //绘制地图的容器
    Map {
        id: item_map
        anchors.fill: parent
        anchors.topMargin: 20
 
        plugin: Plugin {
            //参见文档https://doc.qt.io/qt-5.12/qml-qtlocation-plugin.html
 
            //首选插件语言环境的有序列表,但是貌似没啥用
            locales: "zh-CN"
 
            //插件的名称
            //osm需要把openssl的dll放到运行目录
            //esri默认就能用,mapbox的我这里加载不了,here的不知道咋用
            //esri默认这个图成都那里不对(放大后)
            name: "esri" // "mapboxgl", "esri", "osm"...
 
            //首选插件名称的有序列表,设置了name值时无效
            //preferred: ["here","osm"]
 
            //选择附加到哪个服务插件时Plugin对象所需的功能集,设置了name值时无效
            //required: Plugin.AnyMappingFeatures | Plugin.AnyGeocodingFeatures
        }
 
        //初始中心点
        center: QtPositioning.coordinate(lat, lon)
        //初始缩放等级
        zoomLevel: 12
        //最大缩放等级
        maximumZoomLevel: 14
        //最小缩放等级
        minimumZoomLevel: 1
        //背景色,没有正常加载时显色的图块颜色
        color: "white"
        //地图的方位
        //如果用于Map的插件支持方位,则该值的有效范围在0到360之间。
        //如果用于Map的插件不支持方位,则更改此属性将无效。
        bearing: bearing_slider.value
 
        //在地图上显示任意Qt Quick对象
        MapQuickItem {
            id: point_1
            //缩放等级默认0固定大小,否则会和缩放等级一起放大缩小
            zoomLevel: 0
            //指示的坐标点
            coordinate: QtPositioning.coordinate(lat-0.02, lon-0.01)
            //sourceItem左上角相对于coordinate的偏移
            anchorPoint: Qt.point(sourceItem.width/2, sourceItem.height/2)
            //Qt Quick对象
            sourceItem: Rectangle {
                width: 14
                height: 14
                radius: 7
                color: "green"
                border.color: "red"
                border.width: 1
                MouseArea {
                    anchors.fill: parent
                    onClicked: console.log("click")
                }
                //coordinate类型有经纬度高度三个属性
                //latitude 纬度
                //longitude 经度
                //altitude 海拔高度,单位米
                //以及计算距离和方位角的方法
                //这里用文本显示两个点的距离
                Text {
                    text: Math.round(point_1.coordinate.distanceTo(point_2.coordinate))/1000 + " km"
                    color: "green"
                    font.bold: true
                    font.pixelSize: 16
                }
            }
            //Qt5.14加了一个淡入属性autoFadeIn
        }
 
        MapQuickItem {
            id: point_2
            //zoomLevel: 10 //和缩放等级一起放大缩小
            coordinate: QtPositioning.coordinate(lat - 0.01, lon - 0.02)
            anchorPoint: Qt.point(sourceItem.width/2, sourceItem.height/2)
            sourceItem: Rectangle {
                width: 14
                height: 14
                radius: 7
                color: "green"
                border.color: "red"
                border.width: 1
            }
        }
 
        //此外,还有MapCircle,MapRectangle,MapPolygon等图元类型
        //他们是和地图成比例的
        // 画多边形
        MapPolygon {
            id: point_3
            color: "blue"
            border.width: 1
            border.color: "red"
            //根据坐标点绘制多边形
            path: [QtPositioning.coordinate(lat, lon)]
            Component.onCompleted: {
                point_3.addCoordinate(QtPositioning.coordinate(lat + 0.02, lon))
                point_3.addCoordinate(QtPositioning.coordinate(lat + 0.02, lon + 0.02))
                point_3.addCoordinate(QtPositioning.coordinate(lat - 0.01, lon + 0.04))
            }
        }
 
        // 绘制折线
        MapPolyline {
            line.width: 2
            line.color: "green"
            //路径列表 path : list<coordinate>
            path: [point_1.coordinate, point_2.coordinate, point_3.path[0]]
        }

        //文字信息
        Rectangle {
            x: 10
            y: 10
            height: item_center.height + 20
            width: item_center.width + 20
            color: "green"
            Text{
                id: item_center
                x: 10
                y: 10
                color: "white"
                font.pixelSize: 16
                font.bold: true
                //展示缩放等级 和 map的中心点经纬度
                text: "zoom level:" + Math.floor(item_map.zoomLevel) +
                      " center:" + item_map.center.latitude +
                      "  " + item_map.center.longitude
            }
        }
    }
}

不知道有没有卫星图。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值