代码:
// KML模板函数,用于填充JSON数据
export default function kmlTemplate (data) {
return `<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:wpml="http://www.dji.com/wpmz/1.0.2">
<Document>
<Folder>
<!-- Step 1: Implement File Creation Information -->
<!-- 航线创作者 -->
<wpml:author>Name</wpml:author>
<!-- 航线创造时间的时间戳 -->
<wpml:createTime>1637600807044</wpml:createTime>
<!-- 航线更新的时间戳 -->
<wpml:updateTime>1637600875837</wpml:updateTime>
<!-- Step 2: Setup Mission Configuration -->
<wpml:missionConfig>
<wpml:flyToWaylineMode>safely</wpml:flyToWaylineMode>
<wpml:finishAction>goHome</wpml:finishAction>
<!-- 失控是否继续执行航线 -->
<!-- goContinue/executeLostAction:退出航线,执行失控动作 -->
<wpml:exitOnRCLost>goContinue</wpml:exitOnRCLost>
<!-- 失控动作类型goback/lamding/hover -->
<wpml:executeRCLostAction>hover</wpml:executeRCLostAction>
<!-- 安全起飞高度 -->
<wpml:takeOffSecurityHeight>20</wpml:takeOffSecurityHeight>
<!-- 参考起飞点 -->
<wpml:takeOffRefPoint>23.98057,115.987663,100</wpml:takeOffRefPoint>
<!-- 参考起飞点海拔高度 -->
<wpml:takeOffRefPointAGLHeight>35</wpml:takeOffRefPointAGLHeight>
<!-- 全局航线过渡速度 ; 8m/s-->
<wpml:globalTransitionalSpeed>8</wpml:globalTransitionalSpeed>
<wpml:droneInfo>
<!-- Declare drone model with M30 -->
<!-- 飞行器机型主类型 -->
<!-- 89(机型:M350 RTK),60(机型:M300 RTK),67(机型:M30/M30T),77(机型:M3E/M3T/M3M),91(机型:M3D/M3TD) -->
<wpml:droneEnumValue>67</wpml:droneEnumValue>
<!-- 飞行器机型子类型 -->
<!-- 当“飞行器机型主类型”为“67(机型:M30/M30T)”时:0(机型:M30双光),1(机型:M30T三光)
当“飞行器机型主类型“为”77(机型:M3E/M3T/M3M)“时:0(机型:M3E)1(机型:M3T)2(机型:M3M)
当“飞行器机型主类型“为”91(机型:M3D/M3TD)“时:0(机型:M3D)1(机型:M3TD -->
<wpml:droneSubEnumValue>0</wpml:droneSubEnumValue>
</wpml:droneInfo>
<wpml:payloadInfo>
<!-- Declare payload model with M30 -->
<!-- 负载机型主类型 -->
<!-- 42(H20)43(H20T)52(M30双光相机)53(M30T三光相机)61(H20N)66(Mavic 3E 相机)67(Mavic 3T 相机)
68(Mavic 3M 相机)80(Matrice 3D 相机)81(Matrice 3TD 相机)65534(PSDK 负载)82(H30)83(H30T) -->
<wpml:payloadEnumValue>52</wpml:payloadEnumValue>
<!-- 负载挂载位置 -->
<!-- 0:飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。
1:飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。
2:飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。 -->
<wpml:payloadPositionIndex>0</wpml:payloadPositionIndex>
</wpml:payloadInfo>
</wpml:missionConfig>
<!-- Step 3: Setup A Folder for Waypoint Template -->
<Folder>
<wpml:templateType>waypoint</wpml:templateType>
<wpml:useGlobalTransitionalSpeed>0</wpml:useGlobalTransitionalSpeed>
<!-- 模板ID
* 注:在一个kmz文件内该ID唯一。建议从0开始单调连续递增。
在template.kml和waylines.wpml文件中,将使用该id将模板与所生成的可执行航线进行关联。 -->
<wpml:templateId>0</wpml:templateId>
<!-- 坐标系参数 -->
<wpml:waylineCoordinateSysParam>
<wpml:coordinateMode>WGS84</wpml:coordinateMode>
<wpml:heightMode>EGM96</wpml:heightMode>
<wpml:globalShootHeight>50</wpml:globalShootHeight>
<!-- 飞行器离被摄面高度(相对地面高)* 注:仅适用于模板类型mapping2d,mapping3d,mappingStrip -->
<wpml:positioningType>GPS</wpml:positioningType>
<!-- 是否开启仿地飞行,0不开启,1开启 -->
<wpml:surfaceFollowModeEnable>1</wpml:surfaceFollowModeEnable>
<wpml:surfaceRelativeHeight>100</wpml:surfaceRelativeHeight>
</wpml:waylineCoordinateSysParam>
<wpml:autoFlightSpeed>7</wpml:autoFlightSpeed>
<wpml:gimbalPitchMode>usePointSetting</wpml:gimbalPitchMode>
<!-- 全局偏航角模式参数 -->
<wpml:globalWaypointHeadingParam>
<!-- 飞行器偏航角模式 -->
<wpml:waypointHeadingMode>followWayline</wpml:waypointHeadingMode>
<!-- 飞行器偏航角度 -->
<wpml:waypointHeadingAngle>45</wpml:waypointHeadingAngle>
<wpml:waypointPoiPoint>24.323345,116.324532,31.000000</wpml:waypointPoiPoint>
<!-- 飞行器偏航角转动方向 -->
<!-- clockwise:顺时针旋转飞行器偏航角
counterClockwise:逆时针旋转飞行器偏航角
followBadArc:沿最短路径旋转飞行器偏航角 -->
<wpml:waypointHeadingPathMode>clockwise</wpml:waypointHeadingPathMode>
</wpml:globalWaypointHeadingParam>
<!-- 全局航点类型(全局航点转弯模式) -->
<!-- coordinateTurn:协调转弯,不过点,提前转弯
toPointAndStopWithDiscontinuityCurvature:直线飞行,飞行器到点停
toPointAndStopWithContinuityCurvature:曲线飞行,飞行器到点停
toPointAndPassWithContinuityCurvature:曲线飞行,飞行器过点不停 -->
<wpml:globalWaypointTurnMode>toPointAndStopWithDiscontinuityCurvature</wpml:globalWaypointTurnMode>
<!-- 全局航段轨迹是否尽量贴合直线 -->
<!-- 0:航段轨迹全程为曲线 1:航段轨迹尽量贴合两点连线 -->
<wpml:globalUseStraightLine>0</wpml:globalUseStraightLine>
${data.map(point => `
<Placemark>
<Point>
<coordinates>${point.longitude},${point.latitude},${point.height}</coordinates>
</Point>
<wpml:index>0</wpml:index>
<wpml:ellipsoidHeight>90.2</wpml:ellipsoidHeight>
<wpml:height>100</wpml:height>
<!-- 0:不使用全局设置;1:使用全局设置 -->
<wpml:useGlobalHeight>1</wpml:useGlobalHeight>
<wpml:useGlobalSpeed>1</wpml:useGlobalSpeed>
<wpml:useGlobalHeadingParam>1</wpml:useGlobalHeadingParam>
<wpml:useGlobalTurnParam>1</wpml:useGlobalTurnParam>
<wpml:gimbalPitchAngle>0</wpml:gimbalPitchAngle>
<!-- Declare action group for waypoint 1# -->
<wpml:actionGroup>
<wpml:actionGroupId>0</wpml:actionGroupId>
<wpml:actionGroupStartIndex>1</wpml:actionGroupStartIndex>
<wpml:actionGroupEndIndex>1</wpml:actionGroupEndIndex>
<!-- 动作执行模式 -->
<!-- sequence:串行执行。即动作组内的动作依次按顺序执行。 -->
<wpml:actionGroupMode>sequence</wpml:actionGroupMode>
<wpml:actionTrigger>
<!-- reachPoint:到达航点时执行betweenAdjacentPoints:航段触发,均匀转云台multipleTiming:等时触发multipleDistance:等距触发
* 注:“betweenAdjacentPoints”需配合动作"gimbalEvenlyRotate"使用,“multipleTiming” 配合动作
“takePhoto” 即可实现等时间隔拍照,“multipleDistance” 配合动作 “takePhoto” 即可实现等距离间隔拍照。 -->
<wpml:actionTriggerType>reachPoint</wpml:actionTriggerType>
</wpml:actionTrigger>
<!-- Declare the 1st action: rotate gimbal -->
<wpml:action>
<wpml:actionId>0</wpml:actionId>
<wpml:actionActuatorFunc>gimbalRotate</wpml:actionActuatorFunc>
<wpml:actionActuatorFuncParam>
<!-- 云台转动模式 -->
<!-- - absoluteAngle:绝对角度,相对于正北方的角度 -->
<wpml:gimbalRotateMode>absoluteAngle</wpml:gimbalRotateMode>
<!-- 0不能/1能 -->
<wpml:gimbalPitchRotateEnable>0</wpml:gimbalPitchRotateEnable>
<wpml:gimbalPitchRotateAngle>0</wpml:gimbalPitchRotateAngle>
<wpml:gimbalRollRotateEnable>0</wpml:gimbalRollRotateEnable>
<wpml:gimbalRollRotateAngle>0</wpml:gimbalRollRotateAngle>
<!-- yaw偏航 -->
<wpml:gimbalYawRotateEnable>1</wpml:gimbalYawRotateEnable>
<wpml:gimbalYawRotateAngle>30</wpml:gimbalYawRotateAngle>
<wpml:gimbalRotateTimeEnable>0</wpml:gimbalRotateTimeEnable>
<wpml:gimbalRotateTime>0</wpml:gimbalRotateTime>
<wpml:payloadPositionIndex>0</wpml:payloadPositionIndex>
</wpml:actionActuatorFuncParam>
</wpml:action>
<!-- Declare the 2nd action: take photo -->
<wpml:action>
<wpml:actionId>1</wpml:actionId>
<wpml:actionActuatorFunc>takePhoto</wpml:actionActuatorFunc>
<wpml:actionActuatorFuncParam>
<wpml:fileSuffix>point1</wpml:fileSuffix>
<wpml:payloadPositionIndex>0</wpml:payloadPositionIndex>
</wpml:actionActuatorFuncParam>
</wpml:action>
</wpml:actionGroup>
</Placemark>
`).join('')}
</Folder>
</Document>
</kml>
`;}
注意:如此生成的航线缺乏规范且死板,需要后端domj4针对飞行器姿态和云台姿态生成符合生产需求的对应航线文件,更多的帮自己和大家节省对照查阅官方文档的时间。