Qt Quick MapPolyLine insertCoordinate
У меня есть PolyLine на моей карте, и я хочу добавить новую координату, когда пользователь нажимает между двумя существующими точками.
Я могу получить событие клика с:-
MouseArea {
id: mouseArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
console.log('LINE');
}
}
Но я не могу понять, как определить требуемый индекс для insertCoordinate(), так как не существует метода, позволяющего получить начальную / конечную вершины сегмента, по которому щелкнули. Это возможно?
1 ответ
У меня была похожая проблема. В настоящее время это невозможно сделать без написания нового типа объекта Map. Поэтому я полностью изменил подход и сделал следующее:
- перестали использовать QtLocation для карты, так как в настоящее время она слишком ограничена
- интегрировал элемент управления WebKit с Leaflet в качестве поставщика карт в браузере HTML
- использовал WebChannel и WebSocketServer для связи с картой через API javascript
Это дало мне всю гибкость, которая мне нужна на карте, поскольку 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 https://stackru.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) это дает мне индекс, поэтому теперь я могу вставить координату в этот индекс