如何在QML-Map上获得真实的坐标

时间:2017-10-05 09:06:26

标签: python-3.x qml pyqt5

我一直试图通过MouseArea从我的QML地图中获取地图坐标。但问题是我只得到了鼠标的坐标。它告诉我鼠标位置在窗口上的坐标,但不是我在实际地图上点击的坐标。我不知道如何更好地解释它。这是我的代码的一部分:

 MouseArea{
            id: mouseArea
            property var positionInRoot: mapFromItem(myItem, mouseX, mouseY)
            anchors.fill: parent
            acceptedButtons: Qt.LeftButton
            hoverEnabled: true
            onClicked: {
                console.warn("Coordinates: " + mouseArea.positionInRoot)
            }
        }

我的问题现在是否可以获取我点击鼠标的地图坐标?如果是,我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

您应该使用QML地图的toCoordinate方法。

mapFromItem / mapToItem用于将项目中的点映射到另一个项目的坐标系,但我们讨论的是QML项目(x,y)而不是QtPosition纬度,经度。但是,如果您的MouseArea和Map没有相同的x / y位置

,您仍然需要这些

这是一个在鼠标光标下显示lat和lon标签的示例。

Map {
    id: map
    anchors.fill: parent
    plugin: mapPlugin
}

MouseArea
{
    anchors.fill: map
    hoverEnabled: true
    property var coordinate: map.toCoordinate(Qt.point(mouseX, mouseY))
    Label
    {
        x: parent.mouseX - width
        y: parent.mouseY - height - 5
        text: "lat: %1; lon:%2".arg(parent.coordinate.latitude).arg(parent.coordinate.longitude)
    }
}

如果您想以degrees minutes second格式显示坐标,可以使用以下辅助工具:

function decimalToMinutes(value, isLat)
{
    var letter = isLat?value>=0?"N":"S":value>=0?"E":"W"
    var degrees = Math.floor(value)
    var minutes = Math.floor((value-degrees)*60)
    var seconds = ((value-degrees)*3600 - 60*minutes).toFixed(1)
    return "%1° %2' %3\" %4".arg(degrees).arg(minutes).arg(seconds).arg(letter)
}

function minutesToDecimal(value)
{
    var myRegexp = /(\d+)° (\d+)' (\d+(?:\.\d+)?)" ([NSEW])/g;
    var match = myRegexp.exec(value)
    if(match == null)
        return 0
    return ((match[4]=="N"||match[4]=="E")?1:-1)*(Number(match[1]) +Number( match[2]/60) + Number(match[3]/3600))
}

function coordinateToString(coordinate)
{
      return decimalToMinutes(coordinate.latitude, true) + " " + decimalToMinutes(coordinate.longitude, false)
}