0

我的地图上有一条折线,当用户在两个现有点之间单击时,我想为其添加一个新坐标。

我可以通过以下方式获取点击事件:-

 MouseArea {
    id: mouseArea
    anchors.fill: parent
    acceptedButtons: Qt.LeftButton | Qt.RightButton
    onClicked: {
        console.log('LINE');
    }
}

但是我无法弄清楚如何计算insertCoordinate()所需的索引,因为似乎没有一种方法可以获取单击的段的开始/结束顶点。这可能吗?

4

2 回答 2

1

我有一个类似的问题。目前,如果不编写新的 Map 对象类型,则无法完成。所以我完全改变了方法并做了以下事情: -

  • 停止对地图使用 QtLocation,因为它目前限制太多
  • 在浏览器 HTML 中集成了一个带有 Leaflet 的 WebKit 控件作为地图提供者
  • 使用 WebChannel 和 WebSocketServer 通过 javascript API 与地图通信

这给了我在地图上所需的所有灵活性,因为 Leaflet 易于配置和扩展,同时允许我在 Qt 中编写桌面应用程序的其余部分

于 2017-03-01T12:11:29.953 回答
0

我重新审视了这个项目,并找到了一种不使用 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 https://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment
        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)这给了我索引,所以我现在可以在这个索引处插入坐标

于 2020-05-22T09:55:14.757 回答