追踪了 一下 当点击 【Survey】按钮后,地图上 绘制出了 一个多边形,这个交互的 底层执行顺序。
1,首先加载给地图加载代理。PlanView.qml 。给FlightMap 添加了一个代理(MissionItemMapVisual),用来展示 不同的任务 效果。比如简单的航点任务 和多边形的测量任务。
Repeater{
model:_editingLayer==_layerMission?_missionController.visualItems:undefined
delegate:MissionItemMapVisual{
map: editorMap
onClicked: setCurrentItem(sequenceNumber,false)
visible: _editingLayer==_layerMission
}
}
2,MissionItemMapVisual.qml 代理 调用 mapVisualQML 属性
Component.onCompleted:{
if(object.mapVisualQML){//载入地图效果。添加 抽象基类代理
varcomponent=Qt.createComponent(object.mapVisualQML)
if(component.status===Component.Error){
console.log("ErrorloadingQml:",object.mapVisualQML,component.errorString())
}
_visualItem=component.createObject(map,{"map":_root.map})
_visualItem.clicked.connect(_root.clicked)
}
}
3,VisualMissionItem.h 一个代理的抽象基类 .提供了 mapVisualQML 属性,供第2步使用。
// Abstract base class for all Simple and Complex visual mission objects.
class VisualMissionItem : public QObject
Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT) ///< QMl code for map visuals
classSimpleMissionItem:publicVisualMissionItem //单独 航点 简单任务
classComplexMissionItem:publicVisualMissionItem
classSurveyMissionItem:publicComplexMissionItem //多边形 航线 加载多边形航线(SurveyMapVisual.qml) -》
QString mapVisualQML (void)constfinal{returnQStringLiteral("SurveyMapVisual.qml");}//加载 SurveyMapVisual.qml 文件
4,按下 【Survey】按钮时。 PlanView.qml
case1:
if(_singleComplexItem){
addComplexItem(_missionController.complexMissionItemNames[0])
}
//
functionaddComplexItem(complexItemName){
varcoordinate=editorMap.center
coordinate.latitude=coordinate.latitude.toFixed(_decimalPlaces)
coordinate.longitude=coordinate.longitude.toFixed(_decimalPlaces)
coordinate.altitude=coordinate.altitude.toFixed(_decimalPlaces)
insertComplexMissionItem(complexItemName,coordinate,_missionController.visualItems.count)
}
//
functioninsertComplexMissionItem(complexItemName,coordinate,index){
varsequenceNumber=_missionController.insertComplexMissionItem(complexItemName,coordinate,index)
setCurrentItem(sequenceNumber,true)
}
5,MisssonController.h
intMissionController::insertComplexMissionItem(QStringitemName,QGeoCoordinatemapCenterCoordinate,inti)
{
ComplexMissionItem*newItem;
intsequenceNumber=_nextSequenceNumber();
if(itemName==_surveyMissionItemName){
newItem=new SurveyMissionItem(_controllerVehicle,_visualItems);
6,SurveyMissionItem.h 定义一个代理 使用,mapVisualQML ,根据按下的 按钮 来加载不同代理的不同文件内容
QString mapVisualQML (void) const final { return QStringLiteral("SurveyMapVisual.qml"); }
7,SurveyMapVisual.qml
Component.onCompleted:{
_addInitialPolygon()//组件加载完毕 添加四边形
_addVisualElements()
}
/
addInitalPolygon()
_mapPolygon.appendVertex(topLeftCoord)
_mapPolygon.appendVertex(topRightCoord)
_mapPolygon.appendVertex(bottomRightCoord)
_mapPolygon.appendVertex(bottomLeftCoord)
8,QGCMapPolygon.h
voidQGCMapPolygon::appendVertex(constQGeoCoordinate&coordinate)
{
_polygonPath.append(QVariant::fromValue(coordinate));
_polygonModel.append(newQGCQGeoCoordinate(coordinate,_newCoordParent));
emitpathChanged();
}
connect(&_mapPolygon,&QGCMapPolygon::pathChanged, this,&SurveyMissionItem::_generateGrid);
9,SurveyMissionItem.h 网格生成
voidSurveyMissionItem::_generateGrid(void) 生成网格
emitlastSequenceNumberChanged(lastSequenceNumber()); 最后一个索引 添加完
10,具体算法 基于凸多边形的往复运动