如何在 QML-Map 上获取真实坐标
Posted
技术标签:
【中文标题】如何在 QML-Map 上获取真实坐标【英文标题】:How to get real Coordinates on QML-Map 【发布时间】:2017-10-05 09:06:26 【问题描述】:我一直在尝试使用 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】:您应该使用 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)
【讨论】:
以上是关于如何在 QML-Map 上获取真实坐标的主要内容,如果未能解决你的问题,请参考以下文章