我一直试图通过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)
}
}
我的问题现在是否可以获取我点击鼠标的地图坐标?如果是,我怎么能这样做?
答案 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)
}