Qt Quick MapPolyLine insertCoordinate
Qt Quick MapPolyLine insertCoordinate
我的地图上有一条折线,当用户在两个现有点之间单击时,我想向它添加一个新坐标。
我可以通过以下方式获取点击事件:-
MouseArea {
id: mouseArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
console.log('LINE');
}
}
但我无法弄清楚如何计算出 insertCoordinate() 所需的索引,因为似乎没有获取 start/end 顶点的方法该段点击。这可能吗?
我遇到了类似的问题。目前,如果不编写新的 Map 对象类型就无法完成。所以我完全改变了方法并完成了以下操作:-
- 停止对地图使用 QtLocation,因为它目前限制太多
- 将 WebKit 控件与 Leaflet 集成为浏览器中的地图提供程序HTML
- 使用 WebChannel 和 WebSocketServer 通过 javascript API
与地图通信
这给了我在地图上所需的所有灵活性,因为 Leaflet 易于配置和扩展,同时允许我在 Qt 中编写桌面应用程序的其余部分
我重新访问了这个项目并找到了一种不使用 Webkit 的方法。它非常复杂:-
1) 使用点击获取坐标
var mapCoord = gpxLine.mapToItem(mapView,mouseX,mouseY);
var coord = mapView.toCoordinate(Qt.point(mapCoord.x,mapCoord.y));
2)用这个坐标遍历路径,计算最接近的路径线段
float distance = 1000000;
float dx = 0;
int index = 0;
float x0 = coordinate.longitude(),
y0 = coordinate.latitude(),
x1y1x,
x1y1y,
x2y2x,
x2y2y;
double A,B,C,D,dot,len_sq,param,xx,yy,d_x,d_y;
for(int i = 0; i < trackpoints.count() - 1; i++){
//Distance from line algorithm
x1y1x = trackpoints[i].latlon.longitude();
x1y1y = trackpoints[i].latlon.latitude();
x2y2x = trackpoints[i+1].latlon.longitude();
x2y2y = trackpoints[i+1].latlon.latitude();
A = x0 - x1y1x;
B = y0 - x1y1y;
C = x2y2x - x1y1x;
D = x2y2y - x1y1y;
dot = A * C + B * D;
len_sq = C * C + D * D;
param = dot /len_sq;
if(param < 0 || (x1y1x == x2y2x && x1y1y == x2y2y)){
xx = x1y1x;
yy = x1y1y;
} else if ( param > 1 ){
xx = x2y2x;
yy = x2y2y;
} else {
xx = x1y1x +param * C;
yy = x1y1y + param * D;
}
d_x = x0 - xx;
d_y = y0 - yy;
dx = sqrt(d_x * d_x + d_y * d_y);
if(dx < distance){
distance = dx;
index = i;
}
}
3) 这给了我索引,所以我现在可以在此索引处插入坐标
我的地图上有一条折线,当用户在两个现有点之间单击时,我想向它添加一个新坐标。
我可以通过以下方式获取点击事件:-
MouseArea {
id: mouseArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
console.log('LINE');
}
}
但我无法弄清楚如何计算出 insertCoordinate() 所需的索引,因为似乎没有获取 start/end 顶点的方法该段点击。这可能吗?
我遇到了类似的问题。目前,如果不编写新的 Map 对象类型就无法完成。所以我完全改变了方法并完成了以下操作:-
- 停止对地图使用 QtLocation,因为它目前限制太多
- 将 WebKit 控件与 Leaflet 集成为浏览器中的地图提供程序HTML
- 使用 WebChannel 和 WebSocketServer 通过 javascript API 与地图通信
这给了我在地图上所需的所有灵活性,因为 Leaflet 易于配置和扩展,同时允许我在 Qt 中编写桌面应用程序的其余部分
我重新访问了这个项目并找到了一种不使用 Webkit 的方法。它非常复杂:-
1) 使用点击获取坐标
var mapCoord = gpxLine.mapToItem(mapView,mouseX,mouseY);
var coord = mapView.toCoordinate(Qt.point(mapCoord.x,mapCoord.y));
2)用这个坐标遍历路径,计算最接近的路径线段
float distance = 1000000;
float dx = 0;
int index = 0;
float x0 = coordinate.longitude(),
y0 = coordinate.latitude(),
x1y1x,
x1y1y,
x2y2x,
x2y2y;
double A,B,C,D,dot,len_sq,param,xx,yy,d_x,d_y;
for(int i = 0; i < trackpoints.count() - 1; i++){
//Distance from line algorithm
x1y1x = trackpoints[i].latlon.longitude();
x1y1y = trackpoints[i].latlon.latitude();
x2y2x = trackpoints[i+1].latlon.longitude();
x2y2y = trackpoints[i+1].latlon.latitude();
A = x0 - x1y1x;
B = y0 - x1y1y;
C = x2y2x - x1y1x;
D = x2y2y - x1y1y;
dot = A * C + B * D;
len_sq = C * C + D * D;
param = dot /len_sq;
if(param < 0 || (x1y1x == x2y2x && x1y1y == x2y2y)){
xx = x1y1x;
yy = x1y1y;
} else if ( param > 1 ){
xx = x2y2x;
yy = x2y2y;
} else {
xx = x1y1x +param * C;
yy = x1y1y + param * D;
}
d_x = x0 - xx;
d_y = y0 - yy;
dx = sqrt(d_x * d_x + d_y * d_y);
if(dx < distance){
distance = dx;
index = i;
}
}
3) 这给了我索引,所以我现在可以在此索引处插入坐标