js模板式生成大疆上云kml文件(含详细注释,已封装成函数)
代码:
// 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针对飞行器姿态和云台姿态生成符合生产需求的对应航线文件,更多的帮自己和大家节省对照查阅官方文档的时间。